标签: huggingface-tokenizers

如何向标记器添加新的特殊标记?

我想构建一个多类分类模型,将会话数据作为 BERT 模型的输入(使用 bert-base-uncased)。

提问:我想问一个问题。
答:当然可以,问吧。
询问:今天天气怎么样?
答:天气很好,阳光明媚。
问题:好的,很高兴知道。
回答:您还想了解其他信息吗?

除此之外,我还有两个输入。

我想知道是否应该在对话中添加特殊标记,以使其对 BERT 模型更有意义,例如:

[CLS]QUERY:我想问一个问题。[EOT]
答案:当然可以,问吧。[EOT]
查询:今天天气怎么样?[EOT]
答案:天气很好,阳光明媚。[EOT]
查询:好的,很高兴知道。[EOT]
解答:您还想了解其他信息吗?[九月]

但我无法添加新的 [EOT] 特殊令牌。
或者我应该为此使用 [SEP] 令牌?

编辑:重现步骤

from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")

print(tokenizer.all_special_tokens) # --> ['[UNK]', '[SEP]', '[PAD]', '[CLS]', '[MASK]']
print(tokenizer.all_special_ids)    # --> [100, 102, 0, 101, 103]

num_added_toks = tokenizer.add_tokens(['[EOT]'])
model.resize_token_embeddings(len(tokenizer))  # --> Embedding(30523, 768)

tokenizer.convert_tokens_to_ids('[EOT]')  # --> 30522

