Heim > Backend-Entwicklung > Python-Tutorial > So implementieren Sie eine Rechtschreibprüfung in 21 Zeilen Python-Code

So implementieren Sie eine Rechtschreibprüfung in 21 Zeilen Python-Code

高洛峰
Freigeben: 2017-03-19 14:34:28
Original
1710 Leute haben es durchsucht

Einführung

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.

Code

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)
Nach dem Login kopieren

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'
Nach dem Login kopieren

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.

Das Prinzip dahinter

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 Login kopieren

Nach dem Satz von Bayes kann die obige Formel in

argmaxc P(w|c) P(c) / P(w)
Nach dem Login kopieren

umgewandelt werden Im Folgenden wird die Bedeutung der obigen Formel vorgestellt:

  1. P(c|w) stellt die Wahrscheinlichkeit dar, dass Sie ursprünglich das Wort c eingeben wollten, als Sie das Wort w eingegeben haben.

  2. 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.

  3. P(c) stellt die Wahrscheinlichkeit dar, dass das Wort c in den Beispieldaten vorkommt.

  4. 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)
Nach dem Login kopieren

umgewandelt werden kann Alle unsere Codes basieren auf dieser Formel. Im Folgenden finden Sie eine Analyse der spezifischen Code-Implementierung

Code-Analyse

Verwenden Sie die Funktion „words()“, um Wörter in big.txt zu extrahieren

def words(text): return re.findall('[a-z]+', text.lower())
Nach dem Login kopieren

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ührung
def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model
NWORDS = train(words(file('big.txt').read()))
Nach dem Login kopieren

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)

Gleichzeitig kann es sein, dass es 0-fache Bearbeitungsabstände gibt Richtig geschrieben:
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)
Nach dem Login kopieren

Wir gehen davon aus, dass die Wahrscheinlichkeit von 1 Bearbeitungsabstand viel größer als 2 Mal ist und 0 Mal viel größer ist als 1 Bearbeitungsabstand. Als nächstes verwenden Sie die richtige Funktion, um zuerst das Wort auszuwählen der kleinste Bearbeitungsabstand und sein entsprechendes P(w|c) werden als Kandidatenwort größer sein, und wählen Sie dann das Wort mit dem größten P(c) als Rechtschreibvorschlag aus
def known_edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
Nach dem Login kopieren

def known(words):
    return set(w for w in words if w in NWORDS)
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage