自然言語処理
docker
fastText

Wikipedia データセット + NEologd を使った fastText のモデル学習を Docker でやる

なんでも 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