Нормализуйте векторы в модели gensim

У меня есть предварительно обученное встраивание слов с векторами разных норм, и я хочу нормализовать все векторы в модели. Я делаю это с помощью цикла for, который перебирает каждое слово и нормализует его вектор, но модель у нас огромная и занимает слишком много времени. Есть ли в gensim способ сделать это быстрее? Я не могу найти это.

Спасибо!!


person Rodrigo Serna Pérez    schedule 29.12.2018    source источник


Ответы (1)


Экземпляры Gensim KeyedVectors (общий интерфейс наборов слов-векторов) содержат метод init_sims(), который внутренне вычисляет нормализованные векторы единичной длины, используя собственную векторную операцию для скорости.

Когда определенные операции, которые обычно выполняются с единично нормализованными векторами, предпринимаются в первый раз, этот init_sims() будет автоматически вызываться, и модель кэширует нормализованные векторы в свойстве модели (vectors_norm), что примерно удваивает потребление ОЗУ.

После его вызова вы можете получить доступ к нормированным векторам с помощью метода .word_vec():

normed_wv = kv_model.word_vec(word, use_norm=True)

Если вы уверены, что вам не понадобятся необработанные, ненормированные векторы, вы также можете сами вызвать init_sim() с необязательным параметром replace. Затем нормированные векторы будут затирать необработанные векторы на месте, экономя дополнительную оперативную память. Например:

kv_model.init_sims(replace=True)

Обратите внимание, что хотя в таких задачах, как нахождение ближайших соседей слова, как в обычной операции most_similar(), традиционно используются вектора, нормализованные по единице, иногда существуют приложения, в которых используются необработанные векторы. (Кроме того, в полной модели Word2Vec, если вы собираетесь проводить дополнительное инкрементное обучение, это должно происходить на необработанных, а не на нормализованных векторах.)

person gojomo    schedule 29.12.2018