Docker 入門
形態素解析や構文解析を Docker で実行する
Python + Windows (PowerShell) で形態素解析,構文解析を実行する
ここでは以前のページで利用した Mecab や Cabocha の実行環境に Python をインストールして利用する方法を説明します.具体的には,Docker Hub (https://hub.docker.com/r/rinsaka/mecab-ubuntu-x86_64) で公開している Docker イメージをベースイメージとして Python や mecab-python3 などのパッケージをインストールする Dockerfile を作成します.
ディレクトリ・ファイル構成
任意のディレクトリにイメージの設計図である Dockerfile を設置し,src_sample ディレクトリ以下には Python のサンプルコードをいくつか設置します.さらに,src ディレクトリは実行したい Python のコード (sample_mecab1.py や sample_mecab2.py など) と解析したい本文のテキストファイル (sent.txt) を設置することにします.なお,src_sample 以下のコードはビルド時にイメージにコピーされ,src 以下のコードはコンテナの起動時にコンテナにバインドマウントする想定です.
PS C:\...\python> tree /f ⏎
フォルダー パスの一覧: ボリューム Windows
ボリューム シリアル番号は 3A55-753D です
C:.
│ Dockerfile
│ readme.md
│
├─src
│ sample_cabocha1.py
│ sample_cabocha2.py
│ sample_mecab1.py
│ sample_mecab2.py
│ sample_mecab3.py
│ sent.txt
│
└─src_sample
sample.py
sample2.py
PS C:\...\python>
Dockerfile の作成とイメージのビルド
Dockerfile は次のような内容にします.2行目(または3行目)ではベースとなるイメージを指定しています.これは Intel 系 CPU を搭載しているマシンを対象にした内容です.Apple Silicon を搭載している場合は,6行目または7行目を有効にしてください.
Dockerfile
# for Intel
FROM rinsaka/mecab-ubuntu-x86_64:latest
# FROM rinsaka/mecab-ubuntu-x86_64:2025.11.ubuntu24.04
# for ARM
# FROM rinsaka/mecab-ubuntu:latest
# FROM rinsaka/mecab-ubuntu: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 を指定しましたが,任意のタグ名でも構いません.ただし,その際は指定したタグ名を以降のコマンドで利用するようにしてください.
PS C:\...\python> docker build --tag rinsaka/python-mecab . ⏎
[+] Building 224.8s (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-x86_64:la 0.5s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/5] FROM docker.io/rinsaka/mecab-ubuntu-x86_64:latest@sha256:9b5c 182.3s
=> => resolve docker.io/rinsaka/mecab-ubuntu-x86_64:latest@sha256:9b5c0f 0.0s
=> => sha256:0abf3e798b730dca3b342d1f8a018c7475b58b5aa5c 7.92kB / 7.92kB 0.0s
=> => sha256:9b5c0f80373f5110fb7d141ba34bc427ff4df9bb13e 3.69kB / 3.69kB 0.0s
=> => sha256:48210cb4fcba0e0db8274fa5df88bfe493ed3d098 1.74GB / 1.74GB 145.2s
=> => sha256:20043066d3d5c78b45520c5707319835ac7d1f3d7 29.72MB / 29.72MB 3.1s
=> => sha256:d0a16b364e210d58c9b1b9fa7f0ef3988ed301 233.25MB / 233.25MB 21.4s
=> => extracting sha256:20043066d3d5c78b45520c5707319835ac7d1f3d7f0dded0 1.0s
=> => sha256:73ee71a0778bcf7f0e5c324b036b24439e2d403b6 1.72GB / 1.72GB 146.1s
=> => extracting sha256:d0a16b364e210d58c9b1b9fa7f0ef3988ed30171ee696fd1 6.4s
=> => sha256:114c1c197e7fad8405889de248bc428bc5e453 525.51MB / 525.51MB 69.1s
=> => sha256:e109e7967ec503340e64563ec56d8fbfdbaf642aa2544a 330B / 330B 69.3s
=> => sha256:f3edc7209908a7abcc706464c342b6c110fe36 227.49MB / 227.49MB 90.6s
=> => sha256:a37a2c88b2ffe3cb773c2607702d931c0febf9dcca7932 264B / 264B 90.8s
=> => sha256:3b1144fe021b2392464a9fc3d95cb4cc970a9bef29058d 112B / 112B 91.0s
=> => sha256:2d1dec7526b86c4839385be8f1570b32daf02d 790.94kB / 790.94kB 91.3s
=> => sha256:af54a441aaa2d6aa3b7ca555fe3d4d7538ca41 796.55kB / 796.55kB 91.7s
=> => sha256:f3b55345739175dee8e86313bc01ec9c07d239f56d 1.09MB / 1.09MB 92.0s
=> => sha256:af56ff00326a2c1ba3b4a4f19025430339944ef620be08 117B / 117B 92.2s
=> => sha256:3dd53e63e7f3fd8cd034d46689ff8e1a2f3457a 82.69MB / 82.69MB 100.0s
=> => sha256:fd298b51700ef7d49e4dde3e3cfabddc1a9e8c8 97.60MB / 97.60MB 109.5s
=> => sha256:cff777063f2f8661eecd6035f1f5d9c3b8aaf 129.04MB / 129.04MB 121.9s
=> => extracting sha256:48210cb4fcba0e0db8274fa5df88bfe493ed3d098fb756d0 7.1s
=> => extracting sha256:73ee71a0778bcf7f0e5c324b036b24439e2d403b60dd2d9 18.5s
=> => extracting sha256:114c1c197e7fad8405889de248bc428bc5e453a146ce92a5 3.8s
=> => extracting sha256:e109e7967ec503340e64563ec56d8fbfdbaf642aa2544ac1 0.0s
=> => extracting sha256:f3edc7209908a7abcc706464c342b6c110fe36d05356d0c6 4.1s
=> => extracting sha256:a37a2c88b2ffe3cb773c2607702d931c0febf9dcca7932bb 0.0s
=> => extracting sha256:3b1144fe021b2392464a9fc3d95cb4cc970a9bef29058de4 0.0s
=> => extracting sha256:2d1dec7526b86c4839385be8f1570b32daf02dfb2d222c53 0.0s
=> => extracting sha256:af54a441aaa2d6aa3b7ca555fe3d4d7538ca417f50d607f9 0.0s
=> => extracting sha256:f3b55345739175dee8e86313bc01ec9c07d239f56db01a01 0.0s
=> => extracting sha256:af56ff00326a2c1ba3b4a4f19025430339944ef620be08d5 0.0s
=> => extracting sha256:3dd53e63e7f3fd8cd034d46689ff8e1a2f3457add3ebde28 0.3s
=> => extracting sha256:fd298b51700ef7d49e4dde3e3cfabddc1a9e8c88d98f6035 1.1s
=> => extracting sha256:cff777063f2f8661eecd6035f1f5d9c3b8aaf50b7aef82b8 1.1s
=> [internal] load build context 0.0s
=> => transferring context: 284B 0.0s
=> [2/5] RUN apt-get update && apt-get install -y --no-install-reco 38.4s
=> [3/5] RUN python3.12 -m venv /venv && /venv/bin/pip install --upg 3.1s
=> [4/5] WORKDIR /app 0.1s
=> [5/5] COPY ./src_sample /app 0.0s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:f14affb9b4008630322611952fe324c36512563f2187f 0.0s
=> => naming to docker.io/rinsaka/python-mecab 0.0s
What's next:
View a summary of image vulnerabilities and recommendations → docker scout quickview
PS C:\...\python>
ビルドに成功したら,イメージが作成されていることを次のコマンドで確認します.
PS C:\...\python> docker image ls ⏎
REPOSITORY TAG IMAGE ID CREATED SIZE
rinsaka/python-mecab latest f14affb9b400 41 seconds ago 10.5GB
PS C:\...\python>
Python サンプルコードを実行する
イメージを作成できたので,そのイメージからコンテナを実行します.このとき,Dockerfile では ENTRYPOINT ["python"] と CMD ["sample.py"] が指定されていることから,次のコマンドではビルド時にイメージにコピーされた sample.py ファイルが python コマンドに渡された上で実行されることに注意してください.
PS C:\...\python> docker run --rm -i rinsaka/python-mecab ⏎
Hello, Docker-Python!
PS C:\...\python>
ENTRYPOINT ["python"] で指定されたコマンドは原則的には変更できませんが,CMD ["sample.py"] で指定されたコマンドは上書き可能です.したがって,明示的に sample.py を渡すことが可能で,その場合も上と同じ結果になります.
PS C:\...\python> docker run --rm -i rinsaka/python-mecab sample.py ⏎
Hello, Docker-Python!
PS C:\...\python>
さらに,sample2.py を渡すと別の結果が得られることに注意してください.
PS C:\...\python> docker run --rm -i rinsaka/python-mecab sample2.py ⏎
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
. 記号,句点,*,*,*,*,.,.,.
EOS
PS C:\...\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 を実行することが可能になります.
PS C:\...\python> docker run --rm -i -v "${PWD}\src:/app" rinsaka/python-mecab sample_mecab1.py ⏎
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ
と 助詞,並立助詞,*,*,*,*,と,ト,ト
みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
. 記号,句点,*,*,*,*,.,.,.
EOS
PS C:\...\python>
バインドマウントの新しい書き方である --mount 構文を利用すると次のようになります.これはコマンドが読みやすく,将来の互換性に優れるという特徴があります.以降の作業では次の書き方を利用することにします(上の書き方は過去に作成された記事を参照する際の理解の手助けになるでしょう).なお,次のコマンド(の黄色ハイライト部分)ではカンマ (,) の後ろに空白文字を入力するとエラーとなることに注意してください.
PS C:\...\python> docker run --rm -i --mount "type=bind,source=${PWD}\src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ
と 助詞,並立助詞,*,*,*,*,と,ト,ト
みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
. 記号,句点,*,*,*,*,.,.,.
EOS
PS C:\...\python>
次は解析の辞書 mecab-ipadic-neologd 明示的に指定する場合です.まずはローカルで編集した後に次のコマンドを実行してください.
PS C:\...\python> Get-Content -Raw .\src\sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/mecab-ipadic-neologd') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) PS C:\...\python> docker run --rm -i --mount "type=bind,source=${PWD}\src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ と 助詞,並立助詞,*,*,*,*,と,ト,ト みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ の 助詞,連体化,*,*,*,*,の,ノ,ノ ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS PS C:\...\python>
次は「unidic」を利用する場合です.
PS C:\...\python> Get-Content -Raw .\src\sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/unidic') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) PS C:\...\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 PS C:\...\python>
次は辞書に「ipadic-utf8」を利用します.
PS C:\...\python> Get-Content -Raw .\src\sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/ipadic-utf8') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) PS C:\...\python> docker run --rm -i --mount "type=bind,source=${PWD}\src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー はきゃ 動詞,自立,*,*,五段・カ行イ音便,仮定縮約1,はく,ハキャ,ハキャ り 助動詞,*,*,*,文語・リ,基本形,り,リ,リ ー 名詞,固有名詞,一般,*,*,*,* ぱみゅぱみゅとみちょぱの 名詞,一般,*,*,*,*,* ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロン 名詞,一般,*,*,*,*,メロン,メロン,メロン パン 名詞,一般,*,*,*,*,パン,パン,パン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS PS C:\...\python>
さらに「debian」を利用してみます.
PS C:\...\python> Get-Content -Raw .\src\sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/debian') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) PS C:\...\python> docker run --rm -i --mount "type=bind,source=${PWD}\src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー はきゃ 動詞,自立,*,*,五段・カ行イ音便,仮定縮約1,はく,ハキャ,ハキャ り 助動詞,*,*,*,文語・リ,基本形,り,リ,リ ー 名詞,固有名詞,一般,*,*,*,* ぱみゅぱみゅとみちょぱの 名詞,一般,*,*,*,*,* ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロン 名詞,一般,*,*,*,*,メロン,メロン,メロン パン 名詞,一般,*,*,*,*,パン,パン,パン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS PS C:\...\python>
最後は「juman-utf8」です.
PS C:\...\python> Get-Content -Raw .\src\sample_mecab1.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/juman-utf8') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) PS C:\...\python> docker run --rm -i --mount "type=bind,source=${PWD}\src,target=/app" rinsaka/python-mecab sample_mecab1.py ⏎ 今日 名詞,時相名詞,*,*,今日,きょう,代表表記:今日/きょう カテゴリ:時間 はき 動詞,*,子音動詞カ行,基本連用形,はく,はき,代表表記:吐く/はく 補文ト 反義:動詞:吸う/すう ゃり 名詞,副詞的名詞,*,*,*,*,* ー 名詞,人名,*,*,*,*,* ぱみ 名詞,人名,*,*,*,*,* ゅぱ 名詞,人名,*,*,*,*,* みゅ 名詞,普通名詞,*,*,みゅ,みゅ,自動獲得:テキスト 意味分類:普通名詞その他:0.833 と 助詞,格助詞,*,*,と,と,連語 みち 形容詞,*,ナノ形容詞,語幹,みちだ,みち,代表表記:未知だ/みちだ 反義:形容詞:既知だ/きちだ ょぱ 名詞,副詞的名詞,*,*,*,*,* の 助詞,接続助詞,*,*,の,の,連語 ライブ 名詞,普通名詞,*,*,ライブ,らいぶ,代表表記:ライブ/らいぶ カテゴリ:抽象物 ドメイン:文化・芸術;メディア で 助詞,格助詞,*,*,で,で,連語 メロンパン 名詞,普通名詞,*,*,*,*,* を 助詞,格助詞,*,*,を,を,連語 食べ 動詞,*,母音動詞,基本連用形,食べる,たべ,代表表記:食べる/たべる ドメイン:料理・食事 ました 接尾辞,動詞性接尾辞,動詞性接尾辞ます型,タ形,ます,ました,代表表記:ます/ます . 特殊,句点,*,*,.,.,* EOS PS C:\...\python>
さらに「sample_mecab2.py」を実行して分かち書きを実行しましょう.
PS C:\...\python> Get-Content -Raw .\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)) PS C:\...\python> docker run --rm -i --mount "type=bind,source=${PWD}\src,target=/app" rinsaka/python-mecab sample_mecab2.py ⏎ 今日 は きゃりーぱみゅぱみゅ と みちょぱ の ライブ で メロンパン を 食べ まし た . PS C:\...\python>
分かち書きの際に利用する辞書を変更してみます.
PS C:\...\python> Get-Content -Raw .\src\sample_mecab2.py ⏎ import MeCab as mc mecab = mc.Tagger('-d /var/lib/mecab/dic/unidic -Owakati') sent = "今日はきゃりーぱみゅぱみゅとみちょぱのライブでメロンパンを食べました." print(mecab.parse(sent)) PS C:\...\python> docker run --rm -i --mount "type=bind,source=${PWD}\src,target=/app" rinsaka/python-mecab sample_mecab2.py ⏎ 今日 はきゃ り ー ぱ み ゅぱみゅとみちょぱの ライブ で メロン パン を 食べ まし た . PS C:\...\python>
「sample_mecab3.py」は茶筌形式で出力する例です.
PS C:\...\python> Get-Content -Raw .\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)) PS C:\...\python> docker run --rm -i --mount "type=bind,source=${PWD}\src,target=/app" rinsaka/python-mecab sample_mecab3.py ⏎ 今日 キョウ 今日 名詞-副詞可能 は ハ は 助詞-係助詞 きゃりーぱみゅぱみゅ キャリーパミュパミュ きゃりーぱみゅぱみゅ 名詞-固有名詞-人名-一般 と ト と 助詞-並立助詞 みちょぱ ミチョパ みちょぱ 名詞-固有名詞-一般 の ノ の 助詞-連体化 ライブ ライブ ライブ 名詞-一般 で デ で 助詞-格助詞-一般 メロンパン メロンパン メロンパン 名詞-固有名詞-一般 を ヲ を 助詞-格助詞-一般 食べ タベ 食べる 動詞-自立 一段 連用形 まし マシ ます 助動詞 特殊・マス 連用形 た タ た 助動詞 特殊・タ 基本形 . . . 記号-句点 EOS PS C:\...\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)
PS C:\...\python> Get-Content -Raw .\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) PS C:\...\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 PS C:\...\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'])
PS C:\...\python> Get-Content -Raw .\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']) PS C:\...\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 PS C:\...\python>
構文解析結果の出力形式を変更してみます.
PS C:\...\python> Get-Content -Raw .\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']) PS C:\...\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 PS C:\...\python>
構文解析に用いる辞書と結果の出力形式を変更してみます.
PS C:\...\python> Get-Content -Raw .\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']) PS C:\...\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 PS C:\...\python>
Entrypoint を指定して他のコマンドを実行する
Dockerfile では ENTRYPOINT ["python"] が指定されているので,コンテナの起動時には python コマンドが実行され,コマンドを変更することができません.これによってコンテナの安全性を確保しています.しかしながら,プログラムのデバッグなどでコンテナを直接操作したい場合もあります.そのような場合は次のように --entrypoint オプションを用いてコマンドを上書きすることができます.例えば次のとおり /bin/bash シェルに入ることができます.このとき,バインドマウントを利用していないことから /app ディレクトリはイメージのビルド時にコピーされた内容であることが分かるはずです.
PS C:\...\python> docker run --rm -i -t --entrypoint /bin/bash rinsaka/python-mecab ⏎ root@094c59484b65:/app# ls ⏎ sample.py sample2.py root@094c59484b65:/app# python sample2.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS root@094c59484b65:/app# exit ⏎ exit PS C:\...\python>
一方で,バインドマウントを利用するとコンテナ起動時点の src ディレクトリのファイルが利用できるはずです.
PS C:\...\python> docker run --rm -i -t --mount "type=bind,source=${PWD}\src,target=/app" --entrypoint /bin/bash rinsaka/python-mecab ⏎ root@abdd6fa11290:/app# ls ⏎ sample_cabocha1.py sample_mecab1.py sample_mecab3.py sample_cabocha2.py sample_mecab2.py sent.txt root@abdd6fa11290:/app# python sample_mecab1.py ⏎ 今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ きゃりーぱみゅぱみゅ 名詞,固有名詞,人名,一般,*,*,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,キャリーパミュパミュ と 助詞,並立助詞,*,*,*,*,と,ト,ト みちょぱ 名詞,固有名詞,一般,*,*,*,みちょぱ,ミチョパ,ミチョパ の 助詞,連体化,*,*,*,*,の,ノ,ノ ライブ 名詞,一般,*,*,*,*,ライブ,ライブ,ライブ で 助詞,格助詞,一般,*,*,*,で,デ,デ メロンパン 名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ . 記号,句点,*,*,*,*,.,.,. EOS root@abdd6fa11290:/app# exit ⏎ exit PS C:\...\python>
さらに次のコマンドで Python のシェルを利用することも可能です.
PS C:\...\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() ⏎ PS C:\...\python>