百度分詞算法詳解第1/2頁
本文通過搜索結(jié)果歸納分析+切詞通用算法分析的方式對(duì)百度預(yù)處理階段的查詢處理和中文分詞兩項(xiàng)技術(shù)進(jìn)行了闡述、總結(jié),如果你對(duì)數(shù)據(jù)結(jié)構(gòu)、算法有一定了解的話,理解起來會(huì)相對(duì)容易些;個(gè)人感覺,得出正向最大匹配算法不夠準(zhǔn)確,無論是專用詞典還是普通詞典里的詞,都是有不同權(quán)重的,這根搜索頻率應(yīng)該有一定關(guān)系,基于這點(diǎn),在出現(xiàn)多個(gè)專用詞典里的詞時(shí),是需要采用雙向最大匹配算法來檢測(cè)到底哪一個(gè)專有詞匯應(yīng)該先被切出來,當(dāng)然,這是個(gè)人猜想,有待考究。
理解分詞技術(shù)對(duì)SEO工作具有極大意義,可以從科學(xué)的角度來分析關(guān)鍵詞,并構(gòu)想關(guān)鍵詞部署策略;如果正向最大匹配算法的結(jié)論是正確的,那基本上可以斷定,切詞后的分詞的權(quán)重是按照正向排序的
我還想搞明白的是專用詞典和普通詞典,哪一個(gè)權(quán)重會(huì)更高?
以下為轉(zhuǎn)載的原文:
查詢處理以及分詞技術(shù)
隨著搜索經(jīng)濟(jì)的崛起,人們開始越加關(guān)注全球各大搜索引擎的性能、技術(shù)和日流量。作為企業(yè),會(huì)根據(jù)搜索引擎的知名度以及日流量來選擇是否要投放廣告等;作為普通網(wǎng)民,會(huì)根據(jù)搜索引擎的性能和技術(shù)來選擇自己喜歡的引擎查找資料;作為技術(shù)人員,會(huì)把有代表性的搜索引擎作為研究對(duì)象。搜索引擎經(jīng)濟(jì)的崛起,又一次向人們證明了網(wǎng)絡(luò)所蘊(yùn)藏的巨大商機(jī)。網(wǎng)絡(luò)離開了搜索將只剩下空洞雜亂的數(shù)據(jù),以及大量等待去費(fèi)力挖掘的金礦。
但是,如何設(shè)計(jì)一個(gè)高效的搜索引擎?我們可以以百度所采取的技術(shù)手段來探討如何設(shè)計(jì)一個(gè)實(shí)用的搜索引擎。搜索引擎涉及到許多技術(shù)點(diǎn),比如查詢處理,排序算法,頁面抓取算法,CACHE機(jī)制,ANTI-SPAM等等。這些技術(shù)細(xì)節(jié),作為商業(yè)公司的搜索引擎服務(wù)提供商比如百度,GOOGLE等是不會(huì)公之于眾的。我們可以將現(xiàn)有的搜索引擎看作一個(gè)黑盒,通過向黑盒提交輸入,判斷黑盒返回的輸出大致判斷黑盒里面不為人知的技術(shù)細(xì)節(jié)。
查詢處理與分詞是一個(gè)中文搜索引擎必不可少的工作,而百度作為一個(gè)典型的中文搜索引擎一直強(qiáng)調(diào)其“中文處理”方面具有其它搜索引擎所不具有的關(guān)鍵技術(shù)和優(yōu)勢(shì)。那么我們就來看看百度到底采用了哪些所謂的核心技術(shù)。
我們分兩個(gè)部分來講述:查詢處理/中文分詞。
一、查詢處理
用戶向搜索引擎提交查詢,搜索引擎一般在接受到用戶查詢后要做一些處理,然后在索引數(shù)據(jù)庫里面提取相關(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)過一次,也就是處理成等價(jià)的“理論工具”,而GOOGLE顯然是沒有進(jìn)行歸并,而是將重復(fù)查詢子串的權(quán)重增大進(jìn)行處理。那么是如何得出這個(gè)結(jié)論的呢?我們可以將“理論工具”提交給百度,返回341,000篇文檔,大致看看第一頁的返回內(nèi)容。
OK。繼續(xù),我們提交查詢“理論工具理論”,在看看返回結(jié)果,仍然是那么多返回文檔,當(dāng)然這個(gè)不能說明太多問題,那看看第一頁返回結(jié)果的排序,看出來了嗎?順序完全沒有變化,而 GOOGLE 則排序有些變動(dòng),這說明百度是將重復(fù)的查詢歸并成一個(gè)處理的,而且字符串之間的先后出現(xiàn)順序基本不予考慮(GOOGLE是考慮了這個(gè)順序關(guān)系的)。
3、假設(shè)提交的中文查詢包含英文單詞,搜索引擎是怎么處理的?比如查詢”電影BT下載”,百度的方法是將中文字符串中的英文當(dāng)作一個(gè)整體保留,并以此為斷點(diǎn)將中文切分開,這樣上述的查詢就切為,不論中間的英文是否一個(gè)字典里能查到的單詞也好,還是隨機(jī)的字符也好,都會(huì)當(dāng)作一個(gè)整體來對(duì)待。至于為什么,你用查詢 “電影dfdfdf下載”看看結(jié)果就知道了。當(dāng)然如果查詢中包含數(shù)字,也是如此辦理。
到目前為止,一切很簡(jiǎn)單,也很清楚,百度怎么處理用戶查詢的呢?歸納如下:首先根據(jù)分割符號(hào)將查詢分開,然后看看是否有重復(fù)的字符串,如果有,就拋棄多余的,只保留一個(gè),接著判斷是否有英文或者數(shù)字,如果有的話,把英文或者數(shù)字當(dāng)作一個(gè)整體保留并把前后的中文切開。
接著該干什么呢?該考慮分詞的問題了。
二、中文分詞
首先,講講百度的分詞時(shí)機(jī)或者條件問題,是否是個(gè)中文字符串百度就拿來切一下呢?非也,要想被百度的分詞程序榮幸的切割一下也是要講條件的,哪能是個(gè)字符串就切割啊?你當(dāng)百度是賣鋸條的么?
那么什么樣的字符串才滿足被切割的條件呢?簡(jiǎn)單說來,如果字符串只包含小于等于3個(gè)中文字符的話,那就保留不動(dòng),當(dāng)字符串長(zhǎng)度大于4個(gè)中文字符的時(shí)候,百度的分詞程序才出馬大干快上,把這個(gè)字符串肢解掉。
怎么證明呢?我們向百度提交“電影下載”,看看返回結(jié)果中標(biāo)為紅字的地方,不難看出來,查詢已經(jīng)被切割成兩個(gè)單詞了,說明分詞程序已經(jīng)開工了,如果是比4個(gè)中文字符更長(zhǎng)的字符串,那分詞程序就更不客氣了,一定大卸八塊而后快。我們來看看三個(gè)字符的情況,提交查詢“當(dāng)然擇”,看起來這個(gè)查詢不倫不類,那是因?yàn)槲蚁M吹竭@個(gè)字符串被切分為,返回結(jié)果365篇相關(guān)頁面,翻到最后一頁,發(fā)現(xiàn)標(biāo)紅的關(guān)鍵字都是” 當(dāng)然擇”連續(xù)出現(xiàn)的情況,好像沒有切分,但是還不確定,那么再提交人工分好的查詢“當(dāng)然擇”看看,返回結(jié)果1,090,000篇,基本上可以確定沒有進(jìn)行分詞了,當(dāng)然另外一種解釋是:對(duì)于三個(gè)字符先切分,然后將切分后的結(jié)果當(dāng)作一個(gè)短語查詢,這樣看到的效果和沒有切分是相似的。
但是我傾向于判斷百度對(duì)于少于3個(gè)字符的串沒有切分,奧卡姆不是說了么“如無必要,勿增實(shí)體”,干嗎做無用功呢。那么如果沒有切分,會(huì)有一個(gè)隨之而來的問題,怎么從索引庫里面提取未切分的字符串呢?這牽扯到索引的問題,我覺得百度應(yīng)該采取了兩套索引機(jī)制,一種是按照單詞索引,一種是按照N-GRAM索引,至于索引的具體問題,以后在詳細(xì)論述。
下面我們看看百度是采取的何種分詞算法,現(xiàn)在分詞算法已經(jīng)算是比較成熟了,有簡(jiǎn)單的有復(fù)雜的,比如正向最大匹配,反向最大匹配,雙向最大匹配,語言模型方法,最短路徑算法等等,有興趣的可以用GOOGLE去搜索一下以增加理解。這里就不展開說了。但是要記住一點(diǎn)的是:判斷一個(gè)分詞系統(tǒng)好不好,關(guān)鍵看兩點(diǎn),一個(gè)是消除歧義能力;一個(gè)是詞典未登錄詞的識(shí)別比如人名,地名,機(jī)構(gòu)名等。
那么百度用的是什么方法?我的判斷是用雙向最大匹配算法。至于怎么推理得出的,讓我們一步步來看。當(dāng)然,這里首先有個(gè)假設(shè),百度不會(huì)采取比較復(fù)雜的算法,因?yàn)榭紤]到速度問題。
我們提交一個(gè)查詢“北京華煙云”,又一個(gè)不知所云的查詢,盡管不知所云但是自有它的道理,我想看看百度的分詞是如何消歧以及是否有詞典未登錄詞的識(shí)別的功能,如果是正向最大匹配算法的話,那么輸出應(yīng)該是:”/北京/華/煙云”,如果是反向最大匹配算法的話,那么輸出應(yīng)該是:”毛/澤/東北/京華煙云”,我們看看百度的分詞結(jié)果:”/北/京華煙云”,一個(gè)很奇怪的輸出,跟我們的期望相差較多,但是從中我們可以獲得如下信息:百度分詞可以識(shí)別人名,也可以識(shí)別”京華煙云”,這說明有詞典未登錄詞的識(shí)別的功能,我們可以假設(shè)分詞過程分為兩個(gè)階段:第一階段,先查找一個(gè)特殊詞典,這個(gè)詞典包含一些人名,部分地名以及一些普通詞典沒有的新詞,這樣首先將””解析出來,剩下了字符串”北京華煙云”,而”北/京華煙云”,可以看作是反向最大匹配的分詞結(jié)果。這樣基本說得通。為了證明這一點(diǎn),我們提交查詢,我們期望兩種分詞結(jié)果,一個(gè)是正向最大匹配,一個(gè)是上述假設(shè)的結(jié)果,事實(shí)上百度輸出是第二種情況,這樣基本能確定百度分詞采取了至少兩個(gè)詞典,一個(gè)是普通詞典,一個(gè)是專用詞典(人名等)。而且是專用詞典先切分,然后將剩余的片斷交由普通詞典來切分。
繼續(xù)測(cè)驗(yàn),提交查詢“古巴比倫理”,如果是正向最大匹配,那么結(jié)果應(yīng)該是,如果是反向最大匹配,那么結(jié)果應(yīng)該是,事實(shí)上百度的分詞結(jié)果是,從這個(gè)例子看,好像用了正向最大匹配算法;此外還有一些例子表明好像是使用正向最大匹配的;但是且慢,我們看這個(gè)查詢“北京華煙云”,正向最大匹配期望的結(jié)果是,而反向最大匹配期望的結(jié)果是,事實(shí)上百度輸出的是后者,這說明可能采用的反向最大匹配;從這點(diǎn)我們可以猜測(cè)百度采用的是雙向最大匹配分詞算法,如果正向和反向匹配分詞結(jié)果一致當(dāng)然好辦,直接輸出即可;但是如果兩者不一致,正向匹配一種結(jié)果,反向匹配一種結(jié)果,此時(shí)該如何是好呢?
從上面兩個(gè)例子看,在這種情況下,百度采取最短路徑方法,也就是切分的片斷越少越好,比如和相比選擇后者,和相比選擇后者。還有類似的一些例子,這樣基本可以解釋這些輸出結(jié)果。
但是仍然遺留的問題是:如果正向反向分詞不一致,而且最短路徑也相同,那怎么辦?輸出正向的還是反向的結(jié)果?
我們?cè)賮砜匆粋€(gè)例子。提交查詢“遙遠(yuǎn)古古巴比倫”,這個(gè)查詢被百度切分為,說明詞典里面有”巴比倫”,但是是否有”古巴比倫”這個(gè)詞匯不確定,此時(shí)看不出是正向切分還是反向切分得出的結(jié)果,換查詢?yōu)?ldquo;遙遠(yuǎn)古巴比倫”,此時(shí)被切分為“遙遠(yuǎn)/古巴比倫”,這說明詞典里面有”古巴比倫”這個(gè)詞匯,這說明了“遙遠(yuǎn)古古巴比倫”是正向最大匹配的結(jié)果。那為什么“遙遠(yuǎn)古古巴比倫”不會(huì)被反向切分為”遙/遠(yuǎn)古/古巴比倫”呢,百度的可能選擇是這種情況下選擇單字少的那組切分結(jié)果。
當(dāng)然還可以繼續(xù)追問:如果切分后單字也一樣多,那怎么辦?最后看一個(gè)例子,查詢“大?。?rdquo;,百度將其切分為“大/小”,是正向切分的結(jié)果,如果是反向的會(huì)被切分為“王/強(qiáng)/大小”,這說明有歧義而且單字也相同則選擇正向切分結(jié)果。
OK,看到這里可能頭已經(jīng)有些暈了,最后總結(jié)一下百度的分詞算法,當(dāng)然里面還是有猜測(cè)的成分,算法如下:
首先查詢專用詞典(人名,部分地名等),將專有名稱切出,剩下的部分采取雙向分詞策略,如果兩者切分結(jié)果相同,說明沒有歧義,直接輸出分詞結(jié)果。如果不一致,則輸出最短路徑的那個(gè)結(jié)果,如果長(zhǎng)度相同,則選擇單字詞少的那一組切分結(jié)果。如果單字也相同,則選擇正向分詞結(jié)果。
百度一直宣傳自己在中文處理方面的優(yōu)勢(shì),從上面看,分詞算法并無特殊之處,消歧效果并不理想,即使百度采取比上述分詞算法復(fù)雜些的算法也難以說成是優(yōu)勢(shì),如果說百度有優(yōu)勢(shì)的話,唯一的優(yōu)勢(shì)就是那個(gè)很大的專用詞典,這個(gè)專用詞典登錄了人名(比如大長(zhǎng)今),稱謂(比如老太太),部分地名(比如阿聯(lián)酋等),估計(jì)百度采用學(xué)術(shù)界公布的比較新的命名實(shí)體識(shí)別算法從語料庫里面不斷識(shí)別出詞典未登錄詞,逐漸擴(kuò)充這個(gè)專門詞典。如果這就是優(yōu)勢(shì)的話,那么這個(gè)優(yōu)勢(shì)能夠保持多久就是個(gè)很明顯的問題。
Spelling Checker拼寫檢查錯(cuò)誤提示(以及拼音提示功能)
拼寫檢查錯(cuò)誤提示是搜索引擎都具備的一個(gè)功能,也就是說用戶提交查詢 給搜索引擎,搜索引擎檢查看是否用戶輸入的拼寫有錯(cuò)誤,對(duì)于中文用戶來說一般造成的錯(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ì)提示你正確的檢索詞匯.
那么百度是怎么提示正確詞匯的呢?很明顯是通過拼音的方式,比如我輸入查詢
相關(guān)文章
自主創(chuàng)業(yè):網(wǎng)上掙錢的中國(guó)站長(zhǎng)們看過來
自主創(chuàng)業(yè):網(wǎng)上掙錢的中國(guó)站長(zhǎng)們看過來...2007-04-04鑒于Adsense的一系列政策特介紹一下最近國(guó)內(nèi)聯(lián)盟的一些廣告產(chǎn)品小結(jié)
鑒于Adsense的一系列政策特介紹一下最近國(guó)內(nèi)聯(lián)盟的一些廣告產(chǎn)品小結(jié)...2007-12-12ES6 的 Object.assign() 使用實(shí)例詳解
Object.assign() 是 ECMAScript 6 引入的方法,用于將源對(duì)象(source)的所有可枚舉屬性復(fù)制到目標(biāo)對(duì)象(target),這篇文章主要介紹了ES6 的 Object.assign() 使用詳解,需要的朋友可以參考下2007-11-11為什么Google Adsense廣告單元點(diǎn)擊價(jià)格會(huì)下降??
為什么Google Adsense廣告單元點(diǎn)擊價(jià)格會(huì)下降??...2007-02-02關(guān)于Google Adsense 2007年1月新條款的解釋說明
這篇文章主要介紹了關(guān)于Google Adsense 2007年1月新條款的解釋說明2007-02-02關(guān)于網(wǎng)站如何賺錢方法之廣告-寫給新站長(zhǎng)
關(guān)于網(wǎng)站如何賺錢方法之廣告-寫給新站長(zhǎng)...2007-02-02