干货|全文检索Solr集成HanLP中文分词

2017 年 8 月 27 日 全球人工智能

“全球人工智能”拥有十多万AI产业用户,核心用户来自:北大,清华,中科院,麻省理工,卡内基梅隆,斯坦福,哈佛,牛津,剑桥......以及谷歌,腾讯,百度,脸谱,微软,阿里,海康威视,英伟达......等全球名校和名企。


- 加入AI投融资社群>>

加入AI企业高管群>>

加入AI技术专家群>>

以前发布过HanLP的Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在Github上,欢迎改进。HanLP中文分词solr插件支持Solr5.x,兼容Lucene5.x。

快速上手


  1. 将hanlp-portable.jar和hanlp-solr-plugin.jar共两个jar放入${webapp}/WEB-INF/lib

  2. 修改solr core的配置文件${core}/conf/schema.xml

  
    
    
    
  1.   <fieldType name="text_cn" class="solr.TextField">

  2.       <analyzer type="index">

  3.           <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="true"/>

  4.       </analyzer>

  5.       <analyzer type="query">

  6.           <!-- 切记不要在query中开启index模式 -->

  7.           <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="false"/>

  8.       </analyzer>

  9.   </fieldType>

  10.   <!-- 业务系统中需要分词的字段都需要指定type为text_cn -->

  11.   <field name="my_field1" type="text_cn" indexed="true" stored="true"/>

  12.   <field name="my_field2" type="text_cn" indexed="true" stored="true"/>


Solr5中文分词器详细配置


对于新手来说,上面的两步可能太简略了,不如看看下面的step by step。本教程使用Solr5.2.1,理论上兼容solr5.x。

放置jar

将上述两个jar放到solr-5.2.1/server/solr-webapp/webapp/WEB-INF/lib目录下。

启动solr

首先在solr-5.2.1\bin目录下启动solr:

  
    
    
    
  1. solr start -f

用浏览器打开http://localhost:8983/solr/#/,看到如下页面说明一切正常:

创建core

在solr-5.2.1\server\solr下新建一个目录,取个名字比如叫one,将示例配置文件solr-5.2.1\server\solr\configsets\sample_techproducts_configs\conf拷贝过来,接着修改schema.xml中的默认域type,搜索

  
    
    
    
  1.     <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">

  2.         ...

  3.     </fieldType>

替换为

  
    
    
    
  1.     <!-- 默认文本类型: 指定使用HanLP分词器,同时开启索引模式。

  2.  通过solr自带的停用词过滤器,使用"stopwords.txt"(默认空白)过滤。

  3.  在搜索的时候,还支持solr自带的同义词词典。-->

  4.     <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">

  5.       <analyzer type="index">

  6.         <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="true"/>

  7.         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />

  8.         <!-- 取消注释可以启用索引期间的同义词词典

  9.         <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>

  10.         -->

  11.         <filter class="solr.LowerCaseFilterFactory"/>

  12.       </analyzer>

  13.       <analyzer type="query">

  14.         <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="true"/>

  15.         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />

  16.         <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

  17.         <filter class="solr.LowerCaseFilterFactory"/>

  18.       </analyzer>

  19.     </fieldType>

意思是默认文本字段类型启用HanLP分词器,text_general还开启了solr默认的各种filter。

solr允许为不同的字段指定不同的分词器,由于绝大部分字段都是text_general类型的,可以说这种做法比较适合新手。如果你是solr老手的话,你可能会更喜欢单独为不同的字段指定不同的分词器及其他配置。如果你的业务系统中有其他字段,比如location,summary之类,也需要一一指定其type="text_general"。切记,否则这些字段仍旧是solr默认分词器,会造成这些字段“搜索不到”。

另外,切记不要在query中开启indexMode,否则会影响PhaseQuery。indexMode只需在index中开启一遍即可,要不然它怎么叫indexMode呢。

如果你不需要solr提供的停用词、同义词等filter,如下配置可能更适合你:

  
    
    
    
  1.   <fieldType name="text_cn" class="solr.TextField">

  2.       <analyzer type="index">

  3.           <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="true"/>

  4.       </analyzer>

  5.       <analyzer type="query">

  6.           <!-- 切记不要在query中开启index模式 -->

  7.           <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="false"/>

  8.       </analyzer>

  9.   </fieldType>

  10.   <!-- 业务系统中需要分词的字段都需要指定type为text_cn -->

  11.   <field name="my_field1" type="text_cn" indexed="true" stored="true"/>

  12.   <field name="my_field2" type="text_cn" indexed="true" stored="true"/>

完成了之后在solr的管理界面导入这个core one:

