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.
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)
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'
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 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)
Par le théorème de Bayes, la formule ci-dessus peut être transformée en
argmaxc P(w|c) P(c) / P(w)
Ce qui suit présente la signification de la formule ci-dessus :
P(c|w) représente la probabilité que vous vouliez à l'origine saisir le mot c lors de la saisie du mot w.
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.
P(c) représente la probabilité que le mot c apparaisse dans les exemples de données
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)
Tous nos codes sont basés sur cette formule, analysons l'implémentation spécifique du code
Utilisez la fonction mots() pour extraire des mots dans big.txt
def words(text): return re.findall('[a-z]+', text.lower())
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 Lambdadef train(features): model = collections.defaultdict(lambda: 1) for f in features: model[f] += 1 return model NWORDS = train(words(file('big.txt').read()))
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)
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)
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)
def correct(word): candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word] return max(candidates, key=NWORDS.get
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!