Docker環境でmecab-python3の辞書パス(NEologd)が通らずにエラーを吐き出す
実現したいこと
・python-mecab3
に辞書パス(NEologd)を通したい
・Django Webフレームワークにおいて、python-mecab3
と辞書mecab-unidic-neologd
を用いた形態素解析アプリを開発したい
前提
・Django Webフレームワークにて、pyhon-mecab3
とmecab-unidic-neologd
を用いたアプリを開発している
・Django テスト環境では問題なく辞書パス(NEologd)が通り、期待通りの形態素解析ができる
・pip install unidic-lite
をインストールしているため、mecab = MeCab.Tagger()
の場合は問題なく稼働する
・Docker環境になると、表題の通り、辞書パスが通らずに下記のエラーが発生する
・辞書パス(NEologd)を指定しない場合は、Docker環境上でも形態素解析が行えるが、期待された結果にならない
・辞書データについては/reviewer/mecab/dic/mecab-unidic-neologd
に格納している
発生している問題・エラーメッセージ
・Docker環境上で、下記のコードを実行した場合、mecab-python3
に辞書パス(NEologd)が通らずに、下記のエラーを吐き出す
RuntimeError at /
----------------------------------------------------------
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: -d /django/reviewer/mecab/dic/mecab-unidic-neologd
[pos != std::string::npos] format error:
----------------------------------------------------------
Request Method: POST
Request URL: http://localhost:8000/
Django Version: 4.1.4
Exception Type: RuntimeError
Exception Value:
----------------------------------------------------------
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: -d /django/reviewer/mecab/dic/mecab-unidic-neologd
[pos != std::string::npos] format error:
----------------------------------------------------------
Exception Location: /usr/local/lib/python3.10/site-packages/MeCab/__init__.py, line 135, in __init__
Raised during: reviewer.views.home_view
Python Executable: /usr/local/bin/python
Python Version: 3.10.10
Python Path:
['/django',
'/usr/local/lib/python310.zip',
'/usr/local/lib/python3.10',
'/usr/local/lib/python3.10/lib-dynload',
'/usr/local/lib/python3.10/site-packages']
Server time: Sat, 18 Feb 2023 19:11:28 +0900
なお、通常ドキュメントに記載されていた通り、パスが通らない場合は、以下の通り[ifs] no such file or directory
と表示される。(パス自体はDjangoテスト環境で通っている。)
------------------- ERROR DETAILS ------------------------
arguments: -d /django/reviewer/mecab/dic
[ifs] no such file or directory: /django/reviewer/mecab/dic/dicrc
----------------------------------------------------------
エラーに[pos != std::string::npos] format error:
と表示されていることが関係していると推測される。
該当のソースコード
def mecab_text(text):
# MeCabのインスタンスを作成(辞書はmecab-ipadic-neologdを使用)
# dicdir = "-d ./reviewer/mecab/dic/mecab-unidic-neologd" # Djangoテスト環境上でのパス
dicdir = "-d /django/reviewer/mecab/dic/mecab-unidic-neologd"
mecab = MeCab.Tagger(dicdir)
# 形態素解析
node = mecab.parseToNode(text)
# 形態素解析した結果を格納するリスト
wordlist = []
while node:
# 名詞のみリストに格納する
if node.feature.split(",")[0] == "名詞":
wordlist.append(node.surface)
# 形容詞を取得、elifで追加する
elif node.feature.split(",")[0] == "形容詞":
wordlist.append(node.surface)
# 動詞を取得、elifで追加する
# elif node.feature.split(',')[0] == '動詞':
# wordlist.append(node.surface)
node = node.next
return wordlist
FROM python:3.10-buster
ENV PYTHONBUFFERED=1
WORKDIR /django
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD python manage.py runserver 0.0.0.0:8000
version: "3.10"
services:
app:
build: .
volumes:
- .:/django
ports:
- 8000:8000
image: ez-app-reviewer-repository:latest
container_name: django_container
command: python manage.py runserver 0.0.0.0:8000
試したこと
・python-mecab3のドキュメントの通読
https://github.com/SamuraiT/mecab-python3
・先行事例の検索
・Dockerfileの書き換え
・ChatGPTへの質問
・teratailにも同様の質問を掲示しております
https://teratail.com/questions/plmv8o52lra9w7
最後に
一日ほど方法を探しましたが、解決策が見つかりませんでしたので質問させていただきました。
お手数ではございますが、何卒よろしくお願いいたします。