Maison > développement back-end > Tutoriel Python > Comment implémenter un correcteur orthographique dans 21 lignes de code Python

Comment implémenter un correcteur orthographique dans 21 lignes de code Python

高洛峰
Libérer: 2017-03-19 14:34:28
original
1710 Les gens l'ont consulté

Introduction

Lorsque vous effectuez une recherche sur Google ou Baidu, Google peut toujours fournir une très bonne vérification orthographique lorsque vous saisissez le contenu de la recherche. Par exemple, si vous saisissez orthographe, Google le fera. renvoyez-le immédiatement orthographe.
Ce qui suit est un correcteur orthographique simple mais entièrement fonctionnel implémenté avec 21 lignes de code python.

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)
Copier après la connexion

La fonction correcte est le point d'entrée du programme, et les mots mal orthographiés transmis seront renvoyés correctement. Par exemple :

>>> correct("cpoy")
'copy'
>>> correct("engilsh")
'english'
>>> correct("sruprise")
'surprise'
Copier après la connexion

En plus de ce code, dans le cadre de l'apprentissage automatique, il doit certainement y avoir une grande quantité d'exemples de données, et big.txt est préparé comme exemple de données.

Le principe derrière cela

Le code ci-dessus est implémenté sur la base du bayésien. En fait, la vérification orthographique implémentée par Google Baidu est également implémentée via le bayésien, mais c'est nettement plus compliqué que cela.
Tout d’abord, présentons brièvement le principe qui se cache derrière cela. Si les lecteurs l’ont déjà compris, ils peuvent sauter ce paragraphe.
Étant donné un mot, nous essayons de sélectionner la suggestion orthographique correcte la plus probable (la suggestion peut également être le mot saisi). Parfois, cela n'est pas clair (par exemple, les retards doivent-ils être corrigés en retard ou en dernier ?), et nous utilisons la probabilité pour décider laquelle utiliser comme suggestion. Nous trouvons la suggestion orthographique c la plus probable parmi toutes les orthographes correctes possibles liées au mot original w :

argmaxc  P(c|w)
Copier après la connexion

Par le théorème de Bayes, la formule ci-dessus peut être transformée en

argmaxc P(w|c) P(c) / P(w)
Copier après la connexion

Ce qui suit présente la signification de la formule ci-dessus :

  1. P(c|w) représente la probabilité que vous vouliez à l'origine saisir le mot c lors de la saisie du mot w.

  2. P(w|c) représente la probabilité que l'utilisateur veuille saisir le mot c mais saisisse w, que nous pouvons considérer comme donnée.

  3. P(c) représente la probabilité que le mot c apparaisse dans les exemples de données

  4. P(w) représente l'occurrence du mot w dans le numéro d'échantillon La probabilité de
    peut être déterminée que P(w) a la même probabilité pour tous les mots possibles c, donc la formule ci-dessus peut être convertie en

argmaxc P(w|c) P(c)
Copier après la connexion

Tous nos codes sont basés sur cette formule, analysons l'implémentation spécifique du code

Analyse du code

Utilisez la fonction mots() pour extraire des mots dans big.txt

def words(text): return re.findall('[a-z]+', text.lower())
Copier après la connexion

re.findall( '[a-z]' utilise le module d'expression régulière python pour extraire tous les mots qui répondent à la condition '[a-z]', c'est-à-dire les mots composés de lettres. (Les expressions régulières ne seront pas présentées en détail ici. Intéressé les étudiants peuvent lire les expressions régulières. Introduction aux expressions. text.lower() convertit le texte en lettres minuscules, c'est-à-dire que « le » et « Le » sont tous deux définis comme le même mot. Utilisez la fonction train() pour calculer l'occurrence de. chaque mot, puis entraînez un modèle approprié

afin que NWORDS[w] représente le nombre de fois que le mot w apparaît dans l'échantillon. Que devons-nous faire si un mot n'apparaît pas dans notre échantillon. ? La méthode consiste à définir leurs heures sur 1 par défaut, ce qui est implémenté via le module collections et l'expression lambda. collections.defaultdict() crée un dictionnaire par défaut, et lambda : 1 définit chaque valeur de ce dictionnaire sur 1 par défaut (. Pour les expressions lambda, veuillez consulter l'introduction de Lambda
def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model
NWORDS = train(words(file('big.txt').read()))
Copier après la connexion

Maintenant que nous avons traité P(c) dans la formule

, nous allons ensuite traiter P(w|c), c'est-à-dire lorsque nous voulons saisir le mot c mais entrez par erreur le mot w Probabilité, mesurée par la « distance d'édition » - le nombre d'éditions nécessaires pour changer un mot en un autre. Une édition peut être une suppression, un échange (deux lettres adjacentes), une insertion et une modification. La fonction renvoie un ensemble de tous les mots possibles w qui peuvent être obtenus en éditant c une fois :

argmaxc P(w|c) P(c)

Les articles pertinents montrent que 80 à 95 % des fautes d'orthographe ne sont qu'à 1 distance d'édition du mot que vous souhaitez épeler. . , si vous pensez qu'une seule modification ne suffit pas, alors recommençons
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)
Copier après la connexion

En même temps, il peut y avoir des distances de modification de 0 fois qui sont correctement orthographiées :
def known_edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
Copier après la connexion

Nous supposons que la distance d'édition La probabilité de 1 fois est bien supérieure à celle de 2 fois, et la probabilité de 0 fois est bien supérieure à 1 fois. Ensuite, utilisez la fonction correcte pour sélectionner d'abord le mot avec le plus petit. modifiez la distance, et son P(w|c) correspondant sera plus grand, puis utilisez-le comme mot candidat Sélectionnez le mot avec le plus grand P(c) comme suggestion orthographique
def known(words):
    return set(w for w in words if w in NWORDS)
Copier après la connexion

.
def correct(word):
    candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
    return max(candidates, key=NWORDS.get
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal