概要
Transformers は HuggingFace が提供するライブラリで公開されている LLM を元で簡単に動かすことができるツールを提供してくれています
今回は導入ということで基本の pipeline 機能を試してみました
環境
- macOS 11.7.10
- Python 3.11.6
- transformers 4.37.2
インストール
今回は日本語を解析するので日本語解析に必要なライブラリも一緒にインストールできるパッケージを使います
-
pipenv install transformers["ja"]
マスク文字の予測
[MASK] としていした文章がある場合にその部分にどんな単語が入るのが正しいのかを予測してくれます
なお指定した日本語の LLM として有名な cl-tohoku さんのモデルを今回は使用します
マスク文字を予測する場合は bert-base-japanese-whole-word-masking というモデルを使用します
from transformers import AutoModel, AutoTokenizer, pipeline
model_name = "cl-tohoku/bert-base-japanese-whole-word-masking"
model = AutoModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# pipe = pipeline("fill-mask", model=model, tokenizer=tokenizer) # なぜかmodelを渡すとKeyError: 'logits'になるので注意
pipe = pipeline("fill-mask", model=model_name, tokenizer=tokenizer)
print(pipe("吾輩は[MASK]である。"))
[{'score': 0.7356272339820862, 'token': 6040, 'token_str': '猫', 'sequence': '吾輩 は 猫 で ある 。'}, {'score': 0.08630602061748505, 'token': 2928, 'token_str': '犬', 'sequence': '吾輩 は 犬 で ある 。'}, {'score': 0.010390125215053558, 'token': 10082, 'token_str': '狼', 'sequence': '吾輩 は 狼 で ある 。'}, {'score': 0.009217966347932816, 'token': 1410, 'token_str': '人間', 'sequence': '吾輩 は 人間 で ある 。'}, {'score': 0.007725571747869253, 'token': 6259, 'token_str': '僕', 'sequence': '吾輩 は 僕 で ある 。'}]
文章のネガポジ判定
その文章がネガティブなのかポジティブなのかを判定することができます
トークナイザーは先程と同じですがモデルはネガポジ用に学習しなおした kit-nlp/bert-base-japanese-sentiment-irony を使います
先程のマスク埋めのモデルを使っても分類はできますが分類先の情報などを持っていないため LABEL_0 などと表示されてしまいます
from transformers import AutoModel, AutoTokenizer, pipeline
model_name = "kit-nlp/bert-base-japanese-sentiment-irony"
tokenizer_name = "cl-tohoku/bert-base-japanese"
model = AutoModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
pipe = pipeline("sentiment-analysis", model=model_name, tokenizer=tokenizer)
print(pipe("今日は天気がよく散歩をしたので気分がいいです。"))
print(pipe("今日は天気が悪く散歩ができなかったので気分が悪いです。"))
[{'label': 'ポジティブ', 'score': 0.7811232209205627}]
[{'label': 'ネガティブ', 'score': 0.6790777444839478}]
文章生成
与えた文字列から始まる文章を生成してくれます
一昔前のスパム文章のような感じもします
トークナイザーは同じで文章生成のモデルは rinna/japanese-gpt2-small を使います
from transformers import AutoModel, AutoTokenizer, pipeline
model_name = "rinna/japanese-gpt2-small"
tokenizer_name = "cl-tohoku/bert-base-japanese"
model = AutoModel.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
pipe = pipeline("text-generation", model=model_name, tokenizer=tokenizer)
print(pipe("こんにちは。始めまして。"))
[{'generated_text': 'こんにちは。始めまして。私は、今日が、私の最初の仕事でした。この仕事は、ある方々のご支援を受けながら、今の仕事を続けてい
ことができました。本当にありがとうございました。私は、ここで、たくさん'}]
トラブルシューティング
文章生成で以下のようなエラーになる場合は protobuf をインストールしましょう
- pipenv install protobuf
ImportError:
T5Converter requires the protobuf library but it was not found in your environment. Checkout the instructions on the
installation page of its repo: https://github.com/protocolbuffers/protobuf/tree/master/python#installation and follow the ones
that match your environment. Please note that you may need to restart your runtime after installation.
モデルの保存場所
基本は自動でダウンロードされキャッシュされます
キャッシュが優先されて使われるので不要であれば削除しましょう
-
/home/user/.cache/huggingface/hub/.locks/models--cl-tohoku--bert-base-japanese-whole-word-masking
最後に
Transformers の pipeline 機能を使って LLM を使った日本語の簡単な解析方法を紹介しました
pipeline には他にも機能があるので興味があれば試してみてください
ただ機能ごとに使用するモデルが変わるのでそこだけ注意してください
モデルが違うとうまく動作しないことがあります
モデルをうまく探すコツは HaggingFace にタグがあるのでそれを使うと良いかなと思います
https://huggingface.co/models?pipeline_tag=text-generation
0 件のコメント:
コメントを投稿