Hi,大家吼呀!这里是糖葫芦喵喵~!今天给大家带来的是2019之江杯——电商评论观点挖掘赛道亚军团队的开源方案。比赛传送门:https://tianchi.aliyun.com/competition/entrance/231731/introduction
在历时两个月的比赛中我们团队在586支队伍中脱颖而出,最终在现场赛中取得了亚军的优秀成绩,可喜可贺!让我们来进入赛题吧!
随着电商行业的发展,消费者对商品的品质产生了更高的追求。我们在线上购买商品时,往往会参考有过该商品历史购买记录的消费者的评论。通过分析这些评论,一方面可以使消费者方便地选择出自己心仪的商品;另一方面也可以让商家更好地分析自己商品的优缺点,从而调整销售策略,具有非常大的实用价值和应用场景。赛题任务是在商品评论中抽取商品属性特征和消费者观点,并确认其情感极性和属性种类。具体来看两个例子:
评论一:感觉【价格】【有点贵】了。
其中,【价格】是我们需要抽取的商品属性特征,【有点贵】是我们需要抽取的消费者观点。同时我们还要确认情感极性为正面评价;属性种类为价格。
评论二:【快递】【很给力】。【味道】【香香的】,用起来【挺清爽的】。
这一条评论中出现了多组特征-观点二元组:
【快递】——【很给力】—— 正面评价 —— 物流
【味道】——【香香的】—— 正面评价 —— 气味
【NULL】——【挺清爽的】—— 正面评价 —— 使用体验
现在我们就好理解了,赛题任务就是给一条文本,然后在该文本中抽取四元组:【商品属性特征】【消费者观点】【情感极性分类】【属性种类分类】。评价标准:计算四元组F1值。下面我们来具体看一下数据。
这个赛题和普通的文本抽取、分类有一个不同点:该赛题复赛训练集由大量【化妆品】和少量【笔记本电脑】两个数据集构成,同时提供了大量无标注的【笔记本电脑】评论语料。而测试集仅为【笔记本电脑】领域。下图为数据分布:
可以看出,主办方想让我们实现一个少样本学习模型。因此带来了如下两个问题:
涉及【化妆品】和【笔记本电脑】两个领域,目标领域【笔记本电脑】数据量极小,如何充分利用数据?
如何利用大量的无标签目标领域数据?
我们将带着这两个问题继续研究。
下图展示了【化妆品】和【笔记本电脑】两个训练集的分布:
【笔记本电脑】:共11类
【化妆品】:共13类
可以看出【化妆品】和【笔记本电脑】两个训练集中共有7类交叉出现。
在观察数据时,我们发现了有两种关系:
评论一:电脑性能:运行流畅,不卡顿
【运行】——【流畅】—— 正面评价 —— 硬件&性能
【运行】——【不卡顿】—— 正面评价 —— 硬件&性能
这是一条典型的**一个【商品属性特征】对应多个【消费者观点】**的数据。
评论二:玩游戏办公都可以!
【玩游戏】——【可以】—— 正面评价 —— 硬件&性能
【办公】——【可以】—— 正面评价 —— 硬件&性能
这是一条典型的**多个【商品属性特征】对应一个【消费者观点】**的数据。因此,我们在设计模型时除了2.1中提到的两个问题外,还需要考虑第三个问题:
一对多和多对一的抽取问题。
带着这三个问题,我们进入模型设计。
在Part 1 任务描述中我们已经讲到该任务本质是抽取四元组,准确点说是两个抽取,两个分类。这里两个分类是指【情感极性分类】和【属性种类分类】。常规思路是训练两个分类器,在这里我们采取了将【情感极性分类】和【属性种类分类】统一为新标签【情感极性##属性种类】,通过这样的方式我们将两个分类任务统一为一个分类任务。下图为两个数据集中新类别的分布:
【化妆品】:新类别共39类
【笔记本电脑】:新类别共28类
这样,我们的任务就由抽取四元组{【商品属性特征】【消费者观点】【情感极性分类】【属性种类分类】}变成了抽取三元组{【商品属性特征】【消费者观点】【情感极性##属性种类分类】}。
传统的三元组抽取方法主要是pipeline方式:先抽取实体,再利用远程监督进行关系判断。这样需要训练两个模型,使得训练误差不断累积。而且很麻烦,不符合我们现在End2End的认知!那我们何不一次到位呢?我们来看这样一个式子:
其中 为【商品属性特征】, 为【情感极性##属性种类分类】, 为【消费者观点】。这个式子利用条件概率将抽取三元组任务变为先抽取【商品属性特征】,然后抽取【消费者观点】同时进行【情感极性##属性种类分类】。
为什么要这么做?还记得我们在Part 2的最后提到要解决一对多和多对一的问题嘛,其实没那么复杂,根据这个条件概率,只要我们想办法让在 的前提下抽取不同的 │ 就可以了!
这个办法也很简单:span向量。我们构造两个向量,一个Start向量负责标记起点,另一个End向量负责标记终点,如:
我们以Start向量中的1标记起点,以End向量中的1为标记终点,可以得到很多组片段,这样就可以有效的解决一对多和多对一问题。考虑到我们还要同时进行【情感极性##属性种类分类】,因此直接把span向量0、1标记换为类别:
抽取的时候与之前有所不同,我们只保留抽取相同类别数字之间的片段,通过这种方式我们可以同时获得抽取内容与所属类别。下面我们来具体看模型结构:
训练阶段 部分:
本质还是通常的信息抽取任务,不涉及分类问题,因此用0、1标签即可。这里我们采用Bert和BiLSTM同时编码拼接的方式来训练。
训练阶段 │ 部分:
│ 就是在 的前提下进行多标记的信息抽取,因此采用类别数来替换span向量中的0、1标记。而 的信息我们通过抽样获取: 对应的整句表达中的片段以及位置信息进行拼接。将 的信息与原整句表达再次拼接送入BiLSTM进行最终的训练。 与 │ 两个部分的训练loss进行相加即为完整的训练流程。
测试阶段
测试阶段中我们首先计算 ,然后根据计算得到的 来进一步组计算 │ (注意区别于训练过程,训练中采用的是抽样AA进行训练)。
bert-google
bert-wwm
bert-wwm-ext
Roberta-wwm
Roberta-Large
fasttext字向量
腾讯字向量
拼接 fasttext字向量 /腾讯字向量
拼接 fasttext字向量 /腾讯字向量/word 词向量
####迁移学习 为了解决我们先前提出的问题1:涉及【化妆品】和【笔记本电脑】两个领域,目标领域【笔记本电脑】数据量极小,如何充分利用数据?我们采用了下述几种训练方案:
仅【化妆品】训练
【化妆品】和【笔记本电脑】一起训练
【化妆品】预训练,【笔记本电脑】微调
输入Text增加一个domain token(即每个句子后面加一个标记指示是属于哪个数据集的)
根据标点符号将句子切分为多个片段,对句子内部的片段进行随机shuffle组成新的句子,更新【商品属性特征】和【消费者观点】对应的位置信息,【情感极性##属性种类】保持不变
为了解决我们先前提出的问题2:如何利用大量的无标签目标领域数据?我们采用了下面的训练方案:
预测【笔记本电脑】未标注的语料产生新的数据,加入原始训练集一起训练。
下图为我们单模型分数与最终融合分数,融合采用多个模型结果投票方式取得。
最
终取得了亚军的优秀成绩。
在本次比赛整体思路受到https://github.com/bojone/kg-2019的启发,对数据进行了详细的分析后将主要精力集中于解决一对多和多对一关系的处理上,也是我们的主要上分点。此外,进行了大量的实验尝试,其中比较有效的仍属Roberta-Large(果然越大越好)。而数据迁移与伪标签提升不明显,考虑到两个数据集实际上内容交叉比较多,属于预料之中的事。最后感谢主办方给我们这样一次学习的机会,希望我们在别的赛场上能够相遇!同时也感谢各位队友们的辛勤付出!谢谢!
个人微信:加时请注明 (昵称+公司/学校+方向)
也欢迎小伙伴加入NLP交流群,刚刚创的,想和大家讨论NLP!