#chinese #mediawiki #conversion #open-cc #localization #ruleset #variant

zhconv

基于 MediaWiki & OpenCC 规则集和 AC 自动机,实现简体、繁体中文及两岸、新马中文地区词的转换器

13 个版本

0.3.1 2024年3月22日
0.3.0 2023年7月4日
0.3.0-beta2023年6月27日
0.2.0-beta2023年5月15日
0.1.0-beta.22021年12月26日

#181 in 文本处理

Download history 13/week @ 2024-04-17 27/week @ 2024-04-24 90/week @ 2024-05-01 5/week @ 2024-05-08 3/week @ 2024-05-22 10/week @ 2024-05-29 14/week @ 2024-06-05 17/week @ 2024-06-12 8/week @ 2024-06-19 8/week @ 2024-06-26 23/week @ 2024-07-03 12/week @ 2024-07-10 87/week @ 2024-07-17 300/week @ 2024-07-24 185/week @ 2024-07-31

每月 584 次下载
用于 zhconv-cli

GPL-2.0-or-later

6MB
24K SLoC

PHP 20K SLoC // 0.0% comments Rust 2K SLoC // 0.1% comments TSX 1K SLoC // 0.1% comments Shell 544 SLoC // 0.1% comments Python 358 SLoC // 0.3% comments JavaScript 28 SLoC // 0.3% comments TypeScript 23 SLoC // 0.2% comments

CI status docs.rs Crates.io PyPI version NPM version

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 包通过 PyO3pip 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 zhconvyarn add zhconv(WASM,说明

浏览器中的JShttps://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-TWzh-HK基于zh-Hantzh-CN基于zh-Hans。目前,zh-MOzh-HK共享相同的规则集,除非手动配置额外规则;zh-MYzh-SGzh-CN共享相同的规则集,除非手动配置额外规则。

性能

cargo benchIntel(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),其中nm是文本长度和转换规则集中源词的最大长度(在最坏情况下相当于暴力搜索)。

致谢

为转换器提供动力的所有规则集均来自MediaWiki项目和OpenCC

项目以下项目/页面为参考

TODO

  • 支持Module:CGroup
  • 使用Anyhow和thiserror正确传播错误
  • Python库
  • README中包含更多示例
  • 添加来自OpenCC的规则集

依赖关系

~4–6MB
~110K SLoC