ナード戦隊データマン

機械学習と自然言語処理についてのブログ

単語ベクトルの性能評価

JWSAN1 とは、日本語単語類似度・関連度データセットです。ここでは、単語ベクトルの評価にこのデータセットを使ってみます。

事前準備

  1. https://github.com/sugiyamath/jawiki2w2v を使ってword2vecモデルをjawikiから生成します。(おすすめは、t82w.pyを編集して、sg=0, sg=1の2つのパラメータのモデルを作成し比較することです。)
  2. wget http://www.utm.inf.uec.ac.jp/JWSAN/jwsan-1400.csv します。

評価コード

from gensim.models.word2vec import Word2Vec
import pandas as pd
import numpy as np


def load(modelpath, datapath):
    model = Word2Vec.load(modelpath)
    df = pd.read_csv(datapath)
    return model, df


def cossim(x,y):
    return np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))


def eval_model(model, df, dim=200):
    out = {}
    diffs = []
    for i,d in df.iterrows():
        z = d['similarity']/6.0
        try:
            x = model.wv[d['word1']]
            y = model.wv[d['word2']]
            w = cossim(x,y)
        except Exception as e:
            w = 0.0
        out[d['pairID']] = {'true':float(z), 'pred':float(w)}
        diffs.append((z-w)**2)

    result = {"data":out, "global_score":float(np.mean(diffs))}
    return result


if __name__ == "__main__":
    import json
    modelpath = "./mymodel.model"
    datapath = "./jwsan-1400.csv"
    model, df = load(modelpath, datapath)
    result = eval_model(model, df)
    with open("result.json", "w") as f:
        json.dump(result, f)

注意

0〜6の評価値が与えられる、とデータセットの説明が書かれているため、それを6で割った値で類似度として比較していますが、この比較に合理的な理由があるかは不明です。cossimで与えられた類似度(予測値)と人間の手で与えた類似度(正解値)が比較可能なのかは注意する必要があります。