赤飯にかかったアレ

雑多なメモ帳

テキストマイニングがしたい! part4.word2vec用のモデル作成

こんなことができるモデルを作ります。 

word2test.pyの実行結果

金魚 = 余,まし,曲,表面,これ,勝利,あれ,見付け,実,研究生
生命 = 溢れ,名品,例,美事,理想,なり,失敗,財政,死ぬ,絢爛
作る = 普通,神秘,調べ,一緒,華鬘,進ん,出し,来,遣り繰り,それ
Word2Vec(vocab=1337, size=100, alpha=0.025) = 普通,神秘,調べ,一緒,華鬘,進ん,出し,来,遣り繰り,それ

に ニ に 助詞-格助詞-一

モデルの作成

テキストを読み込みMecabで品詞分解し、品詞分類してモデル化する。

今まではparse()を使用して解析をしてましたが形態素の詳細が欲しいのでparseToNode()を使います。

以下はテキストファイルを読み込みそのテキストの中から名詞、動詞、形容詞を抽出し、保存するソース

word2_model.py

'''
word2vecで使える分かち書きモデル
'''
from gensim.models import word2vec
import MeCab, re, sys

# テキストファイルの読み込み
path = 'kingyo_ryoran.txt'
with open(path, 'r') as t:
text = t.read()

# 形態素解析
m = MeCab.Tagger('-Ochasen') # -Owakati / -Ochasen / -Oyomi / mecabrc で出力形式の変更

'''
解析結果の表示
word = m.parse(text)
print(word)
'''

'''
parseの引数に文字列を入寮すると解析結果がテキストが返ってくる
parse()の代わりにparseToNode()を使うと形態素の詳細情報
parseToNode()は文字列でsurfaceで表層形、featureで形態素情報
'''
# 形態素解析した文章の中から名詞、動詞、形容詞だけを抽出
words = m.parseToNode(text)
keyword =
rl =
while words:
if words.feature.split(',')[0]==u'名詞' or words.feature.split(',')[0]==u'動詞'or words.feature.split(',')[0]==u'形容詞':
keyword.append(words.surface)
words = words.next
print(keyword)

# ファイルの作成
file = 'kingyo.txt'
with open(file, 'w', encoding='utf-8') as fp:
fp.write('\n'.join(keyword))

# word2vec用のモデル作成
# 200次元の
word2 = word2vec.LineSentence(file)
model = word2vec.Word2Vec(word2, size=100, window=10, hs=1, min_count=2, sg=1)
model.save('kingyo.model')

Word2Vexcで簡単に遊ぶ

せっかくモデルを作ったので簡単に遊びます。

金魚繚乱の文章の中で指定し単語と似た意味の単語を表示してみます

word2test.py

from gensim.models import word2vec

model = word2vec.Word2Vec.load('kingyo.model')

for word in ['金魚', '生命', '作る']:
words = model.most_similar(positive=[word])
n = [w[0] for w in words]
print(word, '=', ','.join(n))


test = word2vec.Word2Vec.load('kingyo.model')
# 金魚+生命 - 作る =
test.most_similar(positive=['金魚', '生命'], negative=['作る'])[0]
t= [w[0] for w in words]
print(test, '=', ','.join(t))

 

実行結果

金魚 = 堪え,しろ,あれ,美麗,道路,会,おまえ,友達,こと,ベッド
生命 = 与える,身体,途端,市,覚,上っ,キャリコ,愛し,判断,歩
作る = 濃く,云っ,奈良,唯一,繰り返し,完全,孵化,売る,精神,地震
Word2Vec(vocab=1337, size=200, alpha=0.025) = 濃く,云っ,奈良,唯一,繰り返し,完全,孵化,売る,精神,地震

positiveが+、negative=が ーを意味するようですね

つまり、この実行結果の最後には

金魚 + 生命 - 作る = ???

の結果を表示してます

この単語を変更すれば結果はもちろん変わります。

また、実行結果が最初に提示した内容と違いますがモデルのsize=を変更してモデルを生成すればこの結果も変わります。

 

もっと大量のテキストで実験しないといい感じの結果は出ないようですね

今回のソースはここにあります。

github.com