Towards Generative Aspect-Based Sentiment Analysis 复现

论文地址: https://aclanthology.org/2021.acl-short.64.pdf
论文代码地址:https://github.com/IsakZhang/Generative-ABSA
论文讲解:https://blog.csdn.net/qq_36234441/article/details/119777199

1.创建环境&安装pytorch pytorch官网

新建一个环境GAS(如有需要)

conda create -n GAS python=3.8.0
conda activate GAS

安装pytorch:https://pytorch.org
历史版本pytorch下载:https://pytorch.org/get-started/previous-versions/

pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113

2.根据read.md安装对应环境

pip install transformers==4.0.0
pip install sentencepiece==0.1.91
pip install pytorch_lightning==0.8.1

3.运行文件main.py测试代码:

问题1:

main.py: error: the following arguments are required: --task, --dataset, --paradigm

参考博客:https://blog.csdn.net/qq_45056135/article/details/123991879

解决方法:

找到这三个required=true的属性的default, 如下图
在这里插入图片描述
default分别为uabsa, rest14, annotation
1.复制代码:

--task "uabsa" --dataset "rest14" --paradigm "annotation"

Run---->Edit configuratioins–>找到main.py---->Parammeters—>将复制好的代码填入配置 点击ok保存退出
在这里插入图片描述

配置成功;继续运行main.py文件

问题2:

ImportError: cannot import name 'SAVE_STATE_WARNING' from 'torch.optim.lr_scheduler' (/home/wjg/anaconda3/envs/ABSA/lib/python3.7/site-packages/torch/optim/lr_scheduler.py)

解决方法:

解决方法参考博客:https://blog.csdn.net/qq_43060870/article/details/117194738
方法1: 更新transformers版本,运行如下代码(你也可以更新其他版本的比这个高就行)

pip install transformers==4.3.0

方法2: 说是pytorch版本太高(太麻烦不推荐)
降低torch的版本为1.7.1即可

问题3:

ModuleNotFoundError: No module named 'editdistance'

解决方法:

pip install editdistance

继续运行main.py代码显示正常测试部分是没问题了:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yyEbCLZ5-1650284222423)(C:\Users\74538\AppData\Roaming\Typora\typora-user-images\image-20220418200832690.png)]

4. 训练模型:

将args.do_train置为true模型:
代码第35行:ture改成false启动训练方法

parser.add_argument("--do_train", action='store_true', help="Whether to run training.")

改成:

parser.add_argument("--do_train", action='store_false', help="Whether to run training.")

之后运行代码:

问题4:

TypeError: object of type 'int' has no len()

问题原因: self.hparams.n_gpu是一个int类型没有len方法

解决方法:

找到报错代码行
在这里插入图片描述
将代码

len(self.hparams.n_gpu)

改为:

self.hparams.n_gpu

此时即可正常运行:
但是默认使用cpu运行:
如果想使用gpu找到如下代码42行(或者是附近)

  parser.add_argument("--n_gpu", default=0)

将default值改为大于0即可推荐为1:(不然可能汇报其他错误)

5.验证模型

将刚刚训练的部分 action='store_true’将要测试的部分action='store_false’如下图所示
在这里插入图片描述

训练模型:

将代码

parser.add_argument("--do_eval", action='store_true', help="Whether to run training.")

改为:

parser.add_argument("--do_eval", action='store_false', help="Whether to run training.")

验证模型:

同样将代码:

parser.add_argument("--do_eval", action='store_true', help="Whether to run eval on the dev/test set.")

改为:

parser.add_argument("--do_eval", action='store_false', help="Whether to run eval on the dev/test set.")

修改完后运行代码

问题5:

TypeError: evaluate() missing 1 required positional argument: 'sents'

找到报错行332:
在这里插入图片描述
大概意思是缺一个参数sents:
经过观察发现下面377行附近有类似的获取sents的方法:
在这里插入图片描述

解决方法

所以将源代码;

dev_result = evaluate(dev_loader, model, args.paradigm, args.task)

改为:

sents, _ = read_line_examples_from_file(f'data/{args.task}/{args.dataset}/dev.txt')
dev_result = evaluate(dev_loader, model, args.paradigm, args.task, sents)

继续运行main.py代码
如下有结果了, 说明离成功不远了 但是还是有错误:
在这里插入图片描述

问题6:

Traceback (most recent call last):
  File "/home/wjg/workspace/GAS/main.py", line 334, in <module>
    if dev_result['f1'] > best_f1:
TypeError: tuple indices must be integers or slices, not str

大概意思是说dev_result是一个元组类型而不是字典, dev_result['f1']这样是错的

解决思路:

打印一下dev_result看看
在这里插入图片描述
确实是一个元组类型不能直接取f1;

({'precision': 0.6371681415929203, 'recall': 0.6545454545454545, 'f1': 0.6457399103139014}, {'precision': 0.6430678466076696, 'recall': 0.6606060606060606, 'f1': 0.6517189835575485})

先查看一下evaluate的返回值有两个 而dev_result, 返回值有两个, 就不可能是字典类型;在这里插入图片描述

解决方法:类似于问题5的处理

通过观察发现do_direct_eval(386行附近)里面的代码是这样处理的:
在这里插入图片描述
所以将我们代码:

dev_result = evaluate(dev_loader, model, args.paradigm, args.task, sents)

改为:

_, dev_result = evaluate(dev_loader, model, args.paradigm, args.task, sents) #_可以换成其他的变量名反正这里不用

接着运行main.py代码

问题7:

这个问题出现过, 和问题56一样

TypeError: evaluate() missing 1 required positional argument: 'sents'

解决方法:

只需要将代码:

test_result = evaluate(test_loader, model, args.paradigm, args.task)

改为:

sents, _ = read_line_examples_from_file(f'data/{args.task}/{args.dataset}/test.txt') # 注意这里是test.txt
_,  test_result = evaluate(test_loader, model, args.paradigm, args.task)

运行之后就可以正常跑了

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值