見出し画像

テキスト分析の大通り#14: コサイン類似度

前回まででナイーブベイズテキスト分類の手順について整理しましたが、今回は同じTF-IDFを利用した、文書間の類似度について整理します。コサイン類似度と呼ばれる文書と文書の類似度を計算する方法も、テキスト分析の代表的な分析の1つです。計算の詳細は割愛しますが、コサイン類似度は2つの文書間における類似度が高ければ1に近い値、類似度が低ければ0に近い値を取る指標です。まったく単語を共有しなければ0、まったく同じ単語で構成される同じ文書であれば1となります。ただし単語の出現順序は考慮しません。今回はこれをSQLで書いてみます。


入力データ

ナイーブベイズの入力で準備したようにTF-IDFのデータを作成します。ナイーブベイズでは学習用に16番までの文書に絞りましたが、今回は絞らず、20の文書すべてを使っています。それ以外はナイーブベイズの事前処理と全く同じです。


コサイン類似度を利用した文書間の類似度

処理のSQLは以下です。

TF-IDFのオプションは幾つかありますが、その中で最もノーマルなもの(tfidfという列名)を使っています。20の文書がある場合、すべての文書が自分自身も含めた20の文書と総当たりで類似度の計算をしています。その後、最後のクエリーで、自分自身との類似度を落とし、次に文書番号1番と2番の類似度、2番と1番の類似度といった形で左右を入れ替えた計算をさせているため、片方を落としています。また、まったく異なる文書間の類似度は0になるため、一定以上の類似度で絞り込んでいます。最後に何の文書かわかるように実際の文字列を横付けしています。処理の結果が以下です。

単語の重複が多いほど類似度は高くなりますが、構成する単語が少なく(文章が短く)、また単語の共有も少ないため、全般的に類似度は低いです。これをネットワーク図で可視化したのが以下です。

文書間のコサイン類似度を可視化

こちらの方が表よりも関係を把握しやすいかと思います。それぞれの文書の間の線がコサイン類似度を指し示し、色が濃く、線が太ければ類似度が高いです。長く連なっている文書間は「ピンク」、「トゥース」、「面白い」、「思っている」といった単語で連結されているのがお分かりいただけるかと思います。


コサイン類似度を利用した単語間の近さ

上述のSQL処理を書く際にネットでいろいろ調べ物をしていたのですが、そのときに文書側ではなく単語側(正確には「ユーザー側ではなくアイテム側」)のコサイン類似度計算について紹介している記事があったため、それもSQLにしてみました。とは言えレーベンシュタイン距離のような、文字列の類似度を測るものではないため、単語間の距離の近さみたいな感じを捉えると表現する方が良いのかもしれません。SQLは以下。

そして処理結果が以下です。こちらでは類似度0.5以上で絞り込んでいます。長くてすいません。

上記同様ネットワーク図も。

単語間のコサイン類似度を可視化

同じ文書の中にしか存在しない単語の組み合わせは、類似度1同士で結びつき、かたまりになっているのが見て取れます。なんだか星座みたいですね。グラフ上部にはモンクレールのダウンを六本木の社長にもらった星座や、結婚直前に浮気がばれた星座が燦然と輝いています。また「ウケる」、「ツッコミ」、「トゥース」、「ピンク」、「バスケットボール」などは、複数の文書に存在することから、かたまりとかたまりの間の橋渡しをしていることが分かります。


Pythonでの実行

ちなみにコサイン類似度を利用した文書類似度の計算をPythonで実施する場合のスクリプト例は以下です。

ナイーブベイズの時と同様、SQLで作成したTF-IDFの結果は利用せず、横持ちの文書データからTF-IDFの配列データを作成し、それをコサイン類似度の計算に回しています。結果も配列で気持ち悪いので縦持ちさせています。ご参考までに。

以上、コサイン類似度の処理についてでした。

(TeradataやPython、およびPythonライブラリのインストールや環境構築、辞書登録、参考にしたページ等は以下にまとめています)

///

#analytics #tf -idf #コサイン類似度 #text #nlp #データ #分析 #teradata #sql #python  

この記事が気に入ったらサポートをしてみませんか?