我基本上使用的是Anaconda环境python 3.7,gensim 3.8.0。我将数据作为一个数据帧保存在测试和培训集中,它们都具有以下结构:
X_test和Xtrain数据框格式:
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
不知道如何解决这个问题,我已经尝试调试了3个小时。 ,我相信我会遵循许多其他人使用的相同代码,以获得相似性。
我尝试解决的问题:
1)使用
Similarity('model/indexes/similarity_index_01', lda_model[corpus], num_features=len(id2word))
。
但是它没有用。获得了相同的错误代码。
2)如果我将lda_model [corpus]替换为语料库,并将index [model_vec]替换为index [new_doc_freq_vector],则相似之处。MatrixSimilarity()有效。但是我相信它不会给出正确的结果,因为它里面没有模型信息。它起作用的事实告诉我,它与数据类型(?)有关,如果我打印lda_model [corpus]我得到
<gensim.interfaces.TransformedCorpus object at 0x00000221ECA8E148>
不知道这是什么意思。
从这里:https://radimrehurek.com/gensim/similarities/docsim.html#gensim.similarities.docsim.MatrixSimilarity
MatrixSimilarity
接受2个参数:
# num_features (int) – Size of the dictionary (number of features).
MatrixSimilarity(common_corpus, num_features=len(common_dictionary))
希望这会有所帮助。祝你好运。