Python “错误”;“值太多,无法解包”;当尝试使用LDA模型在Gensim中获得相似性时
基本上,我使用的是anaconda环境python 3.7、gensim 3.8.0。我将我的数据作为一个数据帧,在测试和训练集中分开,它们都具有以下结构: X_测试和Xtrain数据帧格式:Python “错误”;“值太多,无法解包”;当尝试使用LDA模型在Gensim中获得相似性时,python,gensim,similarity,recommendation-engine,lda,Python,Gensim,Similarity,Recommendation Engine,Lda,基本上,我使用的是anaconda环境python 3.7、gensim 3.8.0。我将我的数据作为一个数据帧,在测试和训练集中分开,它们都具有以下结构: X_测试和Xtrain数据帧格式: id alltext 1710 3264537 [exmodelo, karen, mcdougal, asegura, mantuvo, ... 8211 3272079 [grupo
id alltext
1710 3264537 [exmodelo, karen, mcdougal, asegura, mantuvo, ...
8211 3272079 [grupo, socialista, pionero, supone, apoyar, n...
1885 3263933 [parte, entrenador, zaragoza, javier, aguirre,...
2481 3263744 [fans, hielo, fuego, saga, literaria, dio, pie...
2975 3265302 [actividad, busca, repetir, tres, ediciones, a...
已经过预处理
这是我用来创建模型的代码
id2word = corpora.Dictionary(X_train["alltext"])
texts = X_train["alltext"]
corpus = [id2word.doc2bow(text) for text in texts]
lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus,
id2word=id2word,
num_topics=20,
random_state=100,
update_every=1,
chunksize=400,
passes=10,
alpha='auto',
per_word_topics=True)enter code here
在这里之前,一切都很顺利。我可以有效地使用
pprint(lda_model.print_topics())
doc_lda = lda_model[corpus]
获取我的主题
当我试图比较新文档和语料库之间的相似性时,问题来了。这是我正在使用的代码
newddoc = X_test["alltext"][2730] #I get a particular instance of the test_set
new_doc_freq_vector = id2word.doc2bow(newddoc) #vectorize its list of words
model_vec= lda_model[new_doc_freq_vector] #run the trained model on it
index = similarities.MatrixSimilarity(lda_model[corpus]) # error
sims = index[model_vec] #error
在最后两行中,我得到了以下错误:
-------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-110-352248c464f8> in <module>
4
5 #index = Similarity('model/indexes/similarity_index_01', lda_model[corpus], num_features=len(id2word)) #the first argument, the place where the
----> 6 index = similarities.MatrixSimilarity(lda_model[corpus]) # funciona si en vez de lda_model[corpus] usamos solo corpus
7 index = similarities.MatrixSimilarity(model_vec)
8 #sims = index[model_vec] #funciona si usamos index[new_doc_freq_vector] en vez de model_vec
~\AppData\Local\Continuum\anaconda3\envs\lda_henneo_01\lib\site-packages\gensim\similarities\docsim.py in __init__(self, corpus, num_best, dtype, num_features, chunksize, corpus_len)
776 "scanning corpus to determine the number of features (consider setting `num_features` explicitly)"
777 )
--> 778 num_features = 1 + utils.get_max_id(corpus)
779
780 self.num_features = num_features
~\AppData\Local\Continuum\anaconda3\envs\lda_henneo_01\lib\site-packages\gensim\utils.py in get_max_id(corpus)
734 for document in corpus:
735 if document:
--> 736 maxid = max(maxid, max(fieldid for fieldid, _ in document))
737 return maxid
738
~\AppData\Local\Continuum\anaconda3\envs\lda_henneo_01\lib\site-packages\gensim\utils.py in <genexpr>(.0)
734 for document in corpus:
735 if document:
--> 736 maxid = max(maxid, max(fieldid for fieldid, _ in document))
737 return maxid
738
ValueError: too many values to unpack (expected 2
不知道这意味着什么 从这里开始:
矩阵相似性
采用两个参数:
# num_features (int) – Size of the dictionary (number of features).
MatrixSimilarity(common_corpus, num_features=len(common_dictionary))
希望这有帮助。祝您好运。如果您将lda更改为
lda\u model=gensim.models.ldamodel.ldamodel(语料库=矢量化的语料库,id2word=id2word,num\u topics=20,random\u state=100,update\u every=1,chunksize=400,passes=10,alpha='auto'
相似性起作用,原因是最初发布的per_word_topic=true参数,导致
model_vec=lda_model[new_doc_freq_vector]
的输出是文档中每个主题的每个单词的分布(每个单词对应每个主题的概率)如果参数为“True”,则格式上的差异会导致相似度函数给出错误,而不是一个列表,其中该文档可能是每个主题的一部分。如果您将其取下,则效果良好。此处的更多详细信息是的,在阅读文档后,您不能从一开始就将矩阵相似性与LDA输出一起使用,因为输出不是具有相似系数的矩阵(就像lsi函数一样,这就是为什么在文档中总是建议lsi用于该函数的原因)。为了与LDA相似,我需要首先将输出转换为保留lsi输出的内容,例如,然后使用MatrixSimilarity()函数。这里详细介绍了这一点的理论依据
# num_features (int) – Size of the dictionary (number of features).
MatrixSimilarity(common_corpus, num_features=len(common_dictionary))