#はじめに
自然言語処理100本ノック第7章で「スピアマン相関係数」が出てきたので、初心者の私なりに理解できた部分を記載する。
###第7章-66 問題文
The WordSimilarity-353 Test Collectionの評価データをダウンロードし,単語ベクトルにより計算される類似度のランキングと,人間の類似度判定のランキングの間のスピアマン相関係数を計算せよ.
###第7章-66 解答
以下のコードが正解となっている。(こちらの記事より引用)
!wget http://www.gabrilovich.com/resources/data/wordsim353/wordsim353.zip
!unzip wordsim353.zip
!head -10 './combined.csv'
Word 1,Word 2,Human (mean)
love,sex,6.77
tiger,cat,7.35
tiger,tiger,10.00
book,paper,7.46
computer,keyboard,7.62
computer,internet,7.58
plane,car,5.77
train,car,6.31
telephone,communication,7.50
ws353 = []
with open('./combined.csv', 'r') as f:
next(f)
for line in f: # 1行ずつ読込み、単語ベクトルと類似度を計算
line = [s.strip() for s in line.split(',')]
line.append(model.similarity(line[0], line[1]))
ws353.append(line)
# 確認
for i in range(5):
print(ws353[i])
['love', 'sex', '6.77', 0.2639377]
['tiger', 'cat', '7.35', 0.5172962]
['tiger', 'tiger', '10.00', 0.99999994]
['book', 'paper', '7.46', 0.3634626]
['computer', 'keyboard', '7.62', 0.39639163]
import numpy as np
from scipy.stats import spearmanr
# スピアマン相関係数の計算
human = np.array(ws353).T[2]
w2v = np.array(ws353).T[3]
correlation, pvalue = spearmanr(human, w2v)
print(f'スピアマン相関係数: {correlation:.3f}')
スピアマン相関係数: 0.685
ここでは、['love', 'sex'],['tiger', 'cat'],...
のような名詞に対して、人間が評価した類似度は'6.77','7.35',...
であり、Google Newsデータセット(約1,000億単語)での学習済み単語ベクトルを元にした単語間のコサイン類似度は'0.2639377','0.5172962',...
であることを示している。
これらの2つの「人間が評価した類似度」と「単語ベクトルを元にしたコサイン類似度」を比較して、スピアマン相関係数を計算した結果が0.685という数字で現れている。
##スピアマン相関係数とは?
ここで「スピアマン相関係数」が何をしているのか紐解く。
そもそもスピアマン相関係数とは以下のように定義される。
- 2つの変数の分布の相関を評価する
- 0〜1の間の数値で評価し、1に近ければ近いほど相関有り
- 変数の分布は線形じゃなくてもいい
- 変数を順位に変換し、各ペアにおける2つの変数の順位の差を計算する
例えば、
$a = [4,7,9,2,3,6,10,1,8,5]$
$b = [17,51,78,33,29,56,90,12,65,24]$
のような2種類の変数の分布がある時に、それぞれの変数を以下のように順位に変換する。
$a' = [4,7,9,2,3,6,10,1,8,5]$
$b' = [2,6,9,5,4,7,10,1,8,3]$
スピアマンの順位相関係数$ρ$は以下のように定義される。
ρ = 1-\frac{6\sum D^2}{N^3-N}
$D$ = 対応する$a$と$b$の値の順位の差
$N$ = 値のペアの数
上記の$a',b'$を愚直に計算すると以下のようになる。
ρ = 1-\frac{6(2^2+1^2+0^2+3^2+1^2+1^2+0^2+0^2+0^2+2^2)}{10^3-10}\\
=1-\frac{6\times20}{990}\\
=0.878787...
結果、$a,b$の相関係数は約0.88であり、かなり高い相関があるといえる。
前述した「人間が評価した類似度」と「単語ベクトルを元にしたコサイン類似度」のスピアマン相関係数:は0.685だったことから、ある程度の相関はあるものの、人間の感覚と機械学習での評価は一定以上の差があることが分かる。