gensim most_similar с положительным и отрицательным, как это работает?

Nov 29 2020

Я читал этот ответ, который говорит о Gensim most_similar:

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

Но когда я его протестировал, это не так. Я обучил Word2Vec с помощью "text8"набора данных Gensim и протестировал эти два:

model.most_similar(positive=['woman', 'king'], negative=['man'])

>>> [('queen', 0.7131118178367615), ('prince', 0.6359186768531799),...]

model.wv.most_similar([model["king"] + model["woman"] - model["man"]])

>>> [('king', 0.84305739402771), ('queen', 0.7326322793960571),...]

Они явно не совпадают. даже счет ферзя в первом 0.713и втором, 0.732которые не совпадают.

Поэтому я снова задаю вопрос: как работает Gensim most_similar? почему результат двух вышеупомянутых различается?

Ответы

1 gojomo Nov 29 2020 at 20:55

Сложение и вычитание - это еще не все, что он делает; для точного описания вы должны посмотреть исходный код:

https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/models/keyedvectors.py#LC690:~:text=def%20most_similar,self%2C

Там вы увидите, что сложение и вычитание выполняются в версии каждого вектора с нормированной единицей через get_vector(key, use_norm=True)аксессор.

Если вы измените свое применение model[key]к model.get_vector(key, use_norm=True), вы должны увидеть ваш расчет вне-метод-целевого вектора дают те же результаты, позволяя способ объединить positiveи negativeвекторы.