0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HuggingFaceのtokenizerとbertを触ってみた

Last updated at Posted at 2022-09-10

huggingfaceより提供されているtransformersを使って出力を確認します。
tokenizerは文字列を数値に変換するためのものです。モデルそのものは文字列を扱えないため数値に変換する必要があります。bertにトークン化した文章を入力すると各単語を768次元のベクトルに変換して返してくれます。

まずはライブラリをinstallします。

pip install transformers

bertモデルを使用します。提供されているモデルは以下より確認できます。
https://huggingface.co/models

from transformers import AdamW, AutoModel, AutoTokenizer

MODEL_NAME='bert-base-uncased'
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model=AutoModel.from_pretrained(MODEL_NAME)

準備は済んだのでそれでは使ってみましょう。
まずは "i am a man" という文字列を入れてみます。

tokenizer("i am a man")

#=> {'input_ids': [101, 1045, 2572, 1037, 2158, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1]}

出力はinput_ids、token_type_ids、attention_maskが帰ってきます。
input_idsが文字列を数値にしたもので、文頭と文末にCLSとSEPという特殊なトークンがついて帰ってきます。"i am a man" => "CLS i am a man SEP" =>"101, 1045, 2572, 1037, 2158, 102"という風に変換されます。

tokenizer.encode("i am a man")


#=> [101, 1045, 2572, 1037, 2158, 102]

tokenizer.encodeとするとinput_idsだけを返してくれます。

tokenizer.tokenize("i am a man")

#=> ['i', 'am', 'a', 'man']

tokenizer.tokenizeとすると分かち書きと言って単語ごとに分けて返してくれます。

tokenizer("i am a man",return_tensors='pt')

#=> {'input_ids': tensor([[ 101, 1045, 2572, 1037, 2158,  102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]])}

return_tensors='pt'とすると、モデルに入力できる形にしてくれます。ptはpytorchです。

次に大文字と小文字を入力し結果を確認します。

tokenizer("i am a man")

#=> {'input_ids': [101, 1045, 2572, 1037, 2158, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1]}
tokenizer("I AM A MAN")

#=>{'input_ids': [101, 1045, 2572, 1037, 2158, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1]}

結果は同じになりましたね!モデルを'bert-base-uncased'にすると大文字小文字を区別しません。'bert-base-cased'を使用すると大文字小文字も区別します。

次にbertを触ってみます。

input=tokenizer("i am a man",return_tensors='pt')
out=model(input_ids = input['input_ids'],
      token_type_ids = input['token_type_ids'],
      attention_mask = input['attention_mask'],
      return_dict=False)

print(type(out))
print(len(out))

#=> <class 'tuple'>
    2

タプルで2つの出力が得られました。中身を見てみましょう。

print(out[0].shape)
print(out[1].shape)

#=>torch.Size([1, 6, 768])
   torch.Size([1, 768])

一つ目の出力は各単語のベクトルが帰ってきます。真ん中の6は文章の単語数4とCLSとSEPを入れた6になっています。
文書分類では先頭のCLSトークンが文章を表しているとみなし、これを特徴量として使います。

今回はここまでとなります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?