Установка свойства gensim wordVectors init_sim как True error - ValueError: выходной массив доступен только для чтения - PullRequest
0 голосов
/ 09 июля 2020

Ниже приведен код, который я выполняю. Ошибка возникает в 3-й строке (vectors.init_sims(True))

fname = get_tmpfile(path_to_embedding_file)
vectors = KeyedVectors.load(fname, mmap='r')

vectors.init_sims(True)

Это стек ошибок-

Traceback (most recent call last):
  File "generate_pair_histograms.py", line 82, in <module>
    vectors.init_sims(True) # normalize the vectors (!), so we can use the dot product as similarity measure
  File "C:\users\janki\Anaconda3\lib\site-packages\gensim\models\keyedvectors.py", line 1354, in init_sims
    self.vectors_norm = _l2_norm(self.vectors, replace=replace)
  File "C:\users\janki\Anaconda3\lib\site-packages\gensim\models\keyedvectors.py", line 2374, in _l2_norm
    m /= dist
ValueError: output array is read-only

Это известная проблема? Может ли кто-нибудь предложить решение или обходной путь?

1 Ответ

0 голосов
/ 09 июля 2020

Используя необязательный, нестандартный параметр mmap='r' при загрузке KeyedVectors, вы специально запросили экземпляр, который поддерживался представлением файла на диске только для чтения ('r'), который не

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

В зависимости от того, что вы действительно хотите сделать, что не ясно, выполните хотя бы одно из:

  • полностью исключите аргумент mmap: вы получите обычный KeyedVectors в памяти, который вы можете изменить любым способом, пока он находится в памяти, а затем можете сохранить его позже. (но вы можете не захотеть сохранить единично-нормированную версию, когда у вас уже есть необработанный ненормированный набор - вы всегда можете единично-нормализовать необработанные векторы, но вы не можете go в другую сторону.)
  • исключите от True до .init_sims(): этот шаг затем создаст второй массив с нормированными единицами значения, не пытаясь записать в необработанный массив
  • измените аргумент mmap, чтобы разрешить чтение и запись - вы, вероятно, не захотите этого делать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...