1、什么是TF-IDF
TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文件频率)
简单来说:一个词语在一篇文章中出现次数越多,同时在所有文档中出现次数越少,越能够代表本篇文章。
词频(term frequency,TF)指一个词语在该文件中出现的次数。这个数字通常会被归一化---词频除以文章总词数。
注意:一些通用的词语对于主题并没有太大的作用,反倒是一些出现频率较少的词才能够表达文章的主题,所以单纯使用TF并不合适。权重的设计必须蛮子:一个词频预测主题的能力越强,权重越大;反之,权重越小。所有统计的文章中,一些词只是在其中很少的几篇文章中出现,那么这样的词对文章主题的预测作用很大,这些词的权重应该设计的较大。IDF就是在完成这样的工作。
公式:
IDF中分母之所以要加1,是为了避免分母为0.
那么tf-idf的结果就是tf乘以idf:
2.scikit-Learn中的TF-IDF
计算方法主要用到两个类:CountVectorizer和TfidfTransformer
一、CountVectorizer
CountVectorizer类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数,通过get_feature_names()可获取词袋中所有文本的关键词,通过toarray()可看到词频矩阵的结果。
代码如下:
from sklearn.feature_extraction.text import CountVectorizer
#语料
corpus=[
'This is the first document.',
'This is the second document.',
'And the third one.',
'Is this the first document?'
]
#将文本中的词语转换为词频矩阵
vectorizer=CountVectorizer()
#计算该词语出现的次数
X=vectorizer.fit_transform(corpus)
#获取词袋中所有文本关键词
word=vectorizer.get_feature_names()
print(word)
#查看词频结果
print(X.toarray())
输出结果:
[u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']
[[0 1 1 1 0 0 1 0 1]
[0 1 0 1 0 2 1 0 1]
[1 0 0 0 1 0 1 1 0]
[0 1 1 1 0 0 1 0 1]]
从结果中可以看到,中国包括9个特征词即:
[u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']
同时在输出每个句子中包含特征词的个数。例如,第一句“This is the first document.”,它对应的词频为[0, 1, 1, 1, 0, 0, 1, 0, 1],假设初始序号从1开始计数,则该词频表示存在第2个位置的单词“document”共1次、第3个位置的单词“first”共1次、第4个位置的单词“is”共1次、第9个位置的单词“this”共1词。所以,每个句子都会得到一个词频向量。
二、CountVectorizer + TfidfTransformer
TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值。具体用法如下:
from sklearn.feature_extraction.text import CountVectorizer
#语料
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?',
]
#将文本中的词语转换为词频矩阵
vectorizer = CountVectorizer()
#计算个词语出现的次数
X = vectorizer.fit_transform(corpus)
from sklearn.feature_extraction.text import TfidfTransformer
#类调用
transformer = TfidfTransformer()
print transformer
#将词频矩阵X统计成TF-IDF值
tfidf = transformer.fit_transform(X)
#查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重
print tfidf.toarray()
输出结果: