3 Stimmen

String-Suchalgorithmen in Java

Ich führe eine Zeichenfolgenabgleichung mit einer großen Menge von Daten durch.

EDIT: Ich gleiche Wörter ab, die in einer großen Liste mit einigen Ontologie-Textdateien enthalten sind. Ich nehme jede Datei aus der Ontologie und suche nach einer Übereinstimmung zwischen der dritten Zeichenfolge jeder Dateizeile und einem Wort aus der Liste.

Ich habe einen Fehler gemacht, indem ich übersehen habe, dass das, was ich tun muss, kein reiner Abgleich ist (Ergebnisse sind schlecht), sondern ich eine lockerere Abgleichfunktion benötige, die auch Ergebnisse zurückgibt, wenn die Zeichenfolge in einer anderen Zeichenfolge enthalten ist.

Das habe ich mit einem Radix-Trie gemacht; es war sehr schnell und funktioniert gut, aber jetzt glaube ich, dass meine Arbeit nutzlos ist, weil ein Trie nur genaue Übereinstimmungen zurückgibt. :/

  • Welche Art von Algorithmen tun dies, sind es Zeichensuchalgorithmen?
  • Kann jemand einige Java-Implementierungen vorschlagen, mit denen er Erfahrung hat?

Der Algorithmus sollte schnell sein, aber dies ist nicht oberste Priorität, würde sich mit Geschwindigkeit und Komplexität abfinden.

Ich bin sehr dankbar für alle Ratschläge/Beispiele/Erklärungen/Links!

Vielen Dank!

0 Stimmen

Was ist die Frage "Welche Art von Algorithmen durchsuchen Zeichenfolgen?"

4voto

Sie könnten Suffix Trees nützlich finden (sie sind ähnlich im Konzept zu Tries).

Jeder String, den Sie mit ^ ergänzen und mit $ beenden und erstellen einen Suffixbaum aller angehängten Strings. Der Speicheraufwand wird O(n) betragen und wird wahrscheinlich schlechter sein als das, was Sie für den Trie hatten.

Wenn Sie jetzt nach einem String s suchen müssen, können Sie dies leicht in O(|s|) Zeit tun, genauso wie bei einem Trie und das Ergebnis, das Sie erhalten, wird eine Teilzeichenfolge sein (im Wesentlichen werden Sie einige Suffixe eines Strings abgleichen).

Entschuldigung, ich habe keine Referenz zu einer Java-Implementierung zur Hand.

Eine nützliche Antwort auf Stackoverflow gefunden: Generalisierte Suffixbaum-Java-Implementierung

Die Folgendes hat: http://illya-keeplearning.blogspot.com/2009/04/suffix-trees-java-ukkonens-algorithm.html

Das hat wiederum: Quellcode: http://illya.yolasite.com/resources/suffix-tree.zip

0 Stimmen

@Dummkopf: Ich denke, das könnte genau das sein, was ich brauche. Wenn ich es richtig verstehe, kann ich mit demselben Baum "match" und "contains" machen?

0 Stimmen

@Julia: Ja genau. Wenn Sie eine exakte Übereinstimmung wünschen, fügen Sie Ihrer Suchzeichenfolge ein ^ vor und hängen Sie $ an und führen Sie die Suche durch. Wenn Sie möchten, verwenden Sie einfach die Suchzeichenfolge.

0 Stimmen

@ Idiot: Scheint, dass dies perfekt wäre. Es muss eine Java-Bibliothek geben!!

2voto

Wajdy Essam Punkte 4150

Sie können den BM-Algorithmus verwenden, um in Textdateien nach einzelnen Mustern zu suchen, und wiederholen Sie diesen Algorithmus für alle Muster, die Sie in Ihrer Liste haben.

Die andere beste Lösung ist die Verwendung von Mehrmusteralgorithmus-Suchalgorithmen wie: Aho–Corasick-Algorithmus zur Zeichenfolgenübereinstimmung

0 Stimmen

johannburkard.de/software/stringsearch ? Du sagst, dass du in Textdateien suchst, aber ich brauche keine Übereinstimmung überall in der Textdatei, sondern jede dritte Zeichenfolge aus jeder Zeile, die angegeben werden kann? (Entschuldigung für die Einzelheiten, ich habe Angst, mich wie bei einem Radix-Baum in etwas zu stürzen)

0 Stimmen

Der BM-Algorithmus passt zu beliebigen Zeichenfolgen, unabhängig von der Quelle der Zeichenfolgen (aus Text in einer Datei, aus einer Zelle in einer Datenbank usw.).

1voto

chimeracoder Punkte 19118

Reguläre Ausdrücke sind definitiv die beste Methode. Sie können etwas unordentlich zu schreiben sein, aber sie sind der einzige Weg, um eine lockerere Übereinstimmung zu haben, ohne eine unverständliche Serie von if/else oder switch-Anweisungen zu haben.

Zusätzlich werden sie viel schneller sein als die Alternative.

0 Stimmen

-1: Warum sind regex 'am besten'? Warum sind die Alternativen if/else switch-Anweisungen? Welche anderen Alternativen haben Sie in Betracht gezogen, bevor Sie behauptet haben, dass die Alternativen langsamer sind? Ich würde sagen, die Leistung von regexs wird ziemlich schlecht sein! Sie müssen sie kompilieren, dann möglicherweise Backtracking während des Abgleichs usw...

0 Stimmen

Nun, in der Form, wie die Frage ursprünglich formuliert war (vor der Bearbeitung), habe ich sie gelesen - offensichtlich trifft sie nicht mehr zu!

0voto

Xzhsh Punkte 2199

Ich bin mir nicht ganz sicher, ob ich die Frage richtig verstanden habe, aber es scheint, als würden reguläre Ausdrücke die Aufgabe erledigen

http://java.sun.com/developer/technicalArticles/releases/1.4regex/

0voto

Mukeshkoshym Punkte 11

Warum verwenden Sie nicht die indexOf-Methode in Java. Je nach Verfügbarkeit des Speichers den Inhalt lesen. Führen Sie ein indexOf aus und erhalten Sie alle Zeilen, die Sie benötigen. Laden Sie den nächsten Satz von Inhalten.

Wenn Sie aus einer Datei lesen, verwenden Sie NIO-Streams.

Vielleicht ist die Idee schlecht, aber ich glaube an Java. Es wird den besten Algorithmus verwenden.

Besser, wenn Sie reguläre Ausdrücke verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X