閱讀694 返回首頁    go 阿裏雲 go 技術社區[雲棲]


搜索引擎算法原理 百度算法的原理 [

隨著網絡的平民化,更多人在網絡上想找到自己的信息,都喜歡在搜索引擎框中打入自己想搜索的關鍵詞,而不是像在網絡的早期,去黃頁等網站尋找,有效節省大量的時間。那麼在我們每天通過搜索引擎來尋找我們的信息同時,你是否知道搜索引擎的簡單原理,什麼是搜索引擎呢?那麼搜索引擎有什麼算法、機密的玄機呢?      隨著搜索經濟的崛起,人們開始越加關注全球各大搜索引擎的性能、技術和日流量。作為企業,會根據搜索引擎的知名度以及日流量來選擇是否要投放廣告等;作為普通網民,會根據搜索引擎的性能和技術來選擇自己喜歡的引擎查找資料;作為技術人員,會把有代表性的搜索引擎作為研究對象. 搜索引擎經濟的崛起,又一次向人們證明了網絡所蘊藏的巨大商機。網絡離開了搜索將隻剩下空洞雜亂的數據,以及大量等待去費力挖掘的金礦。 但是,如何設計一個高效的搜索引擎?我們可以以百度所采取的技術手段來探討如何設計一個實用的搜索引擎.搜索引擎涉及到許多技術點,比如查詢處理,排序算法,頁麵抓取算法,CACHE機製,ANTI-SPAM等等.這些技術細節,作為商業公司的搜索引擎服務提供商比如百度,GOOGLE等是不會公之於眾的.我們可以將現有的搜索引擎看作一個黑盒,通過向黑盒提交輸入,判斷黑盒返回的輸出大致判斷黑盒裏麵不為人知的技術細節。查詢處理與分詞是一個中文搜索引擎必不可少的工作,而百度作為一個典型的中文搜索引擎一直強調其&rdquo;中文處理&rdquo;方麵具有其它搜索引擎所不具有的關鍵技術和優勢.那麼我們就來看看百度到底采用了哪些所謂的核心技術。    我們分兩個部分來講述:查詢處理/中文分詞. 一. 查詢處理       用戶向搜索引擎提交查詢,搜索引擎一般在接受到用戶查詢後要做一些處理,然後在索引數據庫裏麵提取相關的信息.那麼百度在接受到用戶查詢後做了些什麼工作呢? 假設用戶提交了不隻一個查詢串,比如&rdquo;信息檢索 理論 工具&rdquo;.那麼搜索引擎首先做的是根據分隔符比如空格,標點符號,將查詢串分割成若幹子查詢串,比如上麵的查詢就會被解析為:<信息檢索,理論,工具>三個子字符串;這個道理簡單,我們接著往下看。   假設提交的查詢有重複的內容,搜索引擎怎麼處理呢?比如查詢&rdquo;理論 工具 理論&rdquo;,百度是將重複的字符串當作隻出現過一次,也就是處理成等價的&rdquo;理論 工具&rdquo;,而GOOGLE顯然是沒有進行歸並,而是將重複查詢子串的權重增大進行處理.那麼是如何得出這個結論的呢?我們可以將&rdquo;理論 工具&rdquo;提交給百度, 返回341,000篇文檔,大致看看第一頁的返回內容.OK.繼續,我們提交查詢&rdquo;理論 工具理論&rdquo;,在看看返回結果,仍然是那麼多返回文檔,當然這個不能說明太多問題,那看看第一頁返回結果的排序,看出來了嗎?順序完全沒有變化,而GOOGLE 則排序有些變動,這說明百度是將重複的查詢歸並成一個處理的,而且字符串之間的先後出現順序基本不予考慮(GOOGLE是考慮了這個順序關係的)。   假設提交的中文查詢包含英文單詞,搜索引擎是怎麼處理的?比如查詢&rdquo;電影BT下載&rdquo;,百度的方法是將中文字符串中的英文當作一個整體保留,並以此為斷點將中文切分開,這樣上述的查詢就切為<電影,BT,下載>,不論中間的英文是否一個字典裏能查到的單詞也好,還是隨機的字符也好,都會當作一個整體來對待.至於為什麼,你用查詢&rdquo; 電影dfdfdf下載&rdquo;看看結果就知道了.當然如果查詢中包含數字,也是如此辦理。      到目前為止,一切很簡單,也很清楚,百度怎麼處理用戶查詢的呢?歸納如下:首先根據分割符號將查詢分開,然後看看是否有重複的字符串,如果有,就拋棄多餘的,隻保留一個,接著判斷是否有英文或者數字,如果有的話,把英文或者數字當作一個整體保留並把前後的中文切開.接著該幹什麼呢?該考慮分詞的問題了。    中文分詞   首先,講講百度的分詞時機或者條件問題,是否是個中文字符串百度就拿來切一下呢?非也,要想被百度的分詞程序榮幸的切割一下也是要講條件的,哪能是個字符串就切割啊?你當百度是賣鋸條的麼?   那麼什麼樣的字符串才滿足被切割的條件呢?簡單說來,如果字符串隻包含小於等於3個中文字符的話,那就保留不動,當字符串長度大於4個中文字符的時候,百度的分詞程序才出馬大幹快上,把這個字符串肢解掉。   怎麼證明呢?我們向百度提交&rdquo;電影下載&rdquo;,看看返回結果中標為紅字的地方,不難看出來,查詢已經被切割成<電影,下載>兩個單詞了,說明分詞程序已經開工了,如果是比 4個中文字符更長的字符串,那分詞程序就更不客氣了,一定大卸八塊而後快.我們來看看三個字符的情況,提交查詢&rdquo;當然擇&rdquo;,看起來這個查詢不倫不類,那是因為我希望看到這個字符串被切分為<當然,擇>,返回結果365篇相關頁麵,翻到最後一頁,發現標紅的關鍵字都是&rdquo;當然擇&rdquo;連續出現的情況, 好像沒有切分,但是還不確定,那麼再提交人工分好的查詢&rdquo;當然擇&rdquo;看看,返回結果1,090,000篇,基本上可以確定沒有進行分詞了,當然另外一種解釋是:對於三個字符先切分,然後將切分後的結果當作一個短語查詢,這樣看到的效果和沒有切分是相似的.但是我傾向於判斷百度對於少於3個字符的串沒有切分,奧卡姆不是說了麼&rdquo;如無必要,勿增實體&rdquo;,幹嗎做無用功呢.那麼如果沒有切分,會有一個隨之而來的問題,怎麼從索引庫裏麵提取未切分的字符串呢?這牽扯到索引的問題,我覺得百度應該采取了兩套索引機製,一種是按照單詞索引,一種是按照N-GRAM索引,至於索引的具體問題,以後在詳細論述.。 下麵我們看看百度是采取的何種分詞算法,現在分詞算法已經算是比較成熟了,有簡單的有複雜的,比如正向最大匹配,反向最大匹配,雙向最大匹配,語言模型方法,最短路徑算法等等,有興趣的可以用GOOGLE去搜索一下以增加理解.這裏就不展開說了.但是要記住一點的是:判斷一個分詞係統好不好,關鍵看兩點,一個是消除歧義能力;一個是詞典未登錄詞的識別比如人名,地名,機構名等。      那麼百度用的是什麼方法?我的判斷是用雙向最大匹配算法.至於怎麼推理得出的,讓我們一步步來看.當然,這裏首先有個假設,百度不會采取比較複雜的算法,因為考慮到速度問題。      我們提交一個查詢&rdquo;王曉東北京華煙雲&rdquo;,又一個不知所雲的查詢,盡管不知所雲但是自有它的道理,我想看看百度的分詞是如何消歧以及是否有詞典未登錄詞的識別的功能,如果是正向最大匹配算法的話,那麼輸出應該是:&rdquo;王曉東/北京/華/煙雲&rdquo;,如果是反向最大匹配算法的話,那麼輸出應該是:&rdquo;王/曉/東北/京華煙雲&rdquo;,我們看看百度的分詞結果:&rdquo;王曉東/北/京華煙雲&rdquo;,一個很奇怪的輸出,跟我們的期望相差較多,但是從中我們可以獲得如下信息:百度分詞可以識別人名,也可以識別&rdquo;京華煙雲&rdquo;,這說明有詞典未登錄詞的識別的功能,我們可以假設分詞過程分為兩個階段:第一階段,先查找一個特殊詞典,這個詞典包含一些人名,部分地名以及一些普通詞典沒有的新詞,這樣首先將&rdquo;王曉東&rdquo;解析出來,剩下了字符串&rdquo;北京華煙雲&rdquo;,而&rdquo;北/京華煙雲&rdquo;,可以看作是反向最大匹配的分詞結果.這樣基本說得通.為了證明這一點,我們提交查詢&rdquo;發王曉東北&rdquo;,我們期望兩種分詞結果,一個是正向最大匹配<發王,曉,東北 >,一個是上述假設的結果<發,王曉東,北>,事實上百度輸出是第二種情況,這樣基本能確定百度分詞采取了至少兩個詞典,一個是普通詞典,一個是專用詞典(人名等).而且是專用詞典先切分,然後將剩餘的片斷交由普通詞典來切分。      繼續測驗,提交查詢&rdquo;古巴比倫理&rdquo;,如果是正向最大匹配,那麼結果應該是<古巴比倫,理>,如果是反向最大匹配,那麼結果應該是<古巴,比,倫理>,事實上百度的分詞結果是<古巴比倫,理>,從這個例子看,好像用了正向最大匹配算法;此外還有一些例子表明好像是使用正向最大匹配的;但是且慢,我們看這個查詢&rdquo;北京華煙雲&rdquo;,正向最大匹配期望的結果是<北京,華,煙雲>,而反向最大匹配期望的結果是<北,京華煙雲>,事實上百度輸出的是後者,這說明可能采用的反向最大匹配;從這點我們可以猜測百度采用的是雙向最大匹配分詞算法,如果正向和反向匹配分詞結果一致當然好辦,直接輸出即可;但是如果兩者不一致,正向匹配一種結果,反向匹配一種結果,此時該如何是好呢?從上麵兩個例子看,在這種情況下,百度采取最短路徑方法,也就是切分的片斷越少越好,比如<古巴,比,倫理>和<古巴比倫,理>相比選擇後者,<北京,華,煙雲>和<北,京華煙雲>相比選擇後者.還有類似的一些例子,這樣基本可以解釋這些輸出結果。      但是仍然遺留的問題是:如果正向反向分詞不一致,而且最短路徑也相同,那怎麼辦?輸出正向的還是反向的結果?我們再來看一個例子.提交查詢&rdquo;遙遠古古巴比倫&rdquo;,這個查詢被百度切分為<遙遠,古古,巴比倫>,說明詞典裏麵有&rdquo;巴比倫&rdquo;,但是是否有&rdquo;古巴比倫&rdquo;這個詞匯不確定,此時看不出是正向切分還是反向切分得出的結果,換查詢為&rdquo;遙遠古巴比倫&rdquo;,此時被切分為&rdquo;遙遠/古巴比倫&rdquo;,這說明詞典裏麵有&rdquo;古巴比倫&rdquo;這個詞匯,這說明了&rdquo;遙遠古古巴比倫&rdquo;是正向最大匹配的結果.那為什麼&rdquo;遙遠古古巴比倫&rdquo;不會被反向切分為&rdquo;遙/遠古/古巴比倫&rdquo;呢,百度的可能選擇是這種情況下選擇單字少的那組切分結果。      當然還可以繼續追問:如果切分後單字也一樣多,那怎麼辦?最後看一個例子,查詢&rdquo;王強大小:&rdquo;,百度將其切分為&rdquo;王/強大/小&rdquo;,是正向切分的結果,如果是反向的會被切分為&rdquo;王/強/大小&rdquo;,這說明有歧義而且單字也相同則選擇正向切分結果。      OK,看到這裏可能頭已經有些暈了,最後總結一下百度的分詞算法,當然裏麵還是有猜測的成分,算法如下:      首先查詢專用詞典(人名,部分地名等),將專有名稱切出,剩下的部分采取雙向分詞策略,如果兩者切分結果相同,說明沒有歧義,直接輸出分詞結果.如果不一致,則輸出最短路徑的那個結果,如果長度相同,則選擇單字詞少的那一組切分結果.如果單字也相同,則選擇正向分詞結果。      百度一直宣傳自己在中文處理方麵的優勢,從上麵看,分詞算法並無特殊之處,消歧效果並不理想,即使百度采取比上述分詞算法複雜些的算法也難以說成是優勢,如果說百度有優勢的話,唯一的優勢就是那個很大的專用詞典,這個專用詞典登錄了人名(比如大長今),稱謂(比如老太太),部分地名(比如阿聯酋等),估計百度采用學術界公布的比較新的命名實體識別算法從語料庫裏麵不斷識別出詞典未登錄詞,逐漸擴充這個專門詞典.如果這就是優勢的話,那麼這個優勢能夠保持多久就是個很明顯的問題。 文章內容來源:    www.lfyqh.com www.hxghsj.com www.ayfnkj.com www.nhcxswjx.com  www.luobuge.cn www.htmfcl.com www.hnxxyj.com www.aydzbj.com www.byljpj.com

www.ayxcpx.com

www.hngsm.com www.lucine.cn www.aycxnk.com www.aylbb.com www.ayshsm.com

www.ltljpj.com www.aybdny.com www.ayxcpx.com www.htxwsgs.com www.hnntyy.com www.ayzyx.com

www.dskgj.com www.hlmbc.com www.xdljpjc.com www.aymr.com.cn www.aylbb.com mlf.zhihuan6.com

最後更新:2017-04-03 18:51:59

  上一篇:go 360搜索將與百度平分搜索引擎市場
  下一篇:go 百度(baidu)搜索引擎的15個特點