探索百度搜索引擎算法技巧分析系列(二)

接著我們上回的話題,百度搜索引擎演算法技巧分析,接下來我們要講的是中文分詞技術,大家都知道百度是全球唯一最大的中文搜索引擎。下文針對百度對用戶查詢關鍵字分詞做了一個實踐分析,希望對更多的SEOer有幫助。百度這個搜索引擎對關鍵字如何切分呢?

中文分詞

首先,講講百度的分詞時機或者條件問題,是否是個中文字串百度就拿來切一下呢?非也,要想被百度的分詞程式榮幸的切割一下也是要講條件的,哪能是個字串就切割啊?你當百度是賣鋸條的麼?

那麼什麼樣的字串才滿足被切割的條件呢?簡單說來,如果字串只包含小於等於3個中文字元的話,那就保留不動,當字串長度大於4個中文字元的時候,百度的分詞程式才出馬大幹快上,把這個字串肢解掉。

怎麼證明呢?我們向百度提交“電影下載”,看看返回結果中標為紅字的地方,不難看出來,查詢已經被切割成 <電影,下載> 兩個單詞了,說明分詞程式已經開工了,如果是比4個中文字元更長的字串,那分詞程式就更不客氣了,一定大卸八塊而後快。我們來看看三個字元的情況,提交查詢“當然擇”,看起來這個查詢不倫不類,那是因為我希望看到這個字串被切分為 <當然,擇> ,返回結果看多少篇相關頁面,翻到最後一頁,發現標紅的關鍵字都是” 當然擇”連續出現的情況,好像沒有切分,但是還不確定,那麼再提交人工分好的查詢“當然擇”看看,返回結果又會顯示多少篇,基本上可以確定沒有進行分詞了,當然另外一種解釋是:對於三個字元先切分,然後將切分後的結果當作一個短語查詢,這樣看到的效果和沒有切分是相似的。

但是我傾向於判斷百度對於少於3個字元的串沒有切分,奧卡姆不是說了麼“如無必要,勿增實體”,幹嗎做無用功呢。那麼如果沒有切分,會有一個隨之而來的問題,怎麼從索引庫裏面提取未切分的字串呢?這牽扯到索引的問題,我覺得百度應該採取了兩套索引機制,一種是按照單詞索引,一種是按照N-GRAM索引, 至於索引的具體問題,以後在詳細論述。

下面我們看看百度是採取的何種分詞演算法,現在分詞演算法已經算是比較成熟了,有簡單的有複雜的,比如正向最大匹配,反向最大匹配,雙向最大匹配,語言模型方法,最短路徑演算法等等,有興趣的可以用GOOGLE去搜索一下以增加理解。這裏就不展開說了。但是要記住一點的是:判斷一個分詞系統好不好,關鍵看兩點, 一個是消除歧義能力;一個是詞典未登錄詞的識別比如人名,地名,機構名等。 那

麼百度用的是什麼方法?我的判斷是用雙向最大匹配演算法。至於怎麼推理得出的,讓我們一步步來看。當然,這裏首先有個假設,百度不會採取比較複雜的演算法,因為考慮到速度問題。

我們提交一個查詢“毛澤東北京華煙雲”,又一個不知所云的查詢,儘管不知所云但是自有它的道理,我想看看百度的分詞是如何消歧以及是否有詞典未登錄詞的識別的功能,如果是正向最大匹配演算法的話, 那麼輸出應該是:”毛澤東/北京/華/煙雲”, 如果是反向最大匹配演算法的話,那麼輸出應該是:”毛/澤/東北/京華煙雲”,我們看看百度的分詞結果:”毛澤東/北/京華煙雲”,一個很奇怪的輸出,跟我們的期望相差較多,但是從中我們可以獲得如下資訊:百度分詞可以識別人名,也可以識別”京華煙雲”,這說明有詞典未登錄詞的識別的功能,我們可以假設分詞過程分為兩個階段: 第一階段,先查找一個特殊詞典,這個詞典包含一些人名,部分地名以及一些普通詞典沒有的新詞,這樣首先將”毛澤東”解析出來,剩下了字串”北京華煙雲”,而”北/京華煙雲”,可以看作是反向最大匹配的分詞結果。這樣基本說得通。為了證明這一點,我們提交查詢”發毛澤東北”,我們期望兩種分詞結果,一個是正向最大匹配 <發毛,澤,東北> ,一個是上述假設的結果 <發,毛澤東,北> ,事實上百度輸出是第二種情況,這樣基本能確定百度分詞採取了至少兩個詞典,一個是普通詞典,一個是專用詞典(人名等)。而且是專用詞典先切分,然後將剩餘的片斷交由普通詞典來切分。

