LoginSignup
5
1

watsonx.aiで日本語文のセンチメント分析(Python編)

Posted at

watsonx.aiで、日本語文のセンチメント分析(感情分析)を行います。LLMにはIBMのgranite-8b-japaneseを使ってみます。プロンプト・ラボでやったことのPython版になります。プロジェクトの準備までは同じ手順になりますので、プロジェクトを作成しておいてください。

具体的にはスマートフォンのレビュー文を「ポジティブ」か「ネガティブ」に分類してみます。

Examples (Input:)
レビュー:
驚くほど軽量で、持ち運びが便利です。また、バッテリーの持続時間も素晴らしく、長時間使用しても安心です。
Examples (Output:)
感情:
ポジティブ
  • テスト環境
    • watsonx.ai (クラウド)
    • python:3.10.9
    • ibm_watson_machine_learning:1.0.353

APIキーとプロジェクトIDの取得

APIキーの作成

watsonxのハンバーガーメニューから「アクセス(IAM)」にアクセスします。

image.png

「APIキー」を選び「作成」クリックします。
image.png

適当な名前をつけて「作成」します。
image.png

「コピー」や「ダウンロード」をして保存しておいてください。
image.png

プロジェクトID取得

プロジェクトに入り、「管理」タブの「一般」を選び、「プロジェクト ID」をコピーします。
image.png

Jupyter Notebookからの実行

Jupyter Notebookで実行してみます。
watsonxの上のJupyterでも実行できますし、VS Codeなどから手元のPC環境でも実行できます。

まずpipでibm-watson-machine-learningのパッケージを導入しておいてください。

Python 環境に wml API をインストールしてください
pip install ibm-watson-machine-learning

ibm-watson-machine-learningから必要なモジュールをインポートします。

ibm_watson_machine_learningのモジュールをインポート
from ibm_watson_machine_learning.foundation_models import Model
from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams
from ibm_watson_machine_learning.foundation_models.utils.enums import ModelTypes, DecodingMethods

プロジェクトID、APIキーは先ほど取得したものを入力します。

環境依存情報
#APIキー
api_key = "xxxxxxxxxxx"
#プロジェクトID
watsonx_project_id = "xxxxxxxxxxxxxxxx"

エンドポイントURLはリージョンに合わせて以下から選びます。ここではgranite-8b-japaneseモデルを使いたいので、東京リージョンのエンドポイントURLを選んでいます。

エンドポイントURL
url = "https://jp-tok.ml.cloud.ibm.com"

基盤モデルを選択しています。
ModelTypesは以下で定義されています。

ただ、ibm-watson-machine-learning-1.0.353では、まだgranite-8b-japaneseが定義されていなかったので、model_type = 'ibm/granite-8b-japanese'で文字列で定義しています。

サポートされているモデルは以下に掲載されています。

# 基盤モデルの選択
model_type = 'ibm/granite-8b-japanese'
# model_type = ModelTypes.ELYZA_JAPANESE_LLAMA_2_7B_INSTRUCT

次にモデルパラメーターを設定していきます。
次のパラメーターを指定しています。以下に定義があります。

各パラメーターの意味は以下です。

モデルパラメータの指定
generate_params = {
    GenParams.DECODING_METHOD: DecodingMethods.GREEDY,
    GenParams.REPETITION_PENALTY: 1.1,
    GenParams.MIN_NEW_TOKENS: 0,
    GenParams.MAX_NEW_TOKENS: 200
}

model = Model(
    model_id=model_type,
    params=generate_params,
    credentials={
        "apikey": api_key,
        "url": url
    },
    project_id=watsonx_project_id
)

プロンプト・ラボとの対応は以下のようになります。

image.png

プロンプトを作成します。
ここではFew-shotでプロンプトを作っています。複数の「レビュー」と「感情」の組合せの例をいくつか用意しています。そして最終的に結果を得たい「レビュー」を{input_text}で与えるようにしています。このように関数化することで、複数の「レビュー」に対して繰り返して処理を行うことも可能にしています。

# プロンプトの作成
# プロンプトの作成
def get_prompt(input_text):

    # Get the complete prompt by replacing variables
    # 変数を置き換えて完全なプロンプトを取得します

    complete_prompt = f"""
    このスマートフォンに関するフィードバックを分析し、顧客のポジティブな/ネガティブな感情を特定してください。

    レビュー:
    驚くほど軽量で、持ち運びが便利です。また、バッテリーの持続時間も素晴らしく、長時間使用しても安心です。
    感情:
    ポジティブ


    レビュー:
    カメラの性能が他の機種に比べるとやや劣っています。特に暗所での撮影時には、ノイズが目立ちます。
    感情:
    ネガティブ


    レビュー:
    デザインは非常に洗練されており、手にしっくりと馴染みます。操作性も高く、使いやすさに定評があります。
    感情:
    ポジティブ

    レビュー:
    画面の解像度がやや低いです。テキストや画像を拡大すると、粗さが目立ちます。
    感情:
    ネガティブ


    レビュー:
    {input_text}

    感情:
    """

    return complete_prompt

以下で生成を実行しています。「カメラ機能は優れており、高品質な写真や・・・」の文書をポジティブかネガティブで分類しています。
model.generateにプロンプトを入れているだけです。

生成の実行

# プロンプトに入力テキストを入力
complete_prompt = get_prompt('カメラ機能は優れており、高品質な写真や動画を撮影できます。さまざまな撮影モードやエフェクトも豊富です。')

# LLMから結果を取得
generated_response = model.generate(prompt=complete_prompt)
response_text = generated_response['results'][0]['generated_text']

import pprint
pprint.pprint(generated_response)

generated_responseはdict型になっていて、この'results'の中に結果が含まれています。「ポジティブ」が戻ってきており、うまく感情を分類できていることがわかります。

{'created_at': '2024-03-27T05:02:27.186Z',
 'model_id': 'ibm/granite-8b-japanese',
 'results': [{'generated_text': 'ポジティブ',
              'generated_token_count': 2,
              'input_token_count': 198,
              'stop_reason': 'eos_token'}]}

実行したプロンプトと生成結果を出力してみます。

モデル応答を出力します
print("--------------------------------- Generated output -----------------------------------")
print("Prompt: " + complete_prompt.strip())
print("---------------------------------------------------------------------------------------------")
print("Generated output: " + response_text)
print("*********************************************************************************************")

--------------------------------- Generated output -----------------------------------
Prompt: このスマートフォンに関するフィードバックを分析し、顧客のポジティブな/ネガティブな感情を特定してください。

    レビュー:
    驚くほど軽量で、持ち運びが便利です。また、バッテリーの持続時間も素晴らしく、長時間使用しても安心です。
    感情:
    ポジティブ


    レビュー:
    カメラの性能が他の機種に比べるとやや劣っています。特に暗所での撮影時には、ノイズが目立ちます。
    感情:
    ネガティブ


    レビュー:
    デザインは非常に洗練されており、手にしっくりと馴染みます。操作性も高く、使いやすさに定評があります。
    感情:
    ポジティブ

    レビュー:
    画面の解像度がやや低いです。テキストや画像を拡大すると、粗さが目立ちます。
    感情:
    ネガティブ


    レビュー:
    カメラ機能は優れており、高品質な写真や動画を撮影できます。さまざまな撮影モードやエフェクトも豊富です。

    感情:
---------------------------------------------------------------------------------------------
Generated output: ポジティブ
*********************************************************************************************

プロンプト・ラボとの対応は以下のようになります。

image.png

サンプルプログラム

参考

watsonx.aiで日本語文のセンチメント分析(プロンプト・ラボ編)

5
1
2

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
5
1