Я использую 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] на корпус, а индекс [model_vec] - на индекс [new_doc_freq_vector], схожесть.MatrixSdentifity () работает. Но я считаю, что это не дает должного результата, потому что там нет информации о модели. Тот факт, что он работает, говорит о том, что он как-то связан с типами данных (?), Если я напечатаю lda_model [corpus], я получаю
<gensim.interfaces.TransformedCorpus object at 0x00000221ECA8E148>
, но не знаю, что это значит.