如果兩者切分結果相同,說明沒有歧義,直接輸出分詞結果
如果不壹致,則輸出最短路徑的那個結果
如果長度相同。則選擇單字詞少的那壹組切分結果。如果單字也相同,則選擇正向分詞結果。
如果說百度有優勢的話,唯壹的優勢就是那個很大的專用詞典。
這個專用詞典登錄了人名(比如大長今)。稱謂(比如老太太)。部分地名(比如阿聯酋等)。
從語料庫裏面不斷識別出詞典未登錄詞。逐漸擴充這個專門詞典。Spelling Checker(百度詞典)拼寫檢查錯誤提示(以及拼音提示功能),拼寫檢查錯誤提示是搜索引擎都具備的壹個功能。也就是說用戶提交查詢給搜索引擎,搜索引擎檢查看是否用戶輸入的拼寫有錯誤。
對於中文用戶來說壹般造成的錯誤是輸入法造成的錯誤。
那麽我們就來分析看看百度是怎麽實現這壹功能的。
我們分析拼寫檢查系統關註以下幾個問題:
(1)系統如何判斷用戶的輸入是有可能發生錯誤的查詢?
那麽百度有又是如何做到這些的?百度判斷用戶輸入是否錯誤的標準,
我覺得應該是查字典,如果發現字典裏面不包含這個詞匯,那麽很有可能是個錯誤的輸入。此時啟動錯誤提示功能,這個很好判斷,
因為如果是壹個正常詞匯的話,百度壹般不會有錯誤提示。而妳故意輸入壹個詞典不可能包含的所謂詞匯
此時百度壹般會提示妳正確的檢索詞匯。
百度又是怎麽提示正確詞匯的呢?
很明顯是通過拼音的方式,在百度輸入查詢“紫材”。
百度提供的提示詞匯為: “紫菜”,
是同音字。所以百度必然維持著壹個同音詞詞典。裏面保留著同音詞信息
比如可能包含著下面這條詞條: “ zi cai 紫材”,
另外還有壹個標註拼音程序,
現在能夠看到的基本流程是:用戶輸入“紫材”,查詞典。發現沒有這個詞匯,啟動標註拼音程序。將“紫材”標註為拼音“zhi cai”。然後查找同音詞詞典,發現同音詞“紫菜”,那麽提示用戶可能的正確拼寫。
但是還有壹些遺留的小問題。比如是否將詞表裏面所有同音詞都作為用戶的提示信息?
比如某個拼音有10個同音詞,是否都輸出呢?
大家覺得百度會都輸出嗎?百度並沒有將所有同音詞都輸出,而是選擇壹定篩選標準。選擇其中幾個輸出,怎麽證明這壹點?
我們看看拼音“liu li”的同音詞。搜狗拼音輸入法提示同音詞匯有“六裏 劉歷 琉璃 流利 劉麗”等N個。
這裏是故意輸入壹個詞典不包含的詞匯,這樣百度的拼寫檢查才開始工作。百度提示您要找的是不是: “流氓”。我們改換輸入“遛邙”。
看百度的查詢呈現,
就沒有提示您要找的是不是“流氓”了。看看我兩次輸入的字有什麽區別,這說明什麽?
說明不是所有同音詞都給提示,而是選擇性的做呈現提示。那麽選擇的標準是什麽?
大家再回頭看看,第壹次和第二次輸入的“遛氓與遛邙”是有絕對的區別的。
第壹次輸入的“遛氓”的“氓”字是流氓的氓字,所以百度做了提示您要找的是不是“流氓”了。
去百度,就是有壹點對的,壹個字是對的,百度也會給妳個流氓
另外壹個小問題:同音詞詞典是否包含壹字詞? 包含2字詞,3字詞,那麽是否包含4字詞以及更長的詞條?
這裏壹字詞好回答,不用測試也能知道肯定不包含,因為妳輸入壹個字,誰知道是否是錯誤的呢?
反正只要是漢字就能在詞表裏面找到,所以沒有判斷依據。
二字詞是包含的,上面有例子
三字詞也包含嗎?
下面我們查詢 “中城藥”百度錯誤提示:“中成藥”
修改查詢為“重城藥”。
那麽我們看看4字詞匯百度怎麽處理?百度是不是還是會給我們提示呢,
輸入:靜華煙雲
輸入 靜話煙雲
輸入 京花閻暈
那麽更長的詞匯百度是否也提示?
我們現在輸入: “落花世界有風軍”, 這個查詢是什麽意思,估計讀過古詩的都知道。看看百度的提示
這說明什麽?
說明同音詞詞典包含不同長度的同音詞信息。
另外也說明了百度的核心中文處理技術,也就是那個詞典還真挺大的。
還有壹個比較重要的問題。如果漢字是多音字那麽怎麽處理?百度比較偷懶。它根本就沒有對多音字做處理。
我們來看看百度的壹個標註拼音的錯誤。在看這個錯誤前先看看對於多音字百度是怎麽提示錯誤的。
百度提示“局長”!!“俱長”的拼音有幾種拼法,大家說說?兩種“ju zhang / ju chang”
可見如果是多音字則幾種情況都提示。
現在我們來看看錯誤的情況,我們輸入查詢“距長”,看看結果
百度提示為“局長”當然好解釋,因為是同音字。
但是為什麽會被提示“局長”呢?這說明百度的同音字詞典有錯誤,
說明在“ju chang”這個詞條裏面包含“局長”這個錯誤的同音詞。
讓我們順藤摸瓜。這個錯誤又說明什麽問題呢?
說明百度的同音詞典是自動生成的。而且沒有人工校對。還說明在自動生成同音詞典的過程中,百度不是根據對壹篇文章標註拼音然後,在抽取詞匯和對應的拼音信息獲得的。而是完全按照某個詞典的詞條來標註音節的,以對於多音字造成的錯誤無法識別出來,
如果是對篇章進行拼音標註,可能就不會出現這種很容易發現的錯誤標註。當然還有另外壹種解釋,就是“局長”是故意被百度提示出來可能的正確提示詞匯。
因為考慮到南方人“zh”和 “ch”等前後鼻音分不清麽。
我們繼續測試到底是何種情況
是百度有錯誤還是這是百度的先進的算法?
我們輸入查詢“懸賞”,故意將之錯誤輸入為“懸桑”。
沒有錯誤提示。說明確實沒有考慮這種情況,鼻音沒有考慮。
根據以上推導, 我們可以得出如下結論:
百度是將分詞詞典裏面每個詞條利用拼音標註程序標註成拼音,然後形成同音詞詞典。
所以兩個詞典是同樣大的而且這個詞典也隨著分詞詞典的增長而在不斷增長。
至於標註過程中多音字百度沒有考慮,如果是多音字就標註成多個發音組合,
通過這種方式形成同音詞詞典。這樣的同音詞詞典顯然包含著很多錯誤。
最後壹個問題:百度對於英文進行拼寫檢查麽?讓我們試試看,輸入查詢“china”,
大家告訴我,什麽情況
專註中文搜索的百度還能搜索到英文
真是意外的驚喜。變換壹下查詢“chini”。
那麽拼音搜索和中文檢查錯誤是否采用同壹套同音詞詞典呢,讓我們來實驗壹下,搜索”rongji”,
最後讓我們總結歸納壹下百度的拼寫檢查系統:
就是百度的後臺作業:
(1)前面我們說過,百度分詞使用的詞典至少包含兩個詞典壹個是普通詞典,另外壹個是專用詞典(專名等),
最後讓我們總結歸納壹下百度的拼寫檢查系統:
百度利用拼音標註程序依次掃描所有詞典中的每個詞條,
然後標註拼音,如果是多音字則把多個音都標上,比如”長大”,會被標註為”zhang da/chang da”兩個詞條.
(2)通過標註完的詞條,建立同音詞詞典,比如上面的”長大”,會有兩個詞條: zhang daà長大chang daà長大。
(3)利用用戶查詢LOG頻率信息給予每個中文詞條壹個權重;LOG大家知道是什麽嗎?函數
(4)同音詞詞典建立完成了,當然隨著分詞詞典的逐步擴大,同音詞詞典也跟著同步擴大;
拼寫檢查:
(1)用戶輸入查詢,如果是多個子字符串,不作拼寫檢查;
(2)對於用戶查詢,先查分詞詞典,如果發現有這個單詞詞條,不作拼寫檢查;
(3)如果發現詞典裏面不包含用戶查詢,啟動拼寫檢查系統:
首先利用拼音標註程序對用戶輸入進行拼音標註
(4)對於標註好的拼音在同音詞詞典裏面掃描,
如果沒有發現則不作任何提示;
(5)如果發現有詞條,則按照順序輸出權重比較大的幾個提示結果;
拼音提示:
(1)對於用戶輸入的拼音在同音詞詞典裏面掃描,如果沒有發現則不作任何提示;
(2)如果發現有詞條,則按照順序輸出權重比較大的幾個提示結果。
對百度分詞算法的進壹步分析,上面說過,經過分析得出百度的分詞系統采用雙向最大匹配分詞,
但是後來發現推理過程中存在壹個漏洞,而且推導出來的百度分詞算法步驟還是過於繁瑣。所以進壹步進行分析,看看是否前面的推導有錯誤。
那麽以前的分析有什麽漏洞呢?
我們推導百度分詞有反向最大匹配的依據是百度將“北京華煙雲”分詞為“北/京華煙雲”,從這裏看好像采用了反向最大匹配。因為正向最大匹配的結果應該是“北京/華/煙雲”,但是由此就推論說百度采用了雙向最大匹配還是太倉促了。
前面我們也講過,百度有兩個詞典,壹個普通詞典,壹個專有詞典。
而且是專有詞典的詞匯先切分,然後將剩余片斷交給普通詞典去切分。
以上面的“北京華煙雲”之所以被切分成“北/京華煙雲”,
另外壹個可能是“京華煙雲”這個詞匯是在專有詞典裏面存儲的。
所以先分析,這樣得出“京華煙雲”剩下“北”,沒什麽好切分的,所以就呈現出來了。
這裏只是假設,那麽是否確實“京華煙雲”在專有詞典呢?
我們再看壹個例子“山東北京華煙雲”,
如果“京華煙雲”在普通詞典,如果是反向切分,那麽結果應該是,如果是正向切分應該是,無論如何都分不出。這說明什麽?說明“京華煙雲”是在那個專有詞典
所以先切分出“京華煙雲”,然後剩下的“山東北”交由普通詞典切分,明顯是正向最大匹配的結果呈現。
當然按照我們在前面講的算法推導“山東北”的切分也會得出的結論。
但是明顯比正向最大匹配多幾個判斷步驟,既然效果壹樣,另外壹個更加簡潔的方法也能說得通,那當然選擇簡便的方法了。所以初步判斷百度采取的是正向最大匹配。
我們繼續測試采用何種分詞算法,
為了減少專有詞典首先分詞造成的影響,那麽查詢裏面不能出現相對特殊的詞匯
我們查詢“天才能量級”,看看
這裏應該沒有專有詞典出現過的詞匯,百度切分為天才 /能量/ 級
看來是正向最大匹配的結果。
另外,如果所有查詢詞匯都出現在專有詞典,那麽采取的是何種方法?
這樣首先就得保證詞匯都出現在專有詞典,這麽保證這壹點呢?我們構造查詢“山東京城”,百度切分為“山東/京城”,說明“東京”是在普通詞典的。構造查詢“陳曉東京華煙雲”,
通過前面分析可以看出兩個詞匯都在專有詞典裏面,百度切分為陳曉東 /京華煙雲 ,
說明對於專有詞典詞匯也是采取正向最大匹配或者雙向最大匹配。
那麽使用反向最大匹配了嗎?構造查詢例子“陳曉東方不敗”。
首先我們肯定“陳曉東”和“東方不敗”都是在專有詞典出現的,
如果是正向切分陳曉東 /方/ 不敗
那麽應該是或者如果是反向切分則是陳曉/東方不敗
可以看出百度的切分是或者,說明采用的是正向最大匹配。
通過分析,百度的詞典不包含“不敗”這個單詞。所以實際上百度的切分很明顯這和我們以前推導的算法是有矛盾的,所以以前的分析算法確實有問題,所以結論是百度采取的是正向最大匹配算法
重新歸納壹下百度的分詞系統:首先用專有詞典采用最大正向匹配分詞,切分出部分結果,剩余沒有切分交給普通詞典,同樣采取正向最大匹配分詞,最後輸出結果。
另外,GOOGLE也是采用正向最大匹配分詞算法,
不過好像沒有那個專用詞典,所以很多專名都被切碎了