【论文复现】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
    
  2. git clone下载项目代码于本地,用pycharm打开并远程连接到服务器的该环境中。

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

    pip install --upgrade pip
    pip install -r requirements.txt
    
  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
    

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

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

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

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

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

    pip install stanfordcorenlp==3.9.1
    

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

    # 现在是直接从代码中先将本地存储的StanfordCoreNLP服务挂载在9000端口上(不用自己先专门开启一个终端执行java -mx4g -cp)
    # 然后再返回nlp对象,从而调用后续的服务
    from stanfordcorenlp import StanfordCoreNLP
    
    nlp = StanfordCoreNLP('/home/zkyao/stanford-corenlp-full-2018-02-27')
    
  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})
    

    各自在其後加上:

    import json  # 记得要导入json包先
    parse = json.loads(parse)
    
    tokenized_json = json.loads(tokenized_json)
    

    原因: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
    

你可能感兴趣的:(论文学习,nlp)