web-dev-qa-db-ja.com

BERTの「[UNK]」の値を取得します

BERタスクに基づいてNERタスクを解決するモデルを設計しました。 "dccuchile/bert-base-spanish-wwm-cased"の事前トレーニング済みモデルでtransformersライブラリを使用しています。モデルがエンティティを検出したが、トークンが'[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を使用して、周りにある2つのトークンとそのようなものを見つけようとしましたが、適切に解決できません。

トークナイザーは2つのステップで機能します。まず、基本的にスペースで分割し、句読点を分離する、事前トークン化を行います。ランダムなチェコの文でそれを見てみましょう:

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

これはあなたに与えます:['kocka', 'leze', 'dirou', '.']

2番目のステップでは、Wordピース分割アルゴリズムを適用するため、次のようになります。

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

取得します:['[UNK]', 'le', '##ze', 'di', '##ro', '##u', '.']

トークンをサブワードに分割する方法がない場合、ワード全体が[UNK]になります。 ##で始まるトークンは前のトークンに追加されるので、[UNK]が最初にどこから来たかを知ることができます。

(そして、スペイン語のWordPieceトークナイザーがラテン文字のみで構成される単語を解析できないのは奇妙に思えます。)

1
Jindřich