Python でのコサイン類似性
Shivam Arora
2023年1月30日
-
Python で
scipy
モジュールを使用して 2つのリスト間のコサイン類似度を計算する -
Python で
NumPy
モジュールを使用して 2つのリスト間のコサイン類似度を計算する -
sklearn
モジュールを使用して、Python の 2つのリスト間のコサイン類似度を計算する -
torch
モジュールを使用して、Python の 2つのリスト間のコサイン類似度を計算する
コサイン類似度は、2つのベクトルリスト間のコサイン角度を計算することにより、ベクトルリスト間の類似度を測定します。余弦関数を考慮すると、0 度での値は 1 で、180 度での値は-1 です。これは、2つの重なり合うベクトルの場合、コサインの値が 2つの正反対のベクトルで最大および最小になることを意味します。
この記事では、同じサイズの 2つのリスト間のコサイン類似度を計算します。
Python で scipy
モジュールを使用して 2つのリスト間のコサイン類似度を計算する
scipy
モジュールの spatial.cosine.distance()
関数は、コサイン類似度の代わりに距離を計算しますが、それを実現するために、1 から距離の値を引くことができます。
例えば、
from scipy import spatial
List1 = [4, 47, 8, 3]
List2 = [3, 52, 12, 16]
result = 1 - spatial.distance.cosine(List1, List2)
print(result)
出力:
0.9720951480078084
Python で NumPy
モジュールを使用して 2つのリスト間のコサイン類似度を計算する
numpy.dot()
関数は、パラメーターとして渡された 2つのベクトルの内積を計算します。numpy.norm()
関数はベクトルノルムを返します。
これらの関数を正しい式で使用して、コサイン類似度を計算できます。
例えば、
from numpy import dot
from numpy.linalg import norm
List1 = [4, 47, 8, 3]
List2 = [3, 52, 12, 16]
result = dot(List1, List2) / (norm(List1) * norm(List2))
print(result)
出力:
0.9720951480078084
コサイン類似度を計算するためのベクトルとクエリベクトルの複数またはリストがある場合は、次のコードを使用できます。
import numpy as np
List1 = np.array([[4, 45, 8, 4], [2, 23, 6, 4]])
List2 = np.array([2, 54, 13, 15])
similarity_scores = List1.dot(List2) / (
np.linalg.norm(List1, axis=1) * np.linalg.norm(List2)
)
print(similarity_scores)
出力:
[0.98143311 0.99398975]
sklearn
モジュールを使用して、Python の 2つのリスト間のコサイン類似度を計算する
sklearn
モジュールには、コサイン類似度を計算するための cosine_similarity()
と呼ばれる組み込み関数があります。
以下のコードを参照してください。
from sklearn.metrics.pairwise import cosine_similarity, cosine_distances
A = np.array([10, 3])
B = np.array([8, 7])
result = cosine_similarity(A.reshape(1, -1), B.reshape(1, -1))
print(result)
出力:
[[0.91005765]]
torch
モジュールを使用して、Python の 2つのリスト間のコサイン類似度を計算する
形状(m、n)を持つ N 次元テンソルを扱う場合、torch
モジュールの consine_similarity()
関数を使用して、余弦の類似性を見つけることができます。
例えば、
import torch
import torch.nn.functional as F
t1 = [3, 45, 6, 8]
a = torch.FloatTensor(t1)
t2 = [4, 54, 3, 7]
b = torch.FloatTensor(t2)
result = F.cosine_similarity(a, b, dim=0)
print(result)
出力:
tensor(0.9960)
リストは、torch.FloatTensor()
モジュールを使用してテンソルに変換されます。