在Google Colab运行EditNTS报pickle协议5不支持错误及模型使用咨询
EditNTS运行问题解决方案
1. pickle协议5报错修复
报错原因:你本地生成pickle文件用的是Python 3.8+版本,默认使用pickle协议5,而Colab当前环境的Python 3.7自带的标准库pickle不支持该版本协议。你之前的修改不生效是因为pd.read_pickle内部默认调用标准库的pickle模块,不会使用你手动导入的pickle5。
修复步骤:
- 先安装pickle5:
!pip install pickle5 - 替换data.py中原有的pandas读取pkl代码:
原来的代码:
self.df = pd.read_pickle(data_path)
替换为:
import pickle5 as pickle with open(data_path, 'rb') as f: self.df = pickle.load(f)
可选替代方案:将Colab的Python版本升级到3.8及以上,Python 3.8开始原生支持pickle协议5,不需要额外修改读取代码。
2. 模型逐句简化调用方案
拿到main.py返回的模型实例后,新增自定义推理函数即可实现逐句处理,示例代码如下:
import torch def simplify_single_sentence(complex_sent, model, vocab, max_gen_len=50, beam_size=3, use_cuda=True): # 输入句预处理,需和训练阶段的分词、映射规则完全一致 token_list = complex_sent.strip().lower().split() src_id_list = [vocab.stoi[token] if token in vocab.stoi else vocab.unk_id for token in token_list] src_tensor = torch.tensor(src_id_list).unsqueeze(0) if use_cuda: src_tensor = src_tensor.cuda() # 调用模型生成接口 pred_id_list = model.generate(src_tensor, max_length=max_gen_len, beam_size=beam_size) # 生成结果转换为文本 pred_token_list = [ vocab.itos[id] for id in pred_id_list[0] if id not in {vocab.sos_id, vocab.eos_id, vocab.pad_id} ] return ' '.join(pred_token_list) # 逐句处理复杂文档示例 complex_doc = [ "复杂句1", "复杂句2" ] simple_doc = [simplify_single_sentence(sent, model, vocab) for sent in complex_doc]
注意事项:
- 调用前需确认模型已加载训练好的权重
- 预处理规则必须和训练阶段完全一致,否则会出现OOV过多、生成效果差的问题
- 如果不需要用GPU,把use_cuda设为False即可
内容的提问来源于stack exchange,提问作者joey
相关产品推荐
相关产品推荐

