Pythonによるword2vecの利用方法を現役エンジニアが解説【初心者向け】
初心者向けにPythonによるword2vecの利用方法について現役エンジニアが解説しています。word2vecは、自然言語処理の一つで大量のテキストデータを解析し、各単語の意味をベクトル表現をする手法です。単語の意味の近さや類似度などを計算することが出来ます。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
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
word2vecの使い方
word2vecを使ってモデルを学習させるには以下の1行でできます。
model = word2vec.Word2Vec(laernData, size=100, min_count=5, window=5, iter=3)
ここで、各オプションについて説明します。
- learnDataには、学習させたいテキストデータを単語で区切ったリストを渡します
- sizeは特徴量の数を指定します
- min_countで指定した回数以下の単語は学習モデルから破棄させます
- windowには文脈の最大単語数を指定します
- iterにはトレーニングの反復回数を指定します
この他にも数多くのオプションがありますので、下記リンクの一覧をご覧ください。
word2vecでのモデル作成
ここでword2vecのモデルを作成する方法を紹介します。日本語の場合はそのままだとモデル作成をさせることが難しいので、形態素解析を使って分かち書きをする必要があります。
分かち書きについては、こちらの記事で紹介しています。
PythonのMeCabで分かち書きする方法を現役エンジニアが解説【初心者向け】
分かち書きを行ったあとにデータをword2vecに学習させるためのデータに整形して上記で紹介した方法でモデルを作成していきます。最後に以下の1行でモデルを保存させます。
model.save("word2vec.gensim.model")
word2vecでモデル作成してみよう
それでは実際に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が作成され、以下のように単語ごとにスペース区切りのテキストファイルが作成されます。
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)や機械学習の基礎を習得できる、オンラインブートキャンプを開催しています。
また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。