技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

word2vecで「単語の足し算引き算」をしてみる

word2vecを試してみたいけど使ったことがないという人が対象
とりあえず動かしてみるのが目的。
※python2.7.12で動かしているけど、3系でも大丈夫なはず。

word2vecとは

word2vecとは、ざっくり言えば
「単語をベクトル表現にでき、意味の足し算や引き算ができるニューラルネット
これまでの言語処理ではone hotという表現で単語の数だけ次元を持つベクトルで処理していたけれど、次元圧縮したベクトルで単語を意味(的なもの)で表せるようになったってのが凄いよねって話。
よく使われる有名な例がこれ

king - man + woman = queen

とりあえずこれを動かしてみたい!というのが今回の記事
詳しい解説は下の参考サイトがめっちゃ分かりやすかったのでそちらを参照して欲しい。

必要なライブラリのインストー

pipで簡単にインストールできる

pip install numpy
pip install gensim

学習用のデータセット

日本語でもできるが、簡単に手に入るデータセットがないので英語で試してみる。
英語では簡単に手に入るデータセットが用意されているのでそれを使う。

wget http://mattmahoney.net/dc/text8.zip
unzip text8.zip

学習用のスクリプト

learning.pyという名前で保存

from gensim.models import word2vec
import logging

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

sentences = word2vec.Text8Corpus('text8')
model = word2vec.Word2Vec(sentences, size=200, min_count=20, window=15)
model.save("sample.model")
print("Finish!")

モデルを試してみるスクリプト

result.pyという名前で保存

from gensim.models import word2vec
import logging
import sys

model = word2vec.Word2Vec.load("sample.model")

def neighbor_word(posi, nega=[], n=10):
    count = 1
    result = model.most_similar(positive = posi, negative = nega, topn = n)
    for r in result:
        print(str(count)+" "+str(r[0])+" "+str(r[1]))
        count += 1


def calc(equation):
    if "+" not in equation or "-" not in equation:
        neighbor_word([equation])
    else:
        posi,nega = [],[]
        positives = equation.split("+")
        for positive in positives:
            negatives = positive.split("-")
            posi.append(negatives[0])
            nega = nega + negatives[1:]
        neighbor_word(posi = posi, nega = nega)

if __name__=="__main__":
    equation = sys.argv[1]
    calc(equation)

使い方

python leraning.py
python result.py king
python result.py king-man+woman

learning.pyはモデルを作るためのものなので1回だけで充分。結構(3分くらい)時間がかかった。
足し算引き算はスペースを入れないで書くこと。
確かに第一候補が

1 queen 0.660548448563

になった!嬉しい!

参考サイト:
Word2VecをPythonでやってみる | Foolean
Word2vec Tutorial | RaRe Technologies

word2vecについてわかりやすい記事:
Word2Vec のニューラルネットワーク学習過程を理解する · けんごのお屋敷

pythonの仮想環境に関する話

pythonのvirtualenvで仮想環境の作成について。windows

どうして仮想環境を使うのか

チームで開発する時など、環境を統一する必要がある。
ネットで公開する時は、ゼロから環境構築を再現して試してみたい時がある。
仮想環境ではライブラリは何もないのでゼロから環境構築を再現することができる。
加えてpythonは特に、2系と3系で異なるところが多いので使い分けられたら嬉しいことが多い。

使い方

準備

virtualenv自体はpipでinstallできる

pip install virtualenv

環境を作る

新しく環境を作るには、作業ディレクトリでこのコマンドを実行

virtualenv test1

これでtest1という名前の環境用のフォルダができる。

2系と3系を使い分けたい場合pythonのフォルダがあるパスを指定する

virtualenv --python=PATH test1

環境への出入り

環境に入る場合は
環境用のフォルダがある場所で(virtualenvを実行した場所で)

source activate test1

他の場所からこの環境を使う場合はそのフォルダへのパスにしてやる

環境から出る場合は

source deactivate

環境を共有する

今の環境を他のマシンや新しい環境でも再現したい時はどうするか。
virtualenvではpipでパッケージを管理すると思うけれど、

pip freeze > requirements.txt

として、パッケージを書き出すことができる。
ここに書き出したパッケージを一括で落としてくることができる。

pip install -r requirements.txt

パソコンを買い替える時とかにも使えるね。


補足

