Python3でコサイン類似度を計算して、似ている記事の組を抽出してみた。

By | 2020年12月5日 , Last update: 2022年8月7日

はじめに

前の記事で本Webサイトの記事間のコサイン類似度の分布を調べて3Dの棒グラフを作り、さらにそれを動画にしてみたところ、それなりにコサイン類似度が1に近い異なる記事の組み合わせが存在していそうな感じであることがわかりました。

そこで、この記事ではコサイン類似度の計算結果の全体的な分布を調べつつ、コサイン類似度が上位の記事の組を抽出し、実際に似た感じの記事が抽出できるかどうか調べてみることにします。

スポンサーリンク

コサイン類似度の分布

まず、コサイン類似度の分布を調べてみました。

前の記事に引き続き、matplotlibで描画します。

その結果…

計算結果が0に近い値になっているものが圧倒的に多いことがわかります。

どことなく、ポアソン分布っぽくも見えます。

3Dの棒グラフを作った際にはmatplotlibのカラーマップにterrain_rを使いましたが、このカラーマップは0に近いところでは棒グラフの棒が白色で表示されますので、計算結果が0に近いところに数値が集中していると…

…のようなグラフの描画結果になってしまい、実際にどのくらいの値になっているのかがわかりにくいです。(´・ω・`)

そこで、この記事ではカラーマップとしてterrainを使用することにしました。

カラーマップにterrainを使ってみても、グラデーションになっているかどうかはいまいちわかりにくいですが、これはそういうものだと思うことにします。(´・ω・`)


スポンサーリンク

ちなみにコサイン類似度の累積分布を求めると、以下のような感じになります。

コサイン類似度が0に近いものが大部分であることがわかるとともに、ちょっとcoolなグラフになりましたね。😎

似ている記事の組の抽出

次に、似ている記事の組を抽出してみます。

全組み合わせ33930(=260*261/2)通りのうちから、コサイン類似度が高い組から順に100組について記事のタイトルを抽出してみました。

とりあえず上位5組

まずは、上位5組です。

第1位

以下の記事の組で、コサイン類似度は0.891413でした。


スポンサーリンク

Blenderを使って立体を描き、回転させる方法についての手順を説明した記事の組です。

内容はかなりよく似ています。

第2位

以下の記事の組で、コサイン類似度は0.783154でした。

本Webサイトではほぼ半年に一度の恒例になっているFedoraのアップグレードについての記事の組です。

上位5組の中ではタイトルだけを見るといまいち似ていない感じですが、記事の内容は前者及び後者ともにFedoraのアップグレードについて記述されています。

第3位

以下の記事の組で、コサイン類似度は0.667333でした。

後者は本Webサイトでは比較的ページビューの多い記事です。OpenVPNの設定について書いているところは共通していますが、後者はtroubleshootingの記事になっています。

第4位


スポンサーリンク

以下の記事の組で、コサイン類似度は0.654264でした。

上位5組の中では最もタイトルが似ている組ですが、記事内で扱っている計算の内容がまったく異なっているため、その分だけ類似度が低くなっているようです。

第5位

以下の記事の組で、コサイン類似度は0.650865でした。

第4位の組と同様に関連するテーマではあるものの、記事内で扱っている計算の内容がまったく異なっています。

第6位以下についての概要

第6位以下の具体的な内容については省略しますが、コサイン類似度がある一定の値以上の値であるものの組み合わせの数は以下の通りです。

  • コサイン類似度が0.6以上: 10組
  • コサイン類似度が0.5以上: 32組
  • コサイン類似度が0.4以上: 76組

コサイン類似度が0.4以上となっている記事の組み合わせが組み合わせ全体の約0.22%で、76位前後の記事の組を見てみると、「似ている」記事の組み合わせというよりは「関連がある」記事の組み合わせが入り込み始める感じです。

まったく似ていない記事の組の抽出

前の記事で「$\boldsymbol{a}_i\cdot\boldsymbol{a}_j = 0$になる$i,j$の組み合わせが頻出する(=直交しまくる)んじゃね?(*)」と書きましたが、実際に直交していたのは18組で、組み合わせ全体の約0.053%でした。

(*)はほぼ杞憂であると言ってもいい出現率でした。

実際にどのような組み合わせになっているかを見てみたところ、大半(16組)が固定ページ関連で、固定ページ関連でないものは以下の2組でした。

第1の組

第2の組

まとめ

ここまでの考察で、コサイン類似度の高い方の記事の組はそれなりに似ている記事の組が、コサイン類似度が0の記事の組はまったく似ていない記事の組が抽出されていることがわかります。

コサイン類似度が0の記事の組が少ないのには実は理由がありまして、本Webサイトの記事(固定ページを除く。)は記事の一部がテンプレート化されているために、テンプレートに含まれる単語がほぼすべての記事に含まれることによるものです。

日本語の文書を使って、記事が類似しているかどうかの分析を行った分析例が本Webサイトの管理人たるpandaが調べた限りではないような気がした(※この記事を最初に書いた時点(2020年12月)の情報です。)ので、ほぼなさそうだということであれば作って公開してみるかということで分析例を書くこととした次第です。

分析の結果は記事のカテゴリの再編成や記事の内容の再構成に役立てるつもりです。

この記事は以上です。