/opinion_mining

之江杯-电商评论观点挖掘 rank30

Primary LanguagePython

opinion_mining

之江杯2019-电商评论观点挖掘,数据及赛题介绍请见比赛页面

整体思路

使用两阶段的pipeline的方式,第一阶段用BIES标注OpinionTermsPolarities,第二阶段携带第一阶段抽取的一个OpinionTerms信息去标注AspectTerms(如果这个OpinionTerms没有对应AspectTerms,将AspectTerms的序列标注置为全O),同时使用一个分类器去得到这个OpinionTerms AspectTerms pair或者OpinionTermsCategories,两阶段的训练都是采用multi-task。为什么第二阶段不用BIES同时标注类别?因为没有AspectTerms的情况很多,但是又必须输出一个Categories。因为做这个比赛的时间比较赶,没有对两个阶段的总体做线下评分,都是看两阶段有提升就提交了,也没有搞模型融合,只是两阶段都跑了5折,概率平均去预测,最后复赛排名30,五折提升还是非常可观,要是有时间搞出多模型就更好了。

模型细节

在抽取的时候,因为使用BERT,是以字为粒度去做标注,缺失了分词信息,因此使用了HanLP做了词性标注,将同一个词的词性用BIES规范以embedding的形式注入到模型中,新增加了词性与分词信息,线下测有一定的提升。

领域迁移

一阶段因为只抽取OpinionTermsPolarities,直观上来看,这个任务是不用区分领域的(只是抽取makeup与laptop的OpinionTermsPolarities),所以只是简单的混合了两个领域的的数据(laptop makeup),第二阶段laptop和makeup的Categories,就有一定的差距了,目前我的解决方案是先使用大数据量的makeup数据去训练第二阶段,然后加载权重,更换最后的Categories分类器,再小学习率的微调laptop的数据。

联合训练的模型

之前受到过苏神信息抽取任务的启发,曾经尝试过将两个阶段合并到一起。每次训练的时候,模型1还是像上述一阶段的任务这样训练,模型2每次采样一个OpinionTerms去抽取AspectTerms。(在每一个epoch都重新采样,所以epoch数目足够的话,还是可以见到很多AspectTerms数据的),但是我试了一下效果并不好,线下的指标很低,猜测是简单的随机采样可能采到负样本的情况比较多,后面应该尝试更多的采样策略。

Keras显示多个loss

因为使用了多任务训练,用hook的方式,让Keras能在训练过程中显示每一个任务的loss,详情见代码。 tensorflow-gpu==1.8.0 keras==2.2.4

reference