【问题标题】:Huggingface BERT Tokenizer add new tokenHuggingface BERT Tokenizer 添加新令牌
【发布时间】:2021-02-16 12:22:49
【问题描述】:

我将 Huggingface BERT 用于 NLP 任务。我的文本包含被分成子词的公司名称。

tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')
tokenizer.encode_plus("Somespecialcompany")
output: {'input_ids': [101, 2070, 13102, 8586, 4818, 9006, 9739, 2100, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}

现在我想将这些名称添加到标记器 ID 中,这样它们就不会被拆分。

tokenizer.add_tokens("Somespecialcompany")
output: 1

这将标记器的长度从 30522 扩展到 30523。

因此,所需的输出将是新 ID:

tokenizer.encode_plus("Somespecialcompany")
output: 30522

但是输出和之前一样:

output: {'input_ids': [101, 2070, 13102, 8586, 4818, 9006, 9739, 2100, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]}

所以我的问题是;将新标记添加到标记器以便我可以将它们与 tokenizer.encode_plus() 和 tokenizer.batch_encode_plus() 一起使用的正确方法是什么?

【问题讨论】:

  • 它适用于慢分词器。请为分词器库打开bug report

标签: bert-language-model huggingface-transformers huggingface-tokenizers


【解决方案1】:

我在github 上打开了一个错误报告。显然我只需要将“special_tokens”参数设置为“True”。

tokenizer.add_tokens(["somecompanyname"], special_tokens=True)
output: 30522

【讨论】:

  • 我仍然认为这是不正确的。请查看comment
  • 是的,我看到了评论。我猜你的观点是,两个标记器应该以相同的方式运行,是正确的。但它以我想要的方式与 special_tokes=True 一起使用,所以对我来说很好。
猜你喜欢
  • 2021-10-19
  • 2022-01-12
  • 2021-12-05
  • 2021-01-17
  • 2020-08-10
  • 1970-01-01
  • 2020-09-24
  • 2021-04-29
  • 2021-12-17
相关资源
最近更新 更多