文本学习

来源:互联网 发布:谁人知我心可 编辑:程序博客网 时间:2024/06/06 01:17

词袋

在文本学习中输入的每个句子的长度和内容都有可能是不同的,你不能根据句子的长度进行划分。那么如何将文本中的内容用于机器学习呢?

我们现在介绍词袋的概念。

他的基本理念就是选定一个文本,然后计算文本的频率。

这里写图片描述

如图所示,实际上词袋以向量形式统计每个单词出现的次数。

很明显的是词袋只是对于单词数量的统计而对于单词顺序完全不关心。

词袋编码

在sklearn中词袋被称为CountVectorizer

from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()string1 = "hello world"string2 = "i love you"string3 = "how are you"email_list = [string1, string2, string3]# 使用vectorizer拟合数据。这里指出语料库中的所有单词,然后对每个单词分配数字bag_of_words = vectorizer.fit(email_list)# 进行转换,挑出语料库中的出现的单词,以及每个单词出现的次数bag_of_words = vectorizer.transform(email_list)

用于机器学习的文本处理

停止词(stopwords)

停止词一般来说就是出现频率非常高的低信息单词,比如说:I、and、you、have等。

在文字分析前一个常见的预处理步骤,就是处理前去除停止单词。

从NLTK中获取停止词

NLKT是自然语言工具包

from nltk.corpus import stopwords# 注意使用这个语句之前一定要已经导入了语料库sw = stopwords.words("english")

词干化以合并词汇

用于机器学习的文本还可以变得进一步简洁一些。比如说下图所示的左侧的五个response单词,在文本中实际上并没有太大差别。都是指代对于某个东西的回应。因此我们可以将5维数据词干化为1维数据,用右侧单词进行指代

这里写图片描述

至于哪些单词可以词干化用于提取,这个事情比较棘手。好在我们不必过于关心。一些语言学家和计算机专家已经为我们建立好了函数。能够很好的指出单词词干。

使用NLTK进行词干化

NLTK中有多重可以用于词干化的函数,这里演示一下使用snowball

from nltk.stem.snowball import SnowballStemmer stemmer = SnowballStemmer("english")# 示例stemmer.stem("responsivity")

注意: 我们应当对句子先进行词干化处理之后再放入词袋之中

如果反过来操作,词袋中就会有很多重复的词汇,这和我们简洁化的初衷是不相符的。而且词干化只是对字符串进行操作。如果先用词袋处理变成矩阵在对其进行词干化操作起来会更为复杂。

Tf Idf表达

这里写图片描述

如上图所示,Tf是指术语频率,他的意思是每个单词,每个术语出现的频率,与词袋非常相同,都是加权之后的结果。比如说某个单词出现一次,比某个单词出现10次的权重少10倍。

Idf是指在整个语料库中的所有出现的文件频率进行加权。但要注意的是:Idf对于语料库中的较少出现的词汇加权更大

之所以会这样是因为那些低频词汇往往更能显示出特征信息。比如在一个机械和土木的人对话中,机械可能会更多的提到零件这个词汇,而土木的可能会提一些结构力学等。虽然这些词可能都是不经意谈到的低频词汇,但往往可以代表每个人的身份特征。

Tf-idf编码

TfidfVectorizer的作用是可以把一大堆文档转换成TF-IDF特征的矩阵。他还可以去除停止词,下面用代码来具体说明一下:

# word_data是一堆英语句子所组成的列表from sklearn.feature_extraction.text import TfidfVectorizer# 这里我们只需要注明停止词就可以了,不需要导入nltkvector = TfidfVectorizer(stop_words = 'english')# fit_transform的作用是学习词汇并进行idf加权,返回一个文本矩阵vector.fit_transform(word_data)# get_feature_names() 访问单词和特征数字之间的映射,该函数返回一个包含词汇表所有单词的列表tf = vector.get_feature_names()print len(tf)
原创粉丝点击