方案概述:
- 我们采用pipeline的方式,将这个任务拆为两个子任务,先预测主题,根据主题预测情感极性(ABSA),这两个任务我们都使用深度学习的方式来解决
- 主题分类是一个多标签分类问题,我们使用BCE来解决多标签问题,我们使用不同的模型不同的词向量(2*4)训练了8个模型,再加上微调的中文BERT,一种九个模型,我们使用stacking的方式在第二层利用LR极性模型融合,得到预测概率,并使用threshold得到最终预测的标签。
- 基于角度的情感分类是一个有两个输入的多分类问题,我们使用了三种比较新的网络设计和四种词向量再加上微调的BERT一共13个模型,同样我们也用LR来做stacking。
本文全部代码 获取
关注微信公众号 datanlp ,然后回复关键词 文本分类 即可获取。
pretrained models:
- 我们将预训练好的模型放在了下面的链接中,可以直接拿来测试,免去长时间的训练。
- 链接: https://pan.baidu.com/s/1UDzqKeRIzc01chaj3Ew7AA
- 提取码: 47e7
- 其中:
- backup_polarity.zip:保存了用来预测情感极性的三个模型四种embedding五折共60个checkpoint。请将其backup_polarity里面的各个文件夹放在polarity_level_aspect/目录下。
- backup_aspect.zip保存了用来预测主题的两个模型四种embedding五折共40个checkpoint。请将backup里面的各个文件夹放在attribute_level/目录下。
- backup_bert.zip保存了分别用来预测主题和情感极性五折共是十个checkpoint。请将其里面的两个个文件夹放在berrt/glue_data/目录下。并且要将polarity_ensemble_online_submit重命名为polarity_ensemble_online
- backup_chinese_bert.zip 保存了我们将谷歌开源的中文BERT转为pytorch版本的预训练模型,可以用来做fine tune。请将chinese_L-12_H-768_A-12文件夹放在bert/目录下。
- backup_embedding.zip 保存了我们使用的embedding, 主要是一个由elmo得到的句子表示。请将backup_embedding下的词向量放在embedding/目录下。
代码框架:
- dataset/: 存放原始的数据集,以及预处理脚本
- data/: 存放预处理过的数据集,最终主题的预测以及情感的预测也会存储在这里。
- train.txt:预处理之后的训练集
- test.txt: 预处理之后的测试集
- vocabulary.pkl:词表
- test_predict_aspect_ensemble.txt:预测主题的结果文件
- test_predict_polarity_ensemble.txt:预测情感极性的结果文件
- submit2.py:生成最终的提交结果
- submit2.csv:最终的提交结果。
- embedding/: 存储我们处理过的词向量文件以及elmo
- embedding_all_merge_300.txt, 来自于Chinese-Word-Vectors的mixed-large的Word feature.
- embedding_all_fasttext2_300.txt, 来自于fasttext
- embedding_all_tencent_200.txt, 来自于Tencent AI Lab Embedding Corpus
- embeddings_elmo_ly-1.hdf5, 使用中文elmo得到的句子表示,elmo来自于ELMoForManyLangs 。因为太大,所以我们没有放在代码这里,你可以在百度云链接中的backup_embedding.zip中找到它
- attribute_level/:运行主题分类的模块, 里面有:
- w2vName中,0代表merge 词向量, 2 代表使用了elmo(没有用词向量),ft2 代表fasttext词向量, tc代表腾讯词向量。
- --mode: 运行模式,
- --model: 训练使用的模型:
- --w2v: 指定使用的词向量:
- --use_elmo:是否使用elmo
- --EPOCHS: 训练轮数
- --saved: stacking测试时是从头测试,还是直接读取存储好的预测结果
- --check_dir:训练时指定checkpoint的存储位置
- --test_dir: 指定测试时读取checkpoint或者预测结果的文件夹位置, 因为做stacking同时读取多个模型,所以可以用指定多个文件夹,用‘#’做分隔
- 0:代表leave out 训练,
- 1:代表五折交叉训练, 用于后面的stacking
- 2: stacking, 利用五折交叉训练好的模型进行预测并stacking。
- CNN
- AttA3: 一种使用label attention的RNN模型
- merge: embedding_all_merge_300.txt
- fasttext2: fasttext词向量
- tencent: 腾讯词向量
- 0 :不使用elmo
- 2 :只使用elmo,读取embedding/中的elmo的hdf5文件,最终表示和词向量无关。
- 0 : 读取checkpoint对dev集和测试集进行预测
- 1 :直接读取存储好的dev集和测试集预测结果
- attribute_level.py: 主要运行文件,主要接受以下命令行参数:
- networks2.py:我们实现的模型网络代码文件
- 保存各个模型的checkpoint的文件夹:命名格式为cp_ModelName_w2vName,
- polarity_level_aspect: 给定主题的情感分类模块:
- ab_polarity.py :主要运行文件, 命令行参数类似于attribute_level.py
- networks.py :模型实现文件
- utils: 一些代码工具,比如封装数据集类,训练骨架,评测函数等。
One Step:
- 因为训练模型比较久而且模型比较大,所以我们提供了所有checkpoint对OOF和测试集的预测结果,只需要简单的做一下stacking就可以得到我们提交的最好结果:
最后生成的submit2.csv即可用于提交。
预处理模块:
- 主要就是分词,分别运行clean_data.py, 和clean_test.py文件在data文件夹中生成预处理好的train.txt和test.txt
- 不过我们已经提供了预处理好的文件,所以不需要运行。
- 需要注意的是,如果你重新运行了分词程序,那么你生成的数据集的词表可能和我们提供的词向量的词表不一致,所以你必须重新运行prepare_w2v.py里面的prepare_w2v函数构建新的词表和词向量。
运行主题分类模块:
训练阶段:(由于训练时间比较长,你可以直接跳到第三步加载我们预训练好的模型)
- 至此我们在各对应文件夹中共得到了40个checkpoint。
- 微调Bert阶段:
- 我们修改了一个开源的pytorch版本的BERT, 并在本数据集上fine tune了谷歌放出来的中文BERT
- 首先我们我们将数据集按五折处理成tsv格式,放在bert/glue_data下,(我们已经帮你处理过了)
- 下载预训练的BERT模型,运行以下命令行完成转换:
- fine-tune之后会在各自的fold的文件夹下得到对应的预测结果oof_test.npy
- 使用预训练好的模型:
- 以上两步的所有checkpoint我们都放在了百度云链接里,下载解压之后,放入对应的文件目录下即可,这样可以免去长时间的训练。
- 注意文件夹的对应关系
- 很遗憾我们没有保存Aspect的BERT checkpoint, 我们只保存了它的预测结果,因为在训练过程中,我们已经预测过了。
- load 模型时, 我们都是在GPU上读取和保存的,我们没有在CPU上进行过测试,所以如果load有问题可以自行修改load处语法,或者联系我们。
- 预测和stacking阶段:
- 不管是从头训练还是直接下载,我们现在已经有了训练好的模型,我们可以进行预测。
- 我们首先用BERT模型进行预测,事实上我们在每个fold训练时已经将预测结果保存为npy,我们现在只需要将五折结合起来。
最终预测的主题结果, 存放在data/test_predict_aspect_ensemble.txt中。
运行情感分类模块:
- 训练阶段:(由于训练时间比较长,你可以直接跳到第三步加载我们预训练好的模型)
- 最终我们得到3种网络4种embedding 在5折下的60个checkpoint保存在对应的文件夹中。
- 微调Bert阶段:
和主题分类类似,但是需要一个aspect预测的结果作为输入。运行data文件夹下的build_test_for_predict.py脚本后, 将生成的test.tsv放在bert/glue_data/polarity_ensemble_online/下即可。
设置环境变量:
在bert/文件夹下运行下面的命令进行fine-tune (5cv): (需要一块8GB显存的GPU)
这样我们最终在data文件夹下生成了test_predict_polarity_ensemble.txt文件,里面即为预测结果。