Docker 入門
形態素解析や構文解析を Docker で実行する
Python + macOS や Linux で形態素解析,構文解析を実行する
ここでは以前のページで利用した Mecab や Cabocha の実行環境に Python をインストールして利用する方法を説明します.具体的には,Docker Hub (https://hub.docker.com/r/rinsaka/mecab-ubuntu) で公開している Docker イメージをベースイメージとして Python や mecab-python3 などのパッケージをインストールする Dockerfile を作成します.
ディレクトリ・ファイル構成
任意のディレクトリにイメージの設計図である Dockerfile を設置し,src_sample ディレクトリ以下には Python のサンプルコードをいくつか設置します.さらに,src ディレクトリは実行したい Python のコード (sample_mecab1.py や sample_mecab2.py など) と解析したい本文のテキストファイル (sent.txt) を設置することにします.なお,src_sample 以下のコードはビルド時にイメージにコピーされ,src 以下のコードはコンテナの起動時にコンテナにバインドマウントする想定です.
python % tree -f ⏎
.
├── ./Dockerfile
├── ./readme.md
├── ./src
│ ├── ./src/sample_cabocha1.py
│ ├── ./src/sample_cabocha2.py
│ ├── ./src/sample_mecab1.py
│ ├── ./src/sample_mecab2.py
│ ├── ./src/sample_mecab3.py
│ └── ./src/sent.txt
└── ./src_sample
├── ./src_sample/sample.py
└── ./src_sample/sample2.py
3 directories, 10 files
python %
Dockerfile の作成とイメージのビルド
Dockerfile は次のような内容にします.2行目(または3行目)ではベースとなるイメージを指定しています.これは Apple Silicon を搭載したマシンを対象にした内容です.Intel 系の CPU を搭載している場合は,6行目または7行目を有効にしてください.
Dockerfile
# for ARM
# FROM rinsaka/mecab-ubuntu:latest
# FROM rinsaka/mecab-ubuntu:2025.11.ubuntu24.04
# for Intel
FROM rinsaka/mecab-ubuntu-x86_64:latest
# FROM rinsaka/mecab-ubuntu-x86_64:2025.11.ubuntu24.04
# Python 3.12 + pip + venv を最小限で導入
RUN apt-get update && \
apt-get install -y --no-install-recommends \
python3.12 python3.12-venv python3-pip && \
rm -rf /var/lib/apt/lists/*
# 仮想環境を作成して mecab-python3 をインストール
RUN python3.12 -m venv /venv && \
/venv/bin/pip install --upgrade pip && \
/venv/bin/pip install mecab-python3
# 以降の RUN/CMD で venv の python/pip を使えるように PATH を通す
ENV PATH="/venv/bin:${PATH}"
WORKDIR /app
COPY ./src_sample /app
ENTRYPOINT ["python"]
CMD ["sample.py"]
# CMD ["python", "sample.py"]
src_sample ディレクトリ以下に設置する次の2つのサンプルコードは,直前 Dockerfile の25行目で指定されているとおり Docker イメージのビルド時にコピーされることに注意してください.いずれも Python コードの実行が確認できるだけの簡単な内容としています.
src_sample/sample.py
print("Hello, Docker-Python!")
src_sample/sample2.py
import MeCab as mc
mecab = mc.Tagger()
sent = "今日はメロンパンを食べました."
print(mecab.parse(sent))
Dockerfile とサンプルコードの準備ができたら,次のコマンドでイメージをビルドします.なお,タグ名には rinsaka/python-mecab を指定しましたが,任意のタグ名でも構いません.ただし,その際は指定したタグ名を以降のコマンドで利用するようにしてください.
python % docker build --tag rinsaka/python-mecab . ⏎
[+] Building 336.9s (10/10) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.05kB 0.0s
=> [internal] load metadata for docker.io/rinsaka/mecab-ubuntu:latest 0.8s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/5] FROM docker.io/rinsaka/mecab-ubuntu:latest@sha256:5d54c8e0904c 301.3s
=> => resolve docker.io/rinsaka/mecab-ubuntu:latest@sha256:5d54c8e0904c95 0.0s
=> => sha256:5d54c8e0904c95219e300c19275d87aa945174b99660 3.69kB / 3.69kB 0.0s
=> => sha256:2e9d78f9d7184770170c1d240a9ca92a37e1ddb7cbab 7.91kB / 7.91kB 0.0s
=> => sha256:97dd3f0ce510a30a2868ff104e9ff286ffc0ef0128 28.86MB / 28.86MB 5.4s
=> => sha256:17b3967c03933caeec3c5e569444c894df018e5416 1.74GB / 1.74GB 264.5s
=> => sha256:611467c1813d037c90aca60b023f7d9e85d4c03 227.14MB / 227.14MB 65.3s
=> => extracting sha256:97dd3f0ce510a30a2868ff104e9ff286ffc0ef01284aebe38 0.8s
=> => sha256:86e121919ba73fe38e2b2a16f97d84587992322345 1.72GB / 1.72GB 255.7s
=> => sha256:3a473b959a50fc1173e03b2f90d64540090ec4 525.51MB / 525.51MB 163.7s
=> => extracting sha256:611467c1813d037c90aca60b023f7d9e85d4c03756c9faa3d 4.3s
=> => sha256:a028d3f82e7c114afe9c0d753063dcddbab887355d3025 330B / 330B 164.9s
=> => sha256:98b9536a08c978c7012c101910b77db01fea27 227.49MB / 227.49MB 193.4s
=> => sha256:c01dcbb341918e0ca46616b2e222984ce09623ce2b65b7 262B / 262B 193.6s
=> => sha256:08dc653bbf86e2639bec09148147b21048fae2a396fff0 113B / 113B 193.9s
=> => sha256:e357fd9fa33ac7a5eafb79ef560e6736be899b 790.95kB / 790.95kB 194.3s
=> => sha256:9cdb6f02ae7a172675e979ed864ec706b87c03 796.55kB / 796.55kB 194.8s
=> => sha256:87cf660ab422bc4925944b8116a5caca9e51846ef1 1.04MB / 1.04MB 195.2s
=> => sha256:53cc687f340ae0e0dc91f4d2604418b4b1c5c54d6af6ab 116B / 116B 195.5s
=> => sha256:2c54e611f073667bec8ed69f81f0e7d43ff2e14c 82.69MB / 82.69MB 212.0s
=> => sha256:0cc702b22ee3648a92082433fc9435caece970af 97.60MB / 97.60MB 228.4s
=> => sha256:338abd645cff0e40fa0f3c6c3d7585cc6a420d 128.97MB / 128.97MB 245.1s
=> => extracting sha256:17b3967c03933caeec3c5e569444c894df018e5416e224357 7.1s
=> => extracting sha256:86e121919ba73fe38e2b2a16f97d84587992322345f1106e 18.0s
=> => extracting sha256:3a473b959a50fc1173e03b2f90d64540090ec438c17aed5bf 3.7s
=> => extracting sha256:a028d3f82e7c114afe9c0d753063dcddbab887355d302539e 0.0s
=> => extracting sha256:98b9536a08c978c7012c101910b77db01fea271eb032d9814 3.8s
=> => extracting sha256:c01dcbb341918e0ca46616b2e222984ce09623ce2b65b7ff5 0.0s
=> => extracting sha256:08dc653bbf86e2639bec09148147b21048fae2a396fff0dec 0.0s
=> => extracting sha256:e357fd9fa33ac7a5eafb79ef560e6736be899b32d9f20c6d3 0.0s
=> => extracting sha256:9cdb6f02ae7a172675e979ed864ec706b87c03e6cd56df438 0.0s
=> => extracting sha256:87cf660ab422bc4925944b8116a5caca9e51846ef1143f6df 0.0s
=> => extracting sha256:53cc687f340ae0e0dc91f4d2604418b4b1c5c54d6af6ab460 0.0s
=> => extracting sha256:2c54e611f073667bec8ed69f81f0e7d43ff2e14cd2bc97458 0.3s
=> => extracting sha256:0cc702b22ee3648a92082433fc9435caece970af39a3d3401 1.1s
=> => extracting sha256:338abd645cff0e40fa0f3c6c3d7585cc6a420de3113844a01 1.0s
=> [internal] load build context 0.0s
=> => transferring context: 284B 0.0s
=> [2/5] RUN apt-get update && apt-get install -y --no-install-recom 30.2s
=> [3/5] RUN python3.12 -m venv /venv && /venv/bin/pip install --upgr 4.2s
=> [4/5] WORKDIR /app 0.0s
=> [5/5] COPY ./src_sample /app 0.0s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:f4cdf9b9c5ccaa27f25f84372372694cdbf4c1c765ba02 0.0s
=> => naming to docker.io/rinsaka/python-mecab 0.0s
View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/1v0cojw4csda3brq168vhnfrt
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview
python %
ビルドに成功したら,イメージが作成されていることを次のコマンドで確認します.
python % docker image ls ⏎
REPOSITORY TAG IMAGE ID CREATED SIZE
rinsaka/python-mecab latest f4cdf9b9c5cc 33 seconds ago 10.6GB
python %
Python サンプルコードを実行する
イメージを作成できたので,そのイメージからコンテナを実行します.このとき,Dockerfile では ENTRYPOINT ["python"] と CMD ["sample.py"] が指定されていることから,次のコマンドではビルド時にイメージにコピーされた sample.py ファイルが python コマンドに渡された上で実行されることに注意してください.
python % docker run --rm -i rinsaka/python-mecab ⏎
Hello, Docker-Python!
python %
ENTRYPOINT ["python"] で指定されたコマンドは原則的には変更できませんが,CMD ["sample.py"] で指定されたコマンドは上書き可能です.したがって,明示的に sample.py を渡すことが可能で,その場合も上と同じ結果になります.
python % docker run --rm -i rinsaka/python-mecab sample.py ⏎
Hello, Docker-Python!
python %
さらに,sample2.py を渡すと別の結果が得られることに注意してください.
python % docker run --rm -i rinsaka/python-mecab sample2.py ⏎
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
. 記号,句点,*,*,*,*,.,.,.
EOS
python %
なお,sample.py や sample2.py は,Dockerfile 25行目の COPY ./src_sample /app によってビルド時にイメージにコピーされています.つまり,イメージビルド後にそれらのファイルの内容を変更しても,リビルドしない限りコンテナの実行結果は変化しないことに注意してください.つまり,プログラムを徐々に作成しながら実行・検証を繰り返すような場合は,以下の手順で作業する方が効率的でしょう.
Python サンプルコードの準備
次に MeCab を用いた形態素解析や Cabocha を用いた構文解析(係り受け解析)を実行するための Python サンプルコードを作成し,src ディレクトリに保存します.次のコードは MeCab による形態素解析を実行するためのサンプルコードです.ここで,ベースイメージとして利用している rinsaka/mecab-ubuntu-x86_64 では標準の辞書に 高機能な「mecab-ipadic-neologd」が指定されています.よって,次の3行目のとおり書いても mecab-ipadic-neologd が利用されますし,4行目のように明示的に辞書を指定しても構いません.その他にもいくつかの辞書が利用可能です.
src/sample_mecab1.py
import MeCab as mc
mecab = mc.Tagger()
# mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/unidic')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/debian')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/juman-utf8')
sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました."
print(mecab.parse(sent))
次の sample_mecab2.py は分かち書きを行う Python コードのサンプルです.
src/sample_mecab2.py
import MeCab as mc
mecab = mc.Tagger('-Owakati')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd -Owakati')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/unidic -Owakati')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8 -Owakati')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/debian -Owakati')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/juman-utf8 -Owakati')
sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました."
print(mecab.parse(sent))
一方で形態素解析の結果を茶筌形式で出力することも可能です.
src/sample_mecab3.py
import MeCab as mc
mecab = mc.Tagger('-Ochasen')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd -Ochasen')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8 -Ochasen')
# mecab = mc.Tagger('-d /var/lib/mecab/dic/debian -Ochasen')
sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました."
print(mecab.parse(sent))
次は Cabocha による構文解析を実行するためのサンプルコードです.なお,Mecab と同様に import CaboCha で解析する方法もありますが,まだ Dockerfile でのパッケージのインストールに成功していないため,サブプロセスを利用するサンプルコードにしています.次の3行目は最も単純な例で,4行目や5行目のように出力形式や辞書を指定できることにも注意してください.
src/sample_cabocha2.py
import subprocess
subprocess.run(['cabocha','sent.txt'])
# subprocess.run(['cabocha','sent.txt', '-f1'])
# subprocess.run(['cabocha','sent.txt', '-d', '/var/lib/mecab/dic/unidic'])
# subprocess.run(['cabocha','sent.txt', '-f1', '-d', '/var/lib/mecab/dic/unidic'])
形態素解析や構文解析を実行したいテキストデータも次のとおり準備しておきます.
src/sent.txt
今日超ときめき♡宣伝部のライブにはきゃりーぱみゅぱみゅとみちょぱが来てメロンパンを食べていました.
バインドマウントで Python コードを実行する
ここまでの作業では,実行したい Python コードはローカルの src ディレクトリに設置したはずです.Docker イメージには src ディレクトリの内容が反映されていないので,コンテナ起動時にローカルの src ディレクトリをコンテナの /app ディレクトリにバインドマウントさせて望みのファイルを実行することを考えます.
従来から利用可能なバインドマウントのオプションは -v オプションです.具体的には次のとおり,ローカルの src ディレクトリをコンテナの /app ディレクトリにマウントします.ここで,%cd% は「現在のディレクトリの絶対パス」を返す特殊な環境変数です.つまり,現在のディレクトリ %cd%\ 直下にある src ディレクトリをコンテナの /app にマウントすること意味しています.このようにすることでイメージをリビルドすることなく,ローカルにある最新のファイル sample_mecab1.py を実行することが可能になります.
python % docker run --rm -i -v "$PWD/src:/app" rinsaka/python-mecab sample_mecab1.py ⏎
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ
と 助詞,並立助詞,*,*,*,*,と,ト,ト
みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
. 記号,句点,*,*,*,*,.,.,.
EOS
python %
バインドマウントの新しい書き方である --mount 構文を利用すると次のようになります.これはコマンドが読みやすく,将来の互換性に優れるという特徴があります.以降の作業では次の書き方を利用することにします(上の書き方は過去に作成された記事を参照する際の理解の手助けになるでしょう).なお,次のコマンド(の黄色ハイライト部分)ではカンマ (,) の後ろに空白文字を入力するとエラーとなることに注意してください.
python % cat src/sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger() # mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd') # mecab = mc.Tagger('-d /var/lib/mecab/dic/unidic') # mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8') # mecab = mc.Tagger('-d /var/lib/mecab/dic/debian') # mecab = mc.Tagger('-d /var/lib/mecab/dic/juman-utf8') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ と 助詞,並立助詞,*,*,*,*,と,ト,ト みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ の 助詞,連体化,*,*,*,*,の,ノ,ノ ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS python %
次は解析の辞書 mecab-ipadic-neologd 明示的に指定する場合です.まずはローカルで編集した後に次のコマンドを実行してください.
python % cat src/sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ と 助詞,並立助詞,*,*,*,*,と,ト,ト みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ の 助詞,連体化,*,*,*,*,の,ノ,ノ ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS python %
次は「unidic」を利用する場合です.
python % cat src/sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/unidic') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,普通名詞,副詞可能,,,,キョウ,今日,今日,キョー,今日,キョー,和,"","","","","","",体,キョウ,キョウ,キョウ,キョウ,"1","C3","",2509094191768064,9128 はきゃ 動詞,一般,,,五段-カ行,仮定形-融合,ハク,履く,はきゃ,ハキャ,はく,ハク,和,"","","","","","",用,ハキャ,ハク,ハキャ,ハク,"0","C4","",8125674430800610,29561 り 助動詞,,,,文語助動詞-リ,終止形-一般,リ,り,り,リ,り,リ,和,"","","","","","",助動,リ,リ,リ,リ,"","動詞%F4@0","",10958016383951531,39865 ー 補助記号,一般,,,,,,ー,ー,,ー,,記号,"","","","","","",補助,,,,,"","","",23830823644045824,86696 ぱ 副詞,,,,,,パッ,ぱっ,ぱ,パ,ぱ,パ,和,"","","","","","",相,パ,パ,パ,パ,"1","","",8512161357898240,30967 み 接頭辞,,,,,,ミ,御,み,ミ,み,ミ,和,"","","","","","",接頭,ミ,ミ,ミ,ミ,"","P1","",9959659825930752,36233 ゅぱみゅとみちょぱの 名詞,普通名詞,一般,,, ライブ 名詞,普通名詞,一般,,,,ライブ,ライブ-live,ライブ,ライブ,ライブ,ライブ,外,"","","","","","",体,ライブ,ライブ,ライブ,ライブ,"1","C1","",10895344221168128,39637 で 助詞,格助詞,,,,,デ,で,で,デ,で,デ,和,"","","","","","",格助,デ,デ,デ,デ,"","動詞%F2@0,名詞%F1","",7014343053025792,25518 メロン 名詞,普通名詞,一般,,,,メロン,メロン-melon,メロン,メロン,メロン,メロン,外,"","","","","","",体,メロン,メロン,メロン,メロン,"1","C1","",10309854279377408,37507 パン 名詞,普通名詞,一般,,,,パン,パン-pao,パン,パン,パン,パン,外,"","","","","","",体,パン,パン,パン,パン,"1","C3","",8533868122612224,31046 を 助詞,格助詞,,,,,ヲ,を,を,オ,を,オ,和,"","","","","","",格助,ヲ,ヲ,ヲ,ヲ,"","動詞%F2@0,名詞%F1,形容詞%F2@-1","",11381878116459008,41407 食べ 動詞,一般,,,下一段-バ行,連用形-一般,タベル,食べる,食べ,タベ,食べる,タベル,和,"","","","","","",用,タベ,タベル,タベ,タベル,"2","C1","M4@1",6220495691326081,22630 まし 助動詞,,,,助動詞-マス,連用形-一般,マス,ます,まし,マシ,ます,マス,和,"","","","","","",助動,マシ,マス,マシ,マス,"","動詞%F4@1","",9812325267808897,35697 た 助動詞,,,,助動詞-タ,終止形-一般,タ,た,た,タ,た,タ,和,"","","","","","",助動,タ,タ,タ,タ,"","動詞%F2@1,形容詞%F4@-2","",5948916285711019,21642 . 補助記号,句点,,,,,,.,.,,.,,記号,"","","","","","",補助,,,,,"","","",14027396882944,51 EOS python %
次は辞書に「ipadic-utf8」を利用します.
python % cat src/sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー はきゃ 動詞,自立,*,*,五段・カ行イ音便,仮定縮約1,はく,ハキャ,ハキャ り 助動詞,*,*,*,文語・リ,基本形,り,リ,リ ー 名詞,固有名詞,一般,*,*,*,* ぱみゅぱみゅとみちょぱの 名詞,一般,*,*,*,*,* ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロン 名詞,一般,*,*,*,*,メロン,メロン,メロン パン 名詞,一般,*,*,*,*,パン,パン,パン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS python %
さらに「debian」を利用してみます.
python % cat src/sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/debian') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー はきゃ 動詞,自立,*,*,五段・カ行イ音便,仮定縮約1,はく,ハキャ,ハキャ り 助動詞,*,*,*,文語・リ,基本形,り,リ,リ ー 名詞,固有名詞,一般,*,*,*,* ぱみゅぱみゅとみちょぱの 名詞,一般,*,*,*,*,* ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロン 名詞,一般,*,*,*,*,メロン,メロン,メロン パン 名詞,一般,*,*,*,*,パン,パン,パン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS python %
最後は「juman-utf8」です.
python % cat src/sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/juman-utf8') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,時相名詞,*,*,今日,きょう,代表表記:今日/きょう カテゴリ:時間 はき 動詞,*,子音動詞カ行,基本連用形,はく,はき,代表表記:吐く/はく 補文ト 反義:動詞:吸う/すう ゃり 名詞,副詞的名詞,*,*,*,*,* ー 名詞,人名,*,*,*,*,* ぱみ 名詞,人名,*,*,*,*,* ゅぱ 名詞,人名,*,*,*,*,* みゅ 名詞,普通名詞,*,*,みゅ,みゅ,自動獲得:テキスト 意味分類:普通名詞その他:0.833 と 助詞,格助詞,*,*,と,と,* みち 形容詞,*,ナノ形容詞,語幹,みちだ,みち,代表表記:未知だ/みちだ 反義:形容詞:既知だ/きちだ ょぱ 名詞,副詞的名詞,*,*,*,*,* の 助詞,接続助詞,*,*,の,の,* ライブ 名詞,普通名詞,*,*,ライブ,らいぶ,代表表記:ライブ/らいぶ カテゴリ:抽象物 ドメイン:文化・芸術;メディア で 助詞,格助詞,*,*,で,で,* メロンパン 名詞,普通名詞,*,*,*,*,* を 助詞,格助詞,*,*,を,を,* 食べ 動詞,*,母音動詞,基本連用形,食べる,たべ,代表表記:食べる/たべる ドメイン:料理・食事 ました 接尾辞,動詞性接尾辞,動詞性接尾辞ます型,タ形,ます,ました,代表表記:ます/ます . 特殊,句点,*,*,.,.,* EOS python %
さらに「sample_mecab2.py」を実行して分かち書きを実行しましょう.
python % cat src/sample_mecab2.py ⏎ import MeCab as mc mecab = mc.Tagger('-Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd -Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/unidic -Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8 -Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/debian -Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/juman-utf8 -Owakati') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab2.py ⏎ 今日 は きゃりーぱみゅぱみゅ と みちょぱ の ライブ で メロンパン を 食べ まし た . python %
分かち書きの際に利用する辞書を変更してみます.
python % cat src/sample_mecab2.py ⏎ import MeCab as mc # mecab = mc.Tagger('-Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd -Owakati') mecab = mc.Tagger('-d /var/lib/mecab/dic/unidic -Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8 -Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/debian -Owakati') # mecab = mc.Tagger('-d /var/lib/mecab/dic/juman-utf8 -Owakati') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab2.py ⏎ 今日 はきゃ り ー ぱ み ゅぱみゅとみちょぱの ライブ で メロン パン を 食べ まし た . python %
「sample_mecab3.py」は茶筌形式で出力する例です.
python % cat src/sample_mecab3.py ⏎ import MeCab as mc mecab = mc.Tagger('-Ochasen') # mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd -Ochasen') # mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8 -Ochasen') # mecab = mc.Tagger('-d /var/lib/mecab/dic/debian -Ochasen') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_mecab3.py ⏎ 今日 キョウ 今日 名詞-副詞可能 は ハ は 助詞-係助詞 きゃりーぱみゅぱみゅ キャリーパミュパミュ きゃりーぱみゅぱみゅ 名詞-固有名詞-人名-一般 と ト と 助詞-並立助詞 みちょぱ ミチョパ みちょぱ 名詞-固有名詞-一般 の ノ の 助詞-連体化 ライブ ライブ ライブ 名詞-一般 で デ で 助詞-格助詞-一般 メロンパン メロンパン メロンパン 名詞-固有名詞-一般 を ヲ を 助詞-格助詞-一般 食べ タベ 食べる 動詞-自立 一段 連用形 まし マシ ます 助動詞 特殊・マス 連用形 た タ た 助動詞 特殊・タ 基本形 . . . 記号-句点 EOS python %
次に,CaboCha による構文解析を行うサンプルを実行します.次のコードはコマンドインジェクション攻撃に脆弱で,セキュリティリスクが高いため,推奨できません.
src/sample_cabocha1.py
import subprocess
# コマンドインジェクション攻撃に脆弱になる可能性があるコードです
subprocess.run('cabocha sent.txt', shell=True)
# subprocess.run('cabocha -f1 sent.txt', shell=True)
# subprocess.run('cabocha -d /var/lib/mecab/dic/juman-utf8 -f1 sent.txt', shell=True)
python % cat src/sample_cabocha1.py ⏎ import subprocess # コマンドインジェクション攻撃に脆弱になる可能性があるコードです subprocess.run('cabocha sent.txt', shell=True) # subprocess.run('cabocha -f1 sent.txt', shell=True) # subprocess.run('cabocha -d /var/lib/mecab/dic/unidic -f1 sent.txt', shell=True) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_cabocha1.py ⏎ 今日-D 超ときめき♡宣伝部の-D ライブには---------D きゃりーぱみゅぱみゅと-D | みちょぱが-D | 来て---D メロンパンを-D 食べていました. EOS python %
セキュリティを確保するためには次のような書き方が推奨されます.
src/sample_cabocha2.py
import subprocess
subprocess.run(['cabocha','sent.txt'])
# subprocess.run(['cabocha','sent.txt', '-f1'])
# subprocess.run(['cabocha','sent.txt', '-d', '/var/lib/mecab/dic/unidic'])
# subprocess.run(['cabocha','sent.txt', '-f1', '-d', '/var/lib/mecab/dic/unidic'])
python % cat src/sample_cabocha2.py ⏎ import subprocess subprocess.run(['cabocha','sent.txt']) # subprocess.run(['cabocha','sent.txt', '-f1']) # subprocess.run(['cabocha','sent.txt', '-d', '/var/lib/mecab/dic/unidic']) # subprocess.run(['cabocha','sent.txt', '-f1', '-d', '/var/lib/mecab/dic/unidic']) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_cabocha2.py ⏎ 今日-D 超ときめき♡宣伝部の-D ライブには---------D きゃりーぱみゅぱみゅと-D | みちょぱが-D | 来て---D メロンパンを-D 食べていました. EOS python %
構文解析結果の出力形式を変更してみます.
python % cat src/sample_cabocha2.py ⏎ import subprocess # subprocess.run(['cabocha','sent.txt']) subprocess.run(['cabocha','sent.txt', '-f1']) # subprocess.run(['cabocha','sent.txt', '-d', '/var/lib/mecab/dic/unidic']) # subprocess.run(['cabocha','sent.txt', '-f1', '-d', '/var/lib/mecab/dic/unidic']) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_cabocha2.py ⏎ * 0 1D 0/0 0.192693 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー * 1 2D 0/1 1.956133 超ときめき♡宣伝部 名詞,固有名詞,一般,*,*,*,超ときめき♡宣伝部,チョウトキメキセンデンブ,チョートキメキセンデンブ の 助詞,連体化,*,*,*,*,の,ノ,ノ * 2 7D 0/2 -1.526449 ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ に 助詞,格助詞,一般,*,*,*,に,ニ,ニ は 助詞,係助詞,*,*,*,*,は,ハ,ワ * 3 4D 0/1 1.049473 きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ と 助詞,並立助詞,*,*,*,*,と,ト,ト * 4 5D 0/1 0.895061 みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ が 助詞,格助詞,一般,*,*,*,が,ガ,ガ * 5 7D 0/1 -1.526449 来 動詞,自立,*,*,カ変・来ル,連用形,来る,キ,キ て 助詞,接続助詞,*,*,*,*,て,テ,テ * 6 7D 0/1 -1.526449 メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ * 7 -1D 0/4 0.000000 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ て 助詞,接続助詞,*,*,*,*,て,テ,テ い 動詞,非自立,*,*,一段,連用形,いる,イ,イ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS python %
構文解析に用いる辞書と結果の出力形式を変更してみます.
python % cat src/sample_cabocha2.py ⏎ import subprocess # subprocess.run(['cabocha','sent.txt']) # subprocess.run(['cabocha','sent.txt', '-f1']) # subprocess.run(['cabocha','sent.txt', '-d', '/var/lib/mecab/dic/unidic']) subprocess.run(['cabocha','sent.txt', '-f1', '-d', '/var/lib/mecab/dic/unidic']) python % docker run --rm -i --mount "type=bind,source=$PWD/src,target=/app" rinsaka/python-mecab sample_cabocha2.py ⏎ * 0 1D 5/6 1.190123 今日 名詞,普通名詞,副詞可能,*,*,*,キョウ,今日,今日,キョー,今日,キョー,和,*,*,*,*,*,*,体,キョウ,キョウ,キョウ,キョウ,1,C3,*,2509094191768064,9128 超 接頭辞,*,*,*,*,*,チョウ,超,超,チョー,超,チョー,漢,*,*,*,*,*,*,接頭,チョウ,チョウ,チョウ,チョウ,*,P2,*,6583059617030656,23949 ときめき 名詞,普通名詞,一般,*,*,*,トキメキ,ときめき,ときめき,トキメキ,ときめき,トキメキ,和,*,*,*,*,*,*,体,トキメキ,トキメキ,トキメキ,トキメキ,"0,4",C2,*,7214454169281024,26246 ♡ 補助記号,一般,*,*,*,*,*,♡,♡,*,♡,*,記号,*,*,*,*,*,*,補助,*,*,*,*,*,*,*,23737640033591808,86357 宣伝 名詞,普通名詞,サ変可能,*,*,*,センデン,宣伝,宣伝,センデン,宣伝,センデン,漢,*,*,*,*,*,*,体,センデン,センデン,センデン,センデン,0,C2,*,5658370338071040,20585 部 名詞,普通名詞,助数詞可能,*,*,*,ブ,部,部,ブ,部,ブ,漢,*,*,*,*,*,B,体,ブ,ブ,ブ,ブ,"1,0",C3,*,9153168046957056,33299 の 助詞,格助詞,*,*,*,*,ノ,の,の,ノ,の,ノ,和,*,*,*,*,*,*,格助,ノ,ノ,ノ,ノ,*,名詞%F1,*,7968444268028416,28989 * 1 3D 7/9 0.205301 ライブ 名詞,普通名詞,一般,*,*,*,ライブ,ライブ-live,ライブ,ライブ,ライブ,ライブ,外,*,*,*,*,*,*,体,ライブ,ライブ,ライブ,ライブ,1,C1,*,10895344221168128,39637 に 助詞,格助詞,*,*,*,*,ニ,に,に,ニ,に,ニ,和,*,*,*,*,*,*,格助,ニ,ニ,ニ,ニ,*,名詞%F1,*,7745518285496832,28178 はきゃ 動詞,一般,*,*,五段-カ行,仮定形-融合,ハク,履く,はきゃ,ハキャ,はく,ハク,和,*,*,*,*,*,*,用,ハキャ,ハク,ハキャ,ハク,0,C4,*,8125674430800610,29561 り 助動詞,*,*,*,文語助動詞-リ,終止形-一般,リ,り,り,リ,り,リ,和,*,*,*,*,*,*,助動,リ,リ,リ,リ,*,動詞%F4@0,*,10958016383951531,39865 ー 補助記号,一般,*,*,*,*,*,ー,ー,*,ー,*,記号,*,*,*,*,*,*,補助,*,*,*,*,*,*,*,23830823644045824,86696 ぱ 副詞,*,*,*,*,*,パッ,ぱっ,ぱ,パ,ぱ,パ,和,*,*,*,*,*,*,相,パ,パ,パ,パ,1,*,*,8512161357898240,30967 み 接頭辞,*,*,*,*,*,ミ,御,み,ミ,み,ミ,和,*,*,*,*,*,*,接頭,ミ,ミ,ミ,ミ,*,P1,*,9959659825930752,36233 ゅぱみゅとみちょぱが 名詞,普通名詞,一般,*,*,* 来 動詞,非自立可能,*,*,カ行変格,連用形-一般,クル,来る,来,キ,来る,クル,和,*,*,*,*,*,*,用,キ,クル,キ,クル,1,C1,*,2891174482420353,10518 て 助詞,接続助詞,*,*,*,*,テ,て,て,テ,て,テ,和,*,*,*,*,*,*,接助,テ,テ,テ,テ,*,"動詞%F1,形容詞%F2@-1",*,6837321680953856,24874 * 2 3D 1/2 1.419179 メロン 名詞,普通名詞,一般,*,*,*,メロン,メロン-melon,メロン,メロン,メロン,メロン,外,*,*,*,*,*,*,体,メロン,メロン,メロン,メロン,1,C1,*,10309854279377408,37507 パン 名詞,普通名詞,一般,*,*,*,パン,パン-pao,パン,パン,パン,パン,外,*,*,*,*,*,*,体,パン,パン,パン,パン,1,C3,*,8533868122612224,31046 を 助詞,格助詞,*,*,*,*,ヲ,を,を,オ,を,オ,和,*,*,*,*,*,*,格助,ヲ,ヲ,ヲ,ヲ,*,"動詞%F2@0,名詞%F1,形容詞%F2@-1",*,11381878116459008,41407 * 3 4D 0/4 0.205301 食べ 動詞,一般,*,*,下一段-バ行,連用形-一般,タベル,食べる,食べ,タベ,食べる,タベル,和,*,*,*,*,*,*,用,タベ,タベル,タベ,タベル,2,C1,M4@1,6220495691326081,22630 て 助詞,接続助詞,*,*,*,*,テ,て,て,テ,て,テ,和,*,*,*,*,*,*,接助,テ,テ,テ,テ,*,"動詞%F1,形容詞%F2@-1",*,6837321680953856,24874 い 動詞,非自立可能,*,*,上一段-ア行,連用形-一般,イル,居る,い,イ,いる,イル,和,*,*,*,*,*,*,用,イ,イル,イ,イル,0,C4,M4@1,710568013079169,2585 まし 助動詞,*,*,*,助動詞-マス,連用形-一般,マス,ます,まし,マシ,ます,マス,和,*,*,*,*,*,*,助動,マシ,マス,マシ,マス,*,動詞%F4@1,*,9812325267808897,35697 た 助動詞,*,*,*,助動詞-タ,終止形-一般,タ,た,た,タ,た,タ,和,*,*,*,*,*,*,助動,タ,タ,タ,タ,*,"動詞%F2@1,形容詞%F4@-2",*,5948916285711019,21642 * 4 -1D 0/0 0.000000 . 補助記号,句点,*,*,*,*,*,.,.,*,.,*,記号,*,*,*,*,*,*,補助,*,*,*,*,*,*,*,14027396882944,51 EOS python %
Entrypoint を指定して他のコマンドを実行する
Dockerfile では ENTRYPOINT ["python"] が指定されているので,コンテナの起動時には python コマンドが実行され,コマンドを変更することができません.これによってコンテナの安全性を確保しています.しかしながら,プログラムのデバッグなどでコンテナを直接操作したい場合もあります.そのような場合は次のように --entrypoint オプションを用いてコマンドを上書きすることができます.例えば次のとおり /bin/bash シェルに入ることができます.このとき,バインドマウントを利用していないことから /app ディレクトリはイメージのビルド時にコピーされた内容であることが分かるはずです.
python % docker run --rm -i -t --entrypoint /bin/bash rinsaka/python-mecab ⏎ root@bb0c0f8b27dc:/app# ls ⏎ sample.py sample2.py root@bb0c0f8b27dc:/app# python sample2.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS root@bb0c0f8b27dc:/app# exit ⏎ exit python %
一方で,バインドマウントを利用するとコンテナ起動時点の src ディレクトリのファイルが利用できるはずです.
python % docker run --rm -i -t --mount "type=bind,source=$PWD/src,target=/app" --entrypoint /bin/bash rinsaka/python-mecab ⏎ root@ae8e9d9ae393:/app# ls ⏎ sample_cabocha1.py sample_mecab1.py sample_mecab3.py sample_cabocha2.py sample_mecab2.py sent.txt root@ae8e9d9ae393:/app# python sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ と 助詞,並立助詞,*,*,*,*,と,ト,ト みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ の 助詞,連体化,*,*,*,*,の,ノ,ノ ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS root@ae8e9d9ae393:/app# exit ⏎ exit python %
さらに次のコマンドで Python のシェルを利用することも可能です.
python % docker run --rm -i -t --mount "type=bind,source=$PWD/src,target=/app" --entrypoint python rinsaka/python-mecab ⏎ Python 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print("hello") ⏎ hello >>> exit() ⏎ python %