简繁转换为什么老出错?「一简多繁」与词组级转换
上周有个运营同事跑过来吐槽,她把一份简体产品文案用某个在线工具转成繁体,发给香港的合作方,结果被人家截图发回来嘲笑:「你们这头发是长在头上的,还是发出去的?」她一头雾水,打开转换结果一看,「头发」被转成了「頭發」。
「發」是发财的发,「髮」才是头发的发。一个简体字「发」在简化时合并了两个完全不同的繁体字,纯字表一对一映射根本判断不出来。
这事坑过的人不少。下面把根因讲清楚。
一简多繁是什么
简化汉字那会儿,为了少写笔画,做了一件偷懒的事:把读音或字形相近的几个繁体字,合并成一个简体字。于是出现了「一简多繁」这个怪现象,一个简体字在还原成繁体时,可能对应好几个不同的字,到底用哪个,得看语境。
举几个最常踩的:
- 发 →「發」(发财、发展)或「髮」(头发、理发)
- 干 →「幹」(干事、才干)、「乾」(干燥、干涸)、「干」(干涉、相干)
- 面 →「面」(面对面、表面)或「麵」(面条、吃面)
- 后 →「後」(以后、后面)或「后」(皇后、太后)
- 里 →「裡」(这里、里面)或「里」(公里、邻里)
- 斗 →「鬥」(战斗、斗争)或「斗」(北斗、一斗米)
每一个字单独拎出来,转换器都能蒙对一半,蒙错一半。
典型翻车现场
把这些字塞进常见词里,就能看出纯字表转换有多离谱:
| 简体原文 | 正确繁体 | 字表转换(错) | 错在哪 |
|---|---|---|---|
| 头发 | 頭髮 | 頭發 | 把头发的「髮」当成了发财的「發」 |
| 干涸 | 乾涸 | 幹涸 | 把干燥的「乾」当成了才干的「幹」 |
| 吃面 | 吃麵 | 吃面 | 该用面条的「麵」,结果没转 |
| 皇后 | 皇后 | 後后 | 该用「后」,结果套上了以后的「後」 |
| 这里 | 這裡 | 這里 | 该用里面的「裡」,结果没转 |
最后两个特别要命。「吃面」转成了「吃面」,看上去啥也没变,但繁体里根本没有「面」表示面条这个用法,港澳台读者一眼看出来是机翻。「这里」转成了「這里」,里外不分,同样露馅。
为什么纯字表会错
纯字表转换的逻辑长这样:建一张 { '发': '發', '干': '幹', '面': '面', '后': '後' } 的对照表,然后遍历字符串,逐字替换。
问题显而易见。这张表只能存一个对应关系,存了「发→發」就转不了「髮」,存了「发→髮」就转不了「發」。两个字必须二选一,结果就是无论选哪个,都有一半场景出错。
「面」和「后」更坑,因为它们的某一个繁体形式就是字本身(「面」的「面对面」用法、「后」的「皇后」用法)。字表里要么写「面→面」(等于没转),要么写「面→麵」(把面对面也转成麵麵),两种都不对。
逐字替换丢失了语境信息,而判断该用哪个繁体字,靠的恰恰是语境。单看一个「发」字,机器没法知道这是头发还是发财。
词组级转换怎么解决
正解是先查词组,再查单字。流程大致是:
- 维护一张词组词典,里面存的是「头发→頭髮」「发财→發財」「干燥→乾燥」「干涉→干涉」这类成对的短语。
- 转换时,先在原文里做最长匹配,找到词组就用词组的结果。
- 词组没命中的单字,才落到单字对照表。
这样「头发」被词组词典截胡,转成「頭髮」;「发现」命中另一个词组,转成「發現」。单字「发」如果既不在任何词组里,按默认规则处理(通常会偏向高频用法)。
OpenCC(开放中文转换)就是这么做的,它内置了几万条词组词典,是业界事实标准。绝大多数靠谱的简繁转换库底层都是 OpenCC 或者它的衍生版本。如果你自己在写转换逻辑,别想着自己攒字表能搞定,直接用 OpenCC 的词库。
台湾繁体和香港繁体的用词差异
就算字符级全转对了,还有一层坑:用词。同样是繁体,台湾和香港叫法不一样,跟大陆更不一样。
- 软件(大陆)→ 軟體(台湾)/軟件(香港)
- 计算机(大陆)→ 電腦(台湾、香港)
- 网络(大陆)→ 網路(台湾)/網絡(香港)
- 激光(大陆)→ 雷射(台湾)/激光(香港)
- 屏幕(大陆)→ 螢幕(台湾)
所以「软件工程师」转成台湾用词是「軟體工程師」,转成香港用词是「軟件工程師」,不是把「软」字换成「軟」就完事。OpenCC 里针对台湾和香港分别有独立的词库(TW 和 HK 变体),就是为了处理这种差异。严格的本地化,必须同时做字符转换和用词转换,否则给台湾用户看「軟件」,一样会觉得别扭。
实操
要把一段简体文本稳妥地转成繁体,别用只支持字表的工具。可以直接丢进 UPTools 简繁转换工具 试一下,多拿几个含「发」「干」「面」「后」的句子对比,看会不会把「头发」转成「頭發」。如果会,说明它底层就是一张字表,写正经文案的时候慎用。文本全部在浏览器本地处理,不上传任何内容。
三句话总结
简繁转换的真正难点不是字对字,而是「一简多繁」,一个简体字对应多个繁体字,得靠语境判断。纯字表一对一映射必然出错,把「头发」转成「頭發」是它绕不过去的坎。可靠方案是词组级转换,先查词组词典,词组没命中再退回单字,OpenCC 是事实标准。
相关文章
- camelCase 和 snake_case 怎么互转?分词的坑 把 userName 转成 user_name 看起来简单,但遇到 HTMLElement、parseURL 这类连续大写缩写就会拆错。本文讲清命名格式转换的分词难点。
- 从网页复制的内容全是 HTML 标签?去标签的正确做法 用正则去掉 HTML 标签看着简单,但 script 内容、属性值里的尖括号、HTML 实体都会漏。本文讲清为什么正则去不干净,以及更稳妥的做法。
- 中英文混排字数怎么算?「按字」和「按词」的区别 Word 显示 800 字、博客平台显示 650 字、字数统计工具显示 720——为什么不一样?本文讲清中英混排「按字」和「按词」的统计口径差异。