面向中文命名实体识别任务的数据增强

2022-05-05 13:55张克亮夏榕璟任静静
计算机与现代化 2022年4期
关键词:实体样本文本

李 健,张克亮,唐 亮,夏榕璟,任静静

(战略支援部队信息工程大学,河南 洛阳 471003)

0 引 言

相对于基于规则的方法,机器学习不需要显式编程,而是针对任务建立学习模型,并根据训练样本不断调整参数以提高模型的预测能力[1]。传统的机器学习算法需要将样本特征作为输入,特征工程就成为不可或缺的关键步骤。深度学习模型可以将原始数据直接作为输入,实现有效特征的自动提取,极大地缓解了自来特征工程的压力[2]。

自然语言处理(NLP)是人工智能重要的分支,被称为人工智能皇冠上的明珠。以Word2Vec[3]为代表的词向量技术,将原本稀疏的高维向量转化为稠密的低维向量,有效解决了文本数据的向量表示问题。以BERT[4]为代表的预训练(Pre-training)语言模型,不仅能够为词语提供精确的向量表示,而且能够利用上下文信息预测当前词。

随着深度学习的不断发展,更多、更复杂的NLP任务被提出,其中很多属于低资源任务,尤其是面向小语种、专业领域相关的任务。这些任务的特点是专业性较强、标注语料较少、标注质量不高。基于机器学习的人工智能常被戏称为“有多少人工,就有多少智能”,这说明机器学习十分依赖人工标注的样本。相对于图像标注,文本标注的门槛更高、难度加大、耗时更多——标注者不仅要熟悉某种语言,还要准确理解每条文本的语义。

在一些任务中,现有数据不足以训练一个理想的机器学习模型,因此需要通过数据增强(Data Augmentation)技术,增加有效的训练数据,以提高模型的精确度和鲁棒性。本文将简要介绍文本数据增强的相关工作,并针对中文命名实体识别(Named Entity Recognition, NER)任务提出一组基于实例替换的数据增强方法。其中“实体之间交叉互换”可用于所有类型实体增强,“实体内部同义替换”主要用于组合型实体(如地名、机构等)增强,并根据中文人名特点设计一套“人名自动生成器”用于人名实体增强。为验证上述方法的有效性,将在2个不同难度的数据集上进行测试。

1 相关工作

Coulombe[5]认为数据增强是一种“语义不变的转换”,可将其看作“数据放大”(从已有数据产生新的数据)。数据增强也可看作一种正则化的技术,以避免模型过拟合[6]。

数据增强的结果又被称为扩展数据、合成数据或人工数据[7]。数据增强的定义还可以再扩大一些:数据增强是以提高训练效果为目标,对已有训练数据进行二次加工的过程。数据增强主要包含2方面内容:1)增加有效训练数据(数据扩充);2)剔除无效训练数据(数据提纯)。

数据增强在图像和语音领域已经得到广泛应用。常见的图像增强方法包括:等距变换(如反转、旋转)、相似变换(如放缩、扭曲)、RGB通道变换、添加随机噪声等[8]。在语音方面,可通过快放、慢放、噪声注入、声谱修改等方法进行数据增强[9]。

相比之下,文本数据增强方面并没有很多流行的技术,唯一得到广泛应用的方法是基于词表的同义词替换[10]。Liu等[11]认为,由于文本数据的符号性、离散性、组合性和稀疏性,使得文本数据增强比较困难。通用的文本数据增强方法主要包括:词汇替换、句式转换、噪声注入等。

1.1 基于词汇替换的数据增强

词汇替换方法可以基于人工词典、词向量、掩码语言模型等[12-14]。基于人工词典(如WordNet、HowNet等)的替换可靠性高、简单易行,其局限性在于:一是词汇量有限,二是需要区分一词多义。

基于词向量(如Word2Vec)的替换能够方便地获取大规模词向量表示,但是计算出的近义词往往不能直接用于替换,比如“红楼梦”除了与“三国演义”很相似,也可能与“曹雪芹”很相似,替换时还需要进一步筛选。

基于掩码语言模型(如BERT)的替换能使句子保持通顺,但并不能保证语义的相似性[15],比如“我很喜欢这部电影”,如果把“喜欢”掩蔽掉,也可能预测出“我很讨厌这部电影”。

