機械学習

【Python】学習いらずで自然言語処理を楽しむ

  • このエントリーをはてなブックマークに追加

ディープラーニングやりたいけどお金が…

ディープラーニングを勉強しても高価なハードウェアが必要なので
中々実践するのは難しいですよね。
また、ちょっとしたことにディープラーニングを使いたくても
コストがかさんで中々使えない。
そんなときには、
公開されている学習モデルを探してみると意外とベストなモデルが見つかったりします。

word2vecの学習済みモデル

今回は、word2vecという手法を試してみます。
word2vecとは日本語などを工夫した方法でベクトルで表現する手法です。
ある言葉をベクトルで表すとそれに近しい言葉が近いベクトルで表現されます。
本来であれば、データを学習させる必要がありますが、
word2vecの学習済みモデルはいくつか公開はされています。
なので、気軽にword2vecを試すことができます。

gensimインストール

gensimというライブラリをインストールします。
多くのword2vecの学習済みモデルはこのライブラリからの利用を想定されています。
つぎのようにpipでインストールしましょう。

pip install gensim

gensimのインストールには、
少し時間がかかるので次のモデルのダウンロードも並行して行うと良いです。

モデルのダウンロード

今回は東北大学の乾研究室が公開しているモデルを利用します。
このモデルはWikipediaの日本語データを学習させたものです。
githubで公開されているのでダウンロードします。
https://github.com/singletongue/WikiEntVec/releases
jawiki.entity_vectors.300d.txt.gz
gz形式で圧縮されているので解凍します。
entity_vectors.txtというファイルが学習済みモデルです。

gemsimの使い方

モデルを読み込む

まずはモデルを読み込みましょう。
つぎのようにテキストファイルからモデルを読み込めます。

import gensim
model = gensim.models.KeyedVectors.load_word2vec_format("entity_vectors.txt")

単語のベクトル表現を調べる

読み込んだモデルを利用して単語のベクトル表現を調べてみます。

model["日本語"]
array([ 4.26522166e-01, -2.27161497e-01,  2.01598451e-01,  9.47932675e-02,
...
       -1.05309770e-01,  2.36158036e-02, -7.06082582e-02, -1.02183148e-01,
       -6.06555641e-02,  3.46547663e-01,  1.66853607e-01, -4.31690544e-01],
      dtype=float32)

類似単語を探す

つぎに類似単語を探してみます。
お金に近い単語を探してみるとそれっぽい言葉がでてきました。

model.most_similar(positive=["お金"])
[('金銭', 0.6260307431221008),
 ('借用証書', 0.6157783269882202),
 ('借金', 0.5911493301391602),
 ('タンス預金', 0.590470016002655),
 ('現金', 0.587975025177002),
 ('内金', 0.580801248550415),
 ('交通費', 0.5790156126022339),
 ('金額', 0.5784545540809631),
 ('ピンハネ', 0.5770383477210999),
 ('給料', 0.575616180896759)]
model.most_similar(positive=["仮想通貨"])
 [('ビットコイン', 0.7743369340896606),
 ('ブロックチェーン', 0.7273553609848022),
 ('暗号通貨', 0.7225706577301025),
 ('デジタル通貨', 0.6892298460006714),
 ('Coincheck', 0.6861381530761719),
 ('NEM_(暗号通貨)', 0.6772117614746094),
 ('Zai', 0.6760774850845337),
 ('テックビューロ', 0.6587539911270142),
 ('資金決済に関する法律', 0.6582635641098022),
 ('資金決済法', 0.6559650897979736)]

単語の足し算、引き算をする

negativeに値を渡すと意味を引き算することができます。
たとえば、王子-男+女=王女になってるのは面白いですね。

model.most_similar(positive=["王子","女"],negative=["男"])
[('王女', 0.6505610942840576),
 ('王太子', 0.542637050151825),
 ('王妃', 0.5386568903923035),
 ('ジャナカ', 0.5296334028244019),
 ('スミトラー', 0.5262210369110107),
 ('ダシャラタ', 0.5244849920272827),
 ('タイターニア', 0.5235799551010132),
 ('カイケーイー', 0.5171648263931274),
 ('ゾフィア・フォン・ナッサウ', 0.5168704986572266),
 ('正妻', 0.5167607069015503)]

そのほかの学習モデル

そのほかにもさまざまな学習済みモデルが公開されています。

  • このエントリーをはてなブックマークに追加