HanLP极致简繁转换

简介:

谈起简繁转换,许多人以为是小意思,按字转换就行了。事实上,汉语历史悠久,地域复杂,发展至今在字符级别存在“一简对多繁”和“一繁对多简”,在词语级别上存在“简繁分歧词”,在港澳台等地则存在“字词习惯不同”的情况。为此,HanLP新增了“简体”“繁体”“臺灣正體”“香港繁體”间的相互转换功能,力图将简繁转换做到极致。

image

关于这些汉语语言上的详情,请参考郭家寶的OpenCC项目。HanLP整合了该项目的词库,用原生的AhoCorasickDoubleArrayTrie算法实现了各语言分支的转换。对于简繁转换模块来说,算法都是类似的,最宝贵的地方在于词库,在此向OpenCC表示敬意和感谢!

快速上手
一个Demo
System.out.println(HanLP.convertToTraditionalChinese("“以后等你当上皇后,就能买草莓庆祝了”。发现一根白头发"));
System.out.println(HanLP.convertToSimplifiedChinese("憑藉筆記簿型電腦寫程式HanLP"));
// 简体转台湾繁体
System.out.println(HanLP.s2tw("hankcs在台湾写代码"));
// 台湾繁体转简体
System.out.println(HanLP.tw2s("hankcs在臺灣寫程式碼"));
// 简体转香港繁体
System.out.println(HanLP.s2hk("hankcs在香港写代码"));
// 香港繁体转简体
System.out.println(HanLP.hk2s("hankcs在香港寫代碼"));
// 香港繁体转台湾繁体
System.out.println(HanLP.hk2tw("hankcs在臺灣寫代碼"));
// 台湾繁体转香港繁体
System.out.println(HanLP.tw2hk("hankcs在香港寫程式碼"));

// 香港/台湾繁体和HanLP标准繁体的互转
System.out.println(HanLP.t2tw("hankcs在臺灣寫代碼"));
System.out.println(HanLP.t2hk("hankcs在臺灣寫代碼"));

System.out.println(HanLP.tw2t("hankcs在臺灣寫程式碼"));
System.out.println(HanLP.hk2t("hankcs在台灣寫代碼"));
输出
「以後等你當上皇后,就能買草莓慶祝了」。發現一根白頭髮
凭借笔记本电脑写程序HanLP
hankcs在臺灣寫程式碼
hankcs在台湾写代码
hankcs在香港寫代碼
hankcs在香港写代码
hankcs在臺灣寫程式碼
hankcs在香港寫代碼
hankcs在臺灣寫程式碼
hankcs在台灣寫代碼
hankcs在臺灣寫代碼
hankcs在臺灣寫代碼
说明
注意在旧版HanLP中,简体“草莓”被转换为“士多啤梨”。后来有用户告诉我“士多啤梨”是香港的用法,不属于通俗意义上的“繁体”,所以在新版中去除了这一转换。而“臺灣”“程式碼”是台湾地区的用法,“台灣”“代碼”则是香港地区的用法,所以

System.out.println(HanLP.t2tw("hankcs在臺灣寫代碼"));
System.out.println(HanLP.t2hk("hankcs在臺灣寫代碼"));
分别输出了:

hankcs在臺灣寫程式碼
hankcs在台灣寫代碼
这里面存在微妙的不同。

基本定义
简体
HanLP中的简体特指大陆地区的简体字。

繁体
HanLP中的繁体是通俗意义上的繁体中文,即受众最广的繁体表示。如果说OpenCC定义了自己的“OpenCC繁体标准”的话,那么这也可以算得上“HanLP繁体标准”。

香港繁體
指的是香港地区使用的繁体中文,据OpenCC的wiki介绍,属于“香港小學學習字詞表標準”。

臺灣正體
指的是台湾地区使用的繁体中文,即“臺灣正體標準”。

接口一览
HanLP支持上述四种中文任意两种之间的转换:

