Podobieństwo między dwoma słowami


15

Szukam biblioteki Python, która pomoże mi zidentyfikować podobieństwo między dwoma słowami lub zdaniami.

Będę robił konwersję audio na tekst, co spowoduje, że słownik języka angielskiego lub słowo (słowa) nie w słowniku (może to być nazwa osoby lub firmy). Następnie muszę porównać je ze znanym słowem lub słowami.

Przykład:

1) Wynik zamiany tekstu na dźwięk: Dziękujemy za wywołanie rozszerzenia America zostanie porównane z American Express .

Oba zdania są w jakiś sposób podobne, ale nie takie same.

Wygląda na to, że będę musiał sprawdzić, ile znaków dzielą. Wszelkie pomysły będą świetne. Wygląda na funkcjonalność taką jak wyszukiwarka Google „miałeś na myśli”.

Odpowiedzi:


14

Najbliżej byłoby tak, jak Jan wspominał inis odpowiedź, odległość Levensteina (popularnie zwana także odległością edycji).

W teorii informacji i informatyce odległość Levenshteina jest ciągiem metrycznym służącym do pomiaru różnicy między dwiema sekwencjami. Nieformalnie odległość Levenshteina między dwoma słowami jest minimalną liczbą edycji pojedynczych znaków (tj. Wstawek, usunięć lub podstawień) wymaganych do zamiany jednego słowa na drugie.

Jest to bardzo często stosowany wskaźnik do identyfikacji podobnych słów. Nltk ma już implementację metryki edycji odległości, którą można wywołać w następujący sposób:

import nltk
nltk.edit_distance("humpty", "dumpty")

Powyższy kod zwróci 1, ponieważ tylko jedna litera różni się między dwoma słowami.


1
Odległość Lavenshtiena to najgorszy algorytm, którego możesz użyć, jeśli NLP jest tym, co zamierzasz zrobić. Jeśli 2 synonimy mają inny zestaw znaków, LD będzie w tych przypadkach działać bardzo słabo.
To pułapka

8

Oprócz bardzo dobrych odpowiedzi tutaj, możesz wypróbować SequenceMatcher w bibliotece Pythona w difflib.

https://docs.python.org/2/library/difflib.html

import difflib

a = 'Thanks for calling America Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d) 
### OUTPUT: 87.323943

Teraz rozważ poniższy kod:

a = 'Thanks for calling American Expansion'
b = 'Thanks for calling American Express'

seq = difflib.SequenceMatcher(None,a,b)
d = seq.ratio()*100
print(d)
### OUTPUT: 88.88888

Teraz możesz porównać wartość d, aby ocenić podobieństwo.


1
Jeśli uważasz, że seq.ratio () działa wolno, możesz użyć seq.quick_ratio ()
Nabin

6

Jeśli słownik nie jest zbyt duży, powszechnym podejściem jest wzięcie dystansu Levenshteina, który w zasadzie liczy, ile zmian należy wprowadzić, aby przejść od jednego słowa do drugiego. Zmiany obejmują zmianę postaci, usunięcie postaci lub dodanie postaci. Przykład z Wikipedii :

lew (kotek, siedzący) = 3

  • k itten -> s itten
  • sitt e n -> sitt i n
  • sittin -> sittin g

Oto niektóre narzędzia Python na Wikibooks.

Algorytm obliczania tych odległości nie jest jednak tani. Jeśli musisz to zrobić na dużą skalę, istnieją sposoby na zastosowanie podobieństwa kosinusowego w wektorach bi-gramowych, które są znacznie szybsze i łatwiejsze do rozpowszechnienia, jeśli chcesz znaleźć dopasowania dla wielu słów na raz. Są one jednak jedynie przybliżeniem tej odległości.


(+1) dla Lwa. metr odległości. nltk zawiera gotową implementację. Podobieństwo cosinus nie jest dobrym miernikiem podobieństwa strun IMHO :)
Dawny33

Zgadzam się, że jest to znacznie gorsze niż odległość Levenshteina, ale jeśli potrzebujesz rozmytego dopasowania między 2 zestawami danych milionów, może to zrobić w rozsądnym czasie z powodu pewnych sztuczek i mnożenia macierzy
Jan van der Vegt

1
@ Dawny33 Nie zgadzam się. Podobieństwo do cosinusa nie tylko działało dla mnie bardzo szybko, ale także bardzo dokładnie, biorąc pod uwagę, że użyto właściwego n-gramu.
Mohit Motwani,

3

Starą i dobrze znaną techniką porównywania jest algorytm Soundex . Chodzi o to, aby nie porównywać samych słów, ale przybliżenia ich wymowy. W jakim stopniu poprawia to jakość wyników, których nie znam.

Jednak trochę dziwne jest zastosowanie czegoś takiego jak Soundex do wyników z mechanizmu rozpoznawania mowy na tekst. Najpierw wyrzucasz informacje o wymowie słów, a następnie próbujesz dodać je ponownie. Lepiej byłoby połączyć te dwie fazy.

Dlatego oczekuję, że najnowocześniejsza technologia w tym obszarze to zrobi i będzie jakąś formą adaptacyjnej klasyfikacji, np. Opartej na sieciach neuronowych. Google zwraca ostatnie badania dotyczące rozpoznawania mowy za pomocą sieci neuronowych .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.