Welchen Algorithmus kann ich verwenden, um gemeinsame Wörter / Mustererkennung zu finden?

7

Ich habe eine große Tabelle in meiner Datenbank mit vielen Wörtern aus verschiedenen Texten in der Reihenfolge. Ich möchte die Anzahl der Male / Häufigkeit finden, die einige Wörter zusammen erscheinen.

Beispiel : Angenommen, ich habe diese 4 Wörter in vielen Texten: United | States | of | America . Ich werde als Ergebnis erhalten:

USA : 50
Vereinigte Staaten von Amerika : 45
Vereinigte Staaten von Amerika : 40

(Dies ist nur ein Beispiel mit 4 Wörtern, aber kann es mit weniger und mehr als 4 geben.)

Gibt es einen Algorithmus, der dies oder Ähnliches tun kann?

Bearbeiten: Einige R- oder SQL-Codes, die zeigen, wie es geht, sind willkommen. Ich brauche ein praktisches Beispiel dafür, was ich tun muss.

Tabellenstruktur

Ich habe zwei Tabellen: Token , die id und text haben. Der Text ist UNIQUE und jeder Eintrag in dieser Tabelle stellt ein anderes Wort dar.

TextBlockHasToken ist die Tabelle, die die Textreihenfolge beibehält. Jede Zeile repräsentiert ein Wort in einem Text.

Es hat textblockid , das ist der Block des Textes, zu dem der Token gehört. sentence ist der Satz des Tokens, position ist die Token-Position innerhalb des Satzes und tokenid ist die Token-Tabellenreferenz.

    
Renato Dinhani 09.11.2011, 18:10
quelle

4 Antworten

14

Es wird ein N-Gramm genannt; in deinem Fall ein 4-Gramm. Es kann tatsächlich als Nebenprodukt einer Markov-Kette erhalten werden, aber Sie könnten auch ein gleitendes Fenster (Größe 4) verwenden, um durch den (linearen) Text zu gehen, während Sie ein 4-dimensionales "Histogramm" aktualisieren.

UPDATE 2011-11-22: Eine Markov-Kette ist eine Möglichkeit, die Wahrscheinlichkeit für einen Wechsel in einen neuen Zustand zu modellieren, wenn der aktuelle Zustand vorliegt. Dies ist das stochastische Äquivalent einer "Zustandsmaschine". Im Fall der natürlichen Sprache wird der "Zustand" durch die "vorhergehenden N Wörter" gebildet, was impliziert, dass Sie die vorherige Wahrscheinlichkeit (vor den vorherigen N Wörtern) als gleich_ein_ein betrachten. Computerleute werden höchstwahrscheinlich einen Baum zur Implementierung von Markov-Ketten im NLP-Fall verwenden. Der "Zustand" ist einfach der Pfad, der von der Wurzel zu dem aktuellen Knoten genommen wird, und die Wahrscheinlichkeiten der Wörter_zu_folgen sind die Wahrscheinlichkeiten der Nachkommen des aktuellen Knotens. Aber jedes Mal, wenn wir einen neuen Kindknoten wählen, verschieben wir den Baum nach unten und "vergessen" den Wurzelknoten. Das Fenster ist nur N Wörter breit, was in N Ebenen tief in den Baum übersetzt.

Sie können leicht erkennen, dass, wenn Sie eine Markov-Kette / einen Baum wie diese gehen, zu jeder Zeit die Wahrscheinlichkeit vor dem ersten Wort 1 ist, die Wahrscheinlichkeit nach dem ersten Wort P (w1) ist, nach dem zweiten Wort = P (w2) || w1 usw. Wenn Sie also den Korpus bearbeiten, erstellen Sie einen Markov-Baum (: = aktualisieren Sie die Frequenzen in den Knoten), am Ende der Fahrt können Sie die Wahrscheinlichkeit einer gegebenen Wortwahl durch freq (Wort) / SUM schätzen (Freq (Geschwister)). Für ein Wort 5-tief in den Baum ist dies die Wahrscheinlichkeit des Wortes, gegeben die vorherigen 4 Wörter . Wenn Sie die N-Gramm-Wahrscheinlichkeiten haben möchten, möchten Sie das Produkt aller Wahrscheinlichkeiten im Pfad vom Stamm bis zum letzten Wort.

    
wildplasser 09.11.2011, 18:23
quelle
4

Dies ist ein typischer Anwendungsfall für Markov-Ketten. Schätzen Sie das Markov-Modell aus Ihrer Textdatenbank und finden Sie hohe Wahrscheinlichkeiten in der Übergangstabelle. Da diese Wahrscheinlichkeiten angeben, dass ein Wort einem anderen folgt, werden Sätze als hohe Übergangswahrscheinlichkeiten angezeigt.

Durch Zählen der Anzahl der Male, die das Phrase-Startwort in den Texten angezeigt wurde, können Sie auch absolute Zahlen ableiten.

    
thiton 09.11.2011 18:14
quelle
2

Hier ist ein kleines Snippet, das alle Kombinationen / Nigramme eines Textes für einen gegebenen Satz von Wörtern berechnet. Um für größere Datenmengen zu arbeiten, verwendet es die Hash-Bibliothek, obwohl es wahrscheinlich immer noch ziemlich langsam ist ...

%Vor%

Also die folgende Eingabe ...

%Vor%

... würde zu folgendem Hash führen:

%Vor%

Beachten Sie, dass bei dieser Funktion die Groß- / Kleinschreibung nicht beachtet wird und dass die Zielwörter permutiert werden, z. B .:

%Vor%

... ergibt:

%Vor%     
Rasmus Bååth 21.11.2011 11:09
quelle
1

Ich bin mir nicht sicher, ob es eine Hilfe für Sie ist, aber hier ist ein kleines Python-Programm, das ich vor etwa einem Jahr geschrieben habe, das N-Gramme zählt (naja, nur Mono-, Bi- und Trigramme). (Er berechnet auch die Entropie jedes N-Gramms). Ich habe es benutzt, um diese N-Gramme in einem großen Text zu zählen. Link

    
TeaOverflow 16.11.2011 19:52
quelle