1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

形態素解析の結果を返すLinebot(python × MeCab × heroku)

Last updated at Posted at 2020-09-21

#概要
LINEへの入力内容をpythonのサーバで受けて、MeCabによる形態素解析の結果を応答として返すLinebotを作りました。Linebotとpythonプログラムの中継にherokuを使いました。

下記のサイトを参考にしました。
PythonでLine botを作ってみた
Getting started with the Messaging API | LINE Developers
#環境
macOS Catalina 10.15.4
python 3.8.0
#事前準備
PythonでLine botを作ってみたの「実装」までを終えておきます。つまり、LineDeveloperアカウントとHerokuアカウントを作り、LineDeveloperコンソールで新規チャンネルを作成し、チャンネルアクセストークンとチャンネルシークレットを取得します。GUIなどたまに変化しているようなので、適宜、LINEの公式ドキュメントを参照しました。

pythonからmecab (mecab-python3)を使えるようにしておきます。
下記サイトなどが参考になるかも知れません。
Python3からMeCabを使う

2021/03/02追記:使う辞書にこだわりがなければ、2021/03/02時点では公式リファレンスのやり方pip install mecab-python3 unidic-liteが一番簡単です。(追記ここまで)
https://pypi.org/project/mecab-python3/

#pythonサーバの構築
ローカルで適当な名前のディレクトリを作り、仮想環境を立ち上げます。

$ mkdir <dir name>
$ cd <dir name>
$ python -m venv .
$ source bin/activate

各種ライブラリをインストールします。仮想環境を作ったので、mecab-python3も改めてインストールしておきます。

$ pip install Flask
$ pip install line-bot-sdk
$ pip install mecab-python3 unidic-lite

main.pyを作ります。
PythonでLine botを作ってみた
のコードをもとに、mecabによる形態素解析の部分を追加、変更しています(コード中でコメントしている変更①と変更②が本実装における変更部分です)。

main.py
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

import os
#変更①。MeCabのimportとobject宣言を追記
import MeCab
m = MeCab.Tagger('')

app = Flask(__name__)

#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        #変更①。mecabのパース結果を返すように変更
        #TextSendMessage(text=event.message.text)) 
        TextSendMessage(text=m.parse(event.message.text)))

if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

##Heroku CLIのインストール
Herokuをコマンドラインから使うHeroku CLIをインストールします。
今回はbrewでインストールしました。

$ brew tap heroku/brew && brew install heroku

参考:The Heroku CLI | Heroku Dev Center

##ローカルで環境構築
Heroku CLIがインストールできたら、そのままコマンドラインで、herokuにログインします。

$ heroku login

Herokuのアプリを新規作成します。

$ heroku create <app name>

LINEの認証情報をHerokuの環境変数に設定します。

$ heroku config:set YOUR_CHANNEL_SECRET="Channel Secret" --app <app name>
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="Channel Access Token" --app <app name>

設定ファイルを作成します。
バージョンはローカル環境と念の為合わせておきます。
2021/03/02追記:runtime.txtのpythonバージョンはデプロイ日時点でherokuが対応しているものに合わせる必要がありますので、何かしらエラーが起きた場合、適宜修正してみてください(追記ここまで)

runtime.txt
python-3.8.0
Procfile
web: python main.py

またrequirements.txtを作ります。

$ pip freeze > requirements.txt

##Herokuのリモートサーバの設定
リモートサーバの設定をします。自分の環境ではこれをやっておかないと、デプロイ(git push heroku master)がうまくできませんでした。

$ heroku git:remote -a <app name>

##herokuでmecab-python3を使えるようにする設定
調べると、linuxbrewを用いる方法など出てきますが、最新版のmecab-python3ではunidic-liteをpip installするだけで使うことができますので、ここで特別に何かをする必要はありません。

参考:
https://pypi.org/project/mecab-python3/1.0.3/
Herokuでmecab-python3を使う
##デプロイ

git init
git add .
git commit -am "new commit"
git push heroku master

##テスト
スマートフォンなどでLineDevelopersのチャンネルQR Codeを読み取り、ボットを友達登録します。適当な言葉を打って、形態素解析の結果が返ってきていればOKです。
自動応答メッセージも一緒に帰ってきてしまうので、不要であれば、LineDeveloperコンソール > 応答設定 > 詳細設定 > 応答メッセージのラジオボタンをオフにします。

#更新履歴

日時 更新内容
2021/03/02 herokuにmecab-python3を使えるようにする方法がより簡単にできることがわかったので、内容を修正しました
2021/03/02 runtime.txtに関する補足を追記しました
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?