0. 前言
- 论文:Reasoning about Actions and State Changes by Injecting Commonsense Knowledge, Niket Tandon et al., EMNLP 2018.
- 项目地址:Propara (我只跑了其中的ProStruct模型)
1. 遇到的问题
1.1 安装环境
在requirements.txt
中,它要求的是allennlp==0.4.3
,记住安装完后检查一下pytorch的版本
import torch
print(__torch.version__)
正常的输出是'0.3.1'
,我的不知道啥原因,第一次输出的竟然是'1.0.1.post2'
,但是退出再进环境测试了一下就正常了,所以你们特别要注意一下,不然后面报错搞得你怀疑人生,无语~~
如果没问题的话,就切换到项目路径,然后执行:
export PYTHONPATH=.
1.2 predictor
这里的问题就有点多了,具体看下面的:
(1)命令:
在EMNLP18-README.md
中,给的运行参数是:
python propara/run.py predict --output-file /tmp/prostruct1/test.pred.json --predictor "prostruct_prediction" /tmp/prostruct1/model.tar.gz data/emnlp18/grids.v1.test.json
很不幸,当你运行完后会出现错误:
...
allennlp.common.checks.ConfigurationError: 'prostruct_prediction is not a registered name for Predictor'
好吧,我以前没用过allennlp
这个框架,也不懂怎么搞,就去看了看官方的tutorial,发现要加一条包括那个文件的包名,要加上--
:
python propara/run.py predict --include-package propara --output-file /tmp/prostruct1/test.pred.json --predictor prostruct_prediction /tmp/prostruct1/model.tar.gz data/emnlp18/grids.v1.test.json
(2) 源码错误
等你执行上面那个命令后又报错了:
...
from processes.utils.propara_metadata import ProparaMetadata
ModuleNotFoundError: No module named 'processes'
看报错信息,在propara/utils/gold_to_grid.py
这个文件里,看看它第一行代码,
from processes.utils.propara_metadata import ProparaMetadata
严重怀疑这里是写错了,可是作者怎么能编译通过呢,小朋友你是否有很多问号????好吧,改成下面的:
# from processes.utils.propara_metadata import ProparaMetadata
from propara.utils.propara_metadata import ProparaMetadata
别急,还有一个地方也得改呢,那就是propara/utils/prostruct_predicted_json_to_tsv_grid.py
这个文件的第5行也是如此,改吧:
# from processes.data.propara_dataset_reader import Action
from propara.data.propara_dataset_reader import Action
到这里问题基本就解决了,如果你可以运行,那就不用看下面的内容了。(不过也要注意,EMNLP18-README.md
里json
–>tsv
格式的命令行也有问题,就是那个文件名的路径和名字,看下面1.3
部分)
(3) 运行错误:
如果你运行的时候又出现了../../tests/fixture/..
啥文件NOT FOUND
,那可能是项目根路径的问题,所以建议你用Pycharm远程连服务器运行,然后在run.py
那里配置参数,看图:
- 运行一下
propara/run.py
,它会报错,因为缺少参数,但是在Pycharm的右上角添加了run
(也就是上图中1
的位置),点击进去编辑; - 图中
2
中填的内容:
predict --output-file /tmp/prostruct1/test.pred.json --include-package propara --predictor prostruct_prediction /tmp/prostruct1/model.tar.gz data/emnlp18/grids.v1.test.json
- 图中
3
的地方要填项目的根目录。
1.3 将预测生成的json
格式转换成tsv
格式
EMNLP18-README.md
中这步给的命令是:
python propara/utils/prostruct_predicted_json_to_tsv_grid.py /tmp/pl1/predictions/pred.test.json /tmp/pl1/predictions/pred.test.tsv
这里的路径和上面的是不一样的,上面predictor生成的文件存放在/tmp/prostruct1/test.pred.json
(尤其是后面那部分坑死了pred.test.json
v.s. test.pred.json
,你细品~~),所以命令改成:
python propara/utils/prostruct_predicted_json_to_tsv_grid.py /tmp/prostruct1/test.pred.json /tmp/prostruct1/test.pred.json
总算么得问题了,接下来就去下载evaluator进行评测啦,看github上的步骤就可以了。下面是我跑的结果,和原文还是有点差距的:
我遇到的问题总体上就是上面那些啦,如果你还遇到啥问题可以在下方留言和我讨论哦~~~~