コサイン類似度には多くの実世界の応用があり、埋め込みベクトルを使用することで、プログラムによる方法で実世界の意味を比較することができます。Pythonはデータサイエンスのための最も人気のある言語の1つであり、コサイン類似度を簡単に計算できるさまざまなライブラリを提供しています。この記事では、Scikit-LearnおよびNumPyライブラリの助けを借りてPythonでコサイン類似度を実装する方法について説明します。
コサイン類似度とは何か?
コサイン類似度は、n次元空間内の2つの非ゼロベクトル間の類似度の尺度です。これは、テキスト分析やレコメンデーションシステムなどのさまざまなアプリケーションで使用され、ベクトル空間内の2つのベクトルの方向がどれだけ類似しているかを判断するために使用されます。
コサイン類似度の公式
2つのベクトルAとBの間のコサイン類似度は、次の公式を使用して計算されます。
コサイン類似度(A, B) = (A · B) / (||A|| * ||B||)
この式において、A · B はベクトルAとBの内積を表します。これは、2つのベクトルの対応する成分を掛け合わせ、その結果を合計することで計算されます。||A||はベクトルAのユークリッドノルム(大きさ)を表し、その成分の2乗和の平方根であり、計算式は ||A|| = √(A₁² + A₂² + … + Aₙ²) です。||B||はベクトルBのユークリッドノルム(大きさ)を表し、||A||と同様に計算されます。
コサイン類似度の計算方法
コサイン類似度を計算するには、まず2つのベクトルの内積を計算します。次に、その結果をそれぞれのベクトルの大きさの積で割ります。得られる値は-1から1の範囲にあり、以下のようになります:
- コサイン類似度が1の場合、ベクトルは同じ方向を持ち、完全に類似しています。
- コサイン類似度が0の場合、ベクトルは互いに垂直であり、類似性はありません。
- コサイン類似度が-1の場合、ベクトルは互いに反対の方向を持ち、完全に非類似です。
テキスト分析において、コサイン類似度は文書ベクトル間の類似度を測定するために使用されます。各文書はコーパス内の各語彙や単語に対応する高次元空間内のベクトルとして表されます。文書ベクトル間のコサイン類似度を計算することで、2つの文書がどれほど類似または非類似であるかを判定できます。
コサイン類似度計算のためのライブラリ
NumPy
: 数値演算に優れ、高速化が図られています。scikit-learn
: 機械学習アルゴリズムの数多くを提供し、そのメトリクスパッケージにコサイン類似度の計算方法も含まれています。
以下は、Pythonを使ってコサイン類似度を計算する方法を示す例です。今回は、2つの既知の書評ベクトル [5,3,4] と [4,2,4] を使用します。
Pythonそのまま
以前は手計算で行いましたが、もちろんコンピュータで計算することができます!以下は、追加ライブラリなしでPythonを使ってコサイン類似度を計算する方法です:
A = [5, 3, 4]
B = [4, 2, 4]
# Calculate dot product
dot_product = sum(a*b for a, b in zip(A, B))
# Calculate the magnitude of each vector
magnitude_A = sum(a*a for a in A)**0.5
magnitude_B = sum(b*b for b in B)**0.5
# Compute cosine similarity
cosine_similarity = dot_product / (magnitude_A * magnitude_B)
print(f"Cosine Similarity using standard Python: {cosine_similarity}")
NumPy
埋め込みベクトルは通常、多くの次元を持ちます――数百、数千、さらには数百万、あるいはそれ以上!NumPyを使うことで、配列演算を使用してコサイン類似度を計算でき、これらの演算は高度に最適化されています。
import numpy as np
A = np.array([5, 3, 4])
B = np.array([4, 2, 4])
dot_product = np.dot(A, B)
magnitude_A = np.linalg.norm(A)
magnitude_B = np.linalg.norm(B)
cosine_similarity = dot_product / (magnitude_A * magnitude_B)
print(f"Cosine Similarity using NumPy: {cosine_similarity}")
Scikit-Learn
scikit-learnのcosine_similarity
関数を使うと、高度に最適化されたコサイン類似度の計算がさらに簡単になります:
from sklearn.metrics.pairwise import cosine_similarity
A = np.array([[5, 3, 4]])
B = np.array([[4, 2, 4]])
cosine_similarity_result = cosine_similarity(A, B)
print(f"Cosine Similarity using scikit-learn: {cosine_similarity_result[0][0]}")
Pythonでのコサイン類似度計算の最適化のためのヒント
Pythonを使ってコサイン類似度を直接計算する場合、以下の点に留意する必要があります:
- NumPyやscikit-learnのような最適化されたライブラリを使用する:これらのライブラリはパフォーマンスを最適化し、バニラPythonよりも一般的に高速です。
- Numbaを使用する:Numbaは、PythonおよびNumPyコード用のオープンソースのJITコンパイラであり、特に科学計算機能を最適化するために構築されています。
- GPUを使用する: GPUにアクセスできる場合は、GPUで最適化されたPythonライブラリであるTensorflowなどを使用してください。
- 計算の並列化: ハードウェアの能力がある場合は、計算を並列化して高速化することを検討してください。
AstraDBで大量のベクトルを検索:
大量のベクトルを検索する必要がある場合、DataStax Astraのベクトル検索機能のようなベクトルデータベースを使用することが効率的でスケーラブルであることがわかります。Astra DBのベクトル検索は、データからより多くの洞察を得るために、組み込みのコサイン類似度計算でベクトル検索を実行するための強力なプラットフォームを提供します。
Source:
https://dzone.com/articles/how-to-implement-cosine-similarity-in-python