繁简转换
import dev.znlp.Znlp;
Znlp.s2t("汉字"); // 簡 → 繁:漢字Znlp.t2s("漢字"); // 繁 → 簡:汉字两个方法都是静态的,内部通过 TransformService 完成,服务实例在注册表中是单例,词典只加载一次。
TransformService 接口
Section titled “TransformService 接口”converter.dev.znlp.TransformService 提供 String 和 char[] 两套重载:
| 方法 | 说明 |
|---|---|
String s2t(String text) |
简体转繁体 |
String t2s(String text) |
繁体转简体 |
String s2t(char[] text) |
字符数组版,避免额外的字符串拷贝 |
String t2s(char[] text) |
字符数组版 |
需要脱离门面使用时:
TransformService transform = Znlp.getService(TransformService.class);String traditional = transform.s2t("简体中文");char[] 重载适合在已经有字符缓冲的场景(比如分词流水线的 segment(char[], Consumer<Token>))中做原地转换,省去一次 String 构造。
转换基于 Aho-Corasick 自动机做词典多模式匹配,并采用长词优先策略。这一点很重要,因为繁简转换不是逐字映射:
- 「里面」的「里」在繁体中是「裡」(内部含义)还是「里」(长度单位、姓氏),取决于上下文词。
- 「头发」的「发」对应「髮」,而「发展」的「发」对应「發」。
长词优先保证了「里面」整体匹配到「裡面」,而不是把「里」单字转换。因此词典覆盖率直接决定转换质量,遇到专有名词转换错误时,通常是对应词条不在词典中。
| 资源 | 路径 |
|---|---|
| 简转繁词典 | znlp/ts-dict/s2t.txt |
| 繁转简词典 | znlp/ts-dict/t2s.txt |
两个词典都带 .hash 校验文件,首次加载后会生成 S2T_Dict_<hash> 和 T2S_Dict_<hash> 缓存文件写入 cache-dir(默认 data/cache),后续启动直接读缓存。
与分词的关系
Section titled “与分词的关系”繁简转换不在分词流水线内,Znlp.segment 不会自动做转换。但用户词典在入库时会同时保存原词和 CharNormUtils.convert 的规范化形式,所以即使用户词典里写的是简体,繁体输入也可能命中。
如果你的输入是繁简混杂的,建议在进入分词前统一转换:
String normalized = Znlp.t2s(rawText);List<Token> tokens = Znlp.segment(normalized);注意这样得到的 Token.offset 是相对于转换后文本的。由于繁简转换是等长映射(一个汉字对一个汉字),偏移通常仍然可用,但如果原文包含需要多字展开的词,就要自行重新对齐。