Ошибка атрибута: объект «Word2Vec» не имеет атрибута «most_similar» (Word2Vec)

#python #nlp #gensim #word2vec #doc2vec

Вопрос:

Я использую Word2Vec и использую обученную вики-модель, которая выдает наиболее похожие слова. Я запускал это раньше, и это сработало, но теперь это выдает мне эту ошибку даже после повторного запуска всей программы. Я попытался взлететь return_path=True , но все равно получаю ту же ошибку

 print(api.load('glove-wiki-gigaword-50', return_path=True))
model.most_similar("glass")
 

#ОШИБКА:

 /Users/me/gensim-data/glove-wiki-gigaword-50/glove-wiki-gigaword-50.gz
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-153-3bf32168d154> in <module>
      1 print(api.load('glove-wiki-gigaword-50', return_path=True))
----> 2 model.most_similar("glass") 

AttributeError: 'Word2Vec' object has no attribute 'most_similar'
 

#МОДЕЛЬ
это модель, которую я использовал

     print(
        '%s (%d records): %s' % (
            model_name,
            model_data.get('num_records', -1),
            model_data['description'][:40]   '...',
        )
    )
 

Редактировать: вот моя загрузка и вывод gensim

 !python -m pip install -U gensim
 

выход:

Требование уже выполнено: gensim в ./opt/anaconda3/lib/python3.8/пакеты сайтов (4.0.1)

Требование уже выполнено: numpy>=1.11.3 в ./opt/anaconda3/lib/python3.8/пакеты сайтов (от gensim) (1.20.1)

Требование уже выполнено: smart-open>=1.8.1 дюйма. /opt/anaconda3/библиотека/python3.8/пакеты сайтов (от gensim) (5.1.0)

Требование уже выполнено: scipy>=0,18,1 дюйма ./opt/anaconda3/библиотека/python3.8/пакеты сайтов (из gensim) (1.6.2)

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

1. Разве ты не имеешь в виду просто model.similar ?

2. @ewong это дает мне это: AttributeError: 'Word2Vec' object has no attribute 'similar'

3. Есть ли еще строки в вашем коде, или это все? Где определяется модель?

4. @ewong есть такое for model_name, model_data in sorted(info['models'].items()): print( '%s (%d records): %s' % ( model_name, model_data.get('num_records', -1), model_data['description'][:40] '...', ) )

Ответ №1:

Вы, вероятно , ищете <MODEL>.wv.most_similar , поэтому, пожалуйста, попробуйте:

 model.wv.most_similar("glass") 
 

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

1. Привет! Я пробовал это, но это дает мне AttributeError: 'Word2Vec' object has no attribute 'vw' . я обновил свой пост моделью, которую использовал

2. Верно. Интересный. Не могли бы вы также опубликовать версию gensim библиотеки, которую вы используете (поскольку в пути произошли изменения)?

3. Я использовал import gensim.models.word2vec as w2v и import gensim.downloader as api

4. Это не то, о чем я просил. Не могли бы вы, пожалуйста, запустить pip show gensim и опубликовать результаты?

5. Привет, я только что добавил их в свой пост в конце @sophros

Ответ №2:

Ваш показанный код…

 print(api.load('glove-wiki-gigaword-50', return_path=True))
model.most_similar("glass")
 

…ничего не назначает model . (Было ли это назначено ранее?)

И использование return_path=True там означает api.load() , что будет возвращен только строковый путь к файлу данных. Это было бы интересно только в том случае, если бы вы собирались использовать эту строку, чтобы затем самостоятельно загрузить данные в модель.

Этот api.load() вызов без return_path=True вероятности возвращает экземпляр KeyedVectors , представляющий собой набор векторов. Это отличается от полной Word2Vec модели, но все равно будет поддерживать .most_similar() метод. Однако, если вы просто print() используете этот возвращенный путь или возвращенную модель, его не будет в model переменной для вашей последующей .most_similar() операции.

Так что вы можете захотеть:

 kv_model = api.load('glove-wiki-gigaword-50')
similars = kv_model.most_similar('glass')
print(similars)
 

(Лично мне не нравится непрозрачная магия и запуск нового загруженного кода, это api.load() так. Я думаю, что это лучшая привычка-загружать файлы необработанных данных самостоятельно, из известного источника, чтобы вы знали, какие файлы поступили, в какие каталоги, на вашей собственной машине. Затем используйте метод загрузки для конкретного набора данных, чтобы загрузить эти данные, чтобы узнать, какие библиотечные методы работают с какими типами файлов.)

Если ваша model переменная на самом деле включает полную Word2Vec модель из какого-то неизвестного другого кода, то она также будет содержать набор векторов в своем .wv свойстве (для операторов w ord-v) :

 similars = model.wv.most_similar('glass')
print(similars)
 

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

1. Это выводит похожие слова на основе обучения моих данных. Тем не менее, я хотел бы получить слова, которые обучены 'glove-wiki-gigaword-50'

2. Вы пробовали присваивать результаты вашего api.load() вызова переменной вместо того, чтобы печатать ее? (Вы можете назначить его, model если хотите отказаться от Word2Vec модели, которая уже существует. Или вы можете назначить его в новую переменную , например kv_model , чтобы отразить, что это просто a KeyedVectors .)

3. Я попробовал, и это дало мне AttributeError: 'str' object has no attribute 'most_similar'

4. Какой код вы пробовали, который выдал эту ошибку? (Это звучит так, как будто вы назначили строку в переменную, а не результаты api.load() .)

5. Вот что я сделал: kv_model= (api.load('glove-wiki-gigaword-50', return_path=True)) (kv_model.most_similar("glass"))