垂直搜索引擎中的分詞系統


國內垂直領域的電商或者信息分享類應用都處於高速發展期,其對內容快速搜索的需求越來越強烈,對於能適應自己業務應用的搜索引擎解決方案也越來越重視。同時,通用的可選開源搜索引擎框架或解決方案也越來越多,如著名的Lucene,Solr,ElasticSearch等。打造一套完美適應自身業務需求的搜索引擎是個具有挑戰性的任務,而且無論選擇Lucene,Solr這些搜索引擎框架、方案還是自己另寫一套搜索引擎,都面臨着一個共同的核心問題---如何打造適合自身業務的分詞系統。

一、分詞原理介紹

1.1 分詞

經典笑話:某護士看到肝硬化病人在病房里偷偷喝酒,就走過去叮囑說:小心肝!病人微笑回應:小寶貝!這里的“小心肝”存在歧義,從護士的角度理解為:小心/肝,病人的角度成了:小心肝。在中文的世界了,充滿着需要准確分詞才能消除歧義的場景。

分詞對於搜索引擎而言是無比重要的,既影響索引的性能,又直接影響搜索結果的准確性以及相關性的計算。

1.2 英文分詞

英語(適用於所有的拉丁語系和相似語系語言)由於有其語言天然以單詞為基本單位,所以分詞相對容易。需要的基本步驟如下:

  • 初步分割,根據空格/符號/段落 分割,得到基本單詞
  • 停用詞(stop word)過濾
  • 詞干提取(stemming)
  • 詞形還原(lemmatisation)

第一步很好理解,不做多余解釋。

第二步中的停用詞(stop word)是指a/an/and/are這類高頻詞,這類詞對搜索的意義不大,但對基於詞頻的算分公式產生極大的干擾,所以需要過濾掉。

第三步,詞干提取(stemming)是西方語言特有的處理,比如英語單詞中的單復數變形,-ing和-ed的變形。但在計算相關性時應做同一個單詞。比如 apple和apples,doing和done是同一個詞,提取詞干的目的就是要合並這些變態。這樣做能更好的滿足人們搜索的習慣和對返回內容的期望。

Lucene英文分詞自帶了3個常用的詞干提取算法,分別是

  • English Minimal Stemmer
  • 著名的 Porter Stemming
  • KStemmer

詞干提取的算法並不復雜,基本上是一堆規則,或用映射表,編程容易,但是必須精通這種語言的專家才能勝任---必須非常了解其構詞法才行。

第四步,詞形還原的基本方法是通過字典映射,比如將drove還原成drive。而stemming經常會把單詞變短,如doing變成do。實際上stemming解決了大部分西方語言的分詞轉換問題,詞形還原則更進一步提高了搜索引擎的體驗。

1.3 數字分詞

數字在常規搜索引擎,如Lucene中,默認會將其當做一個純粹的字符串處理。分詞效果跟英文基本一致。也就是說像數值3.1415926的分詞結果就是其本身,要想搜索到這個數字也需要輸入完整的3.1415926才能精確命中。

基於全匹配的數字串搜索,對於使用者來說,上述的例子對搜索不太友好。在定制的搜索引擎中往往對此進行優化,以支持對數值更友好的搜索。如對數字進行抽取變成數值,支持數值范圍的搜索以及部分數值搜索(章節"垂直領域分詞系統差異"里會進一步提到)。

1.4 中文分詞

完美的中文分詞系統是世界性的難題,原因在於它不僅要理解中文語法結構,中文語義還要自適應語境。不僅如此,中文新詞的出現比較快,詞義又在不斷變化。所以至今為止,沒有哪個人或機構聲稱他們的中文分詞系統是100%准確的。或許人工智能的成熟可以將中文分詞的准確性不斷接近100%。

現有的分詞系統方案:

  • 一元切詞和二分切詞
  • 基於詞典最長匹配
  • 形成切分圖分詞
  • 概率語言模型分詞法

一元切詞和二分切詞

一元切詞是將每個中文字符(漢字)獨立成一個詞條(Term),這樣的搜索結果會很糟糕,比如一個普通的搜索"上海",結果集中將完全不相干的"海上"一起返回出來。Lucene里默認提供的是二切中文分詞,原理為將:上海人 分詞為:上海/海人 這樣做的好處是避免了一元切詞出現的完全沒有意義的結果。但二切分詞的結果里出現根本沒有意義的詞條---海人,而且這是可搜索的內容,效果不如人意。

基於詞典的最長匹配

基於詞典分詞的一種方法是將詞典構建成一個Trie搜索樹,每個節點放一個字,同時將詞的信息放在Node中,如詞性,權重等。Trie樹可以是一種多層散列表,在每一層上查找的速度是O(1),所以匹配速度非常快。

如下圖所示的是一個由詞組集<一萬,一萬多,一萬元,一上午,一下午,一下子>生成的Tire樹的子樹

(Trie樹示例)

文本在Trie樹上進行逐層匹配,直到Trie樹不再有子層級或者文本無法匹配到該層的任何字符,這樣的得出的分詞結果為基於詞典的最長匹配。

形成切分圖分詞

首先該方法也是依賴於詞典,同時為了消除分詞中的歧義,提高分詞的精確度,需要找出一段文字中所有可能的詞,生成全切分詞圖。

(中文分詞切分路徑)

上圖中可以切分的路徑有兩條:

路徑1:0-1-3-5 對應方案為:有/意見/分歧

路徑2:0-2-3-5 對應方案為:有意/見/分歧

使用動態規划算法能獲取上述切分結果,並使用詞性,權重等綜合因素最終確定分詞結果。

概率語言模型分詞法

從統計思維的角度來看,分詞的問題可以理解為輸入是一個字符串:C=C1,C2,C3...,Cn 輸出是一個詞串 S=W1,W2,W3...,Wm(m<=n)。對於一個特定的字符串C,會有多個切詞方案S與之對應,分詞就是從這些S中找出概率最大的一個切分方案,也就是對輸入字符串切分出最有可能的詞序列。

對於輸入字符串C"有意見分歧",有S1和S2兩種切分可能。

  • S1: 有/意見/分歧
  • S2: 有意/見/分歧

計算條件概率P(S1|C)和P(S2|C),然后采用概率大的值對應的切分方案。根據貝葉斯公式,有P(S|C)=(P(C|S)*P(S))/P(C),其中P(C)是字符串在語料中出現的概率,只是一個用來歸一化的固定值。從詞串恢復到漢字串的概率只有唯一的一種方式,所以P(C|S)=1。因此,比較P(S1|C)和P(S2|C)的大小變成比較P(S1)和P(S2)的大小。進一步推導可參考《解密搜索引擎技術實戰:Lucene&Java》精華版第二版第4章.

從另外一個角度看,計算最大概率等於求切分詞圖的最短路徑,可以采用動態規划法求解最短路徑。

基於概率的分詞法,依賴於充足的語料以及對語料的統計分析。因此它是屬於事先學習型的分詞法。目前一些高質量的分詞法就是基於概率統計分詞法實現的。

二、垂直領域分詞系統差異

與通用搜索引擎的復雜語料相比,垂直搜索引擎中的語料數據在進索引之前往往會得到清洗。也意味着數據的復雜度會降低。同時在垂直領域中會有很多的專有術語,用戶搜索的習慣跟通用搜索引擎也會不一樣。因此,需要讓垂直搜索引擎顯得更智能,更能理解用戶的搜索意圖。比如自動校正輸錯的專業詞匯,在輸入框中提示更多的分類結果集等。這些都需要在搜索引擎中准確的分詞以及基於分詞的推薦算法來完成。

1.1 英文分詞

在垂直領域的英文分詞,一般會減少傳統英文分詞的步驟。根據語料的差異,有時會將詞干提取(stemming)省掉,有時候會將過濾stop word步驟省掉。而且一般不進行詞干還原。具體怎么做主要取決於要索引的語料。比如在鋼鐵信息行業,鋼鐵相關術語非常多,而且很多英文本身是單詞縮寫,這時候做詞干提取和詞性還原可能達到會適得其反的效果。同時,由於行業信息推出的集中度很高,快速分詞和索引要求較高,因而在不影響准確性的時候,英文分詞步驟會做盡可能精簡。

同時,垂直搜索引擎會支持更高級的語法來幫助用戶在不確定詞的情況,搜到結果,相關內容會在下面的中文分詞中說明。

1.2 數字分詞

