从encode() 在 Transformer Bert 模型中返回的令牌

Edv*_*Beq 3 python nlp machine-learning bert-language-model huggingface-transformers

我有一个用于情绪分析的小数据集。Bert分类器将是一个简单的 KNN,但我想从库中获取模型的词嵌入transformers。请注意,我刚刚发现这个库 - 我仍在学习。

因此,查看在线示例,我试图了解从模型返回的尺寸。

例子:

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

tokens = tokenizer.encode(["Hello, my dog is cute", "He is really nice"])
print(tokens)

tokens = tokenizer.encode("Hello, my dog is cute", "He is really nice")
print(tokens)

tokens = tokenizer.encode(["Hello, my dog is cute"])
print(tokens)

tokens = tokenizer.encode("Hello, my dog is cute")
print(tokens)
Run Code Online (Sandbox Code Playgroud)

输出如下:

[101, 100, 100, 102]

[101, 7592, 1010, 2026, 3899, 2003, 10140, 102, 2002, 2003, 2428, 3835, 102]

[101, 100, 102]

[101, 7592, 1010, 2026, 3899, 2003, 10140, 102]
Run Code Online (Sandbox Code Playgroud)

我似乎找不到相关文档encode()- 我不知道为什么当输入作为列表传递时它会返回不同的内容。这是在做什么?

此外,是否有一种方法可以传递单词令牌并获取实际单词 - 来解决上述问题?

先感谢您

cro*_*oik 8

您可以调用tokenizer.convert_ids_to_tokens()来获取 id 的实际令牌:

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

tokens = []

tokens.append(tokenizer.encode(["Hello, my dog is cute", "He is really nice"]))

tokens.append(tokenizer.encode("Hello, my dog is cute", "He is really nice"))

tokens.append(tokenizer.encode(["Hello, my dog is cute"]))

tokens.append(tokenizer.encode("Hello, my dog is cute"))

for t in tokens:
    print(tokenizer.convert_ids_to_tokens(t))
Run Code Online (Sandbox Code Playgroud)

输出:

['[CLS]', '[UNK]', '[UNK]', '[SEP]']
['[CLS]', 'hello', ',', 'my', 'dog', 'is', 'cute', '[SEP]', 'he', 'is', 'really', 'nice', '[SEP]']
['[CLS]', '[UNK]', '[SEP]']
['[CLS]', 'hello', ',', 'my', 'dog', 'is', 'cute', '[SEP]']
Run Code Online (Sandbox Code Playgroud)

正如您在这里所看到的,您的每个输入都被标记化,并且根据您的模型 (bert) 添加了特殊标记。编码函数没有正确处理您的列表,这可能是一个错误或预期的行为,具体取决于您如何定义它,因为它们是一种批处理方法batch_encode_plus

['[CLS]', '[UNK]', '[UNK]', '[SEP]']
['[CLS]', 'hello', ',', 'my', 'dog', 'is', 'cute', '[SEP]', 'he', 'is', 'really', 'nice', '[SEP]']
['[CLS]', '[UNK]', '[SEP]']
['[CLS]', 'hello', ',', 'my', 'dog', 'is', 'cute', '[SEP]']
Run Code Online (Sandbox Code Playgroud)

输出:

{'input_ids': [[101, 7592, 1010, 2026, 3899, 2003, 10140, 102], [101, 2002, 2003, 2428, 3835, 102]]}
Run Code Online (Sandbox Code Playgroud)

我不确定为什么编码方法没有记录,但可能是huggingface希望我们直接使用call方法:

tokenizer.batch_encode_plus(["Hello, my dog is cute", "He is really nice"], return_token_type_ids=False, return_attention_mask=False)
Run Code Online (Sandbox Code Playgroud)

输出:

[{'input_ids': [[101, 7592, 1010, 2026, 3899, 2003, 10140, 102], [101, 2002, 2003, 2428, 3835, 102]]}, {'input_ids': [101, 7592, 1010, 2026, 3899, 2003, 10140, 102, 2002, 2003, 2428, 3835, 102]}, {'input_ids': [[101, 7592, 1010, 2026, 3899, 2003, 10140, 102]]}, {'input_ids': [101, 7592, 1010, 2026, 3899, 2003, 10140, 102]}]

Run Code Online (Sandbox Code Playgroud)