简单有效的多标准中文分词-码农场

标签: | 发表时间:2018-01-07 17:59 | 作者:
出处:http://www.hankcs.com

本文介绍一种简洁优雅的多标准中文分词方案,可联合多个不同标准的语料库训练单个模型,同时输出多标准的分词结果。通过不同语料库之间的迁移学习提升模型的性能,在 10个语料库上的联合试验结果优于绝大部分单独训练的模型。模型参数和超参数全部共享,复杂度不随语料库种类增长。论文: https://arxiv.org/abs/1712.02856 ;代码和语料: https://github.com/hankcs/multi-criteria-cws 。

自然语言处理,特别是中文处理中,语料库往往珍稀且珍贵。具体到中文分词,也是如此。为了做出一个实用的系统,不光需要高效的算法,大规模语料库也必不可少。然而对于缺乏经费的研究团队和个人,却往往只能得到 sighan2005等屈指可数的几个小型语料库。即便如此,这些语料库的标注规范还互不兼容,无法混合起来训练:

different-segmentation-criteria

比如 PKU的最大特点就是姓名拆分为“姓”+“名”, MSR的标志则是命名实体构成大量长单词,而港台地区的语言习惯本来就与大陆不同。这些差异导致无法简单合并各方语料形成一个更大量级的语料库,只能在某一个语料库上训练,浪费了其他标注数据。

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

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

previous-translation

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

对$n$种语言来讲,就需要$n\times (n-1)$对encoder-decoder。这样的系统臃肿不堪,过度复杂,也无法应对Zero-Shot Translation问题(缺乏某两个语言之间的平行语料)。

谷歌的解决方案说来简单,却不失优雅。聪明之处在于不修改网络架构,而是在输入数据上做手脚。只需在输入平行语料pair中人工加入目标语种的标识符,就可以把所有语种的平行语料混合在一起训练了:

google-nmt

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

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

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

token

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

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

代码

连同语料库一起开源在GitHub上: https://github.com/hankcs/multi-criteria-cws 。

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

更多细节,请参考 论文

结果

我们在标准的 sighan2005sighan2008上做了实验,在没有针对性调参的情况下依然取得了更高的成绩(当时设备条件简陋,所以在所有数据集上都用了同一套超参数)。所有分值都通过了官方评测脚本的验算。

sighan2005

下图的 baseline是在各个语料库上单独训练的结果, +multi是联合训练的结果。

sighan2005

sighan2008

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

sighan2008

值得一提的是,我们并没有针对 sighan2005sighan2008分别调参,而是放弃调参、在所有数据集上沿用了 PKU的超参数。这是由于我们简陋的设备条件限制;欢迎计算力充裕的朋友自行调参,或许能有更好的结果。

10in1

由于 sighan2008语料库是收费的,难以获取,没有授权的情况下也无法二次发布。同时我们不希望收费语料库成为阻碍小团队与个人研究者的壁垒,所以我们在$10$个公开的语料库上做了额外的试验。

这$10$个语料库分别是来自 sighan2005的$4$份语料库以及

  1. Universal Dependencies Project的UDC ( Universal Dependencies Treebank Chinese)

  2. 由 Stanford CoreNLP 公开的 CTB6 ( Chinese Tree Bank 6)

  3. 由山西大学发布的 SXU

  4. 由国家语委公布的 CNC语料库

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

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

语料库的授权信息如下(如有错误,欢迎反馈):

licence

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

10in1

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

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

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

除非依赖类库版本变迁,否则应该能够保证复现我们的结果。

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

vectors.png

它们似乎起的作用都不相同。

结论

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

这是我的第一篇NLP论文,肯定有不少错误,欢迎指出。任何语法、拼写、行文上的错误和建议,欢迎留言,我会及时更正。谢谢!

鸣谢

  • 感谢在试验器材不足时伸出援手的朋友们,以及对论文和试验施以援手的同学!

  • 感谢那些慷慨地公开了标注语料库的老师与研究者们,这对没有研究经费的小团队而言无疑是雪中送炭!

  • Bi-LSTM-CRF模型的实现参考了 rguthrie3的Dynet1.x版本。

