Zgodnie z Gensim Word2Vec , mogę użyć modelu word2vec w pakiecie gensim do obliczenia podobieństwa między 2 słowami.
na przykład
trained_model.similarity('woman', 'man')
0.73723527
Jednak model word2vec nie przewiduje podobieństwa zdań. Odnajduję model LSI z podobieństwem zdań w gensimie, ale wydaje się, że nie da się tego połączyć z modelem word2vec. Długość korpusu każdego zdania, które mam, nie jest zbyt długa (mniej niż 10 słów). Czy są więc jakieś proste sposoby na osiągnięcie celu?
Odpowiedzi:
W rzeczywistości jest to dość trudny problem, o który pytasz. Obliczenie podobieństwa zdań wymaga zbudowania gramatycznego modelu zdania, zrozumienia równoważnych struktur (np. „Wczoraj szedł do sklepu” i „wczoraj szedł do sklepu”), znalezienia podobieństwa nie tylko w zaimkach i czasownikach, ale także w rzeczowniki własne, znajdowanie statystycznych współwystępowań / zależności w wielu rzeczywistych przykładach tekstowych itp.
Najprostszą rzeczą, jaką możesz spróbować - chociaż nie wiem, jak dobrze by to działało iz pewnością nie dałoby optymalnych rezultatów - byłoby najpierw usunięcie wszystkich słów „stop” (takich jak „the”, „an "itp., które nie dodają zbyt wiele znaczenia do zdania), a następnie uruchom word2vec na słowach w obu zdaniach, zsumuj wektory w jednym zdaniu, zsumuj wektory w drugim zdaniu, a następnie znajdź różnicę między sumy. Podsumowując je, zamiast robić różnicę w słowach, przynajmniej nie będziesz podlegać kolejności słów. To powiedziawszy, zawiedzie to na wiele sposobów i nie jest w żaden sposób dobrym rozwiązaniem (chociaż dobre rozwiązania tego problemu prawie zawsze obejmują pewną ilość NLP, uczenia maszynowego i innego sprytu).
Krótka odpowiedź brzmi: nie, nie ma łatwego sposobu, aby to zrobić (przynajmniej nie zrobić tego dobrze).
źródło
Ponieważ używasz gensim, prawdopodobnie powinieneś użyć jego implementacji doc2vec. doc2vec jest rozszerzeniem word2vec na poziomie frazy, zdania i dokumentu. To całkiem proste rozszerzenie, opisane tutaj
http://cs.stanford.edu/~quocle/paragraph_vector.pdf
Gensim jest fajny, ponieważ jest intuicyjny, szybki i elastyczny. Wspaniałe jest to, że możesz pobrać wstępnie wytrenowane osadzenia słów z oficjalnej strony word2vec, a warstwa syn0 modelu Doc2Vec gensim jest odsłonięta, dzięki czemu możesz wysiewać osadzanie słów za pomocą tych wysokiej jakości wektorów!
GoogleNews-vectors-negative300.bin.gz (zgodnie z linkiem w Google Code )
Myślę, że gensim jest zdecydowanie najłatwiejszym (i jak dotąd dla mnie najlepszym) narzędziem do osadzania zdania w przestrzeni wektorowej.
Istnieją inne techniki zamiany zdania na wektor niż ta zaproponowana w powyższej pracy Le & Mikolov. Socher i Manning ze Stanford to z pewnością dwaj najbardziej znani badacze pracujący w tej dziedzinie. Ich praca została oparta na zasadzie kompozycyjności - semantyka zdania pochodzi z:
Zaproponowali kilka takich modeli (coraz bardziej złożonych), jak używać kompozycyjności do budowania reprezentacji na poziomie zdań.
2011 - rozwijanie rekurencyjnego autoenkodera (bardzo stosunkowo proste. Jeśli jesteś zainteresowany, zacznij tutaj)
2012 - sieć neuronowa macierzowo-wektorowa
2013 - neuronowa sieć tensorowa
2015 - Drzewo LSTM
wszystkie jego artykuły są dostępne na socher.org. Niektóre z tych modeli są dostępne, ale nadal polecam doc2vec firmy Gensim. Po pierwsze, URAE 2011 nie jest szczególnie potężny. Ponadto jest wstępnie wytrenowany z wagami dostosowanymi do parafrazowania danych news-y. Dostarczony przez niego kod nie pozwala na przekwalifikowanie sieci. Nie możesz również zamieniać się różnymi wektorami słów, więc utkniesz z osadzeniami pre-word2vec 2011 z Turian. Te wektory z pewnością nie są na poziomie word2vec czy GloVe.
Jeszcze nie współpracowałem z Tree LSTM, ale wydaje się bardzo obiecujący!
tl; dr Tak, użyj doc2vec gensima. Ale istnieją inne metody!
źródło
Jeśli używasz word2vec, musisz obliczyć średni wektor dla wszystkich słów w każdym zdaniu / dokumencie i użyć podobieństwa cosinusowego między wektorami:
Oblicz podobieństwo:
źródło
możesz użyć algorytmu odległości programu Word Mover. tutaj jest prosty opis broni masowego rażenia .
Ps: jeśli napotkasz błąd dotyczący importu biblioteki pyemd , możesz ją zainstalować za pomocą następującego polecenia:
źródło
Po obliczeniu sumy dwóch zbiorów wektorów słów należy wziąć cosinus między wektorami, a nie różnicę. Cosinus można obliczyć, znormalizując iloczyn skalarny dwóch wektorów. Dlatego liczba słów nie jest czynnikiem.
źródło
Jest to funkcja z dokumentacją biorąc listę słów i porównywanie ich podobieństwa.
źródło
Chciałbym zaktualizować istniejące rozwiązanie, aby pomóc osobom, które będą obliczać podobieństwo semantyczne zdań.
Krok 1:
Załaduj odpowiedni model za pomocą gensim i oblicz wektory słów dla słów w zdaniu i zapisz je jako listę słów
Krok 2: Obliczanie wektora zdania
Obliczenie podobieństwa semantycznego między zdaniami było wcześniej trudne, ale ostatnio zaproponowano artykuł zatytułowany „ Prosta, ale trudna do pobicia linia bazowa dla osadzenia zdań ”, która sugeruje proste podejście polegające na obliczeniu średniej ważonej wektorów słów w zdaniu, a następnie usunięciu rzuty wektorów średnich na ich pierwszą składową główną, gdzie waga słowa w to a / (a + p (w)), gdzie a jest parametrem, a p (w) (szacowana) częstotliwość słowa zwana gładką częstotliwością odwrotną . ta metoda działa znacznie lepiej.
Podano tutaj prosty kod do obliczania wektora zdania za pomocą metody SIF (gładka częstotliwość odwrotna)
Krok 3: używając sklearn cosine_similarity załaduj dwa wektory dla zdań i oblicz podobieństwo.
Jest to najprostsza i najskuteczniejsza metoda obliczenia podobieństwa zdań.
źródło
Używam następującej metody i działa dobrze. Najpierw musisz uruchomić POSTagger, a następnie przefiltrować zdanie, aby pozbyć się słów pomijanych (determinanty, spójniki, ...). Polecam TextBlob APTagger . Następnie tworzysz word2vec, biorąc średnią każdego wektora słowa w zdaniu. Metoda n_similarity w Gemsim word2vec robi dokładnie to, zezwalając na przekazanie dwóch zestawów słów do porównania.
źródło
Istnieją rozszerzenia Word2Vec mające na celu rozwiązanie problemu porównywania dłuższych fragmentów tekstu, takich jak frazy lub zdania. Jednym z nich jest paragraph2vec lub doc2vec.
„Rozproszone reprezentacje zdań i dokumentów” http://cs.stanford.edu/~quocle/paragraph_vector.pdf
http://rare-technologies.com/doc2vec-tutorial/
źródło
Gensim implementuje model o nazwie Doc2Vec do osadzania akapitów .
Istnieją różne samouczki prezentowane jako notebooki IPython:
Inna metoda polegałaby na Word2Vec i Word Mover's Distance (WMD) , jak pokazano w tym samouczku:
Alternatywnym rozwiązaniem byłoby oparcie się na średnich wektorach:
Wreszcie, jeśli możesz uruchomić Tensorflow, możesz spróbować: https://tfhub.dev/google/universal-sentence-encoder/2
źródło
Wypróbowałem metody podane w poprzednich odpowiedziach. To działa, ale jego główną wadą jest to, że im dłuższe zdania, tym większe będzie podobieństwo (do obliczenia podobieństwa używam wyniku cosinusowego dwóch średnich osadzeń dowolnych dwóch zdań), ponieważ im więcej słów, tym bardziej pozytywne efekty semantyczne zostanie dodany do zdania.
Pomyślałem, że powinienem zmienić zdanie i zamiast tego użyć osadzania zdań, jak studiowano w tym i tym artykule .
źródło
Grupa badawcza Facebooka udostępniła nowe rozwiązanie o nazwie InferSent Wyniki, a kod jest publikowany na Github, sprawdź ich repozytorium. To jest niesamowite. Planuję to wykorzystać. https://github.com/facebookresearch/InferSent
ich artykuł https://arxiv.org/abs/1705.02364 Streszczenie: Wiele współczesnych systemów NLP opiera się na osadzaniu słów, wcześniej szkolonych bez nadzoru w dużych korpusach, jako cechach podstawowych. Wysiłki mające na celu osadzenie większych fragmentów tekstu, takich jak zdania, nie przyniosły jednak takiego sukcesu. Kilka prób uczenia się reprezentacji zdań bez nadzoru nie przyniosło wystarczających wyników, aby mogły zostać powszechnie przyjęte. W tym artykule pokazujemy, jak uniwersalne reprezentacje zdań trenowane przy użyciu nadzorowanych danych ze zbiorów danych Stanford Natural Language Inference mogą konsekwentnie przewyższać nienadzorowane metody, takie jak wektory SkipThought w szerokim zakresie zadań transferowych. Podobnie jak wizja komputerowa wykorzystuje ImageNet do uzyskiwania funkcji, które można następnie przenieść do innych zadań, nasza praca wskazuje na przydatność wnioskowania z języka naturalnego do przenoszenia nauki do innych zadań NLP. Nasz koder jest publicznie dostępny.
źródło
Jeśli nie korzystamy z Word2Vec, mamy inny model do znalezienia go przy użyciu BERT do osadzania. Poniżej znajduje się link referencyjny https://github.com/UKPLab/sentence-transformers
Inny link do śledzenia https://github.com/hanxiao/bert-as-service
źródło