国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現單詞拼寫檢查

2020-02-23 00:53:08
字體:
來源:轉載
供稿:網友

這幾天在翻舊代碼時發現以前寫的注釋部分有很多單詞拼寫錯誤,這些單詞錯得不算離譜,應該可以用工具自動糾錯絕大部分。用 Python 寫個拼寫檢查腳本很容易,如果能很好利用 aspell/ispell 這些現成的小工具就更簡單了。

要點

1、輸入一個拼寫錯誤的單詞,調用 aspell -a 后得到一些候選正確單詞,然后用距離編輯進一步嗮選出更精確的詞。比如運行 aspell -a,輸入 ‘hella' 后得到如下結果:
hell, Helli, hello, heal, Heall, he'll, hells, Heller, Ella, Hall, Hill, Hull, hall, heel, hill, hula, hull, Helga, Helsa, Bella, Della, Mella, Sella, fella, Halli, Hally, Hilly, Holli, Holly, hallo, hilly, holly, hullo, Hell's, hell's

2、什么是距離編輯(Edit-Distance,也叫 Levenshtein algorithm)呢?就是說給定一個單詞,通過多次插入、刪除、交換、替換單字符的操作后枚舉出所有可能的正確拼寫,比如輸入 ‘hella',經過多次插入、刪除、交換、替換單字符的操作后變成:
‘helkla', ‘hjlla', ‘hylla', ‘hellma', ‘khella', ‘iella', ‘helhla', ‘hellag', ‘hela', ‘vhella', ‘hhella', ‘hell', ‘heglla', ‘hvlla', ‘hellaa', ‘ghella', ‘hellar', ‘heslla', ‘lhella', ‘helpa', ‘hello', …

3、綜合上面2個集合的結果,并且考慮到一些理論知識可以提高拼寫檢查的準確度,比如一般來說寫錯單詞都是無意的或者誤打,完全錯的單詞可能性很小,而且單詞的第一個字母一般不會拼錯。所以可以在上面集合里去掉第一個字母不符合的單詞,比如:'Sella', ‘Mella', khella', ‘iella' 等,這里 VPSee 不刪除單詞,而把這些單詞從隊列里取出來放到隊列最后(優先級降低),所以實在匹配不了以 h 開頭的單詞才去匹配那些以其他字母開頭的單詞。

4、程序中用到了外部工具 aspell,如何在 Python 里捕捉外部程序的輸入和輸出以便在 Python 程序里處理這些輸入和輸出呢?Python 2.4 以后引入了 subprocess 模塊,可以用 subprocess.Popen 來處理。

5、Google 大牛 Peter Norvig 寫了一篇 How to Write a Spelling Corrector 很值得一看,大牛就是大牛,21行 Python 就解決拼寫問題,而且還不用外部工具,只需要事先讀入一個詞典文件。本文程序的 edits1 函數就是從牛人家那里 copy 的。

代碼

 

#!/usr/bin/python# A simple spell checkerimport os, sys, subprocess, signalalphabet = 'abcdefghijklmnopqrstuvwxyz'def found(word, args, cwd = None, shell = True):  child = subprocess.Popen(args,     shell = shell,     stdin = subprocess.PIPE,     stdout = subprocess.PIPE,     cwd = cwd,     universal_newlines = True)   child.stdout.readline()  (stdout, stderr) = child.communicate(word)  if ": " in stdout:    # remove /n/n    stdout = stdout.rstrip("/n")    # remove left part until :    left, candidates = stdout.split(": ", 1)     candidates = candidates.split(", ")    # making an error on the first letter of a word is less     # probable, so we remove those candidates and append them     # to the tail of queue, make them less priority    for item in candidates:      if item[0] != word[0]:         candidates.remove(item)        candidates.append(item)    return candidates  else:    return None# copy from http://norvig.com/spell-correct.htmldef edits1(word):  n = len(word)  return set([word[0:i]+word[i+1:] for i in range(n)] +               [word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] +    [word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] +    [word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet])def correct(word):  candidates1 = found(word, 'aspell -a')  if not candidates1:    print "no suggestion"    return   candidates2 = edits1(word)  candidates = []  for word in candidates1:    if word in candidates2:      candidates.append(word)  if not candidates:    print "suggestion: %s" % candidates1[0]  else:    print "suggestion: %s" % max(candidates)def signal_handler(signal, frame):  sys.exit(0)if __name__ == '__main__':  signal.signal(signal.SIGINT, signal_handler)  while True:    input = raw_input()    correct(input)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉峪关市| 南木林县| 奉节县| 邵阳市| 丰台区| 梁河县| 井研县| 堆龙德庆县| 自治县| 新民市| 绵竹市| 志丹县| 女性| 中超| 和顺县| 宽城| 泽州县| 汪清县| 英山县| 德阳市| 沁源县| 绍兴县| 中江县| 稻城县| 西藏| 兴仁县| 紫云| 广平县| 航空| 若尔盖县| 乌审旗| 定西市| 宣汉县| 东平县| 都安| 屏南县| 徐闻县| 上饶市| 常宁市| 德阳市| 石狮市|