我有这段代码,并且有文章列表作为数据集。每个原始文件都有一篇文章。

我运行以下代码:

import gensim
docgen = TokenGenerator( raw_documents, custom_stop_words )
# the model has 500 dimensions, the minimum document-term frequency is 20
w2v_model = gensim.models.Word2Vec(docgen, size=500, min_count=20, sg=1)
print( "Model has %d terms" % len(w2v_model.wv.vocab) )
w2v_model.save("w2v-model.bin")
# To re-load this model, run
#w2v_model = gensim.models.Word2Vec.load("w2v-model.bin")
    def calculate_coherence( w2v_model, term_rankings ):
        overall_coherence = 0.0
        for topic_index in range(len(term_rankings)):
            # check each pair of terms
            pair_scores = []
            for pair in combinations(term_rankings[topic_index], 2 ):
                pair_scores.append( w2v_model.similarity(pair[0], pair[1]) )
            # get the mean for all pairs in this topic
            topic_score = sum(pair_scores) / len(pair_scores)
            overall_coherence += topic_score
        # get the mean score across all topics
        return overall_coherence / len(term_rankings)

import numpy as np
def get_descriptor( all_terms, H, topic_index, top ):
    # reverse sort the values to sort the indices
    top_indices = np.argsort( H[topic_index,:] )[::-1]
    # now get the terms corresponding to the top-ranked indices
    top_terms = []
    for term_index in top_indices[0:top]:
        top_terms.append( all_terms[term_index] )
    return top_terms
from itertools import combinations
k_values = []
coherences = []
for (k,W,H) in topic_models:
    # Get all of the topic descriptors - the term_rankings, based on top 10 terms
    term_rankings = []
    for topic_index in range(k):
        term_rankings.append( get_descriptor( terms, H, topic_index, 10 ) )

    # Now calculate the coherence based on our Word2vec model
    k_values.append( k )
    coherences.append( calculate_coherence( w2v_model, term_rankings ) )
    print("K=%02d: Coherence=%.4f" % ( k, coherences[-1] ) )


我面对这个错误:

raise KeyError("word '%s' not in vocabulary" % word)


KeyError:u“单词'business'不在词汇表中”

原始代码非常适合其数据集。

https://github.com/derekgreene/topic-model-tutorial

您能帮忙这个错误是什么吗?

最佳答案

如果您在错误消息周围包含了更多信息,则可能会对回答者有帮助,例如,多行调用框架可以清楚地指示代码的哪一行触发了错误。

但是,如果收到错误KeyError: u"word 'business' not in vocabulary",则可以相信Word2Vec实例w2v_model从未学习过单词'business'

这可能是因为它没有出现在模型提供的训练数据中,或者出现的次数少于min_count次。

由于您没有显示raw_documents变量的类型/内容或TokenGenerator类的代码,因此不清楚为什么会出错–而是这些地方。仔细检查raw_documents的内容正确,并且docgen可迭代对象中的各个项目看起来像Word2Vec的正确输入。

docgen迭代对象中的每个项目都应该是一个字符串列表,而不是纯字符串或其他任何东西。并且,docgen可迭代对象必须可以被迭代多次。例如,如果执行以下两行,则应该看到相同的两个字符串列表标记(看起来像['hello', 'world']

print(iter(docgen).next())
print(iter(docgen).next())


如果看到纯字符串,则docgen没有为Word2Vec提供正确的项目。如果仅看到一个打印项目,则docgen可能是简单的单遍迭代器,而不是可迭代的对象。

您还可以在INFO级别启用日志记录,并仔细观察Word2Vec步骤期间的输出,并格外注意所有看似不一致的数字/步骤。 (例如,是否有任何步骤表明什么都没有发生,或者单词/文本示例的计数似乎没有?)

10-08 20:21