語彙の意味表現を効率的に学習する!Word2Vecモデルの解説
こんにちは。ふらうです。
ブログをはじめてみました。
AIの研究を行っているのですが、自分が学んだこと、作ったものなどを発信していくとともに、技術について語り合える仲間を探したいと思い始めました!
気軽にコメントなどしていただけると嬉しく思います。
今回は、自然言語処理の中でもメジャーであるWord2Vecを、解説なども含めて触ってみようかと思います。
まず、Word2Vecについて解説していきます。
Word2Vecは、2013年にTomas Mikolovらが発表した、ベクトル空間上で単語を表現する手法です。
この手法を使った結果の有名な例として、
「king(王)」-「man(男)」=「queen(女王)」
※正確には「王様」-「男性」+「女性」=「女王」でした。すみません。お時間ある方は、この式で試してみてください。
と、上記のものがあります。
これは、「王から男の要素を抜くと女王になる」と、あたかも単語の意味をAIが理解しているような式を作ることができます。
これは、Word2Vecの考え方である、ベクトル空間上に単語の意味を置くことによって、近い意味を持つ単語は、空間上の位置が近くなり、意味が似ていないものは離れるようになっていることからくる結果です。
詳しい説明は、論文に書かれていますので、興味がある方は覗いてみてください。
英語の論文ですので、英語が苦手な方などは、arXiv Vanityなどで翻訳して読むといいと思います。私も、英語が苦手なのでこのサイトで翻訳して読みました...。
ファイルの準備 & モジュールのインストール
ここから実際に、Word2Vecで色々やってみたいと思います。
※ここからは、環境構築が済んでいることが前提です。
※環境構築ができていない方は、別記事の環境構築解説を見て、環境を構築してから読み進めてください。以下にリンクを貼っておきます。
https://frqux.hatenablog.com/entry/2023/01/26/175649
以下、私の環境です。今回はモデル構築は行わないので、CPUやGPU、メモリなどは弱々でも動くと思います。
- OS Windows 10 Home
- Anaconda(windows)
- Python 3.10.9
- CPU Intel(R) Core(TM) i9-10900 CPU @ 2.80GHz 2.80 GHz
- GPU NVIDIA Geforce RTX 3070
- メモリ 32GB
まず、Word2Vecの学習済みモデルをダウンロードします。
今回使わせていただくモデルは、東北大学の方が作成したモデルで、日本語のWikipediaの本文全文から学習させています。
ダウンロードは、以下のリンクから各自行ってください。
http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/
ページに飛びましたら、ダウンロード覧からファイルをダウンロードしてください。
私は、「20170201.tar.bz2」のファイルを使って行います。
ダウンロードしましたら、自分が使うワークスペース上に置いてください。因みに私は、Dドライブに「word2vec」というフォルダーを作成して、そこをワークスペースとして作業を行います。
次にAnaconda Navigatorを起動して、「Open Terminal」を押して、CUIを開きます。
そこから、先ほどのファイルを保管しているディレクトリ(フォルダ)まで移動していきます。
※数字の順番で押してください。2番は人によって環境が違うと思うので、base(root)しかない方は、base(root)のターミナルを開いて問題ありません。
このようにコマンドでディレクトリを下って行ってください。
わからない人用にコマンドを説明します。
cd [ディレクトリ名] ... 指定したディレクトリ(フォルダ)に移動。
ls ... 現在のディレクトリ内のフォルダやファイルを一覧表示する。
因みに、私のようにDドライブにフォルダを作ったために、CドライブからDドライブへ移動しなければならい場合は、
D:
と入力すれば簡単にDドライブに移動できます。
そして、ファイルの解凍を行います。
ターミナルに、
「tar -jxvf 20170201.tar.bz2」
と入力し、エンターを押すと解凍が始まり、最終的に「entity_vector」というフォルダが作成されます。
次に、必要なモジュールをインストールします。
ターミナルにて、
「pip install gensim」
と入力してgensimをインストールします。
Word2Vecを使ってみる
Word2Vecで、単語ごとの類似度を出したりするのですが、これをjupyter notebookで行います。
jupyter notebook とは、webブラウザ上でpythonなどを記述できる、統合開発環境です。
特徴としては、CUIと違って視覚的に理解ができる点と、対話型の実行形式である点です。
対話型の実行形式とは、少しコードを書いて実行し返答を見る。その後また少しコードを書いて、また返答を見る。と、一問一答形式で記述・実行できる形式です。
では、jupyter notebookを開きましょう。
「jupyter notebook」
と入力して開きましょう。
jupyter notebook が開けない場合は、各自インストールをしてください。
「python -m pip install jupyter」とターミナルに入力すれば、簡単にインストールはできると思います。
開いたら、ipynbファイルを作成して、コードを記述します。
右上のnewを押して、出てきたドロップダウンメニューの「Python3(ipykernel)」を押して、ipynbファイルを作ります。
そして、下の画像のように入力していってください。
これで、単語のベクトルの類似度を出すことができています。
4行目の、
model.most_similar(u'[@@@@@]')
ここの@@@@@の部分を好きな単語に置き換えれば、それに近い単語がいくつか出力されます!
上の私が試した例では、「ドラゴンボール」という単語の意味に近い単語は、神龍となっていますね...。その右に表示されている数値が類似度になっています。
なぜか「カービィ」が上がってきていることに驚きです。
同じ点はアニメということだけな気がしなくもないのですが....なぜでしょう(笑)。
ほかにも色々試してみましょう!
ガンダムで類似検索してみると、1位と2位にガンダム。3位にガンダムの型式番号である「RX-78」が出てきました!すごい!
お次は、最初に紹介した単語の引き算をやってみます。
model.most_similarの引数に、positiveとnegativeを与えてあげることで、
positiveの単語 - negativeの単語
の式の答えになるような単語が出力されます。
試しに、「王 - 男」をやってみましょう。
...。
女王と出てほしかったのですが...(笑)。
日本語と英語では、違うことも多いでしょうし、学習されてるデータの違いによっても、単語ベクトルは変わるので、それが原因でしょう。
ほかにもやってみましょう!
なんと、人間から命を取ると、Windowsになるらしいです。
他にも、単語の足し算などができるので、各自で調べてやってみてはいかがでしょうか。
残念なのは、Word2Vecのモデルが古いために、学習されたデータももちろん古いものです。なので、「ウマ娘」や「official髭男dism」など、最近の単語は認識できませんし、類似度を出すこともできません...。
ですがご安心ください。近年では、Word2Vecを超える高性能なモデルが作られていますし、日々改良されています!
今後そういったものも紹介できればと思います。
Word2Vecは、革新的な技術でありましたが、もう古い技術でもあります。ですが、決して悪いものではなく、今日の自然言語処理の考えのもとになったものでもあり偉大な功績を残しているものです。
今回、Word2Vecを紹介できて、とてもよかったと思います。
また次回、別のモデルを試してみたいと思うので、何卒よろしくお願いします!