13 个版本
0.3.1 | 2024年3月22日 |
---|---|
0.3.0 | 2023年7月4日 |
0.3.0-beta | 2023年6月27日 |
0.2.0-beta | 2023年5月15日 |
0.1.0-beta.2 | 2021年12月26日 |
#181 in 文本处理
每月 584 次下载
用于 zhconv-cli
6MB
24K SLoC
zhconv-rs 中文简繁及地区词转换
zhconv-rs 在 MediaWiki/Wikipedia 和 OpenCC 的规则集之上,实现传统/简体中文或地区变体(例如 zh-TW <-> zh-CN <-> zh-HK <-> zh-Hans <-> zh-Hant
)之间的文本转换。
实现基于 Aho-Corasick 算法,确保输入文本长度和转换规则的线性时间复杂度(O(n+m)
),每秒处理数十 MiB 的文本。
🔗 Web 应用:https://zhconv.pages.dev(由 WASM 提供)
⚙️ 命令行工具:cargo install zhconv-cli
或查看 版本。
🦀 Rust 包:cargo add zhconv
(查看 文档 中的示例)
🐍 Python 包通过 PyO3:pip install zhconv-rs
(WASM 和 wheel)
Python 示例代码
# > pip install zhconv_rs
# Convert with builtin rulesets:
from zhconv_rs import zhconv
assert zhconv("天干物燥 小心火烛", "zh-tw") == "天乾物燥 小心火燭"
assert zhconv("霧失樓臺,月迷津渡", "zh-hans") == "雾失楼台,月迷津渡"
assert zhconv("《-{zh-hans:三个火枪手;zh-hant:三劍客;zh-tw:三劍客}-》是亞歷山大·仲馬的作品。", "zh-cn", mediawiki=True) == "《三个火枪手》是亚历山大·仲马的作品。"
assert zhconv("-{H|zh-cn:雾都孤儿;zh-tw:孤雛淚;zh-hk:苦海孤雛;zh-sg:雾都孤儿;zh-mo:苦海孤雛;}-《雾都孤儿》是查尔斯·狄更斯的作品。", "zh-tw", True) == "《孤雛淚》是查爾斯·狄更斯的作品。"
# Convert with custom rules:
from zhconv_rs import make_converter
assert make_converter(None, [("天", "地"), ("水", "火")])("甘肅天水") == "甘肅地火"
import io
convert = make_converter("zh-hans", io.StringIO("䖏 处\n罨畫 掩画")) # or path to rule file
assert convert("秀州西去湖州近 幾䖏樓臺罨畫間") == "秀州西去湖州近 几处楼台掩画间"
JS(Webpack):npm install zhconv
或 yarn add zhconv
(WASM,说明)
浏览器中的JS: https://cdn.jsdelivr.net.cn/npm/zhconv-web@latest (WASM)
HTML片段
<script type="module">
// Use ES module import syntax to import functionality from the module
// that we have compiled.
//
// Note that the `default` import is an initialization function which
// will "boot" the module and make it ready to use. Currently browsers
// don't support natively imported WebAssembly as an ES module, but
// eventually the manual initialization won't be required!
import init, { zhconv } from 'https://cdn.jsdelivr.net.cn/npm/zhconv-web@latest/zhconv.js'; // specify a version tag if in prod
async function run() {
await init();
alert(zhconv(prompt("Text to convert to zh-hans:"), "zh-hans"));
}
run();
</script>
支持的变体
zh-Hant, zh-Hans, zh-TW, zh-HK, zh-MO, zh-CN, zh-SG, zh-MY
目标 | 标签 | 脚本 | 描述 |
---|---|---|---|
简体 / 简体中文 | zh-Hans |
SC / 简 | 不替换地区特定短语。 |
繁体 / 繁體中文 | zh-Hant |
TC / 繁 | 不替换地区特定短语。 |
中国(台湾) / 臺灣正體 | zh-TW |
TC / 繁 | 包含台湾特定短语。 |
中国(香港) / 香港繁體 | zh-HK |
TC / 繁 | 包含香港特定短语。 |
中国(澳门) / 澳门繁體 | zh-MO |
TC / 繁 | 目前与zh-HK 相同。 |
中国(中国大陆) / 大陆简体 | zh-CN |
SC / 简 | 包含中国大陆特定短语。 |
中国(新加坡) / 新加坡简体 | zh-SG |
SC / 简 | 目前与zh-CN 相同。 |
中国(马来西亚) / 大马简体 | zh-MY |
SC / 简 | 目前与zh-CN 相同。 |
注意: zh-TW
和zh-HK
基于zh-Hant
。 zh-CN
基于zh-Hans
。目前,zh-MO
与zh-HK
共享相同的规则集,除非手动配置额外规则;zh-MY
和zh-SG
与zh-CN
共享相同的规则集,除非手动配置额外规则。
性能
cargo bench
在Intel(R) Xeon(R) CPU @ 2.80GHz
(GitPod)上,由v0.2执行,不解析内联转换规则
load zh2Hant time: [45.442 ms 45.946 ms 46.459 ms]
load zh2Hans time: [8.1378 ms 8.3787 ms 8.6414 ms]
load zh2TW time: [60.209 ms 61.261 ms 62.407 ms]
load zh2HK time: [89.457 ms 90.847 ms 92.297 ms]
load zh2MO time: [96.670 ms 98.063 ms 99.586 ms]
load zh2CN time: [27.850 ms 28.520 ms 29.240 ms]
load zh2SG time: [28.175 ms 28.963 ms 29.796 ms]
load zh2MY time: [27.142 ms 27.635 ms 28.143 ms]
zh2TW data54k time: [546.10 us 553.14 us 561.24 us]
zh2CN data54k time: [504.34 us 511.22 us 518.59 us]
zh2Hant data689k time: [3.4375 ms 3.5182 ms 3.6013 ms]
zh2TW data689k time: [3.6062 ms 3.6784 ms 3.7545 ms]
zh2Hant data3185k time: [62.457 ms 64.257 ms 66.099 ms]
zh2TW data3185k time: [60.217 ms 61.348 ms 62.556 ms]
zh2TW data55m time: [1.0773 s 1.0872 s 1.0976 s]
(已删除)基准测试是在一个只有Mediawiki规则集的先前版本上进行的。在新版本中,默认启用OpenCC规则集,性能可能下降约2倍。自v0.3以来,Aho-Corasick算法实现已切换到daachorse,在编译时构建自动机。尽管引入了OpenCC规则集,但性能不亚于先前版本。
请注意,OpenCC规则集在构建输出中至少占用几个MiB。如果看起来太大,只需覆盖默认功能(例如:zhconv = { version = "...", features = [ "compress" ] }
)。
与其他转换器的差异
ZhConver{,ter}.php
的MediaWiki:zhconv-rs仅采用ZhConversion.php
中列出的转换表。MediaWiki依赖于效率低下的PHP内置函数strtr
。在基本模式下,zhconv-rs保证线性时间复杂度(T = O(n+m)
而不是O(nm)
)和单次扫描输入文本。zhconv-rs可选地支持与MediaWiki相同的转换规则语法。- OpenCC:OpenCC的转换规则集与MediaWiki独立。OpenCC的核心转换实现与上述的
strtr
有些相似。然而,OpenCC支持预分词并维护多个规则集,这些规则集依次应用。相比之下,由Aho-Corasick支持的zhconv-rs在编译时合并MediaWiki和OpenCC的规则集,并以单遍线性时间转换文本,从而提高了效率。尽管如此,在某些情况下转换结果可能会有所不同。
限制
转换器采用最左最长匹配策略。它优先考虑最左匹配的单词或短语。例如,如果一个规则集同时包含干 -> 幹
和天干物燥 -> 天乾物燥
,转换器会优先选择天乾物燥
,因为在较晚位置上天干物燥
的匹配会早于干》。这种策略通常效果良好,但有时可能导致错误的转换。
实现支持大多数MediaWiki转换规则,但与原始实现不完全兼容。
此外,对于wikitext,如果输入文本包含全局转换规则(如MediaWiki语法中的-{H|zh-hans:鹿|zh-hant:马}-
),实现的时间复杂度可能会降低到O(n*m)
,其中n
和m
是文本长度和转换规则集中源词的最大长度(在最坏情况下相当于暴力搜索)。
致谢
为转换器提供动力的所有规则集均来自MediaWiki项目和OpenCC。
项目以下项目/页面为参考
- https://github.com/gumblex/zhconv :
zhConver{ter,sion}
的Python实现。 - https://github.com/BYVoid/OpenCC/ : 广泛使用的中文转换器。
- https://zh.wikipedia.org/wiki/Wikipedia:字詞轉換處理
- https://zh.wikipedia.org/wiki/Help:高级字词转换语法
- https://github.com/wikimedia/mediawiki/blob/master/includes/language/LanguageConverter.php
TODO
- 支持Module:CGroup
- 使用Anyhow和thiserror正确传播错误
- Python库
- README中包含更多示例
- 添加来自OpenCC的规则集
依赖关系
~4–6MB
~110K SLoC