4

从我从网上找到的文档中,我找出了用于确定语料库中术语的术语频率和逆文档频率权重的表达式

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 模型的呢?

4

2 回答 2

4

来自维基百科:

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

gensim 源代码126-127 行:

if self.normalize:
        vector = matutils.unitvec(vector)
于 2012-04-07T17:29:35.267 回答
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))] 。

于 2015-06-13T18:27:33.410 回答