关于nlp:java-中文繁简体转换工具-opencc4j-使用介绍-180

28次阅读

共计 6573 个字符,预计需要花费 17 分钟才能阅读完成。

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 开源矩阵

pinyin 汉字转拼音

pinyin2hanzi 拼音转汉字

segment 高性能中文分词

opencc4j 中文繁简体转换

nlp-hanzi-similar 汉字类似度

word-checker 拼写检测

sensitive-word 敏感词

前期 Road-Map

  • [] 数据字典插件化
  • [] 思考长文本分段,并行转换

正文完
 0