使用新的 torch vocab 方法更新旧代码(stoi 和 itos 方法已更改)

问题描述 投票:0回答:1

我正在尝试按照这篇 Medium 文章创建一个日英翻译模型。 https://arusl.medium.com/japanese-english-language-translation-with-transformer-using-pytorch-243738146806 一切都运行完美,直到倒数第二个单元格,当我运行翻译函数时出错。错误具体在这一行。

tokens = [BOS_IDX] + [src_vocab.stoi[tok] for tok in src_tokenizer.encode(src, out_type=str)]+ [EOS_IDX]

错误:AttributeError:'Vocab'对象没有属性'stoi'。自本文撰写以来,根据 torchtext 文档 (https://pytorch.org/text/stable/vocab.html),方法 .stoi 已更改为 get_stoi() → Dict[str, int]。然而,当我尝试将该行更改为以下内容时,我收到错误“计数器对象没有属性‘get_stoi’。”

tokens = [BOS_IDX] + [src_vocab.get_stoi()[tok] for tok in src_tokenizer.encode(src, out_type=str)]+ [EOS_IDX]

itos 和 get_itos() 方法也是如此。如果我尝试使用该方法 任何有关如何完成这项工作的帮助将不胜感激,因为我现在非常目瞪口呆。

这里提出了类似的问题,但我不知道如何实现答案或使其在这种情况下发挥作用。 “Vocab”对象没有属性“itos”

编辑:这个函数似乎很可疑,因为它是从计数器创建词汇......有更好的方法来做到这一点吗?

def build_vocab(sentences, tokenizer):
  counter = Counter()
  for sentence in sentences:
    counter.update(tokenizer.encode(sentence, out_type=str))
  return Vocab(counter)

谢谢!

python pytorch nlp torch torchtext
1个回答
0
投票

看起来您在将 Medium 文章中的代码改编为 PyTorch 的 torchtext 库的最新版本时遇到了问题。您遇到的错误与 API 中的更改有关,特别是与 Vocab 类及其方法有关。我可以帮助您修改代码以使用更新的 API。

在最新版本的 torchtext 中,您应该直接在 Vocab 对象上使用 .stoi 和 .itos 方法,并且标记生成器中的 .encode 方法现在返回整数列表而不是字符串。以下是调整代码来解决问题的方法:

tokens = [BOS_IDX] + [src_vocab.stoi[tok] for tok in src_tokenizer(src)] + [EOS_ID
© www.soinside.com 2019 - 2024. All rights reserved.