gensim most_similar com positivo e negativo, como funciona?

Nov 29 2020

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.713e no segundo 0.732que 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

1 gojomo Nov 29 2020 at 20:55

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 positivee negative.