2024年2月7日水曜日

Transformers で LLM を使って日本語の文章を簡単に解析する方法

Transformers で LLM を使って日本語の文章を簡単に解析する方法

概要

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 件のコメント:

コメントを投稿