3

我设计了一个基于 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,试图找到它周围的两个令牌以及类似的东西,但我无法正确解决它。

4

1 回答 1

2

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

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 标记器无法解析仅由拉丁字符组成的单词似乎很奇怪。)

于 2020-02-13T10:39:28.153 回答