it-swarm.com.de

Wie vergleiche ich fast ähnliche Strings in Java? (Saitenabstand messen)

Ich möchte zwei Zeichenfolgen vergleichen und ein paar Punkte erhalten, wie sehr diese gleich aussehen. _ Zum Beispiel: "Der Satz ist fast ähnlich" und "Der Satz ist ähnlich".

Ich kenne keine vorhandenen Methoden in Java, aber für PHP kenne ich die levenshtein-Funktion .

Gibt es bessere Methoden in Java?

35
hsmit

Der Levensthein-Abstand ist ist ein Maß dafür, wie ähnlich Strings sind. Oder genauer: Wie viele Änderungen müssen gemacht werden, damit sie gleich sind. 

Der Algorithmus ist auf Wikipedia in Pseudo-Code verfügbar. Das Konvertieren nach Java sollte kein großes Problem sein, aber es ist nicht in die Basisklassenbibliothek integriert.

Wikipedia hat einige weitere Algorithmen, die die Ähnlichkeit von Strings messen.

20
Joey

Die folgenden Java-Bibliotheken bieten mehrere Vergleichsalgorithmen (Levenshtein, Jaro Winkler, ...): 

  1. Apache Commons Lang 3: https://commons.Apache.org/proper/commons-lang/
  2. Simmetrics: http://sourceforge.net/projects/simmetrics/

Beide Bibliotheken verfügen über 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);
}
50
FiveO

ja, das ist eine gute Metrik, Sie könnten StringUtil.getLevenshteinDistance () aus Apache Commons verwenden

14
jspcal

Implementierungen von Levenshtein und anderen String-Ähnlichkeits-/Abstandsmaßen finden Sie unter https://github.com/tdebatty/Java-string-similarity .

Wenn Ihr Projekt Maven verwendet, ist die Installation so einfach wie

<dependency>
  <groupId>info.debatty</groupId>
  <artifactId>Java-string-similarity</artifactId>
  <version>RELEASE</version>
</dependency>

Dann verwenden Sie zum Beispiel Levenshtein

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"));
  }
}
1

Schamloser Plug, aber ich habe auch eine Bibliothek geschrieben:

https://github.com/vickumar1981/stringdistance

Es hat all diese Funktionen und ein paar für die klangliche Ähnlichkeit (wenn ein Wort wie ein anderes Wort klingt - gibt es entweder wahr oder falsch im Gegensatz zu den anderen unscharfen Ähnlichkeiten, die Zahlen zwischen 0-1 sind).

Enthält auch DNA-Sequenzierungsalgorithmen wie Smith-Waterman und Needleman-Wunsch, die verallgemeinerte Versionen von Levenshtein sind.

Ich plane in naher Zukunft, dass dies mit jedem Array und nicht nur mit Strings (einem Array von Zeichen) funktioniert.

0
Vaibhav Kumar