Chcę porównać kilka ciągów ze sobą i znaleźć te, które są najbardziej podobne. Zastanawiałem się, czy jest jakaś biblioteka, metoda lub najlepsza praktyka, które zwróciłyby mi, które ciągi są bardziej podobne do innych ciągów. Na przykład:
- „Szybki lis skoczył” -> „Lis skoczył”
- „Szybki lis skoczył” -> „Lis”
Z tego porównania wynika, że pierwsze jest bardziej podobne niż drugie.
Chyba potrzebuję jakiejś metody, takiej jak:
double similarityIndex(String s1, String s2)
Czy gdzieś jest coś takiego?
EDYCJA: Dlaczego to robię? Piszę skrypt, który porównuje dane wyjściowe pliku MS Project z danymi wyjściowymi jakiegoś starszego systemu, który obsługuje zadania. Ponieważ starszy system ma bardzo ograniczoną szerokość pola, po dodaniu wartości opisy są skracane. Chcę mieć półautomatyczny sposób na znalezienie wpisów z MS Project, które są podobne do wpisów w systemie, abym mógł uzyskać wygenerowane klucze. Ma wady, ponieważ nadal musi być ręcznie sprawdzany, ale zaoszczędziłoby to dużo pracy
źródło
Powszechnym sposobem obliczania podobieństwa między dwoma ciągami w sposób 0% -100% , stosowanym w wielu bibliotekach, jest zmierzenie, ile (w%) musiałbyś zmienić dłuższy ciąg, aby zamienić go na krótszy:
Obliczanie
editDistance()
:Powyższa
editDistance()
funkcja ma obliczyć odległość edycji między dwoma ciągami. Jest kilka implementacji tego kroku, każda może lepiej pasować do konkretnego scenariusza. Najpopularniejszym jest algorytm odległości Levenshteina i użyjemy go w naszym przykładzie poniżej (w przypadku bardzo dużych ciągów inne algorytmy prawdopodobnie będą działać lepiej).Oto dwie opcje obliczania odległości edycji:
apply(CharSequence left, CharSequence rightt)
Przykład pracy:
Zobacz demo online tutaj.
Wynik:
źródło
org.apache.commons.lang3.StringUtils
.Przetłumaczyłem algorytm odległości Levenshteina na JavaScript:
źródło
Możesz użyć odległości Levenshteina, aby obliczyć różnicę między dwoma strunami. http://en.wikipedia.org/wiki/Levenshtein_distance
źródło
Rzeczywiście istnieje wiele miar podobieństwa ciągów:
Możesz znaleźć wyjaśnienie i implementację java tutaj: https://github.com/tdebatty/java-string-similarity
źródło
Możesz to osiągnąć za pomocą biblioteki apache commons java . Spójrz na te dwie funkcje w nim zawarte:
- getLevenshteinDistance
- getFuzzyDistance
źródło
Teoretycznie można porównać odległości edycji .
źródło
Odbywa się to zwykle za pomocą edycji miary odległości . Wyszukiwanie frazy „edit distance java” powoduje wyświetlenie wielu bibliotek, takich jak ta .
źródło
Brzmi jak wykrywacz plagiatów , jeśli twój ciąg zamieni się w dokument. Może wyszukiwanie z tym terminem przyniesie coś dobrego.
„Programowanie zbiorowej inteligencji” zawiera rozdział poświęcony określaniu, czy dwa dokumenty są podobne. Kod jest w Pythonie, ale jest czysty i łatwy do przeniesienia.
źródło
Dzięki pierwszej osobie odpowiadającej, myślę, że istnieją 2 obliczenia computeEditDistance (s1, s2). Ze względu na duże nakłady czasu postanowił poprawić wydajność kodu. Więc:
źródło
Możesz również użyć algorytmu z, aby znaleźć podobieństwo w ciągu. Kliknij tutaj https://teakrunch.com/2020/05/09/string-similarity-hackerrank-challenge/
źródło