終末 A.I.

データいじりや機械学習するエンジニアのブログ

Wikipedia を word2vec する

前回、青空文庫で word2vec を試してみましたが、結果を見ての通り、作家によって類似する単語が違ったり、そもそも語彙が少ないため、あまり汎用性のある結果を得ることはできませんでした。

ksksksks2.hatenadiary.jp

そこで今回は、日本語 Wikipedia のダンプデータを使用して、word2vec で学習させてみました。 Wikipedia ではこちらに記載されているように、Wikipedia 上で作成された様々なデータのダンプデータを配布しています。主なものだと、全ページの要約や全文、変わったものだと、ページ間のリンク関係のデータなどが含まれています。 今回は、日本語の最新情報から全文情報を取得して、使用しました。ちなみに、このデータは圧縮時でも2GB、展開すると10GB近くあるデータになります。このデータは XMLwiki 記法で記述されておりそのままでは使用できないため、wikiextractorを使用して平文になおした後、mecab分かち書きに変換して学習に用いました。ちなみに学習に用いたデータは3GBほどになります。

結果の比較のため、イテレーション回数と学習アルゴリズムを変えて試してみました。イテレーション回数は、1回と10回。アルゴリズムは、cbow と skip−gram を使用しました。word2vec と cbow の詳細は、前回の記事ををご覧ください。skip−gram は、cbow とは逆で単語を入力し文脈語を出力するニューラルネットワークを学習する点が特徴です。サンプリングなどの学習に用いるテクニックは cbow と共通ですが、バックプロバケーションの必要がある出力が多いため、cbow より3〜4倍ほど学習に時間がかかります。 CPU4コア、メモリ16GHzの環境だと、skip−gramでイテレーション回数を10回にした場合、だいたい丸二日ほどかかりました。

できれば評価データを用いて定量的に見たかったのですが、日本語での評価データを探しきれなかったため、前回と同様、何個かピックアップして結果を見ていきたいと思います。結果を見るのは、単語同士の類似度比較と、単語の組み合わせでの類似度(足し算引き算の結果)比較を行いました。

  • 単語類似度

問題

ランク cbow 1 skip−gram 1 cbow 10 skip−gram 10
1 弊害 解決 課題 解決
2 課題 課題 矛盾 課題
3 不都合 コンフリクト 不都合 難問

明日

ランク cbow 1 skip−gram 1 cbow 10 skip−gram 10
1 きっと あした いつか あした
2 あした 明後日 きっと あす
3 君たち きっと あした きっと
  • 単語の組み合わせ類似度

日本 + 東京 - アメリカ

ランク cbow 1 skip−gram 1 cbow 10 skip−gram 10
1 ロサンゼルス ニューヨーク ニューヨーク ニューヨーク
2 ニューヨーク ヨンカーズ ロサンゼルス ロサンゼルス
3 サンフランシスコ ファロン ロンドン カリフォルニア

昼 + 太陽 - 夜

ランク cbow 1 skip−gram 1 cbow 10 skip−gram 10
1 満月 満月 満月 満月
2 夜空 夜空 夜空 トラウィスカルパンテクートリ
3 地平線 まばゆい 地平線 ぃだ

基本的にイテレーション回数が多い方が良いように見えますが、4番目の「昼 + 太陽 - 夜」を見ると、skip−gram 10の2,3番目の結果は全く意味が分かりません。「トラウィスカルパンテクートリ」はアステカ神話における明けの明星を擬人化した神様であるとのことです。「ぃだ」については全くわかりません。「てぃだ」であれば沖縄で太陽を意味する方言になりますが、mecab分かち書きする時点でうまく処理できていないものと思われます。

また、「明日」の類似単語として「きっと」が現れたり、「日本 + 東京 - アメリカ 」の結果に「ワシントン」が出てこないなど、必ずしも意図していない結果が出てきています。このあたりのアルゴリズムコーパスと欲しい結果とのギャップを埋めるようなワンクッションが、学習過程か学習結果の利用時にまだまだ必要そうです。