项目作者: luopeixiang

项目描述 :
2019年搜狐校园算法大赛初赛26名,高压锅队实现方案分享
高级语言: Python
项目地址: git://github.com/luopeixiang/SohuCompetition2019.git
创建时间: 2019-07-26T11:24:04Z
项目社区:https://github.com/luopeixiang/SohuCompetition2019

开源协议:

下载


方案

比赛链接 点击此处,比赛的主要任务是给定若干文章,目标是判断文章的核心实体以及对核心实体的情感态度。

我的方案是将核心实体以及对核心实体的情感态度的判别看成是一个序列标注问题,即在标注出实体的时候同时标注情感。举个例子,假设新闻中有这么一句:

华润医药宣布一把手换人,王春城任董事会主席。

并且该新闻对应的核心实体为 华润医药王春城,新闻对这两个核心实体的情感为NORMNORM,那么上述这句话可以标注为:

  1. NORM_B
  2. NORM_I
  3. NORM_I
  4. NORM_E
  5. O
  6. O
  7. O
  8. O
  9. O
  10. O
  11. O
  12. O
  13. NORM_B
  14. NORM_I
  15. NORM_E
  16. O
  17. O
  18. O
  19. O
  20. O
  21. O
  22. O

常规的做法可能是先抽取出实体,然后再根据实体判别文章对它的态度,这样的话就要设计两个系统分别用于实体抽取以及情感识别,并且情感识别的输入严重依赖于实体抽取的结果。比起常规的做法,将实体抽取、以及情感识别这两个过程看成是一个序列标注问题,可以有效地将问题简化。

解决序列标注问题的常规模型就是BiLSTM+CRF

为了解决这个序列标注问题,目前主要尝试了以下两种模型:

  • 常规的BiLSTM+CRF,图来自论文

bilstm_crf

  • 双层的LSTM ,参考自论文

dlstm

基于以上的思想,我多次尝试,并且使用了基于字或者基于词(先分词再进行标注)作为不同的标注方案,同时在每种方案下选择不同的超参数来训练多个模型,最后将这些模型的在测试集上的结果ensemble,不断尝试,就得到了最后的结果(初赛26名,分数是0.45382)。

快速复现

  1. 安装依赖(基于python3.6.3 , pytorch1.0):

    1. pip3 install -r requirement.txt
  2. 目前的最好的结果是results/best_now.txt文件。主要是使用BiLSTM+CRF模型的结果进行ensemble的结果。复现的话运行即可:

    1. python3 ensemble.py

    运行结束后会在results下生成tmp.txt文件,用于提交。

    说明:我当前的最好结果为0.4538,这个结果是在许多个模型上ensemble出来的结果,因为之前代码存在bug,导致有部分模型被我删掉了(由于不知道中期可能需要进行提交,目前没有详细记录ensemble的相关过程…), 所以这样运行出来的结果可能会差点,只能大约接近这个结果!

从头复现

如果想要从数据处理开始复现结果:

  • 将原始数据(coreEntityEmotion_train.txt 以及coreEntityEmotion_test_stage1.txt等文件)放到目录SohuData/original_data下面,然后运行:

    1. python3 preprocess.py

    进行数据预处理(生成标注,分词等工作)

  • 下载预训练的词向量:下载链接(该词向量来自 100+ Chinese Word Vectors 上百种预训练中文词向量

    解压下载的词向量文件,在config.py中修改word2vec_path参数为词向量的路径。

  • 之后就可以,在config.py设置模型的不同的参数,然后运行:

    1. python3 main.py

    训练完毕之后,程序会将模型的相关信息以及在验证集、测试集上的结果保存到ckpts目录下对应的文件夹。

  • 按照上一步的做法,手动调整参数,训练多个模型,之后通过ensemble将这些模型的结果结合起来,用于提交。

  代码的目录结构

  1. .
  2. ├── analysis # 用于分析数据的一些py文件
  3. ├── ckpts # 保存模型
  4. ├── config.py # 设置模型参数
  5. ├── data # 处理数据的文件
  6. ├── ensemble.py # 用于ensemble
  7. ├── imgs # 保存README.md使用的图片
  8. ├── main.py # 训练模型
  9. ├── models # 定义模型
  10. ├── preprocess.py # 数据预处理
  11. ├── README.md
  12. ├── requirement.txt # 需求文件
  13. ├── results # 保存ensemble的结果
  14. ├── SohuData # 原始数据以及处理后的数据
  15. ├── training.py # 定义训练模型评估模型的函数
  16. └── utils # 工具函数

可以改进的地方