Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

Wikipediaの文書を使って文の長さの平均を求める

Wikipediaの文書を使って文の長さの平均値と最頻値を求めました。機械学習勉強会 in 新潟で発表した内容です。Wikipedia の約60億文字以上のXMLファイルから、独自に定義した文を抜き出し、その文に対して統計量を求めました。使用言語はいつも通りPythonです。

1. 動作環境について

コードは以下の環境で動作確認を行っています。

  • CPU:6コア
  • メモリ:256GB
  • HDD:50GB

※環境はGCE(Google Compute Engine)で行っています。実行する場合はメモリ量に注意してください。

2. Wikipedia 文書のアーカイブについて

Wikipedia の文書は以下からダウンロードできます。 "jawiki-latest-pages-articles.xml.bz2"の中にあるXMLが今回解析に使用したファイルになります。

dumps.wikimedia.org

3. 発表スライド

発表スライドは、一番下に置いておきましたので、そちらをご覧ください。

4. やってみた感想

まず、このような分析は、自然言語処理の分野では頻度分析と呼ばれるらしいです。統計ですね。最近は統計のビジネス書をコツコツ読んで勉強していたたため、おかげでサンプルデータの分布を見た瞬間パラメタ推定できると気づくことができました。
パラメタ推定は本で読んでいたけど実際やってみると、ニューラルネットワークなど必要とせず非常にシンプルなのですが、強力でした。今回は、分布が対数正規分布にフィットしたのですがその理由を考察するときに、仮定した関数の性質が役に立ちました。結果、個人的に納得感のある考察を得ることができました(対数正規分布に従うのはなぜか?の考察です)。
最後ですが、Wikipediaを日常的に使用していたため、その中に法則性が存在するという事実に驚きました。おそらく解析しないと一生気付かなかったと思います。個人的に、その法則性の存在を客観的に示せたので非常に有意義だったと思います。また、求めた最頻値の値自体にも、価値があると思います。この値はWikipediaで遭遇する可能性が一番高い文の文字列の長さなので、それは、もしかすると我々が最も親しんでいる文字列長かもしれません。そのため24文字を目指して文を書くとわかりやすさの改善に繋がるつかもしれません。ビッグデータの時代ですが、手付かずのデータが山ほどあるとのことなので、まだ誰も知らない事実がデータの中に大量に眠っていると推測されます。今後それらのデータの中から、想像もしなかった事実が出てくることを期待しています。

5. 発表会で上がった質問や意見

発表会で上がった質問をここにメモしておきます。これらの質問や意見については、今後扱うかもしれませんし、扱わないかもしれません。個人的には、最頻値を求めて十分満足してしまったため、あとやったら面白そうなことは、コーパス教師なし学習クラスタリングなど)をさせてテキストマイニングするくらいしか思いつかないです。あと人工無脳

1. 他の分布で推定してみたらどうなるのか?例えばポアソン分布でやってみたらどうなるか?
→ ググったら一番最初に出てきたキーワードが対数正規分布だったのでそれでやってみた、ポアソン分布ではパラメタ推定していない。(ただし、対数正規分布でパラメタ推定を行ったきっかけはどうであれ、実際は、考察に記載したように対数正規分布を仮定するもっともらしい理由があるため、ポアソン分布や他の分布でパラメタ推定は行う必要性を感じなかった)
2. 集めた文(コーパスとも言える)を今後どういったことに使えるのか?
→ オートエンコーダによる教師なし学習(クラスタリング)を行いテキストマイニングを行うことが考えられる。
3. Wikipediaではなくニュースサイトなどの文の場合は違う分布になるのか?
→ 本などをみるとコーパスの分野が変わると違う分布になったり、あるコーパスで学習した機械学習のモデルが、別の分野のコーパスを入力して予測すると精度が落ちるなどの事例がある様子。そのため、ニュースサイトの分布とは異なるものになる可能性が高い。
4. XMLの読み込みにかかる時間はどれくらいか
→ 約15分くらい
5. 正規表現の適用にかかる時間はどれくらいか
→ 6コアCPUで分散処理しているため早い、約5分くらい。CPUを増やせばほぼリニアに早くなる(←発表では10分くらいと言ったかもしれませんが訂正します)

発表スライド

発表したスライドになります。正規表現が冗長になっており(スクエアブラケットの中のバックスラッシュのこと)、もっとコンパクトにできますが、そこは認識しています。時間がないため修正せずにあげています。ご指摘ありましたらコメントをお願いいたします。
以上。

f:id:keimina:20190225193006j:plain
スライド1
f:id:keimina:20190225193114j:plain
スライド2
f:id:keimina:20190225193134j:plain
スライド3
f:id:keimina:20190225193152j:plain
スライド4
f:id:keimina:20190225193210j:plain
スライド5
f:id:keimina:20190225193306j:plain
スライド6
f:id:keimina:20190225193403j:plain
スライド7
f:id:keimina:20190225193417j:plain
スライド8
f:id:keimina:20190225193434j:plain
スライド9
f:id:keimina:20190225193448j:plain
スライド10
f:id:keimina:20190225193501j:plain
スライド11
f:id:keimina:20190225193520j:plain
スライド12
f:id:keimina:20190225193609j:plain
スライド13