蛇ノ目の記

技術のことも。そうでないことも。

アイドルで理解するTF-IDF 環境構築編

ども

台風やばかったですね

雨と風が強すぎてぜんぜん寝れませんでした

うちの近くに去年の台風で傾いた建物があるんですがそれはなんか無事でした

どうでもいいですね

はい

アイドルで理解する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/mecabrcdicdirを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に書かれている。

github.com

今になって思ったけど、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イメージをビルドする段階でパッケージをインストールしておきたかった。$ 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が終わってから書きます。

めっちゃどうでもいいし俺がやってもアレなだけなんだけど、このシリーズの冒頭は山崎愛ちゃん構文に寄せてます。