text_to_encode = '''QUERY: I want to ask a question. [EOT]
ANSWER: Sure, ask away. …
Run Code Online (Sandbox Code Playgroud)

bert-language-model huggingface-tokenizers sentencepiece

10
推荐指数
1
解决办法
2万
查看次数

Huggingface 保存标记器

我正在尝试将标记生成器保存在 Huggingface 中,以便以后可以从不需要访问互联网的容器中加载它。

BASE_MODEL = "distilbert-base-multilingual-cased"
tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL)
tokenizer.save_vocabulary("./models/tokenizer/")
tokenizer2 = AutoTokenizer.from_pretrained("./models/tokenizer/")
Run Code Online (Sandbox Code Playgroud)

但是,最后一行给出了错误:

OSError: Can't load config for './models/tokenizer3/'. Make sure that:

- './models/tokenizer3/' is a correct model identifier listed on 'https://huggingface.co/models'

- or './models/tokenizer3/' is the correct path to a directory containing a config.json file
Run Code Online (Sandbox Code Playgroud)

变压器版本:3.1.0

不幸的是,如何从 Pytorch 中的预训练模型加载保存的标记器并没有帮助。

编辑 1

感谢下面@ashwin 的回答,我save_pretrained改为尝试,但出现以下错误:

OSError: Can't load config for './models/tokenizer/'. Make sure that:

- './models/tokenizer/' is a correct model identifier listed on 'https://huggingface.co/models'

- or …
Run Code Online (Sandbox Code Playgroud)

huggingface-transformers huggingface-tokenizers

9
推荐指数
1
解决办法
5917
查看次数

Transformers v4.x:将慢速分词器转换为快速分词器

我正在关注变压器的预训练模型xlm-roberta-large-xnli示例

from transformers import pipeline
classifier = pipeline("zero-shot-classification",
                      model="joeddav/xlm-roberta-large-xnli")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

ValueError: Couldn't instantiate the backend tokenizer from one of: (1) a `tokenizers` library serialization file, (2) a slow tokenizer instance to convert or (3) an equivalent slow tokenizer class to instantiate and convert. You need to have sentencepiece installed to convert a slow tokenizer to a fast one.
Run Code Online (Sandbox Code Playgroud)

我用的是变形金刚版 '4.1.1'

python nlp huggingface-transformers huggingface-tokenizers

9
推荐指数
3
解决办法
4379
查看次数

len(tokenizer) 和 tokenizer.vocab_size 有什么区别

我正在尝试向预训练的 HuggingFace Transformers 模型的词汇表中添加一些新单词。我执行了以下操作来更改分词器的词汇并增加模型的嵌入大小:

tokenizer.add_tokens(['word1', 'word2', 'word3', 'word4'])
model.resize_token_embeddings(len(tokenizer))
print(len(tokenizer)) # outputs len_vocabulary + 4
Run Code Online (Sandbox Code Playgroud)

但是在我的语料库上训练模型并保存后,我发现保存的分词器词汇量没有改变。再次检查后发现上述代码并没有改变词汇量大小(tokenizer.vocab_size仍然相同),只有len(tokenizer)发生了变化。

所以现在我的问题是;tokenizer.vocab_size 和 len(tokenizer) 有什么区别?

nlp tokenize huggingface-transformers huggingface-tokenizers

9
推荐指数
1
解决办法
6988
查看次数

要求截断为 max_length 但未提供最大长度,并且模型没有预定义的最大长度。默认不截断

我正在按照 HuggingFace 的序列分类教程学习 NLP https://huggingface.co/transformers/custom_datasets.html#sequence-classification-with-imdb-reviews 原始代码运行没有问题。但是,当我尝试加载不同的标记生成器(例如来自 的标记生成器)时google/bert_uncased_L-4_H-256_A-4,会出现以下警告:

Asking to truncate to max_length but no maximum length is provided and the model has no predefined maximum length. Default to no truncation.

from transformers import AutoTokenizer
from pathlib import Path

def read_imdb_split(split_dir):
    split_dir = Path(split_dir)
    texts = []
    labels = []
    for label_dir in ["pos", "neg"]:
        for text_file in (split_dir/label_dir).iterdir():
            texts.append(text_file.read_text())
            labels.append(0 if label_dir is "neg" else 1)

    return texts[:50], labels[:50]

if __name__ == '__main__':
    test_texts, test_labels = read_imdb_split('aclImdb/test')
    tokenizer …
Run Code Online (Sandbox Code Playgroud)

huggingface-transformers huggingface-tokenizers

9
推荐指数
1
解决办法
2万
查看次数

BertModel 变压器输出字符串而不是张量

我正在关注这个使用 BERT 和Huggingface编写情感分析分类器的教程,我有一个非常奇怪的行为。当使用示例文本尝试 BERT 模型时,我得到一个字符串而不是隐藏状态。这是我正在使用的代码:

import transformers
from transformers import BertModel, BertTokenizer

print(transformers.__version__)

PRE_TRAINED_MODEL_NAME = 'bert-base-cased'
PATH_OF_CACHE = "/home/mwon/data-mwon/paperChega/src_classificador/data/hugingface"

tokenizer = BertTokenizer.from_pretrained(PRE_TRAINED_MODEL_NAME,cache_dir = PATH_OF_CACHE)

sample_txt = 'When was I last outside? I am stuck at home for 2 weeks.'

encoding_sample = tokenizer.encode_plus(
  sample_txt,
  max_length=32,
  add_special_tokens=True, # Add '[CLS]' and '[SEP]'
  return_token_type_ids=False,
  padding=True,
  truncation = True,
  return_attention_mask=True,
  return_tensors='pt',  # Return PyTorch tensors
)

bert_model = BertModel.from_pretrained(PRE_TRAINED_MODEL_NAME,cache_dir = PATH_OF_CACHE)


last_hidden_state, pooled_output = bert_model(
  encoding_sample['input_ids'],
  encoding_sample['attention_mask']
) …
Run Code Online (Sandbox Code Playgroud)

bert-language-model huggingface-transformers huggingface-tokenizers

8
推荐指数
2
解决办法
2133
查看次数

使用 TFBertModel 和 HuggingFace 变压器的 AutoTokenizer 构建模型时出现输入问题

我正在尝试构建图中所示的模型: 在此输入图像描述

transformers我通过以下方式从 HuggingFace 获得了预训练的 BERT 和相应的分词器:

from transformers import AutoTokenizer, TFBertModel
model_name = "dbmdz/bert-base-italian-xxl-cased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
bert = TFBertModel.from_pretrained(model_name)
Run Code Online (Sandbox Code Playgroud)

该模型将被输入一系列意大利推文,并需要确定它们是否具有讽刺意味。

我在构建模型的初始部分时遇到问题,该部分获取输入并将其提供给分词器,以获得可以提供给 BERT 的表示。

我可以在模型构建上下文之外做到这一点:

my_phrase = "Ciao, come va?"
# an equivalent version is tokenizer(my_phrase, other parameters)
bert_input = tokenizer.encode(my_phrase, add_special_tokens=True, return_tensors='tf', max_length=110, padding='max_length', truncation=True) 
attention_mask = bert_input > 0
outputs = bert(bert_input, attention_mask)['pooler_output']
Run Code Online (Sandbox Code Playgroud)

但我在构建执行此操作的模型时遇到了麻烦。以下是构建此类模型的代码(问题出在前 4 行):

def build_classifier_model():
  text_input = tf.keras.layers.Input(shape=(), dtype=tf.string, name='text')
  encoder_inputs = tokenizer(text_input, return_tensors='tf', add_special_tokens=True, max_length=110, padding='max_length', truncation=True)
  outputs = bert(encoder_inputs)
  net = outputs['pooler_output'] …
Run Code Online (Sandbox Code Playgroud)

keras tensorflow bert-language-model huggingface-transformers huggingface-tokenizers

8
推荐指数
1
解决办法
5516
查看次数

AutoTokenizer.from_pretrained 无法加载本地保存的预训练分词器 (PyTorch)

我是 PyTorch 的新手,最近我一直在尝试使用 Transformers。我正在使用 HuggingFace 提供的预训练分词器。
我成功下载并运行它们。但如果我尝试保存它们并再次加载,则会发生一些错误。
如果我用来 AutoTokenizer.from_pretrained下载分词器,那么它就可以工作。

[1]:    tokenizer = AutoTokenizer.from_pretrained('distilroberta-base')
        text = "Hello there"
        enc = tokenizer.encode_plus(text)
        enc.keys()

Out[1]: dict_keys(['input_ids', 'attention_mask'])
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用保存它tokenizer.save_pretrained("distilroberta-tokenizer")并尝试在本地加载它,则会失败。

[2]:    tmp = AutoTokenizer.from_pretrained('distilroberta-tokenizer')


---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
/opt/conda/lib/python3.7/site-packages/transformers/configuration_utils.py in get_config_dict(cls, pretrained_model_name_or_path, **kwargs)
    238                 resume_download=resume_download,
--> 239                 local_files_only=local_files_only,
    240             )

/opt/conda/lib/python3.7/site-packages/transformers/file_utils.py in cached_path(url_or_filename, cache_dir, force_download, proxies, resume_download, user_agent, extract_compressed_file, force_extract, local_files_only)
    266         # File, but it doesn't exist.
--> 267         raise EnvironmentError("file {} not found".format(url_or_filename))
    268     else:

OSError: file …
Run Code Online (Sandbox Code Playgroud)

python deep-learning pytorch huggingface-transformers huggingface-tokenizers

7
推荐指数
2
解决办法
3万
查看次数

使用数据集、标记器和火炬数据集和数据加载器进行动态标记化

我有一个关于“即时”标记化的问题。这个问题是通过阅读“如何使用 Transformers 和 Tokenizers 从头开始​​训练新的语言模型”引发。最后有这样一句话:“如果您的数据集非常大,您可以选择动态加载和标记示例,而不是作为预处理步骤”。我尝试提出一个将datasets和结合起来的解决方案tokenizers,但没有找到一个好的模式。

我想解决方案需要将数据集包装到 Pytorch 数据集中。

作为文档中的具体示例

import torch

class SquadDataset(torch.utils.data.Dataset):
    def __init__(self, encodings):
        # instead of doing this beforehand, I'd like to do tokenization on the fly
        self.encodings = encodings 

    def __getitem__(self, idx):
        return {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}

    def __len__(self):
        return len(self.encodings.input_ids)

train_dataset = SquadDataset(train_encodings)
Run Code Online (Sandbox Code Playgroud)

如何利用标记器的矢量化功能通过“即时”标记化来实现这一点?

huggingface-transformers huggingface-tokenizers gpt-2

7
推荐指数
1
解决办法
4085
查看次数

为什么 Huggingface t5 分词器会忽略一些空格?

我正在使用 T5 模型和分词器来执行下游任务。我想向标记生成器添加某些空格,例如行结尾(\\t)和制表符(\\t)。添加这些标记可以工作,但不知何故标记器总是忽略第二个空格。因此,它将序列标记\xe2\x80\x9c\\n\\n\xe2\x80\x9d为单行结尾,并将序列"\\n\\n\\n\\n"标记为两个行结尾,依此类推。请参阅下文进行重现。

\n
from transformers import T5Tokenizer\ntokenizer = T5Tokenizer.from_pretrained("t5-large")\ntokenizer.add_tokens(["\\n"])\n\ntokenizer.encode("\\n") # returns [32100, 1] as expected\ntokenizer.encode("\\n\\n") # returns [32100, 1] but expected would be [32100, 32100, 1]\ntokenizer.encode("\\n\\n\\n\\n") # returns [32100, 32100, 1] but expected would be [32100, 32100, 32100, 32100, 1]\n
Run Code Online (Sandbox Code Playgroud)\n

这种行为背后的原因是什么?这是一个错误还是与分词器工作原理相关的东西?我注意到这只发生在添加的空格上,而不会发生在其他字符上。

\n

有没有办法防止分词器忽略重复的空格?

\n

huggingface-transformers huggingface-tokenizers sentencepiece

7
推荐指数
1
解决办法
2542
查看次数