由于TF-IDF值较低的词没有太多信息量,Xie等[16]认为对这类词的替换不会改变语义,并将其作为一种数据增强方法。替换TF-IDF值较低的词对训练样本的扩展作用并不大,因为这些词往往不具备区分标签的能力,但可以作为一种辅助方法使训练数据更加平滑。

1.2 基于句式转换的数据增强

句式转换方法可以基于句法树、回译、样本交叉、文本表层特征等[5,17-18]。基于句法树的转换通过句法分析器将一种句式转化为另一种句式,比如将“主动句”改为“被动句”、将“被字句”改为“把字句”等,使用这种方法需要定义转换规则库。

回译是指把A语言的句子翻译为B语言,再翻译回A语言作为原句的扩展。可以选择不同的B语言以获得多种扩展样式,但这种方法需要借助机器翻译引擎。

样本交叉是指通过对原有样本进行拆分、组合,以生成新的样本。比如在情感分析中,句子A可分为2个子句A1和A2,句子B也可分为2个子句B1和B2,若A和B都表达负面情感,那么扩展的句子C=A1+B2也是负面的。

基于文本表层特征的转换也可以看作基于模式匹配的替换,例如:将“She is”转换为“She’s”,这种方法需要定义一组模式匹配规则(可利用正则表达式实现)。

1.3 基于随机噪声的数据增强

文本随机噪声包括:基于键盘的拼写错误、随机删除单词、随机插入单词、随机替换单词、句子混排等[19-21]。其中,拼写错误属于单词级噪声,对单词的“增、删、改”属于句子级噪声,对句子的乱序排列则属于篇章级噪声。

随机噪声与语言密切相关,上述方法主要针对英文。相比之下,中文噪声应当主要考虑同音字、近形字、易混词、词内用字颠倒等常见错误。随机噪声并不能无条件地用于所有的NLP任务,比如在情感分析的任务中,如果否定词被随机删除,标签就会发生改变。

1.4 面向中文文本的数据增强

赵小兵等[22]利用藏汉平行语料和句子相似度计算的方法,扩充藏汉跨语言文本改写检测训练语料,使机器学习模型性能得到明显提升。何家劲[23]从中文主观性评价文本的特点出发,提出一种多粒度(词语级、短语级、句子级)的文本数据增强方案,并将其用于情感分析任务。赵鹏飞[24]提出了一种改进的基于生成对抗网络的文本复述模型来扩增中文文本语料,并将其用于训练新的语言模型以改善数据稀疏问题。

目前针对中文文本数据增强的研究还不够全面深入,方法还比较单一,面向特定任务数据增强的研究就更少。笔者在百度学术以“中文命名实体识别数据增强”为主题进行搜索,仅找到一篇强相关的期刊论文[25]。该文献采用基于人名词典的实体替换策略生成伪训练数据,能够有效提升系统对新类型人名的识别性能。上述文献仅考虑到特定人名(主要指外国和少数民族人名)的数据增强,但实际文本中出现更多的还是汉族人名,且基于人名词典的替换也存在局限性。因此有必要进一步研究面向更多实体的数据增强方法(包括所有人名以及其它类型实体)。

2 方 法

对于NER任务,本文假设模型能够学到的知识来自2个方面:一是实体内部结构,二是实体外部结构。前者是指哪些词语可能构成某个特定类型的实体,后者是指实体所在句子的结构以及可能出现的位置。下面将针对中文NER任务,介绍3种基于实例替换的数据增强方法。

2.1 实体之间交叉互换

实体交叉互换是一种简单的数据增强策略:将样本中的某个实体随机替换为训练集中的另一个同类实体,并将替换后的样本作为扩展样本。请看以下示例:

原始样本1:[李小明]PER是我的大学同学。

原始样本2:[王亮]PER毕业后就到这里工作。

扩展样本1:[王亮]PER是我的大学同学。

虽然“实体交叉互换”不产生新的实体,但是可以丰富实体的外部结构,同样能够起到数据增强的效果。由于所替换的实体都来自原始样本,扩展出的新样本几乎不存在语法错误,但所表述的语义可能与事实不符,请看以下示例:

原始样本1′:2008年奥运会在[北京]LOC举办。

原始样本2′:美丽的[哈尔滨]LOC是我的故乡。

扩展样本1′:2008年奥运会在[哈尔滨]LOC举办。

