baidu分詞算法分析之二
Spelling Checker拼寫檢查錯(cuò)誤提示(以及拼音提示功能)
拼寫檢查錯(cuò)誤提示是搜索引擎都具備的一個(gè)功能,也就是說用戶提交查詢 給搜索引擎,搜索引擎檢查看是否用戶輸入的拼寫有錯(cuò)誤,對于中文用戶來說一般造成的錯(cuò)誤是輸入法造成的錯(cuò)誤.那么我們就來分析看看百度是 怎么實(shí)現(xiàn)這一功能的.
我們分析拼寫檢查系統(tǒng)關(guān)注以下幾個(gè)問題:
(1)系統(tǒng)如何判斷用戶的輸入是有可能發(fā)生錯(cuò)誤的查詢呢?
(2)如果判斷是可能錯(cuò)誤的查詢輸入,如何提示正確的詞匯呢?
那么百度是如何做的呢?百度判斷用戶輸入是否錯(cuò)誤的 標(biāo)準(zhǔn),我覺得應(yīng)該是查字典,如果發(fā)現(xiàn)字典里面不包含這個(gè)詞匯,那么很有可能是個(gè)錯(cuò)誤的輸入,此時(shí)啟動(dòng)錯(cuò)誤提示功能,這個(gè)很好判斷,因?yàn)槿绻?是一個(gè)正常詞匯的話,百度一般不會(huì)有錯(cuò)誤提示,而你故意輸入一個(gè)詞典不可能包含的所謂詞匯,此時(shí)百度一般會(huì)提示你正確的檢索詞匯.
那么百度是怎么提示正確詞匯的呢?很明顯是通過拼音的方式,比如我輸入查詢" 制才",百度提供的提示詞匯為: “:制裁 質(zhì)材 紙材",都是同 音字.所以百度必然維持著一個(gè)同音詞詞典,里面保留著同音詞信息,比如可能包含著下面這條詞條: “ zhi cai à制裁,質(zhì)材,紙材",另外還有一 個(gè)標(biāo)注拼音程序,現(xiàn)在能夠看到的基本流程是: 用戶輸入" 制才",查詞典,發(fā)現(xiàn)沒有這個(gè)詞匯,OK,啟動(dòng)標(biāo)注拼音程序,將" 制才"標(biāo)注為拼音"zhi cai",然后查找同音詞詞典,發(fā)現(xiàn)同音詞" 制裁,質(zhì)材,紙材",那么提示用戶可能的正確拼寫.
整體流程看起來很簡單,但是還有一些遺留 的小問題,比如是否將詞表里面所有同音詞都作為用戶的提示信息呢?比如某個(gè)拼音有10個(gè)同音詞,是否都輸出呢?百度并沒有將所有同音詞都輸 出而是選擇一定篩選標(biāo)準(zhǔn),選擇其中幾個(gè)輸出.怎么證明這一點(diǎn)?我們看看拼音"liu li"的同音詞,紫光輸入法提示同音詞匯有" 流麗 流離 琉璃 流利"4個(gè),我們看看百度返回幾個(gè),輸入"流厲"作為查詢,這里是故意輸入一個(gè)詞典不包含的詞匯,這樣百度的拼寫檢查才開始工作,百度提示: " 琉璃劉麗 劉莉 ",這說明什么?說明不是所有同音詞都輸出,而是選擇輸出,那么選擇的標(biāo)準(zhǔn)是什么?我能夠猜測到的方法是對于用戶查詢LOG進(jìn)行 統(tǒng)計(jì),提取用戶查詢次數(shù)多的那些同音詞輸出,如果是這樣的話,上面的例子說明用戶搜索"琉璃"次數(shù)比其它的都要高些,次之是" 劉麗",再次是" 劉莉",看來大家都喜歡查詢自己或者認(rèn)識(shí)的人的名字.
另外一個(gè)小問題:同音詞詞典包含2字詞,3字詞,那么是否包含4字詞以及更長的詞 條?是否包含一字詞? 這里一字詞好回答,不用測試也能知道肯定不包含,因?yàn)槟爿斎胍粋(gè)字,誰知道是否是錯(cuò)誤的呢?反正只要是漢字就能在詞表 里面找到,所以沒有判斷依據(jù).二字詞是包含的,上面有例子,三字詞也包含,比如查詢 "中城藥"百度錯(cuò)誤提示:"中成藥",修改查詢?yōu)?重城藥",還 是提示"中成藥" ,再次修改查詢 "重城要",百度依然提示"中成藥". 那么4字詞匯呢?
百度還是會(huì)給你提示的,下面是個(gè)例子:
輸入:靜華煙云 提示 京華煙云
輸入:靜話煙云 提示 京華煙云
輸入:靜話閻暈 提示 京華煙云
那么更長的詞匯是否提 示呢?也提示,比如我輸入: "落花世界有風(fēng)軍",這個(gè)查詢是什么意思,估計(jì)讀過古詩的都知道,看看百度的提示"落花時(shí)節(jié)又逢君",這說明什么?說 明同音詞詞典包含不同長度的同音詞信息,另外也說明了百度的核心中文處理技術(shù),也就是那個(gè)詞典,還真挺大的.
但是,如果用戶輸入的 查詢由兩個(gè)或者兩個(gè)以上子字符串構(gòu)成,那么百度的錯(cuò)誤提示功能就罷工了,比如輸入查詢"哀體",百度提示"艾提 挨踢",但是.輸入為 "我 哀體 ",則沒有任何錯(cuò)誤提示.
還有一個(gè)比較重要的問題:如果漢字是多音字那么怎么處理?百度呢比較偷懶,它根本就沒有對多音字做處理.我 們來看看百度的一個(gè)標(biāo)注拼音的錯(cuò)誤,在看這個(gè)錯(cuò)誤前先看看對于多音字百度是怎么提示錯(cuò)誤的,我們輸入查詢"俱長",百度提示"劇場 局長", “俱長"的拼音有兩個(gè):"ju zhang /ju chang" ,可見如果是多音字則幾種情況都提示..現(xiàn)在我們來看看錯(cuò)誤的情況, 我們輸入查詢"劇常",百度 提示":劇場局長",提示為"劇場"當(dāng)然好解釋,因?yàn)槭峭糇?但是為什么 "局長"也會(huì)被提示呢?這說明百度的同音字詞典有錯(cuò)誤,說明在"ju chang"這個(gè)詞條里面包含"局長"這個(gè)錯(cuò)誤的同音詞.讓我們順藤摸瓜,這個(gè)錯(cuò)誤又說明什么問題呢?說明百度的同音詞典是自動(dòng)生成的,而且沒有 人工校對.還說明在自動(dòng)生成同音詞典的過程中,百度不是根據(jù)對一篇文章標(biāo)注拼音然后在抽取詞匯和對應(yīng)的拼音信息獲得的,而是完全按照某個(gè) 詞典的詞條來標(biāo)注音節(jié)的,所以對于多音字造成的錯(cuò)誤無法識(shí)別出來,如果是對篇章進(jìn)行拼音標(biāo)注,可能就不會(huì)出現(xiàn)這種很容易發(fā)現(xiàn)的錯(cuò)誤標(biāo)注. 當(dāng)然還有另外一種解釋,就是"局長"是故意被百度提示出來可能的正確提示詞匯,因?yàn)榭紤]到南方人"zh"和 "ch"等前后鼻音分不清么,那么是這 樣的么?我們繼續(xù)測試到底是何種情況.是百度有錯(cuò)誤還是這是百度的先進(jìn)的算法?
我們考慮詞匯"長大 ",故意錯(cuò)誤輸入為"贓大",如果 百度考慮到了前后鼻音的問題,那么應(yīng)該會(huì)提示"長大",但是百度提示是"藏大".這說明什么?說明百度并沒有考慮前后鼻音問題,根本就是系統(tǒng)錯(cuò) 誤. 我們輸入查詢"懸賞",故意將之錯(cuò)誤輸入為"懸桑",沒有錯(cuò)誤提示,說明確實(shí)沒有考慮這種情況.前鼻音沒有考慮,那么后鼻音考慮了么,我們 輸入":經(jīng)常",故意改為后鼻音 "經(jīng)纏",百度提示為"經(jīng)產(chǎn) 經(jīng)懺",還是沒有考慮后鼻音.這基本可以確定是百度系統(tǒng)的錯(cuò)誤導(dǎo)致.
根據(jù)以 上推導(dǎo), 我們可以得出如下結(jié)論:百度是將分詞詞典里面每個(gè)詞條利用拼音標(biāo)注程序標(biāo)注成拼音,然后形成同音詞詞典,所以兩個(gè)詞典是同樣大的 ,而且這個(gè)詞典也隨著分詞詞典的增長而在不斷增長. 至于標(biāo)注過程中多音字百度沒有考慮,如果是多音字就標(biāo)注成多個(gè)發(fā)音組合,通過這種方式 形成同音詞詞典.這樣的同音詞詞典顯然包含著很多錯(cuò)誤.
最后一個(gè)問題:百度對于英文進(jìn)行拼寫檢查么?讓我們試試看,輸入查 詢"china",不錯(cuò),搜到不少結(jié)果,專注中文搜索的百度還能搜索到英文,真是意外的驚喜.變換一下查詢"chine",會(huì)更加意外驚喜的給我們提 示"china"嗎?百度提示的是: 吃呢持呢,原來是不小心觸發(fā)了百度的拼音搜索功能了.那么拼音搜索和中文檢查錯(cuò)誤是否采用同一套同音詞詞典 呢,讓我們來實(shí)驗(yàn)一下,搜索"rongji",百度提示" 榕基 溶劑 容積",OK,換個(gè)中文查詢"容機(jī)",百度提示" 榕基 溶劑容積",看來使用的是同一套 同音詞詞典.也就是說百度的中文糾錯(cuò)和拼音檢索使用的機(jī)制相同,中文糾錯(cuò)多了一道拼音注音的過程而已.難道這就是傳說中那個(gè)百度的"事實(shí) 上是一個(gè)無比強(qiáng)大的拼音輸入法"的拼音提示功能么?
最后讓我們總結(jié)歸納一下百度的拼寫檢查系統(tǒng):
后臺(tái)作業(yè): (1)前面的文 章我們說過,百度分詞使用的詞典至少包含兩個(gè)詞典一個(gè)是普通詞典,另外一個(gè)是專用詞典(專名等),百度利用拼音標(biāo)注程序依次掃描所有詞典中 的每個(gè)詞條,然后標(biāo)注拼音,如果是多音字則把多個(gè)音都標(biāo)上,比如"長大",會(huì)被標(biāo)注為"zhang da/chang da"兩個(gè)詞條.
(2)通過標(biāo)注完的 詞條,建立同音詞詞典,比如上面的"長大",會(huì)有兩個(gè)詞條: zhang daà長大" , chang daà長大.
(3)利用用戶查詢LOG頻率信息給予每個(gè) 中文詞條一個(gè)權(quán)重;
(4)OK,同音詞詞典建立完成了,當(dāng)然隨著分詞詞典的逐步擴(kuò)大,同音詞詞典也跟著同步擴(kuò)大;
拼寫 檢查:
(1)用戶輸入查詢,如果是多個(gè)子字符串,不作拼寫檢查;
(2)對于用戶查詢,先查分詞詞典,如果發(fā)現(xiàn)有這個(gè)單詞詞條,OK, 不作拼寫檢查;
(3)如果發(fā)現(xiàn)詞典里面不包含用戶查詢,啟動(dòng)拼寫檢查系統(tǒng);首先利用拼音標(biāo)注程序?qū)τ脩糨斎脒M(jìn)行拼音標(biāo)注;
(4)對于標(biāo)注好的拼音在同音詞詞典里面掃描,如果沒有發(fā)現(xiàn)則不作任何提示;
(5)如果發(fā)現(xiàn)有詞條,則按照順序輸出權(quán)重比較大的幾個(gè)提 示結(jié)果;
拼音提示:
(1)對于用戶輸入的拼音在同音詞詞典里面掃描,如果沒有發(fā)現(xiàn)則不作任何提示;
(2)如果 發(fā)現(xiàn)有詞條,則按照順序輸出權(quán)重比較大的幾個(gè)提示結(jié)果;
拼寫檢查錯(cuò)誤提示是搜索引擎都具備的一個(gè)功能,也就是說用戶提交查詢 給搜索引擎,搜索引擎檢查看是否用戶輸入的拼寫有錯(cuò)誤,對于中文用戶來說一般造成的錯(cuò)誤是輸入法造成的錯(cuò)誤.那么我們就來分析看看百度是 怎么實(shí)現(xiàn)這一功能的.
我們分析拼寫檢查系統(tǒng)關(guān)注以下幾個(gè)問題:
(1)系統(tǒng)如何判斷用戶的輸入是有可能發(fā)生錯(cuò)誤的查詢呢?
(2)如果判斷是可能錯(cuò)誤的查詢輸入,如何提示正確的詞匯呢?
那么百度是如何做的呢?百度判斷用戶輸入是否錯(cuò)誤的 標(biāo)準(zhǔn),我覺得應(yīng)該是查字典,如果發(fā)現(xiàn)字典里面不包含這個(gè)詞匯,那么很有可能是個(gè)錯(cuò)誤的輸入,此時(shí)啟動(dòng)錯(cuò)誤提示功能,這個(gè)很好判斷,因?yàn)槿绻?是一個(gè)正常詞匯的話,百度一般不會(huì)有錯(cuò)誤提示,而你故意輸入一個(gè)詞典不可能包含的所謂詞匯,此時(shí)百度一般會(huì)提示你正確的檢索詞匯.
那么百度是怎么提示正確詞匯的呢?很明顯是通過拼音的方式,比如我輸入查詢" 制才",百度提供的提示詞匯為: “:制裁 質(zhì)材 紙材",都是同 音字.所以百度必然維持著一個(gè)同音詞詞典,里面保留著同音詞信息,比如可能包含著下面這條詞條: “ zhi cai à制裁,質(zhì)材,紙材",另外還有一 個(gè)標(biāo)注拼音程序,現(xiàn)在能夠看到的基本流程是: 用戶輸入" 制才",查詞典,發(fā)現(xiàn)沒有這個(gè)詞匯,OK,啟動(dòng)標(biāo)注拼音程序,將" 制才"標(biāo)注為拼音"zhi cai",然后查找同音詞詞典,發(fā)現(xiàn)同音詞" 制裁,質(zhì)材,紙材",那么提示用戶可能的正確拼寫.
整體流程看起來很簡單,但是還有一些遺留 的小問題,比如是否將詞表里面所有同音詞都作為用戶的提示信息呢?比如某個(gè)拼音有10個(gè)同音詞,是否都輸出呢?百度并沒有將所有同音詞都輸 出而是選擇一定篩選標(biāo)準(zhǔn),選擇其中幾個(gè)輸出.怎么證明這一點(diǎn)?我們看看拼音"liu li"的同音詞,紫光輸入法提示同音詞匯有" 流麗 流離 琉璃 流利"4個(gè),我們看看百度返回幾個(gè),輸入"流厲"作為查詢,這里是故意輸入一個(gè)詞典不包含的詞匯,這樣百度的拼寫檢查才開始工作,百度提示: " 琉璃劉麗 劉莉 ",這說明什么?說明不是所有同音詞都輸出,而是選擇輸出,那么選擇的標(biāo)準(zhǔn)是什么?我能夠猜測到的方法是對于用戶查詢LOG進(jìn)行 統(tǒng)計(jì),提取用戶查詢次數(shù)多的那些同音詞輸出,如果是這樣的話,上面的例子說明用戶搜索"琉璃"次數(shù)比其它的都要高些,次之是" 劉麗",再次是" 劉莉",看來大家都喜歡查詢自己或者認(rèn)識(shí)的人的名字.
另外一個(gè)小問題:同音詞詞典包含2字詞,3字詞,那么是否包含4字詞以及更長的詞 條?是否包含一字詞? 這里一字詞好回答,不用測試也能知道肯定不包含,因?yàn)槟爿斎胍粋(gè)字,誰知道是否是錯(cuò)誤的呢?反正只要是漢字就能在詞表 里面找到,所以沒有判斷依據(jù).二字詞是包含的,上面有例子,三字詞也包含,比如查詢 "中城藥"百度錯(cuò)誤提示:"中成藥",修改查詢?yōu)?重城藥",還 是提示"中成藥" ,再次修改查詢 "重城要",百度依然提示"中成藥". 那么4字詞匯呢?
百度還是會(huì)給你提示的,下面是個(gè)例子:
輸入:靜華煙云 提示 京華煙云
輸入:靜話煙云 提示 京華煙云
輸入:靜話閻暈 提示 京華煙云
那么更長的詞匯是否提 示呢?也提示,比如我輸入: "落花世界有風(fēng)軍",這個(gè)查詢是什么意思,估計(jì)讀過古詩的都知道,看看百度的提示"落花時(shí)節(jié)又逢君",這說明什么?說 明同音詞詞典包含不同長度的同音詞信息,另外也說明了百度的核心中文處理技術(shù),也就是那個(gè)詞典,還真挺大的.
但是,如果用戶輸入的 查詢由兩個(gè)或者兩個(gè)以上子字符串構(gòu)成,那么百度的錯(cuò)誤提示功能就罷工了,比如輸入查詢"哀體",百度提示"艾提 挨踢",但是.輸入為 "我 哀體 ",則沒有任何錯(cuò)誤提示.
還有一個(gè)比較重要的問題:如果漢字是多音字那么怎么處理?百度呢比較偷懶,它根本就沒有對多音字做處理.我 們來看看百度的一個(gè)標(biāo)注拼音的錯(cuò)誤,在看這個(gè)錯(cuò)誤前先看看對于多音字百度是怎么提示錯(cuò)誤的,我們輸入查詢"俱長",百度提示"劇場 局長", “俱長"的拼音有兩個(gè):"ju zhang /ju chang" ,可見如果是多音字則幾種情況都提示..現(xiàn)在我們來看看錯(cuò)誤的情況, 我們輸入查詢"劇常",百度 提示":劇場局長",提示為"劇場"當(dāng)然好解釋,因?yàn)槭峭糇?但是為什么 "局長"也會(huì)被提示呢?這說明百度的同音字詞典有錯(cuò)誤,說明在"ju chang"這個(gè)詞條里面包含"局長"這個(gè)錯(cuò)誤的同音詞.讓我們順藤摸瓜,這個(gè)錯(cuò)誤又說明什么問題呢?說明百度的同音詞典是自動(dòng)生成的,而且沒有 人工校對.還說明在自動(dòng)生成同音詞典的過程中,百度不是根據(jù)對一篇文章標(biāo)注拼音然后在抽取詞匯和對應(yīng)的拼音信息獲得的,而是完全按照某個(gè) 詞典的詞條來標(biāo)注音節(jié)的,所以對于多音字造成的錯(cuò)誤無法識(shí)別出來,如果是對篇章進(jìn)行拼音標(biāo)注,可能就不會(huì)出現(xiàn)這種很容易發(fā)現(xiàn)的錯(cuò)誤標(biāo)注. 當(dāng)然還有另外一種解釋,就是"局長"是故意被百度提示出來可能的正確提示詞匯,因?yàn)榭紤]到南方人"zh"和 "ch"等前后鼻音分不清么,那么是這 樣的么?我們繼續(xù)測試到底是何種情況.是百度有錯(cuò)誤還是這是百度的先進(jìn)的算法?
我們考慮詞匯"長大 ",故意錯(cuò)誤輸入為"贓大",如果 百度考慮到了前后鼻音的問題,那么應(yīng)該會(huì)提示"長大",但是百度提示是"藏大".這說明什么?說明百度并沒有考慮前后鼻音問題,根本就是系統(tǒng)錯(cuò) 誤. 我們輸入查詢"懸賞",故意將之錯(cuò)誤輸入為"懸桑",沒有錯(cuò)誤提示,說明確實(shí)沒有考慮這種情況.前鼻音沒有考慮,那么后鼻音考慮了么,我們 輸入":經(jīng)常",故意改為后鼻音 "經(jīng)纏",百度提示為"經(jīng)產(chǎn) 經(jīng)懺",還是沒有考慮后鼻音.這基本可以確定是百度系統(tǒng)的錯(cuò)誤導(dǎo)致.
根據(jù)以 上推導(dǎo), 我們可以得出如下結(jié)論:百度是將分詞詞典里面每個(gè)詞條利用拼音標(biāo)注程序標(biāo)注成拼音,然后形成同音詞詞典,所以兩個(gè)詞典是同樣大的 ,而且這個(gè)詞典也隨著分詞詞典的增長而在不斷增長. 至于標(biāo)注過程中多音字百度沒有考慮,如果是多音字就標(biāo)注成多個(gè)發(fā)音組合,通過這種方式 形成同音詞詞典.這樣的同音詞詞典顯然包含著很多錯(cuò)誤.
最后一個(gè)問題:百度對于英文進(jìn)行拼寫檢查么?讓我們試試看,輸入查 詢"china",不錯(cuò),搜到不少結(jié)果,專注中文搜索的百度還能搜索到英文,真是意外的驚喜.變換一下查詢"chine",會(huì)更加意外驚喜的給我們提 示"china"嗎?百度提示的是: 吃呢持呢,原來是不小心觸發(fā)了百度的拼音搜索功能了.那么拼音搜索和中文檢查錯(cuò)誤是否采用同一套同音詞詞典 呢,讓我們來實(shí)驗(yàn)一下,搜索"rongji",百度提示" 榕基 溶劑 容積",OK,換個(gè)中文查詢"容機(jī)",百度提示" 榕基 溶劑容積",看來使用的是同一套 同音詞詞典.也就是說百度的中文糾錯(cuò)和拼音檢索使用的機(jī)制相同,中文糾錯(cuò)多了一道拼音注音的過程而已.難道這就是傳說中那個(gè)百度的"事實(shí) 上是一個(gè)無比強(qiáng)大的拼音輸入法"的拼音提示功能么?
最后讓我們總結(jié)歸納一下百度的拼寫檢查系統(tǒng):
后臺(tái)作業(yè): (1)前面的文 章我們說過,百度分詞使用的詞典至少包含兩個(gè)詞典一個(gè)是普通詞典,另外一個(gè)是專用詞典(專名等),百度利用拼音標(biāo)注程序依次掃描所有詞典中 的每個(gè)詞條,然后標(biāo)注拼音,如果是多音字則把多個(gè)音都標(biāo)上,比如"長大",會(huì)被標(biāo)注為"zhang da/chang da"兩個(gè)詞條.
(2)通過標(biāo)注完的 詞條,建立同音詞詞典,比如上面的"長大",會(huì)有兩個(gè)詞條: zhang daà長大" , chang daà長大.
(3)利用用戶查詢LOG頻率信息給予每個(gè) 中文詞條一個(gè)權(quán)重;
(4)OK,同音詞詞典建立完成了,當(dāng)然隨著分詞詞典的逐步擴(kuò)大,同音詞詞典也跟著同步擴(kuò)大;
拼寫 檢查:
(1)用戶輸入查詢,如果是多個(gè)子字符串,不作拼寫檢查;
(2)對于用戶查詢,先查分詞詞典,如果發(fā)現(xiàn)有這個(gè)單詞詞條,OK, 不作拼寫檢查;
(3)如果發(fā)現(xiàn)詞典里面不包含用戶查詢,啟動(dòng)拼寫檢查系統(tǒng);首先利用拼音標(biāo)注程序?qū)τ脩糨斎脒M(jìn)行拼音標(biāo)注;
(4)對于標(biāo)注好的拼音在同音詞詞典里面掃描,如果沒有發(fā)現(xiàn)則不作任何提示;
(5)如果發(fā)現(xiàn)有詞條,則按照順序輸出權(quán)重比較大的幾個(gè)提 示結(jié)果;
拼音提示:
(1)對于用戶輸入的拼音在同音詞詞典里面掃描,如果沒有發(fā)現(xiàn)則不作任何提示;
(2)如果 發(fā)現(xiàn)有詞條,則按照順序輸出權(quán)重比較大的幾個(gè)提示結(jié)果;