我在ISI论文中有一个tf-idf示例。我试图通过这个例子来验证我的代码。但是我的代码得到了不同的结果。我不知道原因是什么!
纸张的术语 - 文件矩阵:
acceptance [ 0 1 0 1 1 0
information 0 1 0 1 0 0
media 1 0 1 0 0 2
model 0 0 1 1 0 0
selection 1 0 1 0 0 0
technology 0 1 0 1 1 0]
纸张的Tf-idf矩阵:
acceptance [ 0 0.4 0 0.3 0.7 0
information 0 0.7 0 0.5 0 0
media 0.3 0 0.2 0 0 1
model 0 0 0.6 0.5 0 0
selection 0.9 0 0.6 0 0 0
technology 0 0.4 0 0.3 0.7 0]
我的tf-idf矩阵:
acceptance [ 0 0.4 0 0.3 0.7 0
information 0 0.7 0 0.5 0 0
media 0.5 0 0.4 0 0 1
model 0 0 0.6 0.5 0 0
selection 0.8 0 0.6 0 0 0
technology 0 0.4 0 0.3 0.7 0]
我的代码:
tfidf = models.TfidfModel(corpus)
corpus_tfidf=tfidf[corpus]
我尝试了另外这样的代码:
transformer = TfidfTransformer()
tfidf=transformer.fit_transform(counts).toarray() ##counts is term-document matrix
但我没有得到适当的答案
答案 0 :(得分:1)
您提到的结果之间存在差异的原因是有很多方法可以在论文中计算TF-IDF。如果您阅读Wikipedia TF-IDF page,则提到TF-IDF计算为
tfidf(t,d,D)= tf(t,d)。 IDF(吨,d)
并且可以使用将改变TF_IDF值的最后结果的不同函数来计算tf(t,d)和idf(t,D)两者。实际上,在不同的应用程序中使用它们的功能是不同的。
Gensim TF-IDF Model可以计算tf(t,d)和idf(t,D)的任何函数,如其文档中所述。
通过将本地组件(术语频率)乘以来计算tf-idf 全局组件(逆文档频率),并将其标准化 结果文件到单位长度。非标准化权重的公式 在D文件的语料库中的文件j中的术语i:
#include <iostream> using namespace std; int main() { int i, j, f = 1; int t, a[100]; cin >> t;//enter test cases for (i = 0; i < t; i++) cin >> a[i];//enter all the cases one by one for (i = 0; i < t; i++) { for (j = 1; j <= a[i]; j++) f = f*j; cout << f;//displays each factorial } return 0; }
或者更一般地说:
weight_{i,j} = frequency_{i,j} * log_2(D / document_freq_{i})
所以你可以插入你自己的自定义wlocal和wglobal函数。
wlocal的默认值是identity(其他选项:math.sqrt,math.log1p, ...)和wglobal的默认值是log_2(total_docs / doc_freq),给出 上面的公式。
现在,如果您想要准确到达纸张结果,您必须知道它用于计算TF-IDF矩阵的函数。
此外,Gensim google group中还有一个很好的示例,说明如何使用自定义函数计算TF-IDF。