Word2Vec 用のモデルを作成する

Python

前回投稿した gensim についての知識のなさから、最新バージョンに対応した Word2Vec 用のモデルを見つけることができなかったので、自分でモデルを作成することにしました。検索能力の欠如ですね。

今回は Wikipedia の記事を使ってモデルを作成していきます。

まずは WikiExtractor を 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

容量がとても大きいので、このコードで実行するとダウンロードできない場合があります。その場合 Safari から直接ダウンロードします。

ここから本文を抽出していきます。

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

これにもだいぶ時間がかかります。できたら新しくtext というディレクトリができていますが、複数ファイルになっているのでこれを txt というディレクトリにひとまとめにします。

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

これで wiki.txt という一つのファイルになりました。次から Word2Vec 用のモデル作成のためのデータ成形に入ります。

成形には gensim と Mecab を使用します。

pip install gensim
pip install mecab

ここでインストールされた gensimの バージョンは現時点で4.1.2です。数年前に大きな変更があり、バージョン3と4の間には記述方法に大きな違いがあるので注意が必要です。

次に記事を分かち書きしていきます。

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

このコマンド b-65536 という引数は、1行当たりの文字数を表します。デフォルトの設定だと 8192 だそうですが、の状態だと

input-buffer overflow. The line is split. use -b #SIZE option

というエラーが出てしまいます。特にwikipediaはデータが多いので、ここの数値はその都度試していくしかなさそうです。

記事にはバイナリ文字も含まれているので nkf を利用して utf-8 に変換していきます。

ukfのインストールは下記の通りです。

brew install nkf

下記を記述して nkf を使用します。

nkf -w --overwrite wiki_wakati.txt

以上でテキスト成形が終わったのでモデル作成に入ります。モデル作成のためのファイル make_model.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")

以上を実行してしばらくすると、wiki.model が完成します。

Comments

コメントする