繼續測驗,提交查詢“古巴比倫理”,如果是正向最大匹配,那麼結果應該是 <古巴比倫,理> ,如果是反向最大匹配,那麼結果應該是 <古巴,比,倫理> ,事實上百度的分詞結果是 <古巴比倫,理> ,從這個例子看,好像用了正向最大匹配演算法;此外還有一些例子表明好像是使用正向最大匹配的;但是且慢,我們看這個查詢“北京華煙雲”,正向最大匹配期望的結果是 <北京,華,煙雲> ,而反向最大匹配期望的結果是 <北,京華煙雲> ,事實上百度輸出的是後者,這說明可能採用的反向最大匹配; 從這點我們可以猜測百度採用的是雙向最大匹配分詞演算法,如果正向和反向匹配分詞結果一致當然好辦,直接輸出即可;但是如果兩者不一致,正向匹配一種結果,反向匹配一種結果,此時該如何是好呢?

從上面兩個例子看,在這種情況下,百度採取最短路徑方法,也就是切分的片斷越少越好,比如 <古巴,比,倫理> 和 <古巴比倫,理> 相比選擇後者, <北京,華,煙雲> 和 <北,京華煙雲> 相比選擇後者。還有類似的一些例子,這樣基本可以解釋這些輸出結果。

但是仍然遺留的問題是:如果正向反向分詞不一致,而且最短路徑也相同,那怎麼辦?輸出正向的還是反向的結果?

我們再來看一個例子。提交查詢“遙遠古古巴比倫”,這個查詢被百度切分為 <遙遠,古古,巴比倫> ,說明詞典裏面有”巴比倫”,但是是否有”古 巴比倫”這個辭彙不確定,此時看不出是正向切分還是反向切分得出的結果,換查詢為“遙遠古巴比倫”,此時被切分為“遙遠/古巴比倫”,這說明詞典裏面有” 古巴比倫”這個辭彙,這說明了“遙遠古古巴比倫”是正向最大匹配的結果。那為什麼“遙遠古古巴比倫”不會被反向切分為”遙/遠古/古巴比倫”呢,百度的可能選擇是這種情況下選擇單字少的那組切分結果。

當然還可以繼續追問:如果切分後單字也一樣多,那怎麼辦?最後看一個例子,查詢“王強大小”,百度將其切分為“王/強大/小”,是正向切分的結果,如果是反向的會被切分為“王/強/大小”,這說明有歧義而且單字也相同則選擇正向切分結果。

OK,看到這裏可能頭已經有些暈了,最後總結一下百度的分詞演算法,當然裏面還是有猜測的成分,演算法如下:

首先查詢專用詞典(人名,部分地名等),將專有名稱切出,剩下的部分採取雙向分詞策略,如果兩者切分結果相同,說明沒有歧義,直接輸出分詞結果。如果不一致,則輸出最短路徑的那個結果,如果長度相同,則選擇單字詞少的那一組切分結果。如果單字也相同,則選擇正向分詞結果。

百度一直宣傳自己在中文處理方面的優勢,從上面看,分詞演算法並無特殊之處,消歧效果並不理想,即使百度採取比上述分詞演算法複雜些的演算法也難以說成是優勢,如果說百度有優勢的話,唯一的優勢就是那個很大的專用詞典,這個專用詞典登錄了人名(比如大長今),稱謂(比如老太太),部分地名(比如阿聯酋等),估計百度採用學術界公佈的比較新的命名實體識別演算法從語料庫裏面不斷識別出詞典未登錄詞,逐漸擴充這個專門詞典。如果這就是優勢的話,那麼這個優勢能夠保持多久就是個很明顯的問題。

到此,我們講述了百度搜索引擎演算法的查詢處理及中文分詞技術,技巧很多,希望SEOer能夠認真揣摩,在搜索引擎道路上越走越順暢。