貝葉斯單詞拼寫檢查器

2021-10-08 06:20:25 字數 3832 閱讀 4105

記錄一下簡單的單詞拼寫檢查器,達到能對錯誤單詞進行簡單的修正的目的。

要是遇到我們從來沒有過見過的新詞怎麼辦. 假如說乙個詞拼寫完全正確, 但是語料庫中沒有包含這個詞, 從而這個詞也永遠不會出現在訓練集中. 於是, 我們就要返回出現這個詞的概率是0. 這個情況不太妙, 因為概率為0這個代表了這個事件絕對不可能發生, 而在我們的概率模型中, 我們期望用乙個很小的概率來代表這種情況. lambda: 1

# 把語料中的單詞全部抽取出來, 轉成小寫, 並且去除單詞中間的特殊符號

defwords

(text)

:return re.findall(

'[a-z]+'

, text.lower())

deftrain

(features)

: model = collections.defaultdict(

lambda:1

)for f in features:

model[f]+=1

return model

nwords = train(words(

open

('big.txt'

).read())

)

此時打nwords,會顯示所有單詞出現的次數。

兩個詞之間的編輯距離定義為使用了幾次插入(在詞中插入乙個單字母), 刪除(刪除乙個單字母), 交換(交換相鄰兩個字母), 替換(把乙個字母換成另乙個)的操作從乙個詞變到另乙個詞.

#返回所有與單詞 w 編輯距離為 1 的集合

defedits1

(word)

: n =

len(word)

return

set(

[word[

0:i]

+word[i+1:

]for i in

range

(n)]

+# deletion

[word[

0:i]

+word[i+1]

+word[i]

+word[i+2:

]for i in

range

(n-1)]

+# transposition

[word[

0:i]

+c+word[i+1:

]for i in

range

(n)for c in alphabet]

+# alteration

[word[

0:i]

+c+word[i:

]for i in

range

(n+1

)for c in alphabet]

)# insertion

與 something 編輯距離為2的單詞居然達到了 114,324 個

優化:在這些編輯距離小於2的詞中間, 只把那些正確的詞作為候選詞,只能返回 3 個單詞: 『smoothing』, 『something』 和 『soothing』

#返回所有與單詞 w 編輯距離為 2 的集合

#在這些編輯距離小於2的詞中間, 只把那些正確的詞作為候選詞

defedits2

(word)

:return

set(e2 for e1 in edits1(word)

for e2 in edits1(e1)

)

正常來說把乙個母音拼成另乙個的概率要大於子音 (因為人常常把 hello 打成 hallo 這樣); 把單詞的第乙個字母拼錯的概率會相對小, 等等.但是為了簡單起見, 選擇了乙個簡單的方法: 編輯距離為1的正確單詞比編輯距離為2的優先順序高, 而編輯距離為0的正確單詞優先順序比編輯距離為1的高.

def

known

(words)

:return

set(w for w in words if w in nwords)

#如果known(set)非空, candidate 就會選取這個集合, 而不繼續計算後面的

defcorrect

(word)

: candidates = known(

[word]

)or known(edits1(word)

)or known_edits2(word)

or[word]

return

max(candidates, key=

lambda w: nwords[w]

)

測試**:

import re, collections

defwords

(text)

:return re.findall(

'[a-z]+'

, text.lower())

deftrain

(features)

: model = collections.defaultdict(

lambda:1

)for f in features:

model[f]+=1

return model

nwords = train(words(

open

('big.txt'

).read())

)alphabet =

'abcdefghijklmnopqrstuvwxyz'

defedits1

(word)

: n =

len(word)

return

set(

[word[

0:i]

+word[i+1:

]for i in

range

(n)]

+# deletion

[word[

0:i]

+word[i+1]

+word[i]

+word[i+2:

]for i in

range

(n-1)]

+# transposition

[word[

0:i]

+c+word[i+1:

]for i in

range

(n)for c in alphabet]

+# alteration

[word[

0:i]

+c+word[i:

]for i in

range

(n+1

)for c in alphabet]

)# insertion

defknown_edits2

(word)

:return

set(e2 for e1 in edits1(word)

for e2 in edits1(e1)

if e2 in nwords)

defknown

(words)

:return

set(w for w in words if w in nwords)

defcorrect

(word)

: candidates = known(

[word]

)or known(edits1(word)

)or known_edits2(word)

or[word]

return

max(candidates, key=

lambda w: nwords[w]

)correct(

'knon'

)

貝葉斯拼寫檢查器

要是遇到我們從來沒有過見過的新詞怎麼辦.假如說乙個詞拼寫完全正確,但是語料庫中沒有包含這個詞,從而這個詞也永遠不會出現在訓練集中.於是,我們就要返回出現這個詞的概率是0.這個情況不太妙,因為概率為0這個代表了這個事件絕對不可能發生,而在我們的概率模型中,我們期望用乙個很小的概率來代表這種情況.lam...

貝葉斯拼寫檢查器

p w c 在使用者想鍵入 c 的情況下敲成 w 的概率.因為這個是代表使用者會以多大的概率把 c 敲錯成 w argmaxc,用來列舉所有可能的 c 並且選取概率最大的 import re,collections 把語料中的單詞全部抽取出來,轉成小寫,並且去除單詞中間的特殊符號 詞頻統計,並把最少...

貝葉斯拼寫檢查器

本拼寫檢查器是基於樸素貝葉斯的基礎來寫的,貝葉斯公式以及原理就不在詳述。直接上 import re,collections defwords text return re.findall a z text.lower deftrain features model collections.defau...