обучаем модель Word2vec с помощью Gensim

#python-3.x #gensim #word2vec

#python-3.x #gensim #word2vec

Вопрос:

это мой code.it считывает обзоры из файла Excel (столбец rev) и составляет список list.

xp выглядит так

 ["['intrepid', 'bumbling', 'duo', 'deliver', 'good', 'one'],['better', 'offering', 'considerable', 'cv', 'freshly', 'qualified', 'private', 'investigator', 'thrust', 'murder', 'investigation', 'invisible'],[ 'man', 'alone', 'tell', 'fun', 'flow', 'decent', 'clip', 'need', 'say', 'sequence', 'comedy', 'gold', 'like', 'scene', 'restaurant', 'excellent', 'costello', 'pretending', 'work', 'ball', 'gym', 'final', 'reel']"]
  

но когда я использую list для модели, это выдает мне ошибку «TypeError: объект ‘float’ не поддается повторению». я не знаю, в чем моя проблема.
Спасибо.

 xp=[]
import gensim 
import logging
import pandas as pd 
file = r'FileNamelast.xlsx'
df = pd.read_excel(file,sheet_name='FileNamex')
pages = [i for i in range(0,1000)]


for page in  pages:

 text =df.loc[page,["rev"]]
 xp.append(text[0])


model = gensim.models.Word2Vec (xp, size=150, window=10, min_count=2, 
workers=10)
model.train(xp,total_examples=len(xp),epochs=10)
  

вот что у меня получилось.Ошибка типа: объект ‘float’ не может быть повторен

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-32-aa34c0e432bf> in <module>()
     14 
     15 
---> 16 model = gensim.models.Word2Vec (xp, size=150, window=10, min_count=2, workers=10)
     17 model.train(xp,total_examples=len(xp),epochs=10)

C:ProgramDataAnaconda3libsite-packagesgensimmodelsword2vec.py in __init__(self, sentences, corpus_file, size, alpha, window, min_count, max_vocab_size, sample, seed, workers, min_alpha, sg, hs, negative, ns_exponent, cbow_mean, hashfxn, iter, null_word, trim_rule, sorted_vocab, batch_words, compute_loss, callbacks, max_final_vocab)
    765             callbacks=callbacks, batch_words=batch_words, trim_rule=trim_rule, sg=sg, alpha=alpha, window=window,
    766             seed=seed, hs=hs, negative=negative, cbow_mean=cbow_mean, min_alpha=min_alpha, compute_loss=compute_loss,
