由来
TFIDF是一种用于信息检索与数据挖掘的常用加权技术。
TF(term frequency)表示词频,其数值通常用某个词在文章中出现的频数归一化后的结果表示。很多单词可能在两个文档的频率一样,但是两个文档的长度差别很大,一个文档比另一个文档长很多倍。词频特征向量归一化来实现不同文档向量的可比性。
式中,分子是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和。
TF突出了某个词出现在某篇文档中的频繁程度 我们通过词可以获知整篇文档的主题。既然有了TF 为什么还要给出IDF的概念?我觉得有一篇博文讲得非常好,完美地解释了我的疑惑。原博 例2讲述了这么一个例子。有这么一个网页,想要通过网页上出现的词来确定它的主题。“原子能”、“的”和“应用”分别出现了 2 次、35 次 和 5 次。首先,肯定是看看哪些词出现得最为频繁。想要确定这个网页的主题,不能光用词的频数来解决,“的”这个词出现的最多,但是对确定主题没有帮助。类似于“的”这种的称为stop_words 应该删除。“原子能”出现2次,“应用”出现5次。归一化之后的值频数分别是0.2%和0.5%,然而“应用”这个词在其他的文献里出现得也比较频繁,似乎对主题的确定所起的作用要小于“原子能”,那是不是该给它赋一个更大权重呢?如何确定这个权重呢?
IDF(inverse document frequency)逆向文件频率。
它等于总文件数目除以包含该词语的文件数目,再对结果取对数。
假设总的网页数目是10亿,“的”在所有的网页中全部出现过,那么,IDF=log(10/10)=0,"应用"这个词在5亿个网页中出现过,那么IDF=log(10/5)=log2,"原子能"这个词出现得没那么普遍,且出现的网页大多跟原子能有关,你一看这个词就能猜到网页的主题是什么。假设“原子能”只出现在1亿个网页中,那么IDF=log(10/1)=log10. 所以“的”,“应用”,“原子能”三个词的权重分别为:0,log2,log10,再分别乘以各自的TF,结果分别为:0,0.0015,0.002 最后的结果是“原子能”这个词更能说明网页的主题!!显然更符合实际情况。那么接下来就是如何通过编程知晓TFIDF的值呢?
当然是应用伟大的python 下的sklearn包,示例如下:
from sklearn.feature_extraction.text import TfidfVectorizer
text=['The dog ate a sandwich and I ate a sandwich']
vectorizer = TfidfVectorizer(stop_words='english')
print(vectorizer.fit_transform(text).todense())
print(vectorizer.vocabulary_)
from sklearn.feature_extraction.text import TfidfVectorizer
text=['The dog ate a sandwich and I ate a sandwich']
vectorizer = TfidfVectorizer(stop_words='english')
print(vectorizer.fit_transform(text).todense())
print(vectorizer.vocabulary_)