gensim najbardziej_podobne do pozytywnych i negatywnych, jak to działa?
Czytałem tę odpowiedź, która mówi o Gensim most_similar
:
wykonuje arytmetykę wektorów: dodaje dodatnie wektory, odejmuje ujemne, a następnie od tej wynikowej pozycji, wypisując znane wektory najbliższe temu kątowi.
Ale kiedy to przetestowałem, tak nie jest. Wyszkoliłem Word2Vec z zestawem "text8"
danych Gensim i przetestowałem te dwa:
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),...]
Wyraźnie nie są takie same. nawet wynik królowej w pierwszym jest 0.713
i na drugim, 0.732
które nie są takie same.
Dlatego ponownie zadaję pytanie, jak działa Gensim most_similar
? dlaczego wyniki dwóch powyższych są różne?
Odpowiedzi
Dodawanie i odejmowanie to nie wszystko , co robi; dokładny opis znajdziesz w kodzie źródłowym:
https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/models/keyedvectors.py#LC690:~:text=def%20most_similar,self%2C
Zobaczysz tam, że dodawanie i odejmowanie odbywa się w wersji każdego wektora znormalizowanej jednostkowo , poprzez get_vector(key, use_norm=True)
akcesor.
Jeśli zmienisz sposób użycia model[key]
na model.get_vector(key, use_norm=True)
, powinieneś zobaczyć, jak obliczenia wektora docelowego poza metodą dają takie same wyniki, jak pozwolenie metodzie na połączenie wektorów positive
i negative
.