言語処理100本ノック2020年版を解いてみた【第7章:単語ベクトル 66】

東北大乾・岡崎研(現乾・鈴木研)で作成された、新人研修の一つであるプログラミング基礎勉強会の教材『言語処理100本ノック 2020年版』をPython(3.7)で解いた記事です。
今回は第7章:単語ベクトルの「66. WordSimilarity-353での評価」を解説します。

独学でPythonを勉強してきたので、間違いやもっと効率の良い方法があるかもしれません。
改善点を見つけた際はご指摘いただけると幸いです。

ソースコードはGitHubにも公開しています。

第7章:単語ベクトル

単語の意味を実ベクトルで表現する単語ベクトル(単語埋め込み)に関して,以下の処理を行うプログラムを作成せよ.

第7章: 単語ベクトル – 言語処理100本ノック 2020 (Rev 1) – NLP100 2020

66. WordSimilarity-353での評価

The WordSimilarity-353 Test Collectionの評価データをダウンロードし,単語ベクトルにより計算される類似度のランキングと,人間の類似度判定のランキングの間のスピアマン相関係数を計算せよ.

第7章: 単語ベクトル – 言語処理100本ノック 2020 (Rev 1) – NLP100 2020
from tqdm import tqdm
from gensim.models import KeyedVectors
import pandas as pd


def culcSimScore(row):
    word1 = row["Word 1"]
    word2 = row["Word 2"]
    if word1 in model and word2 in model:
        score = model.similarity(word1, word2)
    else:
        score = None
    return score


tqdm.pandas()
model = KeyedVectors.load_word2vec_format(
    './input/GoogleNews-vectors-negative300.bin', binary=True)
df = pd.read_csv("./input/wordsim353/combined.csv")
df["SimScore"] = df.progress_apply(culcSimScore, axis=1)

print(df[["Human (mean)", "SimScore"]].corr(method="spearman"))

「スピアマン相関係数」は2つのランキングの順位にどの程度相関があるかを示す係数です。

tqdmを使ってみましたが、あっという間だったので不要でしたね…汗

読み込みの必要があるモデルと評価データをはじめにそれぞれ読み込みます。

読み込んだ評価データは類似度を求める関数culcSimScore()に1行ずつ渡して、類似度の算出を行って評価データに追加。
モデルに対して類似度を求めたい2語を引数にsimilarity()メソッドを実行すると類似度が得られます。

評価データに含まれていた人手による類似度の平均値と求めた類似度に対して、spearmanを指定してpandasに用意されているcorr()メソッドを実行します。
これで課題で与えられたスピアマン相関係数を求めることが出来ます。

まとめ:ランキングの相関はスピアマン相関係数で求められる

今回は第7章:単語ベクトルの「66. WordSimilarity-353での評価」を解いてみました。

ランキングの相関を求めるというのは初めて挑戦したのですが、意外と簡単に求められるんですね!
ただ、線形の関係でないといけないようなので、使い所を見極める必要はありそうです。

「ここはもっとこういう書き方がいいですよ!」「これはアンチパターンですよ!」など、言いたいことがある方はぜひコメントいただければと思います。

引き続きよろしくお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です