2012-12-18 26 views
15

Sono abbastanza nuovo con Python e NLTK. Sono occupato con un'applicazione che può eseguire controlli ortografici (sostituisce la parola digitata in modo errato con la parola ortograficamente corretta), Im attualmente utilizza la libreria Enchant su Python-2.7, PyEnchant e la libreria NLTK. Il codice seguente è la classe che gestisce la correzione/sostituzione.Correttore ortografico per 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 

Ho scritto una funzione che prende in un elenco di parole ed esegue il DEF sostituire su ogni parola e restituire una lista delle parole, ma digitato correttamente.

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'] 

ora non piace molto questo, perché non è molto accurato e sto cercando un modo per ottenere controlli di ortografia e sostituzioni di parole. Ho anche bisogno di qualcosa che possa raccogliere errori di ortografia come "caaaar"? Ci sono modi migliori per eseguire controlli ortografici là fuori? Se sì, quali sono? Come fa Google, ad esempio perché il loro suggeritore di spelling è molto buono? Qualsiasi suggerimento

risposta

17

Si consiglia di iniziare leggendo attentamente this post by Peter Norvig. (Ho dovuto fare qualcosa di simile e l'ho trovato estremamente utile.)

La seguente funzione, in particolare, ha le idee che ora è necessario per rendere più sofisticato il correttore ortografico: suddivisione, eliminazione, trasposizione e inserimento delle parole irregolari per "correggerli".

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) 

Nota: È possibile che questo è uno frammento di ortografia correttore di Norvig

E la buona notizia è che è possibile in modo incrementale aggiungere e continuare a migliorare il tuo correttore ortografico.

Spero che questo aiuti.

0

incantesimo corrector->

è necessario importare un corpus sul tuo computer se si memorizza altrove modifica il percorso nel codice ho aggiunto un paio di grafica e usando Tkinter e questo è solo per affrontare non parola errori!!

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

È possibile utilizzare il lib autocorrect per eseguire il controllo ortografico in python.
Esempio di utilizzo:

from autocorrect import spell 

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

Risultato:

caesar 
message 
service 
the 
Problemi correlati