在 lucene 中,我们是使用 IndexWriter 调用 Analyzer 将文章切成以词为单位的 Stream,然后生成索引的。lucene 内建的分词器很多,比如:按空白字符分词的WhitespaceAnalyzer,添加了stopword过滤的StopAnalyzer,以及最常用的是StandardAnalyzer。这些自带的分词器对中文支持多不好,我觉得比较好的中文分词器是 mmseg4j 。
mmseg4j 是用 Chih-Hao Tsai 的 MMSeg 算法实现的中文分词器。并实现了 lucene 的 analyzer 和 solr 的 TokenizerFactory 以方便在 Lucene 和 Solr 中使用。
对 lucene 来说 ,mmseg4j 有以下四个 analyzer:SimpleAnalyzer、ComplexAnalyzer、MaxWordAnalyzer、MMSegAnalyzer。前面三个都是继承 MMSegAnalyzer,MMSegAnalyzer 默认使用 max-word 方式分词。
上面四个分次类涉及到了三个分词方法:Simple、Complex、max-word。MMSeg 算法有两种分词方法:Simple 和 Complex,都是基于正向最大匹配。mmseg4j 1.6 版开始在 Complex 算法基础上实现了最多分词(max-word)。类似如下的分词就是 max-word 分词:“很好听” -> "很好|好听"; “中华人民共和国” -> "中华|华人|共和|国"; “中国人民银行” -> "中国|人民|银行"。
mmseg4j 的词库是使用 utf-8 格式的,由于 utf-8 文件有带与不带 BOM 之分,建议词库第一行为空行或为无 BOM 格式的 utf-8 文件。
jar 中已有了,只有你对这个不满意时才需要替换的词库文件:
- data/chars.dic 是单字与语料中的频率,一般不用改动,mmseg4j 1.5版本后已经加到mmseg4j的jar里了,我们不需要关心它,当然你在词库目录放这个文件可以覆盖它。
- data/units.dic 是单字的单位,默认读jar包里的,你也可以自定义覆盖它,这功能是试行,如果不喜欢它,可以空的units.dic文件(放到你的词库目录下)覆盖它。
词库文件:
- data/words.dic 是词库文件,一行一词,当然你也可以使用自己的,1.5版本使用 sogou 词库,1.0的版本是用 rmmseg 带的词库。 一般我们使用这个作为系统自带词库。分词效果当然还与词库有关,sogou 的词库是统计得出,有些高频的单字组合也成了词,如“我们的”。如果还要提高 mmseg4j 的分词效果,还要在整理下词库。
- data/wordsxxx.dic 1.6版支持多个词库文件,data 目录(或你定义的目录)下读到"words"前缀且".dic"为后缀的文件。如:data/words-my.dic。 一般我们在这里里面,把这个当成我们自身特色的词库。
停止词
- mmseg4j 没有加任何 stopword,如果需要 stopword ,需要用户自己实现。作者认为:这东西留给使用者自己加,因为作者不认为加 stopword 是好的方法。如音乐搜索,给加上 the,this……,还能找到歌曲?
参考资料:
mmseg4j 作者的博客
http://blog.chenlb.com
中文分词 mmseg4j 在 lucene 中的使用示例
http://blog.chenlb.com/2009/04/use-chinese-segment-mmseg4j-in-lucene-demo.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示