查詢處理以及分詞技術(shù)
隨著搜索經(jīng)濟(jì)的崛起,人們開(kāi)始越加關(guān)注全球各大搜索引擎的性能、技術(shù)和日流量。作為企業(yè),會(huì)根據(jù)搜索引擎的知名度以及日流量來(lái)選擇是否要投放廣告等;作為 普通網(wǎng)民,會(huì)根據(jù)搜索引擎的性能和技術(shù)來(lái)選擇自己喜歡的引擎查找資料;作為技術(shù)人員,會(huì)把有代表性的搜索引擎作為研究對(duì)象。 搜索引擎經(jīng)濟(jì)的崛起,又一次向人們證明了網(wǎng)絡(luò)所蘊(yùn)藏的巨大商機(jī)。網(wǎng)絡(luò)離開(kāi)了搜索將只剩下空洞雜亂的數(shù)據(jù),以及大量等待去費(fèi)力挖掘的金礦。
但是,如何設(shè)計(jì)一個(gè)高效的搜索引擎?我們可以以百度所采取的技術(shù)手段來(lái)探討如何設(shè)計(jì)一個(gè)實(shí)用的搜索引擎。搜索引擎涉及到許多技術(shù)點(diǎn),比如查詢處理,排序算法,頁(yè)面抓取算法,CACHE機(jī)制,ANTI-SPAM等等。這些技術(shù)細(xì)節(jié),作為商業(yè)公司的搜索引擎服務(wù)提供商比如百度,GOOGLE等是不會(huì)公之于眾的。我們可以將現(xiàn)有的搜索引擎看作一個(gè)黑盒,通過(guò)向黑盒提交輸入,判斷黑盒返回的輸出大致判斷黑盒里面不為人知的技術(shù)細(xì)節(jié)。
查詢處理與分詞是一個(gè)中文搜索引擎必不可少的工作,而百度作為一個(gè)典型的中文搜索引擎一直強(qiáng)調(diào)其“中文處理”方面具有其它搜索引擎所不具有的關(guān)鍵技術(shù)和優(yōu)勢(shì)。那么我們就來(lái)看看百度到底采用了哪些所謂的核心技術(shù)。
我們分兩個(gè)部分來(lái)講述:查詢處理/中文分詞。
一、查詢處理
用戶向搜索引擎提交查詢,搜索引擎一般在接受到用戶查詢后要做一些處理,然后在索引數(shù)據(jù)庫(kù)里面提取相關(guān)的信息。那么百度在接受到用戶查詢后做了些什么工作呢?
1、假設(shè)用戶提交了不只一個(gè)查詢串,比如“信息檢索 理論 工具”。那么搜索引擎首先做的是根據(jù)分隔符比如空格,標(biāo)點(diǎn)符號(hào),將查詢串分割成若干子查詢串,比如上面的查詢就會(huì)被解析為:《信息檢索,理論,工具》三個(gè)子字符串;這個(gè)道理簡(jiǎn)單,我們接著往下看。
2、假設(shè)提交的查詢有重復(fù)的內(nèi)容,搜索引擎怎么處理呢?比如查詢“理論 工具 理論”,百度是將重復(fù)的字符串當(dāng)作只出現(xiàn)過(guò)一次,也就是處理成等價(jià)的“理論 工具”,而GOOGLE顯然是沒(méi)有進(jìn)行歸并,而是將重復(fù)查詢子串的權(quán)重增大進(jìn)行處理。那么是如何得出這個(gè)結(jié)論的呢?我們可以將“理論 工具”提交給百度,返回341,000篇文檔,大致看看第一頁(yè)的返回內(nèi)容。OK。繼續(xù),我們提交查詢“理論 工具 理論”,在看看返回結(jié)果,仍然是那么多返回文檔,當(dāng)然這個(gè)不能說(shuō)明太多問(wèn)題,那看看第一頁(yè)返回結(jié)果的排序,看出來(lái)了嗎?順序完全沒(méi)有變化,而GOOGLE 則排序有些變動(dòng),這說(shuō)明百度是將重復(fù)的查詢歸并成一個(gè)處理的,而且字符串之間的先后出現(xiàn)順序基本不予考慮(GOOGLE是考慮了這個(gè)順序關(guān)系的)。
3、假設(shè)提交的中文查詢包含英文單詞,搜索引擎是怎么處理的?比如查詢”電影BT下載”,百度的方法是將中文字符串中的英文當(dāng)作一個(gè)整體保留,并以此為斷點(diǎn)將 中文切分開(kāi),這樣上述的查詢就切為《電影,BT,下載》,不論中間的英文是否一個(gè)字典里能查到的單詞也好,還是隨機(jī)的字符也好,都會(huì)當(dāng)作一個(gè) 整體來(lái)對(duì)待。至于為什么,你用查詢“電影dfdfdf下載”看看結(jié)果就知道了。當(dāng)然如果查詢中包含數(shù)字,也是如此辦理。
到目前為止,一切很簡(jiǎn)單,也很清楚,百度怎么處理用戶查詢的呢?歸納如下:首先根據(jù)分割符號(hào)將查詢分開(kāi),然后看看是否有重復(fù)的字符串,如果有,就拋棄多余的,只保留一個(gè),接著判斷是否有英文或者數(shù)字,如果有的話,把英文或者數(shù)字當(dāng)作一個(gè)整體保留并把前后的中文切開(kāi)。
接著該干什么呢?該考慮分詞的問(wèn)題了。
二、中文分詞
首先,講講百度的分詞時(shí)機(jī)或者條件問(wèn)題,是否是個(gè)中文字符串百度就拿來(lái)切一下呢?非也,要想被百度的分詞程序榮幸的切割一下也是要講條件的,哪能是個(gè)字符串就切割啊?你當(dāng)百度是賣鋸條的么?
那么什么樣的字符串才滿足被切割的條件呢?簡(jiǎn)單說(shuō)來(lái),如果字符串只包含小于等于3個(gè)中文字符的話,那就保留不動(dòng),當(dāng)字符串長(zhǎng)度大于4個(gè)中文字符的時(shí)候,百度的分詞程序才出馬大干快上,把這個(gè)字符串肢解掉。
怎么證明呢?我們向百度提交“電影下載”,看看返回結(jié)果中標(biāo)為紅字的地方,不難看出來(lái),查詢已經(jīng)被切割成《電影,下載》兩個(gè)單詞了,說(shuō)明分詞程序已經(jīng)開(kāi)工了,如果是比4個(gè)中文字符更長(zhǎng)的字符串,那分詞程序就更不客氣了,一定大卸八塊而后快。我們來(lái)看看三個(gè)字符的情況,提交查詢“當(dāng)然擇”,看起來(lái)這個(gè)查詢不倫不類,那是因?yàn)槲蚁M吹竭@個(gè)字符串被切分為《當(dāng)然,擇》,返回結(jié)果365篇相關(guān)頁(yè)面,翻到最后一頁(yè),發(fā)現(xiàn)標(biāo)紅的關(guān)鍵字都是” 當(dāng)然擇”連續(xù)出現(xiàn)的情況,好像沒(méi)有切分,但是還不確定,那么再提交人工分好的查詢“當(dāng)然 擇”看看,返回結(jié)果1,090,000篇,基本上可以確定沒(méi)有進(jìn)行分詞了,當(dāng)然另外一種解釋是:對(duì)于三個(gè)字符先切分,然后將切分后的結(jié)果當(dāng)作一個(gè)短語(yǔ)查 詢,這樣看到的效果和沒(méi)有切分是相似的。但是我傾向于判斷百度對(duì)于少于3個(gè)字符的串沒(méi)有切分,奧卡姆不是說(shuō)了么“如無(wú)必要,勿增實(shí)體”,干嗎做無(wú)用功呢。 那么如果沒(méi)有切分,會(huì)有一個(gè)隨之而來(lái)的問(wèn)題,怎么從索引庫(kù)里面提取未切分的字符串呢?這牽扯到索引的問(wèn)題,我覺(jué)得百度應(yīng)該采取了兩套索引機(jī)制,一種是按照 單詞索引,一種是按照N-GRAM索引,至于索引的具體問(wèn)題,以后在詳細(xì)論述。
下面我們看看百度是采取的何種分詞算法,現(xiàn)在分詞算法已經(jīng)算是比較成熟了,有簡(jiǎn)單的有復(fù)雜的,比如正向最大匹配,反向最大匹配,雙向最大匹配,語(yǔ)言模型方 法,最短路徑算法等等,有興趣的可以用GOOGLE去搜索一下以增加理解。這里就不展開(kāi)說(shuō)了。但是要記住一點(diǎn)的是:判斷一個(gè)分詞系統(tǒng)好不好,關(guān)鍵看兩點(diǎn), 一個(gè)是消除歧義能力;一個(gè)是詞典未登錄詞的識(shí)別比如人名,地名,機(jī)構(gòu)名等。
那么百度用的是什么方法?我的判斷是用雙向最大匹配算法。至于怎么推理得出的,讓我們一步步來(lái)看。當(dāng)然,這里首先有個(gè)假設(shè),百度不會(huì)采取比較復(fù)雜的算法,因?yàn)榭紤]到速度問(wèn)題。
我們提交一個(gè)查詢“毛澤東北京華煙云”,又一個(gè)不知所云的查詢,盡管不知所云但是自有它的道理,我想看看百度的分詞是如何消歧以及是否有詞典未登錄詞的識(shí) 別的功能,如果是正向最大匹配算法的話,那么輸出應(yīng)該是:”毛澤東/北京/華/煙云”,如果是反向最大匹配算法的話,那么輸出應(yīng)該是:”毛/澤/東北/京 華煙云”,我們看看百度的分詞結(jié)果:”毛澤東/北/京華煙云”,一個(gè)很奇怪的輸出,跟我們的期望相差較多,但是從中我們可以獲得如下信息:百度分詞可以識(shí) 別人名,也可以識(shí)別”京華煙云”,這說(shuō)明有詞典未登錄詞的識(shí)別的功能,我們可以假設(shè)分詞過(guò)程分為兩個(gè)階段:第一階段,先查找一個(gè)特殊詞典,這個(gè)詞典包含一 些人名,部分地名以及一些普通詞典沒(méi)有的新詞,這樣首先將”毛澤東”解析出來(lái),剩下了字符串”北京華煙云”,而”北/京華煙云”,可以看作是反向最大匹配 的分詞結(jié)果。這樣基本說(shuō)得通。為了證明這一點(diǎn),我們提交查詢”發(fā)毛澤東北”,我們期望兩種分詞結(jié)果,一個(gè)是正向最大匹配《發(fā)毛,澤,東北》, 一個(gè)是上述假設(shè)的結(jié)果《發(fā),毛澤東,北》,事實(shí)上百度輸出是第二種情況,這樣基本能確定百度分詞采取了至少兩個(gè)詞典,一個(gè)是普通詞典,一個(gè)是 專用詞典(人名等)。而且是專用詞典先切分,然后將剩余的片斷交由普通詞典來(lái)切分。
繼續(xù)測(cè)驗(yàn),提交查詢“古巴比倫理”,如果是正向最大匹配,那么結(jié)果應(yīng)該是《古巴比倫,理》,如果是反向最大匹配,那么結(jié)果應(yīng)該是《古 巴,比,倫理》,事實(shí)上百度的分詞結(jié)果是《古巴比倫,理》,從這個(gè)例子看,好像用了正向最大匹配算法;此外還有一些例子表明好像是使用 正向最大匹配的;但是且慢,我們看這個(gè)查詢“北京華煙云”,正向最大匹配期望的結(jié)果是《北京,華,煙云》,而反向最大匹配期望的結(jié)果是 《北,京華煙云》,事實(shí)上百度輸出的是后者,這說(shuō)明可能采用的反向最大匹配;從這點(diǎn)我們可以猜測(cè)百度采用的是雙向最大匹配分詞算法,如果正向 和反向匹配分詞結(jié)果一致當(dāng)然好辦,直接輸出即可;但是如果兩者不一致,正向匹配一種結(jié)果,反向匹配一種結(jié)果,此時(shí)該如何是好呢?從上面兩個(gè)例子看,在這種 情況下,百度采取最短路徑方法,也就是切分的片斷越少越好,比如《古巴,比,倫理》和《古巴比倫,理》相比選擇后者,《北 京,華,煙云》和《北,京華煙云》相比選擇后者。還有類似的一些例子,這樣基本可以解釋這些輸出結(jié)果。
但是仍然遺留的問(wèn)題是:如果正向反向分詞不一致,而且最短路徑也相同,那怎么辦?輸出正向的還是反向的結(jié)果?我們?cè)賮?lái)看一個(gè)例子。提交查詢“遙遠(yuǎn)古古巴比 倫”,這個(gè)查詢被百度切分為《遙遠(yuǎn),古古,巴比倫》,說(shuō)明詞典里面有”巴比倫”,但是是否有”古巴比倫”這個(gè)詞匯不確定,此時(shí)看不出是正向切 分還是反向切分得出的結(jié)果,換查詢?yōu)椤斑b遠(yuǎn)古巴比倫”,此時(shí)被切分為“遙遠(yuǎn)/古巴比倫”,這說(shuō)明詞典里面有”古巴比倫”這個(gè)詞匯,這說(shuō)明了“遙遠(yuǎn)古古巴比 倫”是正向最大匹配的結(jié)果。那為什么“遙遠(yuǎn)古古巴比倫”不會(huì)被反向切分為”遙/遠(yuǎn)古/古巴比倫”呢,百度的可能選擇是這種情況下選擇單字少的那組切分結(jié) 果。
當(dāng)然還可以繼續(xù)追問(wèn):如果切分后單字也一樣多,那怎么辦?最后看一個(gè)例子,查詢“王強(qiáng)大小:”,百度將其切分為“王/強(qiáng)大/小”,是正向切分的結(jié)果,如果是反向的會(huì)被切分為“王/強(qiáng)/大小”,這說(shuō)明有歧義而且單字也相同則選擇正向切分結(jié)果。
OK,看到這里可能頭已經(jīng)有些暈了,最后總結(jié)一下百度的分詞算法,當(dāng)然里面還是有猜測(cè)的成分,算法如下:
首先查詢專用詞典(人名,部分地名等),將專有名稱切出,剩下的部分采取雙向分詞策略,如果兩者切分結(jié)果相同,說(shuō)明沒(méi)有歧義,直接輸出分詞結(jié)果。如果不一 致,則輸出最短路徑的那個(gè)結(jié)果,如果長(zhǎng)度相同,則選擇單字詞少的那一組切分結(jié)果。如果單字也相同,則選擇正向分詞結(jié)果。
百度一直宣傳自己在中文處理方面的優(yōu)勢(shì),從上面看,分詞算法并無(wú)特殊之處,消歧效果并不理想,即使百度采取比上述分詞算法復(fù)雜些的算法也難以說(shuō)成是優(yōu)勢(shì), 如果說(shuō)百度有優(yōu)勢(shì)的話,唯一的優(yōu)勢(shì)就是那個(gè)很大的專用詞典,這個(gè)專用詞典登錄了人名(比如大長(zhǎng)今),稱謂(比如老太太),部分地名(比如阿聯(lián)酋等),估計(jì) 百度采用學(xué)術(shù)界公布的比較新的命名實(shí)體識(shí)別算法從語(yǔ)料庫(kù)里面不斷識(shí)別出詞典未登錄詞,逐漸擴(kuò)充這個(gè)專門詞典。如果這就是優(yōu)勢(shì)的話,那么這個(gè)優(yōu)勢(shì)能夠保持多久就是個(gè)很明顯的問(wèn)題。
Spelling Checker拼寫檢查錯(cuò)誤提示(以及拼音提示功能)
拼寫檢查錯(cuò)誤提示是搜索引擎都具備的一個(gè)功能,也就是說(shuō)用戶提交查詢 給搜索引擎,搜索引擎檢查看是否用戶輸入的拼寫有錯(cuò)誤,對(duì)于中文用戶來(lái)說(shuō)一般造成的錯(cuò)誤是輸入法造成的錯(cuò)誤。那么我們就來(lái)分析看看百度是 怎么實(shí)現(xiàn)這一功能的。
我們分析拼寫檢查系統(tǒng)關(guān)注以下幾個(gè)問(wèn)題:
(1)系統(tǒng)如何判斷用戶的輸入是有可能發(fā)生錯(cuò)誤的查詢呢?
(2)如果判斷是可能錯(cuò)誤的查詢輸入,如何提示正確的詞匯呢?
那么百度是如何做的呢?百度判斷用戶輸入是否錯(cuò)誤的 標(biāo)準(zhǔn),我覺(jué)得應(yīng)該是查字典,如果發(fā)現(xiàn)字典里面不包含這個(gè)詞匯,那么很有可能是個(gè)錯(cuò)誤的輸入,此時(shí)啟動(dòng)錯(cuò)誤提示功能,這個(gè)很好判斷,因?yàn)槿绻?是一個(gè)正常詞匯的話,百度一般不會(huì)有錯(cuò)誤提示,而你故意輸入一個(gè)詞典不可能包含的所謂詞匯,此時(shí)百度一般會(huì)提示你正確的檢索詞匯。
那么百度是怎么提示正確詞匯的呢?很明顯是通過(guò)拼音的方式,比如我輸入查詢“ 制才”,百度提供的提示詞匯為: “:制裁 質(zhì)材 紙材“,都是同 音字。所以百度必然維持著一個(gè)同音詞詞典,里面保留著同音詞信息,比如可能包含著下面這條詞條: “ zhi cai à制裁,質(zhì)材,紙材”,另外還有一 個(gè)標(biāo)注拼音程序,現(xiàn)在能夠看到的基本流程是: 用戶輸入“ 制才”,查詞典,發(fā)現(xiàn)沒(méi)有這個(gè)詞匯,OK,啟動(dòng)標(biāo)注拼音程序,將“ 制才”標(biāo)注為拼音“zhi cai”,然后查找同音詞詞典,發(fā)現(xiàn)同音詞“ 制裁,質(zhì)材,紙材”,那么提示用戶可能的正確拼寫。
整體流程看起來(lái)很簡(jiǎn)單,但是還有一些遺留 的小問(wèn)題,比如是否將詞表里面所有同音詞都作為用戶的提示信息呢?比如某個(gè)拼音有10個(gè)同音詞,是否都輸出呢?百度并沒(méi)有將所有同音詞都輸 出而是選擇一定篩選標(biāo)準(zhǔn),選擇其中幾個(gè)輸出。怎么證明這一點(diǎn)?我們看看拼音“l(fā)iu li”的同音詞,紫光輸入法提示同音詞匯有“ 流麗 流離 琉璃 流利”4個(gè),我們看看百度返回幾個(gè),輸入“流厲”作為查詢,這里是故意輸入一個(gè)詞典不包含的詞匯,這樣百度的拼寫檢查才開(kāi)始工作,百度提示: “ 琉璃劉麗 劉莉 ”,這說(shuō)明什么?說(shuō)明不是所有同音詞都輸出,而是選擇輸出,那么選擇的標(biāo)準(zhǔn)是什么?我能夠猜測(cè)到的方法是對(duì)于用戶查詢LOG進(jìn)行 統(tǒng)計(jì),提取用戶查詢次數(shù)多的那些同音詞輸出,如果是這樣的話,上面的例子說(shuō)明用戶搜索“琉璃”次數(shù)比其它的都要高些,次之是“ 劉麗”,再次是“ 劉莉”,看來(lái)大家都喜歡查詢自己或者認(rèn)識(shí)的人的名字。
另外一個(gè)小問(wèn)題:同音詞詞典包含2字詞,3字詞,那么是否包含4字詞以及更長(zhǎng)的詞 條?是否包含一字詞? 這里一字詞好回答,不用測(cè)試也能知道肯定不包含,因?yàn)槟爿斎胍粋€(gè)字,誰(shuí)知道是否是錯(cuò)誤的呢?反正只要是漢字就能在詞表 里面找到,所以沒(méi)有判斷依據(jù)。二字詞是包含的,上面有例子,三字詞也包含,比如查詢 “中城藥”百度錯(cuò)誤提示:“中成藥”,修改查詢?yōu)椤爸爻撬帯保€ 是提示“中成藥” ,再次修改查詢 “重城要”,百度依然提示“中成藥”。 那么4字詞匯呢?
百度還是會(huì)給你提示的,下面是個(gè)例子:
輸入:靜華煙云 提示 京華煙云
輸入:靜話煙云 提示 京華煙云
輸入:靜話閻暈 提示 京華煙云
那么更長(zhǎng)的詞匯是否提 示呢?也提示,比如我輸入: “落花世界有風(fēng)軍”,這個(gè)查詢是什么意思,估計(jì)讀過(guò)古詩(shī)的都知道,看看百度的提示“落花時(shí)節(jié)又逢君”,這說(shuō)明什么?說(shuō) 明同音詞詞典包含不同長(zhǎng)度的同音詞信息,另外也說(shuō)明了百度的核心中文處理技術(shù),也就是那個(gè)詞典,還真挺大的。
但是,如果用戶輸入的 查詢由兩個(gè)或者兩個(gè)以上子字符串構(gòu)成,那么百度的錯(cuò)誤提示功能就罷工了,比如輸入查詢“哀體”,百度提示“艾提 挨踢”,但是。輸入為 “我 哀體 ”,則沒(méi)有任何錯(cuò)誤提示。
還有一個(gè)比較重要的問(wèn)題:如果漢字是多音字那么怎么處理?百度呢比較偷懶,它根本就沒(méi)有對(duì)多音字做處理。我 們來(lái)看看百度的一個(gè)標(biāo)注拼音的錯(cuò)誤,在看這個(gè)錯(cuò)誤前先看看對(duì)于多音字百度是怎么提示錯(cuò)誤的,我們輸入查詢“俱長(zhǎng)”,百度提示“劇場(chǎng) 局長(zhǎng)”, “俱長(zhǎng)“的拼音有兩個(gè):”ju zhang /ju chang“ ,可見(jiàn)如果是多音字則幾種情況都提示。.現(xiàn)在我們來(lái)看看錯(cuò)誤的情況, 我們輸入查詢”劇常“,百度 提示”:劇場(chǎng)局長(zhǎng)“,提示為”劇場(chǎng)“當(dāng)然好解釋,因?yàn)槭峭糇郑菫槭裁?”局長(zhǎng)“也會(huì)被提示呢?這說(shuō)明百度的同音字詞典有錯(cuò)誤,說(shuō)明在”ju chang“這個(gè)詞條里面包含”局長(zhǎng)“這個(gè)錯(cuò)誤的同音詞。讓我們順藤摸瓜,這個(gè)錯(cuò)誤又說(shuō)明什么問(wèn)題呢?說(shuō)明百度的同音詞典是自動(dòng)生成的,而且沒(méi)有 人工校對(duì)。還說(shuō)明在自動(dòng)生成同音詞典的過(guò)程中,百度不是根據(jù)對(duì)一篇文章標(biāo)注拼音然后在抽取詞匯和對(duì)應(yīng)的拼音信息獲得的,而是完全按照某個(gè) 詞典的詞條來(lái)標(biāo)注音節(jié)的,所以對(duì)于多音字造成的錯(cuò)誤無(wú)法識(shí)別出來(lái),如果是對(duì)篇章進(jìn)行拼音標(biāo)注,可能就不會(huì)出現(xiàn)這種很容易發(fā)現(xiàn)的錯(cuò)誤標(biāo)注。 當(dāng)然還有另外一種解釋,就是”局長(zhǎng)“是故意被百度提示出來(lái)可能的正確提示詞匯,因?yàn)榭紤]到南方人”zh“和 ”ch“等前后鼻音分不清么,那么是這 樣的么?我們繼續(xù)測(cè)試到底是何種情況。是百度有錯(cuò)誤還是這是百度的先進(jìn)的算法?
我們考慮詞匯”長(zhǎng)大 “,故意錯(cuò)誤輸入為”贓大“,如果 百度考慮到了前后鼻音的問(wèn)題,那么應(yīng)該會(huì)提示”長(zhǎng)大“,但是百度提示是”藏大“。這說(shuō)明什么?說(shuō)明百度并沒(méi)有考慮前后鼻音問(wèn)題,根本就是系統(tǒng)錯(cuò) 誤。 我們輸入查詢”懸賞“,故意將之錯(cuò)誤輸入為”懸桑“,沒(méi)有錯(cuò)誤提示,說(shuō)明確實(shí)沒(méi)有考慮這種情況。前鼻音沒(méi)有考慮,那么后鼻音考慮了么,我們 輸入”:經(jīng)常“,故意改為后鼻音 ”經(jīng)纏“,百度提示為”經(jīng)產(chǎn) 經(jīng)懺“,還是沒(méi)有考慮后鼻音。這基本可以確定是百度系統(tǒng)的錯(cuò)誤導(dǎo)致。
根據(jù)以 上推導(dǎo), 我們可以得出如下結(jié)論:百度是將分詞詞典里面每個(gè)詞條利用拼音標(biāo)注程序標(biāo)注成拼音,然后形成同音詞詞典,所以兩個(gè)詞典是同樣大的 ,而且這個(gè)詞典也隨著分詞詞典的增長(zhǎng)而在不斷增長(zhǎng)。 至于標(biāo)注過(guò)程中多音字百度沒(méi)有考慮,如果是多音字就標(biāo)注成多個(gè)發(fā)音組合,通過(guò)這種方式 形成同音詞詞典。這樣的同音詞詞典顯然包含著很多錯(cuò)誤。
最后一個(gè)問(wèn)題:百度對(duì)于英文進(jìn)行拼寫檢查么?讓我們?cè)囋嚳矗斎氩?詢”china“,不錯(cuò),搜到不少結(jié)果,專注中文搜索的百度還能搜索到英文,真是意外的驚喜。變換一下查詢”chine“,會(huì)更加意外驚喜的給我們提 示”china“嗎?百度提示的是: 吃呢持呢,原來(lái)是不小心觸發(fā)了百度的拼音搜索功能了。那么拼音搜索和中文檢查錯(cuò)誤是否采用同一套同音詞詞典 呢,讓我們來(lái)實(shí)驗(yàn)一下,搜索”rongji“,百度提示” 榕基 溶劑 容積“,OK,換個(gè)中文查詢”容機(jī)“,百度提示” 榕基 溶劑容積“,看來(lái)使用的是同一套 同音詞詞典。也就是說(shuō)百度的中文糾錯(cuò)和拼音檢索使用的機(jī)制相同,中文糾錯(cuò)多了一道拼音注音的過(guò)程而已。難道這就是傳說(shuō)中那個(gè)百度的”事實(shí) 上是一個(gè)無(wú)比強(qiáng)大的拼音輸入法“的拼音提示功能么?
最后讓我們總結(jié)歸納一下百度的拼寫檢查系統(tǒng):
后臺(tái)作業(yè):
(1)前面的文 章我們說(shuō)過(guò),百度分詞使用的詞典至少包含兩個(gè)詞典一個(gè)是普通詞典,另外一個(gè)是專用詞典(專名等),百度利用拼音標(biāo)注程序依次掃描所有詞典中 的每個(gè)詞條,然后標(biāo)注拼音,如果是多音字則把多個(gè)音都標(biāo)上,比如”長(zhǎng)大“,會(huì)被標(biāo)注為”zhang da/chang da“兩個(gè)詞條。
(2)通過(guò)標(biāo)注完的 詞條,建立同音詞詞典,比如上面的”長(zhǎng)大“,會(huì)有兩個(gè)詞條: zhang daà長(zhǎng)大” , chang daà長(zhǎng)大。
(3)利用用戶查詢LOG頻率信息給予每個(gè) 中文詞條一個(gè)權(quán)重;
(4)OK,同音詞詞典建立完成了,當(dāng)然隨著分詞詞典的逐步擴(kuò)大,同音詞詞典也跟著同步擴(kuò)大;
拼寫 檢查:
(1)用戶輸入查詢,如果是多個(gè)子字符串,不作拼寫檢查;
(2)對(duì)于用戶查詢,先查分詞詞典,如果發(fā)現(xiàn)有這個(gè)單詞詞條,OK, 不作拼寫檢查;
(3)如果發(fā)現(xiàn)詞典里面不包含用戶查詢,啟動(dòng)拼寫檢查系統(tǒng);首先利用拼音標(biāo)注程序?qū)τ脩糨斎脒M(jìn)行拼音標(biāo)注;
(4)對(duì)于標(biāo)注好的拼音在同音詞詞典里面掃描,如果沒(méi)有發(fā)現(xiàn)則不作任何提示;
(5)如果發(fā)現(xiàn)有詞條,則按照順序輸出權(quán)重比較大的幾個(gè)提 示結(jié)果;
拼音提示:
(1)對(duì)于用戶輸入的拼音在同音詞詞典里面掃描,如果沒(méi)有發(fā)現(xiàn)則不作任何提示;
(2)如果 發(fā)現(xiàn)有詞條,則按照順序輸出權(quán)重比較大的幾個(gè)提示結(jié)果;
上面說(shuō)過(guò),經(jīng)過(guò)分析得出百度的分詞系統(tǒng)采用雙向最大匹配分詞,但是后來(lái)發(fā)現(xiàn)推理過(guò)程中存在一個(gè)漏洞,而且推導(dǎo)出來(lái)的百度分詞算法步驟還是過(guò)于繁瑣,所以進(jìn)一步進(jìn)行分析,看看是否前面的推導(dǎo)有錯(cuò)誤。
那么以前的分析有什么漏洞呢?我們推導(dǎo)百度分詞有反向最大匹配的依據(jù)是百度將“北京華煙云”分詞為《北,京華煙云》,從這里看好像采用了反向最大匹配,因?yàn)檎蜃畲笃ヅ涞慕Y(jié)果應(yīng)該是《北京,華,煙云》,但是由此就推論說(shuō)百度采用了雙向最大匹配還是太倉(cāng)促了,前面文章我們也講過(guò),百度有兩個(gè)詞典,一個(gè)普通詞典,一個(gè)專有詞典,而且是專有詞典的詞匯先切分,然后將剩余片斷交給普通詞典去切分。所以上面的“北京華煙云”之所以被切分成《北,京華煙云》,另外一個(gè)可能是:京華煙云這個(gè)詞匯是在專有詞典里面存儲(chǔ)的,所以先分析,這樣得出“京華煙云”,剩下“北”,沒(méi)什么好切分的,所以輸出《北,京華煙云》。
這里只是假設(shè),那么是否確實(shí)“京華煙云”在專有詞典呢?我們?cè)倏匆粋€(gè)例子“山東北京華煙云”,百度切分的結(jié)果是《山東,北,京華煙云》,如果“京華煙云”在普通詞典,如果是反向切分,那么結(jié)果應(yīng)該是《山,東北,京華煙云》,如果是正向切分應(yīng)該是《山東,北京,華,煙云》,無(wú)論如何都分不出《山東,北,京華煙云》。這說(shuō)明什么?說(shuō)明“京華煙云”是在那個(gè)專有詞典,所以先切分出“京華煙云”,然后剩下的“山東北”交由普通詞典切分,明顯是正向最大匹配的結(jié)果輸出《山東,北》。當(dāng)然按照我們?cè)诘谝黄恼碌乃惴ㄍ茖?dǎo)“山東北”的切分也會(huì)得出《山東,北》的結(jié)論,但是明顯比正向最大匹配多幾個(gè)判斷步驟,既然效果一樣,另外一個(gè)更加簡(jiǎn)潔的方法也能說(shuō)得通,那當(dāng)然選擇簡(jiǎn)便的方法了。所以初步判斷百度采取的是正向最大匹配。
我們繼續(xù)測(cè)試采用何種分詞算法,為了減少專有詞典首先分詞造成的影響,那么查詢里面不能出現(xiàn)相對(duì)特殊的詞匯,構(gòu)筑查詢“天才能量級(jí)”,這里應(yīng)該沒(méi)有專有詞典出現(xiàn)過(guò)的詞匯,百度切分為《天才,能量,級(jí)》,看來(lái)是正向最大匹配的結(jié)果。另外,如果所有查詢?cè)~匯都出現(xiàn)在專有詞典,那么采取的是何種方法?這樣首先就得保證詞匯都出現(xiàn)在專有詞典,這么保證這一點(diǎn)呢?我們構(gòu)造查詢“鋪陳曉東方”,百度切分為《鋪,陳曉東,方》,可以看出“陳曉東”是在專有詞典的所以先切分出來(lái)。另外一個(gè)例子 “山東京城”,百度切分為《山東,京城》,說(shuō)明“東京”是在普通詞典的.OK,構(gòu)造查詢“陳曉東京華煙云”,通過(guò)前面分析可以看出兩個(gè)詞匯都在專有詞典里面,百度切分為《陳曉東,京華煙云》,說(shuō)明對(duì)于專有詞典詞匯也是采取正向最大匹配或者雙向最大匹配。那么使用反向最大匹配了嗎?構(gòu)造查詢例子“陳曉東方不敗”,首先我們肯定“陳曉東”和“東方不敗”都是在專有詞典出現(xiàn)的,如果是正向切分,那么應(yīng)該是《陳曉東,方,不敗》或者《陳曉東,方,不,敗》如果是反向切分則是《陳,曉,東方不敗》,可以看出百度的切分是《陳曉東,方,不敗》或者《陳曉東,方,不,敗》,說(shuō)明采用的是正向最大匹配。通過(guò)分析,百度的詞典不包含“不敗”這個(gè)單詞,所以實(shí)際上百度的切分結(jié)果是《陳曉東,方,不,敗》,很明顯這和我們以前推導(dǎo)的算法是有矛盾的,所以以前的分析算法確實(shí)有問(wèn)題,所以結(jié)論是百度采取的是正向最大匹配算法。
重新歸納一下百度的分詞系統(tǒng):首先用專有詞典采用最大正向匹配分詞,切分出部分結(jié)果,剩余沒(méi)有切分交給普通詞典,同樣采取正向最大匹配分詞,最后輸出結(jié)果。
另外,GOOGLE也是采用正向最大匹配分詞算法,不過(guò)好像沒(méi)有那個(gè)專用詞典,所以很多專名都被切碎了。
從這點(diǎn)講,GOOGLE在中文詞典構(gòu)建上比百度差些,還需要加把子力氣才行,不過(guò)這也不是什么多難的