(一) 定义
TF-IDF(Term Frequency-Inverse DocumentFrequency, 词频-逆文件频率),一种用于资讯检索和资讯探勘的常用加权技术。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。
(二) TF和IDF各自的含义
1. TF(词频)
某一给定词语在该文本中出现次数。该数字通常会被归一化(分子一般小于分母),以防止它偏向长的文件,因为不管该词语重要与否,它在长文件中出现的次数很可能比在段文件中出现的次数更大。
2. IDF(逆文档频率)
一个词语普遍重要性的度量。主要思想是:如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
(三) 数学定义
tf-idf是两个统计量,词频和逆文档频率的乘积。有多种方法可以用来确定两个统计量的确切值。
1. TF
对于在某一个特定文件里的词语ti来说,它的重要性可以表示为:
\(tf_{i,j}=\frac{n_{i,j}}{\sum_{k}n_{k,j}}\)
其中\(n_{i,j}\)是该词在文件j中出现的次数,而分母则是文件j中所有词汇出现的次数总和。更通俗的表示方式就是:
\(TF(t)=\frac{Number of times term t appears in a document}{Total number of terms in the document}\)
2. IDF
逆文档频率(IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到:
\(idf_{i}=log\frac{\left | D \right |}{\left | \left \{ j:t_{i}\in d_{j} \right \} \right |}\)
其中,\(\left | D \right |\)是语料库中的文件总数。\(\left | \left \{ j:t_{i}\in d_{j} \right \} \right |\)表示包含词语\(t_{i}\)的文件数目(即\(t_{i}\)的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用\(\left | \left \{ j:t_{i}\in d_{j} \right \} \right |\) + 1 。同样,如果用更直白的语言表示就是
\(TF(t)=\frac{Total number of documents}{Number of documents with term in it}\)
3. TF-IDF
>
TF-IDF(t) = TF(t) * IDF(t)
公式中,我们可以看出TF-IDF与一个词在文档中出现的次数成正比,与该词在整个语言中该出现的次数成反比。
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
(三)python实现TF-IDF
1 | import nltk |
(四)利用Scikit-Learn实现的TF-IDF
TF-IDF 在文本数据挖掘时十分常用,所以在Python的机器学习包中也提供了内置的TF-IDF实现。主要使用的函数就是TfidfVectorizer(),来看一个简单的例子。
1 | from sklearn.feature_extraction.text import TfidfVectorizer |
参考博客