接着就能在下拉列表中看到这个core了:

上传测试文档

修改好了,就可以拿一些测试文档来试试效果了。hanlp-solr-plugin代码库中的src/test/resources下有个测试文档集合documents.csv,其内容如下:

代表着id从1到5共五个文档,接下来复制solr-5.2.1\example\exampledocs下的上传工具post.jar到resources目录,利用如下命令行将数据导入:

Windows用户的话直接双击该目录下的upload.cmd即可,Linux用户运行upload.sh。

正常情况下输出如下结果:

同时刷新一下core one的Overview,的确看到了5篇文档:

搜索文档

是时候看看HanLP分词的效果了,点击左侧面板的Query,输入“和服”试试:

发现精确地查到了“和服的价格是每镑15便士”,而不是“商品和服务”这种错误文档:

这说明HanLP工作良好。

要知道,不少中文分词器眉毛胡子一把抓地命中“商品和服务”这种错误文档,降低了查准率,拉低了用户体验,跟原始的MySQL LIKE有何区别?

索引模式的功能

索引模式可以对长词进行全切分,得到其中蕴含的所有词汇。比如“中医药大学附属医院”在HanLP索引分词模式下的切分结果为:

开启indexMode后,无论用户搜索“中医”“中医药”还是“医药”,都会搜索到“中医药大学附属医院”:

高级配置

目前本插件支持如下基于schema.xml的配置:

对于更高级的配置,HanLP分词器主要通过class path下的hanlp.properties进行配置,请阅读HanLP自然语言处理包文档以了解更多相关配置,如:

  1. 停用词

  2. 用户词典

  3. 词性标注

  4. ……

代码调用

在Query改写的时候,可以利用HanLPAnalyzer分词结果中的词性等属性,如

在另一些场景,支持以自定义的分词器(比如开启了命名实体识别的分词器、繁体中文分词器、CRF分词器等)构造HanLPTokenizer,比如:

热门文章推荐

推荐|变形卷积核、可分离卷积?CNN中十大操作!

她:13岁造飞机,17岁进MIT,22岁到哈佛读博!

火爆了!全球最火爆的人脸识别技术应用: FaceDance Challenge!

厉害!科大讯飞市值奔1000亿,市盈率达400倍成“妖股”!

残酷!如果你35岁破产,你还有多大可能逆袭?

重磅!大数据告诉你:逃离北上广,他们都去了哪里?

推荐|斯坦福2017春季CS231n深度视觉识别课程视频

行情|年薪30万-50万,大数据人才缺口150万!

“扫地机器人”的工程师:你出来,我们保证不打死你!

AI知识网络|一张图看懂人工智能知识体系 

登录查看更多
4

相关内容

【ACL2020-复旦大学NLP】异构图神经网络的文档摘要提取
专知会员服务
34+阅读 · 2020年5月1日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
29+阅读 · 2020年4月12日
【阿里技术干货】知识结构化在阿里小蜜中的应用
专知会员服务
96+阅读 · 2019年12月14日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【资源】NLP多标签文本分类代码实现工具包
专知
40+阅读 · 2019年11月20日
一文掌握 HanLP 用法
人工智能头条
24+阅读 · 2019年5月9日
抖音爬虫
专知
3+阅读 · 2019年2月11日
自然语言处理 | 使用Spacy 进行自然语言处理
机器学习和数学
18+阅读 · 2018年8月22日
Python NLP入门教程
Python开发者
9+阅读 · 2017年11月19日
HULAC:一个高效的中文词法分析工具包(清华)
全球人工智能
5+阅读 · 2017年11月12日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
A Survey of Deep Learning for Scientific Discovery
Arxiv
29+阅读 · 2020年3月26日
Arxiv
15+阅读 · 2019年6月25日
Transfer Adaptation Learning: A Decade Survey
Arxiv
37+阅读 · 2019年3月12日
Arxiv
22+阅读 · 2018年8月30日
VIP会员
相关资讯
【资源】NLP多标签文本分类代码实现工具包
专知
40+阅读 · 2019年11月20日
一文掌握 HanLP 用法
人工智能头条
24+阅读 · 2019年5月9日
抖音爬虫
专知
3+阅读 · 2019年2月11日
自然语言处理 | 使用Spacy 进行自然语言处理
机器学习和数学
18+阅读 · 2018年8月22日
Python NLP入门教程
Python开发者
9+阅读 · 2017年11月19日
HULAC:一个高效的中文词法分析工具包(清华)
全球人工智能
5+阅读 · 2017年11月12日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
相关论文
Top
微信扫码咨询专知VIP会员