2

我从 yebrahim 那里得到了这个tfidf,不知何故,我的输出文档为结果产生了所有 0。这有什么问题吗?输出的例子是 hippo 0.0 hipper 0.0 hip 0.0 hint 0.0 后见之明 0.0 hill 0.0 hilarious 0.0

谢谢您的帮助

    # increment local count
    for word in doc_words:
        if word in terms_in_doc:
            terms_in_doc[word] += 1
        else:
            terms_in_doc[word]  = 1

    # increment global frequency
     for (word,freq) in terms_in_doc.items():
        if word in global_term_freq:
            global_term_freq[word] += 1
        else:
            global_term_freq[word]  = 1

     global_terms_in_doc[f] = terms_in_doc

print('working through documents.. ')
for f in all_files:

    writer = open(f + '_final', 'w')
    result = []
    # iterate over terms in f, calculate their tf-idf, put in new list
    max_freq = 0;
    for (term,freq) in global_terms_in_doc[f].items():
        if freq > max_freq:
            max_freq = freq
    for (term,freq) in global_terms_in_doc[f].items():
        idf = math.log(float(1 + num_docs) / float(1 + global_term_freq[term]))
        tfidf = float(freq) / float(max_freq) * float(idf)
        result.append([tfidf, term])

    # sort result on tfidf and write them in descending order
    result = sorted(result, reverse=True)
    for (tfidf, term) in result[:top_k]:
        if display_mode == 'both':
            writer.write(term + '\t' + str(tfidf) + '\n')
        else:
            writer.write(term + '\n')
4

1 回答 1

3

tf-idf 的输出显然取决于您正确计算术语。如果你弄错了,那么结果将出乎意料。您可能希望输出每个单词的原始计数来验证这一点。例如,单词“hipp”在当前文档和整个集合中出现了多少次?

其他一些指针:

  • 不要使用显式浮点数进行除法,而是使用from __future__ import division. 它使您的代码更具可读性。
  • 使用 collections.defaultdict 将字典与计数器结合起来。这避免了在增加它之前必须检查一个值是否已经存在。如果你不喜欢 defaultdict,那么使用 try-catch 块——它比使用 if 语句更快。
  • 不要遍历items()字典。它创建了一个全新的(键、值)对列表,并带来了巨大的计算和存储复杂性损失。遍历字典的键 ( for k in some_dictionary) 并使用普通索引来访问值 ( some_dictionary[k])。
  • 您不需要 for 循环来计算 Python 中列表的最大值。

上述提示可能无法直接解决您的问题,但它们将使您的代码更易于阅读和理解(对于您和 SO 上的人),从而更容易定位和解决问题。

于 2013-04-22T05:18:44.610 回答