Pracuję nad problemem, w którym muszę ustalić, czy dwa zdania są podobne, czy nie. Zaimplementowałem rozwiązanie wykorzystujące algorytm BM25 i zestawy słowników do określania podobieństwa składniowego i semantycznego. Rozwiązanie działa poprawnie i nawet jeśli kolejność słów w zdaniach jest pomieszana, to mierzy się, że dwa zdania są podobne. Na przykład
- Python to dobry język.
- Język to dobry python.
Moim problemem jest ustalenie, czy te dwa zdania są podobne.
- Jakie może być możliwe rozwiązanie podobieństwa strukturalnego?
- Jak utrzymam strukturę zdań?
natural-language-processing
python
Shubham Tiwari
źródło
źródło
Odpowiedzi:
Najłatwiejszym sposobem dodania pewnego rodzaju podobieństwa strukturalnego jest użycie n-gramów; w twoim przypadku bigramy mogą być wystarczające.
Przejrzyj każde zdanie i zbierz pary słów, takie jak:
Twoje drugie zdanie ma
Z ośmiu bigramów masz dwa takie same („python jest” i „dobry”), więc można powiedzieć, że podobieństwo strukturalne wynosi 2/8.
Oczywiście możesz być bardziej elastyczny, jeśli wiesz, że dwa słowa są semantycznie powiązane. Jeśli chcesz powiedzieć, że Python jest dobrym językiem jest strukturalnie podobny / identyczny z Javą jest świetnym językiem , możesz dodać to do porównania, aby skutecznie przetwarzać „[PROG_LANG] jest językiem [POSITIVE-ADJ]”, lub coś podobnego.
źródło
Po pierwsze, zanim zaczniemy, polecam zapoznać się z podobnymi pytaniami w sieci, takimi jak /datascience/25053/best-practical-algorithm-for-sentence-similarity i https: // stackoverflow. com / pytania / 62328 / is-there-an-algorytm-that-tells-the-semantic-podobieństwo-dwóch-fraz
Aby określić podobieństwo zdań, musimy rozważyć, jakie mamy dane. Na przykład, jeśli posiadasz oznaczony zestaw danych, tj. Podobne zdania i zdania niepodobne, wówczas prostym podejściem mogłoby być użycie nadzorowanego algorytmu do klasyfikacji zdań.
Podejściem, które mogłoby określić strukturalne podobieństwo zdań, byłoby uśrednienie wektorów słów generowanych przez algorytmy osadzania słów, tj. Word2vec. Algorytmy te tworzą wektor dla każdego słowa, a podobieństwo cosinusowe reprezentuje podobieństwo semantyczne między słowami. (Daniel L 2017)
Korzystając z wektorów słów, możemy użyć następujących wskaźników do określenia podobieństwa słów.
Podobieństwo cosinus jest miarą podobieństwa między dwoma niezerowymi wektorami wewnętrznej przestrzeni produktu, która mierzy cosinus kąta między nimi. Kąt cosinus jest miarą nakładania się zdań pod względem ich zawartości.
Odległość euklidesowa między dwoma wektorami słów zapewnia skuteczną metodę pomiaru podobieństwa językowego lub semantycznego odpowiednich słów. (Frank D 2015)
Alternatywnie można obliczyć wektor własny zdań, aby określić podobieństwo zdań.
Wektory własne to specjalny zestaw wektorów związanych z liniowym układem równań (tj. Równanie macierzowe). Tutaj generowana jest macierz podobieństwa zdań dla każdego skupienia i obliczany jest wektor własny macierzy. Więcej informacji na temat podejścia do rankingu zdań opartego na oprogramowaniu Eigenvector można znaleźć w tym dokumencie https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf
Dla kodu źródłowego Siraj Rawal ma notatnik w języku Python do tworzenia zestawu wektorów słów. Wektory słów można następnie wykorzystać do znalezienia podobieństwa między wyrazami. Kod źródłowy jest dostępny tutaj https://github.com/llSourcell/word_vectors_game_of_thrones-LIVE
Inną opcją jest samouczek od Oreily, który wykorzystuje bibliotekę gensin Python do określania podobieństwa między dokumentami. Ten samouczek używa NLTK do tokenizacji, a następnie tworzy z korpusu model tf-idf (termin częstotliwość-odwrotna częstotliwość dokumentów). Następnie tf-idf służy do określenia podobieństwa dokumentów. Samouczek jest dostępny tutaj https://www.oreilly.com/learning/how-do-i-compare-document-similarity-using-python
źródło
Najbardziej efektywnym podejściem jest teraz użycie Universal Google Sentence Encoder firmy Google ( paper_2018 ), która oblicza podobieństwo semantyczne między zdaniami przy użyciu iloczynu ich osadzania (tj. Wyuczonych wektorów 215 wartości) . Podobieństwo jest liczbą zmiennoprzecinkową między 0 (tj. Bez podobieństwa) a 1 (tj. Silne podobieństwo).
Implementacja jest teraz zintegrowana z Tensorflow Hub i może być łatwo używana. Oto gotowy do użycia kod do obliczenia podobieństwa między dwoma zdaniami. Tutaj uzyskam podobieństwo między „Python jest dobrym językiem” i „Językiem dobrym pythonem”, jak w twoim przykładzie.
źródło