今すぐword2vecをcolab環境使ってみたい。最短手順でわかりたい。
##やること
以前まとめたword2vecのデモを試す(特にMac環境)に近しいことをgoogle Colablatory環境で実行します。
gensimを利用して簡易的に「単語のベクトル化」を行い、単語の足し算などを試します。
コーパスとしてtext8を利用します。
##環境
- Colaboratory環境
- ブラウザはChrome推奨
colabを少し使ったことがある前提で進めていきます。
でもpythonを知らなくても実行できる説明にします。
##やり方
colabで下記を実行していきます。簡単な解説もつけます。
text8コーパスをダウンロードして読み込む
import gensim.downloader as gendl
corpus = gendl.load("text8")
pythonの言語処理ライブラリgensimを利用し、変数corupsにtext8をロードします。
text8は前処理済みの英文コーパスで、単語がスペース区切りで格納されています。
ライブラリがデータセットまで準備してくれているなんて、至れり尽くせりです。
corpus
とすると、
<text8.Dataset at 0xほにゃらら>
と表示されます。at以下はたぶん16進数表記のデータサイズです。読み込めているということです。
gensimで学習させる
import gensim #ライブラリgensimを導入する
model = gensim.models.Word2Vec(corpus, size=5, window=2, iter=1, min_count=1)
読み込んだtext8コーパスをgensimでベクトル化していきます。
例ではスピードアップのために学習を弱くしてあるので、1分ぐらいで結果が出ると思います。
gensim.models.Word2Vec()の中にある項目の意味は下記となります。
- corpus : 結果を代入する変数
- size : 次元数
- window : 単語の前後いくつまで関係をみるか
- iter : 反復学習回数
- min_count : 扱う単語の頻度閾値
他にも、
- sg : 学習アルゴリズム。0ならCBOW、1ならskip-gram
-
- max_vocab_size : 語彙の最大数
などがあるようです。
処理が終わったら、
model
と入力して実行します。
<gensim.models.word2vec.Word2Vec at 0xほにゃらら>
と出ます。
少しパラメータを増やして機械学習してみましょう。
model = gensim.models.Word2Vec(corpus, size=200, window=5, iter=10, min_count=1)
model
6分ぐらいで完了します。完了すると
<gensim.models.word2vec.Word2Vec at 0xほにゃらら>
が表示されるので合図になります。
単語の類似度を見る
単語の類似度を調べてみます。"coffee"はどうなるでしょうか。
model.wv.most_similar("coffee")
読み込んだtext8コーパスをgensimでベクトル化していきます。
[('wool', 0.6894910335540771),
('cocoa', 0.6891734600067139),
('seafood', 0.6766855716705322),
('meat', 0.6657349467277527),
('cigarettes', 0.6616493463516235),
('wheat', 0.6599244475364685),
('syrup', 0.6596278548240662),
('cotton', 0.6591023206710815),
('cheese', 0.658471941947937),
('liquor', 0.6500911116600037)]
という結果が出て、"coffee"に一番似ているのは"wool"となりました。"cocoa"が2位なのでまあまあかな。別のパラメータで試した時は"tea"が1位になることもありました。
他の単語でも試してみてください。
「女王」+「女」ー「男」=? を試す
model.wv.most_similar(positive=['queen', 'woman'], negative=['man'])
positiveとnegativeの項目を追加して、内容を操作してみます。
お察しの通り、positiveが足し算する単語、negativeが引き算する単語です。
[('princess', 0.5237167477607727),
('consort', 0.49119704961776733),
('wife', 0.4860479235649109),
('elizabeth', 0.47580623626708984),
('monarch', 0.4757298529148102),
('husband', 0.47444406151771545),
('mother', 0.4598205089569092),
('mary', 0.456966370344162),
('spouse', 0.4559243321418762),
('daughter', 0.4540153741836548)]
という結果。なんか惜しい感じです。
計算する単語を入れ替えてみましょう。
model.wv.most_similar(positive=['queen', 'man'], negative=['woman'])
[('king', 0.4555075764656067),
('duke', 0.45153024792671204),
('lord', 0.44045498967170715),
('regent', 0.4297080338001251),
('crown', 0.42514702677726746),
('wales', 0.4120979309082031),
('victoria', 0.4099408984184265),
('portugal', 0.40795454382896423),
('aragon', 0.40479281544685364),
('prince', 0.4001534581184387)]
「女王」+「男」ー「女」=「王様」となりました。
これはイメージに近い感じです。
次に「野球」「MLB」「バスケ」「NBA」の関係をみてみましょう。
model.wv.most_similar(positive=['baseball', 'mlb'], negative=['basketball'])
[('nba', 0.5073813199996948),....
が出ました。
単語を入れ替えてみます。
model.wv.most_similar(positive=['basketball', 'mlb'], negative=['baseball'])
こちらもnbaが1位になりました。
最後に「日本」「東京」「フランス」「パリ」の関係がうまく出るか見てみましょう。
model.wv.most_similar(positive=['paris', 'japan'], negative=['tokyo'])
[('france', 0.5635770559310913),
が出ました。
まとめ
ぜひ設定や単語の計算やパラメータ設定をいろいろ試してみて下さい。
初心者の方でも、このシンプルなプログラムを軸に、理解を深めていけると思います。
ちなみに5行で実行するしたら下記のようになります。1分ぐらいで結果が出ると思います。
#word2vecを5行で使う
import gensim
import gensim.downloader as gendl
corpus = gendl.load("text8")
model = gensim.models.Word2Vec(corpus, size=5, window=2, iter=1, min_count=1)
model.wv.most_similar("coffee")
おまけの後にこの後やっていくことへのリンクもあります。
おまけ : モデルのセーブ・ロード方法
モデルをセーブする方法も追記しておきます。
model.save("gensim_text8_test.model")
でSAVEできます。"gensim_text8_test.model"のところは好きな名前にできます。
! ls
とすると、
gensim_text8_test.model sample_data
のように表示され、現在のディレクトリにファイルとして保存されていることがわかります。
model = gensim.models.Word2Vec.load('gensim_text8_test.model')
で読み込めます。
セーブしたファイルをローカル環境にダウンロードする場合には、
from google.colab import files
files.download('gensim_text8_test.model')
とします。これで一安心。
ローカル環境のモデルをcolab環境にアップロードしたい場合には、
from google.colab import files
files.upload()
を実行したあと、現れるボタンを押してファイルを選択すればOKです。
おまけ2 : 日本語版のTEXT8を使う場合
こちらが参考になります。
https://hironsan.hatenablog.com/entry/japanese-text8-corpus
このあとにやること
日本語を扱っていけるようにします。MeCabで日本語の形態素解析を行ったり、オリジナルの日本語コーパスを作ったりしていきます。もちろんその日本語でWord2Vecを試していきます。
次回記事 Colab環境でMeCabを使う3行
次々回記事:青空文庫からテキストをダウンロードしてプレーンにする
その次の記事:Colab環境で分散表現処理