java 中文繁简体转换工具 opencc4j 使用介绍 1.8.0
创始人
2024-06-03 12:37:49
0

Opencc4j

Opencc4j 支持中文繁简体转换,考虑到词组级别。

在线体验

Features 特点

  • 严格区分「一简对多繁」和「一简对多异」。

  • 完全兼容异体字,可以实现动态替换。

  • 严格审校一简对多繁词条,原则为「能分则不合」。

  • 词库和函数库完全分离,可以自由修改、导入、扩展。

  • 兼容 Windows、Linux、Mac 平台。

  • 支持自定义分词

  • 支持判断单个字(词)是否为简体/繁体

  • 支持返回字符串中简体/繁体的列表信息

  • 支持中国台湾地区繁简体转换

v1.8.0 版本变更

  • 丰富工具类方法

  • 优化繁简体判断逻辑

变更日志

创作缘由

  • OpenCC

OpenCC 的思想非常优秀,做的也特别棒。但是没有特别为 java 提供的工具。

  • jopencc

jopencc 没有提供分词功能。

快速开始

maven 引入

com.github.houbbopencc4j1.8.0

api 概览

核心工具列表如下:

序号工具类简介
1ZhConverterUtil基础的繁简体转换
2ZhTwConverterUtil台湾地区的繁简体转换

所有的工具类方法具有相同的方法设计,便于记忆。

核心方法如下:

