gensim most_similar con positivo y negativo, ¿cómo funciona?
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.713
y en el segundo 0.732
que 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
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 positive
y negative
.