oryou-sanのブログ

備忘録です

Word2Vecを使ってみる

はじめに

Python自然言語処理系のライブラリであるgensimでWord2Vecを使ってみます。


データ準備

Word2Vecにかけるデータを準備します。分かち書きされている文章をリストにまとめたものならOKです。
前回の記事で紹介したMeCabを使っています。

oryou-san.hatenablog.com

import MeCab
mecab = MeCab.Tagger("-Ochasen")

s1 = 'おいしいパスタつくったお前'
s2 = 'あなたを詐欺罪と器物損壊罪で訴えます'
s3 = 'その点トッポってすげぇよな'

data =[s1,s2,s3]

def wakachigaki_bow(s):
    wakachi = mecab.parse(s).split('\n')
    wakachi = [w.split('\t') for w in wakachi if len(w.split('\t')) > 1]
    wakachi = list(filter(lambda x: x[3][:2] == '名詞'
                      or x[3][:2] == '動詞' 
                      or x[3][:3] == '形容詞', wakachi))
    wakachi_base = [w[2] for w in wakachi]
    return wakachi_base

sentences = [wakachigaki_bow(s) for s in data]

print(sentences)

# [['おいしい', 'パスタ', 'つくる', 'お前'], ['あなた', '詐欺', '罪', '器物', '損壊', '罪', '訴える'], ['点', 'トッポ', 'すげる', 'ぇよな']]


早速まわしてみる

準備したデータをモデルにつっこみます。

from gensim.models import Word2Vec
model = Word2Vec(sentences, min_count=1)

print(model.wv['パスタ'])
print(model.wv.most_similar('パスタ', topn = 3))

# [ 9.7702928e-03  8.1651136e-03  1.2809705e-03  5.0975773e-03
#   1.4081288e-03 -6.4551616e-03 -1.4280510e-03  6.4491653e-03
#  -4.6173073e-03 -3.9930656e-03  4.9244044e-03  ...]

# [('ぇよな', 0.17272794246673584), ('点', 0.16694681346416473), ('器物', 0.11117953807115555)]

学習済みのモデルから試しに2つ出力してみました。

・単語の分散表現
.wv['key']で単語の分散表現を出力できます(デフォルトだと100次元)。

・類語
.wv.most_similar('key', topn = n)でkeyとなった単語の類語(上位n個)を出力できます。
コサイン類似度の高いものから順に単語を出力しているようです。


参考

models.word2vec – Word2vec embeddings — gensim