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.
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.
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.
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%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
Tags und Links sql algorithm r artificial-intelligence pattern-recognition