Jcseg简介
Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言直接http调用,同时提供了最新版本的lucene, solr, elasticsearch的分词接口!Jcseg自带了一个 jcseg.properties文件用于快速配置而得到适合不同场合的分词应用,例如:最大匹配词长,是否开启中文人名识别,是否追加拼音,是否追加同义词等!
下载地址
https://gitee.com/lionsoul/jcseg
Jcseg核心功能
- 中文分词:mmseg算法 + Jcseg 独创的优化算法,七种切分模式。
- 关键字提取:基于textRank算法。
- 关键短语提取:基于textRank算法。
- 关键句子提取:基于textRank算法。
- 文章自动摘要:基于BM25+textRank算法。
- 自动词性标注:基于词库+(统计歧义去除计划),目前效果不是很理想,对词性标注结果要求较高的应用不建议使用。
- 命名实体标注:基于词库+(统计歧义去除计划),电子邮件,网址,大陆手机号码,地名,人名,货币,datetime时间,长度,面积,距离单位等。
- Restful api:嵌入jetty提供了一个绝对高性能的server模块,包含全部功能的http接口,标准化json输出格式,方便各种语言客户端直接调用。
Jcseg中文分词
切分模式
- 简易模式:FMM算法,适合速度要求场合。
- 复杂模式:MMSEG四种过滤算法,具有较高的歧义去除,分词准确率达到了98.41%。
- 检测模式:只返回词库中已有的词条,很适合某些应用场合。
- 最多模式:细粒度切分,专为检索而生,除了中文处理外(不具备中文的人名,数字识别等智能功能)其他与复杂模式一致(英文,组合词等)。
- 分隔符模式:按照给定的字符切分词条,默认是空格,特定场合的应用。
- NLP模式:继承自复杂模式,更改了数字,单位等词条的组合方式,增加电子邮件,大陆手机号码,网址,人名,地名,货币等以及无限种自定义实体的识别与返回。
- n-gram模式:CJK和拉丁系字符的通用n-gram切分实现。
Jcseg配置与使用
Maven仓库
- jcseg-core
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-core</artifactId>
<version>2.6.2</version>
</dependency>
- jcseg-analyzer (lucene或者solr)
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-analyzer</artifactId>
<version>2.6.2</version>
</dependency>
- jcseg-elasticsearch
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-elasticsearch</artifactId>
<version>2.6.2</version>
</dependency>
- jcseg-server (独立的应用服务器)
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>jcseg-server</artifactId>
<version>2.6.2</version>
</dependency>
solr分词接口
将jcseg-core-{version}.jar和jcseg-analyzer-{version}.jar 复制到solr 的类库目录中。
在solr的scheme.xml加入如下配置:
<!-- 复杂模式分词: -->
<fieldtype name="textComplex" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="complex"/>
</analyzer>
</fieldtype>
<!-- 简易模式分词: -->
<fieldtype name="textSimple" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="simple"/>
</analyzer>
</fieldtype>
<!-- 检测模式分词: -->
<fieldtype name="textDetect" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="detect"/>
</analyzer>
</fieldtype>
<!-- 检索模式分词: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="most"/>
</analyzer>
</fieldtype>
<!-- NLP模式分词: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="nlp"/>
</analyzer>
</fieldtype>
<!-- 空格分隔符模式分词: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="delimiter"/>
</analyzer>
</fieldtype>
<!-- n-gram模式分词: -->
<fieldtype name="textSearch" class="solr.TextField">
<analyzer>
<tokenizer class="org.lionsoul.jcseg.analyzer.JcsegTokenizerFactory" mode="ngram"/>
</analyzer>
</fieldtype>
对于需要分词的field,需要设置其分词类型
<field name="title" type="textNLP" indexed="true" stored="true"/>
<field name="bookname" type="textNLP" indexed="true" stored="true"/>
分词效果
查询结果
查询title字段为“春”
能够分出“春”的title都被查出来了
事实上,分词结果如下:
局限性
但是,自带的NLP分词是有局限性的,如我们搜索bookname为“唐”的数据
如上图所示,仅仅能查出《唐选》,那么《全唐文》为何查不到?
尝试查看分词结果
发现“唐文”作为一个整体,只有查询这两个字才可以查到,这也是jcseg自带的NLP分词工具的局限性,不过jcseg支持定制化,后续可以自定义分词规则