【问题标题】:Get the value of '[UNK]' in BERT获取 BERT 中 '[UNK]' 的值
【发布时间】:2020-05-28 06:11:15
【问题描述】:

我设计了一个基于 BERT 的模型来解决 NER 任务。我正在使用 transformers 库和 "dccuchile/bert-base-spanish-wwm-cased" 预训练模型。当我的模型检测到一个实体但令牌是'[UNK]' 时,问题就来了。我怎么知道那个标记后面的字符串是什么?

我知道未知标记无法还原为原始标记,但我想至少在将输入传递给模型之前捕获该值。

代码真的很简单:

    sentenceIds = tokenizer.encode(sentence,add_special_tokens = True)

    inputs = pad_sequences([sentenceIds], maxlen=256, dtype="long", 
                              value=0, truncating="post", padding="post")

    att_mask = torch.tensor([[int(token_id > 0) for token_id in inputs[0]]]).to(device)
    inputs = torch.tensor(inputs).to(device)

    with torch.no_grad():        
        outputs = model(inputs, 
                          token_type_ids=None, 
                          attention_mask=att_mask)

如您所见,非常简单,只需标记化、填充或截断、创建 attentionMask 并调用模型。

我曾尝试使用regex,试图找到它周围的两个令牌之类的东西,但我无法正确解决它。

【问题讨论】:

  • 应该可以找出这个词是什么。您可以在对输入进行标记和编码时分享代码吗?
  • 我已经编辑了问题,添加了代码-

标签: python-3.x pytorch bert-language-model huggingface-transformers


【解决方案1】:

分词器分两步工作。首先,它进行预分词,基本上是空格分割和标点符号分割。让我们看一个随机的捷克语句子:

tokenizer.basic_tokenizer.tokenize("Kočka leze dírou.")

这给你:['kocka', 'leze', 'dirou', '.']

第二步,应用分词算法,得到:

tokenizer.tokenize("Kočka leze dírou.")

你会得到:['[UNK]', 'le', '##ze', 'di', '##ro', '##u', '.']

如果无法将token拆分成子词,整个词就变成[UNK]。以## 开头的标记会附加到之前的标记中,因此您可以通过这种方式找出[UNK] 最初的来源。

(在我看来,西班牙 WordPiece 标记器无法解析仅由拉丁字符组成的单词。)

【讨论】:

    猜你喜欢
    • 2021-12-12
    • 2021-11-26
    • 2021-07-25
    • 2021-07-01
    • 2021-11-29
    • 2020-05-18
    • 2020-08-17
    • 2021-05-31
    • 2020-09-17
    相关资源
    最近更新 更多