日语没有空格,
那到底怎么切词
这是日语阅读最底层的一个问题,也是最容易被忽略的一个:在你能查任何一个词之前,你得先知道这个词从哪儿开始、到哪儿结束。而日语什么提示都不给你。
问题有多大
看这一串:
きょうはいしゃにいく
怎么切?
きょう は いしゃ に いく 今天去看牙医(今日は歯医者に行く) きょう はい しゃ に いく ? きょうは いしゃ に いく 同第一种 きょ うは いしゃ にいく ?
纯假名的情况下,切法是指数级的。而日语真的会出现这种句子——尤其是儿童读物、拟声词、口语记录。
好消息是:现实中日语用汉字帮你切。
今日は歯医者に行く
汉字和假名的交替本身就是一种分隔符:汉字块是实词,假名块是语法。这也是为什么日语坚持用汉字——废掉汉字,日语就必须像韩语一样加空格。
看 今日は歯医者に行く:
- 今日|は|歯医者|に|行く —— 汉字和助词交替,很好切 ✓
但一旦遇到连续的假名,就又糊了:
なんでそんなことをいうの
そこでなにしてるの
もうなにもしたくない
而口语和动漫台词里,连续假名的比例特别高——因为口语用的词更简单、更多用假名写。
切词是一次搜索
这个问题的正确解法不是「从左往右尽量长地匹配」(贪心),因为贪心会犯错:
くるまでまつ 贪心: くるま(车)|で|まつ(等) → 「在车里等」 正解: くる(来)|まで|まつ(等) → 「等到(他)来」 # 贪心先匹配到了最长的「くるま」,结果全错了。
正确的做法是把所有可能的切法都摆出来,然后选最好的那一种。
① 建词图(lattice)。对每个起点,找出所有「从这里开始的合法词」——查词典命中的、是助词的、逆活用之后命中的。每个词是图上的一条边。
② 给每条边一个「生起代价」。越长越常见的词越便宜;需要逆活用才认出来的贵一点;一个字都不认识的「未知词」很贵。
③ 给相邻两个词一个「连接代价」。助词跟在实词后面 = 免费(最自然);助词跟着助词 = 很贵(不自然);名词跟着名词 = 有点贵。
④ 用 Viterbi 找总代价最小的那条路。动态规划,线性时间。
这就是 MeCab 的算法——日语分词事实上的标准工具,Yomitan、日语输入法、几乎所有日语 NLP 都在用它或它的变体。
唯一的区别是:MeCab 的代价是从上亿字语料训练出来的,下面这台的代价是手写的几条常识。
粘任何一句日语进去。它会切开,标出每个词的词性、读音、意思,以及活用词的辞书形。
先看上面那排格子——绿的是助词,红的是动词。这就是卷 II 那句话的可视化。
点「看代价计算」,能看到每一步的生起代价和连接代价,以及最后那条最优路径的总代价。
那三条「常识」是什么
这台引擎的代价表只有几条规则,但它们编码的是真实的日语知识:
生起代价: 词越长越便宜 (长匹配通常是对的) 助词固定低价 (它们短但极常见) 需要逆活用的贵一点 (多一层不确定) 未知词很贵 (宁可切成别的) 连接代价: 实词 → 助词 免费 ★ 这是日语最基本的结构 实词 → 系词 免费 名词 + です 助词 → 助词 很贵 ★ 除了 には/では 那几个固定组合 系词 → 别的 很贵 です 后面一般就完了 连体词 → 名词 免费 この + 本
注意「实词 → 助词免费」这一条。它是整张代价表里最重要的一条,因为它编码的正是卷 II 的主线:日语句子的基本单位是「一个词块 + 一张标签」。
正因为有这一条,引擎才会倾向于把 くるまでまつ 切成 くる|まで|まつ——因为「动词 + 助词 + 动词」这条路,连接代价比「名词 + 助词 + 动词」更……
其实不一定。这台引擎在这个例子上会不会切对,取决于词典里有没有「くるま」。这就引出下一节。
它的局限,说清楚
这本书的词典只有几百个词,所以它经常切错。诚实地列一下:
局限一:词典太小
遇到不在词典里的词,它会切成一堆单字(标成红色的「不认识」)。人名、地名、专有名词、稍微生僻一点的词,全都不在。
真的 MeCab 带的 IPAdic 有约 40 万词条,UniDic 更大。差着三个数量级。
局限二:代价是手写的,不是训练的
MeCab 的代价表是从人工标注的语料库(比如毎日新聞语料)用 CRF 训练出来的,包含几千个词类之间的连接代价。这台引擎只有十来条手写规则。
局限三:真正的歧义它解决不了
有些句子人也会看错:
ここではきものをぬいでください
ここで はきもの を ぬいで ください 请在这里脱鞋
ここでは きもの を ぬいで ください 请在这里脱和服
# 两种切法都合法,都通顺,意思完全不同。
# 这个例子是日语里著名的分词歧义案例。
这种情况只能靠上下文——而上下文超出了分词器的能力范围。MeCab 也解决不了,它会给一个基于概率的答案,可能对可能错。
因为这一章的目的不是给你一个能用的分词器(Yomitan 已经有了),是让你理解切词这件事的性质:
- 它是搜索,不是查表。所以会错,而且错法是可预测的。
- 它依赖词典。所以生词多的文本会切得一塌糊涂——这解释了为什么你读专业内容时体验特别差。
- 它依赖「助词跟在实词后面」这条结构常识。所以助词认得越准,切得越准。
最后一条对你直接有用:你自己切词时,第一件事也是找助词。
你自己该怎么切
把机器的做法翻译成人能执行的流程:
① 先扫一遍,圈出所有助词 は が を に で と の も から まで → 每个助词的**前面**就是一个词块的结尾 ② 看汉字块 连续的汉字通常是一个词(或一个复合词) → 汉字块和假名块的交界,通常是词边界 ③ 找最后那个动词 句尾的活用形 → 用第 16 章的清单剥回辞书形 ④ 剩下的假名块,从长到短试 还剩下的往往是副词、感叹词、或者你不认识的词
这个顺序不能反。先切开,再理解——试图边读边理解,遇到长句一定会崩。
试着按上面的流程,自己切这几句(先别看下面):
なんでそんなことをいうの
もうなにもしたくない
おまえにはかんけいない
切完对照:
なんで | そんな | こと | を | いう | の
为什么 那样的 事 ↑ 说 ↑
宾语标签 句尾疑问
もう | なに | も | したく | ない
已经 什么 都 想做 不
← したい 的副词形 + ない
おまえ | に | は | かんけい | ない
你 ↑ ↑ 关系 没有
落点 话题 「和你没关系」
注意第三句的 には——两个助词连着。这是那个例外情况:には、では、からは 是固定组合,格助词 + 提示助词,意思是「(在这个格上)至于…」。
上面那台引擎把它们当成单个词条处理了,否则「助词→助词」的高连接代价会让它切错。
「为什么日文字幕对我帮助那么大?」
因为它替你完成了一部分切词。
你听到的是一串连续的音,没有任何边界提示。而屏幕上的日文字幕有汉字——汉字块和假名块的交替,天然把句子切成了段。
所以看日文字幕的时候,你的大脑在做一件事:把听到的音流,对齐到看到的、已经被汉字切好的词块上。
做多了之后会发生什么?你开始能在纯听力里听出边界了——因为你的大脑已经积累了大量「这个音串对应这个词块」的样本。
这就是第 24 章路线里「第 3 步:大量输入」为什么强调日文字幕而不是中文字幕,也不是无字幕。
中文字幕:音和字不对齐,无效。
无字幕:没有边界提示,太早。
日文字幕:音和字同步同序,正好。
这一章的一句话
日语切词是一次搜索而不是查表:枚举所有切法连成词图,用生起代价和连接代价打分,Viterbi 找最优路——而代价表里最重要的一条,就是「实词后面跟助词最自然」,也就是卷 II 那句主线。
下一章:把前面所有的东西合起来用。八句典型动漫句式,一句句拆到底——格子、助词、逆活用链,全都跑一遍。