我們需要有乙個詞典,裡面記錄每個詞的頻次,比如:
基於這個詞典,我們可以將一句話用乙個有向無環圖(dag)的表示出來,比如
這個圖裡面,每個節點是乙個字,邊為兩點構成詞的概率。分詞的問題,就是找出這個dag裡面概率和最大的一條從開始到結束覆蓋所有字的路徑。比如,辣-》菜,五-》肉,蓋-》飯是一條路徑,辣-》辣,白-》菜,五-》花,肉-》肉,蓋-》飯也是一條路徑,如何找到最大的那條呢?
設\(\alpha_i\)為dag中以i節點開始之後的部分的最優路徑的累計概率,j為i的鄰接點,那麼容易的出\(\alpha_i = max_jp(w(i,j))\alpha_\),w(i,j)是句子中i開始j結束的詞。
這是乙個動態規劃問題,從最後乙個字開始,基於以前的計算結果,逐步向前推移,直到第乙個點,然後再從前往後得到最優路徑。
python**如下:
defbuild_dag(sentence):
dag = {} #
dict,key是每個word的index,value是以這個字開始能夠構成的詞list
n =len(sentence)
for k in
xrange(n):
tmp =
i =k
piece =sentence[k]
while i < n and piece in
dict.freq:
ifdict.freq[piece]:
i += 1piece = sentence[k:i + 1]
ifnot
tmp:
dag[k] =tmp
return dag
defcalc_route(sentence, dag, route):
n =len(sentence)
route[n] =(0, 0)
logtotal =log(total_freq)
for idx in xrange(n - 1, -1, -1):
route[idx] = max((log(dict.freq.get(sentence[idx:x + 1]) or 1) -logtotal + route[x + 1][0], x) for x in dag[idx])
def__cut_dag
(self, sentence):
dag =build_dag(sentence)
route ={}
calc_route(dag, route)
x =0
n =len(sentence)
segs =
while x
y = route[x][1] + 1word =sentence[x,y]
x = y
最大概率分詞法
extern cstring separator extern int maxwordlength extern long corpussize cmydictionary pdict 定義乙個詞典類物件,全域性變數 以下是最大概率法分詞程式 struct candidate candidates ...
自然語言處理 MP最大概率中文分詞
課程作業,只完成了最基本的演算法,還有不足的地方,例如一些多位數的分詞方式等,大家可以適當參考。1.語言模型說明 語言模型為bigram,儲存在乙個 n n 的numpy矩陣lm中,訓練過程 laplace平滑僅在計算的二維計數表的每乙個位置進行 1操作處理後極大似然估計得到概率 kn平滑處理後某個...
統計中文分詞(最大熵)
在機器學習中,序列標註 sequence labeling 是一種常見的模式識別任務,它用來給一組可觀察物件打上狀態 類別 標籤。它可以解決nlp中的分詞 word segement 詞性標註 part of speech tagging 命名實體識別 named entity recognitio...