やってみたこと
800ml入りの詰め替え洗剤と、600mlの非詰め替え(ボトル付き)はどっちが安いのだろう?と思うことがよくあります。
そういう、単価の計算って、別に電卓たたけばいいのだけどちょっとめんどくさいですよね。
というわけで、単価の計算をやってくれるLINE botを作ってみました。
使った素材はこちら
- Power Automate (要Premium)
- LUIS (AzureのCognitive Service)
- LINE Messaging API
以上
LUISは入力されたメッセージから、値段部分と数量 (200mlとか500gとか10個とか)を読み取るために利用しました。LUISによる文章解析の結果、2つずつ数量と値段が取れている前提で、Power Automate上で単価を計算して、どちらが安いのかをReplyで返しています。
LUIS部分
LUIS部分は気合です。ひたすら例文を入れて、数量と価格をマークしていきます。
LUISの導入部分は、少し画面が変わっていますが、こちらの記事が分かりやすいです。
自分用メモ的にLINE送信した予定をAIで読み取ってGoogleカレンダーに自動登録しよう
実際のAuthoring画面が以下です。
※上図ではある程度調教しているので、例文を入れると、どういう要素なのか、よみとってマークしてくれています。
青い下線が引かれている部分を、数量なのか価格なのか、指定していきます。
傾向としては、文章の先頭に1桁の数量が来ると、認識確率がすごく下がりました。なので、「ねえ、XX」のようなワードをユーザーには入れてもらう工夫が必要そうです。
Power Automateパート
Power Automateパートは簡単です。すでにLINE Messaging APIのカスタムコネクタを作っているので、リプライはメッセージを入れるだけです。
前半、Webhookの受信は、Messaging APIの仕様どおり。
受け取ったメッセージをそのままLUISのインプットにします。
これで結果が返ってくるのですが、結果は以下のような配列で返されます。
[
{
"entity": "5",
"type": "amount",
"startIndex": 3,
"endIndex": 3,
"score": 0.5533202
},
{
"entity": "1 0",
"type": "amount",
"startIndex": 15,
"endIndex": 16,
"score": 0.9669346
},
{
"entity": "安い",
"type": "highlow",
"startIndex": 31,
"endIndex": 32,
"score": 0.9992584
},
{
"entity": "3 5 0 0 円",
"type": "price",
"startIndex": 7,
"endIndex": 11,
"score": 0.9945259
},
{
"entity": "7 5 0 0 円",
"type": "price",
"startIndex": 20,
"endIndex": 24,
"score": 0.996291
}
]
※Quantityじゃね?とかはまあスルーしてください。。
注意しなければならないのは、数量、価格いずれも数字の間に半角スペースが入る点です。実際に割り算するとき(単価にするとき)は、スペースを除去する必要があります。
これらの結果から、最初の数量&価格の組み合わせ と 後ろの数量&価格の組み合わせにします。
LUISの解析結果自体は、精度の情報とか、どこに該当するかとか、あるいはどのタイプの読み取り結果なのかをすべて含んでいます。
後続で計算しやすいように、価格や数量だけの配列を生成し、かつスペースを除去します。
これにはSelect(選択)アクションを利用しています。
あとは素直に計算。Power Automateでは割り算はdiv()関数です。
おわり
こんな風に、かなり短いフローと、関数を少しつかうだけで、単価比較のLINE Botが完成しました!
ポイントはLUISで頑張って調教することと、LINE部分を簡単にするために、カスタムコネクタを使うところです。
以上、生活お助けBotの概要でした。