Wenn Sie bei Google oder Baidu suchen, kann Google bei der Eingabe von Suchinhalten immer eine sehr gute Rechtschreibprüfung durchführen. Wenn Sie beispielsweise Rechtschreibung eingeben, gibt Google diese zurück sofort. Rechtschreibung.
Das Folgende ist eine einfache, aber voll funktionsfähige Rechtschreibprüfung, die mit 21 Zeilen Python-Code implementiert ist.
import re, collections def words(text): return re.findall('[a-z]+', text.lower()) def train(features): model = collections.defaultdict(lambda: 1) for f in features: model[f] += 1 return model NWORDS = train(words(file('big.txt').read())) alphabet = 'abcdefghijklmnopqrstuvwxyz' def edits1(word): splits = [(word[:i], word[i:]) for i in range(len(word) + 1)] deletes = [a + b[1:] for a, b in splits if b] transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1] replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b] inserts = [a + c + b for a, b in splits for c in alphabet] return set(deletes + transposes + replaces + inserts) def known_edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS) def known(words): return set(w for w in words if w in NWORDS) def correct(word): candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word] return max(candidates, key=NWORDS.get)
Die richtige Funktion ist der Einstiegspunkt des Programms, und falsch geschriebene eingegebene Wörter werden korrekt zurückgegeben. Zum Beispiel:
>>> correct("cpoy") 'copy' >>> correct("engilsh") 'english' >>> correct("sruprise") 'surprise'
Zusätzlich zu diesem Code sollte im Rahmen des maschinellen Lernens auf jeden Fall eine große Menge an Beispieldaten vorhanden sein, und big.txt wird als unsere Beispieldaten vorbereitet.
Der obige Code basiert auf Bayesian. Tatsächlich wird die von Google Baidu implementierte Rechtschreibprüfung auch über Bayesian implementiert, ist aber definitiv komplizierter.
Lassen Sie uns zunächst kurz das Prinzip dahinter vorstellen. Wenn die Leser es bereits verstanden haben, können sie diesen Abschnitt überspringen.
Anhand eines Wortes versuchen wir, den wahrscheinlichsten korrekten Schreibvorschlag auszuwählen (der Vorschlag kann auch das eingegebene Wort sein). Manchmal ist es nicht klar (sollten beispielsweise „Spätangaben“ auf „Spät“ oder „Späteste“ korrigiert werden?), und wir entscheiden anhand der Wahrscheinlichkeit, welche Angabe wir als Vorschlag verwenden. Wir finden den wahrscheinlichsten Schreibvorschlag c aus allen möglichen korrekten Schreibweisen im Zusammenhang mit dem ursprünglichen Wort w:
argmaxc P(c|w)
Nach dem Satz von Bayes kann die obige Formel in
argmaxc P(w|c) P(c) / P(w)
umgewandelt werden Im Folgenden wird die Bedeutung der obigen Formel vorgestellt:
P(c|w) stellt die Wahrscheinlichkeit dar, dass Sie ursprünglich das Wort c eingeben wollten, als Sie das Wort w eingegeben haben.
P(w|c) stellt die Wahrscheinlichkeit dar, dass der Benutzer das Wort c eingeben möchte, aber w eingibt, was wir als gegeben betrachten können.
P(c) stellt die Wahrscheinlichkeit dar, dass das Wort c in den Beispieldaten vorkommt.
P(w) stellt das Auftreten des Wortes w in dar Die Beispielnummer Die Wahrscheinlichkeit von
kann bestimmt werden, dass P(w) für alle möglichen Wörter c die gleiche Wahrscheinlichkeit hat, sodass die obige Formel in
argmaxc P(w|c) P(c)
umgewandelt werden kann Alle unsere Codes basieren auf dieser Formel. Im Folgenden finden Sie eine Analyse der spezifischen Code-Implementierung
Verwenden Sie die Funktion „words()“, um Wörter in big.txt zu extrahieren
def words(text): return re.findall('[a-z]+', text.lower())
re.findall( '[a-z]+' verwendet das Python-Modul für reguläre Ausdrücke, um alle Wörter zu extrahieren, die die Bedingung '[a-z]+' erfüllen, d. h. Wörter, die aus Buchstaben bestehen. (Ich werde keine regulären Wörter einführen Ausdrücke im Detail finden Sie hier. Siehe Einführung in reguläre Ausdrücke, d. h. „the“ und „The“ werden mit der Funktion „The“ als dasselbe Wort definiert Anzahl der Vorkommen und trainieren Sie dann ein geeignetes Modell
, sodass NWORDS[w] die Häufigkeit darstellt, mit der das Wort w in der Stichprobe vorkommt. Was sollen wir tun, wenn ein Wort nicht in unserer Stichprobe vorkommt? ? Die Verarbeitungsmethode besteht darin, ihre Zeiten standardmäßig auf 1 zu setzen, was über das Collections-Modul implementiert wird und der Lambda-Ausdruck Collections.defaultdict() ein Standardwörterbuch erstellt, und Lambda: 1 setzt jeden Wert in diesem Wörterbuch standardmäßig auf 1. 1. (Für Lambda-Ausdrücke siehe Lambda-Einführungdef train(features): model = collections.defaultdict(lambda: 1) for f in features: model[f] += 1 return model NWORDS = train(words(file('big.txt').read()))
Jetzt haben wir P(c) in der Formel verarbeitet
, und dann werden wir P(w|c) verarbeiten, das heißt, wir wollen Geben Sie das Wort c ein, aber geben Sie das Wort falsch ein. Die Wahrscheinlichkeit von w wird anhand der „Bearbeitungsentfernung“ gemessen – der Anzahl der Bearbeitungen, die erforderlich sind, um ein Wort in ein anderes zu ändern. Eine Bearbeitung kann eine Löschung oder ein Austausch (zwei benachbarte Buchstaben) sein. eine Einfügung und eine Modifikation ein Wort, das Sie buchstabieren möchten. Wenn Sie das Gefühl haben, dass eine Bearbeitung nicht ausreicht, dann machen wir es noch einmal.argmaxc P(w|c) P(c)
def edits1(word): splits = [(word[:i], word[i:]) for i in range(len(word) + 1)] deletes = [a + b[1:] for a, b in splits if b] transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1] replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b] inserts = [a + c + b for a, b in splits for c in alphabet] return set(deletes + transposes + replaces + inserts)
def known_edits2(word): return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
def known(words): return set(w for w in words if w in NWORDS)
Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine Rechtschreibprüfung in 21 Zeilen Python-Code. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!