• 【论文复现】DAE:《Annotating and Modeling Fine-grained Factuality in Summarization》


    以下是复现论文《 Annotating and Modeling Fine-grained Factuality in Summarization》(NAACL 2021)代码https://github.com/tagoyal/factuality-datasets的流程记录:

    1. 在服务器上conda创建虚拟环境dae(python版本于readme保持一致,為3.6)

      conda create -n dae python=3.6
      
      • 1
    2. git clone下载项目代码于本地,用pycharm打开并远程连接到服务器的该环境中。

    3. 服务器上首先升级pip(因为python3.6版本得到的pip太旧,下载不了requirements.txt中的某些库),再安裝本项目需要的库。

      pip install --upgrade pip
      pip install -r requirements.txt
      
      • 1
      • 2
    4. 下载模型文件。在作者提供的https://drive.google.com/drive/folders/1kcRCU-UlIqwDIGsaRQlRsCcHY4Mc-m3L中factuality_models_datasets/factuality_models路径下下载DAE_xsum_human_best_ckpt.zip,在项目根目录下创建目录models/,将该zip文件解压后放至models下。

    5. 下载本项目所依赖的StanfordCoreNLP本地文件——stanford-corenlp-full-2018-02-27,解压并将整个目录放至服务器/home/{your_username}/目录下。

    6. 激活StanfordCoreNLP至服务器端口9000上。

      cd ~/stanford-corenlp-full-2015-12-09
      java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000
      
      • 1
      • 2

      一般情况下让StanfordCoreNLP对象服务监听在服务器的9000端口,以供后续其它代码调用,应该没啥问题。

      但是我的服务器不知道出于什么原因,采用这种方式,就一定会报错,一直检测不到我有挂载该服务于9000端口。因此我这里使用了另一种方式加载StanfordCoreNLP。

    7. (6支).修改主程序evaluate_generated_outputs.py中加载StanfordCoreNLP的代码:

      # 原来的代码是采用pycorenlp的方法以直接访问本机9000端口的方式,获取nlp对象,从而调用后续的服务
      from pycorenlp import StanfordCoreNLP
      
      nlp = StanfordCoreNLP('http://localhost:9000')
      
      • 1
      • 2
      • 3
      • 4

      现作出如下修改:首先安装相同版本的stanfordcorenlp库。

      pip install stanfordcorenlp==3.9.1
      
      • 1

      而后在对应位置将代码改为

      # 现在是直接从代码中先将本地存储的StanfordCoreNLP服务挂载在9000端口上(不用自己先专门开启一个终端执行java -mx4g -cp)
      # 然后再返回nlp对象,从而调用后续的服务
      from stanfordcorenlp import StanfordCoreNLP
      
      nlp = StanfordCoreNLP('/home/zkyao/stanford-corenlp-full-2018-02-27')
      
      • 1
      • 2
      • 3
      • 4
      • 5
    8. 修改代码中的bug。不知道作者原先是什么原因没有发现这里的问题(按理说是一定会报错的)。打开train_utils.py,找到其中的下面两个部分:

      parse = nlp.annotate(line, properties={'annotators': 'tokenize,ssplit,pos,depparse', 'outputFormat': 'json', 'ssplit.isOneSentence': True})
      
      tokenized_json = nlp.annotate(input_text, properties={'annotators': 'tokenize', 'outputFormat': 'json', 'ssplit.isOneSentence': True})
      
      • 1
      • 2
      • 3

      各自在其後加上:

      import json  # 记得要导入json包先
      parse = json.loads(parse)
      
      tokenized_json = json.loads(tokenized_json)
      
      • 1
      • 2
      • 3
      • 4

      原因:nlpStanfordCoreNLP的对象)的annotate方法,返回的是字符串(这个字符串的内容是一个字典),因此需要先把字符串处理成字典,才能进行后面的字典调用。

    9. 运行程序!

      python evaluate_generated_outputs.py \
              --model_type electra_dae \
              --model_dir models/DAE_xsum_human_best_ckpt  \
              --input_file sample_test.txt
      
      • 1
      • 2
      • 3
      • 4
  • 相关阅读:
    Vue的生命周期
    高等数学(第七版)同济大学 习题5-2 个人解答
    详细教程:Postman 怎么调试 WebSocket
    ES6对象字面量的新功能
    【vue】vue3中状态管理Pinia(Vuex5)使用快速上手
    ubuntu安装git
    LinkedBlockingDeque
    记一次多个Java Agent同时使用的类增强冲突问题及分析
    [RoarCTF 2019]Simple Upload
    SOC项目AHB_SD_HOST控制器设计
  • 原文地址:https://blog.csdn.net/micah_yaokunkun/article/details/134499107