0


java 开源中文的繁简体转换工具 opencc4j-01-overview

Opencc4j

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

拓展阅读

pinyin 汉字转拼音

pinyin2hanzi 拼音转汉字

segment 高性能中文分词

opencc4j 中文繁简体转换

nlp-hanzi-similar 汉字相似度

word-checker 拼写检测

sensitive-word 敏感词

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 概览

核心工具列表如下:
序号工具类简介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

finalString original ="生命不息奋斗不止";finalList<String> resultList =ZhConverterUtil.simpleList(original);Assert.assertEquals("[生, 命, 不, 息, 奋斗, 不, 止]", resultList.toString());

繁体列表 traditionalList

PS: 很多字是同体字。

finalString original ="生命不息奮鬥不止";finalList<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

工具类获取系统内置的分词实现。
序号方法准确性性能备注1defaults()高高默认分词形式,暂时为

fastForward

策略2fastForward()较高高fast-forward 分词策略3chars()低高将字符串转换为单个字符列表,一般不建议使用4huaBan()高一般花瓣的结巴分词策略

花瓣结巴分词

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

<dependency><groupId>com.huaban</groupId><artifactId>jieba-analysis</artifactId><version>1.0.2</version></dependency>

自定义

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

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

  • 接口内容
publicinterfaceSegment{/**
     * 分词
     * @param original 原始信息
     * @return 分词后的列表
     */List<String>seg(finalString original);}

测试代码

自定义分词实现类

/**
 * 一个最简单的分词实现。
 * 注意:仅仅做演示,不可实际使用。
 */publicclassFooSegmentimplementsSegment{@OverridepublicList<String>seg(String original){returnArrays.asList(original,"测试");}}

分词测试

我们自定义的分词,直接在默认添加“测试”这样的信息。

finalString original ="寥落古行宫,宫花寂寞红。白头宫女在,闲坐说玄宗。";finalSegment segment =newFooSegment();finalString result =ZhConvertBootstrap.newInstance().segment(segment).toTraditional(original);Assert.assertEquals("寥落古行宮,宮花寂寞紅。白頭宮女在,閒坐說玄宗。測試", result);

数据接口自定义

不同的地区,对应的转换规则是不同的。

具体参考一下台湾地区的使用方式即可。

接口说明

IDataMap 的接口如下。

/**
 * 数据 map 接口
 * @author binbin.hou
 * @since 1.5.2
 */publicinterfaceIDataMap{/**
     * 繁体=》简体 词组
     * @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: 后续考虑引入更加简单的实现方式,比如基于文本拓展,不过可扩展性没有接口灵活。

Issues & Bugs

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

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

小结

NLP 中文繁简体转换是一个非常基础的工具,后续分词、拼音等等都可以基于这个工具。

在这里插入图片描述


本文转载自: https://blog.csdn.net/ryo1060732496/article/details/135344889
版权归原作者 老马啸西风 所有, 如有侵权,请联系我们删除。

“java 开源中文的繁简体转换工具 opencc4j-01-overview”的评论:

还没有评论