Manticore search加一個中文分詞
在互聯網高速發展的今天,信息也呈現出爆炸式的增長。在海量信息中我們如何利用機器快速地提取我們想要的信息?
因為一篇文章沒有特別的符號來將詞語呈現出來,所以我們用機器進行中文處理的時候,首先就需要對中文語句進行分詞。
下面我們來看看如何實現的
Sphinx search 可以說是一款非常強的開源全文搜索引擎,因為種種原因,后來都沒有更新了,所以后來版本太低,同時也會出現bug;后來也使用最新的sphinxsearch,它可以支持幾乎所有語言,通過其內置的ngram tokenizer對中文進行索引和搜索。但是,像中文、日文、韓文這種文字使用ngram還是有很大弊端。
當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的主分支保持同步。
算法實現
通過最小匹配(而非單字)來匹配字典和字符串,把字符串分割成最短(而非單字)的詞。如果遇到處理不了的歧義時,以單字做詞。這樣的目的是,保證搜索時能找到這些內容而不丟失。
稍微解釋一下,對于搜索引擎的分詞為什么這么做:
搜索引擎要能找到盡可能全內容:最徹底的方法是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 ????... }
提醒:?分詞對批量索引和實時索引都起作用。
我在我的個人博客“猿人學網站”和公眾號“猿人學Python”上寫Python教程,有興趣的可以關注公眾號和網站。
中文分詞 華為開源鏡像站 Mirrors
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。