`

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

 
阅读更多

 

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

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

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

 

 

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

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

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

 

 

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

 

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

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

 

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

 

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

受谷歌的多语种翻译系统启发,我们发现只需在句子首尾添加一对标识符,即可平滑无缝地将多标准语料库混合起来训练。具体做法是用一对闭合的<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份语料库以及

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)。

 

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

 

 

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

 

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

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

 

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

 

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

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

 

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

 

结论

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

 

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

 

  • 大小: 119.6 KB
  • 大小: 120.2 KB
  • 大小: 107.7 KB
分享到:
评论

相关推荐

    java分词程序,可分英文

    这种方法简单有效,但对于复杂的自然语言处理任务来说可能不够完善。 - **关键词提取**:`FiledIndexWord`方法中,利用了`HashSet`的数据结构特性来保证关键词的唯一性,并通过限制单词长度来筛选出合适的标引词。 ...

    elasticsearch-analysis-ik-5.6.1 分词组件

    Elasticsearch默认提供了一些基本的分词器,如标准分词器(standard analyzer)和简单分词器(simple analyzer)。然而,对于中文这样的复杂语言,这些默认分词器往往无法满足需求,因此需要使用专门针对中文的分词...

    搜索引擎关键技术---分词

    - **从单一到多元**:分词系统不再局限于简单的二元标注(如B/I),而是尝试更多元化的标注方案(如6词位标注),以适应不同应用场景的需求。 - **从闭源到开源**:越来越多的研究成果开始共享数据集和代码,促进了...

    elasticsearch-analysis-pinyin-7.17.0.zip

    《Elasticsearch拼音分词器详解》 在大数据和搜索引擎领域,Elasticsearch因其高效、灵活的全文检索功能而备受青睐。为了更好地适应中文搜索的需求,Elasticsearch提供了丰富的插件支持,其中“elasticsearch-...

    自然语言处理及应用基础知识

    #### jieba分词详解 ##### 安装jieba分词库 通过Python的包管理器pip进行安装: ```bash pip install jieba ``` ##### jieba分词库的主要功能 - **jieba.cut**:该函数用于进行分词操作,接受三个参数:待分词的...

    fenci.rar_语料_语料库

    《语料库与分词技术详解》 在自然语言处理(NLP)领域,语料库扮演着至关重要的角色。语料库,简单来说,就是大量经过预处理的真实语言数据集合,可以是文本、对话、新闻、社交媒体内容等。它们为机器学习模型提供...

    elasticsearch-analysis-ik-7.2.0

    总结,"elasticsearch-analysis-ik-7.2.0"是Elasticsearch处理中文文本的得力助手,通过合理的配置和使用,能有效提升中文搜索的性能和精确度。无论是初学者还是经验丰富的开发者,都应该掌握这个插件的使用,以充分...

    pinyin4j-2.5

    《pinyin4j:汉字转拼音的Java库详解》 在信息技术领域,处理中文字符时,将汉字转换为拼音是一项常见的需求。pinyin4j是一个专门为Java开发的开源库,专注于实现这一功能,使得开发者能够方便地在程序中进行汉字到...

    Python英文文本分词(无空格)模块wordninja的使用实例

    ### Python英文文本分词(无空格)模块wordninja的使用详解 #### 一、引言 在自然语言处理(Natural Language Processing, NLP)领域中,文本预处理是进行任何高级分析前的重要步骤之一。对于中文文本来说,由于词汇...

    干货合集│最好用的 python 库都在这.doc

    通过内置的中文词库,jieba能够根据汉字之间的关联概率来确定最佳的分词结果。例如,可以使用`jieba.cut()`或`jieba.lcut()`方法对中文字符串进行分词。 **词云库 - wordcloud** wordcloud库用于生成词云图,它是...

    elasticsearch

    Elasticsearch内置了多种分词器,如标准分词器(Standard Analyzer)、简单分词器(Simple Analyzer)和英文分词器(English Analyzer)。此外,用户还可以自定义分词器,以满足特定语言或业务需求,例如中文分词器...

    lucene 2.3

    通过集成IK分词器或HanLP等开源中文分词库,Lucene能够有效地处理中文文档,实现了对中文关键词的精确匹配和模糊搜索。此外,它还支持中文拼音和繁体字的搜索,极大地扩展了其在中国市场的应用范围。 三、索引构建 ...

    solr学习入门教程

    ### Solr学习入门教程知识点详解 #### 一、Solr概览 Solr是一个开源的企业级搜索服务器,采用Java作为底层开发语言,具备高度的可扩展性和灵活性。它通过标准的HTTP协议和XML格式进行通信,这意味着即使不精通Java...

    详解Python如何生成词云的方法

    简单来说,生成词云的步骤可以概括为:准备文本数据、对文本进行分词处理、生成词频统计、利用词频数据创建词云图像。 在生成词云之前,我们需要注意中文字符显示的问题。由于中文字符并不在标准ASCII字符集中,...

    Lucene in action中文版

    《Lucene in Action》是一本深受开发者欢迎的书籍,中文版的出现让更多中国读者得以深入理解这个强大的全文搜索引擎库——Lucene。这本书是Lucene学习者的绝佳教程,它详细介绍了如何利用Lucene进行信息检索、文本...

    NLP自然语言处理

    ### NLP自然语言处理知识点详解 #### NLTK与自然语言处理基础 自然语言处理(Natural Language Processing, NLP)是一门计算机科学领域的分支学科,它致力于实现人与计算机之间的有效交流,通过算法让计算机理解、...

    一个专业搜索公司关于lucene+solar资料(1)

    - 本章详细介绍了自然语言处理技术在搜索引擎中的应用,包括中文分词、关键词提取、自动摘要等多个方面。 #### 六、索引库创建与管理 **6.1 设计索引库结构** - **6.1.1 理解Lucene的索引库结构** - Lucene索引...

    Keras中文文档

    ### Keras中文文档知识点概述 #### 一、Keras简介 Keras是一个开源的神经网络库,用Python语言编写,并且能够作为TensorFlow、Microsoft Cognitive Toolkit (CNTK) 或 Theano 的高级接口来运行。它旨在使用户能够...

Global site tag (gtag.js) - Google Analytics