Dockerで日本語形態素解析エンジンMeCabのPython開発環境を構築~後半

スポンサーリンク
Docker
スポンサーリンク

前回に引き続き、Dockerを使って日本語形態素解析エンジンMeCabのPython開発環境の構築を続けていきます。

Dockerで日本語形態素解析エンジンMeCabのPython開発環境を構築~前半

前回までに1と2が終わりました。今回はPythonのライブラリのインストールから始めます。

環境構築手順

  1. DockerでLinux環境構築
  2. DockerのLinux環境でPythonとMeCabをインストール
  3. Pythonでの形態素解析に必要なライブラリ(jupyter-lab、mecab-python)をインストール
  4. 上記2と3をDockerfileの落とし込み、MeCab-PythonのDockerイメージ作成
  5. Dockerコンテナを作成し、仮想環境完成!

Pythonライブラリのインストール

Pythonの初期インストールしておくライブラリとして、ここでは、PythonでMeCabを使うための「MeCabのラッパー」のmecab-python3と、インタラクティブな開発環境のJupyterLab、データ解析支援ライブラリのPandasを入れることにします。それぞれpipコマンドでインストールします。

root@457cbb65a38c:/# pip3 install --upgrade pip
root@457cbb65a38c:/# pip3 install upyterlab
root@457cbb65a38c:/# pip3 install pandas
root@457cbb65a38c:/# pip3 install mecab-python3
root@457cbb65a38c:/# pip3 list
Package              Version    
-------------------- -----------
...(略)
jupyterlab           3.4.3
...(略)
mecab-python3        1.0.5
...(略)
pandas               1.4.2
...(略)
pip                  20.0.2
...(略)
root@457cbb65a38c:/# 

mecab-python3の確認→エラー・・・

 必要なライブラリは入ったことを確認したので、公式ホームページを参考にmecab-python3を使ってみます。

root@457cbb65a38c:/# python3
Python 3.8.10 (default, Mar 15 2022, 12:22:08) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>> wakati = MeCab.Tagger("-Owakati")
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/MeCab/__init__.py", line 133, in __init__
    super(Tagger, self).__init__(args)
RuntimeError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/dist-packages/MeCab/__init__.py", line 135, in __init__
    raise RuntimeError(error_info(rawargs)) from ee
RuntimeError:
----------------------------------------------------------

Failed initializing MeCab. Please see the README for possible solutions:

    https://github.com/SamuraiT/mecab-python3#common-issues

If you are still having trouble, please file an issue here, and include the
ERROR DETAILS below:

    https://github.com/SamuraiT/mecab-python3/issues

issueを英語で書く必要はありません。

------------------- ERROR DETAILS ------------------------
arguments: -Owakati
[ifs] no such file or directory: /usr/local/etc/mecabrc
----------------------------------------------------------

インポートは通ったのですが、「wakati = MeCab.Tagger(“-Owakati”)」と、MeCabをインスタンス化するところでエラーが出てしまいました。

エラーの修正

[ifs] no such file or directory: /usr/local/etc/mecabrc

どうやら、MeCabを動かすのに必要なmecabrcというファイルがないらしい。ubuntuの中を確認してみます。

root@457cbb65a38c:/# find / -name mecabrc -print
/etc/mecabrc

どうやら、/usr/local/etcではなく、/etcの中にあるらしい。どうもmecabのインストール先がmecab-pathon3の中の記述と違ってしまったらしい。ということで、/usr/local/etcにもmecabrcのシンポリックリンクを追加してやることにした。

ln -s /etc/mecabrc /usr/local/etc/mecabrc

root@457cbb65a38c:/# ln -s /etc/mecabrc /usr/local/etc/mecabrc
root@457cbb65a38c:/# find / -name mecabrc -print
/etc/mecabrc
/usr/local/etc/mecabrc
root@457cbb65a38c:/# ls -l /usr/local/etc/
total 4
drwxr-xr-x 4 root root 4096 Jun 19 01:52 jupyter
lrwxrwxrwx 1 root root   12 Jun 19 02:14 mecabrc -> /etc/mecabrc

mecab-python3の確認→OK

リンクが追加されました。もう一度mecab-python3の動作を確認してみます。

root@457cbb65a38c:/# python3
Python 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>> wakati = MeCab.Tagger("-Owakati")
>>> print(wakati.parse("私はpythonが大好きです。"))
私 は python が 大好き です 。

>>> mecab = MeCab.Tagger()
>>> text = "今日はよい天気です。"
>>> print(mecab.parse(text))
今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
よい    形容詞,自立,*,*,形容詞・アウオ段,基本形,よい,ヨイ,ヨイ
天気    名詞,一般,*,*,*,*,天気,テンキ,テンキ
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。      記号,句点,*,*,*,*,。,。,。
EOS

>>>

mecab-python3が使えるようになりました。

Dockerfileの作成

ここまでの動作をDockerfileに盛り込んでいきます。

# ベースイメージ
FROM ubuntu:20.04

# 必要そうなものをinstall
RUN apt-get update && apt-get -y upgrade

# 任意バージョンのpython install
RUN apt -y install python3-pip

# mecabをインストール
RUN apt -y install mecab
RUN apt -y install libmecab-dev
RUN apt -y install mecab-ipadic-utf8

#必要なpythonパッケージをpipでインストール
RUN pip3 install --upgrade pip && pip3 install jupyterlab
RUN pip3 install pandas
RUN pip3 install mecab-python3

