かえるるる(@kaeru_nantoka)です。
今回は、「日本語 ELMo の Tutorial 」と題して、私が来たる 4月より join するストックマーク社が公開した(一応掲載許可はもらいました) pre-trained model ELMo の日本語 ver を Google Colaboratory で扱う手順をご紹介します。
日本語版 ELMo についての詳細は、ストックマーク社のホームページをご覧ください。 ( https://stockmark.ai/2019/01/25/783/ )
私の GitHubリポジトリ( https://github.com/osuossu8/Utils/blob/master/ELMo_ja_Try.ipynb )
に公開しております、ソースコードのセル番号と Agenda に沿って、ご説明いたしますので、合わせてご覧ください。
それでは、やっていきましょう。
Agenda
- MeCab の設定をする
- ELMoForManyLangs を clone する
- 日本語版 ELMo を wget する
- 必要なその他パッケージを入れる
- Config file の設定をする
- 実験してみる
1 ) MeCab の設定をする。
英文と異なり、日本語文は単語毎の切れ目が(プログラム目線で)わかりにくいため、「分かち書き」といって文章を単語毎に区切る前処理が必要になります。
Google Colab 上でのセットアップは下記記事の通りにやったところ 2019/02/23 現在できました。 ( https://qiita.com/pytry3g/items/897ae738b8fbd3ae7893 )
セル上の [1]-[3] のコマンドを実行するだけです。
2. ELMoForManyLangs を clone する
3. 日本語版 ELMo を wget する
2, 3 では 元のELMo と日本語版ELMo 本体をDL してます。git clone やら wget やらして最後に unzip で 解凍します。
4. 必要なその他パッケージを入れる
[9] [10] で overrides というパッケージを一旦アンインストールしてインストールし直しています。 overrides はデフォルトで入っているようなのですが、デフォルトのままだと後のセルでエラーを吐いちゃうので入れ直しています。
Google Colab 上だとこれで良いのですが、GCP でやる場合は、テキストで記述している h5py, torch もインストールする必要があります。
5. Config file の設定をする
設定ファイルをいじります。
デフォルトだとディレクトリごと必要な json ファイルがないので、
ja/configs/cnn_0_100_512_4096.json
となるようにディレクトリと json ファイルを用意します。
そして、Colab 上だと vi, vim が使えなかったので(使っている方いらしたら教えてください。。)、マジックコマンドの %%writefile を使いました。
%%writefile ファイル名 とセルの最初にかくと、そのセルの記述内容がファイルに書き込まれるようです。
ここまで準備が完了すると、[15]セルのように日本語を埋め込みベクトルに変換することができます。
6. 実験してみる
ELMo の強みは、文意を汲み取って同じ単語でも意味が異なればきちんと別なベクトルで表現することができる点です。
英語版の実験ですと、以下の記事で言及されているものがわかりやすいです。 ( https://qiita.com/tktktks10/items/a189f88e6e963c441c8f )
ということで、似たような文意だが単語の役割がことなる3つの以下の文章
- "かえるるるはその本を読んだ"
- "かえるるるは流行りの小説を読んだ"
- "かえるるるが買ったマンガ
の文ベクトルの cos類似度を見てみる実験をして見ました。以下その解説です。
ぱっと見、1 と 2 は 「SがOをVした」という内容で 2 と 3 は「SがVしたO」という内容なので文意が若干異なります。違いがきちんと数字に現れるでしょうか。。
(もっと適切な例文があるよという方はアドバイスくださると嬉しいです。マサカリお待ちしてます。)
・[18] 文章を分かち書きします。(文章(str) -> 単語リスト)
・[19] 単語リストを ELMo に投入します。 (単語リスト -> ベクトルのリスト)
[20] にあるように、vector_list[0] に投入した単語の数だけのベクトルができています。 str2_vec の場合は、["かえる", "るる", "が", "買っ", "た", "マンガ"] の6語投入したので、str2_vec[0][0] ~ str2_vec[0][5] までの6つベクトルができています。shape を見てみると全単語 1024次元で表現されています。
・[0(21)] 分かち書きして得られた単語をインプットに単語毎のベクトルを得ることができたのでこれらを足し合わせて文ベクトルとします。
sum をとったり mean をとったりするらしいです。今回は、sum を用いますが、このような単純な線形和でもちゃんと work するらしいです。
[22] 単語ベクトルの線形結合ベクトルをインプットに cos 類似度を求めます。
かえるるるはその本を読んだ かえるるるは流行りの小説を読んだ similarity = 0.9651474 かえるるるはその本を読んだ かえるるるが買ったマンガ similarity = 0.9467888
となりました。
はじめの予測通り「SがOをVした」という内容が同じものは1.0に近く(文意が似ている)、「SがVしたO」というように同じような単語が並んでいながらも文脈が異なるように使用されているものはより1.0から離れた結果になりました。
終わりに
Google Colab という取っ掛かりやすい環境で日本語で学習した ELMo の環境構築及び簡単な実験まで紹介いたしました。
これを機会にNLPに興味を持ってくださる方が増えたら嬉しいです。
ありがとうございました!