
- 作者:斎藤勇哉
- 発売日: 2020/11/30
- メディア: Kindle版
目次
はじめに
以前の作成した、だじゃレンジャーLINE botの更新。
問題点
- 小学生には難解な漢字が多く読めない。
- 与えられたお題(キーワード)でだじゃれを返せない場合、botからのレスポンスがなく、利用者が不安に。
目的
- 漢字にフリガナをふる。
- だじゃれを返せない場合は、返せない旨を伝える。
コード
1. 漢字にフリガナをふる。
こちらの記事を参考にした。
手順としては、
- Mecabで形態素解析
- 漢字であればふりがなをふる。ふりがなは形態素解析の結果を用いる。
- ふりがなは括弧書き()で、送り仮名はふりがなとは別に()の外に表示。
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)
変更結果
まとめ
小学生にもフレンドリーなLINE botになった。 LINE botからのレスポンスがないことによる不安も解消。
頑張れ!、喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓

- 作者:斎藤勇哉
- 発売日: 2020/11/30
- メディア: Kindle版