一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 21行Python代碼實現拼寫檢查器

21行Python代碼實現拼寫檢查器

2020-08-10 10:01lxydo Python

21行python代碼實現的一個簡易但是具備完整功能的拼寫檢查器,感興趣的小伙伴們可以參考一下

引入

大家在使用谷歌或者百度搜索時,輸入搜索內容時,谷歌總是能提供非常好的拼寫檢查,比如你輸入 speling,谷歌會馬上返回 spelling。
下面是用21行python代碼實現的一個簡易但是具備完整功能的拼寫檢查器

代碼

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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)
correct函數是程序的入口,傳進去錯誤拼寫的單詞會返回正確。如:
 
>>> correct("cpoy")
'copy'
>>> correct("engilsh")
'english'
>>> correct("sruprise")
'surprise'

除了這段代碼外,作為機器學習的一部分,肯定還應該有大量的樣本數據,準備了big.txt作為我們的樣本數據。

背后原理

上面的代碼是基于貝葉斯來實現的,事實上谷歌百度實現的拼寫檢查也是通過貝葉斯實現,不過肯定比這個復雜多了。
首先簡單介紹一下背后的原理,如果讀者之前了解過了,可以跳過這段。
給一個詞,我們試圖選取一個最可能的正確的的拼寫建議(建議也可能就是輸入的單詞)。有時也不清楚(比如lates應該被更正為late或者latest?),我們用概率決定把哪一個作為建議。我們從跟原始詞w相關的所有可能的正確拼寫中找到可能性最大的那個拼寫建議c:

?
1
argmaxc P(c|w)

通過貝葉斯定理,上式可以轉化為

?
1
argmaxc P(w|c) P(c) / P(w)

下面介紹一下上式中的含義:

  • P(c|w)代表在輸入單詞w 的情況下,你本來想輸入 單詞c的概率。
  • P(w|c)代表用戶想輸入單詞c卻輸入w的概率,這個可以我們認為給定的。
  • P(c)代表在樣本數據中單詞c出現的概率
  • P(w)代表在樣本數字中單詞w出現的概率

可以確定P(w)對于所有可能的單詞c概率都是一樣的,所以上式可以轉換為
argmaxc P(w|c) P(c)
我們所有的代碼都是基于這個公式來的,下面分析具體代碼實現

代碼分析

利用words()函數提取big.txt中的單詞

?
1
def words(text): return re.findall('[a-z]+', text.lower())

re.findall(‘[a-z]+'是利用python正則表達式模塊,提取所有的符合'[a-z]+'條件的,也就是由字母組成的單詞。(這里不詳細介紹正則表達式了,有興趣的同學可以看 正則表達式簡介。text.lower()是將文本轉化為小寫字母,也就是“the”和“The”一樣定義為同一個單詞。

利用train()函數計算每個單詞出現的次數然后訓練出一個合適的模型

?
1
2
3
4
5
6
def train(features):
  model = collections.defaultdict(lambda: 1)
  for f in features:
    model[f] += 1
  return model
NWORDS = train(words(file('big.txt').read()))

這樣NWORDS[w]代表了單詞w在樣本中出現的次數。如果有一個單詞并沒有出現在我們的樣本中該怎么辦?處理方法是將他們的次數默認設為1,這里通過collections模塊和lambda表達式實現。collections.defaultdict()創建了一個默認的字典,lambda:1將這個字典中的每個值都默認設為1。

現在我們處理完了公式argmaxc P(w|c) P(c)中的P(c),接下來處理P(w|c)即想輸入單詞c卻錯誤地輸入單詞w的概率,通過 “edit distance“--將一個單詞變為另一個單詞所需要的編輯次數來衡量,一次edit可能是一次刪除,一個交換(兩個相鄰的字母),一次插入,一次修改。下面的函數返回一個將c進行一次編輯所有可能得到的單詞w的集合:

?
1
2
3
4
5
6
7
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)

相關論文顯示,80-95%的拼寫錯誤跟想要拼寫的單詞都只有1個編輯距離,如果覺得一次編輯不夠,那我們再來一次

?
1
2
def known_edits2(word):
  return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

同時還可能有編輯距離為0次的即本身就拼寫正確的:

?
1
2
def known(words):
  return set(w for w in words if w in NWORDS)

我們假設編輯距離1次的概率遠大于2次的,0次的遠大于1次的。下面通過correct函數先選擇編輯距離最小的單詞,其對應的P(w|c)就會越大,作為候選單詞,再選擇P(c)最大的那個單詞作為拼寫建議

?
1
2
3
def correct(word):
  candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
  return max(candidates, key=NWORDS.get)

以上就是本文的全部內容,希望對大家學習python程序設計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲 欧美 日韩 国产 视频 | 99精品国产成人a∨免费看 | 婷婷日日夜夜 | 亚洲激情视频在线 | 青草热久精品视频在线观看 | 加勒比京东热 | 国产精品全国探花在线观看 | xxx中国bbbwww| 久久精品视在线观看2 | 午夜电影三级还珠格格 | 色天天综合色天天看 | 韩国理论片最新第一页 | 从后面撕开老师的丝袜动态图 | 精品国产福利片在线观看 | 操比视频 | 四虎在线免费 | 日韩一级片在线免费观看 | 国产一卡2卡3卡4卡公司科普 | 欧美涩区 | 成人免费高清视频 | free chinese麻豆 | 久久精品国产欧美日韩99热 | 日本一道本视频 | 精品小视频在线 | 好大好硬抽搐好爽想要 | 色综合91久久精品中文字幕 | 无遮挡免费h肉动漫在线观看 | 99任你躁精品视频 | 免费看男人使劲躁女人小说 | sxx免费看观看美女 sss亚洲国产欧美一区二区 | 91精品啪在线观看国产91九色 | 国产成人福利免费观看 | 欧美一级xxx | 国产一久久香蕉国产线看观看 | 国产视频一区二区 | 色狠狠成人综合网 | 日本三级欧美三级人妇英文 | 天天狠天天透天干天天怕处 | 视频大全在线观看网址 | 欧美日韩亚洲一区二区三区在线观看 | 翁息肉小说老扒 |