青年IT男

个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。微信公众号:青年IT男。

Jcseg-分词

Jcseg-分词

Jcseg是什么?


Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言直接http调用,同时提供了最新版本的lucene, solr, elasticsearch的分词接口!Jcseg自带了一个 jcseg.properties文件用于快速配置而得到适合不同场合的分词应用,例如:最大匹配词长,是否开启中文人名识别,是否追加拼音,是否追加同义词等!

Jcseg核心功能:


  • 中文分词:mmseg算法 + Jcseg 独创的优化算法,四种切分模式。
  • 关键字提取:基于textRank算法。
  • 关键短语提取:基于textRank算法。
  • 关键句子提取:基于textRank算法。
  • 文章自动摘要:基于BM25+textRank算法。
  • 自动词性标注:基于词库+(统计歧义去除计划),目前效果不是很理想,对词性标注结果要求较高的应用不建议使用。
  • 命名实体标注:基于词库+(统计歧义去除计划),电子邮件,网址,大陆手机号码,地名,人名,货币,datetime时间,长度,面积,距离单位等。
  • Restful api:嵌入jetty提供了一个绝对高性能的server模块,包含全部功能的http接口,标准化json输出格式,方便各种语言客户端直接调用。

Jcseg中文分词:


六种切分模式:

  • (1).简易模式:FMM算法,适合速度要求场合。
  • (2).复杂模式:MMSEG四种过滤算法,具有较高的歧义去除,分词准确率达到了98.41%。
  • (3).检测模式:只返回词库中已有的词条,很适合某些应用场合。
  • (4).检索模式:细粒度切分,专为检索而生,除了中文处理外(不具备中文的人名,数字识别等智能功能)其他与复杂模式一致(英文,组合词等)。
  • (5).分隔符模式:按照给定的字符切分词条,默认是空格,特定场合的应用。
  • (6).NLP模式:继承自复杂模式,更改了数字,单位等词条的组合方式,增加电子邮件,大陆手机号码,网址,人名,地名,货币等以及无限种自定义实体的识别与返回。
  1. 支持自定义词库。在lexicon文件夹下,可以随便添加/删除/更改词库和词库内容,并且对词库进行了分类。
  2. 支持词库多目录加载. 配置lexicon.path中使用’;’隔开多个词库目录.
  3. 词库分为简体/繁体/简繁体混合词库: 可以专门适用于简体切分, 繁体切分, 简繁体混合切分, 并且可以利用下面提到的同义词实现,简繁体的相互检索,  Jcseg同时提供了词库两个简单的词库管理工具来进行简繁体的转换和词库的合并。
  4. 中英文同义词追加/同义词匹配 + 中文词条拼音追加.词库整合了《现代汉语词典》和cc-cedict辞典中的词条,并且依据cc-cedict词典为词条标上了拼音,依据《中华同义词词典》为词条标上了同义词(尚未完成)。更改jcseg.properties配置文档可以在分词的时候加入拼音和同义词到分词结果中。
  5. 中文数字和中文分数识别,例如:”一百五十个人都来了,四十分之一的人。”中的”一百五十”和”四十分之一”。并且 Jcseg会自动将其转换为阿拉伯数字加入到分词结果中。如:150, 1/40。
  6. 支持中英混合词和英中混合词的识别(维护词库可以识别任何一种组合)。例如:B超, x射线, 卡拉ok, 奇都ktv, 哆啦a梦。
  7. 更好的英文支持,电子邮件,域名,小数,分数,百分数,字母和标点组合词(例如C++, c#)的识别。
  8. 自定义切分保留标点. 例如: 保留&, 就可以识别k&r这种复杂词条。
  9. 复杂英文切分结果的二次切分: 可以保留原组合,同时可以避免复杂切分带来的检索命中率下降的情况,例如QQ2013会被切分成: qq2013/ qq/ 2013,  chenxin619315@gmail.com会被切分成: chenxin619315@gmail.com/ chenxin/ 619315/ gmail/ com。
  10. 支持阿拉伯数字/小数/中文数字基本单字单位的识别,例如2012年,1.75米,38.6℃,五折,并且 Jcseg会将其转换为“5折”加入分词结果中。
  11. 智能圆角半角, 英文大小写转换。
  12. 特殊字母识别:例如:Ⅰ,Ⅱ;特殊数字识别:例如:①,⑩。
  13. 配对标点内容提取:例如:最好的Java书《java编程思想》,‘畅想杯黑客技术大赛’,被《,‘,“,『标点标记的内容。(1.6.8版开始支持)。
  14. 智能中文人名/外文翻译人名识别。中文人名识别正确率达94%以上。(中文人名可以维护lex-lname.lex,lex-dname-1.lex,lex-dname-2.lex来提高准确率),(引入规则和词性后会达到98%以上的识别正确率)。
  15. 自动中英文停止词过滤功能(需要在jcseg.properties中开启该选项,lex-stopwords.lex为停止词词库)。
  16. 词库更新自动加载功能, 开启一个守护线程定时的检测词库的更新并且加载(注意需要有对应词库目录下的的lex-autoload.todo文件的写入权限)。
  17. 自动词性标注(目前基于词库)。
  18. 自动实体的识别,默认支持:电子邮件,网址,大陆手机号码,地名,人名,货币等;词库中可以自定义各种实体并且再切分中返回。

Jcseg快速体验:


终端测试:

  1. cd到 Jcseg根目录。
  2. ant all(或者使用maven编译)
  3. 运行:java -jar jcseg-core-{version}.jar
  4. 你将看到如下的终端界面
  5. 在光标处输入文本开始测试(输入:seg_mode参数切换可以体验各种切分算法)

测试样板:

分词文本
分词结果:

Jcseg Maven仓库:

Jcseg从1.9.8才开始上传到了maven仓库!

    1. jcseg-core:
    1. jcseg-analyzer (lucene或者solr):
    1. jcseg-elasticsearch
    1. jcseg-server (独立的应用服务器)

Jcseg lucene分词接口:


  1. 导入jcseg-core-{version}.jar和jcseg-analyzer-{version}.jar
  2. demo代码:

Jcseg solr分词接口:


  1. 将jcseg-core-{version}.jar和jcseg-analyzer-{version}.jar 复制到solr 的类库目录中。
  2. 在solr的scheme.xml加入如下两种配置之一:

备注:

  1. 如果使用的是solr-4.x版本,请下载v1.9.7-release tag下的源码编译得到对应的jar,然后将上述xml中的v5x改成v4x即可。
  2. 如果是使用的是solr-6.3.0以下版本,JcsegTokenizerFactory包名路径为:org.lionsoul.jcseg.analyzer.v5x.JcsegTokenizerFactory

Jcseg elasticsearch接口:


elasticsearch.version < 2.x (Not sure)
  1. 下载最新版本的 Jcseg源码。
  2. 使用maven或者ant编译打包得到 Jcseg的系列jar包(建议使用maven,ant需要自己下载对应的依赖包)。
  3. 拷贝jcseg-analyzer-{version}.jar,jcseg-core-{version}.jar,jcseg-elasticsearch-{version}.jar到{ES_HOME}/plugins/analysis-jcseg目录下(自己建立该文件夹,如果不存在)。
  4. 拷贝一份jcseg.properties到{ES_HOME}/config/jcseg目录下(自己建立该文件夹,如果不存在)。
  5. 配置好jcseg.properties,尤其是配置lexicon.path指向正确的词库(或者将jcseg目录下的lexicon文件夹拷贝到{ES_HOME}/plugins/jcseg目录下)。
  6. 参考下载的源码中的 jcseg-elasticsearch 项目下的 config/elasticsearch.yml 配置文件,将对应的配置加到{ES_HOME}/config/elasticsearch.yml中去。
  7. 配置elasticsearch.yml或者mapping来使用 Jcseg分词插件(或者在query中指定)。
elasticsearch.version >= 2.x
  1. 下载最新版本的 Jcseg源码。
  2. 使用maven或者ant编译打包得到 Jcseg的系列jar包(建议使用maven,ant需要自己下载对应的依赖包)。
  3. 拷贝jcseg-analyzer-{version}.jar,jcseg-core-{version}.jar,jcseg-elasticsearch-{version}.jar到{ES_HOME}/plugins/jcseg目录下(自己建立该文件夹,如果不存在)。
  4. 拷贝一份jcseg.properties到{ES_HOME}/plugins/jcseg目录下(自己建立该文件夹,如果不存在)。
  5. 拷贝一份jcseg-elasticsearch/plugin/plugin-descriptor.properties到{ES_HOME}/plugins/jcseg目录下(自己建立该文件夹,如果不存在)。
  6. 配置好jcseg.properties,尤其是配置lexicon.path指向正确的词库(或者将jcseg目录下的lexicon文件夹拷贝到{ES_HOME}/plugins/jcseg目录下)。
  7. 参考下载的源码中的 jcseg-elasticsearch 项目下的 config/elasticsearch.yml 配置文件,将对应的配置加到{ES_HOME}/config/elasticsearch.yml中去。
  8. 配置elasticsearch.yml或者mapping来使用 Jcseg分词插件(或者在query中指定)。
elasticsearch.version >= 5.1.1
  1. 下载最新版本的 Jcseg源码。
  2. 使用maven或者ant编译打包得到 Jcseg的系列jar包(建议使用maven,ant需要自己下载对应的依赖包)。
  3. 拷贝jcseg-analyzer-{version}.jar,jcseg-core-{version}.jar,jcseg-elasticsearch-{version}.jar到{ES_HOME}/plugins/jcseg目录下(自己建立该文件夹,如果不存在)。
  4. 拷贝一份jcseg.properties到{ES_HOME}/plugins/jcseg目录下(自己建立该文件夹,如果不存在)。
  5. 拷贝一份jcseg-elasticsearch/plugin/plugin-descriptor.properties到{ES_HOME}/plugins/jcseg目录下(自己建立该文件夹,如果不存在)。
  6. 配置好jcseg.properties,尤其是配置lexicon.path指向正确的词库(或者将jcseg目录下的lexicon文件夹拷贝到{ES_HOME}/plugins/jcseg目录下)。
  7. mapping指定来使用 Jcseg分词插件(或者在query中指定)。

可选的analyzer名字:

配置测试地址:

也可以直接使用集成了jcseg的elasticsearch运行包:elasticsearch-jcseg,开封就可以使用。

Jcseg分词服务器:


jcseg-server模块嵌入了jetty,实现了一个绝对高性能的服务器,给jcseg的全部Api功能都加上了restful接口,并且标准化了api结果的json输出格式,各大语言直接使用http客户端调用即可。

编译jcseg:

2.3.0之前的版本:
  1. maven编译jcseg,得到jcseg-server-{version}.jar, maven已经将依赖的jar包一起编译进去了,如果是ant编译运行时请将依赖包载入。
  2. 启动jcseg server:
2.3.0之后的版本:
  1. maven编译jcseg,jcseg会在jcseg-server/target/jcseg-server目录下打包一个完整的项目,目录结构如下:

  2. 启动jcseg server:

jcseg-server.properties:

懒得翻译了,默默的多念几遍就会了!

restful api:

1. 关键字提取:

api地址:http://jcseg_server_host:port/extractor/keywords?text=&number=&autoFilter=true|false

api参数:

api返回:

更多配置请参考:org.lionsoul.jcseg.server.controller.KeywordsController

2. 关键短语提取:

api地址:http://jcseg_server_host:port/extractor/keyphrase?text=&number=

api参数:

api返回:

更多配置请参考:org.lionsoul.jcseg.server.controller.KeyphraseController

3. 关键句子提取:

api地址:http://jcseg_server_host:port/extractor/sentence?text=&number=

api参数:

api返回:

更多配置请参考:org.lionsoul.jcseg.server.controller.SentenceController

4. 文章摘要提取:

api地址:http://jcseg_server_host:port/extractor/summary?text=&length=

api参数:

api返回:

更多配置请参考:org.lionsoul.jcseg.server.controller.SummaryController

5. 文章自动分词:

api地址:http://jcseg_server_host:port/tokenizer/tokenizer_instance?text=&ret_pinyin=&ret_pos=…

api参数:

api返回:

更多配置请参考:org.lionsoul.jcseg.server.controller.TokenizerController

Jcseg二次开发:


1. Jcseg中文分词Api:

Javadoc参考:Jcseg Javadoc

(1). 创建JcsegTaskConfig配置对象:

jcseg.properties查找步骤:

  • 1,寻找jcseg-core-{version}.jar目录下的jcseg.properties
  • 2,如果没找到继续寻找classpath下的jcseg.properties(默认已经打包了)
  • 3,如果没找到继续寻找user home下的jcseg.properties(除非把classpath下的jcseg.properties删除了,要不然不会到这)

所以,默认情况下可以在jcseg-core-{version}.jar同目录下来放一份jcseg.properties来自定义配置。

JcsegTaskConfig构造方法如下:

demo代码:

(2). 创建ADictionary词库对象:

ADictionary构造方法如下:

demo代码:

(3). 创建ISegment分词实例:

ISegment接口核心分词方法:

demo代码:

(4). 一个完整的例子:
(5). 如何自定义使用词库:

从1.9.9版本开始,Jcseg已经默认将jcseg.properties和lexicon全部词库打包进了jcseg-core-{version}.jar中,如果是通过JcsegTaskConfig(true)构造的JcsegTaskConfig或者调用了JcsegTaskConfig#autoLoad()方法,在找不到自定义配置文件情况下Jcseg会自动的加载classpath中的配置文件,如果config.getLexiconPath() = null DictionaryFactory默认会自动加载classpath下的词库。

  • 1),通过JcsegTaskConfig设置词库路径:
  • 2),通过ADictionary手动加载词库:

