はじめに
自然言語処理(NLP)技術におけるベクトル表現は、テキストデータの多様な理解と分析のアプローチを可能にします。このブログでは、テキストデータをベクトル化し、主成分分析(PCA)を使用して3次元空間にマッピングするプロセスを紹介します。この方法は多くの分析や応用に適用可能であり、今回はその一例として可視化を行います。
テキストのベクトル化とは
テキストのベクトル化とは、単語や文の意味的な特徴を数値の配列で表現することを意味します。この数値配列は、テキストの内容を機械学習モデルが処理しやすい形式に変換します。ベクトル化により、テキスト間の類似性や関連性を定量的に分析できるようになります。
テキストデータの準備
分析のために、日本の伝統的な祝詞を例として使用します。
texts = [
"高天原に 神留坐す",
"神漏岐神漏美の",
"命以ちて",
"皇親神伊邪那岐の大神",
"筑紫日向の橘の小門の",
"阿波岐原に",
"禊祓ひ給ふ時に",
"生坐せる",
"祓戸の大神等",
"諸々禍事罪穢を",
"祓へ給ひ清め給ふと",
"申す事の由を",
"天つ神地つ神",
"八百万神等共に",
"聞食せと",
"畏み畏みも白す"
]
OpenAI Embedding APIの使用
まず、OpenAIのEmbedding APIを利用するためにライブラリをインストールして、APIキーを認証させます。
!pip install openai
api_key = "APIキー"
client = OpenAI(api_key=api_key)
次に、APIを使用して各テキストのベクトルを生成します。
import pandas as pd
import json
from openai import OpenAI
df = pd.DataFrame(texts, columns=['text'])
def get_embedding(text, model="text-embedding-ada-002"):
text = text.replace("\n", " ")
response = client.embeddings.create(input=[text], model=model)
return response.data[0].embedding
df['embedding'] = df['text'].apply(get_embedding)
データの保存
生成されたベクトルをJSON形式で保存します。
embeddings_dict = df.apply(lambda row: {'text': row['text'], 'embedding': row['embedding']}, axis=1).tolist()
with open('embeddings.json', 'w', encoding='utf-8') as file:
json.dump(embeddings_dict, file, ensure_ascii=False)
jsonファイルを確認すると、ベクトルの異なる成分が文に埋め込まれていることを確認できます。
可視化の一例
ベクトル化されたデータは高次元で直感的に理解しにくいため、PCAを用いて3次元に削減し、視覚化します。
!pip install japanize-matplotlib
from sklearn.decomposition import PCA
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
from mpl_toolkits.mplot3d import Axes3D
# JSONファイルから埋め込みベクトルを読み込む
with open('embeddings.json', 'r', encoding='utf-8') as file:
embeddings_dict = json.load(file)
embeddings = np.array([item['embedding'] for item in embeddings_dict])
# PCAを使用して3次元に次元削減
pca = PCA(n_components=3)
embeddings_reduced = pca.fit_transform(embeddings)
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, projection='3d')
# 各点に対応するテキストをプロットに追加
for i, txt in enumerate(embeddings_dict):
ax.scatter(embeddings_reduced[i, 0], embeddings_reduced[i, 1], embeddings_reduced[i, 2])
ax.text(embeddings_reduced[i, 0], embeddings_reduced[i, 1], embeddings_reduced[i, 2], txt['text'], size=10)
ax.set_xlabel('Component 1')
ax.set_ylabel('Component 2')
ax.set_zlabel('Component 3')
plt.show()
まとめ
今回は、テキストのベクトル化から3次元空間へのマッピングまでの簡単なプロセスを紹介しました。テキストのベクトル化は、可視化だけでなく、様々な分析や応用に適用できます。特にNLP(自然言語処理)の分野におけるこれらの技術は、テキストデータの理解だけでなくLLM(大規模言語モデル)への活用に繋がります。是非皆さんもチャレンジしてみてください!