2012-12-18 21 views
15

Ich bin ziemlich neu mit Python und NLTK. Ich bin beschäftigt mit einer Anwendung, die Rechtschreibprüfungen durchführen kann (ersetzt das falsch buchstabierte Wort durch das korrekt geschriebene Wort), Ich verwende derzeit die Enchant Library auf Python-2.7, PyEnchant und die NLTK-Bibliothek. Der folgende Code ist die Klasse, die die Korrektur/Ersetzung behandelt.Rechtschreibprüfung für Python

from nltk.metrics import edit_distance 

class SpellingReplacer(object): 
    def __init__(self, dict_name = 'en_GB', max_dist = 2): 
     self.spell_dict = enchant.Dict(dict_name) 
     self.max_dist = 2 

    def replace(self, word): 
     if self.spell_dict.check(word): 
      return word 
     suggestions = self.spell_dict.suggest(word) 

     if suggestions and edit_distance(word, suggestions[0]) <= self.max_dist: 
      return suggestions[0] 
     else: 
      return word 

Ich habe eine Funktion geschrieben, die in einer Liste von Wörtern nimmt und führt die def für jedes Wort ersetzen und eine Liste der Wörter zurück, aber richtig geschrieben sind.

def spell_check(word_list): 
    checked_list = [] 
    for item in word_list: 
     replacer = SpellingReplacer() 
     r = replacer.replace(item) 
     checked_list.append(r) 
    return checked_list 

>>> word_list = ['car', 'colour'] 
>>> spell_check(words) 
['car', 'color'] 

Jetzt mache ich so nicht wirklich, weil es nicht sehr genau ist, und ich bin auf der Suche nach einer Möglichkeit, die Rechtschreibung überprüft und Ersatzwort zu erreichen. Ich brauche auch etwas, das Rechtschreibfehler wie "caaaar" aufgreift? Gibt es bessere Möglichkeiten, Rechtschreibprüfungen durchzuführen? Wenn ja, was sind sie? Wie macht es Google zum Beispiel, weil die Rechtschreibhilfe sehr gut ist? Irgendwelche Vorschläge

Antwort

17

Ich würde empfehlen, indem Sie sorgfältig lesen this post by Peter Norvig. (Ich musste etwas ähnliches und ich fand es sehr nützlich.)

Die folgende Funktion, insbesondere hat die Ideen, die Sie jetzt brauchen, um Ihre Rechtschreibprüfung ausgefeilter zu machen: Aufteilen, Löschen, Transponieren und Einfügen der irregulären Wörter um sie zu "korrigieren".

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) 

Hinweis: Die oben ist ein Ausschnitt aus Norvig des Schreibkorrektur

Und die gute Nachricht ist, dass Sie schrittweise und halten hinzufügen können Sie Ihre Rechtschreibprüfung zu verbessern.

Hoffe, dass hilft.

0

Zauber corrector->

Sie benötigen auf Ihrem Desktop einen Korpus importieren auf, wenn Sie an anderer Stelle den Pfad in den Code speichern ändern ich ein paar Grafiken hinzugefügt haben auch tkinter verwenden und dies ist nur nicht Wort zu bekämpfen Fehler !!

def min_edit_dist(word1,word2): 
    len_1=len(word1) 
    len_2=len(word2) 
    x = [[0]*(len_2+1) for _ in range(len_1+1)]#the matrix whose last element ->edit distance 
    for i in range(0,len_1+1): 
     #initialization of base case values 
     x[i][0]=i 
     for j in range(0,len_2+1): 
      x[0][j]=j 
    for i in range (1,len_1+1): 
     for j in range(1,len_2+1): 
      if word1[i-1]==word2[j-1]: 
       x[i][j] = x[i-1][j-1] 
      else : 
       x[i][j]= min(x[i][j-1],x[i-1][j],x[i-1][j-1])+1 
    return x[i][j] 
from Tkinter import * 


def retrieve_text(): 
    global word1 
    word1=(app_entry.get()) 
    path="C:\Documents and Settings\Owner\Desktop\Dictionary.txt" 
    ffile=open(path,'r') 
    lines=ffile.readlines() 
    distance_list=[] 
    print "Suggestions coming right up count till 10" 
    for i in range(0,58109): 
     dist=min_edit_dist(word1,lines[i]) 
     distance_list.append(dist) 
    for j in range(0,58109): 
     if distance_list[j]<=2: 
      print lines[j] 
      print" " 
    ffile.close() 
if __name__ == "__main__": 
    app_win = Tk() 
    app_win.title("spell") 
    app_label = Label(app_win, text="Enter the incorrect word") 
    app_label.pack() 
    app_entry = Entry(app_win) 
    app_entry.pack() 
    app_button = Button(app_win, text="Get Suggestions", command=retrieve_text) 
    app_button.pack() 
    # Initialize GUI loop 
    app_win.mainloop() 
0

können Sie die in Python überprüfen zu buchstabieren autocorrect lib verwenden. Verwendung
Beispiel:

from autocorrect import spell 

print spell('caaaar') 
print spell(u'mussage') 
print spell(u'survice') 
print spell(u'hte') 

Ergebnis:

caesar 
message 
service 
the