Как мне получить вектор из gensim's translation_matrix - PullRequest
0 голосов
/ 29 марта 2020

Я обучил две модели word2ve c, предъявляющих претензии к gensim, на отдельных корпусах. Обе корпуса находятся в английском sh. В одном корпусе есть несколько разных слов, которых нет в другом.

Я хочу отобразить общие слова одной модели на другую. Затем я хочу получить векторы неизвестных слов (после сопоставления).

Я попробовал следующий код:

from gensim.models import KeyedVectors
from gensim.models import translation_matrix

w2v_bin_path_old    = 'model_from_corpus1_30d.bin'
w2v_bin_path_new    = 'model_from_corpus2_30d.bin'
wv_old              = KeyedVectors.load_word2vec_format(w2v_bin_path_old, binary=True)
wv_new              = KeyedVectors.load_word2vec_format(w2v_bin_path_new, binary=True)

common_tokens       = set(wv_old.vocab.keys()).intersection(set(wv_new.vocab.keys()))
common_tokens       = [(tok, tok) for tok in common_tokens]

transmat            = translation_matrix.TranslationMatrix(wv_new, wv_old, common_tokens)
transmat.train(common_tokens)

transmat.translate('whatever')

Однако этот код возвращает только первые 5 слов из целевой модели w2v. Я только хочу получить вектор предложенного токена. Есть ли способ сделать это?

Заранее спасибо!

1 Ответ

0 голосов
/ 30 марта 2020

К сожалению TranslationMatrix class isn't well-factored to let you just project vectors (the 1st step in its .translate () `), а не продолжать делать полные переводы.

Вы захотите выполнить лишь небольшое подмножество всех операций, выполненных его фактическим .translate() методом, исходный код которого можно просмотреть по адресу:

https://github.com/RaRe-Technologies/gensim/blob/ec222e8e3e72608a59805040eadcf5c734a2b96c/gensim/models/translation_matrix.py#L279

Более или менее, вы хотите скопировать то, что делает этот метод, но просто вернуть mapped_source_space (в строке 345). Он должен содержать только введенные вами («исходные») слова и их новые координаты. (Вы можете игнорировать все ветви, имеющие отношение к опции gc=1 или другим наворотам.)

Не проверяя этот код , я думаю, что внешний для перевода- Метод вспомогательной матрицы, который делает правильные вещи, будет примерно:

def project_words_vectors(translation_matrix, source_words):
    source_space = Space.build(translation_matrix.source_lang_vec, source_words)
    source_space.normalize()
    mapped_source_space = translation_matrix.apply_transmat(source_space)
    return mapped_source_space

(Возвращенный объект Space немного похож на минимальный KeyedVectors - и его список .index2word и .word2index dict , служат ориентирами для определения того, какие строки в его свойстве .mat являются какими векторами. Для получения дополнительной информации см. тот же исходный файл, указанный выше.)

Дайте мне знать, работает ли этот быстрый и грязный фрагмент в ваших целях , или требуются небольшие исправления, прежде чем его можно будет использовать.

(Отдельно, просмотрев исходный код, я не уверен, что .normalize() в этой функции или в исходном методе .translate(), или даже в исходном методе класса .train() строго необходим для получения хороших результатов. Если бы я полагался на этот код, я бы проверил, действительно ли такая нормализация времени поезда или перевода действительно улучшает конечные результаты для моей цели. oses of not.)

...