TF-IDF:是一种加权技术。采用一种统计方法,根据字词在文本中出现的次数和在整个语料中出现的文档频率来计算一个字词在整个语料中的重要程度。
优点:能过滤掉一些常见的却无关紧要的词语,同时保留影响整个文本的重要词语。
公式如下:
TF−IDF(x)=TF(x)∗IDF(x)
TF(Term Frequency):表示某个关键词在整篇文章中出现的频率。
IDF(InversDocument Frequency):表示计算倒文本频率。(文本频率是指某个关键词在整个语料所有文章中出现的次数。倒文本频率顾名思义,它是文本频率的倒数,主要用于降低所有文档中一些常见却对文档影响不大的词语的作用。)
式中:N代表语料库中文本的总数,而N(x)代表语料库中包含词xx的文本总数。
在一些特殊的情况会有一些小问题,比如某一个生僻词在语料库中没有,这样我们的分母为0, IDF没有意义了。所以常用的IDF我们需要做一些平滑,使语料库中没有出现的词也可以得到一个合适的IDF值。平滑的方法有很多种,最常见的IDF平滑后的公式之一为:
用 scikit-learn 处理TF-IDF
- 用 TfidfVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
corpus=["I come to China to travel",
"This is a car polupar in China",
"I love tea and Apple ",
"The work is to write some papers in science"]
tfidf2 = TfidfVectorizer()
re = tfidf2.fit_transform(corpus)
print(re)
print(tfidf2.get_feature_names())
(0, 4) 0.4424621378947393
(0, 15) 0.697684463383976
(0, 3) 0.348842231691988
(0, 16) 0.4424621378947393
(1, 3) 0.3574550433419527
(1, 14) 0.45338639737285463
(1, 6) 0.3574550433419527
(1, 2) 0.45338639737285463
(1, 9) 0.45338639737285463
(1, 5) 0.3574550433419527
(2, 7) 0.5
(2, 12) 0.5
(2, 0) 0.5
(2, 1) 0.5
(3, 15) 0.2811316284405006
(3, 6) 0.2811316284405006
(3, 5) 0.2811316284405006
(3, 13) 0.3565798233381452
(3, 17) 0.3565798233381452
(3, 18) 0.3565798233381452
(3, 11) 0.3565798233381452
(3, 8) 0.3565798233381452
(3, 10) 0.3565798233381452
['and', 'apple', 'car', 'china', 'come', 'in', 'is', 'love', 'papers', 'polupar', 'science', 'some', 'tea', 'the', 'this', 'to', 'travel', 'work', 'write']
2. CountVectorizer+TfidfTransformer组合,两种方法效果一样
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
vectorizer=CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
print (tfidf)
TF-IDF是非常常用的文本挖掘预处理基本步骤,但是如果预处理中使用了Hash Trick,则一般就无法使用TF-IDF了,因为Hash Trick后我们已经无法得到哈希后的各特征的IDF的值。使用了IF-IDF并标准化以后,我们就可以使用各个文本的词特征向量作为文本的特征,进行分类或者聚类分析。