Pythonでコサイン類似度を実装するためのコード紹介

Pythonでコサイン類似度 実装コードのご紹介

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を中心にテクノロジーで解決できる自動化技術をご紹介しております。データ取得や作成のご相談にも対応いたします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

著者:ブロガー2つ(につ)

■サイト設立目的
人海戦術の時代からテクノロジー活用による自動化促進の時代に変化。テクノロジー活用を促進するための情報共有やテクノロジー支援を行います。

目次