/**

  • 简转繁,是{@link com.hankcs.hanlp.HanLP#convertToTraditionalChinese(java.lang.String)}的简称
  • @param s 简体中文
  • @return 繁体中文(大陆标准)
    */

public static String s2t(String s)
{

return HanLP.convertToTraditionalChinese(s);

}

/**

  • 繁转简,是{@link HanLP#convertToSimplifiedChinese(String)}的简称
  • @param t 繁体中文(大陆标准)
  • @return 简体中文
    */

public static String t2s(String t)
{

return HanLP.convertToSimplifiedChinese(t);

}

/**

  • 簡體到臺灣正體
  • @param s 簡體
  • @return 臺灣正體
    */

public static String s2tw(String s)
{

return SimplifiedToTaiwanChineseDictionary.convertToTraditionalTaiwanChinese(s);

}

/**

  • 臺灣正體到簡體
  • @param tw 臺灣正體
  • @return 簡體
    */

public static String tw2s(String tw)
{

return TaiwanToSimplifiedChineseDictionary.convertToSimplifiedChinese(tw);

}

/**

  • 簡體到香港繁體
  • @param s 簡體
  • @return 香港繁體
    */

public static String s2hk(String s)
{

return SimplifiedToHongKongChineseDictionary.convertToTraditionalHongKongChinese(s);

}

/**

  • 香港繁體到簡體
  • @param hk 香港繁體
  • @return 簡體
    */

public static String hk2s(String hk)
{

return HongKongToSimplifiedChineseDictionary.convertToSimplifiedChinese(hk);

}

/**

  • 繁體到臺灣正體
  • @param t 繁體
  • @return 臺灣正體
    */

public static String t2tw(String t)
{

return TraditionalToTaiwanChineseDictionary.convertToTaiwanChinese(t);

}

/**

  • 臺灣正體到繁體
  • @param tw 臺灣正體
  • @return 繁體
    */

public static String tw2t(String tw)
{

return TaiwanToTraditionalChineseDictionary.convertToTraditionalChinese(tw);

}

/**

  • 繁體到香港繁體
  • @param t 繁體
  • @return 香港繁體
    */

public static String t2hk(String t)
{

return TraditionalToHongKongChineseDictionary.convertToHongKongTraditionalChinese(t);

}

/**

  • 香港繁體到繁體
  • @param hk 香港繁體
  • @return 繁體
    */

public static String hk2t(String hk)
{

return HongKongToTraditionalChineseDictionary.convertToTraditionalChinese(hk);

}

/**

  • 香港繁體到臺灣正體
  • @param hk 香港繁體
  • @return 臺灣正體
    */

public static String hk2tw(String hk)
{

return HongKongToTaiwanChineseDictionary.convertToTraditionalTaiwanChinese(hk);

}

/**

  • 臺灣正體到香港繁體
  • @param tw 臺灣正體
  • @return 香港繁體
    */

public static String tw2hk(String tw)
{

return TaiwanToHongKongChineseDictionary.convertToTraditionalHongKongChinese(tw);

}
共计12种接口。命名规范按照X2Y的形式,X表示源语种,Y表示目标语种。

词库
由于我并没有OpenCC作者那样深厚的繁体中文语言知识,所以这些接口未必能完美地满足广大繁体中文用户的需求,希望大家多多包涵,提出宝贵意见。

所有的词库都是以文本方式维护,命名规则与接口保持一致。不过,词典的文本形式只有如下四种:

s2t.txt t2hk.txt t2s.txt t2tw.txt
类似tw2hk的词典并不存在,tw2hk只存在自动推导出的bin文件,其推导规则为

逆转t2tw得到tw2t
利用t2hk得到tw2hk
推导由HanLP程序控制,用户修改推导过程中用到的四个词典后需要删除推导结果的缓存文件才能生效。其他8种接口的推导过程类似于此,不再赘述。

文章来源于网络

