{"id":18600605,"url":"https://github.com/houbb/opencc4j","last_synced_at":"2025-05-15T01:09:43.373Z","repository":{"id":37774016,"uuid":"120892548","full_name":"houbb/opencc4j","owner":"houbb","description":"🇨🇳Open Chinese Convert is an opensource project for conversion between Traditional Chinese and Simplified Chinese.(java 中文繁简体转换，支持台湾、香港、中文日文转换。)","archived":false,"fork":false,"pushed_at":"2025-05-02T13:51:35.000Z","size":836,"stargazers_count":507,"open_issues_count":2,"forks_count":76,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-05-02T15:00:01.068Z","etag":null,"topics":["chinese","dfa","java","java7","nlp","opencc","simple-tranditional","trie","trie-tree"],"latest_commit_sha":null,"homepage":"https://houbb.github.io/opensource/opencc4j","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/houbb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-02-09T10:32:12.000Z","updated_at":"2025-05-02T13:48:26.000Z","dependencies_parsed_at":"2024-12-09T04:05:01.160Z","dependency_job_id":"6e080379-8563-4aaf-9459-1deb2506bcb5","html_url":"https://github.com/houbb/opencc4j","commit_stats":{"total_commits":68,"total_committers":6,"mean_commits":"11.333333333333334","dds":0.3088235294117647,"last_synced_commit":"59c788db85da8ce085e1deb478c9d4bda44c95a7"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/houbb%2Fopencc4j","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/houbb%2Fopencc4j/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/houbb%2Fopencc4j/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/houbb%2Fopencc4j/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/houbb","download_url":"https://codeload.github.com/houbb/opencc4j/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254254043,"owners_count":22039792,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chinese","dfa","java","java7","nlp","opencc","simple-tranditional","trie","trie-tree"],"created_at":"2024-11-07T02:04:42.058Z","updated_at":"2025-05-15T01:09:38.364Z","avatar_url":"https://github.com/houbb.png","language":"Java","readme":"# Opencc4j\n\n[Opencc4j](https://github.com/houbb/opencc4j) 支持中文繁简体转换，考虑到词组级别。\n\n[![Build Status](https://travis-ci.com/houbb/opencc4j.svg?branch=master)](https://travis-ci.com/houbb/opencc4j)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.houbb/opencc4j/badge.svg)](http://mvnrepository.com/artifact/com.github.houbb/opencc4j)\n[![Coverage Status](https://coveralls.io/repos/github/houbb/opencc4j/badge.svg)](https://coveralls.io/github/houbb/opencc4j)\n[![](https://img.shields.io/badge/license-Apache2-FF0080.svg)](https://github.com/houbb/opencc4j/blob/master/LICENSE.txt)\n[![Open Source Love](https://badges.frapsoft.com/os/v2/open-source.svg?v=103)](https://github.com/houbb/opencc4j)\n\n\u003e [在线体验](https://houbb.github.io/opensource/opencc4j)\n\n## Features 特点\n\n- 严格区分「一简对多繁」和「一简对多异」。\n\n- 完全兼容异体字，可以实现动态替换。\n\n- 严格审校一简对多繁词条，原则为「能分则不合」。\n\n- 词库和函数库完全分离，可以自由修改、导入、扩展。\n\n- 兼容 Windows、Linux、Mac 平台。\n\n- 支持自定义分词、引导类，优雅实现\n\n- 支持判断单个字（词）是否为简体/繁体\n\n- 支持返回字符串中简体/繁体的列表信息 \n\n- 支持中国台湾地区和大陆简体繁简体转换\n\n- 支持中国香港地区和大陆简体繁简体转换\n\n- 支持日文新字和大陆简体繁简体转换\n\n- 兼容双字符汉字，【𨦟】【𪡃】等\n\n\u003e [变更日志](CHANGELOG.md)\n\n## 创作缘由\n\n- OpenCC\n\n[OpenCC](https://github.com/BYVoid/OpenCC) 的思想非常优秀，做的也特别棒。但是没有特别为 java 提供的工具。\n\n------------------------------------------------------------------------------------------------------------------------\n\n* [快速开始](#快速开始)\n    * [maven 引入](#maven-引入)\n    * [api 概览](#api-概览)\n    * [繁简体转换](#繁简体转换)\n        * [转为简体 toSimple](#转为简体-tosimple)\n        * [转为繁体 toTraditional](#转为繁体-totraditional)\n    * [繁简体判断](#繁简体判断)\n        * [是否为简体 isSimple](#是否为简体-issimple)\n        * [是否包含简体 containsSimple](#是否包含简体-containssimple)\n        * [是否为繁体 isTraditional](#是否为繁体-istraditional)\n        * [是否包含繁体 containsTraditional](#是否包含繁体-containstraditional)\n    * [句子中包含的繁简体列表返回](#句子中包含的繁简体列表返回)\n        * [简体列表 simpleList](#简体列表-simplelist)\n        * [繁体列表 traditionalList](#繁体列表-traditionallist)\n    * [单个汉字对应的繁简体列表](#单个汉字对应的繁简体列表)\n        * [繁体字列表](#繁体字列表)\n        * [简体字列表](#简体字列表)\n    * [中文工具方法](#中文工具方法)\n        * [是否为中文 isChinese](#是否为中文-ischinese)\n        * [是否包含中文 containsChinese](#是否包含中文-containschinese)\n* [中国台湾繁简体转换](#中国台湾繁简体转换)\n    * [工具类](#工具类)\n    * [测试用例](#测试用例)\n* [配置引导类](#配置引导类)\n    * [引导类说明](#引导类说明)\n        * [默认配置](#默认配置)\n        * [中国台湾地区配置](#中国台湾地区配置)\n    * [中文分词策略](#中文分词策略)\n        * [系统内置分词方式](#系统内置分词方式)\n        * [花瓣结巴分词](#花瓣结巴分词)\n        * [自定义](#自定义)\n    * [测试代码](#测试代码)\n        * [自定义分词实现类](#自定义分词实现类)\n        * [分词测试](#分词测试)\n    * [数据接口自定义](#数据接口自定义)\n        * [接口说明](#接口说明)\n        * [自定义说明](#自定义说明)\n* [技术鸣谢](#技术鸣谢)\n    * [OpenCC](#opencc)\n    * [花瓣](#花瓣)\n* [Issues \u0026 Bugs](#issues--bugs)\n* [NLP 开源矩阵](#nlp-开源矩阵)\n* [后期 Road-Map](#后期-road-map)\n\n------------------------------------------------------------------------------------------------------------------------\n\n# 快速开始\n\n## maven 引入\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.houbb\u003c/groupId\u003e\n    \u003cartifactId\u003eopencc4j\u003c/artifactId\u003e\n    \u003cversion\u003e1.13.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## api 概览\n\n核心工具列表如下：\n\n| 序号 | 工具类               | 简介              |\n|:---|:------------------|:----------------|\n| 1  | ZhConverterUtil   | 基础的繁简体转换        |\n| 2  | ZhTwConverterUtil | 中国台湾地区与大陆的繁简体转换 |\n| 3  | ZhHkConverterUtil | 中国香港地区与大陆的繁简体转换 |\n| 4  | ZhJpConverterUtil | 日文新字与大陆的繁简体转换   |\n\n所有的工具类方法具有相同的方法设计，便于记忆。\n\n核心方法如下：\n\n| 序号  | api 方法                      | 简介               |\n|:----|:----------------------------|:-----------------|\n| 1   | toSimple(String)            | 转为简体             |\n| 2   | toTraditional(String)       | 转为繁体             |\n| 3   | simpleList(String)          | 返回包含的简体列表        |\n| 4   | traditionalList(String)     | 返回包含的繁体列表        |\n| 5   | toSimple(char)              | 返回单个汉字对应的所有简体字列表 |\n| 6   | toTraditional(char)         | 返回单个汉字对应的所有繁体字列表 |\n| 7   | isSimple(String)            | 是否全部为简体          |\n| 8   | isSimple(char)              | 单个字符是否为简体        |\n| 9   | containsSimple(String)      | 字符中是否为包含简体       |\n| 10  | isTraditional(String)       | 是否全部为繁体          |\n| 11  | isTraditional(char)         | 单个字符是否为繁体        |\n| 12  | containsTraditional(String) | 字符中是否为包含繁体       |\n| 13  | isChinese(String)           | 是否全部为中文          |\n| 14  | isChinese(char)         | 单个字符是否为中文        |\n| 15  | containsChinese(char)         | 字符串中是否包含中文       |\n\n\n## 繁简体转换\n\n### 转为简体 toSimple\n\n```java\nString original = \"生命不息，奮鬥不止\";\nString result = ZhConverterUtil.toSimple(original);\nAssert.assertEquals(\"生命不息，奋斗不止\", result);\n```\n\n### 转为繁体 toTraditional\n\n```java\nString original = \"生命不息，奋斗不止\";\nString result = ZhConverterUtil.toTraditional(original);\nAssert.assertEquals(\"生命不息，奮鬥不止\", result);\n```\n\n## 繁简体判断\n\n对单个字符或者词组进行繁简体判断。\n\n### 是否为简体 isSimple\n\n```java\nAssert.assertTrue(ZhConverterUtil.isSimple('奋'));\nAssert.assertTrue(ZhConverterUtil.isSimple(\"奋\"));\nAssert.assertTrue(ZhConverterUtil.isSimple(\"奋斗\"));\n\nAssert.assertFalse(ZhConverterUtil.isSimple('奮'));\nAssert.assertFalse(ZhConverterUtil.isSimple(\"奮\"));\nAssert.assertFalse(ZhConverterUtil.isSimple(\"奮鬥\"));\nAssert.assertFalse(ZhConverterUtil.isSimple(\"奮斗\"));\nAssert.assertFalse(ZhConverterUtil.isSimple(\"beef\"));\n```\n\n### 是否包含简体 containsSimple\n\n```java\nAssert.assertTrue(ZhConverterUtil.containsSimple(\"奋\"));\nAssert.assertTrue(ZhConverterUtil.containsSimple(\"奋斗\"));\nAssert.assertTrue(ZhConverterUtil.containsSimple(\"奋斗2023\"));\n\nAssert.assertFalse(ZhConverterUtil.containsSimple(\"編\"));\nAssert.assertFalse(ZhConverterUtil.containsSimple(\"編號\"));\n```\n\n### 是否为繁体 isTraditional\n\n```java\nAssert.assertTrue(ZhConverterUtil.isTraditional('編'));\nAssert.assertTrue(ZhConverterUtil.isTraditional(\"編\"));\nAssert.assertTrue(ZhConverterUtil.isTraditional(\"編號\"));\n\nAssert.assertFalse(ZhConverterUtil.isTraditional('编'));\nAssert.assertFalse(ZhConverterUtil.isTraditional(\"编\"));\nAssert.assertFalse(ZhConverterUtil.isTraditional(\"编号\"));\nAssert.assertFalse(ZhConverterUtil.isTraditional(\"编號\"));\n```\n\n### 是否包含繁体 containsTraditional\n\n```java\nAssert.assertTrue(ZhConverterUtil.containsTraditional(\"編\"));\nAssert.assertTrue(ZhConverterUtil.containsTraditional(\"編號\"));\nAssert.assertTrue(ZhConverterUtil.containsTraditional(\"編號2023\"));\n\nAssert.assertFalse(ZhConverterUtil.containsTraditional(\"号\"));\nAssert.assertFalse(ZhConverterUtil.containsTraditional(\"编号\"));\n```\n\n## 句子中包含的繁简体列表返回\n\n返回字符串中繁简体对应的词、字列表，默认支持中文分词。\n\n繁简体列表返回的词组和分词策略紧密相关。\n\n### 简体列表 simpleList\n\n```java\nfinal String original = \"生命不息奋斗不止\";\nfinal List\u003cString\u003e resultList = ZhConverterUtil.simpleList(original);\n\nAssert.assertEquals(\"[生, 命, 不, 息, 奋斗, 不, 止]\", resultList.toString());\n```\n\n### 繁体列表 traditionalList\n\nPS: 很多字是同体字。\n\n```java\nfinal String original = \"生命不息奮鬥不止\";\nfinal List\u003cString\u003e resultList = ZhConverterUtil.traditionalList(original);\n\nAssert.assertEquals(\"[生, 命, 不, 息, 奮, 鬥, 不, 止]\", resultList.toString());\n```\n\n## 单个汉字对应的繁简体列表\n\n### 繁体字列表\n\n```java\nAssert.assertEquals(\"[幹, 乾, 干]\", ZhConverterUtil.toTraditional('干').toString());\nAssert.assertEquals(\"[發, 髮]\", ZhConverterUtil.toTraditional('发').toString());\n```\n\n### 简体字列表\n\n```java\nAssert.assertEquals(\"[测]\", ZhConverterUtil.toSimple('測').toString());\n```\n\n## 中文工具方法\n\n### 是否为中文 isChinese\n\n```java\nAssert.assertTrue(ZhConverterUtil.isChinese(\"你\"));\nAssert.assertTrue(ZhConverterUtil.isChinese(\"你好\"));\nAssert.assertTrue(ZhConverterUtil.isChinese('你'));\n\nAssert.assertFalse(ZhConverterUtil.isChinese(\"你0\"));\nAssert.assertFalse(ZhConverterUtil.isChinese(\"10\"));\nAssert.assertFalse(ZhConverterUtil.isChinese('0'));\nAssert.assertFalse(ZhConverterUtil.isChinese(\"\"));\nAssert.assertFalse(ZhConverterUtil.isChinese(null));\n```\n\n### 是否包含中文 containsChinese\n\n```java\nAssert.assertTrue(ZhConverterUtil.containsChinese(\"你\"));\nAssert.assertTrue(ZhConverterUtil.containsChinese(\"你好\"));\nAssert.assertTrue(ZhConverterUtil.containsChinese(\"你0\"));\n\nAssert.assertFalse(ZhConverterUtil.containsChinese(\"10\"));\nAssert.assertFalse(ZhConverterUtil.containsChinese(\"\"));\nAssert.assertFalse(ZhConverterUtil.containsChinese(null));\n```\n\n\n# 中国台湾繁简体转换\n\n## 工具类\n\n为保证方法的一致性，引入 `ZhTwConverterUtil` 工具类，支持方法和 `ZhConverterUtil` 保持一致。\n\n## 测试用例\n\n简体到繁体：\n\n```java\nString original = \"使用互联网\";\nString result = ZhTwConverterUtil.toTraditional(original);\nAssert.assertEquals(\"使用網際網路\", result);\n```\n\n繁体到简体：\n\n```java\nString original = \"使用網際網路\";\nString result = ZhTwConverterUtil.toSimple(original);\nAssert.assertEquals(\"使用互联网\", result);\n```\n\n# 中国香港繁体和大陆简体转换\n\n## 说明\n\nv1.12.0 版本支持。\n\n为保证方法的一致性，引入 `ZhHkConverterUtil` 工具类，支持方法和 `ZhConverterUtil` 保持一致。\n\n## 例子\n\n```java\n/**\n * 大陆简体==\u003e香港正體\n * @since 1.12.0\n */\n@Test\npublic void testHkTraditional() {\n    String original = \"千家万户瞳瞳日 总把新桃换旧符\";\n    String result = ZhHkConverterUtil.toTraditional(original);\n    Assert.assertEquals(\"千家萬户瞳瞳日 總把新桃換舊符\", result);\n}\n\n/**\n * 香港正體==\u003e大陆简体\n */\n@Test\npublic void testHkSimple() {\n    String original = \"千家萬户瞳瞳日 總把新桃換舊符\";\n    String result = ZhHkConverterUtil.toSimple(original);\n    Assert.assertEquals(\"千家万户瞳瞳日 总把新桃换旧符\", result);\n}\n```\n\n\n# 日文新字和大陆简体转换\n\n## 说明\n\nv1.13.0 版本支持。\n\n为保证方法的一致性，引入 `ZhJpConverterUtil` 工具类，支持方法和 `ZhConverterUtil` 保持一致。\n\n实际流程：简体==》标准繁体==》日文新字\n\n## 例子\n\n```java\n/**\n * 大陆简体==\u003e标准繁体=》日文\n */\n@Test\npublic void testJpTraditional() {\n    String original = \"我在日本学习音乐，并学习了龙的字。\";\n    String result = ZhJpConverterUtil.toTraditional(original);\n    Assert.assertEquals(\"我在日本学習音楽，並学習了竜的字。\", result);\n}\n\n/**\n * 日文=\u003e标准繁体=\u003e简体\n */\n@Test\npublic void testJpSimple() {\n    String original = \"我在日本学習音楽，並学習了竜的字。\";\n    String result = ZhJpConverterUtil.toSimple(original);\n    Assert.assertEquals(\"我在日本学习音乐，并学习了龙的字。\", result);\n}\n```\n\n# 配置引导类\n\n## 引导类说明\n\n主要的可配置项包含了分词和数据集合。\n\n二者都是可以配置，并且支持自定义的。\n\n### 默认配置\n\n默认工具类等价于如下：\n\n```java\nZhConvertBootstrap.newInstance()\n                .segment(Segments.defaults())\n                .dataMap(DataMaps.defaults()).init();\n```\n\n### 中国台湾地区配置\n\n中国台湾地区配置等价于：\n\n```java\nZhConvertBootstrap.newInstance()\n                .segment(Segments.twFastForward())\n                .dataMap(DataMaps.taiwan()).init();\n```\n\n## 中文分词策略\n\n### 系统内置分词方式\n\n你可以通过 `Segments` 工具类获取系统内置的分词实现。\n\n| 序号 | 方法 | 准确性 | 性能 | 备注 |\n|:---|:---|:---|:---|:---|\n| 1 | defaults() | 高 | 高 | 默认分词形式，暂时为 `fastForward` 策略 |\n| 2 | fastForward() | 较高 | 高 | fast-forward 分词策略 |\n| 3 | chars() | 低 | 高 | 将字符串转换为单个字符列表，一般不建议使用 |\n| 4 | huaBan() | 高 | 一般 | 花瓣的结巴分词策略 |\n\n### 花瓣结巴分词\n\n花瓣结巴分词在使用时，需要自行引入结巴分词依赖。\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.huaban\u003c/groupId\u003e\n    \u003cartifactId\u003ejieba-analysis\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 自定义\n\n你有时候可能除了上述的两种分词方式，会有更加适合自己业务的分词实现。\n\nOpencc4j 支持自定义分词实现，只需要实现分词接口 [Segment](https://github.com/houbb/opencc4j/blob/master/src/main/java/com/github/houbb/opencc4j/support/segment/Segment.java)\n\n- 接口内容\n\n```java\npublic interface Segment {\n\n    /**\n     * 分词\n     * @param original 原始信息\n     * @return 分词后的列表\n     */\n    List\u003cString\u003e seg(final String original);\n\n}\n```\n\n## 测试代码\n\n### 自定义分词实现类\n\n```java\n/**\n * 一个最简单的分词实现。\n * 注意：仅仅做演示，不可实际使用。\n */\npublic class FooSegment implements Segment {\n    @Override\n    public List\u003cString\u003e seg(String original) {\n        return Arrays.asList(original, \"测试\");\n    }\n}\n```\n\n### 分词测试\n\n我们自定义的分词，直接在默认添加“测试”这样的信息。\n\n```java\nfinal String original = \"寥落古行宫，宫花寂寞红。白头宫女在，闲坐说玄宗。\";\nfinal Segment segment = new FooSegment();\n\nfinal String result = ZhConvertBootstrap.newInstance()\n        .segment(segment)\n        .init()\n        .toTraditional(original);\n\nAssert.assertEquals(\"寥落古行宮，宮花寂寞紅。白頭宮女在，閒坐說玄宗。測試\", result);\n```\n\n## 数据接口自定义\n\n不同的地区，对应的转换规则是不同的。\n\n具体参考一下台湾地区的使用方式即可。\n\n### 接口说明\n\nIDataMap 的接口如下。\n\n```java\n/**\n * 数据 map 接口\n * @author binbin.hou\n * @since 1.5.2\n */\npublic interface IDataMap {\n\n    /**\n     * 繁体=》简体 词组\n     * @return 结果\n     * @since 1.5.2\n     */\n    Map\u003cString, List\u003cString\u003e\u003e tsPhrase();\n\n    /**\n     * 繁体=》简体 单个字\n     * @return 结果\n     * @since 1.5.2\n     */\n    Map\u003cString, List\u003cString\u003e\u003e tsChar();\n\n    /**\n     * 简体=》繁体 词组\n     * @return 结果\n     * @since 1.5.2\n     */\n    Map\u003cString, List\u003cString\u003e\u003e stPhrase();\n\n    /**\n     * 简体=》繁体 单个字\n     * @return 结果\n     * @since 1.5.2\n     */\n    Map\u003cString, List\u003cString\u003e\u003e stChar();\n\n    /**\n     * 繁体字所有字符\n     * @return 繁体字所有字符\n     * @since 1.6.2\n     */\n    Set\u003cString\u003e tChars();\n\n    /**\n     * 简体字所有字符\n     * @return 繁体字所有字符\n     * @since 1.8.0\n     */\n    Set\u003cString\u003e sChars();\n\n}\n```\n\n### 自定义说明\n\n如果需要拓展对应的数据，建议继承原始的实现，然后添加额外的数据信息即可。\n\n可以参考 [中国台湾地区实现](https://github.com/houbb/opencc4j#%E4%B8%AD%E5%9B%BD%E5%8F%B0%E6%B9%BE%E5%9C%B0%E5%8C%BA%E9%85%8D%E7%BD%AE)\n\nps: 后续考虑引入更加简单的实现方式，比如基于文本拓展，不过可扩展性没有接口灵活。\n\n# 实际的拓展例子\n\n用于用户参考，可以自定义实现自己的实现，更加符合实际业务。\n\n## 基于基本DataMap的拓展例子\n\nv1.9.0 开始支持，方便用户拓展。\n\n比如首先自定义一个 dataMap 类，集成 AbstractDataMapExtra 可以在指定的 IDataMap 基础上额外指定词组等信息。\n\n```java\npublic class MyFooDataMapExtra extends AbstractDataMapExtra {\n\n    public MyFooDataMapExtra(IDataMap baseDataMap) {\n        super(baseDataMap);\n    }\n\n    // 默认在基本的繁简体基础上拓展\n    public MyFooDataMapExtra() {\n        this(DataMaps.defaults());\n    }\n\n    private Map\u003cString, List\u003cString\u003e\u003e of(String key, List\u003cString\u003e list) {\n        Map\u003cString, List\u003cString\u003e\u003e map = new HashMap\u003c\u003e();\n        map.put(key, list);\n\n        return map;\n    }\n\n    @Override\n    protected Map\u003cString, List\u003cString\u003e\u003e tsPhraseExtra() {\n        // 估计写了个错的，用来演示\n        return of(\"風玥\", Arrays.asList(\"风月\"));\n    }\n\n    @Override\n    protected Map\u003cString, List\u003cString\u003e\u003e tsCharExtra() {\n        return null;\n    }\n\n    @Override\n    protected Map\u003cString, List\u003cString\u003e\u003e stPhraseExtra() {\n        // 估计写了个错的\n        return of(\"风月\", Arrays.asList(\"風玥\"));\n    }\n\n    @Override\n    protected Map\u003cString, List\u003cString\u003e\u003e stCharExtra() {\n        return null;\n    }\n\n}\n```\n\n### 测试\n\n我们只需要在引导类 ZhConvertBootstrap 指定我们的 dataMap 和对应的分词策略，即可。\n\n```java\n// 1.1自定义的额外数据集\nfinal IDataMap dataMap = new MyFooDataMapExtra();\n// 1.2 指定分词策略\nfinal Segment segment = new DataMapFastForwardSegment(dataMap);\n\n// 2. 指定\nZhConvertBootstrap bs = ZhConvertBootstrap.newInstance()\n        .dataMap(dataMap)\n        .segment(segment)\n        .init()\n        ;\n\n// 3. 使用\n        Assert.assertEquals(bs.toTraditional(\"人生自是有情痴,此恨不关风月\"), \"人生自是有情癡,此恨不關風玥\");\n        Assert.assertEquals(bs.toSimple(\"人生自是有情癡,此恨不關風玥\"), \"人生自是有情痴,此恨不关风月\");\n```\n\n\n# 是否为繁简体判断\n\n## 说明\n\nV1.11.0 版本支持。\n\n有时候我们需要判断一个字符串是否为繁简体，isSimple()、isTraditional() 默认要求全部匹配，无法满足全部场景。\n\n这里允许用户自定义相关的策略。\n\n## 内置实现\n\n内置策略见 `ZhMatches` 工具方法。\n\n| 策略                    | 说明       | 备注                     |\n|:----------------------|:---------|:-----------------------|\n| simpleAll()           | 满足全部简体   | isSimple 判断时，默认策略      |\n| simpleAny()           | 满足任一简体   | -                      |\n| simpleOverHalf()      | 满足超过一半简体 | -                      |\n| traditionalAll()      | 满足全部繁体   | isTraditional 判断时，默认策略 |\n| traditionalAny()      | 满足任一繁体   | -                      |\n| traditionalOverHalf() | 满足超过一半繁体 | -                      |\n\n## 例子\n\n### 简体\n\n```java\n// 全部\nZhConvertBootstrap bs = ZhConvertBootstrap.newInstance()\n        .isSimpleMatch(ZhMatches.simpleAll())\n        .init();\nString text = \"123我456\";\nAssert.assertFalse(bs.isSimple(text));\n\n// 任一\nbs.isSimpleMatch(ZhMatches.simpleAny()).init();\nAssert.assertTrue(bs.isSimple(text));\n```\n\n### 繁体\n\n```java\n// 全部\nZhConvertBootstrap bs = ZhConvertBootstrap.newInstance()\n        .isTraditionalMatch(ZhMatches.traditionalAll())\n        .init();\nString text = \"123俺們456\";\nAssert.assertFalse(bs.isTraditional(text));\n\n// 任一\nbs.isTraditionalMatch(ZhMatches.traditionalAny()).init();\nAssert.assertTrue(bs.isTraditional(text));;\n```\n\n## 自定义\n\n如果系统内置的策略不满足，你可以自定义。\n\n实现 ZhMatch 接口，引导类中指定即可使用。\n\n# 技术鸣谢\n\n## OpenCC\n\n[OpenCC](https://github.com/BYVoid/OpenCC) 提供的原始数据信息。\n\n## 花瓣\n\n[jieba-analysis](https://github.com/huaban/jieba-analysis) 提供中文分词\n\n# Issues \u0026 Bugs\n\n[需求和 BUG](https://github.com/houbb/opencc4j/issues) 在这里，欢迎提供宝贵的建议。\n\n如果对您有帮助，欢迎 Star 鼓励作者。\n\n# NLP 开源矩阵\n\n[pinyin 汉字转拼音](https://github.com/houbb/pinyin)\n\n[pinyin2hanzi 拼音转汉字](https://github.com/houbb/pinyin2hanzi)\n\n[segment 高性能中文分词](https://github.com/houbb/segment)\n\n[opencc4j 中文繁简体转换](https://github.com/houbb/opencc4j)\n\n[nlp-hanzi-similar 汉字相似度](https://github.com/houbb/nlp-hanzi-similar)\n\n[word-checker 拼写检测](https://github.com/houbb/word-checker)\n\n[sensitive-word 敏感词](https://github.com/houbb/sensitive-word)\n\n# 后期 Road-Map\n\n- [ ] 数据字典插件化\n\n- [ ] 考虑长文本分段，并行转换\n","funding_links":[],"categories":["人工智能"],"sub_categories":["自然语言处理"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoubb%2Fopencc4j","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhoubb%2Fopencc4j","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhoubb%2Fopencc4j/lists"}