命名实体识别是为了找出句子中的实体,而不是判断句子内容的真伪。因此,可以忽略这种语义错误——它或许是一个假命题,但却是一个合法的句子。为便于描述,训练样本数据格式如下:

[[‘李小明’,‘PER’],[‘是我在’,‘O’],[‘青岛科技大学’,‘ORG’],[‘的同学。’,‘O’]]

基于上述样本格式,实体交叉互换的数据增强算法如下:

算法1 实体交叉互换

输入:原始样本集T={s1,s2,…,sn};实体标签集labels

输出:扩展样本集E

1 map←创建字典对象

2 for each label in labels do

3 map[label]←{}

4 end for

5 for eachsinTdo

6 for eachbinsdo

7 text, label←b

8 map[label].Add(text)

9 end for

10 end for

11E←{}//扩展样本集

12 for eachsinTdo

13s′←[]//扩展样本

14 for eachbinsdo

15 text, label←b

16 if label∈labels then

17 text←从map[label]中选择一个实体

18 end if

19s′.Add([text, label])

20 end for

21E.Add(s′)

22 end for

23 returnE

上述算法可分为2个步骤:第1~第10行用于统计原始样本中的各类实体,并将它们存放在字典map中,字典的“键”为实体类型,字典的“值”为实体的集合;第11~第23行用于生成新样本,遍历每个样本s中的每个实体,从map中选择一个同类实体进行替换(更新text而保持label不变),将替换后的样本s′作为扩展样本。

为控制扩展样本与原始样本的差异度,在实际操作中可选用以下策略:1)限制每个句子中替换的最大实体数(比如最多替换1个);2)让每个实体按一定的概率进行替换(比如按50%的概率替换);3)优先选择更相似的实体进行替换。

2.2 实体内部同义替换

由于“实体交叉互换”方法并不产生新的实体,它只能拓展实体的外部结构,而不能丰富实体的内部结构。为了增强实体的内部结构,本文提出一种“实体内部同义替换”的方法。其基本思想为:实体可能由一个或多个词组成,将实体中某个词替换为它的同(近)义词,所衍生的新实体在原句中的标签保持不变。请看以下示例:

原始样本1:[洛阳市公安局]ORG发布了一条悬赏通告。

扩展样本1:[洛阳市司法局]ORG发布了一条悬赏通告。

扩展样本2:[郑州市公安局]ORG发布了一条悬赏通告。

在上述示例中,“公安局”被替换为“司法局”,“洛阳市”被替换为“郑州市”,扩展样本无论在语法还是语义上都没有问题。要使衍生的实体真实、合理,关键在于找到一个地位对等的替换词。比如,“洛阳市”和“郑州市”都是河南省的地级市,“司法局”和“公安局”都是市、县所属的行政机构。但如果将“洛阳市”替换为“河南省”就会有些问题,因为现实中只有“河南省公安厅”,并没有“河南省公安局”这个机构。

对于中文同(近)义词的获取,可以借助“HowNet”“同义词词林”等人工词典,也可以利用“Word2Vec”等词向量工具。人工词典精确度高,但词汇量有限;词向量工具基于大规模语料进行训练,能够覆盖到更多的词汇,但得到的相似词往往与原词并不对等,还需要进一步筛选。例如,通过Word2Vec查询与“大学”最相似的词,不仅会得到“学院”“高中”等词(可以作为替换词),还会得到“教授”“医科”等词(不能作为替换词)。实体内同(近)义词替换算法如下:

算法2 实体内部同义替换

输入:实体文本text;分词函数Segment();同义词典SynDict;词向量工具Word2Vec;词性过滤函数POSFilter();编辑距离函数EditDistance()

输出:扩展实体文本text′

1 words←Segment(text)

2 word←从words中随机选择一个词

3 if text in SynDict then

4 synWords←SynDict[text]

5 else

6 synWords←Word2Vec.MostSimilar(text,20)

7 end if

8 synWords←POSFilter(text,word,synWords)

9 synWordsWithDistance←[]//带权候选同义词集

10 for each sWord in synWords do

11 dis←EditDistance(sWord,word)

12 synWordsWithDistance.Add([dis,sWord])

13 end for

14 synWordsWithDistance.Sort()//按权值排序

15r←生成一个0~1之间的随机数

16n←synWordsWithDistance.Length

