Wie fast ähnliche Strings in Java vergleichen? (String Abstandsmaß) [geschlossen]
-
21-09-2019 - |
Frage
Ich möchte zwei Zeichenfolgen vergleichen und eine Punktzahl, wie viel diese gleich aussehen zu bekommen. Zum Beispiel "Der Satz ist fast ähnlich" und "Der Satz ist ähnlich wie" .
Ich bin nicht vertraut mit den bestehenden Methoden in Java, aber für PHP Ich kenne die levenshtein Funktion .
Gibt es bessere Methoden in Java?
Lösung
Der Levensthein Abstand ist ein Maß dafür, wie ähnlich Strings sind. Oder, genauer gesagt, wie viele Änderungen gemacht werden müssen, dass sie gleich sind.
Der Algorithmus ist in Pseudo-Code auf Wikipedia verfügbar. Konvertieren, dass Java nicht viel von einem Problem sein sollte, aber es nicht eingebaut in ist in der Basisklassenbibliothek.
Wikipedia hat einige weitere Algorithmen diese Maßnahme Ähnlichkeit von Strings.
Andere Tipps
Die folgenden Java-Bibliotheken bieten mehr vergleichen Algorithmen (Levenshtein, Jaro Winkler, ...):
- Apache Commons Lang 3 : https: //commons.apache .org / die richtige / commons-lang /
- Simmetrics : http://sourceforge.net/projects/simmetrics/
Beide Bibliotheken haben eine Java-Dokumentation ( Apache Commons Lang Javadoc , Simmetrics Javadoc ).
//Usage of Apache Commons Lang 3
import org.apache.commons.lang3.StringUtils;
public double compareStrings(String stringA, String stringB) {
return StringUtils.getJaroWinklerDistance(stringA, stringB);
}
//Usage of Simmetrics
import uk.ac.shef.wit.simmetrics.similaritymetrics.JaroWinkler
public double compareStrings(String stringA, String stringB) {
JaroWinkler algorithm = new JaroWinkler();
return algorithm.getSimilarity(stringA, stringB);
}
ja, das ist eine gute Metrik, können Sie StringUtil.getLevenshteinDistance () von Apache commons
Sie können Implementierungen von Levenshtein finden und andere Zeichenfolge Ähnlichkeit / Abstandsmaße auf https://github.com/tdebatty/java-string-similarity
Wenn Ihr Projekt verwendet Maven Installation ist so einfach wie
<dependency>
<groupId>info.debatty</groupId>
<artifactId>java-string-similarity</artifactId>
<version>RELEASE</version>
</dependency>
Dann verwenden Levenshtein zum Beispiel
import info.debatty.java.stringsimilarity.*;
public class MyApp {
public static void main (String[] args) {
Levenshtein l = new Levenshtein();
System.out.println(l.distance("My string", "My $tring"));
System.out.println(l.distance("My string", "My $tring"));
System.out.println(l.distance("My string", "My $tring"));
}
}
Shameless Stecker, aber ich eine Bibliothek schrieb auch:
https://github.com/vickumar1981/stringdistance
Es hat alle diese Funktionen, plus ein paar für klangliche Ähnlichkeit (wenn ein Wort „klingt wie“ ein anderes Wort - gibt entweder wahr oder falsch ist im Gegensatz zu den anderen Fuzzy-Ähnlichkeiten, die Zahlen zwischen 0-1).
enthält auch DNA-Sequenzierungsalgorithmen wie Smith-Waterman und Needleman-Wunsch, welche Versionen von Levenshtein verallgemeinert werden.
Ich plane, in naher Zukunft auf machen diese Arbeit mit jedem Array und nicht nur Zeichenfolgen (eine Reihe von Zeichen).