获取 BERT 中“[UNK]”的值

Jav*_*ara 5 python-3.x pytorch bert-language-model huggingface-transformers

我设计了一个基于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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这非常简单,只需标记化、填充或截断、创建注意力掩码并调用模型即可。

我尝试过使用regex,试图找到它周围的两个标记以及类似的东西,但我无法正确解决它。

Jin*_*ich 3

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

\n\n
tokenizer.basic_tokenizer.tokenize("Ko\xc4\x8dka leze d\xc3\xadrou.")\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
tokenizer.tokenize("Ko\xc4\x8dka leze d\xc3\xadrou.")\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

如果无法将标记拆分为子词,则整个词将变为[UNK]。以 开头的标记##会附加到前面的标记中,这样您就可以找出[UNK]原始标记的来源。

\n\n

(对我来说,西班牙语 WordPiece 分词器无法解析仅由拉丁字符组成的单词,这似乎很奇怪。)

\n