Ich habe eine Reihe von Zeichenfolgen (Zeichensätze), die Sätze in verschiedenen Sprachen darstellen, sagen wir:
Hallo, mein Name ist George.
Das Brot ist gut.
... usw.
Ich möchte jedem von ihnen Punkte (von 0 .. 1) zuweisen, die die Wahrscheinlichkeit angeben, dass sie englische Sätze sind. Gibt es einen akzeptierten Algorithmus (oder eine Python-Bibliothek), um dies zu tun?
Hinweis: Es ist mir egal, ob die Grammatik des englischen Satzes perfekt ist.
Ein Bayesian Classifier wäre eine gute Wahl für diese Aufgabe:
%Vor%Ich weiß, dass die Antwort akzeptiert wurde, aber normalerweise wird die Sprachidentifikation mit Charakter-N-Gramm-Modellen durchgeführt, nicht mit Bag-of-Word-Modellen, wie Raymond es vorschlägt. Dies ist nicht das Gleiche wie die Verwendung von N-Gram-Merkmalen in einem Klassifizierer (tatsächlich wird die Verwendung eines Klassifizierers normalerweise nicht durchgeführt oder ist wirklich notwendig, zumindest nicht im herkömmlichen Sinne). Der Grund dafür ist, dass oft nur ein paar Zeichen ausreichen können, um die Sprache zu identifizieren, während Bag-of-words-basierte Klassifikatoren (und mehr Bag-of-Ngrams) die gleichen Wörter oder Phrasen benötigen, wie sie in gesehen wurden Ausbildung. Charakterbasierte Modelle dagegen können mit wenig Training und fast ohne Daten verwendet werden, um die Identifikation zu machen.
So funktioniert es. Wir betrachten einen String als eine Folge der enthaltenen Zeichen (einschließlich der Leerzeichen und Interpunktionszeichen). Wir bauen ein N-Gramm-Sprachmodell dieser Zeichenfolgen auf, wobei n = 3 ausreichend sein sollte, aber Sie werden mehr Genauigkeit mit n = 5 oder n = 6 erhalten (auf Kosten der richtigen Glättung, die oder möglicherweise nicht einfach je nachdem, wie Sie dies tun)! Nehmen wir an, wir haben ein Zeichen-N-Gramm-Modell mit n = 3 für zwei Sprachen, Französisch und Englisch. Unter diesem Modell ist die Wahrscheinlichkeit einer Zeichenfolge:
c = c_1, c_2 ... c_n
wobei jedes c_i ein Zeichen ist (einschließlich Leerzeichen, Interpunktion usw.) ist:
p (c) = p (c_1) * p (c_2 | c_1) * p (c_3 | c_2, c_1) ... p (c_n | c_n-1, c_n-2)
Nun, wenn wir Modelle für Französisch und Englisch haben, bedeutet dies, dass es für jede Sprache eine Reihe von Parametern für diese Verteilung gibt. Dies sind wirklich nur Tabellen, die die bedingten Wahrscheinlichkeiten von c_i (c_i-1, c_i-2) angeben, für die der Maximum-Likelihood-Schätzer einfach ist:
count (c_i-2, c_i-1, c) / count (c_i-2, c_i-1)
Obwohl die Maximum-Likelihood-Schätzung für die Sprachmodellierung aufgrund des Problems, 0 Wahrscheinlichkeiten zu erhalten, grundsätzlich nicht erfolgt, spielt die obige Likelihood-Funktion eine große Rolle in den Parameterschätzungen (sie wird nur geglättet werden müssen).
Wenn Sie also lediglich entscheiden, in welcher Sprache sich die Zeichenfolge c befindet, bewerten Sie die Wahrscheinlichkeit unter den Sprachmodellen, die Sie für die Sprachen gelernt haben, an denen Sie interessiert sind, und beurteilen Sie die Zeichenfolge vom Modell sein und ihm die höchste Wahrscheinlichkeit zuweisen (dies entspricht einem Bayes'schen Klassifikator mit einem einheitlichen Prior bei Klassen, dh Sprachen, wobei die angenommene Verteilung jedoch die eines N-Gramm-Modells ist, nicht a Naive Bayes / multinomial).
Es gibt eine Menge von Orten, die Sie über die Sprachmodellierung lesen können: Ein sehr gutes Tutorial finden Sie in Josh Goodmans Epos (obwohl es ein bisschen ist nicht mehr aktuell, die Ideen bleiben unverändert und sind mehr als ausreichend für Ihre Zwecke). Sie können sich die Wikipedia-Seite ansehen, in der Sie sehen, dass das Unigramm-Modell einer multinomialen Verteilung entspricht.
Und schließlich, wenn Sie nach einer Python-Implementierung von Sprachmodellen suchen, ist das wahrscheinlich am häufigsten verwendete NLTK .