摘要:最初使用的是,一個(gè)國(guó)人在基礎(chǔ)上添加了分詞的搜索引擎,可惜后來(lái)不再更新,的版本太低,也會(huì)出現(xiàn)后來(lái)也使用最新的,它可以支持幾乎所有語(yǔ)言,通過(guò)其內(nèi)置的對(duì)中文進(jìn)行索引和搜索?;谝陨媳锥?,為中日韓文本加入分詞的是很有必要的。
Sphinx search 是一款非常棒的開(kāi)源全文搜索引擎,它使用C++開(kāi)發(fā),索引和搜索的速度非???,我使用sphinx的時(shí)間也有好多年了。最初使用的是coreseek,一個(gè)國(guó)人在sphinxsearch基礎(chǔ)上添加了mmseg分詞的搜索引擎,可惜后來(lái)不再更新,sphinxsearch的版本太低,bug也會(huì)出現(xiàn);后來(lái)也使用最新的sphinxsearch,它可以支持幾乎所有語(yǔ)言,通過(guò)其內(nèi)置的ngram tokenizer對(duì)中文進(jìn)行索引和搜索。
但是,像中文、日文、韓文這種文字使用ngram還是有很大弊端的:
當(dāng)Ngram=1時(shí),中文(日文、韓文)被分解成一個(gè)個(gè)的單字,就像把英文分解成一個(gè)個(gè)字母那樣。這會(huì)導(dǎo)致每個(gè)單字的索引很長(zhǎng),搜索效率下降,同時(shí)搜索結(jié)果習(xí)慣性比較差。
當(dāng)Ngram=2或更大時(shí),會(huì)產(chǎn)生很多無(wú)意義的“組合”,比如“的你”、“為什”等,導(dǎo)致索引的字典、索引文件等非常大,同時(shí)也影響搜索速度。
基于以上弊端,為中日韓文本加入分詞的tokenizer是很有必要的。
于是決定來(lái)做這件事。先去Sphinxsearch網(wǎng)站去看看,發(fā)現(xiàn)它已經(jīng)發(fā)布了新的3.x版本,而且加入了很多很棒的特性,然而它從Sphinxsearch 3.x 開(kāi)始,暫時(shí)不再開(kāi)源. 不過(guò),部分前Sphinxsearch的開(kāi)發(fā)人員跳出來(lái)成立新團(tuán)隊(duì),在Sphinx 2.x版本基礎(chǔ)上開(kāi)發(fā)自己的Manticoresearch。這兩者很像,從它們的名字就可以看出來(lái),這倆都是獅身怪獸。
Sphinx 是(古埃及)獅身人面像,Manticore 是(傳說(shuō)中的)人頭獅身龍(蝎)尾怪獸
Manticoresearch 從Sphinxsearch 繼承而來(lái), 并做了性能優(yōu)化. 因此,我選擇了Manticoresearch 來(lái)添加中日韓分詞。
首先從Manticoresearch的github倉(cāng)庫(kù)pull最新的代碼來(lái)談價(jià),后面我也會(huì)盡力與Manticoresearch的主分支保持同步。
算法實(shí)現(xiàn)
算法基于字典,具體是cedar的實(shí)現(xiàn)的雙數(shù)組trie。cedar是C++實(shí)現(xiàn)的高效雙數(shù)組trie,也是分詞字典的最佳之選。cedar的協(xié)議是GNU GPLv2, LGPLv2.1, and BSD;或者email聯(lián)系作者所要其它協(xié)議。
通過(guò)最小匹配(而非單字)來(lái)匹配字典和字符串,把字符串分割成最短(而非單字)的詞。如果遇到處理不了的歧義時(shí),以單字做詞。這樣的目的是,保證搜索時(shí)能找到這些內(nèi)容而不丟失。
稍微解釋一下,對(duì)于搜索引擎的分詞為什么這么做:
搜索引擎要能找到盡可能全內(nèi)容:最徹底的方法是ngram=1,每個(gè)字多帶帶索引,這樣你搜索一個(gè)單字“榴”時(shí),含有“榴蓮”的文本會(huì)被找到,但缺點(diǎn)就如前面所說(shuō)。
搜索引擎要能找到盡可能相關(guān)的內(nèi)容: 分詞就是比較好的方法,對(duì)詞進(jìn)行索引,這樣你搜索一個(gè)單字“榴”時(shí),含有“榴蓮”的文本就不會(huì)被找到。但分詞的粒度要小,比如“編程語(yǔ)言”這是一個(gè)詞組,如果把這個(gè)分成一個(gè)詞,你搜索“編程”時(shí),就找不到只含“編程語(yǔ)言”的文本,同樣的,“上海市”要分成“上?!焙汀笆小保鹊?。所以,“最小匹配”適用于搜索引擎。
編譯安裝
從github倉(cāng)庫(kù)manticoresearch-seg獲取源碼,編譯方法跟Manticoresearch一樣,具體看官方文檔。
使用方法
準(zhǔn)備詞表 把所有詞寫(xiě)到一個(gè)txt文件,一行一個(gè)詞,如下所示:
words.txt中文
中國(guó)語(yǔ)
???
創(chuàng)建字典 成功編譯代碼后,就會(huì)得到創(chuàng)建字典的可執(zhí)行程序make_segdictionary. 然后執(zhí)行命令:
./make_segdictionary words.txt words.dict
這樣就得到了字典文件: words.dict
配置索引 只需在配置文件的 index {...} 添加一行即可:
index {
... seg_dictionary = path-to-your-segmentation-words-dictionary ...
}
提醒: 分詞對(duì)批量索引和實(shí)時(shí)索引都起作用。
吐槽
添加分詞最初的想法是,我的代碼作為新增文件加入項(xiàng)目,只在原有文件個(gè)別處添加就好。這樣做分得比較清楚,后面對(duì)manticore官方倉(cāng)庫(kù)提交代碼也比較清晰。于是就嘗試這樣做。
然而,Sphinx的代碼組織的真是有點(diǎn)亂,Manticore沿用Sphinx的代碼所以架構(gòu)是一樣的。最大的一個(gè)cpp文件sphinx.cpp 竟然有3萬(wàn)多行代碼,很多類(lèi)的聲明直接放在這個(gè).cpp 文件里面,而沒(méi)有放到頭文件sphinx.h里面。 因?yàn)槲覍?shí)現(xiàn)的分詞tokenizer必須要繼承它的類(lèi)保持接口一致。嘗試著把cpp文件的一些聲明移到.h文件,結(jié)果是越移越多,要對(duì)原始文件做很大改動(dòng),甚至可能要重新架構(gòu)源代碼。不是不可以重新架構(gòu),一來(lái)會(huì)很費(fèi)時(shí)間,二來(lái)向官方提交代碼很難被接受,三是跟官方代碼保持同步就很費(fèi)勁,最終還是在原來(lái)sphinx.cpp文件中添加分詞tokenizer: CSphTokenizer_UTF8Seg 。
當(dāng)然,Sphinx的代碼的類(lèi)的繼承關(guān)系比較清晰,繼承原來(lái)的tokenizer實(shí)現(xiàn)新的也不算費(fèi)事,修改了4個(gè)源碼文件就添加好了分詞tokenizer。
文章首發(fā)于我的個(gè)人博客猿人學(xué)
你也可以關(guān)注我的個(gè)人公眾號(hào):猿人學(xué)Python
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43516.html
摘要:此文成于年月現(xiàn)狀目前的穩(wěn)定版本為目前對(duì)英文等字母語(yǔ)言采用空格分詞故其對(duì)中文分詞支持不好目前官方中文分詞方案僅支持按單字分詞在基礎(chǔ)上目前國(guó)內(nèi)有兩個(gè)中文分詞解決方案一個(gè)是一個(gè)是沒(méi)有官網(wǎng)文檔較少可查到的最新版本可支持官方還在維護(hù)但貌似不打 NOTE : 此文成于 2017 年 3 月. 現(xiàn)狀: Sphinx 目前的穩(wěn)定版本為 2.2.11.Sphinx 目前對(duì)英文等字母語(yǔ)言采用空格分詞,故...
摘要:此文成于年月現(xiàn)狀目前的穩(wěn)定版本為目前對(duì)英文等字母語(yǔ)言采用空格分詞故其對(duì)中文分詞支持不好目前官方中文分詞方案僅支持按單字分詞在基礎(chǔ)上目前國(guó)內(nèi)有兩個(gè)中文分詞解決方案一個(gè)是一個(gè)是沒(méi)有官網(wǎng)文檔較少可查到的最新版本可支持官方還在維護(hù)但貌似不打 NOTE : 此文成于 2017 年 3 月. 現(xiàn)狀: Sphinx 目前的穩(wěn)定版本為 2.2.11.Sphinx 目前對(duì)英文等字母語(yǔ)言采用空格分詞,故...
摘要:簡(jiǎn)介是開(kāi)源的搜索引擎,它支持英文的全文檢索。但是往往我們要求的是中文索引,怎么做呢國(guó)人提供了一個(gè)可供企業(yè)使用的,基于的中文全文檢索引擎。 Sphinx 簡(jiǎn)介 Sphinx是開(kāi)源的搜索引擎,它支持英文的全文檢索。所以如果單獨(dú)搭建Sphinx,你就已經(jīng)可以使用全文索引了。但是往往我們要求的是中文索引,怎么做呢?國(guó)人提供了一個(gè)可供企業(yè)使用的,基于Sphinx的中文全文檢索引擎。也就是說(shuō)Cor...
摘要:簡(jiǎn)介是開(kāi)源的搜索引擎,它支持英文的全文檢索。但是往往我們要求的是中文索引,怎么做呢國(guó)人提供了一個(gè)可供企業(yè)使用的,基于的中文全文檢索引擎。 Sphinx 簡(jiǎn)介 Sphinx是開(kāi)源的搜索引擎,它支持英文的全文檢索。所以如果單獨(dú)搭建Sphinx,你就已經(jīng)可以使用全文索引了。但是往往我們要求的是中文索引,怎么做呢?國(guó)人提供了一個(gè)可供企業(yè)使用的,基于Sphinx的中文全文檢索引擎。也就是說(shuō)Cor...
閱讀 1037·2021-10-19 11:42
閱讀 2991·2021-09-10 10:51
閱讀 697·2021-09-09 09:33
閱讀 1781·2021-09-01 10:43
閱讀 2784·2019-08-30 12:43
閱讀 3530·2019-08-30 11:24
閱讀 2136·2019-08-30 10:56
閱讀 2788·2019-08-29 11:00