gensim most_similar с положительным и отрицательным, как это работает?
Я читал этот ответ, который говорит о 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? почему результат двух вышеупомянутых различается?
Ответы
Сложение и вычитание - это еще не все, что он делает; для точного описания вы должны посмотреть исходный код:
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векторы.