命名实体识别和情感分类项目总结

Posted 王森ouc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命名实体识别和情感分类项目总结相关的知识,希望对你有一定的参考价值。

摘要

命名实体识别(Named Entity Recognition,NER)是NLP中一项非常基础的任务。NER是信息提取、问答系统、句法分析、机器翻译等众多NLP任务的重要基础工具。命名实体识别的准确度,决定了下游任务的效果,是NLP中非常重要的一个基础问题。情感分析(sentiment analysis)是近年来国内外研究的热点,其任务是帮助用户快速获取、整理和分析相关评价信息,对带有情感色彩的主观性文本进行分析、处理、归纳和推理。本文将依赖银行评论数据集,对评论数据的命名实体识别和情感分类课题做详尽报告。实验数据和代码见AIStudio

1.引言

本次课题要求从用户评论中识别命名实体和分析感情倾向。训练数据集和测试数据集都是csv格式的文件。训练数据集包含三列,第一列是用户评论的文本,第二列为评论文本中的NER符号,第三列为情感倾向的标签。测试数据集包含两列,第一列是某个评论的ID,第二列是此ID对应的评论文本。经过统计分析之后发现,训练集有6022条数据,测试集有1506条数据,训练集和测试集的比例大约是4:1。

在本次课题中,有四种实体需要识别,分别是银行实体、产品实体、用户评论(名词)实体、用户评论(形容词)实体,它们采用BIO格式进行标注,每个BIO符号的写法和含义如表1所示。情感分类问题有三种情感需要区分,分别是正面情感,负面情感和中立情感,它们在训练数据中的标号和对应的含义如表2所示。

表1. NER类别
BIO记号含义
B-BANK代表银行实体的开始
I-BANK代表银行实体的内部
B-PRODUCT代表产品实体的开始
I-PRODUCT代表产品实体的内部
O代表不属于标注的范围
B-COMMENTS_N代表用户评论(名词)
I-COMMENTS_N代表用户评论(名词)实体的内部
B-COMMENTS_ADJ代表用户评论(形容词)
I-COMMENTS_ADJ代表用户评论(形容词)实体的内部
表2. 情感类别
标签含义
0负面情感
1正面情感
2中立情感

本次任务的难点在于如何从文本中提取有效的特征,从而让模型能够理解文本的含义。特征的提取可以通过特征工程来完成,也可以通过现有的预训练模型来提取。本文在实现时采用了现有的预训练模型,并在命名实体识别和情感分类这一下游任务上进行微调,最终取得了良好的效果。因为在做这个任务时没有GPU资源,所以选择了百度的PaddlePaddle框架,下面将分别介绍命名实体识别部分和情感分类部分的具体实现。

2.命名实体识别

命名实体识别任务本质上是个分类任务,只不过是考虑了上下文信息,也就是说分类的结果不仅取决于当前的输入,还与之前的输入和之后的输入有关。对于这种考虑上下文的分类问题,现有的方法有基于规则的方法,基于统计的方法,基于深度学习的方法,基于Attention的方法等。本文选定的是基于Attenttion的方法,使用这种方法,不需要自己在训练模型上花太多的时间,只需要进行微调即可。基于Attention原理的预训练模型有很多,比如ELMo,BERT,ERNIE等,在充分比较了之后,发现ERNIE效果最好,因此最终选定ernie-1.0作为预训练的模型。

在引言部分曾经介绍过,训练数据有6022条,这个数据量对于ernie-1.0预训练模型来说有点偏少,因此考虑使用中文数据增强工具来增加数据量。在对现有数据增强工具进行对比之后,最终选定了nlpcda包来增强数据。nlpcda包可以应用于命名实体数据的增强,在数据增强之前,用户首先需要将待增强的数据处理成规定的格式,然后指定哪些实体需要增强,每条数据最多可以增强成几条。增强之后的数据和我们训练集中的数据格式有点差别,在经过一些后处理之后便可以用于NER任务的训练了。nlpcda数据增强包对于命名实体识别数据的增强算法比较简单,它会将标注结果相同,但是名称不同的实体进行随机替换,然后就可以得到更多的数据了。这种方法虽然简单,但是应用起来的效果很好。

使用ernie-1.0作为预训练模型,然后用训练集fine-tune之后得到的模型其实已经可以进行命名实体识别了,但是效果并不理想,因此需要添加一些其它的部分来提高模型的泛化能力。在经过了各种尝试之后,发现在ernie模型的输出层之后加一层条件随机场(Conditional Random Field)会有成绩上的提升。条件随机场算法在自然语言处理领域常被用于词性标注问题,本次课题的命名实体识别任务和词性标注任务很相似,都是输入一个长度为n的序列,输出一个长度为n的序列,因此,加上了条件随机场算法之后获得了分数的提升。

虽然通过CRF增加了模型的复杂度,但是模型仍然不太稳定,在训练到后期的时候,Loss在某个范围内摆动,但就是降不下去。我用的batch_size是64,这个值不算大,因此初步怀疑是由于mini_batch中有噪音导致的。解决此问题的一个有效的方法是在学习的过程中不断减小学习率,从而避免学习的步伐太大,造成震荡问题。我在代码中采用的学习率衰减方法是线性衰减,此方案可以有效的避免模型不收敛的问题。解决了此问题之后,发现模型确实收敛了,并且能够在训练集上得到很好的表现,但是在评估集上的表现却较差,因此初步怀疑模型发生了过拟合现象。解决过拟合问题的一个有效的手段是权重衰减(weight decay),因此,又在优化器部分添加了权重衰减系数。