--> 767             fast_version=FAST_VERSION)
    768 
    769     def _do_train_epoch(self, corpus_file, thread_id, offset, cython_vocab, thread_private_mem, cur_epoch,

C:ProgramDataAnaconda3libsite-packagesgensimmodelsbase_any2vec.py in __init__(self, sentences, corpus_file, workers, vector_size, epochs, callbacks, batch_words, trim_rule, sg, alpha, window, seed, hs, negative, ns_exponent, cbow_mean, min_alpha, compute_loss, fast_version, **kwargs)
    757                 raise TypeError("You can't pass a generator as the sentences argument. Try an iterator.")
    758 
--> 759             self.build_vocab(sentences=sentences, corpus_file=corpus_file, trim_rule=trim_rule)
    760             self.train(
    761                 sentences=sentences, corpus_file=corpus_file, total_examples=self.corpus_count,

C:ProgramDataAnaconda3libsite-packagesgensimmodelsbase_any2vec.py in build_vocab(self, sentences, corpus_file, update, progress_per, keep_raw_vocab, trim_rule, **kwargs)
    934         """
    935         total_words, corpus_count = self.vocabulary.scan_vocab(
--> 936             sentences=sentences, corpus_file=corpus_file, progress_per=progress_per, trim_rule=trim_rule)
    937         self.corpus_count = corpus_count
    938         self.corpus_total_words = total_words

C:ProgramDataAnaconda3libsite-packagesgensimmodelsword2vec.py in scan_vocab(self, sentences, corpus_file, progress_per, workers, trim_rule)
   1569             sentences = LineSentence(corpus_file)
   1570 
-> 1571         total_words, corpus_count = self._scan_vocab(sentences, progress_per, trim_rule)
   1572 
   1573         logger.info(

C:ProgramDataAnaconda3libsite-packagesgensimmodelsword2vec.py in _scan_vocab(self, sentences, progress_per, trim_rule)
   1552                     sentence_no, total_words, len(vocab)
   1553                 )
-> 1554             for word in sentence:
   1555                 vocab[word]  = 1
   1556             total_words  = len(sentence)

TypeError: 'float' object is not iterable
  

Комментарии:

1. Вы передаете неправильное значение в gensim. «Вы не можете передать генератор в качестве аргумента предложений. Попробуйте итератор.».

2. Пример чего?

Ответ №1:

sentences Аргументом корпуса для Word2Vec должна быть повторяющаяся последовательность списков токенов word.

Сообщаемое вами значение для xp на самом деле представляет собой список с одной длинной строкой в нем:

 [
  "['intrepid', 'bumbling', 'duo', 'deliver', 'good', 'one'],['better', 'offering', 'considerable', 'cv', 'freshly', 'qualified', 'private', 'investigator', 'thrust', 'murder', 'investigation', 'invisible'],[ 'man', 'alone', 'tell', 'fun', 'flow', 'decent', 'clip', 'need', 'say', 'sequence', 'comedy', 'gold', 'like', 'scene', 'restaurant', 'excellent', 'costello', 'pretending', 'work', 'ball', 'gym', 'final', 'reel']"
]
  

Я не понимаю, как это приведет к ошибке, о которой вы сообщили, но это определенно неправильно, поэтому должно быть исправлено. Возможно, вам следует распечатать xp непосредственно перед созданием экземпляра Word2Vec , чтобы быть уверенным, что вы знаете, что он содержит.

Действительный список, каждый элемент которого является списком строковых токенов, будет работать. Итак, если бы xp было следующее, это было бы правильно:

     [
      ['intrepid', 'bumbling', 'duo', 'deliver', 'good', 'one'],
      ['better', 'offering', 'considerable', 'cv', 'freshly', 'qualified', 'private', 'investigator', 'thrust', 'murder', 'investigation', 'invisible'],
      [ 'man', 'alone', 'tell', 'fun', 'flow', 'decent', 'clip', 'need', 'say', 'sequence', 'comedy', 'gold', 'like', 'scene', 'restaurant', 'excellent', 'costello', 'pretending', 'work', 'ball', 'gym', 'final', 'reel']
    ]

  

Обратите внимание, однако:

  • Word2Vec не очень хорошо работает с наборами данных игрушечного размера. Итак, хотя эта небольшая настройка может быть полезна для проверки базовых проблем с синтаксисом / форматом, не ожидайте реалистичных результатов, пока вы не будете тренироваться со многими сотнями тысяч слов.
  • Вам не нужно вызывать train() , если вы уже предоставили свой корпус при создании экземпляра, как у вас есть. Модель будет выполнять все шаги автоматически. (Если, с другой стороны, вы не предоставляете свой корпус, вам тогда придется вызывать оба build_vocab() и train() .) Если вы включите ведение журнала на информационном уровне, все шаги, происходящие за кулисами, будут понятнее.

Комментарии:

1. я решаю проблему. но есть проблема. мой файл имеет размер 150 Мг, и я не знаю, как передать его в word2vec, потому что это выдает ошибку «недостаточно оперативной памяти».

2. Если у вас уже возникают проблемы с памятью, имея всего 150 МБ данных, возможно, вам потребуется поработать на компьютере с большим объемом оперативной памяти. Однако вам не нужно переносить весь ваш набор данных в память: модели gensim предназначены для работы с повторяющимися последовательностями, поэтому они могут обучаться по мере постепенного считывания данных с диска. Многие примеры в документах / руководствах gensim показывают, как читать данные таким образом. Тем не менее, если вы используете min_count=2 , вы можете сохранить так много слов, что ваша модель не поместится в памяти. Вам пришлось бы опубликовать дополнительную информацию о том, что вы пробовали, и как это не удалось, возможно, в качестве нового вопроса, для получения дополнительной помощи.