用貝葉斯實現拼寫檢查器

2022-08-11 19:15:14 字數 2854 閱讀 3922

1、貝葉斯公式

p(a|d)=p(a)*p(d|a)/p(d);

可以應用於垃圾郵件的過濾和拼寫檢查

例如:對於拼寫檢查,寫出乙個單詞d,判斷該單詞為正確單詞a的概率。為上述條件概率的描述。

其中p(a)為先驗概率,可以根據現有的資料庫中的單詞,來獲得a單詞的概率p(a)。由於正確的單詞不僅僅有a,還有可能有a1,a2....

最終比較p(a1|d),p(a2|d),p(a3|d)...由於分母比較時相同,可以只比較分子p(a)*p(d|a)

p(a|d)正比於p(a)*p(d|a)

分別計算p(a1)*p(d|a1),p(a2)*p(d2|a)。其中p(d|a),例如在寫a=good,錯寫為d=gooe是的概率。是根據增刪減距離獲得。

若 p(a1)*p(d|a1)=p(a2)*p(d2|a),則根據實際生活中先驗概率的選擇p(a1),p(a2)大小選擇。

2、re和正規表示式的關係

1)re模組提供了對正規表示式的支援。

正規表示式式可匹配文字片段的模式

2)正規表示式

目的:通過匹配可以在文字查詢,將特定的模式進行替換,將文字分割成片段。

正規表示式的表示形式:

a、最簡單的正規表示式為普通字串  『python』

b、萬用字元.-- 通過特殊字串進行建立,可以將其表示為任意乙個字元

『.ython』  可以匹配 『uthon』,....

c、當字串本身含有特殊字元,利用兩個\\進行轉義。『python.org』可以用『python\\.org』表示

d、字符集[a-za-z0-9]只能將其作為乙個字元使用

『[pj]thon』與python 或jthon匹配但是不與『pjthon'使用。

注意例1 text='good morning! today we will go to the park,please be quiet!'

re.findall('[a-z]+',text.lower()) 文中的子串為均為a-z表示的單詞返回列表

['good','morning','today','we', 'will', 'go','to','the', 'park','please', 'be', 'quiet']

例2『[python]』只能匹配『p』,'y'....

['python']只能匹配『python』

print(known(['will'])) 

輸出

3、re模組中使用的函式

re常用的重要函式

findall(pattern,string)         返回乙個列表。其中包含字串中所有與模式匹配的子串

sub(pat,rel,string[,count=0])     將字串中與模式pat匹配的子串都替換為repl

split(pattern,string[,maxsplit=0]) 根據模式來分割字串

match(pattern,string[,flags])    在字串開頭匹配模式

search(pattern,string[,flags])    在字串中查詢模式

compile(pattern[ ,flags])        用字串表示的正規表示式轉換為模式物件

import

re,collections

#清除特殊符號

def words(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()))

alphabelt='

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 alphabelt]+ #

alteration

[word[0:i]+c+word[i:] for i in range(n+1)for c in alphabelt]) #

insertion

defedits2(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)

defcorrect(word):

candidates=known([word])or known(edits1(word)or edits2(word)or

[word])

return max(candidates,key=lambda w:nwords[w])

print(correct('goode'))

good

貝葉斯實現拼寫檢查器

貝葉斯實現拼寫檢查器 import re,collections def words text return re.findall a z text.lower def train features model collections.defaultdict lambda 1 for f in fe...

貝葉斯拼寫檢查器

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

貝葉斯拼寫檢查器

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