Получите наиболее похожие слова, учитывая вектор слова (а не само слово)

Используя библиотеку gensim.models.Word2Vec, у вас есть возможность предоставить модель и «слово», для которого вы хотите найти список наиболее похожих слов:

model = gensim.models.Word2Vec.load_word2vec_format(model_file, binary=True)
model.most_similar(positive=[WORD], topn=N)

Интересно, есть ли возможность предоставить системе в качестве входных данных модель и «вектор» и попросить систему вернуть самые популярные похожие слова (их векторы очень близки к заданному вектору). Что-то подобное:

model.most_similar(positive=[VECTOR], topn=N)

Мне нужна эта функция для двуязычной среды, в которой у меня есть 2 модели (английская и немецкая), а также некоторые английские слова, для которых мне нужно найти их наиболее похожих немецких кандидатов. Я хочу получить вектор каждого английского слова из английской модели:

model_EN = gensim.models.Word2Vec.load_word2vec_format(model_file_EN, binary=True)
vector_w_en=model_EN[WORD_EN]

а затем запросите немецкую модель с этими векторами.

model_DE = gensim.models.Word2Vec.load_word2vec_format(model_file_DE, binary=True)
model_DE.most_similar(positive=[vector_w_en], topn=N)

Я реализовал это на C, используя исходную функцию расстояния в пакете word2vec. Но теперь мне нужно, чтобы он был на Python, чтобы иметь возможность интегрировать его с другими моими скриптами.

Знаете ли вы, есть ли уже в gensim.models.Word2Vec библиотеке или других подобных библиотеках метод, который это делает? Надо ли мне реализовать это самостоятельно?


person amin    schedule 14.06.2016    source источник
comment
most_similar(..) также возвращает вам оценки? Я представляю написанную вами настраиваемую функцию, которая вызывает most_similar для каждого слова в векторе, добавляет результаты из ВСЕХ в тот же список, а затем сортирует по счету и возвращает.   -  person nbryans    schedule 14.06.2016
comment
Спасибо nbryans. Если нет существующего метода, который делает это, я должен реализовать его следующим образом: для каждого слова в словаре получить соответствующий вектор из модели. Вычислите косинусное сходство входного вектора и возвращенного. А потом верните топ самых похожих. Но я думал, что такой метод может существовать; что, кажется, нет.   -  person amin    schedule 15.06.2016
comment
Привет, аминь, ты реализовал свой метод? если да, то мне интересно узнать, почему вы используете косинусное сходство вместо евклидова расстояния?   -  person Nawshad Farruque    schedule 12.12.2018
comment
Привет @MiNdFrEaK, реализовал сам. ну, на самом деле это не было большой проблемой, но тогда мне просто было интересно, было ли это уже реализовано, и я могу использовать его в готовом виде. К сожалению, очень скоро я перестал работать над этой темой. Мне нужно заглянуть в свои коды, чтобы найти свою реализацию. Я дам тебе знать, как только найду.   -  person amin    schedule 20.12.2018


Ответы (2)


Метод similar_by_vector возвращает первые N самых похожие слова по вектору:

similar_by_vector(vector, topn=10, restrict_vocab=None)
person user48135    schedule 16.12.2016

Я не думаю, что то, чего вы пытаетесь достичь, может дать точный ответ. Просто потому, что две модели обучаются отдельно. И хотя и английская, и немецкая модели будут иметь одинаковые расстояния между соответствующими векторами слов. Нет никакой гарантии, что вектор слова для "House" будет иметь то же направление, что и вектор слов для "Haus".

Проще говоря, если вы обучили обе модели с размером вектора = 3. И «Дом» имеет вектор [0.5,0.2,0.9], нет гарантии, что «Хаус» будет иметь вектор [0.5,0.2,0.9] или даже что-то близкое к нему.

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

TL: DR; Нельзя просто вставить векторы из одной языковой модели в другую и рассчитывать на получение точных результатов.

person Dachrimar    schedule 19.12.2018
comment
Что ж, вы правы, если вложения обучаются отдельно и находятся в двух разных пространствах. В то время я пытался либо обучить двуязычные вложения слов совместно, либо сопоставить вложения двух языков в общее пространство с помощью обучаемой функции сопоставления и некоторого словаря или параллельных корпусов. - person amin; 20.12.2018