相关文章
|
安全 架构师 应用服务中间件
Nginx极简入门(五)配置Nginx反向代理
反向代理(Reverse Proxy)则是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器
Nginx极简入门(五)配置Nginx反向代理
|
2月前
|
机器学习/深度学习 数据采集 人工智能
国产大模型GEO:最易被忽视的7个高影响因子
本文揭示国产大模型(文心、通义、智谱等)引用内容的底层逻辑,总结Geo专家于磊提炼的七大关键因素:可引用性、结构层、第三方声望、E-E-A-T重权、位置偏见、新鲜度与可验证性、实体身份一致性。聚焦中文生态,强调“被引用”本质是机器对可验证信源的信任积累。
161 1
|
28天前
|
人工智能 自然语言处理 监控
2026 AI客服系统格局梳理:主流智能客服产品全解析
2026年,AI客服迈入“执行时代”,核心价值从“答得像人”转向“办成业务”。瓴羊Quick Service作为阿里云新一代智能客服平台,深度融合大模型与AI Agent技术,具备93%问答准确率、全渠道协同、工单闭环及后端系统直连能力,已服务长城汽车、上汽、申通等企业,推动客服从成本中心升级为增长引擎。(239字)
|
4月前
|
JavaScript 前端开发 网络协议
深入理解 Node.js 事件循环机制
本文深入剖析 Node.js 事件循环本质:它由 libuv 驱动(非 V8),含 timers/poll/check 等六阶段;详解 `nextTick`(优先级最高)、Promise 微任务与宏任务的执行时序;厘清 `setTimeout(0)` 与 `setImmediate` 的执行差异;揭示线程池(默认4线程)对 fs/crypto 等操作的影响;强调避免同步阻塞主线程。助你真正掌握异步调度逻辑。(239字)
321 7
深入理解 Node.js 事件循环机制
|
机器学习/深度学习 人工智能 自然语言处理
Step-Audio2 声音克隆 详细介绍
Step-Audio2是StepFun于2024年推出的中文语音克隆大模型,支持“一句话克隆+情感可控+实时流式”一体化生成,参数总量300M,首包延迟低至120ms,MOS达4.4+,采用Apache-2.0协议开源,适配商业应用,是当前中文TTS领域开源落地门槛最低的方案之一。
|
9月前
|
算法 数据可视化
脉冲激光仿真程序实现方案(含MATLAB代码与工具对比)
脉冲激光仿真程序实现方案(含MATLAB代码与工具对比)
352 4
|
存储 安全 数据管理
数据资产入表30问!你最关心的都在这里了
随着数据资产入表新规实施,企业需将合规数据资源纳入资产负债表,实现从成本到资产的价值跃迁。本文以30问详解确权、计量、估值与管理全流程,助力企业把握数字时代新红利。(238字)
|
消息中间件 存储 监控
ActiveMQ、RocketMQ、RabbitMQ、Kafka 的区别
【10月更文挑战第24天】ActiveMQ、RocketMQ、RabbitMQ 和 Kafka 都有各自的特点和优势,在不同的应用场景中发挥着重要作用。在选择消息队列时,需要根据具体的需求、性能要求、扩展性要求等因素进行综合考虑,选择最适合的消息队列技术。同时,随着技术的不断发展和演进,这些消息队列也在不断地更新和完善,以适应不断变化的应用需求。
1270 1
|
人工智能 文字识别 数据安全/隐私保护
OCR文字识别软件图片文字识别软件ABBYY FineReader16
ABBYY FineReader16是非常好的一款 OCR 识别软件(可以识别不可编辑的 PDF 和图片文件),操作非常简单。ABBYY FineReader 16是一款知名的OCR文字识别软件(图片文字识别)。ABBYY 15采用了ABBYY最新推出的基于AI的OCR技术,可以更轻松地在同一工作流程中对各种文档进行数字化、检索、编辑、加密、共享和协作。
1347 0

热门文章

最新文章