服務(wù)熱線
153 8323 9821
對百度分詞算法的進(jìn)一步分析
上面說過,經(jīng)過分析得出百度的分詞系統(tǒng)采用雙向最大匹配分詞,但是后來發(fā)現(xiàn)推理過程中存在一個(gè)漏洞,而且推導(dǎo)出來的百度分詞算法步驟還是過于繁瑣,所以進(jìn)一步進(jìn)行分析,看看是否前面的推導(dǎo)有錯(cuò)誤.
那么以前的分析有什么漏洞呢?我們推導(dǎo)百度分詞有反向最大匹配的依據(jù)是百度將"北京華煙云"分詞為<北,京華煙云>,從這里看好像采用了反向最大匹配,因?yàn)檎蜃畲笃ヅ涞慕Y(jié)果應(yīng)該是<北京,華,煙云>,但是由此就推論說百度采用了雙向最大匹配還是太倉促了,前面文章我們也講過,百度有兩個(gè)詞典,一個(gè)普通詞典,一個(gè)專有詞典,而且是專有詞典的詞匯先切分,然后將剩余片斷交給普通詞典去切分.所以上面的"北京華煙云"之所以被切分成<北,京華煙云>,另外一個(gè)可能是:京華煙云這個(gè)詞匯是在專有詞典里面存儲的,所以先分析,這樣得出"京華煙云",剩下"北",沒什么好切分的,所以輸出<北,京華煙云>.
這里只是假設(shè),那么是否確實(shí)"京華煙云"在專有詞典呢?我們再看一個(gè)例子"山東北京華煙云",百度切分的結(jié)果是<山東,北,京華煙云>,如果"京華煙云"在普通詞典,如果是反向切分,那么結(jié)果應(yīng)該是<山,東北,京華煙云>,如果是正向切分應(yīng)該是<山東,北京,華,煙云>,無論如何都分不出<山東,北,京華煙云>.這說明什么?說明"京華煙云"是在那個(gè)專有詞典,所以先切分出"京華煙云",然后剩下的"山東北"交由普通詞典切分,明顯是正向最大匹配的結(jié)果輸出<山東,北>.當(dāng)然按照我們在第一篇文章的算法推導(dǎo)"山東北"的切分也會得出<山東,北>的結(jié)論,但是明顯比正向最大匹配多幾個(gè)判斷步驟,既然效果一樣,另外一個(gè)更加簡潔的方法也能說得通,那當(dāng)然選擇簡便的方法了.所以初步判斷百度采取的是正向最大匹配.
我們繼續(xù)測試采用何種分詞算法,為了減少專有詞典首先分詞造成的影響,那么查詢里面不能出現(xiàn)相對特殊的詞匯,構(gòu)筑查詢"天才能量級",這里應(yīng)該沒有專有詞典出現(xiàn)過的詞匯,百度切分為<天才,能量,級>,看來是正向最大匹配的結(jié)果.另外,如果所有查詢詞匯都出現(xiàn)在專有詞典,那么采取的是何種方法?這樣首先就得保證詞匯都出現(xiàn)在專有詞典,這么保證這一點(diǎn)呢?我們構(gòu)造查詢"鋪陳曉東方",百度切分為<鋪,陳曉東,方>,可以看出"陳曉東"是在專有詞典的所以先切分出來.另外一個(gè)例子 "山東京城",百度切分為<山東,京城>,說明"東京"是在普通詞典的.OK,構(gòu)造查詢"陳曉東京華煙云",通過前面分析可以看出兩個(gè)詞匯都在專有詞典里面,百度切分為<陳曉東,京華煙云>,說明對于專有詞典詞匯也是采取正向最大匹配或者雙向最大匹配.那么使用反向最大匹配了嗎?構(gòu)造查詢例子"陳曉東方不敗",首先我們肯定"陳曉東"和"東方不敗"都是在專有詞典出現(xiàn)的,如果是正向切分,那么應(yīng)該是<陳曉東,方,不敗>或者<陳曉東,方,不,敗>如果是反向切分則是<陳,曉,東方不敗>,可以看出百度的切分是<陳曉東,方,不敗>或者<陳曉東,方,不,敗>,說明采用的是正向最大匹配.通過分析,百度的詞典不包含"不敗"這個(gè)單詞,所以實(shí)際上百度的切分結(jié)果是<陳曉東,方,不,敗>,很明顯這和我們以前推導(dǎo)的算法是有矛盾的,所以以前的分析算法確實(shí)有問題,所以結(jié)論是百度采取的是正向最大匹配算法.
重新歸納一下百度的分詞系統(tǒng):首先用專有詞典采用最大正向匹配分詞,切分出部分結(jié)果,剩余沒有切分交給普通詞典,同樣采取正向最大匹配分詞,最后輸出結(jié)果.
另外,GOOGLE也是采用正向最大匹配分詞算法,不過好像沒有那個(gè)專用詞典,所以很多專名都被切碎了.
從這點(diǎn)講,GOOGLE在中文詞典構(gòu)建上比百度差些,還需要加把子力氣才行,不過這也不是什么多難的事.