之江杯2019-电商评论观点挖掘,数据及赛题介绍请见比赛页面
使用两阶段的pipeline的方式,第一阶段用BIES标注OpinionTerms
和Polarities
,第二阶段携带第一阶段抽取的一个OpinionTerms
信息去标注AspectTerms
(如果这个OpinionTerms
没有对应AspectTerms
,将AspectTerms
的序列标注置为全O),同时使用一个分类器去得到这个OpinionTerms
AspectTerms
pair或者OpinionTerms
的Categories
,两阶段的训练都是采用multi-task
。为什么第二阶段不用BIES同时标注类别?因为没有AspectTerms
的情况很多,但是又必须输出一个Categories
。因为做这个比赛的时间比较赶,没有对两个阶段的总体做线下评分,都是看两阶段有提升就提交了,也没有搞模型融合,只是两阶段都跑了5折,概率平均去预测,最后复赛排名30,五折提升还是非常可观,要是有时间搞出多模型就更好了。
在抽取的时候,因为使用BERT
,是以字为粒度去做标注,缺失了分词信息,因此使用了HanLP
做了词性标注,将同一个词的词性用BIES
规范以embedding
的形式注入到模型中,新增加了词性与分词信息,线下测有一定的提升。
一阶段因为只抽取OpinionTerms
和Polarities
,直观上来看,这个任务是不用区分领域的(只是抽取makeup与laptop的OpinionTerms
和Polarities
),所以只是简单的混合了两个领域的的数据(laptop makeup),第二阶段laptop和makeup的Categories
,就有一定的差距了,目前我的解决方案是先使用大数据量的makeup数据去训练第二阶段,然后加载权重,更换最后的Categories
分类器,再小学习率的微调laptop的数据。
之前受到过苏神信息抽取任务的启发,曾经尝试过将两个阶段合并到一起。每次训练的时候,模型1还是像上述一阶段的任务这样训练,模型2每次采样一个OpinionTerms
去抽取AspectTerms
。(在每一个epoch都重新采样,所以epoch数目足够的话,还是可以见到很多AspectTerms
数据的),但是我试了一下效果并不好,线下的指标很低,猜测是简单的随机采样可能采到负样本的情况比较多,后面应该尝试更多的采样策略。
因为使用了多任务训练,用hook的方式,让Keras能在训练过程中显示每一个任务的loss,详情见代码。
tensorflow-gpu==1.8.0 keras==2.2.4