【Python初心者による業務効率化】OpenAIのEmbeddingで文章をベクトル化してみる

はじめに

前回の続きのシリーズです。

👇前回の記事はこちら


本記事の概要

前回は、BERTモデルを使って文章の意味の類似度を算出するタスクを実施しました。今回は、より正確にデータの類似度を検出するために、生成AIをAPIで呼び出して活用する方法を実施してみます。

ChatGPTで有名なOpenAIですが、文章をベクトル化するEmbeddingというサービスも展開しています。
このEmbeddingというサービスを使用し文章をベクトル化することで、2つの文章の類似度を計算することができます。

※Embeddingは、企業のAIチャットbotなどで、ユーザーが求めている情報を提示する際などに活用されています。

Embeddingの活用

準備

まずはじめに、Google ColabにOpenAIをインストールします。
おなじみの、pip install でインストールすることができます。

!pip install openai

OpenAIをインポートし、APIキーを設定します。

import openai

openai.api_key = "ご自身のAPIキー"

文章のベクトル化

準備ができたので、OpenAIを使用して、文章を「ベクトル」という形に変換します。
ベクトルは、コンピュータが文章の意味を理解できるようにするための数字の列です。
APIキーを使ってOpenAIの機能を利用し、ベクトルに変換します。

from openai import OpenAI
client = OpenAI(api_key=openai.api_key)

def get_embedding(text, model="text-embedding-3-small"):
   text = text.replace("\n", " ")
   return client.embeddings.create(input = [text], model=model).data[0].embedding

次に、Google Colabを使って、Googleドライブに保存されているCSVファイルを読み込みます。
このファイルには、Jiraというソフトウェアの問題(issues)の情報が入っています。

※Jiraについては、前回の記事にて詳細に説明しています

from google.colab import drive
drive.mount('/content/drive')
import pandas as pd
base_path = '/content/drive/MyDrive/'
zip_path = 'jira_issues.csv.zip'

df = pd.read_csv(base_path + zip_path)
df.head()

今回は検証のため、下記のようにCSVファイルから10行のみデータを取り出し、新しいCSVファイルとして保存します。
こうすることで、扱うデータの量を減らし、テストしやすくしています。

df = df.iloc[:10]
df.to_csv('jira_issues_10.csv')

最初のふたつの問題の説明をベクトルに変換します。
これにより、文章の内容を数値として比較できるようになります。

emb1 = get_embedding(df['description'][0])
emb2 = get_embedding(df['description'][1])

文章の類似度計算

「コサイン類似度」という方法を使って、ふたつの文章がどれだけ似ているかを計算します。
これは、ベクトル同士の角度を使って似ているかどうかを判定しています。

import numpy as np

def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

cos_sim(emb1, emb2)

さいごに、10件の問題について、それぞれの文章がどれだけ似ているかを表す「類似度行列」を作成します。
これにより、問題同士の関係を分かりやすく可視化します。

sim_mat = np.zeros((10, 10))

for i in range(10):
  for j in range(10):
    vector1 = all_vector[i]
    vector2 = all_vector[j]

    score = cos_sim(vector1, vector2)
    sim_mat[i, j] = score

pd.DataFrame(sim_mat)

以下の表は、Jiraの10件の問題に対するコサイン類似度を示しています。
1.0は完全に一致していることを意味し、数値が1に近いほど類似性が高いことを示します。

出力結果の検証

前回よりも、全体的に類似度が低いことが分かります。

高い類似性:例えば、0番と6番(0.592330)や8番と9番(0.533144)は、他の問題に比べて比較的似ている内容だと判断できます。
低い類似性:逆に、4番と5番(0.149441)はほとんど関連性がない問題といえます。

おわりに

今回はOpenAIのEmbeddingを活用し、類似度の比較を検証しました。
結果として、前回よりもテキストの特徴がしっかりとモデルに反映され、無関係な要素によって誤った高いスコアがつけられることを防ぐことができたのではないかと考えます。

いいなと思ったら応援しよう!