#サイズ削減のため不要なものは削除
RUN apt-get autoremove -y

# ポートを開けておきます
EXPOSE 8888

# ホストとのデータやり取りにボリュームを確保
VOLUME [ "/myvol" ]

# mecab-python3を動かすためにmecabrcのシンボリックリンク追加
RUN ln -s /etc/mecabrc /usr/local/etc/mecabrc

Dockerfileは上の通りです。追加で「apt-get autoremove -y」でインストールの一時ファイルを削除したのと、JupyterLab用にポート8888を設定したのと、ホストとのファイルの共有用にmyvolをボリュームに追加しています。

仮想環境の作成

# イメージ作成
docker build -t py_env .

# コンテナ作成
docker create -it -v $pwd/myvol:/myvol --name mycontainer -p 8888:8888 py_env

# コンテナ起動
docker start mycontainer

# dockerに接続
docker exec -it mycontainer bash

ここから、イメージとコンテナを準備していきます。どこでもよいので、コンテナ作成用のディレクトを作り、その中にDockerfileを入れます。

作業用ディレクトリ/
 ┣ myvol/ ・・・共有用ディレクトリ
 ┗Dockerfile 


1.イメージの作成
 Dockerfileを置いたディレクトリで「docker build -t py_env .」を実行し、py_envという名前のDockerイメージが作成します。

2.コンテナの作成
 コンテナを作成しますが、その前にホストと仮想環境のファイル共有のために、Dockerfileのあるディレクトリの下に「myvol」のディレクトリを作成します。そのうえで、docker createでボリュームとポートの設定をして、mycontainerというコンテナを作成します。

3.コンテナの起動
 「docker start」でコンテナを起動します。

4.コンテナに接続
 コンテナのシェルに「docker exec -it mycontainer bash」で接続します。

JupyterLabの起動

 コンテナのシェルに入ったら、そこでJupyterLabを「jupyter lab –port=8888 –ip=0.0.0.0 –allow-root」で起動します。ルート権限になっているので、「–allow-root」をつけないとエラーになるようです。JupyterLabは、コマンドラインに記載されているtoken付きのURLをブラウザに入れてやると使えます。下の場合だと、以下のURLとなります。

http://127.0.0.1:8888/lab?token=733434bab61760811f2d2ae310f5bb154a17954d8e1fe81b

root@34ab452dba78:/# jupyter lab --port=8888 --ip=0.0.0.0 --allow-root
[I 2022-06-19 03:40:39.157 ServerApp] jupyterlab | extension was successfully linked.
[I 2022-06-19 03:40:39.168 ServerApp] nbclassic | extension was successfully linked.
...(略)
[W 2022-06-19 03:40:39.375 ServerApp] No web browser found: could not locate runnable browser.
[C 2022-06-19 03:40:39.376 ServerApp]

    To access the server, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/jpserver-17-open.html
    Or copy and paste one of these URLs:
        http://34ab452dba78:8888/lab?token=733434bab61760811f2d2ae310f5bb154a17954d8e1fe81b
     or http://127.0.0.1:8888/lab?token=733434bab61760811f2d2ae310f5bb154a17954d8e1fe81b

ブラウザでノートブックを起動して、MeCabが使えることを確認します。

import MeCab
mecab = MeCab.Tagger()
text = "東京駅から地下鉄に乗って、NHKまで行ってみた。"
print(mecab.parse(text))
東京	名詞,固有名詞,地域,一般,*,*,東京,トウキョウ,トーキョー
駅	名詞,接尾,地域,*,*,*,駅,エキ,エキ
から	助詞,格助詞,一般,*,*,*,から,カラ,カラ
地下鉄	名詞,一般,*,*,*,*,地下鉄,チカテツ,チカテツ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
乗っ	動詞,自立,*,*,五段・ラ行,連用タ接続,乗る,ノッ,ノッ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
NHK	名詞,一般,*,*,*,*,*
まで	助詞,副助詞,*,*,*,*,まで,マデ,マデ
行っ	動詞,自立,*,*,五段・カ行促音便,連用タ接続,行く,イッ,イッ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
み	動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

DockerでMeCabのPython環境が構築できました。Dockerの仮想環境を使うことにより、何かと端末環境などでインストールが難しかったりするMeCabですが、OSに寄らず安定な開発環境の構築ができました。

終わりに

 今回、MeCabの環境構築のためにDockerを勉強してみました。使ったイメージのサイズが無駄に大きかったり、まだまだ改善の余地はありますが、DockerでのMeCab開発環境の構築ができました。

参考リンク

docker docs(公式ホームページ)
公式ドキュメントです。チュートリアルやサンプルコードもあります。

Docker ドキュメント日本語化プロジェクト
上記の公式ホームページの日本語化ページです。

【図解】Dockerの全体像を理解する(Qiita)
すごく分かりやすいDockerのまとめページです。

DockerでPython実行環境を作ってみる(Qiita)
DockerでのPython仮想環境構築を丁寧に説明してくれています。ワークショップの動画やコードも公開してくれているので、そのままやるだけでPythonの仮想環境は作れます。

DockerでPython公式イメージ + MeCab + NEologd辞書(Qiita)
Dockerを学んでみたいというモチベーションとなったページです。DockerでPython+MeCab+mecab-ipadic-NEologd辞書の環境構築の方法を教えてくれます。最終的なゴールはこのページのコードを全部理解して、自分でカスタマイズできるようになることです。

コメント