卷 IV · 拆CH 17深度 17/24

日语没有空格,
那到底怎么切词

这是日语阅读最底层的一个问题,也是最容易被忽略的一个:在你能查任何一个词之前,你得先知道这个词从哪儿开始、到哪儿结束。而日语什么提示都不给你。

★★ 真分词器词图 + Viterbi和 MeCab 一个思路

问题有多大

看这一串:

怎么切?

きょう は  いしゃ に  いく      今天去看牙医(今日は歯医者に行く)
きょう はい しゃ に  いく      ?
きょうは いしゃ に  いく       同第一种
きょ うは いしゃ にいく        ?

纯假名的情况下,切法是指数级的。而日语真的会出现这种句子——尤其是儿童读物、拟声词、口语记录。

好消息是:现实中日语用汉字帮你切。

汉字和假名的交替本身就是一种分隔符:汉字块是实词,假名块是语法。这也是为什么日语坚持用汉字——废掉汉字,日语就必须像韩语一样加空格。

◆ 但汉字只解决了一半

今日は歯医者に行く

  • 今日歯医者行く —— 汉字和助词交替,很好切 ✓

但一旦遇到连续的假名,就又糊了:

口语和动漫台词里,连续假名的比例特别高——因为口语用的词更简单、更多用假名写。

切词是一次搜索

这个问题的正确解法不是「从左往右尽量长地匹配」(贪心),因为贪心会犯错:

くるまでまつ

贪心:  くるま(车)|で|まつ(等)   →  「在车里等」
正解:  くる(来)|まで|まつ(等)   →  「等到(他)来」

# 贪心先匹配到了最长的「くるま」,结果全错了。

正确的做法是把所有可能的切法都摆出来,然后选最好的那一种

◆ 词图 + Viterbi:四步

① 建词图(lattice)。对每个起点,找出所有「从这里开始的合法词」——查词典命中的、是助词的、逆活用之后命中的。每个词是图上的一条边。

② 给每条边一个「生起代价」。越长越常见的词越便宜;需要逆活用才认出来的贵一点;一个字都不认识的「未知词」很贵。

③ 给相邻两个词一个「连接代价」。助词跟在实词后面 = 免费(最自然);助词跟着助词 = 很贵(不自然);名词跟着名词 = 有点贵。

④ 用 Viterbi 找总代价最小的那条路。动态规划,线性时间。

这就是 MeCab 的算法——日语分词事实上的标准工具,Yomitan、日语输入法、几乎所有日语 NLP 都在用它或它的变体。

唯一的区别是:MeCab 的代价是从上亿字语料训练出来的,下面这台的代价是手写的几条常识

▶ 动手 · 真分词器

粘任何一句日语进去。它会切开,标出每个词的词性、读音、意思,以及活用词的辞书形

先看上面那排格子——绿的是助词,红的是动词。这就是卷 II 那句话的可视化。

点「看代价计算」,能看到每一步的生起代价和连接代价,以及最后那条最优路径的总代价。

那三条「常识」是什么

这台引擎的代价表只有几条规则,但它们编码的是真实的日语知识:

生起代价:
   词越长越便宜        (长匹配通常是对的)
   助词固定低价        (它们短但极常见)
   需要逆活用的贵一点   (多一层不确定)
   未知词很贵          (宁可切成别的)

连接代价:
   实词 → 助词    免费    ★ 这是日语最基本的结构
   实词 → 系词    免费    名词 + です
   助词 → 助词    很贵    ★ 除了 には/では 那几个固定组合
   系词 → 别的    很贵    です 后面一般就完了
   连体词 → 名词  免费    この + 本

注意「实词 → 助词免费」这一条。它是整张代价表里最重要的一条,因为它编码的正是卷 II 的主线:日语句子的基本单位是「一个词块 + 一张标签」。

正因为有这一条,引擎才会倾向于把 くるまでまつ 切成 くる|まで|まつ——因为「动词 + 助词 + 动词」这条路,连接代价比「名词 + 助词 + 动词」更……

其实不一定。这台引擎在这个例子上会不会切对,取决于词典里有没有「くるま」。这就引出下一节。

它的局限,说清楚

这本书的词典只有几百个词,所以它经常切错。诚实地列一下:

局限一:词典太小

遇到不在词典里的词,它会切成一堆单字(标成红色的「不认识」)。人名、地名、专有名词、稍微生僻一点的词,全都不在。

真的 MeCab 带的 IPAdic 有约 40 万词条,UniDic 更大。差着三个数量级。

局限二:代价是手写的,不是训练的

MeCab 的代价表是从人工标注的语料库(比如毎日新聞语料)用 CRF 训练出来的,包含几千个词类之间的连接代价。这台引擎只有十来条手写规则。

局限三:真正的歧义它解决不了

有些句子人也会看错

这种情况只能靠上下文——而上下文超出了分词器的能力范围。MeCab 也解决不了,它会给一个基于概率的答案,可能对可能错。

◆ 但局限不影响这一章的价值

因为这一章的目的不是给你一个能用的分词器(Yomitan 已经有了),是让你理解切词这件事的性质

  • 它是搜索,不是查表。所以会错,而且错法是可预测的。
  • 它依赖词典。所以生词多的文本会切得一塌糊涂——这解释了为什么你读专业内容时体验特别差。
  • 它依赖「助词跟在实词后面」这条结构常识。所以助词认得越准,切得越准。

最后一条对你直接有用:你自己切词时,第一件事也是找助词。

你自己该怎么切

把机器的做法翻译成人能执行的流程:

① 先扫一遍,圈出所有助词
   は が を に で と の も から まで
   → 每个助词的**前面**就是一个词块的结尾

② 看汉字块
   连续的汉字通常是一个词(或一个复合词)
   → 汉字块和假名块的交界,通常是词边界

③ 找最后那个动词
   句尾的活用形 → 用第 16 章的清单剥回辞书形

④ 剩下的假名块,从长到短试
   还剩下的往往是副词、感叹词、或者你不认识的词

这个顺序不能反。先切开,再理解——试图边读边理解,遇到长句一定会崩。

▸ 你早就听过

试着按上面的流程,自己切这几句(先别看下面):

切完对照:

注意第三句的 ——两个助词连着。这是那个例外情况:にはではからは 是固定组合,格助词 + 提示助词,意思是「(在这个格上)至于…」。

上面那台引擎把它们当成单个词条处理了,否则「助词→助词」的高连接代价会让它切错。

↩ 回到生肉

「为什么日文字幕对我帮助那么大?」

因为它替你完成了一部分切词

你听到的是一串连续的音,没有任何边界提示。而屏幕上的日文字幕有汉字——汉字块和假名块的交替,天然把句子切成了段。

所以看日文字幕的时候,你的大脑在做一件事:把听到的音流,对齐到看到的、已经被汉字切好的词块上。

做多了之后会发生什么?你开始能在纯听力里听出边界了——因为你的大脑已经积累了大量「这个音串对应这个词块」的样本。

这就是第 24 章路线里「第 3 步:大量输入」为什么强调日文字幕而不是中文字幕,也不是无字幕。

中文字幕:音和字不对齐,无效。
无字幕:没有边界提示,太早。
日文字幕:音和字同步同序,正好。

这一章的一句话

日语切词是一次搜索而不是查表:枚举所有切法连成词图,用生起代价和连接代价打分,Viterbi 找最优路——而代价表里最重要的一条,就是「实词后面跟助词最自然」,也就是卷 II 那句主线。

下一章:把前面所有的东西合起来用。八句典型动漫句式,一句句拆到底——格子、助词、逆活用链,全都跑一遍。