【ぴよぴよPython】LINEボット作った話②

###はじめに
前回の[【ぴよぴよPython】LINEボット作った話①](https://qiita.com/UNI-code/items/75cf9027afd44812ff31)の続きです。

今回は、『【目標2】contextを保持し、分岐つくる』を行います。

###環境
・Python 3.7.3
・mac バージョン10.13.2

###【目標2】の完成挙動
:hatching_chick:【MIYAGI自己紹介BOT】よろしければLINE上で試してみてください！
<img width="465" alt="スクリーンショット 2019-05-06 17.13.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399739/3ece4fda-803d-5de6-2d80-f448a97f4ae8.png">
---
以下のように、文脈を保持して回答を変える動きを実装しました。

私の職歴をチャットボットに聴くと、チャットボットは職歴を一通り答えたあとで
「あなたは採用担当者ですか？」と逆質問されます。
これに対し「はい」で答える場合と「いいえ」の場合で、チャットボットの応答を変えます。　

<img width="419" alt="スクリーンショット 2019-05-07 19.00.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399739/8b3d6eab-3482-aa36-7c6b-9932a64f060b.png">

<img width="422" alt="スクリーンショット 2019-05-07 19.00.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399739/a79cd9b6-feca-561b-8265-742b78c1b5e6.png">

###【目標2】でやったこと　

第一回目で作成した、会話スクリプトにcotext設定追加します。
第一回目はコチラ:point_right_tone2:[【ぴよぴよPython】LINEボット作った話①](https://qiita.com/UNI-code/items/75cf9027afd44812ff31)

インライン①〜⑧までの流れをスクリプト内に載せました。

ざっくりしてますが以下のような設定をしてます

(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を使って文脈を保存できるチャットボットを作りました。
これが出来るだけで、チャットボットの会話がグンと深まります！！！(嬉):v_tone3: