Manticore search加一箇中文分詞

Sphinx search 是一款很是棒的開源全文搜索引擎,它使用C++開發,索引和搜索的速度很是快,我使用sphinx的時間也有好多年了。最初使用的是coreseek,一個國人在sphinxsearch基礎上添加了mmseg分詞的搜索引擎,惋惜後來再也不更新,sphinxsearch的版本過低,bug也會出現;後來也使用最新的sphinxsearch,它能夠支持幾乎全部語言,經過其內置的ngram tokenizer對中文進行索引和搜索。git

可是,像中文、日文、韓文這種文字使用ngram仍是有很大弊端的:github

當Ngram=1時,中文(日文、韓文)被分解成一個個的單字,就像把英文分解成一個個字母那樣。這會致使每一個單字的索引很長,搜索效率降低,同時搜索結果習慣性比較差。算法

當Ngram=2或更大時,會產生不少無心義的「組合」,好比「的你」、「爲什」等,致使索引的字典、索引文件等很是大,同時也影響搜索速度。編程

基於以上弊端,爲中日韓文本加入分詞的tokenizer是頗有必要的。數組

因而決定來作這件事。先去Sphinxsearch網站去看看,發現它已經發布了新的3.x版本,並且加入了不少很棒的特性,然而它從Sphinxsearch 3.x 開始,暫時再也不開源. 不過,部分前Sphinxsearch的開發人員跳出來成立新團隊,在Sphinx 2.x版本基礎上開發本身的Manticoresearch。這二者很像,從它們的名字就能夠看出來,這倆都是獅身怪獸。性能優化

Sphinx 是(古埃及)獅身人面像,Manticore 是(傳說中的)人頭獅身龍(蠍)尾怪獸編程語言

Manticoresearch 從Sphinxsearch 繼承而來, 並作了性能優化. 所以,我選擇了Manticoresearch 來添加中日韓分詞。性能

首先從Manticoresearch的github倉庫pull最新的代碼來談價,後面我也會盡力與Manticoresearch的主分支保持同步。優化

算法實現網站

算法基於字典,具體是cedar的實現的雙數組trie。cedar是C++實現的高效雙數組trie,也是分詞字典的最佳之選。cedar的協議是GNU GPLv2, LGPLv2.1, and BSD;或者email聯繫做者所要其它協議。

經過最小匹配(而非單字)來匹配字典和字符串,把字符串分割成最短(而非單字)的詞。若是遇處處理不了的歧義時,以單字作詞。這樣的目的是,保證搜索時能找到這些內容而不丟失。

稍微解釋一下,對於搜索引擎的分詞爲何這麼作:

搜索引擎要能找到儘量全內容:最完全的方法是ngram=1,每一個字單獨索引,這樣你搜索一個單字「榴」時,含有「榴蓮」的文本會被找到,但缺點就如前面所說。
搜索引擎要能找到儘量相關的內容: 分詞就是比較好的方法,對詞進行索引,這樣你搜索一個單字「榴」時,含有「榴蓮」的文本就不會被找到。但分詞的粒度要小,好比「編程語言」這是一個詞組,若是把這個分紅一個詞,你搜索「編程」時,就找不到只含「編程語言」的文本,一樣的,「上海市」要分紅「上海」和「市」,等等。因此,「最小匹配」適用於搜索引擎。

 

編譯安裝

從github倉庫manticoresearch-seg獲取源碼,編譯方法跟Manticoresearch同樣,具體看官方文檔。

使用方法

1. 準備詞表 把全部詞寫到一個txt文件,一行一個詞,以下所示:

# words.txt 中文 中國語 중국어

2. 建立字典 成功編譯代碼後,就會獲得建立字典的可執行程序make_segdictionary. 而後執行命令:

./make_segdictionary words.txt words.dict

這樣就獲得了字典文件: words.dict

3. 配置索引 只需在配置文件的 index {...} 添加一行便可:

index { ... seg_dictionary = path-to-your-segmentation-words-dictionary ... }

提醒: 分詞對批量索引和實時索引都起做用。

 

文章分享來至個人博客:https://www.yuanrenxue.com/

相關文章
相關標籤/搜索