【论文复现】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的流程记录:
-
在服务器上conda创建虚拟环境dae(python版本于readme保持一致,為3.6)
conda create -n dae python=3.6
-
git clone下载项目代码于本地,用pycharm打开并远程连接到服务器的该环境中。
-
服务器上首先升级pip(因为python3.6版本得到的pip太旧,下载不了
requirements.txt
中的某些库),再安裝本项目需要的库。pip install --upgrade pip pip install -r requirements.txt
-
下载模型文件。在作者提供的https://drive.google.com/drive/folders/1kcRCU-UlIqwDIGsaRQlRsCcHY4Mc-m3L中factuality_models_datasets/factuality_models路径下下载DAE_xsum_human_best_ckpt.zip,在项目根目录下创建目录models/,将该zip文件解压后放至models下。
-
下载本项目所依赖的StanfordCoreNLP本地文件——stanford-corenlp-full-2018-02-27,解压并将整个目录放至服务器/home/{your_username}/目录下。
-
激活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。
-
(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')
-
修改代码中的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)
原因:
nlp
(StanfordCoreNLP
的对象)的annotate方法,返回的是字符串(这个字符串的内容是一个字典),因此需要先把字符串处理成字典,才能进行后面的字典调用。 -
运行程序!
python evaluate_generated_outputs.py \ --model_type electra_dae \ --model_dir models/DAE_xsum_human_best_ckpt \ --input_file sample_test.txt