max_length、padding、およびtruncation引数は、HuggingFaceのBertTokenizerFast.from_pretrained( 'bert-base-uncased')でどのように機能しますか?

Dec 11 2020

私はテキスト分類の問題に取り組んでおり、BERTモデルをベースとして使用し、その後に高密度レイヤーを使用します。3つの引数がどのように機能するのか知りたいですか?たとえば、次のように3つの文がある場合:

'My name is slim shade and I am an aspiring AI Engineer',
'I am an aspiring AI Engineer',
'My name is Slim'

では、これらの3つの引数は何をするのでしょうか?私が思うのは次のとおりです。

  1. max_length=5 長さ5のすべての文を厳密に保持します
  2. padding=max_length 3番目の文に1のパディングを追加します
  3. truncate=True 長さが厳密に5になるように、最初と2番目の文を切り捨てます。

私が間違っている場合は私を訂正してください。

以下は私が使用した私のコードです。

! pip install transformers==3.5.1

from transformers import BertTokenizerFast

tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')

tokens = tokenizer.batch_encode_plus(text,max_length=5,padding='max_length', truncation=True)
  
text_seq = torch.tensor(tokens['input_ids'])
text_mask = torch.tensor(tokens['attention_mask'])

回答

1 AshwinGeetD'Sa Dec 11 2020 at 23:58

あなたが仮定したことはほぼ正しいですが、いくつかの違いがあります。

max_length=5、はトークン化されたテキストの長さをmax_length 指定ます。デフォルトでは、BERTはワードピーストークン化を実行します。たとえば、「playing」という単語を「play」と「## ing」に分割し(これはあまり正確ではないかもしれませんが、単語の断片化について理解するのに役立つだけです)、その後に[CLS]トークンを追加します。文、および文[SEP]の終わりのトークン。したがって、最初に文をトークン化し、max_length-2(if truncation=True)に切り捨ててから[CLS]、最初に先頭に[SEP]追加し、最後にトークンを追加します(したがって、全長はmax_length

padding='max_length'、この例では5、追加[CLS][SEP]トークンの後に長さが超過するため、3番目の例がパディングされることはあまり明白ではありません。ただし、max_lengthが10の場合、トークン化されたテキストはに対応します。ここ[101, 2026, 2171, 2003, 11754, 102, 0, 0, 0, 0]で、101はのID [CLS]、102は[SEP]トークンのIDです。したがって、すべてのテキストを次の長さにするためにゼロが埋め込まれますmax_length

同様に、truncate=Truemax_lengthが厳密に守られていることを確認します。つまり、長い文は次のmax_length場合にのみ切り捨てられます。truncate=True