从 encode() 返回到转换器 Bert 模型中的令牌
Tokens returned in transformers Bert model from encode()
我有一个用于情绪分析的小型数据集。分类器将是一个简单的 KNN,但我想从 transformers
库中使用 Bert
模型获取词嵌入。请注意,我刚刚发现这个库 - 我还在学习中。
查看在线示例,我试图了解从模型返回的维度。
示例:
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)
输出如下:
[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]
我似乎找不到 encode()
的文档 - 我不知道为什么当输入作为列表传递时 returns 不同的东西。这是在做什么?
此外,是否有一种方法可以传递单词标记并取回实际单词 - 以解决上述问题?
提前致谢
您可以调用 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))
输出:
['[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]']
正如您在此处看到的,您的每个输入都已标记化,并根据您的模型 (bert) 添加了特殊标记。 encode 函数没有正确处理您的列表,这可能是一个错误或预期的行为,具体取决于您如何定义它,因为它们是一种批处理方法 batch_encode_plus
:
tokenizer.batch_encode_plus(["Hello, my dog is cute", "He is really nice"], return_token_type_ids=False, return_attention_mask=False)
输出:
{'input_ids': [[101, 7592, 1010, 2026, 3899, 2003, 10140, 102], [101, 2002, 2003, 2428, 3835, 102]]}
我不确定为什么没有记录 encode 方法,但可能是 huggingface 希望我们直接使用 call 方法:
tokens = []
tokens.append(tokenizer(["Hello, my dog is cute", "He is really nice"], return_token_type_ids=False, return_attention_mask=False))
tokens.append(tokenizer("Hello, my dog is cute", "He is really nice", return_token_type_ids=False, return_attention_mask=False))
tokens.append(tokenizer(["Hello, my dog is cute"], return_token_type_ids=False, return_attention_mask=False))
tokens.append(tokenizer("Hello, my dog is cute", return_token_type_ids=False, return_attention_mask=False))
print(tokens)
输出:
[{'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]}]
我有一个用于情绪分析的小型数据集。分类器将是一个简单的 KNN,但我想从 transformers
库中使用 Bert
模型获取词嵌入。请注意,我刚刚发现这个库 - 我还在学习中。
查看在线示例,我试图了解从模型返回的维度。
示例:
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)
输出如下:
[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]
我似乎找不到 encode()
的文档 - 我不知道为什么当输入作为列表传递时 returns 不同的东西。这是在做什么?
此外,是否有一种方法可以传递单词标记并取回实际单词 - 以解决上述问题?
提前致谢
您可以调用 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))
输出:
['[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]']
正如您在此处看到的,您的每个输入都已标记化,并根据您的模型 (bert) 添加了特殊标记。 encode 函数没有正确处理您的列表,这可能是一个错误或预期的行为,具体取决于您如何定义它,因为它们是一种批处理方法 batch_encode_plus
:
tokenizer.batch_encode_plus(["Hello, my dog is cute", "He is really nice"], return_token_type_ids=False, return_attention_mask=False)
输出:
{'input_ids': [[101, 7592, 1010, 2026, 3899, 2003, 10140, 102], [101, 2002, 2003, 2428, 3835, 102]]}
我不确定为什么没有记录 encode 方法,但可能是 huggingface 希望我们直接使用 call 方法:
tokens = []
tokens.append(tokenizer(["Hello, my dog is cute", "He is really nice"], return_token_type_ids=False, return_attention_mask=False))
tokens.append(tokenizer("Hello, my dog is cute", "He is really nice", return_token_type_ids=False, return_attention_mask=False))
tokens.append(tokenizer(["Hello, my dog is cute"], return_token_type_ids=False, return_attention_mask=False))
tokens.append(tokenizer("Hello, my dog is cute", return_token_type_ids=False, return_attention_mask=False))
print(tokens)
输出:
[{'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]}]