给全文搜索引擎Manticore (Sphinx) search 增加中文分词-阿里云开发者社区

开发者社区> xiaoyuaner> 正文

给全文搜索引擎Manticore (Sphinx) search 增加中文分词

简介: Sphinx search 是一款非常棒的开源全文搜索引擎,它使用C++开发,索引和搜索的速度非常快,我使用sphinx的时间也有好多年了。最初使用的是coreseek,一个国人在sphinxsearch基础上添加了mmseg分词的搜索引擎,可惜后来不再更新,sphinxsearch的版本太低,bug也会出现;后来也使用最新的sphinxsearch,它可以支持几乎所有语言,通过其内置的ngram tokenizer对中文进行索引和搜索。
+关注继续查看

QQ_20190314094950

Sphinx search 是一款非常棒的开源全文搜索引擎,它使用C++开发,索引和搜索的速度非常快,我使用sphinx的时间也有好多年了。最初使用的是coreseek,一个国人在sphinxsearch基础上添加了mmseg分词的搜索引擎,可惜后来不再更新,sphinxsearch的版本太低,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的主分支保持同步。

算法实现

算法基于字典,具体是cedar的实现的双数组trie。cedar是C++实现的高效双数组trie,也是分词字典的最佳之选。cedar的协议是GNU GPLv2, LGPLv2.1, and BSD;或者email联系作者所要其它协议。

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

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

搜索引擎要能找到尽可能全内容:最彻底的方法是ngram=1,每个字单独索引,这样你搜索一个单字“榴”时,含有“榴莲”的文本会被找到,但缺点就如前面所说。
搜索引擎要能找到尽可能相关的内容: 分词就是比较好的方法,对词进行索引,这样你搜索一个单字“榴”时,含有“榴莲”的文本就不会被找到。但分词的粒度要小,比如“编程语言”这是一个词组,如果把这个分成一个词,你搜索“编程”时,就找不到只含“编程语言”的文本,同样的,“上海市”要分成“上海”和“市”,等等。所以,“最小匹配”适用于搜索引擎。
编译安装

从github仓库manticoresearch-seg获取源码,编译方法跟Manticoresearch一样,具体看官方文档。

使用方法

  1. 准备词表 把所有词写到一个txt文件,一行一个词,如下所示:
# words.txt
中文
中国語
중국어
  1. 创建字典 成功编译代码后,就会得到创建字典的可执行程序make_segdictionary. 然后执行命令:
./make_segdictionary words.txt words.dict

这样就得到了字典文件: words.dict

  1. 配置索引 只需在配置文件的 index {...} 添加一行即可:
index {
    ...
    seg_dictionary = path-to-your-segmentation-words-dictionary
    ...
}

提醒: 分词对批量索引和实时索引都起作用。

吐槽

添加分词最初的想法是,我的代码作为新增文件加入项目,只在原有文件个别处添加就好。这样做分得比较清楚,后面对manticore官方仓库提交代码也比较清晰。于是就尝试这样做。

然而,Sphinx的代码组织的真是有点乱,Manticore沿用Sphinx的代码所以架构是一样的。最大的一个cpp文件sphinx.cpp 竟然有3万多行代码,很多类的声明直接放在这个.cpp 文件里面,而没有放到头文件sphinx.h里面。 因为我实现的分词tokenizer必须要继承它的类保持接口一致。尝试着把cpp文件的一些声明移到.h文件,结果是越移越多,要对原始文件做很大改动,甚至可能要重新架构源代码。不是不可以重新架构,一来会很费时间,二来向官方提交代码很难被接受,三是跟官方代码保持同步就很费劲,最终还是在原来sphinx.cpp文件中添加分词tokenizer: CSphTokenizer_UTF8Seg 。

当然,Sphinx的代码的类的继承关系比较清晰,继承原来的tokenizer实现新的也不算费事,修改了4个源码文件就添加好了分词tokenizer。

文章来自于猿人学博客:Python教程

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ANT 运行jar包的中文乱码问题
in eclipse.  在ant中打包成jar文件后,运行,出现的中文乱码问题。 解决方法: 1. 确保eclipse中项目的编码统一. 如:全设置成UTF-8. 2. 在ant task下加如下运行参数: http://www.
574 0
Android官方开发文档Training系列课程中文版:连接无线设备之网络服务搜索功能
原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/index.html 引言 Android设备除了可以与服务器建立连接之外,Android无线API还允许处于同一网段下的两台设备建立连接,或者是物理距离相近的两台设备建立连接。
825 0
CXF配置,ant文件说明及运行,运行cxf中带的项目
安装CXF时需要Tomcat,ant,并设置以下环境变量: JAVA_HOME:        C:\Program Files (x86)\Java\jdk1.6.0_25 CXF_HOME:          D:\Installed\apache-cxf-2.4.2 ANT_HOME:           D:\Installed\apache-ant-1.8.2 CATAL
1055 0
用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询
用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询作者digoal 日期2017-12-05 标签PostgreSQL , 搜索引擎 , GIN , ranking , high light , 全文检索 , 模糊查询 , 正则查询 , 相似查询 , ADHOC查询 背景字符串搜索是非常常见的业务需求,它包括: 1、前缀+模糊查询。
5449 0
Mac mysql 解决中文乱码
Mac mysql 解决中文乱码问题 出现“???”之类的无法识别的乱码 到/etc目录下自己建一个my.cnf文件(需要最高权限,使用sudo su),然后写入内容: [client] default-character-set=utf8 [mysqld] character-set-server=utf8 保存,修改。
966 0
Solrflux源码分析-Sql Support within Solr-类Sql的solr搜索实现(2)
Solrflux 开源code google 地址 http://code.google.com/p/solrflux/ 1.Solrflux 概述    Solrflux 主要工作是完成 Sql 语法到solr语法的转换,并执行查询,保存结果。    当前solrflux已经停止更新了,
1858 0
+关注
20
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载