###はじめに
前回の【ぴよぴよPython】LINEボット作った話①の続きです。
今回は、『【目標2】contextを保持し、分岐つくる』を行います。
###環境
・Python 3.7.3
・mac バージョン10.13.2
###【目標2】の完成挙動
【MIYAGI自己紹介BOT】よろしければLINE上で試してみてください!
以下のように、文脈を保持して回答を変える動きを実装しました。
私の職歴をチャットボットに聴くと、チャットボットは職歴を一通り答えたあとで
「あなたは採用担当者ですか?」と逆質問されます。
これに対し「はい」で答える場合と「いいえ」の場合で、チャットボットの応答を変えます。
###【目標2】でやったこと
第一回目で作成した、会話スクリプトにcotext設定追加します。
第一回目はコチラ【ぴよぴよPython】LINEボット作った話①
インライン①〜⑧までの流れをスクリプト内に載せました。
ざっくりしてますが以下のような設定をしてます
(1)"career"がlatest_entity_keyに保存される (context保存)
(2)ユーザに「はい」か「いいえ」を選ばせる応答文にする
(3)latest_entity_keyがあれば入れるif文
(4)更にlatest_entity_keyがcareerだった場合に入れるif文
(5)「はい」の場合に返す
(6)「いいえ」の場合に返す
(7)contextにcareerを持っているのに、「はい」「いいえ」が入力された場合に返す
import random
import re
def search_entity(text):
bot_entities ={
"carreer":
["^(?=.*職歴).*$"],
"edu":
["^(?=.*学歴).*$"],
"hobby":
["^(?=.*趣味).*$"],
"goodat":
["^(?=.*特技).*$"],
"dream":
["^(?=.*夢).*$"],
"greeting":
["こんにちは","こんばんは","こんにちわ","おはよう"],
"yes":
["^(?=.*はい).*$","そうです"],
"no":
["^(?=.*いいえ).*$","違います"],
"おみくじ":
["^(?=.*おみくじ).*$"],
}
for k,vs in bot_entities.items():
for v in vs:
#print(v)
if re.findall(v,text):
return k
return None
def hippocampus(line_input,context):
entity_key = search_entity(line_input)
if "latest_entity_key" in context: #③latest_entity_keyがあれば、このフローに入ります
if context["latest_entity_key"]== "career": #④更にlatest_entity_keyがcareerだった場合、こちらのフローに入ります
if entity_key =="yes": #⑤「はい」の場合
context.pop("latest_entity_key")
return ("そうでしたか!【MIYAGI自己紹介BOT】を試して頂き、ありがとうございます!\n\nもしも・・・もしもですよ?私に興味がありましたら、こちらよりご連絡お願いいただけますか。宜しくお願いします!https://qiita.com/UNI-code")
elif entity_key =="no": #⑥「いいえ」の場合
context.pop("latest_entity_key")
return ("あ、違いましたか。失礼しました。😅他にも私に関して質問あれば、聞いてね!")
else: #⑦contextにcareerを持っているのに、「はい」「いいえ」が入力された場合
return("採用担当の方でしょうか。「はい」or「いいえ」で答えてください😃")
elif entity_key == "career":
context["latest_entity_key"]=entity_key #①まずcareerのcontextがlatest_entity_keyに保存されます。
return ("大学卒業後は、(略)\n\n\n・・・ちなみにですが、貴方は採用担当の方ですか?\n●はい\n●いいえ") #②ユーザに「はい」か「いいえ」を選ばせます
elif entity_key == "edu":
return("大学は(略)")
elif entity_key == "hobby":
return("趣味は、歌や音楽鑑賞です。🥁🎧あとは物づくりが好きです。💻🖌")
elif entity_key == "greeting":
return("こんにちは!😉\n\n私は【MIYAGI自己紹介BOT】です。\n本人に代わって、以下の質問にお答えします。\n\n・職歴について教えて\n・学歴について教えて\n・趣味は?\n・特技は?\n・今後の夢は?\n\nなどなど質問をお待ちしております。💁🏼✨")
elif entity_key == "goodat":
return ("得意な分野は、語学学習です。TOEIC870点、中国語検定HSKの4級持っています。")
elif entity_key == "dream":
return("目標は、「知性」を感じさせる対話エンジンを構築することです。Qiitaにも色々書いてるので覗いてみてください! → https://qiita.com/UNI-code")
elif entity_key == "おみくじ":
omikuji = ["今日の君は【大吉】:おめでとうございます!大吉の貴方は臨時収入があるでしょう。💰🤩💰","今日の君は【中吉】:まぁ、普通に良いでしょう!。普通が一番だったりするんですよねー。・・・でも普通って何?","今日の君は【凶】:あら・・・最底辺を経験することって大事よね。だって、あとは上にあがるだけじゃない。\n頑張りましょ!🙋🏻♀️"]
return random.choice(omikuji)
else:
anything_else = ["・・・・・(やばい。その質問への回答は用意してなかった。。)\n今は「職歴」とか「学歴」「趣味」「目標」とかしか答えられません〜。。。あ、『おみくじ』なら出来ますよ😅。『おみくじ』って入力してください!","・・・・ごめんなさい,,,その質問には答えられないんですよ。\n\n急ぎの方はこちらから連絡ください! https://qiita.com/UNI-code"]
return random.choice(anything_else)
if __name__ == '__main__':
import boto3
from boto3.session import Session
from boto3.dynamodb.conditions import Key
accesskey = "" #ふせてます
secretkey = "" #ふせてます
region = "ap-northeast-1"
session = Session(aws_access_key_id=accesskey, aws_secret_access_key=secretkey, region_name=region)
dynamodb = session.resource('dynamodb')
table = dynamodb.Table("introduce_bot")
while True:
user_id = "" #ふせてます
queryData = table.query(
KeyConditionExpression = Key("user_id").eq(user_id) # 取得するKey情報
)
user_message = input()
print(user_message)
if len(queryData["Items"]) == 0:
context = {"user_id": user_id}
a = hippocampus(user_message,context)
else:
context = queryData["Items"][0]
a = hippocampus(user_message,context)
print("OUTPUT", a, context)
response = table.put_item(Item=context)
print (response)
#print(queryData)
#console_input = input()
#output_text = hippocampus(console_input)
#print(output_text)
###まとめ
今回はcontextを使って文脈を保存できるチャットボットを作りました。
これが出来るだけで、チャットボットの会話がグンと深まります!!!(嬉)