Ich möchte mehrere Zeichenfolgen miteinander vergleichen und diejenigen finden, die am ähnlichsten sind. Ich habe mich gefragt, ob es eine Bibliothek, Methode oder bewährte Methode gibt, die mir zurückgibt, welche Zeichenfolgen anderen Zeichenfolgen ähnlicher sind. Beispielsweise:
- "Der schnelle Fuchs sprang" -> "Der Fuchs sprang"
- "Der schnelle Fuchs sprang" -> "Der Fuchs"
Dieser Vergleich würde ergeben, dass der erste ähnlicher ist als der zweite.
Ich denke, ich brauche eine Methode wie:
double similarityIndex(String s1, String s2)
Gibt es so etwas irgendwo?
EDIT: Warum mache ich das? Ich schreibe ein Skript, das die Ausgabe einer MS Project-Datei mit der Ausgabe eines Legacy-Systems vergleicht, das Aufgaben erledigt. Da das Legacy-System eine sehr begrenzte Feldbreite hat, werden die Beschreibungen beim Hinzufügen der Werte abgekürzt. Ich möchte eine halbautomatische Methode finden, um herauszufinden, welche Einträge aus MS Project den Einträgen im System ähnlich sind, damit ich die generierten Schlüssel erhalten kann. Es hat Nachteile, da es noch manuell überprüft werden muss, aber es würde viel Arbeit sparen
quelle
Die übliche Methode zur Berechnung der Ähnlichkeit zwischen zwei Zeichenfolgen auf eine Weise von 0% bis 100% , wie sie in vielen Bibliotheken verwendet wird, besteht darin, zu messen, wie viel (in%) Sie die längere Zeichenfolge ändern müssten, um sie in die kürzere umzuwandeln:
Berechnung der
editDistance()
:Es
editDistance()
wird erwartet, dass die obige Funktion den Bearbeitungsabstand zwischen den beiden Zeichenfolgen berechnet . Für diesen Schritt gibt es mehrere Implementierungen , von denen jede besser zu einem bestimmten Szenario passt. Am gebräuchlichsten ist der Levenshtein-Distanzalgorithmus, den wir in unserem folgenden Beispiel verwenden werden (bei sehr großen Zeichenfolgen sind andere Algorithmen wahrscheinlich leistungsfähiger).Hier sind zwei Optionen zum Berechnen der Bearbeitungsentfernung:
apply(CharSequence left, CharSequence rightt)
Arbeitsbeispiel:
Sehen Sie hier die Online-Demo.
Ausgabe:
quelle
org.apache.commons.lang3.StringUtils
.Ich habe den Levenshtein-Distanzalgorithmus in JavaScript übersetzt:
quelle
Sie können den Levenshtein-Abstand verwenden, um die Differenz zwischen zwei Zeichenfolgen zu berechnen. http://en.wikipedia.org/wiki/Levenshtein_distance
quelle
Es gibt in der Tat viele Maßstäbe für die Ähnlichkeit von Zeichenfolgen:
Erklärungen und Java-Implementierung finden Sie hier: https://github.com/tdebatty/java-string-similarity
quelle
Sie können dies mit der Java-Bibliothek von Apache Commons erreichen . Schauen Sie sich diese beiden Funktionen an:
- getLevenshteinDistance
- getFuzzyDistance
quelle
Theoretisch können Sie Bearbeitungsabstände vergleichen .
quelle
Dies erfolgt normalerweise mithilfe eines Bearbeitungsabstandsmaßes . Wenn Sie nach "Edit Distance Java" suchen, werden eine Reihe von Bibliotheken wie diese angezeigt .
quelle
Klingt für mich wie ein Plagiatsucher , wenn sich Ihre Zeichenfolge in ein Dokument verwandelt. Vielleicht ergibt die Suche mit diesem Begriff etwas Gutes.
"Programmieren von kollektiver Intelligenz" enthält ein Kapitel zum Bestimmen, ob zwei Dokumente ähnlich sind. Der Code ist in Python, aber sauber und einfach zu portieren.
quelle
Dank des ersten Antwortenden denke ich, dass es 2 Berechnungen von computeEditDistance (s1, s2) gibt. Aufgrund des hohen Zeitaufwands wurde beschlossen, die Leistung des Codes zu verbessern. So:
quelle
Sie können auch den z-Algorithmus verwenden, um Ähnlichkeit in der Zeichenfolge zu finden. Klicken Sie hier https://teakrunch.com/2020/05/09/string-similarity-hackerrank-challenge/
quelle