形态素分析
将文本分割为最小有意义单位 (形态素) 并赋予语法信息的处理过程。
形态素分析是自然语言处理 (NLP) 的基础技术,将文本分割为最小有意义单位 (形态素),并为每个形态素赋予词性、读音、原形、活用形等语法信息。对于日语等词与词之间没有空格的语言,这是文本处理的第一步,不可或缺。
形态素分析的原理基于词典与统计模型的组合。分析引擎会把输入文本可能的分割方案展开成词格 (lattice,格子状的图),再从其中选出各个词的生成代价与词与词之间的连接代价之和最小的那条路径。用来搜索这条最小代价路径的,正是维特比算法。需要注意的是,维特比本身并不是决定代价的机制,它始终只是搜索的步骤。代价的数值也不是靠人手指定,而是从语料库中学习得到的,MeCab 在官方文档中明确写出,学习模型使用 CRF (条件随机场),解的搜索算法使用 Viterbi。
实际的输出形式,是在分割出的表层形上并排列出词性、读音等信息。例如 "本を読んでいる" 会得到 "本 (名词)/を (助词)/読ん (动词)/で (助词)/いる (动词)" 这 5 个形态素。发生了活用的 "読んでいる" 被拆成 3 份,这正是看起来的词与形态素相互错位的典型例子。
主要的形态素分析引擎包括 MeCab (C++ 实现,速度快)、kuromoji (Java 实现,被 Elasticsearch 采用)、Sudachi (Java 实现,支持多种分割粒度) 和 Janome (Python 实现,安装简便)。根据使用的词典 (IPAdic、UniDic、NEologd 等) 不同,分割结果也会不同,对新词和专有名词的识别精度存在差异。
差异表现得最大的是复合词的粒度。Sudachi 在官方文档中给出了 3 个阶段的分割模式,按核心词典中的示例,"選挙管理委員会" 在 A 模式下分为 "選挙/管理/委員/会",在 B 模式下分为 "選挙/管理/委員会",在 C 模式下则是 "選挙管理委員会" 一整块。A 相当于短单位,C 相当于命名实体,B 则处在两者中间。也就是说,同一个句子的词数会随设置而变成 1 或者 4。关于按用途选用的参考,Sudachi 的官方文档指出,在检索中并用 A 与 C 可以让召回率与精确率两边都得到提高。想吸收不同写法的差异就适合细的粒度,想把专有名词当作一整块处理就适合粗的粒度,这样理解会比较容易整理。
形态素分析的应用场景非常广泛。搜索引擎在构建倒排索引前需要将文档分割为形态素。它作为基础技术被广泛用于文本工具中的词数统计、情感分析预处理、关键词提取、文档摘要和机器翻译预处理等几乎所有涉及文本处理的应用中。
一个常见的挑战是未知词 (词典中未登录的词) 的处理。新的专有名词、新造词、俚语等可能不在词典中,导致错误的分割。为解决这个问题,常见的方法是添加 NEologd 等新词词典,或创建用户词典来登录特定领域的术语。
英语可以用空格切分单词,因此分割本身的难度较小,但需求并不会因此变成零。把 running 还原为 run、把 better 还原为 good 这样的词干提取与词形还原 (原形化) 在英语中同样必要,也就是把日语里由形态素分析承担的一部分职责,交给了另外的处理来完成。另一方面,在日语、中文、韩语 (CJK) 中,分割本身就是第一道门槛,因此形态素分析成为不可或缺的技术。中文会使用 jieba、THULAC,韩语会使用 KoNLPy 等分析工具。在字符计数方面,借助形态素分析不仅能算出 "字符数",还能准确算出 "词数"。要判断一段日语文章中 "这句话有多少个词",就需要形态素分析,这也作为字符计数工具的高级功能被加以利用。不过词数是依赖于词典与分割粒度的相对值,并不像字符数那样能唯一确定。若要用于稿件的分量管理,前提就是始终以同一套设置来数,把不同工具给出的词数直接并排比较是没有意义的。