【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

【LINE bot】おいら、だじゃレンジャー!その2

はじめに

以前の作成した、だじゃレンジャーLINE botの更新。

問題点

  1. 小学生には難解な漢字が多く読めない。
  2. 与えられたお題(キーワード)でだじゃれを返せない場合、botからのレスポンスがなく、利用者が不安に。

目的

  1. 漢字にフリガナをふる。
  2. だじゃれを返せない場合は、返せない旨を伝える。

コード

1. 漢字にフリガナをふる。

こちらの記事を参考にした。

手順としては、

  1. Mecabで形態素解析
  2. 漢字であればふりがなをふる。ふりがなは形態素解析の結果を用いる。
  3. ふりがなは括弧書き()で、送り仮名はふりがなとは別に()の外に表示。
furigana.py
import sys
import MeCab
import re

def henkan(text) :
    hiragana=[chr(i) for i in range(12353, 12436)]
    katakana=[chr(i) for i in range(12449, 12532)]
    kana=""
    #読み仮名のカタかなをひらがなに
    for text in list(text):
        for i in range(83):
            if text == katakana[i]:
                kana+=hiragana[i]
    return kana


def tohensu(origin,kana) :
    origin="".join(origin)
    kana="".join(kana)
    return origin,kana

def kanadelete(origin,kana) :
    origin=list(origin)
    kana=list(kana)
    num1=len(origin)
    num2=len(kana)
    okurigana=""

    if origin[num1-1] == kana[num2-1] and origin[num1-2] == kana[num2-2] :
        okurigana=origin[num1-2]+origin[num1-1]
        origin[num1-1]=""
        origin[num1-2]=""
        kana[num2-1]=""
        kana[num2-2]=""
        origin,kana=tohensu(origin,kana)

    elif origin[num1-1] == kana[num2-1] :

        okurigana=origin[num1-1]

        origin[num1-1]=""
        kana[num2-1]=""
        origin="".join(origin)
        kana="".join(kana)
    else :
        origin,kana=tohensu(origin,kana)

    return origin,kana,okurigana

def main(text):
    mecab = MeCab.Tagger("-Ochasen")
    mecab.parse('')#空でパースする必要がある
    node=mecab.parseToNode(text)

    text_new = []
    while node :
        origin=node.surface#もとの単語を代入
        yomi=node.feature.split(",")[7]#読み仮名を代入
        kana=henkan(yomi)

        #正規表現で漢字と一致するかをチェック
        pattern = "[一-龥]"
        matchOB = re.match(pattern , origin)

        #originが空のとき、漢字以外の時はふりがなを振る必要がないのでそのまま出力する
        if origin != "" and matchOB:
            origin,kana,okurigana=kanadelete(origin,kana)
            text_new.append("{0}({1})".format(origin,kana)+okurigana)
        else :
            text_new.append(origin)
        node=node.next

    text_new = ''.join(text_new)
    return text_new

2. だじゃれを返せない場合は、返せない旨を伝える。

Pythonの例外処理try-exceptを用いる。 だじゃれを生成するところ(dj.dajare_search(word))でエラーがでれば、dajare_textに'ごめんなさい!そのお題(だい)で、だじゃれはおもいつきませんでした...'を格納。

try:
    dajare_text = dj.dajare_search(word)
    dajare_text = furigana.main(dajare_text)
except IndexError:
    dajare_text = 'ごめんなさい!\nそのお題(だい)で、だじゃれはおもいつきませんでした...'   

上の変更点を加えたmain.pyのコードはこちら。

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
import dajaregen as dj
import furigana

app = Flask(__name__)

#環境変数取得
# not should be chnged chracters.
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:
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    word = event.message.text
try:
    dajare_text = dj.dajare_search(word)
    dajare_text = furigana.main(dajare_text)
except IndexError:
    dajare_text = 'ごめんなさい!\nそのお題(だい)で、だじゃれはおもいつきませんでした...'
        
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=dajare_text))

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

変更結果

f:id:AIProgrammer:20200419015645p:plain

まとめ

小学生にもフレンドリーなLINE botになった。 LINE botからのレスポンスがないことによる不安も解消。



頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