Transformers(7) - トークナイザー

今回は、トークナイザーを使ってみます。

(Transformersのインストールは完了している想定となります。)

トークナイザー

トークナイザーは自然言語の入力テキストを深層学習モデルの入力データに変換する処理です。

深層学習モデルの入力データはテンソルと呼ばれる多次元配列になります。

トークナイザーの準備

AutoTokenizerクラスの作成時に‘bert-base-cased’を指定すると、BERTモデル用のトークナイザーとなります。

[Google Colaboratory]

1
2
3
4
from transformers import AutoTokenizer

# トークナイザーの準備
tokenizer = AutoTokenizer.from_pretrained('bert-base-cased')

[実行結果]

1
2
3
4
5
6
7
8
Downloading: 100%
570/570 [00:00<00:00, 13.3kB/s]
Downloading: 100%
213k/213k [00:00<00:00, 563kB/s]
Downloading: 100%
436k/436k [00:00<00:00, 587kB/s]
Downloading: 100%
29.0/29.0 [00:00<00:00, 725B/s]

自然言語テキストをテンソルにエンコード

tokenizer.encodeを使うと、自然言語テキストをテンソルにエンコードすることができます。

[Google Colaboratory]

1
2
3
# 自然言語テキストをテンソルにエンコード
input = tokenizer.encode("Hello, I'm a single sentence!", return_tensors='pt', max_length=512, truncation=True)
print(input)

[実行結果]

1
tensor([[ 101, 8667,  117,  146,  112,  182,  170, 1423, 5650,  106,  102]])

テンソルを自然言語テキストにデコード

tokenizer.decodeを使うと、テンソルを自然言語テキストにデコードすることができます。

[Google Colaboratory]

1
2
# テンソルを自然言語テキストにデコード
print(tokenizer.decode(input.numpy()[0]))

[実行結果]

1
[CLS] Hello, I'm a single sentence! [SEP]

複数の自然言語テキストをテンソルにエンコード

tokenizer.encode_plusを使うと、複数の自然言語テキストをテンソルにエンコードすることができます。

[Google Colaboratory]

1
2
3
# 複数の自然言語テキストをテンソルにエンコード
inputs = tokenizer.encode_plus('This is a question', 'This is a context!', return_tensors='pt')
print(inputs)

戻り値の意味は次の通りです。

  • input_ids
    トークンIDの配列
  • token_type_ids
    複数の文章を判定するバイナリマスク
  • attention_mask
    パディング時に埋め込み文字かどうかを判定するバイナリマスク

[実行結果]

1
2
3
{'input_ids': tensor([[ 101, 1188, 1110,  170, 2304,  102, 1188, 1110,  170, 5618,  106,  102]]), 
'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]]),
'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}

テンソルを複数の自然言語テキストにデコード

tokenizer.decodeを使うと、テンソルを複数の自然言語テキストにデコードすることができます。

[Google Colaboratory]

1
2
# テンソルを複数の自然言語テキストにデコード
print(tokenizer.decode(inputs['input_ids'].numpy()[0]))

[実行結果]

1
[CLS] This is a question [SEP] This is a context! [SEP]

BERTのスペシャルトークンとしては、次のようなものがあります。

  • [CLS]
    文頭に埋め込むトークン(classification)
  • [SEP]
    文と文の間に埋め込むトークン(separator)
  • [PAD]
    指定された長さに満たさない文を埋めるトークン(padding)
  • [MASK]
    マスクしたトークン(mask)