搜索引擎设计实用教程(3)-以百度为例
??????????
????????????? /*版權聲明:可以任意轉載,轉載時請務必標明文章原始出處和作者信息 .*/
???????????????? 搜索引擎設計實用教程(3)-以百度為例
??????????????????????????? 之三:對百度分詞算法的進一步分析
??????????????????????????
??????????????????????????????????? ?中科院軟件所 malefactor?????????????????????????????? 2005年11月
上面說過,經過分析得出百度的分詞系統采用雙向最大匹配分詞,但是后來發現推理過程中存在一個漏洞,而且推導出來的百度分詞算法步驟還是過于繁瑣,所以進一步進行分析,看看是否前面的推導有錯誤.
那么以前的分析有什么漏洞呢?我們推導百度分詞有反向最大匹配的依據是百度將"北京華煙云"分詞為<北,京華煙云>,從這里看好像采用了反向最大匹配,因為正向最大匹配的結果應該是<北京,華,煙云>,但是由此就推論說百度采用了雙向最大匹配還是太倉促了,前面文章我們也講過,百度有兩個詞典,一個普通詞典,一個專有詞典,而且是專有詞典的詞匯先切分,然后將剩余片斷交給普通詞典去切分.所以上面的"北京華煙云"之所以被切分成<北,京華煙云>,另外一個可能是:京華煙云這個詞匯是在專有詞典里面存儲的,所以先分析,這樣得出"京華煙云",剩下"北",沒什么好切分的,所以輸出<北,京華煙云>.
這里只是假設,那么是否確實"京華煙云"在專有詞典呢?我們再看一個例子"山東北京華煙云",百度切分的結果是<山東,北,京華煙云>,如果"京華煙云"在普通詞典,如果是反向切分,那么結果應該是<山,東北,京華煙云>,如果是正向切分應該是<山東,北京,華,煙云>,無論如何都分不出<山東,北,京華煙云>.這說明什么?說明"京華煙云"是在那個專有詞典,所以先切分出"京華煙云",然后剩下的"山東北"交由普通詞典切分,明顯是正向最大匹配的結果輸出<山東,北>.當然按照我們在第一篇文章的算法推導"山東北"的切分也會得出<山東,北>的結論,但是明顯比正向最大匹配多幾個判斷步驟,既然效果一樣,另外一個更加簡潔的方法也能說得通,那當然選擇簡便的方法了.所以初步判斷百度采取的是正向最大匹配.
我們繼續測試采用何種分詞算法,為了減少專有詞典首先分詞造成的影響,那么查詢里面不能出現相對特殊的詞匯,構筑查詢"天才能量級",這里應該沒有專有詞典出現過的詞匯,百度切分為<天才,能量,級>,看來是正向最大匹配的結果.另外,如果所有查詢詞匯都出現在專有詞典,那么采取的是何種方法?這樣首先就得保證詞匯都出現在專有詞典,這么保證這一點呢?我們構造查詢"鋪陳曉東方",百度切分為<鋪,陳曉東,方>,可以看出"陳曉東"是在專有詞典的所以先切分出來.另外一個例子 "山東京城",百度切分為<山東,京城>,說明"東京"是在普通詞典的.OK,構造查詢"陳曉東京華煙云",通過前面分析可以看出兩個詞匯都在專有詞典里面,百度切分為<陳曉東,京華煙云>,說明對于專有詞典詞匯也是采取正向最大匹配或者雙向最大匹配.那么使用反向最大匹配了嗎?構造查詢例子"陳曉東方不敗",首先我們肯定"陳曉東"和"東方不敗"都是在專有詞典出現的,如果是正向切分,那么應該是<陳曉東,方,不敗>或者<陳曉東,方,不,敗>如果是反向切分則是<陳,曉,東方不敗>,可以看出百度的切分是<陳曉東,方,不敗>或者<陳曉東,方,不,敗>,說明采用的是正向最大匹配.通過分析,百度的詞典不包含"不敗"這個單詞,所以實際上百度的切分結果是<陳曉東,方,不,敗>,很明顯這和我們以前推導的算法是有矛盾的,所以以前的分析算法確實有問題,所以結論是百度采取的是正向最大匹配算法.
重新歸納一下百度的分詞系統:首先用專有詞典采用最大正向匹配分詞,切分出部分結果,剩余沒有切分交給普通詞典,同樣采取正向最大匹配分詞,最后輸出結果.
另外,GOOGLE也是采用正向最大匹配分詞算法,不過好像沒有那個專用詞典,所以很多專名都被切碎了.
從這點講,GOOGLE在中文詞典構建上比百度差些,還需要加把子力氣才行,不過這也不是什么多難的事.
?
總結
以上是生活随笔為你收集整理的搜索引擎设计实用教程(3)-以百度为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搜索引擎设计实用教程(2)-以百度为例
- 下一篇: 搜索引擎设计实用教程(4)-以百度为例