こんにちは。ふらうです。
今回、Doc2Vecというものに触れていきたいと思います。
使用環境
- OS Windows 10 Home
- Anaconda(windows)
- Python 3.7.16
- CPU Intel(R) Core(TM) i9-10900 CPU @ 2.80GHz 2.80 GHz
- GPU NVIDIA Geforce RTX 3070
- メモリ 32GB
- gensim 3.8.3
Doc2Vecとは
Doc2Vecの2種類のアーキテクチャ
Doc2Vecは、可変長のテキスト・文章を固定長のベクトルに変換する教師無しアルゴリズムという風に論文では紹介されています。
簡単に言うと文章をベクトルに変換する手法ということです。
前回紹介した"Word2Vec"が、単語をベクトルに変換する手法だったのですが、それの発展形と思ってもらえればよいです。
Doc2Vecには、
- PV-DM(Distributed memory Model of Paragraph Vectors)
- PV-DBOW(Distributed Bag of Words version of Paragraph Vectors)
と、上記の2つのアーキテクチャがあります。
本記事では、簡単な説明と触ってみる部分までを行うので、詳細な部分には触れません。詳細が知りたい方は、論文に目を通すことをお勧めします。
PV-DM(Distributed memory Model of Paragraph Vectors)
PV-DMは、word2vecのCBOWモデルと似ています。
PV-DMでは、単語ベクトルとは別に文書IDを用意して、その文書ベクトル(論文内では段落ベクトル)を求める方法ですね。
上記の図は、論文より引用してきたもので、「on」の単語ベクトルを求めるために、周辺後の"the", "cat", "sat" を参照しているというものです。
ここに文書IDを追加して学習することで、文書ごとのベクトル(文書ベクトル)が求められるという考えのもと作られました。
上の図の「Paragraph id」というものが文書IDとなります。
このように、文書ベクトルと単語ベクトルの連結を考慮して、テキストウィンドウ内の次の単語を予測していくことで、文書ベクトルが求められます。
PV-DBOW(Distributed Bag of Words version of Paragraph Vectors)
PV-DBOWモデルは、word2vecのskip-gramと似ています。
名前からしてCBOWと似ていると思いがちですが、skip-gramと似ています。
上図を説明すると、まず文書IDとそれに属するテキストを用意し、文書IDからそのIDに属するテキストの各単語を予測することで文書ベクトルを求めることができるという考えです。
BOW(bag of words)の名の通り、語順を考慮せずに、とにかく属する単語を導いているだけなので、文脈などは一切考慮されません。
Doc2Vec
Doc2Vecは、今説明した2種類のアーキテクチャを組み合わせたものです。
実際に行った実験では、PV-DBOWのベクトルと、PV-DMの2つのベクトルを連結したものを分類子に提示しています。PV-DBOWおよびPV-DMの2つのベクトルの次元は、どれも400次元です。
しかし、実験の結果PV-DMだけでもかなりの高精度を出すことができたため、必ずしもCBOWと組み合わせることは無いということがあります。
そのため、gensim*1などではDoc2Vecで文書ベクトルを出す場合にPV-DMのみを使用するということがしばしばあります。
Doc2Vecを使ってみる。
ここからは、実際にDoc2Vecを読み込んで、文書ベクトルの確認、および色々遊んでみたいと思います。
今回は、学習済みのモデルをダウンロードして遊んでみます。
実際に1から学習させる手順等は、後々別の記事で紹介するとします。
事前学習済みモデルのダウンロード
今回使わせていただく学習済みモデルは、yag-ays様が公開してくださっている、日本語のwikipediaで学習したDoc2Vecです。
以下のURLより、ページに飛んでダウンロードをしてください。
すると、以下のようなページに飛びます。
その少し下にあるdropboxのリンクから、dropboxのページに飛び、ダウンロードしましょう。
すると、「jawiki.doc2vec.dmpv300d.tar.bz2」というファイルがダウンロードされますので、それを自分のワークスペースに移動させてください。
ちなみに私は、Dドライブの"mypy"というフォルダに"doc2vec"というフォルダを作って、そこで遊んでみます。
また、環境構築の方法については、別記事で紹介・説明しております。比較的簡単にできる方法を紹介してますので、まだ環境がない方はそちらを参考にしてください。
学習済みモデルのファイルの解凍
ターミナルを開いて、先ほど学習済みモデルを保存したフォルダに移動してください。
そして、先ほどのファイルを解凍するために、以下のコマンドを入力しましょう。
「tar -jxvf jawiki.doc2vec.dmpv300d.tar.bz2」
これで、解凍が始まりますので、しばらく待ってください。
必要なライブラリのインストール
今回使用するPythonのバージョンは、ライブラリのバージョンと合わせるため、Python3.7.16としています。新たにPython3.7.16の仮想環境を作るか、ダウングレードするかして、事前に環境を整えてください。
今回は、pythonコードを記述するのに、jupyter notebookを使いますので、各自インストールをお願いします。
Anaconda Navigatorをお使いの方は、Home画面にある「Notebook」のインストールボタンを押していただければ大丈夫です。
それ以外の方は、
- pip install notebook
- conda install -c anaconda notebook
この2つのいずれかのコマンドをターミナルで入力すればインストールできると思います。
ターミナルを開いて、学習済みモデルが保存されているフォルダへ行き、
「jupyter notebook」
とコマンドを打ってください。するとブラウザが開き、jupyter notebookが起動します。
ここで、新しいipynbファイルを作成します。
ipynbファイルは、右上の「new」のプルダウンメニューから、「Python 3(ipykernel)」を押せば作成できます。
ここから、ライブラリのインストールを行っていきます。
まず、以下のコマンドでgensimをインストールしましょう。
最新のgensimでは、エラーが起こるため、gensimのバージョンを3.8.3に落としてインストールします。
コマンドは、shift+Enterで確定(実行)させることができます。
すると、必要なgensimのライブラリがインストールされます。
次に、形態素解析(文章を単語に変換する)を行うためにmecabというものをインストールします。
次は辞書をダウンロードします。これは、文章を単語に分割する際に必要になるものです。
今回の場合、本来はPV-DMモデルの学習に使われた「neologd」という辞書を使うべきなのですが、導入が面倒であり、今回の記事は初学者でもわかるように解説するので、unidic-lite辞書を使います。
これで必要なライブラリはインストールできました。
学習済みモデルの読み込み
以下のコマンドを打って、先ほど解凍したPV-DMモデルを読み込みます。
これが完了すると、モデルの読み込みが完了したことになります。
類似ドキュメントの表示
学習モデルを作成した、yag-ays様の通りに実行すると、以下のようになります。
アリストテレスの文章と近しい文章が、類似度順に表示されます。
Word2Vecと同じように「ドラゴンボール」と打った場合は以下のようになります。
ドラゴンボール関係のものが多く出てきていて、うまくベクトルが振られていると考えられます。
最後に、Word2Vecの時にもあった、"「王」-「男性」-「女性」"を試してみると、
4位と5位に、"王妃","皇女"がでてきました!!
これは、上記の式を解くことができたのではないでしょうか?
未知ドキュメントの表示
次に、私たちが入力するテキストの解析をしてみましょう。
まず、入力されたテキストを形態素解析する関数を作ります。
これで、tokenize(@@@)の"@@@"の部分に文章を入れると分かち書きされるようになります。
試しに何か入れてみましょう。
」
「今日は雨が降っている。」という文章が、8つの単語へと分割されました。
では、実験用にテキストを作ってみましょう。
今回使うテキストは、yahooニュースの今日の記事から持ってきました、
""
トヨタ自動車が1月26日に新人事を発表。4月1日から、現レクサスとGRのトップを務める佐藤恒治氏が社長に、現社長の豊田章男氏は代表取締役会長に就任する。同社は16時からライブ配信にて、豊田氏の口から社長交代に至った経緯などを説明したが、そこで語られたのが「クルマ屋の限界」というフレーズだった
""
という文を入力したいと思います。
まず、変数textに上の文章(文字列)を入れます。
これの文書ベクトルを可視化してみると、以下のようになります。
これで、未知の文書(yahooニュースの記事)をベクトルに変換することができました。
類似する文書の検索
これを、model.docvecs.most_similar([@@@])の"@@@"の部分に入れてあげることで
のように、類似する文書を出すことができます。"Honda S660 CONCEPT"の文章と一番似ているという風に結果が出ていることから、車関係であることで類似度が高くなっているようです。
また、話題のChatGPTのwikipedia文
""
ChatGPT(チャットジーピーティー、Generative Pre-trained Transformer)は、OpenAIが2022年11月に公開したチャットボット。OpenAIのGPT-3.5ファミリーの言語モデルを基に構築されており、教師あり学習と強化学習の両方の手法で転移学習されている。
""
これを入力してみたところ、
このような結果となりました。
何やら、数式処理システムやらが出てきておりますが、下のほうにOpenAIや人類進化というものが出てきてますので、まあ類似してるといえば、してる方なのかなと感じます。
終わりに
今回は、Doc2Vecについて簡単にまとめてみました。
私自身、ライブラリのバージョンやpythonのバージョンの違いなどが判らずエラーで困っていた時期がありましたので、そういったことに考慮して記事を書きました。
この記事が、何かの参考になればうれしいと思います。
最後まで見ていただきありがとうございました。
他にもいろいろ記事を書いてますので、そちらも見ていただけますと幸いです。
では、よいAI開発ライフを。(/・ω・)/