Levenshtein zlicza liczbę zmian (wstawień, usunięć lub substytucji) potrzebnych do przekonwertowania jednego ciągu znaków na inny. Damerau-Levenshtein jest zmodyfikowaną wersją, która również uważa transpozycje za pojedyncze edycje. Chociaż wyjściowy jest liczbą całkowitą od edycji, może być znormalizowany w celu uzyskania wartości podobieństwa wzorem
1 - (edit distance/length of the larger of the two strings)
Algorytm Jaro jest miarą cech wspólnych, jest nie więcej niż połowa długości dłuższego sznur w odległości, z uwzględnieniem transpozycji. Winkler zmodyfikował ten algorytm, aby potwierdzić, że różnice w pobliżu początku ciągu są bardziej znaczące niż różnice pod koniec łańcucha. Jaro i Jaro-Winkler nadają się do porównywania mniejszych ciągów, takich jak słowa i nazwy.
Decyzja, który z nich należy używać, to nie tylko kwestia wydajności. Ważne jest, aby wybrać metodę dopasowaną do charakteru porównywanych ciągów. Ogólnie rzecz biorąc, oba algorytmy, o których wspomniałeś, mogą być drogie, ponieważ każdy ciąg musi być porównywany z każdym innym łańcuchem, a przy milionach ciągów w zestawie danych jest to ogromna liczba porównań. Jest to o wiele droższe niż coś takiego, jak obliczanie fonetycznego kodowania dla każdego ciągu, a następnie proste grupowanie ciągów dzielących identyczne kodowania.
Istnieje wiele szczegółowych informacji na temat tych algorytmów i innych algorytmów dopasowywania ciągów rozmytych w Internecie. Ten daje start:
A Comparison of Personal Name Matching: Techniques and Practical Issues
Według tego papieru, szybkość czterech Jaro i Levenshteina algorytmów mam wymienić od najszybszego do najwolniejszego:
- Jaro
- Jaro-Winkler
- Levenshteina
- Damerau-Levenshteina
z najwolniejszymi od 2 do 3 razy dłuższymi od najszybszych. Oczywiście czasy te zależą od długości łańcuchów i implementacji i istnieją sposoby optymalizacji tych algorytmów, które mogły nie zostać użyte.
Odpowiedź Hatcheta jest świetna, ale pomyślałam, że warto wspomnieć, że możesz użyć czegoś takiego jak Elasticsearch do wykonywania zapytań rozmytych (Levenshtein) i zapytań opartych na fonetyce i prawdopodobnie pozwoli Ci to na szybką ocenę bez większego wysiłku. – ppearcy
Miałem podobny pomysł. Mam wymóg porównania pola object.escription, które może mieć wiele słów. Czy jest coś, co już zostało zrobione w ten sposób ... aby użyć ES dla Levenshteina? –