anacondaでも簡単に仮想環境を作ることができる。
特に異なるバージョンを動かしたい時は、いちいち別バージョンのpythonを予め持っている必要はないので手軽。
例えば、python3.6の環境を作るコマンドは

conda create -n test1 python=3.6

環境用のフォルダが
…/Anaconda2/envs/test1
のようにできるので(上の場合はデフォルトで2系を落としている時)
Anacondaのパスを通しているとどこからでも

source activate test1

として環境に入ることができる。


関連:

快適コマンドプロンプト生活 (Gow + ConEmu + chocolatey)

コマンドプロンプトはレガシー。使いづらい。見た目が嫌い。これだからWindowsはクソ。
と罵られてばかりのコマンドプロンプトだけど、今回はコマンドプロンプトを最大限に使いやすいくしてやろうという話。
Cygwinはホームが変だったり所々使いにくくて嫌いだった。
(今はGit for Windowsを使っている)

コマンドプロンプト生活の末にたどり着いた、コマンドプロンプトによる快適環境構築について紹介する。

Gow (Gnu on Windows)

コマンドプロンプトを使うならば、これがないと不便極まりない。
正式名称はGnu on Windowsといって、ls,grepを始めとしたLinuxで使えるコマンドをコマンドプロンプトで使えるようにするもの。
具体的には以下のコマンドが使えるようになる。(version 0.7.0現在)

>>gow -l

  awk, basename, bash, bc, bison, bunzip2, bzip2, bzip2recover, cat,
  chgrp, chmod, chown, chroot, cksum, clear, cp, csplit, curl, cut, dc,
  dd, df, diff, diff3, dirname, dos2unix, du, egrep, env, expand, expr,
  factor, fgrep, flex, fmt, fold, gawk, gfind, gow, grep, gsar, gzip,
  head, hostid, hostname, id, indent, install, join, jwhois, less,
  lesskey, ln, ls, m4, make, md5sum, mkdir, mkfifo, mknod, mv, ncftp, nl,
  od, pageant, paste, patch, pathchk, plink, pr, printenv, printf, pscp,
  psftp, putty, puttygen, pwd, rm, rmdir, scp, sdiff, sed, seq, sftp,
  sha1sum, shar, sleep, sort, split, ssh, su, sum, sync, tac, tail, tar,
  tee, test, touch, tr, uname, unexpand, uniq, unix2dos, unlink, unrar,
  unshar, uudecode, uuencode, vim, wc, wget, whereis, which, whoami,
  xargs, yes, zip

設定は簡単、インストール用の実行ファイルを落としてきて実行するだけ。
Release Gow 0.8.0 · bmatzelle/gow · GitHub

bashを動かす

Gowのあるフォルダに/etcというフォルダを作ればbashが使えるようになる。
bash.exe in Gow 0.7.0 · Issue #65 · bmatzelle/gow · GitHub

ConEmu

その名の通りコンソールのエミュレータ。気持ち悪いPower Shellやcmd.exeの見た目をカスタマイズできるのはもちろん、同じウィンドウ内でタブで切り替えができる。ウィンドウを分割して右にPower Shell、左にCygwinを開くなんてこともできる。
具体的には、Ctrl+Shift+eで横分割 Ctrl+Shift+oで縦分割の新規コンソールを立ち上げる。コンソールを閉じる時はexitと打てばよい。
背景画像を設定して透過もできるのでこんなこともできる。
f:id:swdrsker:20170111013639j:plain:w600
f:id:swdrsker:20170121230846p:plain:w600


これも公式サイトから実行ファイルを落として実行するだけ。
ConEmu - Handy Windows Terminal

chocolatey

apt-getのようにパッケージ管理ができる、もはやWindowsユーザーは必須のスグレモノ。
chocolatey自体の導入はこの記事を参考に。
windowsの開発環境は一瞬で整うwith chocolatey - Qiita
管理者用のプロンプトを立ち上げて、以下をコピペして実行するだけ~

@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%\chocolatey\bin


今までめんどくさかったwindowsへの色んなアプリケーションのインストールを何も考えず(パスを通すことも含めて!)一発でできる。
試しにwindowsでは環境設定がめんどくさいとされるemacsをinstallしてみる

choco install emacs

これだけ。

他にも

choco install nodejs
choco install git

控えめに言って最高

おわりに

コマンドプロンプトLinux風に使いやすくするという話でした。
お試しあれ(`・ω・)