簡與美(3)

腦中的數學是抽象的,手中的數學是簡單的。
 
接着談字串粗分的N-最短路徑方法。
 
所謂N-最短路徑就是最少路徑和全路徑的折中,保留前N長度的路徑。
N-最短路徑方法的基本思想是根據詞典,找出字串中所有可能的詞構造詞圖(一種有向無環圖),每個詞對應圖中的一條有向邊,並賦給相應的邊長(權值)。針對這個詞圖,N-最短路徑求解就是在起點到終點的所有路徑中,求出長度值按嚴格升序排列依次爲第1、第2、...、第N的路徑集合作爲相應的粗分結果集。如果兩條或兩條以上路徑長度相等,那麼他們的長度並列第i,都要列入粗分結果集,最後的粗分結果集大小>=N。
 
設待分字串C=c1c2..cn,其中ci爲單個的字,n爲串的長度,建立一個節點數爲n+1的切分有向無環圖,各節點編號依次爲v0,v1,..,vn。通過以下方法建立詞圖所有可能的詞弧(邊)。
(1)相鄰節點vk-1,vk之間建立有向邊<vk-1,vk>,邊的長度爲lk,邊對應的詞默認爲ck(k=1,2,..,n)
(2)若w=cici+1..cj是一個詞,則節點vi-1,vj之間建立有向邊<vi-1,vj>,邊的長度爲lw,邊對應的詞爲w
kenbin
如何確定邊的長度?沒有任何其他幫助的情況下,所有的邊長可以設爲1。那麼尋找長度最短的路徑也就是最少詞的切分路徑,可以想象的是,隨着字串長度n的增加和最短路徑數N的增大,長度相同的路徑數會急劇增加,同時粗分結果數量也必然上升,這對後期處理不利。
 
如果把N-最短路徑粗分模型改進爲:
假設字串爲C=c1c2..cn,要求的詞串爲W=w1w2..wm。求使得概率P(W|C)的值是最大的N個W。
採用一元統計模型,即只引入詞頻並假定詞與詞之間是相互獨立。我們引入詞wi的詞頻信息P(wi),對模型進行改進,得到一個基於N-最短路徑的一元統計模型。由貝耶斯定理:P(W|C)=P(W)P(C|W)/P(C),其中,P(C)是字串概率,是一個常數,不必考慮。從詞串恢復到字串的概率P(C|W)=1(只有唯一的一種方式,因爲字串只有一個)。
問題就轉化爲確定P(W)最大的N種切分結果集合。
W=w1w2..wm是字串C=c1c2..cn的一種切分結果。wi是一個詞,P(wi)表示wi的出現概率。在大規模語料庫訓練的基礎上,根據大數定理:在大樣本統計的前提下,樣本的頻率接近於其概率值。所以P(wi)的極大似然估計值等於詞頻。有:
P(wi) = ki / (k1 + k2 + .. + km),ki爲wi在訓練樣本中出現的次數
對於一元統計模型,詞與詞之間是獨立的,則W的聯合概率P(W)=P(w1)*P(w2)*..*P(wm),設K=k1+k2+..+km,則:
P(W)=(k1/K)*(k2/K)*..*(km/K),令P*(W)=-lnP(W),則:
P*(W) = -lnP(w1)-lnP(w2)-..-lnP(wm) = -ln(k1/K)-ln(k2/K)-..-ln(km/K) = m*ln(K)-ln(k1)-ln(k2)-..-ln(km)
那麼就把求P(W)的極大值問題轉化爲求P*(W)的極小值問題。適當修改切分有向無環圖邊長(加1是爲了數據平滑處理):
(1)*<vk-1,vk>的長度值lk=-ln(0+1),(k=1,2,..,n)
(2)*w=cici+1..cj對應的有向邊爲<vi-1,vj>,其長度值lw=ln(K+m)-ln(ki+1)
 
N-最短路徑的求解就是求v0到vn的N-最短路徑集合。可以採用貪心方法,我們使用的算法是基於Dijkstra的一種簡單擴展,改進的地方在於:每個節點處記錄N個最短路徑值,並記錄相應路徑上當前節點的前驅。如果同一長度對應多條路徑,必須同時記錄這些路徑上當前節點的前驅。最後通過回溯可求出v0到vn的N-最短路徑集合。
以3-最短路徑方法爲例。
假設詞圖如下,邊長都爲1:
kenbin
以下是節點記錄,前驅記錄了(節點號,編號)
kenbin
 
現在從記錄回溯第一條最短路徑。由節點7的表格中查出前驅爲(5,1),記錄前驅節點爲5,並沿着前驅繼續查節點5的編號爲1的記錄,得前驅(3,1),依此類推得前驅(2,1)、(1、1)、(0,1),則得到切分爲(0 1 2 3 5 7),即:他/說/的/確實/在理。
 
對於基於統計模型的N-最短路徑問題,按照修改後的詞圖,使用上面的算法可以得出更準確的切分結果。
 
詞圖的構造是中科院計算技術研究所最先提出來的,並用於中科院的分詞系統ICTCLAS中,我估計做中文分詞的人都應該知道這個分詞系統,網上有不少閱讀這個分詞系統的代碼筆記,普遍反映這個詞圖構造是最難懂的一個部分,我沒有仔細研究中科院的代碼,但是我自己的實現是基於以上的論述,利用一個鄰接表來實現,很簡單的,vector再嵌一個vector就實現了,呵呵,stl有時候還是蠻可愛的嘛。
 
這個詞圖的實現不過100行左右代碼,很美觀,但確實是挺抽象的,你看懂了嗎?
 
待續...
發佈了30 篇原創文章 · 獲贊 1 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章