17 return synWordsWithDistance[n*r*r][1]

在上述算法中,首先对实体文本进行分词,随机选择一个作为被替换词(第1~第2行);先后查询人工词典和Word2Vec词向量,获得候选同(近)义词列表(第3~第7行);第8行对候选列表进行词性筛选,保证替换词与被替换词在原文中的词性一致;第9~第13行用于计算候选词与被替换词之间的最小编辑距离,第14~第17行完成最终选取,并通过一些数学技巧(将随机数r取平方)使得编辑距离较小的词被选中的概率更大。

2.3 自动生成中文人名

将句子中的某个词语换成它的同(近)义词通常不会影响样本标签,人名替换也可以看作是一种特殊的同(近)义词替换。可以将一个人名换成另一个全新的人名,以提高对人名实体的数据增强。由于普通人名不会被收录在词典中,就难以使用基于词典的替换。为了得到更加“真实”的人名,本文专门设计了一个中文人名生成器。

人名生成器的基本思想如下:将中文人名分为“姓”和“名”2部分,其中“姓”不区分性别,而“名”要区分性别。从网上搜集一些人名语料库,分别统计“姓氏”、“男名”和“女名”的用字占比,共统计出约400个姓氏、4936个男名用字、3898个女名用字。在生成人名时,以各姓氏的占比为概率选“姓”,以男名或女名用字的占比为概率取“名”,若为双名则连续选取2次。中文人名生成算法描述如下:

算法3 中文人名生成

输入:姓氏占比Surnames;男名用字占比GivenNames1;女名用字占比GivenNames2;选字函数SelectChar();性别sex;常见度freq;(除姓以外)取名长度n

输出:生成的人名name

1r←生成一个0~1之间的随机数

2r←r**freq

3 name=SelectChar(Surnames,r)

4 if sex=1 then

5 GivenNames←GivenNames1

6 else

7 GivenNames←GivenNames2

8 end if

9 fori←1 tondo

10r←生成一个0~1之间的随机数

11r←r**freq

12 name←name+SelectChar(GivenNames,r)

13 end for

14 return name

在上述算法中,“姓”和“名”的选字均使用了SelectChar()函数。以“姓”为例,假设每个姓氏的占比区间已经统计好(存放在Surnames中,总的区间范围为[0,1],比如“王”的区间为[0,0.09),“李”的区间为[0.09,0.17)),生成一个0~1之间的随机数,采用二分查找快速定位随机数落在哪个字的占比区间,即可检出一个字。

调用上述算法时,若不指定性别,则按照1∶1的比例生成男名和女名;若不指定取名长度,则按2∶8的比例生成单名和双名(根据《二〇一九年全国姓名报告》发布的数据[26],中国人单、双名的比例约为2∶8)。

上述算法亦可通过频度(freq)参数调节人名的常见程度,频度越高越倾向于选取常用字;频度越低越倾向于选取生僻字。freq的有效取值范围为[0.1,10],当freq=1时为标准值。表1列出了上述算法在不同频度下所生成的人名。

表1 不同频度的人名示例

人名实体中通常还包含一些翻译为中文的外国人名,外国人名可以通过名字长度、首字是否为常见姓氏进行初步判断。对于命名实体识别任务,也可将句子中的外国人名替换为中国人名,但为了保持外国人名的比例,最好将它替换为一个同类人名。在实际处理中,本文通过计算Word2Vec相似度获得一个外国人名。

3 实 验

3.1 测试任务

为了验证方法的有效性和普适性,本文分别在PeopleDailyNER和CLUENER2020数据集上进行测试。PeopleDailyNER是一个经典的中文命名实体识别任务,它以1998年人民日报语料为基础,标注了人名、地名、机构3类实体,提供了20864条训练样本。该数据集的特点是:文本规范、标注精良、实体类型较少、训练语料充足、任务相对简单。

CLUENER2020在清华大学文本分类数据集THUTCT的基础上,选择部分数据进行细粒度实体标注(包括人名、地名、政府部门、公司、机构、书籍、电影、游戏、职务、景点共10类实体),其训练集包括10748条样本[27]。相比之下,该数据集的实体类型更多,训练数据更少,实体区别更细微,是一个更复杂的命名实体识别任务。

3.2 实验设置

