3

AllenNLP Interpret 和 Textattack 应该“攻击”模型以找出它们生成输出的原因。我主要使用 spaCy 来训练我的模型,并且想尝试其中的任何一个框架,看看它们是否能让我更好地理解我的模型。但似乎它们与 spaCy 模型不兼容(或者我做错了什么)。对于 Textattack,我尝试遵循以下示例: https : //textattack.readthedocs.io/en/latest/quickstart/overview.html 但将模型与 spaCy 模型交换。那效果不好,因为在 TokenizedText 类里面有

ids = tokenizer.encode(text)

这会引发错误,因为 spaCy 的 Tokenizer 对象没有名为encode()的方法。我注意到 Textattack 的 Tokenizer 和 SpacyTokenizer 有多个子类。如果那是 Tokenizer 的兼容版本,为什么不自动检测并调用它呢?我尝试交换它们,但我对 SpacyTokenizer 所需的一些参数感到困惑:

def __init__(self, word2id, oov_id, pad_id, max_seq_length=128)

word2id是一个 word-id 配对,但是什么样的 id 呢?它是针对词汇中的所有单词还是仅针对这个特定句子的标记? oov_id更令人困惑,因为“oov”代表“o​​ut-of-variable”,而不是 spaCy 中的“out-of-vocabulary”。此外,在 spaCy 中,它是一个布尔值,而不是一个 id。 pad_id根本没有解释,我不知道它是什么。

所以看起来Textattack和spaCy之间有一些联系,但我不知道如何把它放在一个工作示例中。

当谈到 AllenNLP Interpret 时,我尝试使用 hotflip 攻击,但首先发生的是以下错误消息:

for i in self.vocab._index_to_token[self.namespace]:
AttributeError: 'spacy.vocab.Vocab' object has no attribute '_index_to_token'

所以看起来这个框架也不适合 spaCy,因为它需要_index_to_token,但 spaCy 的 Vocab 没有。

有人可以帮我吗?

4

1 回答 1

0

我是 TextAttack 的创建者之一。我们内置的 SpaCyTokenizer 使用 SpaCy 将单词转换为标记,但需要一个字典,该字典应该将标记转换为相应的 ID。这样您就可以传入嵌入的单词到 ID 映射,并将这些 ID 与 SpaCy 令牌一起使用。这就是我们的模型在幕后工作的方式。

我需要更多信息来提供帮助。训练模型时,如何将文本转换为 ID?您能否提供一段代码,使用您的标记器将字符串转换为标记 ID 列表?然后我可以向您展示如何包装您的标记器以使用 TextAttack。

希望这是有道理的。默认情况下,我们肯定可以更聪明地使用标记器并支持标记器,我们将在未来的更新中继续努力。

于 2020-05-19T17:56:13.757 回答