Search on the blog

2015年12月27日日曜日

word2vecで遊ぶ

 MeCabを入れたので、word2vecで日本語文章を解析して遊んでみた。

gensimのインストール
Pythonの場合はgensimをインストールすると、word2vecが使える。
gensimはドキュメントからセマンティックなトピックを自動的に抽出する機能を提供するライブラリ。

pip install --upgrade gensim

使ってみる
太宰治の「人間失格」を使ってモデルを学習させて、単語の足し算、引き算などをやってみた。
# -*- coding: utf-8 -*-

import logging
import codecs
from prettyprint import pp

import MeCab
from gensim.models import word2vec

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

with codecs.open('ningen_shikkaku.txt', 'r', 'sjis') as f:
    
    text = f.read()
    tagger = MeCab.Tagger('-Owakati')
    wakati_text = tagger.parse(text.encode('utf-8'))    
    open('wakati.txt', 'w').write(wakati_text)
    
    sentences = word2vec.Text8Corpus("wakati.txt")
    model = word2vec.Word2Vec(sentences, size=100, min_count=1)

    pp(model.most_similar(positive=[u'人生']))
    pp(model.most_similar(positive=[u'人生'], negative=[u'酒']))
    pp(model.most_similar(positive=[u'罪'], negative=[u'罰']))

ちょっとハマったところ
  • MeCabはstr型しか受け付けないため、unicode型の文字列を処理したい場合はエンコードしてからMeCabに渡す。
  • word2vecでモデルを構築するときにデフォルトだと頻度が5未満の文字は無視されてしまう。頻度がどれくらいなら無視するかはmin_countパラメータで設定できる。テキストにあるはずの ワードをpositive/negativeに入れても「KeyError: u"word xxxxxxx' not in vocabulary"」みたいなエラーが出てハマってしまった。
結果
ドキュメントのサイズが小さかったので、それほど面白い結果はえられなかったが、まあまあ面白かった結果だけ載せておく。

人生 = 哀れ、あさましい、罪、尊い
人生 - 酒 = 受け身、小男、ものしずか
罪 - 罰 = うまい

0 件のコメント:

コメントを投稿