Ahogrammer

Deep Dive Into NLP, ML and Cloud

日本語版text8コーパスを作って分散表現を学習する

単語の分散表現を学習させる際、Wikipedia ほどのサイズが必要ないときに使われるコーパスとして text8 があります。 text8 は、Wikipedia に対してクリーニング等の処理をした後、100MB分切り出して作成されています。 text8 は前処理済みで簡単に使えるので、チュートリアル等でよく利用されています。

text8 は便利なのですが、英語にしか対応していないのが欠点でした。 そのため今回は、text8 の日本語版(もどき)を作ってみました。 前処理済みなので、ダウンロードしたらすぐに使うことができます。

作成したコーパスは以下のリポジトリからダウンロードできます。スターしていただけると励みになりますm(_ _)m

本記事では、日本語版 text8 コーパスの作成方法を説明し、作成したコーパスを使って分散表現を学習します。 次の3つの内容で構成されています。

  • text8コーパスとは
  • 日本語版の作成
  • 分散表現の学習

text8コーパスとは

先に述べたように、text8 コーパスWikipedia を前処理して作られています。 具体的には、以下のような前処理が行われています。

  • テキストと画像キャプションは保持
  • テーブルや外国語バージョンへのリンクを除去
  • 引用、脚注、マークアップを除去
  • ハイパーテキストはアンカーテキストだけ保持。それ以外は除去
  • 数字はつづりを変換。たとえば、"20"は"two zero"に変換
  • 大文字を小文字に変換
  • a-zの範囲に入らない文字はスペースに変換

実際の中身は、単語が空白で区切られて格納されています。以下のような感じです。 f:id:Hironsan:20171004104454p:plain

日本語版text8コーパスの作成

text8コーパスの作り方を参考に、日本語版を以下の手順で作成します。

  1. Wikipediaのダンプデータのダウンロード
  2. wikiextractorでデータをクリーニング
  3. 文書を選択
  4. 形態素解析

Wikipediaのダウンロード

まずは、コーパスを作る元になる Wikipedia のダンプデータをダウンロードします。 今回使用するのは、Wikipedia2017年10月01日のダンプです。 手動で「jawiki-20171001-pages-articles.xml.bz2」をダウンロードするか wget を使って取得しましょう。

$ wget https://dumps.wikimedia.org/jawiki/20171001/jawiki-20171001-pages-articles.xml.bz2

テキストのクリーニング

ダウンロードした Wikipedia のデータには不要なマークアップ等が含まれるので、それらをクリーニングしてしまいます。 テキストのクリーニングには、wikiextractor を使います。 wikiextractor をダウンロードした後、以下のコマンドを実行して、テキストのクリーニングを行います。

$ python WikiExtractor.py -o extracted jawiki-20171001-pages-articles.xml.bz2 

wikiextractor でクリーニングしたテキストは、以下のように格納されています。

<doc id="5" url="https://ja.wikipedia.org/wiki?curid=5" title="アンパサンド">
アンパサンド

アンパサンド (, &) とは「…と…」を意味する記号である。

その意味は"and [the symbol which] by itself [is] and"である。
...

</doc>

一つの文書はタグで囲われていて、その中の一行目は文書のタイトルです。 ここからさらに、タグ、タイトル、改行を取り除き、大文字を小文字に変換した後、一行に一文書になるように保存します。

文書選択

テキストのクリーニングが終わったら、コーパスに含める文書を選択します。 文書の選択手法として、Wikipedia内のページランクを使う方法もありますが、今回は100MBに達するまでランダムに文書を選択します。 選択した文書は形態素解析器を用いて分かち書きをした後、ファイルに保存します。

形態素解析器で分かち書き

コーパスに含める文書を選択したら、形態素解析器で分かち書きします。 この際、形態素解析で用いる辞書には IPADIC を選択します。 形態素解析器には MeCab を使い、分かち書きした結果を保存します。

以上で、コーパスは完成です。総単語数と異なり語数を求めてみましょう。

>>> f = open("ja.text8")
>>> words = f.read().split()
>>> len(words)
16900026
>>> len(set(words))
290811

総単語数は16,900,026、異なり語数は290,811という結果になりました。

word2vecの学習

作成したコーパスと gensim の word2vec を使って単語の分散表現を学習させてみます。 コーパスをダウンロードした後、以下のコードを実行して学習させましょう。学習は2分ほどで終わるはずです。

import logging
from gensim.models import word2vec

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
 
sentences = word2vec.Text8Corpus('ja.text8')
model = word2vec.Word2Vec(sentences, size=200)

学習が終わったら、実際に試してみます。

>>> model.most_similar(['日本'])
[('中国', 0.598496675491333),
 ('韓国', 0.5914819240570068),
 ('アメリカ', 0.5286925435066223),
 ('英国', 0.5090063810348511),
 ('台湾', 0.4761126637458801),
 ('米国', 0.45954638719558716),
 ('アメリカ合衆国', 0.45181626081466675),
 ('イギリス', 0.44740626215934753),
 ('ソ連', 0.43657147884368896),
 ('海外', 0.4325913190841675)]

うん、まぁまぁ良さそうですね!

おわりに

本記事では日本語版のtext8の作成とそれを用いた単語分散表現の学習を行いました。 これにより、ちょっとしたデータで分散表現を学習するのがすぐにできるようになりました。 本記事が皆様のお役に立てば幸いです。

私のTwitterアカウントでも機械学習自然言語処理に関する情報をつぶやいています。

この分野にご興味のある方のフォローをお待ちしています。

参考資料