LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

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

概要

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に関する補足を追記しました

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
What you can do with signing up
2