數字在文本搜索引擎中算是個異類,文本中出現的數字默認會當做文本來處理。搜索引擎使用者首先需要把數字組合當做一個單詞來搜索,如果當做一個數字來搜則會出現疑惑。典型的疑惑有兩個:第一,如何在文本中搜索數值范圍;第二,長數字到底如何來搜索?比如,一篇文檔中出現了1.5,2.0,3.0。能否通過搜索一個數值范圍值(2.5-4.0)來匹配結果? 而3.1415926這樣的長數值如何搜索才能找到?

Lucene里有NumericField(數值域)概念,其本質是將數字文本轉換為數值以支持精確搜索或范圍搜索。使用NumericField的前提是從文本中分析出數值,並且需要將數值索引到一個單獨的NumericField中。

實際應用中,垂直搜索引擎往往會去清洗帶有關鍵數值的文本Field(域),從中提取數值然后單獨做索引。搜索數值的時候需要將NumericField映射到相應的文本Field中。同時在原有文本域中,將數字進行長度切分,如將3.1415926按照4位長度切分:3.14/1592/6,以滿足用戶用更簡短的字符(如3.14)來搜索該數字串。當然,如果輸入完整的長數字串匹配效果會更好。

1.3 中文分詞

垂直搜索引擎中的中文分詞實現復雜度跟英文分詞一樣,也取決於語料。對於中文語料的清洗,基本能把那些無關業務的或者沒有意義的中文本文去除掉。剩下的進行高速分詞。

同時由於沒有一種分詞法能100%的分詞准確,在高級搜索中,支持更多的搜索語法,典型的有如下高級搜索:

  • 通配符查詢(Wildcard Search)

支持通配符(Wildcard)搜索能解決只知道部分內容的查詢,如搜"中**"能出來包含"中間","中國*"等詞的文檔

  • 模糊查詢(Fuzzy Search)

支持模糊(Fuzzy)查詢,允許用戶在輸錯的情況搜索想要的結果。如查詢"寶港股份有限公司",在模糊搜索下,能將"寶鋼股份有限公司"搜索出來。

高級搜索跟分詞的關系在於,用戶的搜索語句最后往往合成一條復雜查詢語句,分詞器綜合語法解析器切分出正確的查詢詞,並執行最終查詢。

上述兩個高級搜索特性同樣適用於對於英文的搜索。

三、分詞系統的實現原理

找鋼網搜索業務具有如下的特征:

  • 文本內容生成時間上廣泛分布,同時某些時間段又比較集中,索引的速度要有保障
  • 內容索引后,需要盡快被搜索到

針對自身的業務特性和語料特征,構建了一套完整分詞系統。

3.1 分詞框架和流程

第一步,獲取基礎詞條(Token)。將語料中的內容,按照語言切分出來。得到英文單詞、數字、中文段、保留字、無用字。然后在各個語言分詞器中進一步切分詞,如中文分詞需要將中文段再切分為中文詞,數字進行4位切分等。

第二部,由第一步中獲取的基本詞條按照定制需求進行組合,如兩個數字之間如果有小數點則組合成一個詞條,搜索語句切分時將通配符跟其他詞條組合成一個詞條等。

第三步,篩選有用詞條,丟棄無用詞條,得到最終詞條。

基本流程

3.2 中日韓分詞

中、日、韓三國語言有部分漢字是重疊的,並且可以基於詞典,使用相同的分詞法分詞。這里主要說明中文分詞。

中文分詞采用了基於詞典的最長匹配法,同時為了消除一些基本的歧義,我們采用了正向詞典匹配外,還進行了反向詞典匹配。最后根據切分詞組的權重,選取更優結果。

經過系列測試和對比,在現有詞典和語料下,目前中文分詞法的准確度達到85%以上,在高級搜索的匹配下,搜索覆蓋率能接近100%。分詞的速度超過200K/m(詞條數/分鍾)以上,速度上也完全可接受。

隨着業務需求上的細化和更多語料的積累,將進一步實現基於多元中文切分和基於概率統計的中文分詞法來提高分詞的准確性,提高搜索引擎的用戶體驗。

主要參考文獻:

  1. 《解密搜索引擎技術實戰》---Lucene&Java精華版 第2版
  2. 《Lucene in action 2》
  3. 《Managing Gigabyte》

關於作者
找鋼網搜索引擎高級算法工程師——周紅星


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM