単語の分散表現を学習させる際、Wikipedia ほどのサイズが必要ないときに使われるコーパスとして text8 があります。 text8 は、Wikipedia に対してクリーニング等の処理をした後、100MB分切り出して作成されています。 text8 は前処理済みで簡単に使えるので、チュートリアル等でよく利用されています。
text8 は便利なのですが、英語にしか対応していないのが欠点でした。 そのため今回は、text8 の日本語版(もどき)を作ってみました。 前処理済みなので、ダウンロードしたらすぐに使うことができます。
作成したコーパスは以下のリポジトリからダウンロードできます。スターしていただけると励みになりますm(_ _)m
本記事では、日本語版 text8 コーパスの作成方法を説明し、作成したコーパスを使って分散表現を学習します。 次の3つの内容で構成されています。
- text8コーパスとは
- 日本語版の作成
- 分散表現の学習
text8コーパスとは
先に述べたように、text8 コーパスは Wikipedia を前処理して作られています。 具体的には、以下のような前処理が行われています。
- テキストと画像キャプションは保持
- テーブルや外国語バージョンへのリンクを除去
- 引用、脚注、マークアップを除去
- ハイパーテキストはアンカーテキストだけ保持。それ以外は除去
- 数字はつづりを変換。たとえば、"20"は"two zero"に変換
- 大文字を小文字に変換
- a-zの範囲に入らない文字はスペースに変換
実際の中身は、単語が空白で区切られて格納されています。以下のような感じです。
日本語版text8コーパスの作成
text8コーパスの作り方を参考に、日本語版を以下の手順で作成します。
Wikipediaのダウンロード
まずは、コーパスを作る元になる Wikipedia のダンプデータをダウンロードします。 今回使用するのは、Wikipediaは2017年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アカウントでも機械学習や自然言語処理に関する情報をつぶやいています。
この分野にご興味のある方のフォローをお待ちしています。