Effizienter Algorithmus zum Auffinden der gebräuchlichsten Ausdrücke in einem großen Textvolumen

8

Ich denke darüber nach, ein Programm zu schreiben, das mir die gebräuchlichsten Sätze in einem großen Teil des Textes sammelt. Wäre das Problem auf das bloße Finden von Wörtern reduziert worden, so wäre das so einfach wie das Speichern jedes neuen Wortes in einer Hash-Map und dann das Erhöhen der Zählung bei jedem Auftreten. Aber mit Phrasen scheint es unmöglich, jede Permutation eines Satzes als Schlüssel zu speichern.

Im Grunde ist das Problem darauf beschränkt, herauszufinden, wie man jede mögliche Phrase aus einem ausreichend großen Text extrahiert. Das Zählen der Phrasen und dann die Sortierung nach der Anzahl der Vorkommen wird trivial.

    
TheOne 27.10.2013, 18:49
quelle

1 Antwort

8

Ich nehme an, dass Sie nach gemeinsamen Mustern aufeinander folgender Wörter suchen, die in derselben Reihenfolge erscheinen (zB würde "oben auf der Welt" nicht als dieselbe Phrase wie "Spitze einer Welt" oder "die Welt der Spitze" gezählt) ).

Wenn ja, würde ich den folgenden linearen Zeitansatz empfehlen:

  1. Teilen Sie Ihren Text in Wörter und entfernen Sie Dinge, die Sie nicht als signifikant betrachten (z. B. Groß- und Kleinschreibung, Satzzeichen, Wortumbrüche usw.).
  2. Konvertiere deinen Text in ein Array von ganzen Zahlen (eine ganze Zahl pro einmaligem Wort) (zB wird jede Instanz von "cat" 1, jeder "dog" wird 2) Dies kann in linearer Zeit unter Verwendung eines Hash-basierten Wörterbuchs geschehen um die Konvertierungen von Wörtern in Zahlen zu speichern. Wenn das Wort nicht im Wörterbuch ist, weisen Sie ihm eine neue ID zu.
  3. Konstruieren Sie ein Suffix-Array für das Array von ganzen Zahlen (dies ist eine sortierte Liste aller Suffixe Ihres Arrays und kann durch lineare Zeit konstruiert werden - zB mit dem Algorithmus und C-Code hier )
  4. Konstruieren Sie das längste gemeinsame Präfix-Array für Ihr Suffix-Array. (Dies kann auch in linearer Zeit erfolgen, zum Beispiel unter Verwendung dieses C-Codes ). Dieses LCP-Array gibt die Anzahl der gemeinsamen Werte an Wörter am Anfang jedes Suffix zwischen aufeinanderfolgenden Paaren im Suffix-Array.

Sie sind jetzt in der Lage, Ihre gebräuchlichen Sätze zu sammeln.

Es ist nicht ganz klar, wie Sie das Ende einer Phrase bestimmen wollen. Eine Möglichkeit besteht darin, einfach alle Sequenzen von 4 Wörtern, die sich wiederholen, zu sammeln.
Dies kann in linearer Zeit geschehen, indem Sie durch Ihr Suffix-Array gehen und auf Orte schauen, wo das längste gemeinsame Präfix-Array & gt; = 4 ist. Jeder Durchlauf von Indizes x im Bereich [start + 1 ... start + len] wo der LCP [x] & gt; = 4 (für alle außer dem letzten Wert von x) entspricht einer Phrase, die len mal wiederholt wird. Der Ausdruck selbst wird durch die ersten 4 Wörter gegeben, zum Beispiel Suffix start + 1.

Beachten Sie, dass dieser Ansatz möglicherweise Sätze erkennt, die Satzende überschreiten. Sie können es vorziehen, einige Interpunktionszeichen wie Vollpunktzahlen in eindeutige Ganzzahlen umzuwandeln, um dies zu verhindern.

    
Peter de Rivaz 27.10.2013, 19:55
quelle