结巴分词 java 高性能实现,是 huaban jieba 速度的 2倍

作者 : 开心源码 本文共1855个字,预计阅读时间需要5分钟 发布时间: 2022-05-13 共195人阅读

Segment

Segment 是基于结巴分词词库实现的更加灵活,高性能的 java 分词实现。

变更日志

创作目的

分词是做 NLP 相关工作,非常基础的一项功能。

jieba-analysis 作为一款非常受欢迎的分词实现,个人实现的 opencc4j 之前一直使用其作为分词。

但是随着对分词的理解,发现结巴分词对于少量配置上不够灵活。

有很多功能无法指定关闭,比方 HMM 对于繁简体转换是无用的,由于繁体词是固定的,不需要预测。

最新版本的词性等功能如同也被移除了,但是这些都是个人非常需要的。

所以自己重新实现了一遍,希望实现一套更加灵活,更多特性的分词框架。

而且 jieba-analysis 的升级似乎停滞了,个人的实现方式差异较大,所以建立了全新的项目。

Features 特点

  • 基于 DFA 实现的高性能分词

  • 允许客户自己设置词库

  • 支持返回词性

默认关闭,惰性加载,不对性能和内存有影响。

快速入门

准备

jdk1.7+

maven 3.x+

maven 引入

<dependency>    <groupId>com.github.houbb</groupId>    <artifactId>segment</artifactId>    <version>${最新版本}</version></dependency>

使用示例

相关代码参见 SegmentBsTest.java

获取分词,下标等信息

暂时没有实现词性标注,准备下个版本实现。

final String string = "这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱学习。";List<ISegmentResult> resultList = SegmentBs.newInstance().segment(string);Assert.assertEquals("[这[0,1), 是[1,2), 一个[2,4), 伸手不见五指[4,10), 的[10,11), 黑夜[11,13), 。[13,14), 我[14,15), 叫[15,16), 孙悟空[16,19), ,[19,20), 我[20,21), 爱[21,22), 北京[22,24), ,[24,25), 我[25,26), 爱[26,27), 学习[27,29), 。[29,30)]", resultList.toString());

只获取分词信息

final String string = "这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱学习。";List<String> resultList = SegmentBs.newInstance().segmentWords(string);Assert.assertEquals("[这, 是, 一个, 伸手不见五指, 的, 黑夜, 。, 我, 叫, 孙悟空, ,, 我, 爱, 北京, ,, 我, 爱, 学习, 。]", resultList.toString());

返回词性

使用示例

直接指定 wordType 属性为真就可。

final String string = "我爱学习";List<ISegmentResult> resultList = SegmentBs                .newInstance()                .wordType(true)                .segment(string);Assert.assertEquals("[我[0,1)/r, 爱[1,2)/v, 学习[2,4)/v]", resultList.toString());

词性说明

r/v 就是词性,每一个代表的含义介绍如下。

编码形容
Ag形语素
a描述词
ad副形词
an名形词
b区别词
c连词
dg副语素
d副词
e叹词
f方位词
g语素
h前接成分
i成语
j简称略语
k后接成分
l习用语
m数词
Ng名语素
n名词
nr人名
ns地名
nt机构团体
nz其余专名
o拟声词
p介词
q量词
r代词
s处所词
tg时语素
t时间词
u助词
vg动语素
v动词
vd副动词
vn名动词
w标点符号
x非语素字
y语气词
z状态词
un未知词

可以参见对应的枚举类 WordTypeEnum

Benchmark 性能比照

性能比照

性能比照基于 jieba 1.0.2 版本,测试条件保持一致,保证二者都做好预热,而后统一解决。

验证下来,分词的性能是 jieba 的两倍左右

起因也很简单,暂时没有引入词频和 HMM。

代码参见 BenchmarkTest.java

性能比照图

相同长文本,循环 1W 次。

benchmark.png

后期 Road-Map

核心特性

  • 基于词频修正

  • HMM 算法实现新词预测

  • 常见的分词模式

  • 停顿词/人名/地名/机构名/数字… 各种常见的词性标注

格式解决

  • 全角半角解决

  • 繁简体解决

创作感谢

感谢 jieba 分词提供的词库,以及 jieba-analysis 的相关实现。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 结巴分词 java 高性能实现,是 huaban jieba 速度的 2倍

发表回复