Ошибка «слишком много значений для распаковки» при попытке получить схожесть в Gensim с использованием модели LDA - PullRequest
0 голосов
/ 23 октября 2019

Я использую 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>

, но не знаю, что это значит.

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Отсюда: 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))

Надеюсь, это поможет. Удачи.

0 голосов
/ 10 ноября 2019

Если вы измените lda на lda_model = gensim.models.ldamodel.LdaModel(corpus=vectorized_corpus, id2word=id2word, num_topics=20, random_state=100, update_every=1, chunksize=400, passes=10, alpha='auto'

, сходство сработает, причина в том, что первоначально опубликованный аргумент per_word_topic = true приводит к тому, что вывод model_vec= lda_model[new_doc_freq_vector] будет распределением каждого из слов внутриэтот документ по теме (вероятность того, что каждое слово будет в каждой теме) вместо списка с вероятностями того, что документ является частью каждой темы, это различие в формате приводит к тому, что функция подобия выдает ошибку, если аргумент"Правда". Если его снять, он работает нормально. Подробнее здесь https://github.com/RaRe-Technologies/gensim/issues/2644

...