LoginSignup
3
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-07

はじめに

前回の【ぴよぴよPython】LINEボット作った話①の続きです。

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

環境

・Python 3.7.3
・mac バージョン10.13.2

【目標2】の完成挙動

:hatching_chick:【MIYAGI自己紹介BOT】よろしければLINE上で試してみてください!

スクリーンショット 2019-05-06 17.13.53.png

以下のように、文脈を保持して回答を変える動きを実装しました。

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

スクリーンショット 2019-05-07 19.00.14.png

スクリーンショット 2019-05-07 19.00.30.png

【目標2】でやったこと 

第一回目で作成した、会話スクリプトにcotext設定追加します。
第一回目はコチラ:point_right_tone2:【ぴよぴよ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を使って文脈を保存できるチャットボットを作りました。
これが出来るだけで、チャットボットの会話がグンと深まります!!!(嬉):v_tone3:

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3