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,试图找到它周围的两个标记以及类似的东西,但我无法正确解决它。
分词器分两步工作。首先,它进行预标记化,这基本上是按空格分割并分隔标点符号。让我们看一下随机的捷克语句子:
\n\ntokenizer.basic_tokenizer.tokenize("Ko\xc4\x8dka leze d\xc3\xadrou.")\nRun Code Online (Sandbox Code Playgroud)\n\n这给你:[\'kocka\', \'leze\', \'dirou\', \'.\']
第二步,应用分词分割算法,得到:
\n\ntokenizer.tokenize("Ko\xc4\x8dka leze d\xc3\xadrou.")\nRun Code Online (Sandbox Code Playgroud)\n\n你得到:[\'[UNK]\', \'le\', \'##ze\', \'di\', \'##ro\', \'##u\', \'.\']
如果无法将标记拆分为子词,则整个词将变为[UNK]。以 开头的标记##会附加到前面的标记中,这样您就可以找出[UNK]原始标记的来源。
(对我来说,西班牙语 WordPiece 分词器无法解析仅由拉丁字符组成的单词,这似乎很奇怪。)
\n| 归档时间: |
|
| 查看次数: |
8464 次 |
| 最近记录: |