实验的主要硬件环境如下:Inter Core i7-9750H CPU、32 GB物理内存、NVIDIA GeForce RTX 2070 显卡。主要软件环境如下:Windows 10 64位操作系统、Python 3.6、TensorFlow-GPU 1.15.3、Keras 2.3.1。

训练模型选用标准的BERT+CRF架构(如图1所示),训练样本统一转换为BIO格式(例如:B-PER表示人名的起始元素,I-PER表示人名的中间元素,O表示当前元素非实体),最大句子长度为128,Batch-Size为12。训练结束条件为:模型训练至少20轮且在验证集上的最优F1值连续3轮不再提升。

图1 BERT+CRF命名实体识别模型

为了验证数据增强方法在不同规模训练样本上的表现,本文从训练集中选取不同的比例作为实际训练数据,分别进行以下实验:1)不做任何数据增强,仅使用原始数据训练模型;2)分别单独使用算法1~算法3进行数据增强,与原始数据合并后进行训练;3)综合使用算法1~算法3进行数据增强,与原始数据合并后进行训练。

在实验2和实验3中,扩展数据与原始数据的比例为1∶1;调用算法3生成人名时频度freq设为1;算法2中的人工词典采用“同义词词林(扩展版)”,Word2Vec词向量由中文百科语料训练生成;在实验3中,50%的扩展数据由算法1生成,另外50%由算法2和算法3生成。

3.3 结果分析

对于不同规模的训练数据,分别执行上述4组实验,在PeopleDailyNER数据集上的训练结果如表2所示。

表2 PeopleDailyNER数据集上的实验结果

由于CLUENER2020数据集上句子较短,本文将最大句子长度设置为64,Batch-Size为24,其它条件保持不变,实验结果如表3所示。

表3 CLUENER2020数据集上的实验结果

对于2个数据集,本文分别选取9组不同比例的训练数据进行测试(从1/256到全部数据)。实验结果显示,当训练样本较少时,3种算法都能使模型F1值大幅提升(PeopleDailyNER数据集上的最大增幅约10%,CLUENER2020数据集上的最大增幅约为7%);随着训练样本的增加,数据增强的效果会有所下降;单独使用算法1~算法3偶尔会出现模型表现下降的情况,但综合使用3种算法总能使模型表现得到提升。

为了进一步分析3种算法对不同类别实体的影响,本文统计了PeopleDailyNER数据集在小样本条件下(选用1/128的训练数据)的识别结果,如表4所示。

表4 数据增强算法对各类实体识别的影响

统计结果显示:算法3不仅有助于人名实体识别,而且使其它类型实体的识别率相对于仅使用原始数据而言也有所提高(相对幅度较小),这是由于在代换人名的同时也丰富了其它类型实体的外部结构;算法2与算法3类似,主要作用于非人名实体,同时对人名实体识别也起到积极作用;算法1对各类实体均有效,且增强效果比较均匀。建议在实际应用中,可以对不同实体选用不同的数据增强方法(或组合),以达到最优效果。

4 结束语

数据增强以提高模型训练效果为目标,主要包括数据扩充和数据提纯。在通用的文本数据增强方法中,同(近)义词替换是简单有效的方法,句式转换的成本较高,随机噪声需要有条件地使用。针对中文命名实体识别任务,本文提出的数据增强方法(包括3个具体算法)在2个不同难度的数据集上均使模型的F1值得到明显提升。由于实验条件限制,本文仅使用了与原始数据等量的扩展数据,在后续研究中将尝试采用不同比例的扩展数据,并在更多模型和任务上进行测试。

本文所用的BERT+CRF基线模型来自开源项目(https://github.com/bojone/bert4keras),中文人名语料来自“数据科学社区”发布的一项数据挖掘任务(http://sofasofa.io/competition.php?id=3),“同义词词林(扩展版)”来自哈工大社会计算与信息检索研究中心(https://www.ltp-cloud.com/download)。在此向上述资源提供者表示衷心的感谢!

猜你喜欢
实体样本文本
文本联读学概括 细致观察促写作
用样本估计总体复习点拨
作为“文本链”的元电影
前海自贸区:金融服务实体
实体书店步入复兴期?
基于doc2vec和TF-IDF的相似文本识别
规划·样本
两会进行时:紧扣实体经济“钉钉子”
振兴实体经济地方如何“钉钉子”
随机微分方程的样本Lyapunov二次型估计