Manticore search加一个中文分词

网友投稿 653 2022-05-30

在互联网高速发展的今天,信息也呈现出爆炸式的增长。在海量信息中我们如何利用机器快速地提取我们想要的信息?

因为一篇文章没有特别的符号来将词语呈现出来,所以我们用机器进行中文处理的时候,首先就需要对中文语句进行分词。

下面我们来看看如何实现的

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的主分支保持同步。

Manticore search加一个中文分词

算法实现

通过最小匹配(而非单字)来匹配字典和字符串,把字符串分割成最短(而非单字)的词。如果遇到处理不了的歧义时,以单字做词。这样的目的是,保证搜索时能找到这些内容而不丢失。

稍微解释一下,对于搜索引擎的分词为什么这么做:

搜索引擎要能找到尽可能全内容:最彻底的方法是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小时内删除侵权内容。

上一篇:Docker容器+Phoronix-Test-Suite测试X86和ARM的ffmpeg转码性能
下一篇:Linux和Windows环境下编译presto
相关文章