Package: zhconv-rs
zhconv-rs 中文简繁及地區詞轉換zhconv-rs converts Chinese text among traditional/simplified scripts or regional variants (e.g.zh-TW <-> zh-CN <-> zh-HK <-> zh-Hans <-> zh-Hant), built on the top of rulesets from MediaWiki/Wikipedia and OpenCC.The implementation is powered by anAho-Corasickautomaton, ensuring linear time complexity with respect to the length of input text and conversion rules (O(n+m)), processing dozens of MiBs text per second.🔗Web App:https://zhconv.pages.dev(powered by WASM)⚙️Cli:cargo install zhconv-clior checkreleases.🦀Rust Crate:cargo add zhconv(checkdocsfor examples)🐍Python Package via PyO3:pip install zhconv-rs(WASM with wheels)Python snippet# > pip install zhconv_rs# Convert with builtin rulesets:fromzhconv_rsimportzhconvassertzhconv("天干物燥 小心火烛","zh-tw")=="天乾物燥 小心火燭"assertzhconv("霧失樓臺，月迷津渡","zh-hans")=="雾失楼台，月迷津渡"assertzhconv("《-{zh-hans:三个火枪手;zh-hant:三劍客;zh-tw:三劍客}-》是亞歷山大·仲馬的作品。","zh-cn",mediawiki=True)=="《三个火枪手》是亚历山大·仲马的作品。"assertzhconv("-{H|zh-cn:雾都孤儿;zh-tw:孤雛淚;zh-hk:苦海孤雛;zh-sg:雾都孤儿;zh-mo:苦海孤雛;}-《雾都孤儿》是查尔斯·狄更斯的作品。","zh-tw",True)=="《孤雛淚》是查爾斯·狄更斯的作品。"# Convert with custom rules:fromzhconv_rsimportmake_converterassertmake_converter(None,[("天","地"),("水","火")])("甘肅天水")=="甘肅地火"importioconvert=make_converter("zh-hans",io.StringIO("䖏 处\n罨畫 掩画"))# or path to rule fileassertconvert("秀州西去湖州近 幾䖏樓臺罨畫間")=="秀州西去湖州近 几处楼台掩画间"JS (Webpack):npm install zhconvoryarn add zhconv(WASM,instructions)JS in browser:https://cdn.jsdelivr.net/npm/zhconv-web@latest(WASM)HTML snippet<scripttype="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!importinit,{zhconv}from'https://cdn.jsdelivr.net/npm/zhconv-web@latest/zhconv.js';// specify a version tag if in prodasyncfunctionrun(){awaitinit();alert(zhconv(prompt("Text to convert to zh-hans:"),"zh-hans"));}run();</script>Supported variantszh-Hant, zh-Hans, zh-TW, zh-HK, zh-MO, zh-CN, zh-SG, zh-MYTargetTagScriptDescriptionSimplifiedChinese / 简体中文zh-HansSC / 简W/O substituing region-specific phrases.TraditionalChinese / 繁體中文zh-HantTC / 繁W/O substituing region-specific phrases.Chinese (Taiwan) / 臺灣正體zh-TWTC / 繁With Taiwan-specific phrases adapted.Chinese (Hong Kong) / 香港繁體zh-HKTC / 繁With Hong Kong-specific phrases adapted.Chinese (Macau) / 澳门繁體zh-MOTC / 繁Same aszh-HKfor now.Chinese (Mainland China) / 大陆简体zh-CNSC / 简With mainland China-specific phrases adapted.Chinese (Singapore) / 新加坡简体zh-SGSC / 简Same aszh-CNfor now.Chinese (Malaysia) / 大马简体zh-MYSC / 简Same aszh-CNfor now.Note:zh-TWandzh-HKare based onzh-Hant.zh-CNare based onzh-Hans. Currently,zh-MOshares the same rulesets withzh-HKunless additional rules are manually configured;zh-MYandzh-SGshares the same rulesets withzh-CNunless additional rules are manually configured.Performancecargo benchonIntel(R) Xeon(R) CPU @ 2.80GHz(GitPod), without parsing inline conversion rules: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]The benchmark was performed on a previous version that had only Mediawiki rulesets. In the newer version, with OpenCC rulesets activated by default, the performance may degrade ~2x.Differences with other convertersZhConver{sion,ter}.phpof MediaWiki: zhconv-rs just takes conversion tables listed inZhConversion.php. MediaWiki relies on the inefficient PHP built-in functionstrtr. Under the basic mode, zhconv-rs guarantees linear time complexity (T = O(n+m)instead ofO(nm)) and single-pass scanning of input text. Optionally, zhconv-rs supports the same conversion rule syntax with MediaWiki.OpenCC: Theconversion rulesetsof OpenCC is independent of MediaWiki. The coreconversion implementationof OpenCC is kinda similar to the aforementionedstrtr. However, OpenCC supports pre-segmentation and maintains multiple rulesets which are applied successively. By contrast, the Aho-Corasick-powered zhconv-rs merges rulesets from MediaWiki and OpenCC in compile time and converts text in single-pass linear time, resulting in much more efficiency. Though, conversion results may differ in some cases.LimitationsThe converter takes leftmost-longest matching strategy. It gives priority to the leftmost-matched words or phrases. For instance, if a ruleset includes both干 -> 幹and天干物燥 -> 天乾物燥, the converter would prioritize天乾物燥because天干物燥gets matched earlier compared to干at a later position. The strategy yields good results in general, but may occasionally lead to wrong conversions.The implementation support most of the MediaWiki conversion rules. But it is not fully compliant with the original implementation.Besides, for wikitext, if input text contains global conversion rules (in MediaWiki syntax like -{H|zh-hans:鹿|zh-hant:马}-), the time complexity of the implementation may degrade toO(n*m)wherenandmare the length of the text and the maximum lengths of sources words in conversion rulesets in the worst case (equivalent to brute-force).CreditsAll rulesets that power the converter come from theMediaWikiproject andOpenCC.The project takes the following projects/pages as references:https://github.com/gumblex/zhconv: Python implementation ofzhConver{ter,sion}.php.https://github.com/BYVoid/OpenCC/: Widely adopted Chinese converter.https://zh.wikipedia.org/wiki/Wikipedia:字詞轉換處理https://zh.wikipedia.org/wiki/Help:高级字词转换语法https://github.com/wikimedia/mediawiki/blob/master/includes/language/LanguageConverter.phpTODOSupportModule:CGroupPropogate error properly with Anyhow and thiserrorPython libMore exmaples in READMEAdd rulesets from OpenCC