gensim most_similar con positivo y negativo, ¿cómo funciona?

Nov 29 2020

Estaba leyendo esta respuesta que dice sobre Gensim most_similar:

realiza aritmética vectorial: suma los vectores positivos, resta el negativo, luego de esa posición resultante, enumera los vectores conocidos más cercanos a ese ángulo.

Pero cuando lo probé, ese no es el caso. Entrené un "text8"conjunto de datos de Word2Vec con Gensim y probé estos dos:

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),...]

Claramente no son lo mismo. incluso la puntuación de la reina en el primero es 0.713y en el segundo 0.732que no son lo mismo.

Entonces vuelvo a hacer la pregunta: ¿Cómo funciona Gensim most_similar? ¿Por qué el resultado de los dos anteriores es diferente?

Respuestas

1 gojomo Nov 29 2020 at 20:55

Sumar y restar no es todo lo que hace; para obtener una descripción exacta, debe mirar el código fuente:

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

Verá allí que la suma y la resta están en la versión con norma unitaria de cada vector, a través del get_vector(key, use_norm=True)descriptor de acceso.

Si cambia su uso de model[key]a model.get_vector(key, use_norm=True), debería ver que su cálculo fuera del método del vector objetivo da los mismos resultados que dejar que el método combine los vectores positivey negative.