ども
台風やばかったですね
雨と風が強すぎてぜんぜん寝れませんでした
うちの近くに去年の台風で傾いた建物があるんですがそれはなんか無事でした
どうでもいいですね
はい
アイドルで理解するTF-IDF第2回です
まだTF-IDFまでたどり着きません
TL;DR
Dockerを使って形態素解析&TF-IDF計算の環境作った
Ubuntu 18.04 + Python3.7 + MeCab + NEologd
- NEologdの辞書のPATHは必ずチェックしよう
docker-composeで形態素解析とTF-IDFの計算を実行するようにした
Dockerイメージを作る
Python3についてはPython3.7を使いたかったのでソースからビルドした。
MeCabとNEologdのインストールについてはMeCab用のDockerfile - sanshonokiの日記 を参考にDockerfileを書いた。
イメージの役割は形態素解析とTF-IDFの計算のみで、IPAフォントのインストールは不要と判断して削除した。Maplotlibで日本語入ったグラフを出すとかだったら入れないとダメ。
NEologdをMeCabのデフォルト辞書に設定する箇所について、参考にしたブログでは以下のようになっていた。
RUN sed -i 's/dicdir = \/var\/lib\/mecab\/dic\/debian/dicdir = \/usr\/lib\/mecab\/dic\/mecab-ipadic-neologd/' /etc/mecabrc
/etc/mecabrc のdicdirをNEologdの辞書のパスに置き換えているわけだけど、この置き換え先のパスが今回の環境では異なっていて、/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd となっていた。DockerイメージにNEologdをインストールしたら、一度そこでコンテナを実行して、NEologdの辞書のパスを確認するのがよさそう。
$ docker run -it イメージ名 /bin/bash $ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
辞書のパス確認のコマンドはNEologdのREADMEに書かれている。
今になって思ったけど、sedを使って書き換えるではなく手元にdicdirを書き換えたmecabrcを用意してDockerイメージをビルドするときに置き換えるのもいいかもしれない。
$ docker run -it イメージ名 /bin/bash # NEologdの辞書のパスを確認 $ echo `mecab-config --dicdir`"/mecab-ipadic-neologd" # mecabrcを表示 $ cat /etc/mecabrc
ここで表示したmecabrcをコピーして手元で書き換える、とか。
とりあえず現状最新のDockerfile。
# ref. http://sanshonoki.hatenablog.com/entry/2018/10/09/231345
FROM ubuntu:18.04
RUN apt update \
&& apt install -y \
build-essential \
zlib1g-dev \
libncurses5-dev \
libgdbm-dev \
libnss3-dev \
libssl-dev \
libreadline-dev \
libffi-dev \
wget \
git \
mecab \
curl \
libmecab-dev \
mecab-ipadic-utf8\
language-pack-ja \
xz-utils \
file \
openssl \
gawk \
sudo \
unzip \
&& apt clean \
&& update-locale LANG=ja_JP.UTF-8
# Set locale
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
# Install Python3.7
# ref. https://linuxize.com/post/how-to-install-python-3-7-on-ubuntu-18-04/
WORKDIR /usr/local/src
RUN wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz \
&& tar -xf Python-3.7.3.tar.xz \
&& cd Python-3.7.3 \
&& ./configure --enable-optimization \
&& make \
&& make altinstall
# Install mecab-ipadic-NEologd
WORKDIR /opt
RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
WORKDIR /opt/mecab-ipadic-neologd
RUN ./bin/install-mecab-ipadic-neologd -n -y
RUN cd /opt
RUN rm -rf mecab-ipadic-neologd
# Set mecab-ipadic-NEologd as default
RUN sed -i 's/dicdir = \/var\/lib\/mecab\/dic\/debian/dicdir = \/usr\/lib\/x86_64-linux-gnu\/mecab\/dic\/mecab-ipadic-neologd/' /etc/mecabrc
# Make directory and Copy code
WORKDIR /home
RUN mkdir code
RUN mkdir output
WORKDIR /home/code
COPY code .
CMD python3.7 -V
mecab-pythonという名前をつけてDockerイメージをビルド。
docker build -t mecab-python .
docker-compose.ymlを作る
Dockerイメージの
/home/codeと/home/outputにそれぞれリポジトリ(https://github.com/NaoY-2501/tf_idf_with_idol)のcodeとoutputを関連付ける。code/requirements_docker.txtからmecab-python3とNumPyをインストール。tf_idf_with_idol.pyを実行
本当はDockerイメージをビルドする段階でパッケージをインストールしておきたかった。$ python3.7 -m pip install -r requirements_docker.txtでPython3.7のpipであることを明示的にしてインストールしたにもかかわらず、docker-composeでコンテナを開始するとそのパッケージが見つからなくなっていた(今回、原因まで調べられていない)。そのためコンテナ開始のタイミングでインストールしている。
version: '2'
services:
mecab-python:
build: .
volumes:
- ./code:/home/code
- ./output:/home/output
command: >
/bin/bash -c
"python3.7 -m pip install -U pip
&& python3.7 -m pip install -r requirements_docker.txt
&& python3.7 tf_idf_with_idol.py"
これで環境構築ができたので、次回は形態素解析とTF-IDFです。#stapyでのLTが終わってから書きます。
めっちゃどうでもいいし俺がやってもアレなだけなんだけど、このシリーズの冒頭は山崎愛ちゃん構文に寄せてます。