Каркас Gensim: сохранение и хранение ключевых слов word2ve c - PullRequest
0 голосов
/ 25 января 2020

Я использую модель word2ve c, и у меня возникла проблема с сохранением и чтением.

import gensim.models.keyedvectors as w2v
from gensim.models import KeyedVectors

word_vectors = w2v.wv
word_vectors.save(filepath + "Vectors.bin")

m = word2vec.KeyedVectors.load_word2vec_format(filepath + "Vectors.bin", binary=True)

Я получаю следующую ошибку:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

В следующем как будет работать кодирование:

vectors = KeyedVectors.load(filepath + "Vectors.bin", mmap='r')

Но если я тогда позвоню

vectors.similar_by_word("cat")

, я получаю следующую ошибку: Ошибка типа: неподдерживаемый тип (ы) операнда для ** или pow (): 'list' и 'int'

Что я делаю не так? Как я могу использовать функцию save_word2vec_format ()?

1 Ответ

1 голос
/ 25 января 2020

Ваш начальный блок кода, который делает import gensim.models.keyedvectors as w2v и word_vectors = w2v.wv, не имеет особого смысла.

Читайте буквально, то есть присваиваете полный Python кодовый модуль gensim.models.keyedvectors переменной w2v. Этот модуль не будет иметь свойства .wv, поэтому я не ожидаю, что word_vectors = w2v.wv даже выполнится. Это, конечно, не приведет к тому, что word_vectors станет реальным набором обученных векторов слов, если только не будет куча других обучающих кодов, которые вы не показываете.

Вы уверены, что код в вашем вопросе отражает то, что вы на самом деле делаете?

Тем не менее, если вам удалось получить word_vectors для хранения одного из gensim KeyedVectors объектов, заполненных векторами слов, которые вы хотите сохранить, у вас есть два варианта:

  • Для сохранения векторов слов в том же формате, который использовался оригиналом Google word2vec.c release, вы можете использовать метод .save_word2vec_format(path, ...). Затем, чтобы позже перезагрузить эти векторы, вы должны использовать метод reloaded_vectors = KeyedVectors.load_word2vec_format(path, ...).

  • Для сохранения векторов слов в собственном формате gensim Python. , вы можете использовать метод .save(path). Затем, чтобы позже перезагрузить эти векторы, вы должны использовать метод reloaded_vectors = KeyedVectors.load(path). Этот подход может сохранить немного больше информации (если она присутствует в процессе обучения), например, количество слов. Для эффективности с более крупными объектами он может хранить большую часть векторов в отдельном файле, который должен храниться вместе с основным файлом path, если вы перемещаете файлы в другое место, и допускает возможность (но не требование) использования mmap варианты позже.

Нельзя смешивать и сопоставлять эти форматы: файл, сохраненный с помощью save_word2vec_format(), может быть прочитан только с помощью load_word2vec_format(), а файл, сохраненный с помощью save(), может быть прочитан только на load().

Относительно вашего другого TypeError, недостаточно информации, чтобы предположить, что пошло не так. Вам нужно отредактировать свой ответ, чтобы добавить больше деталей и сделать демонстрационный код самосогласованным.

Например, вы показываете загрузку в переменную с именем vectors, а затем операцию над переменной с именем model. Это несоответствие указывает на то, что проблема может заключаться в некотором другом несоответствии в вашем не показанном коде.

Аналогичным образом, если вы столкнетесь с какой-либо ошибкой, вы должны точно указать в кавычках сообщение об ошибке , а полный стек сообщений об ошибке сообщил в Ваш вопрос, чтобы ответчики могли точно видеть, какие строки кода в вашем коде и библиотеках, на которые вы полагаетесь, в точности связаны с вашей ошибкой. (Это обычно помогает точно определить, где ваши ожидания / код отклоняются от требований библиотеки.)

...