序号api 方法简介
1toSimple(String)转为简体
2toTraditional(String)转为繁体
3simpleList(String)返回包含的简体列表
4traditionalList(String)返回包含的繁体列表
5toSimple(char)返回单个汉字对应的所有简体字列表
6toTraditional(char)返回单个汉字对应的所有繁体字列表
7isSimple(String)是否全部为简体
8isSimple(char)单个字符是否为简体
9containsSimple(String)字符中是否为包含简体
10isTraditional(String)是否全部为繁体
11isTraditional(char)单个字符是否为繁体
12containsTraditional(String)字符中是否为包含繁体
13isChinese(String)是否全部为中文
14isChinese(char)单个字符是否为中文
15containsChinese(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 resultList = ZhConverterUtil.simpleList(original);Assert.assertEquals("[生, 命, 不, 息, 奋斗, 不, 止]", resultList.toString());

繁体列表 traditionalList

PS: 很多字是同体字。

final String original = "生命不息奮鬥不止";
final List 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 工具类获取系统内置的分词实现。

序号方法准确性性能备注
1defaults()默认分词形式,暂时为 fastForward 策略
2fastForward()较高fast-forward 分词策略
3chars()将字符串转换为单个字符列表,一般不建议使用
4huaBan()一般花瓣的结巴分词策略

花瓣结巴分词

花瓣结巴分词在使用时,需要自行引入结巴分词依赖。

com.huabanjieba-analysis1.0.2

自定义

你有时候可能除了上述的两种分词方式,会有更加适合自己业务的分词实现。

Opencc4j 支持自定义分词实现,只需要实现分词接口 Segment

  • 接口内容
public interface Segment {/*** 分词* @param original 原始信息* @return 分词后的列表*/List seg(final String original);}

测试代码

自定义分词实现类

/*** 一个最简单的分词实现。* 注意:仅仅做演示,不可实际使用。*/
public class FooSegment implements Segment {@Overridepublic List 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> tsPhrase();/*** 繁体=》简体 单个字* @return 结果* @since 1.5.2*/Map> tsChar();/*** 简体=》繁体 词组* @return 结果* @since 1.5.2*/Map> stPhrase();/*** 简体=》繁体 单个字* @return 结果* @since 1.5.2*/Map> stChar();/*** 繁体字所有字符* @return 繁体字所有字符* @since 1.6.2*/Set tChars();/*** 简体字所有字符* @return 繁体字所有字符* @since 1.8.0*/Set sChars();}

自定义说明

如果需要拓展对应的数据,建议继承原始的实现,然后添加额外的数据信息即可。

可以参考 中国台湾地区实现

ps: 后续考虑引入更加简单的实现方式,比如基于文本拓展,不过可扩展性没有接口灵活。

技术鸣谢

OpenCC

OpenCC 提供的原始数据信息。

花瓣

jieba-analysis 提供中文分词

Issues & Bugs

需求和 BUG 在这里,欢迎提供宝贵的建议。

如果对您有帮助,欢迎 Star 鼓励作者。

NLP 开源矩阵

pinyin 汉字转拼音

pinyin2hanzi 拼音转汉字

segment 高性能中文分词

opencc4j 中文繁简体转换

nlp-hanzi-similar 汉字相似度

word-checker 拼写检测

sensitive-word 敏感词

后期 Road-Map

  • 数据字典插件化

  • 考虑长文本分段,并行转换

相关内容

热门资讯

有关先秦诸子百家的书 有关先秦诸子百家的书《论语》《道德经》《吕氏春秋》《韩非子》《孙子兵法》……
李寻欢为什么咳嗽 李寻欢为什么咳嗽容易引起女人的关爱.他有病啊 因为古龙希望他有病 而且还是咳嗽~就是给他刻化的...
兴业银锡相关公司新增一项190... (转自:快查一企业中标了)快查APP显示,兴业银锡相关公司赤峰宇邦矿业有限公司于2025年6月16日...
我的生日是每年的农历 6月7号... 我的生日是每年的农历 6月7号 那2021年阴历是多少号 麻烦好心人跟我说下?阴历和农历一样,都是六...
三达膜(688101.SH):... 2025年6月16日,三达膜(688101.SH)公告称,公司召开第五届董事会第六次会议,审议通过了...
拉卡拉:正在筹划H股上市事项 ... 中证智能财讯拉卡拉(300773)6月16日晚间公告,公司目前正在筹划境外发行股份(H股)并在香港联...
特朗普集团推出T1智能手机:售...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 财联社6月16日讯(...
德林控股发盈喜 预计年度溢利同... 观点网讯:6月16日,德林控股在香港公告,预计截至2025年3月31日止年度溢利同比增加约10.1%...
伊利、京东火速入局,“苏超”商... “苏超”的商业价值、文旅经济价值仍在持续释放。 202...
《河北日报》报道唐山丨新农人奏... 转自:唐山广播电视台唐山市推动青年在农村施展才华新农人奏响田野创业曲□ 河北日报记者 师源 王育民 ...
俄外交部:美方取消俄美双边磋商... 格隆汇6月16日|据央视,俄罗斯外交部发言人扎哈罗娃在回答媒体关于俄美磋商前景的提问时表示,截至目前...
5月70城房价同比降幅收窄,商... 21世纪经济报道记者李莎 北京报道 6月16日,国家统计局发布5月房地产数据。数据显示,5月70个大...
中国作协“作家活动周”启幕 聚... 转自:千龙网由中国作家协会主办的第12期“作家活动周”6月16日在京启幕,本期活动以“中国文学新力量...
今年全国节能宣传周聚焦“节能增... 转自:中国政府采购报【行业动态】今年全国节能宣传周聚焦“节能增效 焕‘新’引领”本报讯 国家发展改革...
这个是什么字?繁体的 这个是什么字?繁体的就是面条的那个面面粉的面,面球的面。面 miàn 就是由小麦磨成的粉
科技赋能 各地夏收夏种高效推进 眼下正值“三夏”时节,各地依托科技赋能,助力夏收夏种夏管提速增效。截至15日,山东小麦已收5600多...
美股异动|Meta盘初涨超3%... 格隆汇6月16日|Meta Platforms(META.US)盘初涨超3%。消息面上,Meta准备...
以色列军方说已摧毁伊朗约三分之... 来源:新华社新华社耶路撒冷6月16日电以色列国防军发言人埃菲·戴弗林16日发表声明说,自13日发动袭...
魔兽世界盗贼如何在战斗中隐身 魔兽世界盗贼如何在战斗中隐身魔兽世界盗贼如何在战斗中隐身,不是强隐。比如给致盲以后等一会就能隐身了是...
伤害不大但启示深刻 转自:中国政府采购报【行业观察】伤害不大但启示深刻——美的北美空调召回事件之政府采购观察■ 吴敏近日...