Jak najlepiej ustalić semantyczne podobieństwo słów? Word2Vec jest w porządku, ale nie idealny:
# Using the 840B word Common Crawl GloVe vectors with gensim:
# 'hot' is closer to 'cold' than 'warm'
In [7]: model.similarity('hot', 'cold')
Out[7]: 0.59720456121072973
In [8]: model.similarity('hot', 'warm')
Out[8]: 0.56784095376659627
# Cold is much closer to 'hot' than 'popular'
In [9]: model.similarity('hot', 'popular')
Out[9]: 0.33708479049537632
Wydaje się, że metody Wordnet NLTK po prostu się poddają:
In [25]: print wn.synset('hot.a.01').path_similarity(wn.synset('warm.a.01'))
None
Jakie są inne opcje?
nlp
word-embeddings
word2vec
nltk
Thomas Johnson
źródło
źródło
Odpowiedzi:
Word2vec nie przechwytuje podobieństwa na podstawie antonimów i synonimów. Word2vec dałoby większe podobieństwo, gdyby dwa słowa miały podobny kontekst. Np. Pogoda w Kalifornii wynosiła _____. Półwyrób może być wypełniony zarówno na gorąco, jak i na zimno, dlatego podobieństwo byłoby większe. Ta koncepcja nazywa się relacjami paradygmatycznymi.
Jeśli chcesz uchwycić relacje, takie jak hiperny, hiponimy, synonimy, antonimy, musisz użyć dowolnej miary podobieństwa opartej na słowie. Istnieje wiele miar podobieństwa opartych na wordnet. Możesz sprawdzić ten link http://ws4jdemo.appspot.com/
źródło
W tekstowych narzędziach analitycznych dla podobieństwa semantycznego opracowali algorytm w celu znalezienia podobieństwa między dwoma zdaniami. Ale jeśli czytasz uważnie, znajdują podobieństwo słowa w macierzy i sumują się, aby znaleźć podobieństwo między zdaniami. Sprawdzanie podobieństwa słów może być strzałem w dziesiątkę.
Również w SimLex-999: Ocena modeli semantycznych z (oryginalną) podobieństwem , wyjaśniają różnicę między,
association
asimilarity
która prawdopodobnie jest również przyczyną twojej obserwacji. Na przykład kawa i filiżanka. Nie są podobne, ale są skojarzone. Samo rozważenie podobieństwa dałoby inny wynik. Autorzy sugerują różne modele do ich oszacowania.źródło
Word2vec jest dobrym punktem wyjścia dla większości scenariuszy. To robi semantykę przechwytywania drodze przewidywania stosując metodę CBOW. Pozwala na tłumaczenie (jak najbardziej powtarzający się przykład, który mogę tu ponownie umieścić), V (król) - V (królowa) ~~ V (mężczyźni) - V (kobiety) i tak dalej.
Więc jaki jest problem? Problem polega na dwuznaczności słownej. Ilekroć samo słowo ma dwa różne znaczenia w dwóch różnych kontekstach, wektor słów będzie miał tendencję do oddalania się od obu kontekstów. Python ~ Boa (oba węże) i Python - Java (oba języki programowania) ..
Jakaś alternatywa?
Do bardzo konkretnego celu „synonimów”, jeśli chcesz Wordnet byłoby idealnym miejscem. Przechwytuje wyraźną relację dwóch słów, a nie domniemaną zależność na podstawie użycia i zdarzeń.
Wordnet jest przeważnie tworzony jako słownik - gdzie word2vec jest wydobywany przez użycie.
źródło
W kontekście wolnej od kontekstu gramatyki, myślę, że naprawdę niemożliwe jest określenie bliskości słów. Możesz użyć wektorów leksykalnych, a jeśli słowo jest bliskie wartościom między dwoma leksykonami, to wartość powinna być bliska.
źródło