MNISTデータを使って手書き数字を学習したり、RNNにも挑戦したりと、TensorFlowのチュートリアル生活は順調ですか?
今日は、TensorFlowで単語ベクトルを作成するword2vecを試してみます。
単語ベクトルって何?
word2vecって新しいツールをインストールするの?
TensorFlowの記事じゃないの?
と思った方にも、TensorFlowの記事だったのか!と思えるように説明していますので、ぜひ試してみてくださいね。
MNISTデータやRNNに挑戦していない方は、そちらも記事になっていますので、ぜひご覧ください。
この記事の目次
word2vecとは
word2vecは、元々はGoogleの研究者が開発したツールです。
参考:https://code.google.com/archive/p/word2vec/
現在では、このword2vecツールを元にさまざまな言語で実装されており、word2vecは「単語ベクトルを生成するモデル」を表す単語として有名になっています。
たとえば、gensimというPythonのライブラリに、word2vecの実装(gensim.models.word2vec)があります。
参考:https://radimrehurek.com/gensim/
この記事では、TensorFlowの公式チュートリアルの記事で紹介されているword2vec_basic.py(TensorFlowを使ったword2vecの実装の1つ)を動かしてみます。
word2vecで作成する単語ベクトルとは
ここまで気軽に「単語ベクトル」と書いてきましたが、よく分からないですよね。
少し中学校時代に戻ってみましょう。
数学で習った、座標軸(X軸、Y軸)を覚えているでしょうか。
2つの数値で、平面上の点の位置を表していましたね。
これを、説明の都合上、「平面上のすべての点の位置を表すために用意した、2次元の情報があるベクトル」と呼ぶことにしましょう。
同じような感じで「手元にある文書内の単語の意味を表すために用意した、200~1000次元の情報があるベクトル」が考えられるのではないか、これを単語ベクトルと呼ぼうではないか、というのがword2vecの考え方です。(わかりやすさを優先した解説をしています。厳密ではないので注意。)
もう少し具体的に説明しましょう。
座標軸では、(X座標, Y座標)=(1,2)と書くことで、ある1点の位置を表せました。
(X1, X2, X3, …, X200, …, X1000)=(0.01, 0.99, 0.04, …, 0.54, …, 0.12)と書くことで、ある1つの単語を表せるのではないか、という考え方が単語ベクトルなのです。
人が見てわかりやすいイメージ図が、以下のページで紹介されています。
参考:https://deepage.net/bigdata/machine_learning/2016/09/02/word2vec_power_of_word_vector.html
実際には、このページのように「怠惰さ」とか「スポーツ」とか「土地」といった具体的な言葉で「イチロー」や「プログラマー」を表す数値が決まるわけではありません。
コンピュータだけが分かる「何か」で「イチロー」や「プログラマー」を表す数値(=単語ベクトル)が決められます。
word2vecの革新的なところは、プログラムが多くの文章を読み取ることで、ここで書いた「プログラムだけが分かる「何か」」とか「表す数値(=単語ベクトル)」を、プログラムがそれらしく決められるというところなのです。
具体的にどのように単語ベクトルを計算するのか、とか、単語ごとに単語ベクトルが決められるとどんな計算ができるのか、といったことは上記のページでも紹介されていますので、ここまで読んだところで、戻ってみても良いでしょう。
日本語の単語ベクトルを作成するには
実は、公開されているword2vecのプログラムは、基本的には英語の文章を読んで英語の単語ベクトルを作成するコードになっていることがほとんどです。
そのため、そのままでは日本語の単語ベクトルを作成できません。
ただ、プログラムの動作さえ分かってしまえば、ただ1点を除いて、英語と日本語を置き換えることは難しくありません。
「ただ1点を除いて」と書いたのは、英語でも日本語でも、word2vecを利用するには、単語ごとに区切る必要があるためです。
英語の場合は、基本的には半角スペースなどの記号で区切れば、単語ごとに区切れそうですね。
一方、日本語は、単語ごとに区切ることが難しい言語です。
あえて難しい例をあげると、「すもももももももものうち」です。
漢字を混ぜると「李(すもも)も桃も桃のうち」、単語ごとに-(ハイフン)で区切ると「すもも-も-もも-も-もも-の-うち」ですね。
word2vecで日本語の単語ベクトルを作成するには、このように文章をうまく単語ごとに区切るプログラムが必要なのです。
このように単語を区切る作業は、「分かち書き」と呼ばれます。
同じような作業で「形態素解析」という作業もあります。
「形態素解析」は、「分かち書き」に加えて「品詞判別など」を行う作業です。
まとめると、日本語の単語ベクトルを作成するには、「分かち書き」または「形態素解析」を行えるプログラムが必要なのです。
「分かち書き」さえできれば、英語用のword2vecに日本語の単語をあてはめるようにプログラムを修正して、見事に日本語の単語ベクトルを計算できるでしょう。
日本語の「分かち書き」または「形態素解析」を行えるプログラム
有名なところでは、MeCab、ChaSen、JUMANです。
TensorFlowと組み合わせる場合は、TensorFlowと同じようにお手軽にPythonで使えるMeCabが良いでしょう。