Python でのコサイン類似性

Shivam Arora 2023年1月30日
  1. Python で scipy モジュールを使用して 2つのリスト間のコサイン類似度を計算する
  2. Python で NumPy モジュールを使用して 2つのリスト間のコサイン類似度を計算する
  3. sklearn モジュールを使用して、Python の 2つのリスト間のコサイン類似度を計算する
  4. torch モジュールを使用して、Python の 2つのリスト間のコサイン類似度を計算する
Python でのコサイン類似性

コサイン類似度は、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() モジュールを使用してテンソルに変換されます。

関連記事 - Python Math