import re, collections
# 把語料中的單詞全部抽取出來, 轉成小寫, 並且去除單詞中間的特殊符號
defwords
(text)
:return re.findall(
'[a-z]+'
, text.lower())
deftrain
(features)
:'''
要是遇到我們從來沒有過見過的新詞怎麼辦.
假如說乙個詞拼寫完全正確, 但是語料庫中沒有包含這個詞, 從而這個詞也永遠不會出現在訓練集中.
於是, 我們就要返回出現這個詞的概率是0. 這個情況不太妙, 因為概率為0這個代表了這個事件絕對不可能發生,
而在我們的概率模型中, 我們期望用乙個很小的概率來代表這種情況. lambda: 1
'''model = collections.defaultdict(
lambda:1
)for f in features:
model[f]+=1
return mo del
# 每個單詞在語料庫**現了多少次
nwords = train(words(
open
('big.txt'
).read())
)
alphabet =
'abcdefghijklmnopqrstuvwxyz'
# #返回所有與單詞 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
# 返回所有與單詞 w 編輯距離為 2 的集合.
# 在這些編輯距離小於2的詞中間, 只把那些正確的詞(在我的語料庫**現過的詞)作為候選詞
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)
# 如果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]
)
# correct('learw') # 'learn'
# correct('tess') # 'less'
correct(
'morw'
)# 'more'
nwords
defaultdict(
<
locals
>
.<
lambda
>()
>
,)
貝葉斯演算法
貝葉斯演算法需要解決的問題 1.正向概率 假設袋子中n白球,m黑球,摸到黑球概率多大 2.逆向概率 事先不知道袋子中黑白球個數,從袋子中摸出乙個或幾個球,觀察這些取出球的顏色,以此來推斷袋中白黑球的比例。為什麼需要貝葉斯 現實世界本身就是不確定的,假設黑白球數量無限大,人類觀察能力有限,我們不可能完...
貝葉斯演算法
總結應用 貝葉斯演算法的目的是解決逆向概率的問題。何為逆向概率?先看看正向概率 袋子裡有m個黑球,n個白球,隨手一模,是黑球的機率是多大。這就是個正向概率問題。逆向概率 袋子裡有兩種球,通過觀察摸出來的球的顏色,推斷袋子中兩種球的比率。逆向概率的作用 是通過有限的資料推斷無限資料的情況,思考 星系距...
貝葉斯演算法
貝葉斯為了解決 逆概 問題提出的 正向概率 袋子裡裝著n個黑球和m個白球,伸手取摸球,摸到黑球和白球的概率有多大 逆向概率 袋子裡前提不知道有黑白球的比例,而是閉著眼睛摸球統計後推測黑球和白球的比例 現實世界本身不確定,人類觀察是有侷限的 我們日常所觀察只是表面,很多東西都是推測。男生總是穿長褲,女...