Frage

Ich bin ein Stück Java-Software zu schreiben, die die endgültige Entscheidung über die Ähnlichkeit zweier Dokumente in UTF-8 codiert zu machen hat.

Die beiden Dokumente sind sehr wahrscheinlich das gleiche sein, oder leicht voneinander unterscheiden, weil sie viele Gemeinsamkeiten wie Datum, Standort, Konzept, etc., aber ihr Text ist, was entscheidet, ob sie wirklich sind.

Ich erwarte, dass der Text der beiden Dokumente entweder als sehr ähnlich oder gar nicht, so dass ich über die Schwelle zu Satz für Ähnlichkeit ziemlich streng sein kann. Ich könnte zum Beispiel sagen, dass die beiden Dokumente ähnlich sind, nur dann, wenn sie 90% ihrer Worte gemeinsam haben, aber ich möchte etwas robuster haben, die kurz für Texte funktionieren würde und lange gleichermaßen.

Um es zusammenzufassen ich habe:

  • zwei Dokumente, entweder sehr ähnlich oder nicht ähnlich überhaupt, aber:
  • ist es wahrscheinlicher, dass die beiden Dokumente als nicht ähnlich zu sein
  • können Dokumente sein lange beide (einige Absätze) und kurz (ein paar Sätze)

Ich habe experimentiert mit simmetrics , unt große Auswahl von String-Matching-Funktion, aber ich bin in einem Vorschlag über mögliche Algorithmen zur Verwendung am meisten interessiert.

Mögliche Kandidaten ich habe, sind:

  • Levenshtein: seine Ausgabe an Bedeutung für kurze Texte
  • Koeffizient überlappende: vielleicht, aber wird es diskriminiert gut für Dokumente unterschiedlicher Länge
  • ?

Auch unter Berücksichtigung von zwei Texten ähnlich nur, wenn sie genau das gleiche würde auch nicht funktionieren, weil ich für Dokumente möchte, die nur für ein paar Worte unterscheiden sie die Ähnlichkeit Test zu bestehen.

War es hilfreich?

Lösung

Levenshtein-Distanz ist das Standardmaß für einen Grund: es ist leicht zu berechnen und einfach die Bedeutung zu erfassen. Wenn Sie vorsichtig sein, die Anzahl der Zeichen in einem langen Dokument, können Sie berechnen, es nur auf Worte oder Sätze oder sogar Absätze anstelle von Zeichen. Da Sie die ähnlichen Paare zu erwarten sehr ähnlich, das sollte noch gut funktionieren.

Andere Tipps

ist Levenshtein geeignet für die Edit-Distanz zwischen zwei Wörtern; wenn Sie Dokumente vergleichen, so etwas wie diff wird wahrscheinlich mehr entlang der Linien von dem, was Sie brauchen.

Ich würde hier beginnen: http://c2.com/cgi/wiki?DiffAlgorithm. Sie bieten Links zu einer Reihe von diff-Stil Algorithmen Sie hineinblicken kann.

Levenshtein Abstand wird verwendet, um zwei Worte zu vergleichen. Wenn es die Dokumente, populäre Art und Weise sind Kosinusähnlichkeit oder Latent Semantic Analysis.

Levenshtein scheint hier die beste Lösung zu sein. Wenn Sie versuchen, eine gewichtete similiarity zu bekommen Ranking - was ich denke, der Fall ist, weil Sie erwähnte, dass die Ausgabe von Levenshten für kürzeren Texte bedeutsamer ist - dann gewichtet nur das Ergebnis des levenshtein Algorithmus durch die Anzahl der Zeichen in der Teilungs Dokument.

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