中文分词系列一:思考分词

世界上这么多语言,如果直接从外观来看,大概有两种:一种是字符中间用空格隔开的,另一种是所有字符连在一起的。前者如英文、德语、俄语、法语等等,后者如中文、日文等,这类语言词与词之间没有用明显的标志分开。因此,分词就是想方设法将给定文本按一定方式隔开,便于计算机更好地处理。

我们自然而然就有一个疑问:为什么要分词,不分词可不可以?现有观点大概有这么几个:

  • “词” 是最小的能够 “独立运用” 的语言单位,尤其是现代汉语中双音节词占绝大多数,如果以字为基本单位不符合人的使用习惯。
  • 承载语义,单个字不太能表达准确的语义,比如 “手机”,单个字很难表达两个字所表达的意思。为什么要分词 - CSDN 博客也一语中的:“分词无非是切割语义罢了”。
  • 速度、准确度、成本、效率等。这个答案来自:细说中文分词,以搜索引擎为例,单个字组合的可能性太多,而且很多组合都是废的。比如:“蝴蝶”,任意一个字和其他所有汉字的组合都是没有意义的。
  • 切断上下文耦合,降低词序的影响。这个答案来自:自然语言处理为什么要分词? - 毕胜的回答 - 知乎,从自然语言处理任务的角度,认为大部分算法要求特征独立,如果不分词的话,字字之间几乎肯定有关联。所以就要想办法把文本切分一下,或者更好的说法叫组合一下,让各组合之间的耦合性降低,以组合为特征,使其更接近假设。

总结一下,这么看来分词就是降低不确定性,也就是减熵,而减熵是智能的表现。因此,分词本质是把一定的 “先验知识” 加入到数据中,让数据具备一定的 “结构”。比如:“我|喜欢|你”,和 “我|喜|欢|你”,前者看起来更加清晰一些。那这么说的话可不可以以句子为单位?当然也可以,但是句子生成的可能性是无穷的,复用性很差。更极端点的,以整个篇章作为粒度也是可以的,只是这样一来就毫无意义了。其实,即便是到『词』的粒度,也会面临两个突出的问题:巨大的词表和未登录词问题。而且,BERT 之后,字与词之间的效果差距越来越小;换句话说,当模型足够复杂能够学到字组成词的结构信息,那字粒度是完全可以的,甚至以偏旁部首作为粒度也是可以考虑的。关于是否在 BERT 时代继续使用分词,提速不掉点:基于词颗粒度的中文WoBERT - 科学空间|Scientific Spaces 做了详细的实验,归纳起来就是:分类任务差别不大,生成任务词粒度效果较好,NER 任务字粒度效果较好;同时,词粒度的性能要优于字粒度。这个结果其实都是在预期内的,不同的粒度对应有各自的优缺点,没有银弹。

所以,要不要分词可能需要看具体的任务,有的任务可能分词会效果好一点,比如搜索引擎、机器翻译、文本生成、关键词抽取等;也有的任务可以不分词,比如文本纠错、情感分析、文章分类等(当然分词也是很 OK 的)。不过上面的分析忽略了一个重要的假设:我们是假定 “人” 作为处理者的,我们会不由自主地将 “人” 代入 “计算机”,期望计算机也能像人一样思考和处理问题。事实上,就目前的计算机来说,那肯定和人完全不同的:计算机擅长存储、计算;人类擅长抽象、想象。计算机看到的图片是像素矩阵,人看到的图片是一种景象,一种真实世界在个人思维下的映射。计算机可能知道美,但他能欣赏的美并不一定就是人类欣赏的美,即便不同的人欣赏到的美都可能不同,又怎么能苛求计算机做的更多呢。反过来说,计算机为什么要像人一样呢?它本来就不需要像人一样。往大了说,人是一种物种,计算机也可以是一种物种,仅此而已,它就算理解你了,那也可能是让你 “看起来好像” 被理解了。所以,从这个角度来看,计算机本身可能并不在乎你输入的是字还是词。

那么,我们到底要不要分词?之前在为什么要分词 - CSDN 博客这篇博客中看到一个观点:“分词无非是切割语义”,如文章所言:“中文没有分词功能,真的是很糟糕的,我一直认为中国之所以没有工业革命,就是因为没有分词。对于专业书籍来说,人进行分词也是非常困难的。至少分的很慢。所以影响了知识的传播。”这个观点你是否认同呢?我们再想想,可以不可以每两个字从头到尾切词切过去呢?换成四个字呢?或者可不可以按读音的停顿切词呢?你怎么看?

回到要不要分词这个问题,我个人的观点是:先把人放一边,从计算机处理的角度看,要让它处理起来「舒服」。这就要求我们:数据不能太稀疏(表征能力不足,很多方法没法用),减少能量消耗(很明确的不需要费劲巴拉去猜),不引入额外的复杂度(分错还不如不分),整体简单高效(最省力法则)。因此,我的回答也就显而易见:使用字+词的组合,对于在任何时候都是很明确的词或与首尾字与上下文成词概率非常低的词,就以词的形式存在,否则使用字粒度。比如「蝴蝶」,它在任何时候都是一个整体,因为「蝴」字没有单独的语义,只有和「蝶」组合在一起才有意义;再比如「机器学习」,与首尾两个字组成新词的可能性非常低(不是没有可能,比如 “机器学习大走路”)。具体做法很多,这里提供一种思路:首先,从高质量数据集和公开的词表中获取常见高频词汇(长度至少两个字),然后针对每个词从大规模语料中找到包含该词的句子,并通过语言模型计算该词首尾字与上下文成词的概率,如果概率低于某阈值,则将该词添加到词表。

参考

ChangeLog

  • 20210508 修改
  • 20200513 创建