接着剤の精進日記

競プロでの精進や研究に関係したことを書いていきます。

Wikipediaコーパスを使った,word2vecのモデル作成

はじめに

今回は,word2vecのモデルをWikipediaの記事本文を使って作成していきます.
以下参考記事です.ほとんど以下の記事に沿って進めました.
qiita.com

環境

Linux(CentOS7)
Python3.6
今回はLinuxサーバ上で行いましたが,Macなどのターミナルでも同様にできると思います.

コーパスの準備

コーパス作成の流れ
1.日本語版Wikipedia記事のXMLをダウンロードする
2.WikiExtractorというツールを利用し,XMLファイルから記事本文だけを抽出する

まず最初に,WikiExtractorをgitからcloneしてきます.

git clone https://github.com/attardi/wikiextractor.git

wikiextractorというディレクトリができているので移動します.

cd wikiextractor

次に,Wikipedia記事のXMLファイルをダウンロードします.

curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2

とすることでダウンロードできます.
容量が約2GBほどあるので,時間がかかります.

ダウンロードが終わったら,先ほどcloneしてきたWikiExtractorを使用し,
XMLファイルから,記事本文を抽出します.
使い方は以下の通り,インストールし,コマンドを入力することで抽出できます.

sudo python setup.py install
python WikiExtractor.py jawiki-latest-pages-articles.xml.bz2

先程と同様抽出に時間がかかるので,しばらく待ちましょう.
抽出が終わると,textというディレクトリが新たにできます.

作成されたtextディレクトリには,複数ファイルに分割されているので
それを一つのtxtファイルにまとめます.

find text/ | grep wiki | awk '{system("cat "$0" >> wiki.txt")}'

とすることでwiki.txtという一つのファイルに出力できます.

以上でコーパスの準備は終わりです.

word2vecのモデル作成

コーパスを作成したので,これを利用してword2vecのモデルを作成します.

モデルの作成には,gensimを使用します.
pipでインストールできます.

pip install --upgrade gensim

gensimでモデルを作成する際には,コーパスわかち書きにする必要があるので
mecabを用いて,コーパスをわかち書きにします.
mecabのインストール方法は以下の記事などを参考にしてください.
qiita.com

mecabがインストールされたら,以下のコマンドでコーパスをわかち書きにします.

mecab -Owakati wiki.txt -o wiki_wakati.txt -b 16384

デフォルトの設定だと,MeCab Error “input-buffer overflow. The line is split. use -b #SIZE option.”
というエラーが発生してしまったので -b 16384というオプションをつけています.
このエラーは1行あたりの文字列が(デフォルトの) 8192 文字を超えた時に表示されるみたいです.
"-b"オプションを付けてバッファ・サイズ(一時処理領域)を(デフォルトの2倍の)16384文字にしています.

参考記事でも挙げられていますが,作成されたwiki_wakati.txtにはバイナリ文字が含まれています.
nkfを利用して,utf-8に変換します.
nkfが入っていない場合は以下のコマンドでインストールできます(CentOS7)

sudo yum localinstall -y http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86_64.rpm

使い方は以下の通り.

nkf -w --overwrite wiki_wakati.txt

これでutf-8のtxtファイルができたのでモデル作成ができます.
モデル作成のために,make_models.pyを作成します.

vi make_models.py

以下を記述します.

from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus('./wiki_wakati.txt')

model = word2vec.Word2Vec(sentences, size=200, min_count=20, window=15)
model.save("./wiki.model")

make_models.pyが作成できたら,プログラムを実行します.

python make_models.py

しばらくすると,プログラムが終了し,wiki.modelが出来上がります.

おわりに

今回は,Wikipediaの記事を利用して,word2vecのモデルを作成してみました.
最初は難しそうな印象でしたが,調べてみると意外と簡単そうだったのでやってみました.
せっかく作ったので,実際に使って,遊んでみたいと思います.