Вычисление косинусного сходства одного слова в 2 разных моделях Word2Vec - PullRequest
0 голосов
/ 11 сентября 2018

Я строю вложение двух слов (модели word2vec), используя gensim, и сохраняю его как (word2vec1 и word2vec2), используя команду model.save(model_name) для двух разных корпусов (два корпуса несколько похожи, аналогично означает, что они связаны как часть 1 и часть 2 книги). Предположим, что верхние слова (с точки зрения частоты или встречаемости) для двух корпусов - это одно и то же слово (скажем, a).

Как вычислить степень сходства (cosine-similarity or similarity) извлеченного верхнего слова (скажем, «a») для двух моделей word2vec? most_similar() будет работать в этом случае эффективно?

Я хочу знать, насколько степень сходства относится к одному и тому же слову (а) для двух разных сгенерированных моделей?

Любая идея высоко ценится.

1 Ответ

0 голосов
/ 12 сентября 2018

У вас неправильное представление о word2vec.Он не предоставляет один абсолютный вектор для одного слова.Ему удается найти представление для слова относительно других слов.Таким образом, для одного и того же корпуса, если вы запустите word2vec дважды, вы получите 2 разных вектора для одного и того же слова.Смысл приходит, когда вы сравниваете его с другими векторами слов.

king - man всегда будет близко (с точки зрения сходства косинусов) к queen - woman независимо от того, сколько раз вы его тренируете.Но они будут иметь разные векторы после каждого поезда.

В вашем случае, поскольку две модели обучаются по-разному, сравнение векторов одного и того же слова аналогично сравнению двух случайных векторов.Вы должны скорее сравнить относительные отношения.Может быть что-то вроде: model1.most_similar('dog') против model2.most_similar('dog')

Однако, чтобы ответить на ваш вопрос, если вы хотите сравнить 2 вектора, вы можете сделать это, как показано ниже.Но результаты будут бессмысленными.

Просто возьмите векторы из каждой модели и вручную вычислите косинусное сходство.

vec1 = model1.wv['computer']
vec2 = model2.wv['computer']
print(np.sum(vec1*vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)))
...