質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

解決済

1回答

3759閲覧

LambdaでMecabを実装したい

aizai2

総合スコア10

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

0クリップ

投稿2019/03/01 07:39

編集2019/03/01 11:38

前提・実現したいこと

以下のサイトを参考にLambdaでMecabを動かしたいのですが、上手くいきません。
https://qiita.com/rtaguchi/items/e6cb594196fa8186e9a2
https://dev.classmethod.jp/cloud/aws-lambda-with-mecab/
https://github.com/KunihikoKido/docs/blob/8608849b1abfce67dbb4d97eddac50e0d85570d0/_posts/2016-02-12-aws-lambda-with-mecab-improved.md

手順としては以下の順番でMecabパッケージを作り、Lambdaにアップロードしましたが、import Mecabでエラーが起きてしまいます。

(1)Amazon SageMakerのターミナルを使って(Amazon Linux)、Mecab、IPA辞書、mecab-python-3をインストール。インストール先のフォルダは、/var/taskとしています。

フォルダ作成

sudo mkdir task cd ~ sudo ln -s /usr/libexec/gcc/x86_64-amazon-linux/4.8.5/cc1plus /usr/local/bin/

MeCabのダウンロードとビルド

curl -L "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE" -o mecab-0.996.tar.gz tar -zxvf mecab-0.996.tar.gz cd mecab-0.996 sudo ./configure --prefix=/var/task --with-charset=utf8 sudo make sudo make install

IPA辞書のダウンロードとビルド

cd ~ curl -L "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM" -o mecab-ipadic-2.7.0-20070801.tar.gz tar -zxvf mecab-ipadic-2.7.0-20070801.tar.gz cd mecab-ipadic-2.7.0-20070801 sudo ./configure --prefix=/var/task --with-charset=utf8 --with-mecab-config=/var/task/bin/mecab-config sudo make sudo make install

mecab-python-3のインストール

cd ~ sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm sudo yum makecache sudo yum -y install mecab-devel mkdir temp cd temp pip install mecab-python3 -t . sudo mv ./* /var/task

(2)1のパックをZipで圧縮して一旦ローカルに落とし、Pycharmで書いたlambda_function.py、settings.py、local_settings.pyとまとめて再度Zipファイルを作成。

zip /home/ec2-user/mecabpack -r var/task

ローカル環境でZip化したフォルダ構成
lambda_function.py
settings.py
local_settings.py
var
└task

taskの下
├__pycache__
├bin
├etc
├include
├lib
├libexec
├mecab_python3-0.996.1.dist-info
└share

mecabrcに記述されている内容
⇒dicdir = /var/task/lib/mecab/dic/ipadic

(3)2をS3にアップロードした上でLambda関数を作成し、S3からZipファイルを解凍・コード生成。

 ランタイム:Python3.6(後はディフォルトの設定をそのまま利用)

(4)この状態でコンパイルできるかテストをしたところ、エラーが発生。import mecabで問題が起きてしまいます。

発生している問題・エラーメッセージ

START RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f Version: $LATEST
Unable to import module 'lambda_function': No module named 'MeCab'

END RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f
REPORT RequestId: 53a16fbc-63de-40c3-b636-08d1090f639f Duration: 0.45 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 57 MB

該当のソースコード

##lambda_function.py # coding=utf-8 import os import settings import json import logging logger = logging.getLogger(__name__) logger.setLevel(settings.LOG_LEVEL) # preload libmecab import ctypes libdir = os.path.join(os.getcwd(), './var/task/lib') libmecab = ctypes.cdll.LoadLibrary(os.path.join(libdir, 'libmecab.so')) import MeCab def lambda_handler(event, context): slack_comment = '金曜日は中華屋で台湾ラーメン&ミニチャーハン ' return {"slack_comment": slack_comment}
## settings.py import logging DEBUG = False LOG_LEVEL = logging.INFO try:   from local_settings import * except ImportError:   pass
## local_settings.py import logging DEBUG = True LOG_LEVEL = logging.DEBUG

試したこと

次の3つのどれかに問題があると考え、それぞれ対応を試みました。

①Mecabパッケージのフォルダ構成
フォルダ構成に問題があるのではないかと考え、/var/task以外に/var/task/mecabや/home/ec2-user/var/taskなどのパターンも作成しましたが、結果は同じでした。

②Python3のバインディング
当初はmecab-python-3のインストールでmecab-configが見つからないというエラーが起きました。仕方なくsetup.pyファイルを書き換えて対応しましたが、Groongaリポジトリを導入するとimport mecab-python-3でエラーが起きなくなりました(ただ、どちらにしてもLambdaでは動きません)。

③import mecabのサブプロセス化
lambda_function.pyでimport mecabをするのではなく、サブプロセス内(tokenizer.py)でmecabを呼び出してみましたが、結果は同じでNo module named 'MeCab'とのエラーが発生します。

呼び出し方に問題があるのか、呼ばれる方の構造に問題があるのか、全く分からなくなってしまいました。どなたか知見のある方のアドバイスをお待ちしております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/03/01 10:26

この手の問題はきちんと再現できる手順を記載していただかないと、なかなか解決には結びつかないと思いますよ。ちょっとした手順の違いで問題が発生する可能性もありますので。
aizai2

2019/03/01 11:39

ご指摘ありがとうございます。具体的なコマンドなども追記させて頂きました。
guest

回答1

0

自己解決

自己解決しました。Zipフォルダの構成に問題があったようです。

Lambdaの環境は/var/taskで動いているようですが、ここにvar/task/~のフォルダ構成で作ったMecabパックを置いたのが問題でした(/var/task/var/taskとなってたわけですね)。Zipファイル作成には気を付けないと・・。

投稿2019/03/02 08:12

aizai2

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問