LINE BOOT AWARDS 2018 に応募しました

はじめに

本記事は、LINE BOOT AWARDS 2018に応募した下記エントリーの技術解説ページです。

https://www.line-community.me/awards/workdetail/5bb361c24016908c8d8e94ba

今回「鎌倉ごみ調べ」という作品名でBotを作成しました。

ごみの分類、出し方は住む地域によって大きく変わるため、トラブルになりやすく自治体の方も困っているのでないかと想像しました。

この問題を和らげるために、住民が手軽にごみの情報を手に入れられるBotがあれば便利かも、と思ったのが今回のきっかけです。

それと個人的な理由として、自分が家のごみ当番なので(朝、家を出る時にごみを集積所に置くだけですが…)、毎朝、今日出すごみの種別がLineのプッシュ通知で来たら楽かも、というのもありました。

鎌倉市には「ごみバスターズ」というアプリがあり、ゲーム性もあってとても使いやすかったです。
なので、作品を作る上で以下の2点を考慮して作ってみました。

1. 今のアプリにない機能
2. Botならではの機能

システム関連図

f:id:e-craftsman:20181020205942p:plain:w600

環境

  • Heroku(Postgres含む)
  • GitHub

サービス

機能

1. 位置情報

1.1 地域登録

携帯の位置情報を送ることで、ごみの地域として登録することができます。(鎌倉市のみ)

f:id:e-craftsman:20181011212253p:plain

苦労した点

送られてくる位置情報に住所が含まれているため、最初は住所からごみの地域を特定してDBに登録していました。
毎回、パターン1の形式でデータが来ればがいいのですが、パターン2の場合があることが判明し、対応を変更。
位置情報に含まれている緯度経度をGoogle Maps APIに投げて、取得した住所からごみ地域を特定し、DBに登録するようにしました。

>パターン1 (日本、郵便番号 神奈川県鎌倉市...)
f:id:e-craftsman:20181011212958p:plain

>パターン2 (大船XX-XX-XX 鎌倉市, 神奈川県 郵便番号 日本)
f:id:e-craftsman:20181011213102p:plain

1.2 スケジュール確認

送った位置情報のごみスケジュールを教えてくれます。
鎌倉市山崎の場合は、うぐいす山とそれ以外でスケジュールが異なるためどちらか選んでもらいます。
f:id:e-craftsman:20181011215749p:plain

>「いいえ」を選んだ場合
f:id:e-craftsman:20181011215754p:plain

1.3 指定ごみ袋取扱店

位置情報に最も近い店舗Top5を教えてくれます。
測地線航海算法を使用して距離を算出して、近い方から並べています。

f:id:e-craftsman:20181011220033p:plain

2. 画像認識

写真を送ると物体を認識して、ごみの種類と捨てる曜日を教えてくれます。(登録地域がない場合は、ごみの種類のみ)
IBM Visual Recognitionに画像を投げて、物体検出結果を日本語で取得。
スコア(合っている確率)が一定以上の単語をDBで検索し、ごみの情報を返します。

f:id:e-craftsman:20181011222422p:plain

f:id:e-craftsman:20181011222427p:plain

苦労した点

はじめは、AWSAmazon Rekognitionで物体検出を行っていましたが、結果が英語で返ってくるためGoogle Translation APIで日本語に変換していました。
英単語を翻訳させると様々な日本訳が返ってくるため、折角の物体検出結果がブレてしまい精度があまり良くありませんでした。
そこで、物体検出結果を日本語で返してくれるIBM Visual Recognitionを使うことに。
翻訳の揺れがなくなり精度も随分上がりました。
因みにIBM Visual Recognitionから物体の色も返ってきますが、色は無視するようにしています。

3. テキスト

3.1 曜日または昨日/一昨日/今日/明日/明後日

文章から、質問された曜日または日にちのごみの種類を返します。
テキストが来たらまずLuisに投げます。
Luisには文章とキーワード(曜日または一昨年/昨日/今日/明日/明後日)を事前に登録しておき、投げたテキストに何のキーワードが含まれているか結果を返してもらいます。
キーワードがあれば、その日のごみの種類をDBから取得して返します。

f:id:e-craftsman:20181011224732p:plain

3.2 スケジュール

Luisに文章を投げて、スケジュールに関する質問だったらごみのスケジュールを返します。

f:id:e-craftsman:20181011224752p:plain

3.3 ごみに出すモノの名前

Luisに引っかからなかった場合、テキストをgooひらがな化APIで、ひらがなとカタカナに変換します。
「送られて来たテキスト」、「ひらがな」、「カタカナ」、3つをDBで検索して何れかに該当するごみ情報を返します。

f:id:e-craftsman:20181011224816p:plain

心残り

時間があれば、ごみに出すモノの名前もLuisを使って文章から抽出できればよかったです。
もっとチャットBotらしく会話している感が増したかもしれません。。

4. スタンプ

完全なお遊びですが、スタンプを送るとブラウンのスタンプがランダムで返ってきます。

f:id:e-craftsman:20181011222604p:plain

5. プッシュ通知

5.1 アラーム

毎日、決まった時間に今日出すごみを教えてくれます。
f:id:e-craftsman:20181011215534p:plain

事前に設定した時間に、登録地域の今日のごみを調べてプッシュ通知しています。
f:id:e-craftsman:20181011215549p:plain

5.2 お知らせ機能

ブラウザからプッシュ通知の設定ができる機能です。(レスポンシブ対応)
時間とメッセージを登録すると、地域を登録している利用者全員にメッセージを送ることができます。
台風や大雪など自然災害時のごみ出しのお知らせ、年末年始/GW/お盆などの休みの日の連絡等が可能です。

f:id:e-craftsman:20181020215207p:plain:w600
メッセージには絵文字も登録できるようにしてみました。
f:id:e-craftsman:20181020215213p:plain:w600
f:id:e-craftsman:20181020215218p:plain:w600
指定の時間にプッシュ通知がきます。
f:id:e-craftsman:20181020215530p:plain:w250

最後に

前述した考慮した点ですが、まあまあ実現できたのかなと思っています。

1. 今のアプリにない機能
位置情報からごみのスケジュールやごみ袋取扱店を教えてくれる。
写真を送ったらごみの種類の候補を教えてくれる。

2. Botならではの機能
質問したら曜日や日にちのごみの種類を教えてくれる。
プッシュ通知で今日出すごみを教えてくれる。
指定した時間にプッシュ通知を送れる。


LineのMessage APIを使ってみて、簡単にいろんなメッセージが作れるので時間も忘れてもくもくコーディングができました。
DBに入れるデータを作るのが思った以上に大変で苦労しましたが、たくさんデータを入れたおかげで機能たっぷりのBotになったと思います。

長文となってしまいましたが、最後まで読んでいただきまして、ありがとうございました。