gensim most_similar com positivo e negativo, como funciona?
Eu estava lendo esta resposta que diz sobre Gensim most_similar
:
ele realiza aritmética vetorial: somando os vetores positivos, subtraindo os negativos e, a seguir, daquela posição resultante, listando os vetores conhecidos mais próximos daquele ângulo.
Mas quando o testei, não foi o que aconteceu. Treinei um Word2Vec com "text8"
conjunto de dados Gensim e testei estes dois:
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),...]
Eles claramente não são os mesmos. até mesmo a pontuação da rainha no primeiro é 0.713
e no segundo 0.732
que não é o mesmo.
Por isso, faço a pergunta novamente: Como funciona o Gensim most_similar
? por que o resultado dos dois acima são diferentes?
Respostas
Adicionar e subtrair não é tudo o que faz; para uma descrição exata, você deve olhar o código-fonte:
https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/models/keyedvectors.py#LC690:~:text=def%20most_similar,self%2C
Você verá que a adição e a subtração estão na versão com norma de unidade de cada vetor, por meio do get_vector(key, use_norm=True)
acessador.
Se você alterar o uso de model[key]
para model.get_vector(key, use_norm=True)
, verá que o cálculo fora do método do vetor de destino fornece os mesmos resultados que permitir que o método combine os vetores positive
e negative
.