Jak uzyskać prawdopodobieństwo, że ciąg znaków będzie podobny do innego ciągu w Pythonie?
Chcę uzyskać wartość dziesiętną, taką jak 0,9 (co oznacza 90%) itp. Najlepiej ze standardowym Pythonem i biblioteką.
na przykład
similar("Apple","Appel") #would have a high prob.
similar("Apple","Mango") #would have a lower prob.
python
probability
similarity
metric
tenstar
źródło
źródło
Odpowiedzi:
Jest wbudowany.
Użyj tego:
źródło
SequenceMatcher
vspython-Levenshtein
moduł. stackoverflow.com/questions/6690739/…get_close_matches
wbudowany, choć znalazłemsorted(... key=lambda x: difflib.SequenceMatcher(None, x, search).ratio(), ...)
bardziej niezawodne, z niestandardowychsorted(... .get_matching_blocks())[-1] > min_match
kontroliget_closest_matches
). Jest to funkcja wygody, która może być tym, czego szukasz, AKA przeczytaj dokumenty! W mojej konkretnej aplikacji robiłem podstawowe sprawdzanie błędów / raportowanie do użytkownika, dostarczając złych danych wejściowych, a ta odpowiedź pozwala mi zgłosić potencjalne dopasowania i jakie było „podobieństwo”. Jeśli jednak nie musisz wyświetlać podobieństwa, zdecydowanie sprawdźget_closest_matches
Myślę, że może szukasz algorytmu opisującego odległość między łańcuchami. Oto niektóre, do których możesz się odwoływać:
źródło
Rozwiązanie nr 1: Wbudowane Python
użyj SequenceMatcher z difflib
zalety : natywna biblioteka Pythona, nie potrzebujesz dodatkowego pakietu.
przykład :Wady : zbyt ograniczone, istnieje wiele innych dobrych algorytmów podobieństwa ciągów.
Rozwiązanie 2: Biblioteka meduz
jest to bardzo dobra biblioteka z dobrym zasięgiem i kilkoma numerami. obsługuje:
- Odległość Levenshtein - Odległość
Damerau-Levenshtein
- Odległość
Jaro - Odległość Jaro-Winkler
- Porównanie podejścia do oceny dopasowania
- Odległość Hamminga
zalety : łatwy w użyciu, gama obsługiwanych algorytmów, przetestowane.
Minusy : nie rodzima biblioteka.
przykład :
źródło
Fuzzy Wuzzy
to pakiet, który implementuje odległość Levenshteina w pythonie, z niektórymi funkcjami pomocniczymi, które pomagają w pewnych sytuacjach, w których możesz chcieć, aby dwa różne łańcuchy były uważane za identyczne. Na przykład:źródło
Możesz utworzyć funkcję taką jak:
źródło
if self.similar(search_string, item.text()) > 0.80:
działa na razie. Dzięki,Odległość paczki obejmuje odległość Levenshteina:
źródło
Wbudowane
SequenceMatcher
jest bardzo powolne przy dużych wejściach, oto jak można to zrobić za pomocą diff-match-patch :źródło
Uwaga: wyszukuje
difflib.SequenceMatcher
tylko najdłuższe ciągłe pasujące podciągi, często nie jest to pożądane, na przykład:Znalezienie podobieństwa między dwoma łańcuchami jest ściśle związane z koncepcją parowania sekwencji w bioinformatyce. Istnieje wiele dedykowanych bibliotek do tego, w tym biopython . Ten przykład implementuje algorytm Needlemana Wunscha :
Korzystanie z biopython lub innego pakietu bioinformatyki jest bardziej elastyczne niż jakakolwiek część standardowej biblioteki Pythona, ponieważ dostępnych jest wiele różnych schematów oceniania i algorytmów. Ponadto możesz uzyskać pasujące sekwencje, aby wizualizować, co się dzieje:
źródło
Większość metod podobieństwa tekstu i sposobu ich obliczania można znaleźć pod tym linkiem: https://github.com/luozhouyang/python-string-similarity#python-string-similarity Oto kilka przykładów;
Znormalizowane, metryczne, podobieństwo i odległość
(Znormalizowane) podobieństwo i odległość
Odległości metryczne
źródło