Opencc4j 开源中文繁简体使用介绍
2024/2/6 23:02:23
本文主要是介绍Opencc4j 开源中文繁简体使用介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Opencc4j
Opencc4j 支持中文繁简体转换,考虑到词组级别。
Features 特点
-
严格区分「一简对多繁」和「一简对多异」。
-
完全兼容异体字,可以实现动态替换。
-
严格审校一简对多繁词条,原则为「能分则不合」。
-
词库和函数库完全分离,可以自由修改、导入、扩展。
-
兼容 Windows、Linux、Mac 平台。
-
支持自定义分词
-
支持判断单个字(词)是否为简体/繁体
-
支持返回字符串中简体/繁体的列表信息
-
支持中国台湾地区繁简体转换
创作缘由
- OpenCC
OpenCC 的思想非常优秀,做的也特别棒。但是没有特别为 java 提供的工具。
- jopencc
jopencc 没有提供分词功能。
快速开始
maven 引入
<dependency> <groupId>com.github.houbb</groupId> <artifactId>opencc4j</artifactId> <version>1.8.1</version> </dependency>
api 概览
核心工具列表如下:
序号 | 工具类 | 简介 |
---|---|---|
1 | ZhConverterUtil | 基础的繁简体转换 |
2 | ZhTwConverterUtil | 台湾地区的繁简体转换 |
所有的工具类方法具有相同的方法设计,便于记忆。
核心方法如下:
序号 | api 方法 | 简介 |
---|---|---|
1 | toSimple(String) | 转为简体 |
2 | toTraditional(String) | 转为繁体 |
3 | simpleList(String) | 返回包含的简体列表 |
4 | traditionalList(String) | 返回包含的繁体列表 |
5 | toSimple(char) | 返回单个汉字对应的所有简体字列表 |
6 | toTraditional(char) | 返回单个汉字对应的所有繁体字列表 |
7 | isSimple(String) | 是否全部为简体 |
8 | isSimple(char) | 单个字符是否为简体 |
9 | containsSimple(String) | 字符中是否为包含简体 |
10 | isTraditional(String) | 是否全部为繁体 |
11 | isTraditional(char) | 单个字符是否为繁体 |
12 | containsTraditional(String) | 字符中是否为包含繁体 |
13 | isChinese(String) | 是否全部为中文 |
14 | isChinese(char) | 单个字符是否为中文 |
15 | containsChinese(char) | 字符串中是否包含中文 |
繁简体转换
转为简体 toSimple
String original = "生命不息,奮鬥不止"; String result = ZhConverterUtil.toSimple(original); Assert.assertEquals("生命不息,奋斗不止", result);
转为繁体 toTraditional
String original = "生命不息,奋斗不止"; String result = ZhConverterUtil.toTraditional(original); Assert.assertEquals("生命不息,奮鬥不止", result);
繁简体判断
对单个字符或者词组进行繁简体判断。
是否为简体 isSimple
Assert.assertTrue(ZhConverterUtil.isSimple('奋')); Assert.assertTrue(ZhConverterUtil.isSimple("奋")); Assert.assertTrue(ZhConverterUtil.isSimple("奋斗")); Assert.assertFalse(ZhConverterUtil.isSimple('奮')); Assert.assertFalse(ZhConverterUtil.isSimple("奮")); Assert.assertFalse(ZhConverterUtil.isSimple("奮鬥")); Assert.assertFalse(ZhConverterUtil.isSimple("奮斗")); Assert.assertFalse(ZhConverterUtil.isSimple("beef"));
是否包含简体 containsSimple
Assert.assertTrue(ZhConverterUtil.containsSimple("奋")); Assert.assertTrue(ZhConverterUtil.containsSimple("奋斗")); Assert.assertTrue(ZhConverterUtil.containsSimple("奋斗2023")); Assert.assertFalse(ZhConverterUtil.containsSimple("編")); Assert.assertFalse(ZhConverterUtil.containsSimple("編號"));
是否为繁体 isTraditional
Assert.assertTrue(ZhConverterUtil.isTraditional('編')); Assert.assertTrue(ZhConverterUtil.isTraditional("編")); Assert.assertTrue(ZhConverterUtil.isTraditional("編號")); Assert.assertFalse(ZhConverterUtil.isTraditional('编')); Assert.assertFalse(ZhConverterUtil.isTraditional("编")); Assert.assertFalse(ZhConverterUtil.isTraditional("编号")); Assert.assertFalse(ZhConverterUtil.isTraditional("编號"));
是否包含繁体 containsTraditional
Assert.assertTrue(ZhConverterUtil.containsTraditional("編")); Assert.assertTrue(ZhConverterUtil.containsTraditional("編號")); Assert.assertTrue(ZhConverterUtil.containsTraditional("編號2023")); Assert.assertFalse(ZhConverterUtil.containsTraditional("号")); Assert.assertFalse(ZhConverterUtil.containsTraditional("编号"));
句子中包含的繁简体列表返回
返回字符串中繁简体对应的词、字列表,默认支持中文分词。
繁简体列表返回的词组和分词策略紧密相关。
简体列表 simpleList
final String original = "生命不息奋斗不止"; final List<String> resultList = ZhConverterUtil.simpleList(original); Assert.assertEquals("[生, 命, 不, 息, 奋斗, 不, 止]", resultList.toString());
繁体列表 traditionalList
PS: 很多字是同体字。
final String original = "生命不息奮鬥不止"; final List<String> resultList = ZhConverterUtil.traditionalList(original); Assert.assertEquals("[生, 命, 不, 息, 奮, 鬥, 不, 止]", resultList.toString());
单个汉字对应的繁简体列表
繁体字列表
Assert.assertEquals("[幹, 乾, 干]", ZhConverterUtil.toTraditional('干').toString()); Assert.assertEquals("[發, 髮]", ZhConverterUtil.toTraditional('发').toString());
简体字列表
Assert.assertEquals("[测]", ZhConverterUtil.toSimple('測').toString());
中文工具方法
是否为中文 isChinese
Assert.assertTrue(ZhConverterUtil.isChinese("你")); Assert.assertTrue(ZhConverterUtil.isChinese("你好")); Assert.assertTrue(ZhConverterUtil.isChinese('你')); Assert.assertFalse(ZhConverterUtil.isChinese("你0")); Assert.assertFalse(ZhConverterUtil.isChinese("10")); Assert.assertFalse(ZhConverterUtil.isChinese('0')); Assert.assertFalse(ZhConverterUtil.isChinese("")); Assert.assertFalse(ZhConverterUtil.isChinese(null));
是否包含中文 containsChinese
Assert.assertTrue(ZhConverterUtil.containsChinese("你")); Assert.assertTrue(ZhConverterUtil.containsChinese("你好")); Assert.assertTrue(ZhConverterUtil.containsChinese("你0")); Assert.assertFalse(ZhConverterUtil.containsChinese("10")); Assert.assertFalse(ZhConverterUtil.containsChinese("")); Assert.assertFalse(ZhConverterUtil.containsChinese(null));
中国台湾繁简体转换
工具类
为保证方法的一致性,引入 ZhTwConverterUtil
工具类,支持方法和 ZhConverterUtil
保持一致。
测试用例
简体到繁体:
String original = "使用互联网"; String result = ZhTwConverterUtil.toTraditional(original); Assert.assertEquals("使用網際網路", result);
繁体到简体:
String original = "使用網際網路"; String result = ZhTwConverterUtil.toSimple(original); Assert.assertEquals("使用互联网", result);
配置引导类
引导类说明
主要的可配置项包含了分词和数据集合。
二者都是可以配置,并且支持自定的。
默认配置
默认工具类等价于如下:
ZhConvertBootstrap.newInstance() .segment(Segments.defaults()) .dataMap(DataMaps.defaults());
中国台湾地区配置
中国台湾地区配置等价于:
ZhConvertBootstrap.newInstance() .segment(Segments.defaults()) .dataMap(DataMaps.taiwan());
中文分词策略
系统内置分词方式
你可以通过 Segments
工具类获取系统内置的分词实现。
序号 | 方法 | 准确性 | 性能 | 备注 |
---|---|---|---|---|
1 | defaults() | 高 | 高 | 默认分词形式,暂时为 fastForward 策略 |
2 | fastForward() | 较高 | 高 | fast-forward 分词策略 |
3 | chars() | 低 | 高 | 将字符串转换为单个字符列表,一般不建议使用 |
4 | huaBan() | 高 | 一般 | 花瓣的结巴分词策略 |
花瓣结巴分词
花瓣结巴分词在使用时,需要自行引入结巴分词依赖。
<dependency> <groupId>com.huaban</groupId> <artifactId>jieba-analysis</artifactId> <version>1.0.2</version> </dependency>
自定义
你有时候可能除了上述的两种分词方式,会有更加适合自己业务的分词实现。
Opencc4j 支持自定义分词实现,只需要实现分词接口 Segment
- 接口内容
public interface Segment { /** * 分词 * @param original 原始信息 * @return 分词后的列表 */ List<String> seg(final String original); }
测试代码
自定义分词实现类
/** * 一个最简单的分词实现。 * 注意:仅仅做演示,不可实际使用。 */ public class FooSegment implements Segment { @Override public List<String> seg(String original) { return Arrays.asList(original, "测试"); } }
分词测试
我们自定义的分词,直接在默认添加“测试”这样的信息。
final String original = "寥落古行宫,宫花寂寞红。白头宫女在,闲坐说玄宗。"; final Segment segment = new FooSegment(); final String result = ZhConvertBootstrap.newInstance() .segment(segment) .toTraditional(original); Assert.assertEquals("寥落古行宮,宮花寂寞紅。白頭宮女在,閒坐說玄宗。測試", result);
数据接口自定义
不同的地区,对应的转换规则是不同的。
具体参考一下台湾地区的使用方式即可。
接口说明
IDataMap 的接口如下。
/** * 数据 map 接口 * @author binbin.hou * @since 1.5.2 */ public interface IDataMap { /** * 繁体=》简体 词组 * @return 结果 * @since 1.5.2 */ Map<String, List<String>> tsPhrase(); /** * 繁体=》简体 单个字 * @return 结果 * @since 1.5.2 */ Map<String, List<String>> tsChar(); /** * 简体=》繁体 词组 * @return 结果 * @since 1.5.2 */ Map<String, List<String>> stPhrase(); /** * 简体=》繁体 单个字 * @return 结果 * @since 1.5.2 */ Map<String, List<String>> stChar(); /** * 繁体字所有字符 * @return 繁体字所有字符 * @since 1.6.2 */ Set<String> tChars(); /** * 简体字所有字符 * @return 繁体字所有字符 * @since 1.8.0 */ Set<String> sChars(); }
自定义说明
如果需要拓展对应的数据,建议继承原始的实现,然后添加额外的数据信息即可。
可以参考 中国台湾地区实现
ps: 后续考虑引入更加简单的实现方式,比如基于文本拓展,不过可扩展性没有接口灵活。
NLP 开源矩阵
pinyin 汉字转拼音
pinyin2hanzi 拼音转汉字
segment 高性能中文分词
opencc4j 中文繁简体转换
nlp-hanzi-similar 汉字相似度
word-checker 拼写检测
sensitive-word 敏感词
本文由博客一文多发平台 OpenWrite 发布!
这篇关于Opencc4j 开源中文繁简体使用介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-27易优如何解除绑定微信公众号-icode9专业技术文章分享
- 2024-07-27安装 Eyoucms安装使用-icode9专业技术文章分享
- 2024-07-26TtpeScript学习手记
- 2024-07-26SendGrid 中单个类别(标签)名称的长度限制通常为 128 个字符。 怎么写-icode9专业技术文章分享
- 2024-07-26SendGrid 怎么设置回复邮箱-icode9专业技术文章分享
- 2024-07-26response, err := s.sd.SendWithContext(ctx, m) 怎么获取到唯一ID 请求ID-icode9专业技术文章分享
- 2024-07-26sendgrid 是一个APIKEY 代表一个发送域名吗, 还是多个-icode9专业技术文章分享
- 2024-07-26mailgun和 sendgrid 批量发送邮件, 最多支持给多少人发送 1000个?-icode9专业技术文章分享
- 2024-07-26mailgun 发送邮件 怎么批量发送给多个人-icode9专业技术文章分享
- 2024-07-25TtpeScript学习手记