经过上述一系列操作之后,模型在NER任务上的整体表现还算可以,但是仍然有过拟合现象。最初我把训练集划分成了两部分,其中80%的数据用于训练,20%的数据用于评估,但是比较奇怪的是,模型在评估集上的表现很好,F1值能达到0.9以上,当提交到测评系统以后,F1值不到0.8,这个问题一直没能解决,也就是说评估集发挥不了防止过拟合的作用,因此之后训练的时候不再使用评估集,而是调整epoch防止过拟合。

3.情感分类

情感分类任务的目标是给模型输入一个句子,模型输出这个句子所表达的情感。同命名实体识别任务相同,情感分类任务也要求考虑输入之间的上下文信息。在NER任务中,我选用了ernie-1.0作为预训练模型,在这次的情感分析任务中,我仍然没有从头开始训练,依旧选则预训练模型,然后在下游任务上fine-tune。这次选择的预训练模型是SKEP。SKEP是百度研究团队提出的基于情感知识增强的情感预训练算法,此算法采用无监督方法自动挖掘情感知识,然后利用情感知识构建预训练目标,从而让机器学会理解情感语义。SKEP为各类情感分析任务提供统一且强大的情感语义表示。

我们在本任务中需要区分的情感总共有三种:分别是正向情感、负向情感和中立情感。在分析了训练数据集之后,发现训练数据存在不均衡的现象。每种类别的数据的数量如表3所示。从表3中可以明显的看出,中立情感的样本数量大约是正向情感的20倍,是负向情感的8倍。为了解决这个样本不均衡的问题,我自己实现了FocalLoss来代替之前使用的交叉熵。FocalLoss损失函数是在标准的交叉熵损失函数的基础上修改得到的,它通过给不同的样本赋予不同的权重的方法,使得那些比较难学的样本也可以学起来,从而解决类别不均衡的问题。

表3. 不同类别样本数量
情感类别数量
正向情感230
负向情感636
中立情感5155

在NER任务中没有使用验证集,但是在现在的情感分类任务中使用到了。对于分类任务的验证集和训练集的划分,一种最简单直接的方式就是按照比例随机划分,但是这样会有问题。比如在训练集中类别 C C C占30%,在验证集中占%50,那么在验证集中的评估结果很可能和训练集中的不同,从而影响最佳模型的选择。解决验证集划分问题的一个有效的手段是分层采样。分层采样的思想是先将总体的单位按某种特征分为若干次级总体(层),然后再从每一层内进行单纯随机抽样,组成一个样本。具体到本次任务中来说,就是先把三种类别的样本分开,然后再从每个类别的样本中按照比例随机划分训练集和验证集,最后把这三个类别中的训练集合并到一起组成最终的训练集,把三个类别中的验证集合并到一起组成最终的验证集。

在NER任务的实现说明中提到过,为了防止模型震荡不收敛,采用了学习率衰减的策略,为了防止模型过拟合,采用了权重衰减的策略。同样地,在情感分类任务中也采取了这两种策略,以期模型能有更好的泛化能力。

在打榜的比赛中,那些排名比较靠前的队伍一般都会用到模型融合方法。模型融合是指独立的训练多个模型,最后将这些模型的输出结果按照某种规则融合起来。我在实现的时候,没有选择多种模型方法,而只是简单的将现有的代码训练多次,得到多个模型。假设总共训练了k次,那么最后会得到k个模型。在训练之前,将训练集按照分层采样的方法随机分成k份,训练第i个模型时,使用第i份作为验证集,其余的n-1份为训练集,这样能够保证融合之后的模型可以学到所有训练数据的特征。在我的实现中,设定的参数k的值为10,也就说训10模型,然后做模型融合。在模型融合方法的选择上,我没有花太多的精力,而只是实现了一个简单的投票器。

在对模型进行微调的时候,发现了一个奇怪的现象。当十个模型都用分层采样时,效果不如其中四个模型用随机采样,六个模型用分层采样好。因此,最终选用了六个模型用分层采样,四个模型用随机采样的方法进行训练。

4.总结

在本文中,我们介绍了自然语言处理中两个常见的任务,命名实体识别和情感分析。我在完成这两个任务时,都用到了预训练的模型,其中命名实体识别任务用到了ERNIE预训练模型,情感分析任务用到了SKEP模型。在做自然语言处理时,最重要的是如何提取上下文之间的信息,因此我在NER任务中又加了一层CRF。要想得到一个泛化性能比较好的模型,调参也是至关重要的,我在此处花了较多的时间。

政治领域的命名实体识别

【中文标题】政治领域的命名实体识别【英文标题】:Named Entity Recognition in political domain 【发布时间】:2012-02-29 02:19:55 【问题描述】:

对于我的文本分类研究项目,我需要识别政治领域中的命名实体(使用 NER 来改进文本分类)。

我在哪里可以找到政治领域中的命名实体,以便我可以用它来训练分类器?

如果您知道政治领域以外的任何其他数据集,请告诉我。

谢谢!

【问题讨论】:

@eowl 但您需要至少有 5 个声望才能在那里提问。对吗? 【参考方案1】:

以下链接可能会对您有所帮助:

Semantic analysis of text

Associating free text statements with pre-defined attributes

【讨论】:

以上是关于命名实体识别和情感分类项目总结的主要内容,如果未能解决你的问题,请参考以下文章

[Python人工智能] 三十一.Keras实现BiLSTM微博情感分类和LDA主题挖掘分析(上)

项目实战解析:基于深度学习搭建卷积神经网络模型算法,实现图像识别分类

一文详解深度学习在命名实体识别(NER)中的应用

一文详解深度学习在命名实体识别(NER)中的应用

基于深度学习做命名实体识别

python调用Hanlp做命名实体识别以及词性标注