最大概率分詞

2022-05-14 23:41:16 字數 1640 閱讀 3537

這裡介紹一種分詞的方法--最大概率分詞,也叫1-gram分詞,因為它不考慮上下文關係,只考慮當前詞的概率。

我們需要有乙個詞典,裡面記錄每個詞的頻次,比如:

基於這個詞典,我們可以將一句話用乙個有向無環圖(dag)的表示出來,比如

這個圖裡面,每個節點是乙個字,邊為兩點構成詞的概率。分詞的問題,就是找出這個dag裡面概率和最大的一條從開始到結束覆蓋所有字的路徑。比如,辣-》菜,五-》肉,蓋-》飯是一條路徑,辣-》辣,白-》菜,五-》花,肉-》肉,蓋-》飯也是一條路徑,如何找到最大的那條呢?

設\(\alpha_i\)為dag中以i節點開始之後的部分的最優路徑的累計概率,j為i的鄰接點,那麼容易的出\(\alpha_i = max_jp(w(i,j))\alpha_\),w(i,j)是句子中i開始j結束的詞。

這是乙個動態規劃問題,從最後乙個字開始,基於以前的計算結果,逐步向前推移,直到第乙個點,然後再從前往後得到最優路徑。

python**如下:

def

build_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

def

calc_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...