References


  1. X. Chen, Z. Shi, X. Qiu, and X. Huang, “Adversarial Multi-Criteria Learning for Chinese Word Segmentation.,” vol. 1704, p. arXiv:1704.07556, 2017. 

  2. William Yang Wang, Lingpeng Kong, Kathryn Mazaitis, and William W Cohen. 2014. Dependency Parsing for Weibo - An Efficient Probabilistic Logic Programming Approach. EMNLP . 

  3. Meishan Zhang, Yue Zhang, Wanxiang Che, and Ting Liu. 2014. Type-Supervised Domain Adaptation for Joint Segmentation and POS-Tagging. EACL . 

知识共享许可协议  知识共享署名-非商业性使用-相同方式共享码农场» 简单有效的多标准中文分词

相关 [有效的 标准 中文分词] 推荐:

简单有效的多标准中文分词-码农场

- -
本文介绍一种简洁优雅的多标准中文分词方案,可联合多个不同标准的语料库训练单个模型,同时输出多标准的分词结果. 通过不同语料库之间的迁移学习提升模型的性能,在. 10个语料库上的联合试验结果优于绝大部分单独训练的模型. 模型参数和超参数全部共享,复杂度不随语料库种类增长. https://arxiv.org/abs/1712.02856 ;代码和语料:.

Jcseg java中文分词器

- - 企业架构 - ITeye博客
Jcseg[dʒɛ'​ke'sɛ]完整版本(源码, 词库, 帮助文档, 词库管理工具, jar文件)下载:  http://sourceforge.net/projects/jcseg . jcseg是使用Java开发的一个开源中文分词器,使用流行的mmseg算法实现,并且提供了最高版本的lucene, solr, elasticsearch(New)的分词接口..

细说中文分词

- - 标点符
完整的中文自然语言处理过程一般包括以下五种中文处理核心技术:分词、词性标注、命名实体识别、依存句法分析、语义分析. 其中,分词是中文自然语言处理的基础, 搜素引擎、文本挖掘、机器翻译、关键词提取、 自动摘要生成等等技术都会用到中文分词,包括最近在学习的 聊天机器人、 文本相似性等. 可以说分词是自然语言大厦的地基,下面就让我们从它开始谈起.

最有效的外部链接标准:SEO外链专员操作规范

- - 网站运营优化
  SEO外链专员在国外是一份高薪且极为重要的职务,在中国则是属于比较底层的职位,薪资范围大概在2000-3000元/月,对学历几乎没有什么要求,普通高中毕业的学生经过简单培训,就能上岗,甚至完全不要求有工作经验. 应聘这个职位的SEOer(其实根本算不得是SEO),只要了解一些主流搜索引擎的简单收录规律,能够编辑一些简单的文章,会使用 site link domain 这样的一些指令,就算是其中的“尖端人才”了.

漫话中文分词算法

- dumin - Matrix67: My Blog
    记得第一次了解中文分词算法是在 Google 黑板报 上看到的,当初看到那个算法时我彻底被震撼住了,想不到一个看似不可能完成的任务竟然有如此神奇巧妙的算法. 最近在詹卫东老师的《中文信息处理导论》课上再次学到中文分词算法,才知道这并不是中文分词算法研究的全部,前前后后还有很多故事可讲. 在没有建立统计语言模型时,人们还在语言学的角度对自动分词进行研究,期间诞生了很多有意思的理论.

中文分词算法代码大全

- - 鲁塔弗的博客
做中文搜索,关键词提取,文档分类都离不开中文分词,能用的代码包有如下. 单字切分 sphinx只要把min_word_len设置为1,并配置charset_table,默认就是单字切分,lucene用StandardAnalyzer. CJKAnalyzer lucene自带,两两分词,就是把 ABCD 分成 AB,BC,CD 3段.

再说中文分词技术

- - 标点符
众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思. 例如,英文句子I am a student,用中文则为:“我是一个学生”. 计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词.

ElasticSearch中文分词ik安装

- - ITeye博客
下载编译好的安装包,解压缩就可以直接使用. 自己编译的版本在安装插件时可能会出现一些问题. 上面这一步很简单,没有出现任何问题就通过了,然而在安装ik时走了很多弯路,为防止今后出现类似情况将此次安装过程中出现的问题记录下来. 从elasticsearch-rtf中下载的elasticsearch-analysis-ik-1.2.6.jar直接拷贝到.

java中文分词组件-word分词

- - 研发管理 - ITeye博客
关键字:java中文分词组件-word分词. word分词器主页 :https://github.com/ysc/word. word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义. 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词.

中文分词之9577组同义词

- - 杨尚川的个人页面
这9577组同义词出自 Java分布式中文分词组件 - word分词,这里列出50组同义词,更多同义词请看 这里.