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?

War es hilfreich?

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, ...):

  1. Apache Commons Lang 3 : https: //commons.apache .org / die richtige / commons-lang /
  2. 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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top