java 开源中文的繁简体转换 opencc4j-03-简体还是繁体,你说了算!

Opencc4j

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

开源中文的繁简体转换 opencc4j-01-使用入门概览

开源中文的繁简体转换 opencc4j-02-一个汉字竟然对应两个 char?

开源中文的繁简体转换 opencc4j-03-简体还是繁体,你说了算!

开源中文的繁简体转换 opencc4j-04-香港繁简体的支持

开源中文的繁简体转换 opencc4j-05-日文转换支持

Features 特点

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

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

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

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

  • 兼容 Windows、Linux、Mac 平台。

  • 支持自定义分词

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

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

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

  • 支持与日文字的转换

这么着,还是那么着

繁简体转换,最初的设计希望让用户简单的判断一个字符串时简体、还是繁体。

但是后来不断有小伙伴提需求说不准,误判率太高。

无可奈何,为了方便解释,就像判断方法改为全部匹配。

好景不长,还是有小伙伴说一个文本中,有一些其他字符,但是希望判断是繁体之类的。

总之,众口难调。

让用户可以选择

虽然我一直秉持着,让用户无需选择,是最好的选择。

但是世界是复杂的,业务也是如此,我们总要学会处理各种场景。

还是决定让用户可以自己指定策略:比如全匹配、任一匹配、过半等。

接下来,就是编码工作。

接口与内置策略

match 接口

接口保持最高的间接性:

java 复制代码
/**
 * 匹配策略
 *
 * @since 1.11.0
 */
public interface ZhMatch {

    /**
     * 匹配结果
     * @param text 文本
     * @param context 上下文
     * @return 结果
     */
    boolean match(final String text,
                  final ZhConvertCoreContext context);

}

用户只需要实现这个接口,就可以定义自己的匹配策略。

内置策略

当然,只有接口还是不够的。

还要为用户提供一些内置的能力,这里按照繁简体分类,共计内置了 6 种实现:

内置策略见 ZhMatches 工具方法。

策略 说明 备注
simpleAll() 满足全部简体 isSimple 判断时,默认策略
simpleAny() 满足任一简体 -
simpleOverHalf() 满足超过一半简体 -
traditionalAll() 满足全部繁体 isTraditional 判断时,默认策略
traditionalAny() 满足任一繁体 -
traditionalOverHalf() 满足超过一半繁体 -

当然,如果你觉得不够,可以实现属于自己的匹配策略。

测试验证

下面是一些如何使用的例子。

简体

java 复制代码
// 全部
ZhConvertBootstrap bs = ZhConvertBootstrap.newInstance()
        .isSimpleMatch(ZhMatches.simpleAll())
        .init();
String text = "123我456";
Assert.assertFalse(bs.isSimple(text));

// 任一
bs.isSimpleMatch(ZhMatches.simpleAny()).init();
Assert.assertTrue(bs.isSimple(text));

繁体

java 复制代码
// 全部
ZhConvertBootstrap bs = ZhConvertBootstrap.newInstance()
        .isTraditionalMatch(ZhMatches.traditionalAll())
        .init();
String text = "123俺們456";
Assert.assertFalse(bs.isTraditional(text));

// 任一
bs.isTraditionalMatch(ZhMatches.traditionalAny()).init();
Assert.assertTrue(bs.isTraditional(text));;

小结

用户的需求和使用场景总是复杂的,需要保持足够的灵活性。

我是老马,期待与你的下次重逢。

拓展阅读

pinyin 汉字转拼音

pinyin2hanzi 拼音转汉字

segment 高性能中文分词

opencc4j 中文繁简体转换

nlp-hanzi-similar 汉字相似度

word-checker 拼写检测

sensitive-word 敏感词

相关推荐
_Aaron___14 分钟前
面向对象的三大特性---多态
java
Kiri霧20 分钟前
IntelliJ IDEA
java·ide·kotlin·intellij-idea
daixin884841 分钟前
什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?
java·开发语言·redis·缓存
京茶吉鹿1 小时前
"if else" 堆成山?这招让你的代码优雅起飞!
java·后端
你我约定有三1 小时前
RabbitMQ--消息丢失问题及解决
java·开发语言·分布式·后端·rabbitmq·ruby
张北北.1 小时前
【深入底层】C++开发简历4+4技能描述6
java·开发语言·c++
Java初学者小白1 小时前
秋招Day19 - 分布式 - 分布式事务
java·分布式
rannn_1112 小时前
Java学习|黑马笔记|Day23】网络编程、反射、动态代理
java·笔记·后端·学习
火车叨位去19492 小时前
用Java实现rpc的逻辑和流程图和核心技术与难点分析
java·rpc·流程图
阿华的代码王国2 小时前
【Android】相对布局应用-登录界面
android·xml·java