Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考

前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移。因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3.6.0 ,PanGu分词也是对应Lucene3.6.0版本的。不过好在Lucene.net 已经有了Core 2.0版本(4.8.0 bate版),而PanGu分词,目前有人正在做,貌似已经做完,只是还没有测试~,Lucene升级的改变我都会加粗表示。

Lucene.net 4.8.0   

https://github.com/apache/lucenenet

PanGu分词

https://github.com/LonghronShen/Lucene.Net.Analysis.PanGu/tree/netcore2.0

 

Lucene.net 4.8.0 和之前的Lucene.net 3.6.0 改动还是相当多的,这里对自己开发过程遇到的问题,做一个记录吧,希望可以帮到和我一样需要升级Lucene.net的人。我也是第一次接触Lucene ,也希望可以帮助初学Lucene的同学。

 

目录

  • Lucene.net(4.8.0) 学习问题记录一:分词器Analyzer的构造和内部成员ReuseStategy
  • Lucene.net(4.8.0) 学习问题记录二: 分词器Analyzer中的TokenStream和AttributeSource
  • Lucene.net(4.8.0) 学习问题记录三: 索引的创建 IndexWriter 和索引速度的优化
  • Lucene.net(4.8.0) 学习问题记录四: IndexWriter 索引的优化以及思考

 

一,PanGu分词与JIEba分词

1.中文分词工具

Lucene的自带分词工具对中文分词的效果很是不好。因此在做中文的搜索引擎的时候,我们需要用额外的中文分词组件。这里可以总结一下中文分词工具有哪些,在下面这个衔接中,有对很多中文分词工具的性能测试:

https://github.com/ysc/cws_evaluation

可惜我们看不到PanGu分词的性能,在PanGu分词的官网我们可以看到:Core Duo 1.8 GHz 下单线程 分词速度为 390K 字符每秒,2线程分词速度为 690K 字符每秒。 在上面的排行榜中属于中等吧。但由于我做的是基于.net的搜索引擎,所以我只找到了IK分词器,PanGu分词器,JIEba分词器的.net core2.0 版本。

1.1 PanGu分词 .net core 版

这是PanGu分词.net core 2.0版本的迁移项目:

https://github.com/LonghronShen/Lucene.Net.Analysis.PanGu/tree/netcore2.0

这是一个没有迁移完全的项目,在使用过程中遇到了一些问题,前面的目录中记录过。我修改了一些bug,下面的是修改过后的可以直接使用的PanGu分词.net core2.0版本:

https://github.com/SilentCC/Lucene.Net.Analysis.PanGu/tree/netcore2.0

我提交了一个Pull Request ,作者还没有合并。我已经用了一段时间,很稳定。

1.2 JIEba分词 .net core 版

JIEba分词的.net core 版本迁移项目:

https://github.com/linezero/jieba.NET

但是这是.net core1.0的版本,拿过来也不能直接给Lucene使用,所以我升级到了2.0并且做了一个接口,让其支持Lucene,经过测试可以稳定的进行分词和高亮。当然在其中也遇到了一些问题,在下文中会详细阐述。这是改过之后的Lucene版:

https://github.com/SilentCC/JIEba-netcore2.0

1.3 IK分词 .net core 版

在Nuget中可以搜索到(IKNetAnalyzer)

在GitHub中   https://github.com/stanzhai/IKAnalyzer.NET  显示正在开发中。由于一些原因,我并没有使用IK分词。所以也就没有细看了。

 

2.PanGu分词和JIEba分词的对比

Lucene和PanGu分词搭配,已经是Lucene.net 的经典搭配,但是PanGu分词已经很久没有更新,PanGu分词的字典也是很久以前维护的字典。在网上可以找到很多Lucene和PanGu分词搭配的例子。在PanGu分词和JIEba分词对比中,我选择了JIEba分词。因为我的搜索引擎一直是使用PanGu分词,然后却时常出现有些比较新的冷的词,无法被分词,导致搜索效果很差。究其原因,是PanGu分词的字典不够大,但是人工维护字典很烦。当然PanGu分词有新词录入的功能,我一直打开这个功能的开关:

1
2
MatchOptions m =  new  MatchOptions();
m.UnknownWordIdentify =  true ;

 然而并没有改善。后来我使用了JIEba分词测试分词效果,发现JIEba分词使用搜索引擎模式,和PanGu分词打开多元分词功能开关时的分词效果如下:

1
2
3
4
5
测试样例:小明硕士毕业于中国科学院计算所,后在日本京都大学深造
 
结巴分词(搜索引擎模式):小明/ 硕士/ 毕业/ 于/ 中国/ 科学/ 学院/ 科学院/ 中国科学院/ 计算/ 计算所/ ,/ 后/ 在/ 日本/ 京都/ 大学/ 日本京都大学/ 深造
 
盘古分词(开启多元分词开关): 小  明  硕士  毕业  于  中国科学院  计算所  后  在  日本  京都  大学  深造

 显然PanGu分词并没有细粒度分词,这是导致有些搜索召回率很低的原因。

这里就不对PanGu分词,和JIEba分词的具体分词方法进行比较了。本篇博文的还是主要讲解Lucene和JIEba分词

二,JIEba分词支持Lucene

在上

你可能感兴趣的:(Lucene,Lucene,分词)