中文与英文体系不同,英文天然就有空格可以作为词与词之间的分割,只不过有些词组被空格分开可能会没有意义,但其占比并不高,而且即使被分开,现在越来越深的模型如LSTM和Transfomer也学习不到这些固定搭配的含义。中文多字词的比例则高得多,而且大量固定组合拆开之后单词序列与原词意相差甚远,如成语、网络词语等。因此中文NLP任务需要先分词再进行相应的处理。
因此分词的好坏就严重影响了后续的任务,如果前面分词错误,如基于分词的NER(命名实体识别),识别的正确率就会严重受影响。
而分词最好的水准依然达不到完美的效果,更别说大量工程任务对分词的性能要求较高,如果建BERT之类的重模型,后续的任务可能根本就没时间完成了。这样就更加限制了分词的准确率。
近年来预训练词向量的流行,也让中文分词出现了新的“尴尬”。
一个就是OOV,其会出现训练词表之外的词。
因为是预训练,使用稠密的低维度向量代替原来高维度的one-hot向量,那么词的向量必然是预先指定的。既然要预先指定,词表长度也必然是预先指定的,如1万个词或10万个词,这与训练算力及GPU显存直接相关,如果设得太大,超过显存容量,那么根本训练不过来,即使算力无限,也要设定一个上限。
具体词表设为哪些词,一般都是基于预料进行词频统计,然后基于词频排序,最后取排序最高频的词。但无论词表设定得多大,都可能会在进行预测时遇到词表之外的词,也就是OOV问题。现在有很多解决此类问题的方法,如对于英文,可以使用字符向量拼接出词向量,还可以使用指针网络(Pointer Network)直接输入的词而不是词表的词(Pointer Generator Network的原理也类似)。这些方法只能起缓解作用,并不能完美解决OOV问题。OOV问题对于英文来说是个天然的问题,而对于中文则不一定,因为中文如果不分词,直接使用字向量,那么常用和不常用的汉字只有1万个左右。这也是为什么大名鼎鼎的BERT中文版只使用了字向量。
此外,即使没有OOV问题,词频过低的词,使用大规模预料进行预训练也会因为训练不充分而带来后续问题。
Zipf’s定律在中文词频里也适用,其实就是类似“2-8”定律,或者说指数分布,高频词的频率可能非常高,如‘是’‘的’‘我’,而所有词中高频的词可能只有20%,剩下的几十万个词只能被划分到“2-8”定律的8那边。
以语料库Chinese Treebank dataset(CTB)为例,用jieba分词,语料库总共有60万个词,去重后有5万个词,其中,2.4万个词只出现过一次,3.8万个词的出现次数在4次以下。
增加语料,增加最多的依然是那些高频词,即属于8那边的词,真正属于长尾的那些词是非常少的。
而中文如果不分词,字的总数就低很多了,即使字频也有“2-8”定律,但因为总字数降低,字频比词频高很多,频率过低而导致的训练不充分问题就会缓解很多。正因为如此,自BERT证明字向量同样可以带来很好的NLP任务性能后,引出了本节的问题——BERT之后,中文分词还有意义吗?
X Li、Y Meng、Q Han等人发表的论文Is Word Segmentation Necessary for Deep Learning of Chinese Representations?针对此问题做了小范围的实验对比。
之所以说是小范围,是因为他们只使用了几个不大的数据集、几种简单的模型和四种NLP任务(语言模型、翻译、文本分类和语义匹配)。下面来看一下具体的情形。
语料为CTB6(Chinese Tree-Bank 6.0),jieba分词,训练方式为标准的语言模型,前面的词预测后面一个词,网络为LSTM,如图1.28所示。
在图1.28中,model表示字、词的不同组合情况,dimension表示字词的向量维度,PPL表示最终的困惑度得分,word表示分词后以词为单位输入LSTM,char表示以字为单位输入LSTM。
有趣的是,不管对比分词与否,都加入了混合模型(hybrid)的对比。不过这个混合模型是以词为基础的,就是每个词向量后面跟上词内的字符向量(英文)和字向量(中文)。
图1.28 语言模型对比
评价指标是PPL困惑度,就是通过前面的上下文预测后面的字的确信度,例如,你看到“开天辟”,就能预测后面一个字是‘地’,那么PPL就是1。如果完全不确定后面是哪个字,也就是词表里每个字都有可能,那么这个值就会很大(注意,这里只是PPL的理解方式之一)。
可以看到,字模型比词模型的效果好很多,在增加了词的混合模型后效果反而下降了。将分词工具更换为Stanford CWS package或LTP package,效果也类似。
机器翻译的训练语料是基于LDC扩展的125万对中英文句子。中文翻译为英文的结果如图1.29所示。
图1.29 中文翻译为英文的结果
Mixed Rnn、Bi-Tree-LSTM和PKI的数据是从原论文里直接复制的,并没有重新进行实验。
评估指标使用的是BLUE,其表示预测的翻译语句与目标语句的相同词的比率。相同词的数量越多则占比越高,分值也就越高。
英文翻译为中文的结果如图1.30所示。
图1.30 英文翻译为中文的结果
这里有个有趣的现象,就是虽然在中文翻译为英文和英文翻译为中文中,字模型都比词模型效果好,但英文翻译为中文的字模型的效果提升达2.67,而中文翻译为英文的模型效果只提升了0.83。两者相差还是比较大的。
两者的差别只存在于中文,英文只有词,没有字。
中文翻译为英文的字词影响的是编码阶段,而英文翻译为中文的字词影响的是解码阶段。
推测原因是数据稀疏和OOV问题在编码阶段只影响潜在语义的表达,除非一些核心实体词出现OOV,否则对整体语义的影响不大。而数据稀疏和OOV问题在解码阶段不仅影响后续预测的语义表达,而且直接影响核心词的预测,所以英文翻译为中文的影响更大。
这里使用了两个语料库:BQ和LCQMC。BQ包含12万对中文句子,如图1.31所示。
图1.31 语义相似度结果
文本分类的测试集和验证集结果如图1.32所示。
图1.32 文本分类的测试集和验证集结果
其中,ChinaNews包含7个类别,Ifeng包含5个类别,jd_binary是京东评论的正反情绪分类,jd_full是京东评论的评分1~5的分类,dianping是评论的评分。
词频与词表的准确关系如图1.33所示。
图1.33 词频与词表的准确关系
图1.33(a)展示了词频阈值与词表大小的关系,图1.33(b)展示了提高词频阈值与准确率的关系,图1.34为去掉OOV样本后的结果。
实验结果充分表明,在中文NLP任务中,字模型已经全方位超过了词模型。我们分析一下原因。
图1.34 在训练集中去掉OOV样本后的结果
关于数据稀疏,前面已经分析过其逻辑,这里通过实验进行佐证。对于字库而言,如果提升字频阈值,则字库大小会降低,不过相对词库而言则平滑得多。随着词频阈值的提升,词库大小降低很快,表明词库的长尾效应比字库更严重。
而图1.33(b)则证明,在提升了词频阈值也就是降低数据稀疏性之后,词模型的效果会缓慢提升,而字模型基本没有太大变化。
由此说明分词的长尾特性导致大量的词向量训练不充分,从而影响了分词模型的最终表现。
OOV其实是数据稀疏性问题的延续。因为长尾词的稀疏性,所以设定了一个词表大小,词表内的末尾词就会受困于数据稀疏性,而词表外被划掉的词以及语料库里没出现而现实中存在的词则是OOV。
通过去掉数据集里那些在词表之外的OOV词,可以让字模型与词模型的对比更公平一些,如图1.14所示。提升词频阈值从而降低词表大小,随之去掉包含OOV的样本。实验显示,词模型的效果同样会快速提升。
至于随着词频阈值的进一步提升,导致字词模型效果降低问题,显然是去掉的数据集样本太多,从而造成整体训练不充分。
过拟合其实跟数据稀疏的逻辑是一样的。因为数据稀疏,所以训练样本不足,导致局部参数过拟合。就像你用2个样本去训练一个全连接神经网络分类器一样,无论怎么加正则必然会过拟合。
X Li、Y Meng、Q Han等人在论文中提的问题很好,因为自从有了BERT及BERT的改进模型之后,很多开发NLP的人都会问这个问题:以后还有必要花心思去研究分词吗?
虽然他们提出的问题很好,但是实验和论证就有些随意了,原因如下:
现在自BERT开始,任何一个NLP任务都不可能用几百兆甚至几十兆的数据进行训练,除非基于BERT之类的预训练模型进行精调。
因为实验要保持字模型与词模型的统一,不可能字模型使用一种pre-train字向量,而词模型又使用另外一种词向量,所以必然是基于全新的字词向量进行训练。而现阶段的字词表达预训练动辄是几十或几百TB甚至上千TB的数据量。如果只使用小于1GB的数据量训练则是不可能训练充分的。但全新训练也可以先使用更大的语料库进行字词向量的预训练,之后根据具体任务进行微调,而不是直接根据任务进行训练。这样就可以在一定程度上避免在具体任务中词模型的数据稀疏问题。
Yue Zhang和Jie Yang发表的Chinese NER using Lattice LSTM论文提出了一个叫Lattice LSTM的模型(见图1.35),用于混合字词信息。虽然其任务是进行命名实体识别(NER)的,但是该模型也能充分说明问题。
图1.35 Lattice LSTM模型演示
Lattice LSTM在中文NER任务中算是一个经典模型,关于该模型的介绍将放在第3章中。这里只是用来说明字词混合也属于一种模型先验的设计,不能随意拼接一下就代表最终的结果。Lattice LSTM在OntoNotes数据集上的结果如图1.36所示。
图1.36 Lattice LSTM在OntoNotes数据集上的结果
Lattice LSTM在MSRA数据集上的结果如图1.37所示。
图1.37 Lattice LSTM在MSRA数据集上的结果
通过Lattice LSTM的实验结果(见图1.36和图1.37)可以看出,如果模型先验设计合理,那么字词混合是可以提升模型整体效果的。同时,通过图1.37也证明,字模型在NER任务上确实比词模型的效果好。
综上所述,分词后的词模型确实会由于数据的稀疏导致过拟合和OOV。虽然不分词的字模型的字频分布也是一个指数分布,也遵循“2-8”定律,但是由于总字数远远少于词数,所以出现的问题会小得多。
总字数和词数的差距可以通过增大训练语料来缓解。如果标签语料因为成本过高而无法大量增加,那么可以使用无标签的语料进行无监督预训练,从而提升整体效果。
即使使用大规模语料进行预训练,最终词模型的效果也只是接近字模型,很少会超过,即使超过,也都是非常微小的差距。但这并不意味着分词失去了价值。
分词本身其实还是一个非常强且非常有价值的先验,一个语言结构本身的先验。
这跟句法分析也是类似的,近年因为深度学习的热门,以往热门的句法分析也面临与分词同样的疑问,就是句法分析还有意义吗?
同样的,如果网络设计不够合理,那么句法分析跟分词一样,不如直接使用字模型,让模型去学习其中潜在的词句结构,最终的效果反而更好。但这个逻辑与RNN和CNN全方位优于DNN的逻辑是相通的。RNN和CNN的模型设计本质上就是对问题的先验的良好模型化。
为什么DNN效果会不好呢?DNN可以说是万能模型,只要层数足够多,每层的单元数足够大,无论任何一种多么复杂的函数,都可以拟合好。
问题在于越是万能的、拟合能力越强的模型,就越容易过拟合。这就是为什么既使用强力模型,又要设计各种正则去限制模型边界的原因。而拟合能力越强的模型就越需要更多的训练样本,虽然现在是大数据时代,但是想要把一个通用的万能模型训练充分,也是非常困难的。因此模型设计不是能力越强越好,而是让模型去匹配真实的数据分布,这个匹配真实的数据分布的动作就是先验,也就是一种假设。例如直线上的一串样本,如果要一个DNN去拟合,那么肯定不会拟合为一条直线。而数据分布是直线,拟合的却不是直线,那么泛化效果必然很差。相反,如果做一个先验(假设),这是一条直线,用一个非常简单的模型 wx + b (线性回归)去拟合这一串样本,那么泛化效果必然是很好的。这就是先验的价值。RNN与CNN都是针对NLP和图像的一个非常强也非常有效的先验。
至此,读者可能就明白了为什么笔者认为分词依然非常有价值。
Lattice LSTM的提出也充分证明了笔者的观点,如果模型设计得好,也就是先验定得好,那么分词的词信息可以帮助字模型进一步提升模型的整体效果。而且笔者认为可能这并不是字词模型配合的最佳效果,因为Lattice LSTM的字词混合方式依然只是类似超参数的人为设定,没有在潜在的高维空间中搜索。
字模型的节点平均比词模型多一倍,这样网络计算量自然是词模型的一倍以上。计算性能在实验室里经常是被半忽略的,但在真实工程中却是关键的限制要素。
如果是大公司,拥有比较充分的训练语料,在字词模型的效果比较接近的情况下,那么选择词模型减少计算量就是自然的选择。
很多场景都不需要做嵌入、走模型,这时还是分词效率更高。例如,搜索场景的相关性召回,无论是知识图谱搜索,还是elastic search的相似语义搜索,如果不分词,那么索引表就会大大增加,搜索的效率也会提升。