java 中文繁简体转换工具 opencc4j 使用介绍 1.8.0
Opencc4j
Opencc4j 支持中文繁简体转换,考虑到词组级别。
Features 特点
严格区分「一简对多繁」和「一简对多异」。
完全兼容异体字,可以实现动态替换。
严格审校一简对多繁词条,原则为「能分则不合」。
词库和函数库完全分离,可以自由修改、导入、扩展。
兼容 Windows、Linux、Mac 平台。
支持自定义分词
支持判断单个字(词)是否为简体/繁体
支持返回字符串中简体/繁体的列表信息
支持中国台湾地区繁简体转换
v1.8.0 版本变更
丰富工具类方法
优化繁简体判断逻辑
创作缘由
- OpenCC
OpenCC 的思想非常优秀,做的也特别棒。但是没有特别为 java 提供的工具。
- jopencc
jopencc 没有提供分词功能。
快速开始
maven 引入
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>opencc4j</artifactId>
<version>1.8.0</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: 后续考虑引入更加简单的实现方式,比如基于文本拓展,不过可扩展性没有接口灵活。
技术鸣谢
OpenCC
OpenCC 提供的原始数据信息。
花瓣
jieba-analysis 提供中文分词
Issues & Bugs
需求和 BUG 在这里,欢迎提供宝贵的建议。
如果对您有帮助,欢迎 Star 鼓励作者。
NLP 开源矩阵
后期 Road-Map
数据字典插件化
考虑长文本分段,并行转换
java 中文繁简体转换工具 opencc4j 使用介绍 1.8.0的更多相关文章
- java 中文繁简体转换工具 opencc4j
创作缘由 对于中文的繁简体转换是一种很常见的需求. 但是很多工具类都是简单的做个映射.(使用map,集合,properties)等. 存在一个严重的问题:特殊词组 的转换可能存在问题. OpenCC ...
- Python中文繁简体转换工具
Openccpy ___ _____ __ ___ ___ ___ _____ __ __ / __`\/\ '__`\ /'__`\/' _ `\ /'___\ /'___\/\ '__`\/\ \ ...
- 开源项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字相似度/markdown 目录
前言 以前在 github 上自己开源了一些项目.碍于技术与精力,大部分项目都是 java 实现的. 这对于非 java 开发者而言很不友好,对于不会编程的用户更加不友好. 为了让更多的人可以使用到这 ...
- java 二进制数字符串转换工具类
java 二进制数字符串转换工具类 将二进制转换成八进制 将二进制转换成十进制 将二进制转换成十六进制 将十进制转换成二进制 package com.iteye.injavawetrust.ad; i ...
- java util - Unicode转换工具
测试代码 package cn.java.codec.unicode; public class Test { public static void main(String[] args) throw ...
- java日期格式转换工具类
原文地址:http://blog.csdn.net/zhiweianran/article/details/7991531 package com.ace.backoffice.utils; impo ...
- java util - Hex转换工具
测试代码 package cn.java.codec.hex; public class Test { public static void main(String[] args) { String ...
- java util - base64转换工具
测试代码 package cn.java.codec.base64; public class Test { public static void main(String[] args) { Stri ...
- java 常用Bean 转换工具类
package com.hnf.framework.utils; import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.data ...
- Java时间格式转换工具类
把当前时间修改成指定时间 //把当前时间修改成指定时间 public String dateUtil(Integer seconds, String dateFormatPattern){ Date ...
随机推荐
- rpm制作(简)
yum -y install gcc prec-devel openssl-devel zlib-devel yum -y install rpm-build #生成工作目录 rpmdev-setup ...
- bean实例化三种方式
实例化bean的方式有三种,如下: 1.无参构造方法实例化 2.工厂静态方法实例化 3.工厂普通方法实例化 此处演示的项目结构如下: 方法一:无参构造方法实例化(注意,该类中不能存在有参构造函数) U ...
- R7800 2.4G webshell
webshell执行 iwpriv ath1 disablecoext 1
- 启动anaconda的报错:There is an instance of anaconda navigator already running error
首先调出控制台(win+r,输入cmd),然后在控制台输入 tasklist | findstr "pythonw" 在显示出pythonw.exe后,找到其后面的pid(数字), ...
- 【RTOS】《多任务抢占式调度器》笔记
<多任务抢占式调度器>读书笔记 1.多任务系统 在多任务调度器的作用下,多个任务轮流使用cpu,实现多任务相互独立并发运行的效果,能够充分利用硬件资源,提高cpu效率 2.任务特性 a.动 ...
- 学习笔记||使用Vue时踩过的坑1.0
vue介绍:https://cn.vuejs.org/v2/guide/ 1.安装npm install时,长时间停留在fetchMetadata: sill mapToRegistry uri ht ...
- .netcore 跨域问题
CORS(跨域资源共享)是一种W3C标准,允许服务器放宽同源策略.使用CORS,服务器可以在显式允许某些跨域请求时拒绝其他跨域请求.CORS是相比其他跨域技术(比如JSONP)更安全.更灵活. ASP ...
- c++学习2 基础关键词
三 volatile强制访问内存 在一个变量的频繁使用中,系统为了提高效率,会自动将内存里面的数据放入CPU里的寄存器里.但在某些特殊场景下,放入寄存器这个操作反倒会导致CPU无法及时获取最新的一手数 ...
- hdu1710 二叉树(C/C++)
hdu1710 题目地址:https://acm.dingbacode.com/showproblem.php?pid=1710 (最近几天杭电原网址开不进去了,之后应该可以通..吧) Binary ...
- Treewidget 节点的遍历
父节点的遍历 // Treewidget遍历操作 // 只遍历父节点 int nParentNodeCount = ui->treeWidget->topLevelItemCount(); ...