なんでも Docker でやりたがるマンです。
「fastText のモデルを作るにはこのツールを入れてこのデータをこう処理して以下略」と手順をまとめるよりも「Docker でビルドして終わり」って出来たほうが楽だなと思ったので Dockerfile を書いた。
Dockerfile を書くにあたって以下の記事を非常に参考にさせていただいた。
FacebookのfastTextでFastに単語の分散表現を獲得する - Qiita
Dockerfile
今回は、Wikipedia 日本語版のデータセットを MeCab + NEologd を使って分かち書きしてから fastText に食わせる。
Dockerfile
FROM python:3
RUN apt update && apt install -y --no-install-recommends build-essential sudo wget unzip git
# Install MeCab
RUN apt install -y --no-install-recommends mecab libmecab-dev mecab-ipadic-utf8
# Install mecab-ipadic-NEologd
ARG neologd_revision="master"
RUN wget -q https://github.com/neologd/mecab-ipadic-neologd/archive/${neologd_revision}.zip -O mecab-ipadic-neologd.zip \
&& unzip mecab-ipadic-neologd.zip \
&& rm mecab-ipadic-neologd.zip \
&& mecab-ipadic-neologd-${neologd_revision}/bin/install-mecab-ipadic-neologd -n -a -y \
&& sed -i -e "s|^dicdir.*$|dicdir = $(mecab-config --dicdir)/mecab-ipadic-neologd|" /etc/mecabrc \
&& rm -rf mecab-ipadic-neologd-${neologd_revision}
# Install fastText
ARG fasttext_revision="master"
RUN wget -q https://github.com/facebookresearch/fastText/archive/${fasttext_revision}.zip -O fasttext.zip \
&& unzip fasttext.zip \
&& rm fasttext.zip \
&& cd fastText-* \
&& make \
&& mv fasttext /usr/local/bin \
&& cd - \
&& rm -rf fastText-*
# Download Wikipedia dataset
ARG jawiki_revision="latest"
RUN wget -q https://dumps.wikimedia.org/jawiki/${jawiki_revision}/jawiki-${jawiki_revision}-pages-articles.xml.bz2 -O jawiki.xml.bz2
# Extract Wikipedia dataset
RUN git clone https://github.com/attardi/wikiextractor \
&& python wikiextractor/WikiExtractor.py -b 10G -o corpus jawiki.xml.bz2
# Convert to wakati text
RUN mecab $(find corpus -type f) -O wakati -b 100000 -o wakati.txt
# Train fastText model
RUN mkdir -p /dist \
&& fasttext skipgram -input wakati.txt -output /dist/model -dim 300
モデルの学習
$ docker build . -t fasttextmodel
そこそこ良いサーバでやったら3時間くらいで終わった。
$ docker run --rm -v $(pwd):/host fasttextmodel sh -c 'cp /dist/* /host'
学習が終わったら Docker イメージが出来ているはずなので、こんな感じで学習済みモデルを取り出す。
リビジョンの固定
NEologd の辞書のバージョンを固定したいなどの場合は、ビルド時に --build-arg
でリビジョンを指定することで固定できる。
例えば、こう。
$ docker build . \
--build-arg neologd_revision="0e010dd1f5354dfd85dd8a3b0b3d704903d6f87c" \
--build-arg fasttext_revision="v0.1.0" \
--build-arg jawiki_revision="20180601" \
-t fasttextmodel