6.9 按单词的重要性加权
问题描述
对词袋模型中的词按照其在观察值中的重要程度进行加权。
解决方案
使用TF-IDF(term frequency-inverse document frequency )将一个词在某个文档(推文、影评、演讲稿等)中的出现次数和这个词在所有文档中的出现次数进行对比。用scikitlearn的TfidfVectorizer能很方便地做这个对比:
和6.8节一样,TfidfVectorizer的输出也是一个稀疏矩阵。不过,如果想看稠密矩阵形式的输出,可以使用.toarray:
vocabulary_可以查看特征的单词表:
讨论
一个词在文档中出现的次数越多,它对这个文档就越重要。例如,如果单词economy在某篇文档中频繁出现,就表示这个文档可能是关于经济的。我们把单词在文档中的出现次数称为词频(term frequency,tf)。
相反,如果一个单词在很多文档中都出现了,那么它对于单个文档的重要性就没有那么高了。例如,如果每个文档中的文本数据都包含单词after,那么它很可能不是一个重要的词。一个单词出现在了多少文档中,我们把这个数值称为文档频率(document frequency,df)。
将这两个统计值组合起来,我们就能为每个单词确定一个分数,来表示它在某个文档中的重要程度了。具体地说,就是将tf和idf(inverse of document frequency,逆向文档频率)相乘:
这里,t表示单词,d表示文档。计算tf和idf的方法有很多。在scikit-learn中,就是单词在文档中出现的次数,idf是这样计算出来的:
n d 是文档的数量,df(d,t)是单词t的文档频率(也就是单词在多少份文档中出现过)。
默认情况下,scikit-learn会使用欧氏范数(L2范数)将TF-IDF向量归一化。得到的结果值越大,这个单词对一个文档来说就越重要。
延伸阅读
● scikit-learn文档:TF-IDF权重(http://bit.ly/2HT2wmW)
[1]编者注:这是一个Kaggle案例,讲的是word2vec在情感分析上的应用。
本书评论