Pythonによるword2vecの利用方法を現役エンジニアが解説【初心者向け】

初心者向けにPythonによるword2vecの利用方法について現役エンジニアが解説しています。word2vecは、自然言語処理の一つで大量のテキストデータを解析し、各単語の意味をベクトル表現をする手法です。単語の意味の近さや類似度などを計算することが出来ます。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

Pythonによるword2vecの利用方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して、初心者向けに解説します。

Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。

 

田島悠介

今回は、Pythonに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Pythonによるword2vecの利用方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

word2vecとは?

word2vecは、自然言語処理の一つで大量のテキストデータを解析し、各単語の意味をベクトル表現をする手法です。

単語をベクトル化することで、次のようなことができます。

  • 単語の意味の近さを計算
  • 単語同士の意味を足したり引いて結果の単語を出力する

例えば次の表の通り単語の類似度を定義するものとします。

プログラム 日本 ご飯
Python 0.91 0.12 0.05
東京 0.02 0.92 0.20
ラーメン 0.11 0.30 0.95

このように定義することで、文章中でこれらのキーワードが来たときにコンピュータが関連する単語がないかを調べたり学習させることができるようになります。

そして先程述べた単語同士の計算が次のように可能になります。

  • 「プログラム」 +「人工知能」=「機械学習」
  • 「日本」-「東京」+「西」=「大阪」

わかりやすくするために上記の表を定義しましたが、実際は大量の文章データからword2vecによってモデルを作成します。

それでは、実際にword2vecを触ってみましょう。

word2vecのインストール

word2vecの動作環境をPythonにインストールしていきます。今回はgensimという自然言語処理のライブラリを使用してword2vecを使っていきます。

以下の1行でインストールができます。

pip install gensim

 

[PR] Pythonで挫折しない学習方法を動画で公開中

word2vecの使い方

word2vecを使ってモデルを学習させるには以下の1行でできます。

model = word2vec.Word2Vec(laernData, size=100, min_count=5, window=5, iter=3)

ここで、各オプションについて説明します。

  • learnDataには、学習させたいテキストデータを単語で区切ったリストを渡します
  • sizeは特徴量の数を指定します
  • min_countで指定した回数以下の単語は学習モデルから破棄させます
  • windowには文脈の最大単語数を指定します
  • iterにはトレーニングの反復回数を指定します

この他にも数多くのオプションがありますので、下記リンクの一覧をご覧ください。

word2vecのオプション一覧 – Qiita

word2vecでのモデル作成

ここでword2vecのモデルを作成する方法を紹介します。日本語の場合はそのままだとモデル作成をさせることが難しいので、形態素解析を使って分かち書きをする必要があります。

分かち書きについては、こちらの記事で紹介しています。

PythonのMeCabで分かち書きする方法を現役エンジニアが解説【初心者向け】

分かち書きを行ったあとにデータをword2vecに学習させるためのデータに整形して上記で紹介した方法でモデルを作成していきます。最後に以下の1行でモデルを保存させます。

model.save("word2vec.gensim.model")

 

word2vecでモデル作成してみよう

それでは実際にword2vecでモデルを作成していきましょう。今回は夏目漱石の「こころ」を使用してモデルを作成していきます。

モデルを作成するためにテキストファイルを以下のリンクからダウンロードします。

図書カード:こころ

ダウンロードするファイルは、テキストファイル(ルビあり)を選択します。

Pythonでword2vecを使ってモデル作成するために使用するテキストファイル。夏目漱石のこころを図書サイトからダウンロードする。

解凍したら、任意のフォルダーにテキストファイルを保存します。

MeCabのインストール

テキストを分かち書きするためにMeCabを使用します。MeCabのインストール方法は以下の記事を参考にインストールします。

PythonのMeCabで分かち書きする方法を現役エンジニアが解説【初心者向け】

テキストを分かち書き

実際に分かち書きをしてみます。

先程ダウンロードしたテキストファイルと同じディレクトリに以下のコードを保存し実行します。1行ずつ読み込み文章ではない箇所はこの時点で学習対象から外します。

import MeCab
tagger = MeCab.Tagger('-Fs%f[6] -Us%m -E\n')
with open("kokoro.txt", "r", encoding="shift-jis") as f:
    text = f.readlines()
    for line in text:
        if "。" in line:
            result = tagger.parse(line)
            with open("kokoro_wakati.txt", "a", encoding="utf-8") as of:
                of.write(result[1:])
        else:
            pass
print("Finish")

実行すると、kokoro_wakati.txtが作成され、以下のように単語ごとにスペース区切りのテキストファイルが作成されます。

Pythonによるword2vecを使って、テキストファイルからモデルを作成するプログラムの実行結果。テキストがスペース区切りになっています。

word2vecのモデル作成

いよいよモデルを作成していきます。以下のコードをテキストファイルと同じディレクトリに保存して、実行します。

from gensim.models import word2vec
docs = word2vec.LineSentence("kokoro_wakati.txt")
model = word2vec.Word2Vec(docs,
                        size=100,
                        min_count=5,
                        window=5,
                        iter=3)
model.save("kokoro.model")

実行すると、kokoro.modelが作成されます。

結果の確認

最後に生成したモデルの動作確認をやってみます。今回は、物語で登場する「先生」に関連した単語の上位10語を出力させます。

以下のコードをモデルファイルと同じディレクトリに保存します。

from gensim.models import word2vec
model   = word2vec.Word2Vec.load("kokoro.model")
results = model.most_similar(positive="先生", topn=10)
for result in results:
    print(result[0], 't', result[1])

実行すると以下のように、「奥さん」、「それ」、「父」の順に類似度が付けられており、概ね文脈通りになったと思います。

奥さん 0.9999319314956665
それ 0.9999198913574219
父 0.9999182224273682
彼 0.9999166131019592
K 0.9999088644981384
その 0.9999088048934937
あなた 0.9999047517776489
「 0.9998998641967773
お嬢さん 0.9998908042907715
また 0.9998905658721924

 

まとめ

今回はword2vecを使ったモデル生成を紹介しました。

gensimを使うことで、word2vecを簡単に扱うことが出来ます。また、今回使用したテキストはそこまで多くありませんが、それでもword2vecを使うことでそれなりに文脈に沿った結果が出力されました。

完成したword2vecモデルを配布しているサイトもあるので、いろんなモデルを試してみるのもいいかもしれません。

監修してくれたメンター

メンター三浦

モバイルゲームを運用している会社のエンジニアをしています。趣味でWEB開発やクラウドコンピューティングもやっており、ソフトもハードもなんでもやります。

TechAcademyジュニアではPythonロボティクスコースを担当しています。好きな言語はPython, Node.js。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも、Pythonを使った人工知能(AI)や機械学習の基礎を習得できる、オンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。