问题描述
我正在使用来自 HuggingFace 的 distilBertTokenizer
标记器。
我想通过在空间上简单地分割文本来标记我的文本:
["Don't","you","love","?","Transformers?","We","sure","do."]
而不是默认行为,就像这样:
["Do","n't","Transformers","do","."]
我阅读了他们关于 Tokenization 的一般文档以及特别关于 BERT Tokenizer 的文档,但找不到这个简单问题的答案:(
我假设它应该是加载Tokenizer时的一个参数,但在参数列表中找不到它......
编辑: 重现的最小代码示例:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('distilbert-base-cased')
tokens = tokenizer.tokenize("Don't you love ? Transformers? We sure do.")
print("Tokens: ",tokens)
解决方法
这不是它的工作原理。转换器库提供了不同类型的 tokenizers。在 distilbert 的情况下,它是一个 wordpiece tokenizer ,它具有用于训练相应模型的定义词汇表,因此不提供此类修改(据我所知)。您可以做的是使用 python 字符串的 split() 方法:
text = "Don't you love ? Transformers? We sure do."
tokens = text.split()
print("Tokens: ",tokens)
输出:
Tokens: ["Don't",'you','love','?','Transformers?','We','sure','do.']
如果您正在寻找更复杂的标记化,同时也考虑标点符号,您可以使用 basic_tokenizer:
from transformers import DistilBertTokenizer
tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-cased')
tokens = tokenizer.basic_tokenizer.tokenize(text)
print("Tokens: ",tokens)
输出:
Tokens: ['Don',"'",'t','Transformers','do','.']
,
编辑:正如评论中指出的那样,这不符合我的要求。
这是我尝试过的一个想法:
from transformers import DistilBertModel,DistilBertTokenizer
import torch
text_str = "also du fängst an mit der Stadtrundfahrt"
# create DistilBERT tokenizer and model
tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-german-cased')
model = DistilBertModel.from_pretrained('distilbert-base-german-cased')
# check if tokens are correct
tokens = tokenizer.basic_tokenizer.tokenize(text_str)
print("Tokens: ",tokens)
# Encode the curent text
input_ids = torch.tensor(tokenizer.encode(tokens)).unsqueeze(0)
outputs = model(input_ids)
last_hidden_states = outputs[0]
print(last_hidden_states.shape)
print(last_hidden_states[0,1:-1].shape)
print(last_hidden_states)
关键是首先使用 BasicTokenizer
(由@cronoik 提出)分割标记,然后在编码时使用已经标记化的文本。