29 条词表做最长匹配,四句方言分别命中 3/3/4/2 个词。 「我晓得你在摆龙门阵,巴适得很」变成「我知道你在聊天, 舒服得很」——但「呢个」「啷个办」这类没收录的,只能原样留着。
上一节做图像,这一节做语言。方言翻译看着是「换个词」,真做起来最难的是语序和没见过的说法。
一、方言翻译难在哪
不只是词不同。三层困难,一层比一层深: 1. 词不同:晓得=知道,巴适=舒服。这层查表就够。 2. 语序不同:「你走先」是「你先走」;「给本书我」是「给我一本书」。这层查表解决不了。 3. 语气和习惯不同:「得板」「得很」这类程度补语,直译出来很别扭。 Demo 的词典法只能处理第一层。所以它翻出来的句子「能看懂,但不像人话」。 认清这一点比翻对几个词重要:知道方法的边界,才知道什么时候该换方法。
二、最长匹配:先试最长的那个词
查表也有讲究。 如果按「从左到右、碰到哪个词就换哪个」的朴素做法,「摆龙门阵」会被切成「摆」「龙门」「阵」,全错。 正确做法是最长匹配:在当前位置,先把词表按长度从长到短试一遍,能匹配多长就吃多长。 Demo 的词表里有 29 条,最长的是「摆龙门阵」(4 字)。所以「摆龙门阵」会整体换掉,不会被拆碎。 这个思路在分词、地址解析、日志模板提取里都在用,叫「最大正向匹配」。 它简单、快、可解释,缺点是遇到歧义会错(比如「的确」和「的」加「确」)。
三、没收录的词怎么办
Demo 里四句话的命中率是 3、3、4、2,剩下的字原样输出。 所以「啥子时候落雨哦,啷个办」只翻出了「什么时候下雨哦」, 后面的「怎么办」能翻是因为「啷个」在表里——「办」本来就不用翻。 对没收录的说法,Demo 用编辑距离找词表里最像的一条,作为兜底提示。 「晓得伐」最像「晓得」(距离 1),「啷个回事」最像「啷个」(距离 2), 「巴适得板」最像「巴适」(距离 2)。 编辑距离就是「改几个字才能变成另一个」,插入、删除、替换各算 1。 它是个很实用的兜底手段:不知道是什么,至少知道最像什么。
四、真要做方言翻译,得用神经模型
神经机器翻译的流程是:编码器读整句,解码器逐字生成。它不需要词表对齐,语序差异也能学出来。 但代价是要平行语料:同一句话的方言版和普通话版,成对出现。 方言的平行语料极少,这是它比英译中难做的根本原因。 折中的做法有两种:先用大模型做零样本翻译(不训练,直接给提示词),再用人工校对的结果攒语料, 最后才考虑微调。 这条路径的顺序很重要:先验证需求,再投数据。反过来做,往往花三个月攒了语料,发现没人用。
五、动手 Demo:方言转普通话:最长匹配 + 编辑距离兜底
建一张 29 条的四川话/粤语词表; 按词长从长到短做最长匹配,把四句方言逐字扫一遍,统计命中词数与未登录字; 再用编辑距离给三个没收录的说法各找一条最像的词表条目。
keys = sorted(lex, key=len, reverse=True) # 长的先试
while i < len(s):
for k in keys:
if s.startswith(k, i):
out.append(lex[k])
i += len(k)
break
else:
out.append(s[i]) # 没命中就原样留
i += 1
实跑输出:
--------------------------------------------------------------------
方言转普通话:最长匹配 + 编辑距离兜底
--------------------------------------------------------------------
方言原文 转成普通话 命中词数 未登录字
----------------------------------------------------------------------------------
我晓得你在摆龙门阵,巴适得很 我知道你在聊天,舒服得很 3 我你在,得很
啥子时候落雨哦,啷个办 什么时候下雨哦,怎么办 3 时候哦,办
佢唔好意思讲,点解要返工 他不好意思讲,为什么要上班 4 意思讲,要
呢个几钱,多谢你 呢个多少钱,谢谢你 2 呢个,你
词表规模 29 条(四川话 + 粤语混编)
匹配方式 按词长从长到短做最长匹配
最长词 摆龙门阵(4 字)
未登录字用编辑距离找最近的词表条目兜底:
「晓得伐」最像 「晓得」→ 知道(编辑距离 1)
「啷个回事」最像 「啷个」→ 怎么(编辑距离 2)
「巴适得板」最像 「巴适」→ 舒服(编辑距离 2)
这个翻译器只有 29 条词,句子稍长就一半靠原样输出。
真正的方言翻译是神经机器翻译:编码器读整句、解码器逐字生成,
能处理语序差异和没见过的说法。词典法只能换词,换不了语序。
沙箱里装不了 transformers,也调不到在线大模型接口,
所以这里只保留「可复现的那一半」:词表、最长匹配、编辑距离兜底。
四句的命中词数是 3 / 3 / 4 / 2。 第一句「晓得」「摆龙门阵」「巴适」三条都中了,翻出来读着还算顺。 第四句「呢个几钱」只命中 2 个——「几钱」翻了,「呢个」没收录,所以结果里原样留着「呢个」。 这就是词典法的天花板。 编辑距离那三行是兜底效果:「晓得伐」离「晓得」只有 1 步,挺准;「巴适得板」离「巴适」2 步,也对。 但「啷个回事」离「啷个」2 步只是「最像」,不是「就是」——兜底结果必须人工确认,不能直接当真。
30 秒实验
- 往词表里加 10 条你家乡的方言,重跑,看命中数涨多少。
- 把最长匹配改成最短匹配,看「摆龙门阵」会不会被拆碎。
- 想一想:为什么方言翻译的平行语料这么难攒?
常见误区
- 「方言就是换几个词」——语序和语气才是难点。
- 「有词表就够了」——词表处理不了没见过的说法。
- 「先攒语料再找需求」——很可能攒完发现没人用。
自测三问(点开对答案)
1. 为什么查表要按最长匹配? —— 否则「摆龙门阵」会被切成「摆」「龙门」「阵」,全错。 2. 编辑距离在这里起什么作用? —— 没收录的说法至少能找到一个最像的词表条目,作为兜底提示。 3. 方言翻译比英译中难做的根本原因是什么? —— 方言几乎没有平行语料,而神经翻译要靠平行语料训练。语言处理完,下一个实例做推荐:从口味推一道菜。
- ☐ (本节完,下一节 5.2.3 实例3:使用AI推荐美食)