2. Jcseg关键字提取Api:

  • 1),TextRankKeywordsExtractor构造方法:

  • 2),demo代码:

  • 3),测试源码参考:org.lionsoul.jcseg.test.KeywordsExtractorTest源码

3. Jcseg自动摘要/关键句子提取Api:

  • 1),TextRankSummaryExtractor构造方法:

  • 2),demo代码:

  • 3),测试源码参考:org.lionsoul.jcseg.test.SummaryExtractorTest源码

4. Jcseg关键短语提取Api:

  • 1),TextRankKeyphraseExtractor构造方法:

  • 2),demo代码:

  • 3),测试源码参考:org.lionsoul.jcseg.test.KeyphraseExtractorTest源码

相关附录

1,Jcseg的词性对照:

名词n、时间词t、处所词s、方位词f、数词m、量词q、区别词b、代词r、动词v、形容词a、状态词z、副词d、介词p、连词c、助词u、语气词y、叹词e、拟声词o、成语i、习惯用语l、简称j、前接成分h、后接成分k、语素g、非语素字x、标点符号w)外,从语料库应用的角度,增加了专有名词(人名nr、地名ns、机构名称nt、其他专有名词nz)。

2,Jcseg同义词管理:

  • 01),统一的词库分类: 从2.2.0版本开始jcseg将同义词统一成了一个单独的类别-CJK_SYN,你可以将你的同义词定义直接追加到现有的同义词词库vendors/lexicons/lex-synonyms.lex中,也可以新建一个独立的词库,然后在首行增加CJK_SYN定义,将该词库归类为同义词词库,然后按照下面介绍的格式逐行或者分行增加同义词的定义。

  • 02),统一的同义词格式:

  • 03),格式和要求说明:
    Git地址:https://gitee.com/lionsoul/jcseg.git

0
青年IT男

个人从事金融行业,就职过易极付、思建科技等重庆一流技术团队,目前就职于某网约车平台负责整个支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。

You must be logged in to post a comment

This site is protected by wp-copyrightpro.com