From bd68b3cc0c05ed79deaa7fddf7227905fb34c602 Mon Sep 17 00:00:00 2001 From: Himanshu Shankar Date: Sat, 23 Mar 2019 21:56:48 +0530 Subject: [PATCH 1/3] Implemented search_in_response_to Implemented the concept of `search_in_response_to` in `learn_reposne`. If `previous_statement` is an instance of `chatterbot.conversation.Statement`, learning will save `previous_statement.search_text` as `statement.search_in_response_to`. --- chatterbot/chatterbot.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/chatterbot/chatterbot.py b/chatterbot/chatterbot.py index 19b33635c..a498855eb 100644 --- a/chatterbot/chatterbot.py +++ b/chatterbot/chatterbot.py @@ -234,25 +234,24 @@ def learn_response(self, statement, previous_statement=None): """ Learn that the statement provided is a valid response. """ + from chatterbot.conversation import Statement + if not previous_statement: previous_statement = statement.in_response_to if not previous_statement: previous_statement = self.get_latest_response(statement.conversation) - if previous_statement: - previous_statement = previous_statement.text previous_statement_text = previous_statement - if not isinstance(previous_statement, (str, type(None), )): + if not isinstance(previous_statement, (Statement, str, type(None), )): statement.in_response_to = previous_statement.text elif isinstance(previous_statement, str): statement.in_response_to = previous_statement - - self.logger.info('Adding "{}" as a response to "{}"'.format( - statement.text, - previous_statement_text - )) + elif isinstance(previous_statement, Statement): + statement.in_response_to = previous_statement.text + statement.search_in_response_to = previous_statement.search_text + previous_statement_text = previous_statement.text # Save the input statement return self.storage.create(**statement.serialize()) From f873f8a78662e5f2f8547a022e36e1d49ae53614 Mon Sep 17 00:00:00 2001 From: Himanshu Shankar Date: Sun, 24 Mar 2019 00:56:18 +0530 Subject: [PATCH 2/3] Added logger statement Logger statement was removed in the earlier commit by mistake --- chatterbot/chatterbot.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/chatterbot/chatterbot.py b/chatterbot/chatterbot.py index a498855eb..5d54676ee 100644 --- a/chatterbot/chatterbot.py +++ b/chatterbot/chatterbot.py @@ -253,6 +253,11 @@ def learn_response(self, statement, previous_statement=None): statement.search_in_response_to = previous_statement.search_text previous_statement_text = previous_statement.text + self.logger.info('Adding "{}" as a response to "{}"'.format( + statement.text, + previous_statement_text + )) + # Save the input statement return self.storage.create(**statement.serialize()) From d355ce12e9926c25f245552175f6eef0f5c82836 Mon Sep 17 00:00:00 2001 From: Himanshu Shankar Date: Sat, 3 Aug 2019 23:43:51 +0530 Subject: [PATCH 3/3] Modified learn_feedback_example * Fixed doc string * Restructured example to provide more beautiful example --- examples/learning_feedback_example.py | 44 ++++++++++++++++----------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/examples/learning_feedback_example.py b/examples/learning_feedback_example.py index b42c31158..9a031c1c4 100644 --- a/examples/learning_feedback_example.py +++ b/examples/learning_feedback_example.py @@ -1,12 +1,13 @@ -from chatterbot import ChatBot -from chatterbot.conversation import Statement - """ This example shows how to create a chat bot that will learn responses based on an additional feedback element from the user. """ +from chatterbot import ChatBot +from chatterbot.conversation import Statement + + # Uncomment the following line to enable verbose logging # import logging # logging.basicConfig(level=logging.INFO) @@ -18,9 +19,22 @@ ) -def get_feedback(): +def get_feedback(response_text: str, input_statement_text: str): + """Get feedback - text = input() + Confirm whether response generated by bot is acceptable + :param response_text : response text generated by bot + :type response_text : str + :param input_statement_text: input statement text + :type input_statement_text: str + :return: True or False + :rtype: bool + """ + + text = input('\n Is "{}" a coherent response to "{}"? \n'.format( + response_text, + input_statement_text + )) if 'yes' in text.lower(): return True @@ -28,7 +42,7 @@ def get_feedback(): return False else: print('Please type either "Yes" or "No"') - return get_feedback() + return get_feedback(response_text=response_text, input_statement_text=input_statement_text) print('Type something to begin...') @@ -36,20 +50,16 @@ def get_feedback(): # The following loop will execute each time the user enters input while True: try: - input_statement = Statement(text=input()) - response = bot.generate_response( + input_statement = Statement(text=input("User: ")) + response = bot.get_response( input_statement ) - print('\n Is "{}" a coherent response to "{}"? \n'.format( - response.text, - input_statement.text - )) - if get_feedback(): - print('please input the correct one') - correct_response = Statement(text=input()) - bot.learn_response(correct_response, input_statement) - print('Responses added to bot!') + if not get_feedback(response_text=response.text, input_statement_text=input_statement.text): + response = Statement(text=input("Please input the correct response: ")) + + bot.learn_response(response, input_statement) + print("Bot: {} # Added to bot".format(response.text)) # Press ctrl-c or ctrl-d on the keyboard to exit except (KeyboardInterrupt, EOFError, SystemExit):