hastings
@hastings

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Docker環境でmecab-python3の辞書パス(NEologd)が通らずにエラーを吐き出す

実現したいこと

python-mecab3に辞書パス(NEologd)を通したい
・Django Webフレームワークにおいて、python-mecab3と辞書mecab-unidic-neologdを用いた形態素解析アプリを開発したい

前提

・Django Webフレームワークにて、pyhon-mecab3mecab-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

最後に

一日ほど方法を探しましたが、解決策が見つかりませんでしたので質問させていただきました。
お手数ではございますが、何卒よろしくお願いいたします。

0

1Answer

その後、検証を行ったところ、Docker(Linux)環境で日本語の環境が整っていないことが原因でした。下記の内容(フォントインストール)をDockerfileに追記して辞書パスを通したところ、エラーを吐き出すことなく形態素解析が行えました。

RUN apt-get update &&\
    apt-get install -y wget &&\
    apt-get install -y zip unzip &&\
    apt-get install -y fontconfig
RUN wget https://moji.or.jp/wp-content/ipafont/IPAexfont/IPAexfont00301.zip
RUN unzip IPAexfont00301.zip
RUN mkdir -p /usr/share/fonts/ipa
RUN cp IPAexfont00301/*.ttf /usr/share/fonts/ipa
RUN fc-cache -fv

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

ただし、辞書pathを通した状態で形態素解析を行った場合、処理速度が著しく低下するという新たな問題が発生します。その点については、現在検証中です。

0Like

Your answer might help someone💌