PythonでCOS類似度を利用してテキスト間のCOS距離がどのくらい離れているかを算出します。PythonでCOS類似度を出すにはライブラリを使えば簡単に出すこともできますが、今回ご紹介するコードで書くとスピード早く処理できます。
機械学習でよく使われるCOS類似度ですが、機械学習以外にもテキスト間の距離が近ければ類似度が高いので、グループ化の候補にするなど、クラスタ解析もできます。今回は、簡単にPythonで実施できるCOS類似度のコードについてご紹介いたします。
目次
Pythonでコサイン類似度を実装する
数学計算するためにmathライブラリを読み込みます。基本Python公式であればインストール済のはずです。
import math
①単語と単語の出現頻度がわかるようにします。
'''
words=["りんご","りんごあじ","りんご"]
{'りんご': 2, 'りんごあじ': 1}
'''
def words_change_(words):
fdict_ = {}
for word in words:
if word in fdict_:
fdict_[word] = fdict_[word] + 1
else:
fdict_[word] = 1
return fdict_
②COS類似度を算出するための計算式を書きます。
#COS類似度
def cos_ruiji_(dictA,dictB):
lengthA = 0.0
lengthB = 0.0
#Aのベクトル算出
for key,value in dictA.items():
lengthA = lengthA + value*value
lengthA = math.sqrt(lengthA)
#Bのベクトル算出
for key,value in dictB.items():
lengthB = lengthB + value*value
lengthB = math.sqrt(lengthB)
#ABの内積計算
x=0.0
for keyA,valueA in dictA.items():
for keyB,valueB in dictB.items():
if keyA ==keyB:
x= x + valueA*valueB
#COS類似度
if lengthA == 0 or lengthB == 0:
cos = 0
else:
cos = x / (lengthA*lengthB)
return cos
③上記①②をまとめてCOS類似度を算出するロジックを書きます。
def main(word_1,word_2):
hind_dictA_=words_change_(word_1)
hind_dictB_=words_change_(word_2)
COS_ruiji_1 = cos_ruiji_(hind_dictA_,hind_dictB_)
return COS_ruiji_1
④最後に上記ロジックでCOS類似度を求めてみます。類似度は0.66となりました。COS類似度は0~1の間で1が一番類似度が高い値になります。
word_1=["焼肉","とんかつ","熟成肉"]
word_2=["エビフライ","とんかつ","熟成肉"]
main(word_1,word_2)
0.6666666666666667
まとめ
当サイトでは、Pythonを中心にテクノロジーで解決できる自動化技術をご紹介しております。データ取得や作成のご相談にも対応いたします。