如何在python中的gensim工具中实现TF-IDF?

时间:2012-02-27 18:48:17

标签: python tf-idf latent-semantic-indexing gensim

从我从网上找到的文件中我发现了用于确定语料库中术语频率和反文档频率权重的表达式

tf-idf(wt)= tf * log(| N | / d);

我正在进行gensim中提到的tf-idf的实现。 文档中给出的示例是

>>> doc_bow = [(0, 1), (1, 1)]
>>> print tfidf[doc_bow] # step 2 -- use the model to transform vectors
[(0, 0.70710678), (1, 0.70710678)] 

显然不遵循Tf-IDF的标准实施。 两个模型之间有什么区别?

注意:0.70710678是值2 ^( - 1/2),通常用于特征值计算。 那么特征值如何进入TF-IDF模型?

2 个答案:

答案 0 :(得分:4)

来自维基百科:

  

给定文档中的术语计数只是给定术语在该文档中出现的次数。 此计数通常会进行标准化,以防止偏向更长的文档(无论文档中该术语的实际重要性如何,都可能有更高的术语数)

来自gensim source第126-127行:

if self.normalize:
        vector = matutils.unitvec(vector)

答案 1 :(得分:0)

一包词(doc_bow),t0和t1中有两个令牌。我们不知道t0和t1是出现在文档中还是出现在两个文档中。我们甚至不知道模型(tfidf)是否构建在包含令牌的文档上。包,doc_bow只是一个查询(测试数据),而且模型是根据训练数据构建的,训练数据可能包含也可能不包含任何t0或t1。

所以让我们做一个假设。模型tfidf构建了2个文档,d0和d1,d0包含t0,d1包含t1。因此,文档总数(N)为2,t0和t1的术语频率和文档频率为1.

Gensim使用log base 2来计算IDF作为默认值(参考df2idf函数),来自doc_bow的转换后的tfidf向量将类似于[(0,1),(0,1)]。 (例如,tfidf(t0)= 1 * log_2(| 2 | / 1)= 1)

另外,我们需要考虑默认执行的L2归一化,最终输出变为[(0,1 / 2 ^(1/2)),(0,1 / 2 ^(1/2))]。