前回は、あいさつチャットボットの作成を通じて、チャットボットのプログラムが行う具体的な処理について説明しました。今回はより実用的な、割り勘チャットボットを作ります。前回と同様に、プログラミング言語のPython(パイソン)を使って、LINE(ライン)用プログラムの開発について解説します。
第5回「実用的なチャットボットを作ってみよう~割り勘ボット」を解説していきます。
1. 割り勘チャットボットの仕組み
今回作成するのは、図1 のように、例えば「23000 円を5 人で」のように問いかけると、「23000 円を5 人で割り勘すると4600 円です。」のように答えてくれる、割り勘チャットボットです。宴会の会計や、共同で物を購入するときなどに役立ちます。計算機のアプリを使っても割り勘はできますが、チャットアプリをいつも使っているならば、アプリを切り替えずに割り勘が可能です。計算した結果がログに残るのもよい点です。
ユーザーから割り勘チャットボットへの問いかけは、「23000 円を5 人で」のように言う場合もあれば、「6 人で39000 円」のように言う場合もあります。あるいは「7200 円を4 人で割り勘したい」のように言うかもしれません。このようにさまざまな言い方がありますが、どの場合にも「○○円」という金額のパターンと、「△△人」という人数のパターンが含まれています。これらのパターンに注目して、ユーザーの発言から金額と人数を抽出すれば、割り勘の計算ができます。テキストから特定のパターンを検索するには、正規表現(せいきひょうげん)という機能を使うのが便利です。正規表現はさまざまなプログラミング言語で利用できます。
例えば「○○円」というパターンは、「1 桁以上の数字」の後に「円」が続くパターンです。これを正規表現では「[0-9]+ 円」または「\d+ 円」のように表します。「[0-9]」は0 から9 までの数字を示し、「[0-9]+」は0 から9 までの数字が1 桁以上続くことを示します。また「\d」は「[0-9]」を簡潔に書くための記法です。「\」の部分には、環境によって\(円記号)を使う場合と、\(バックスラッシュ)を使う場合があります。同様に「△△人」というパターンは、「[0-9]+ 人」または「\d+ 人」のように表すことができます。今回のプログラム例では、簡潔な「\d+ 円」や「\d+ 人」という記法を使うことにします。
さらに、「(\d+) 円」や「(\d+) 人」のような正規表現を使うと、括弧で囲んだ「(\d+)」という数値の部分だけを取り出して利用することができます。つまり、「○○円」や「△△人」というパターンを見つけた上で、「○○」や「△△」という金額や人数の数値を取り出すことが可能です。これで割り勘の計算に必要な値がそろいます。
2. 割り勘チャットボットのプログラム
プログラムの全体は次のようになります。
プログラムの主要な処理を解説していきます。
図2 は、価格と人数を取り出す処理です。最初にユーザーによる発言のテキストを取得し、変数query に格納します。次に正規表現を使って、価格と人数のパターンを発言が含んでいるか調べます。結果は変数price およびpeople に格納します。「re.search」の「re」はregularexpression(正規表現)の略で、Python における正規表現の機能です。search(サーチ)は、re が提供する機能の一つで、テキストから指定したパターンを検索します。
図3 は割り勘の計算をする処理です。ユーザーの発言中に価格または人数が見つからなかったら、「if not price or not people:」以下の処理「reply = '金額と人数を指定してください。'」が実行されます。ユーザーの発言に価格と人数の両方が含まれていないと、割り勘を計算することができません。そのため、「金額と人数を指定してください。」と、このチャットボットの使い方をユーザーに示します。
続く「else:」は「そうでなければ」という意味です。価格と人数の両方が見つかったら、これらの数値を抽出した後に、割り勘を計算します。「{} 円を{} 人で割り勘すると{} 円です。」というテキストの、{}という波括弧の部分に、価格(price)、人数(people)、価格を人数で割ったもの(price//people)を埋め込んで応答とします。
「price//people」の「//」は、結果を整数とする割り算です。割り切れない場合には、例えば「1000 円を3 人で割り勘すると333 円です。」のように誤差が出ます。もし正確に応答させたければ、「1000 円を3人で割り勘すると333 円で、残額1 円です。」のように、残額を表示するようにプログラムを変更する方法もあります。
3. より幅広い言い方に対応するには
4. 誤った応答を防止するには
全6回で下記の内容を解説しています。