简单有效的多标准中文分词详解

 

本文介绍一种简洁优雅的多标准中文分词方案,可联合多个不一样标准的语料库训练单个模型,同时输出多标准的分词结果。经过不一样语料库之间的迁移学习提高模型的性能,在10个语料库上的联合试验结果优于绝大部分单独训练的模型。模型参数和超参数所有共享,复杂度不随语料库种类增加。python

(相关内容已经集成到大快的hanlp中,代码和语料可访问github上的hanlp开源项目主页查询)git

天然语言处理,特别是中文处理中,语料库每每珍稀且珍贵。具体到中文分词,也是如此。为了作出一个实用的系统,不光须要高效的算法,大规模语料库也必不可少。然而对于缺少经费的研究团队和我的,却每每只能获得sighan2005等屈指可数的几个小型语料库。即使如此,这些语料库的标注规范还互不兼容,没法混合起来训练(咱们试验验证了这一点):github

 

好比PKU的最大特色就是姓名拆分为“姓”+“名”,MSR的标志则是命名实体构成大量长单词,而港台地区的语言习惯原本就与大陆不一样。这些差别致使没法简单合并各方语料造成一个更大量级的语料库,只能在某一个语料库上训练,浪费了其余标注数据。算法

已经有工做开始研究如何利用多方语料库来联合学习中文分词,好比 Chen 20171精心设计的对抗神经网络,针对每一个语料库提取分词标准相关或无关的特征。然而该工做并无达到前沿的准确率,甚至联合训练的成绩还比不上之前单独训练的分数,没法体现联合学习的本意与优点。网络

事实上,这些标注风格迥异的分词语料像极了机器翻译中的多国语言:表达相似的意思,却采用了不一样的方式。之前的多语种互译系统也是须要针对每一个语种pair设计一对encoder-decoder:架构

 

图片转自斯坦福大学CS224n讲义性能

 

对nn种语言来说,就须要n×(n−1)n×(n−1)对encoder-decoder。相似地,针对每一个分词语料库设计网络层的话,对nn种分词标准,就须要nn个私有层。这样的系统臃肿不堪,过分复杂,也没法应对Zero-Shot Translation问题(缺少某两个语言之间的平行语料)。学习

谷歌的解决方案说来简单,却不失优雅。聪明之处在于不修改网络架构,而是在输入数据上作文章。只需在输入平行语料pair中人工加入目标语种的标识符,就能够把全部语种的平行语料混合在一块儿训练了:测试

图片转自斯坦福大学CS224n讲义spa

 

这的确是长期跟工业生产线打交道的人才能想出来的实用方法。

受谷歌的多语种翻译系统启发,咱们发现只需在句子首尾添加一对标识符,便可平滑无缝地将多标准语料库混合起来训练。具体作法是用一对闭合的<dataset> </dataset>将每一个句子包裹起来:

 

接下来就能够经过你们熟悉的Bi-LSTM-CRF等序列标注模型联合训练了。在具体联合训练中,将这两我的工标识符视做普通字符便可,也没必要人工区分句子的来源。这两我的工标识符会提示RNN这个句子属于哪一种分词标准,使其为每一个字符生成的contexual representation都受到该分词标准的影响。

在测试的时候,这两我的工标识符起到指定所需分词标准的做用。固然,公平起见标识符并不计入准确率的计算。

 

代码

连同语料库一块儿开源在GitHub上,可访问hanlp开源项目查看

调用脚本只需一两句话,请参考GitHub上的说明。

结果

咱们在标准的sighan2005和sighan2008上作了实验,在没有针对性调参的状况下依然取得了更高的成绩(当时设备条件简陋,因此在全部数据集上都用了同一套超参数)。全部分值都经过了官方评测脚本的验算。

sighan2005

下图的baseline是在各个语料库上单独训练的结果,+naive是合并语料却不加标识符的结果,+multi是咱们提出的联合训练方案的结果。

咱们使用的特征是极小的,仅仅是字符和bigram。若是像最近流行的作法那样加入12个ngram、词典特征(word embedding),可能还会有进一步提高。但咱们的论文中心是一个简单的多标准分词方案,主打精简高效,并不是追求高分赛过效率,因此没有采用这些特征工程的手段。

sighan2008

咱们也在标准的sighan2008上作了相同的试验,结果是:

 

值得一提的是,咱们并无针对sighan2005和sighan2008分别调参,而是放弃调参、在全部数据集上沿用了PKU的超参数。这是因为咱们简陋的设备条件限制;欢迎计算力充裕的朋友自行调参,或许能有更好的结果。

10in1

因为sighan2008语料库是收费的,难以获取,没有受权的状况下也没法二次发布。同时咱们不但愿收费语料库成为阻碍小团队与我的研究者的壁垒,因此咱们在1010个公开的语料库上作了额外的试验。

 

这1010个语料库分别是来自sighan2005的44份语料库以及

一、Universal Dependencies Project的UDC (Universal Dependencies Treebank Chinese)

二、由 Stanford CoreNLP 公开的 CTB6 (Chinese Tree Bank 6)

三、由山西大学发布的 SXU

四、由国家语委公布的 CNC 语料库

五、由王威廉老师公开的微博树库 WTB (Wang et al. 2014 2)

六、由张梅山老师公开的诛仙语料库 ZX (Zhang et al. 2014 3)。

 

语料库的受权信息以下(若有错误,欢迎反馈):

 

虽然部分语料库不常见于文献,但它们所属领域不一样(新闻、微博、小说、港台)、数据规模迥异,刚好能够用来检验多标准分词模型的泛用性。咱们的测试结果是:

(备注:此处与 Chen 2017 没法构成直接比较)

因为RNN训练很慢,为了方便复现结果,咱们提供包含随机数在内的命令行:

 

1./script/train.sh joint-10in1 --dynet-seed 10364 --python-seed 840868838938890892

 

除非依赖类库版本变迁,不然应该可以保证复现咱们的结果。

咱们还考察了这些人工标识符所起的做用,将它们的embedding经过t-SNE可视化出来后,发现几乎没有显著的类似性:

它们彷佛起的做用都不相同。

 

结论

这是一种简单的多标注中文分词解决方案,能够在不增长模型复杂度的状况下联合多个语料库训练单个模型。该方案虽然简单,但的确带来了显著的性能提高(特别是对于小数据集如WTB)。同时咱们也注意到特别大的数据集受益很小或没法从中受益(MSR),留做将来研究。咱们但愿该方法成为多标准中文分词的一个baseline,或生产系统中的一个物美价廉的拓展。

 

做者:hankcs 大快搜索高级研究员

相关文章
相关标签/搜索