Source code for chatterbot.response_selection
"""
Response selection methods determines which response should be used in
the event that multiple responses are generated within a logic adapter.
"""
from chatterbot.conversation import Statement
import logging
[docs]
def get_most_frequent_response(input_statement: Statement, response_list: list[Statement], storage=None) -> Statement:
"""
:param input_statement: A statement, that closely matches an input to the chat bot.
:param response_list: A list of statement options to choose a response from.
:param storage: An instance of a storage adapter to allow the response selection
method to access other statements if needed.
:type storage: StorageAdapter
:return: The response statement with the greatest number of occurrences.
"""
logger = logging.getLogger(__name__)
logger.info('Selecting response with greatest number of occurrences.')
# Collect all unique text values from response_list
response_texts = set(statement.text for statement in response_list)
# Fetch all statements matching the input in a single query
# Then count occurrences in memory
all_matching = list(storage.filter(in_response_to=input_statement.text))
# Count how many times each response text appears in the database
occurrence_counts = {}
for statement in all_matching:
if statement.text in response_texts:
occurrence_counts[statement.text] = occurrence_counts.get(statement.text, 0) + 1
# Find the response with the highest occurrence count
matching_response = None
occurrence_count = -1
for statement in response_list:
count = occurrence_counts.get(statement.text, 0)
# Keep the more common statement
if count >= occurrence_count:
matching_response = statement
occurrence_count = count
# Choose the most commonly occurring matching response
return matching_response
[docs]
def get_first_response(input_statement: Statement, response_list: list[Statement], storage=None) -> Statement:
"""
:param input_statement: A statement, that closely matches an input to the chat bot.
:param response_list: A list of statement options to choose a response from.
:param storage: An instance of a storage adapter to allow the response selection
method to access other statements if needed.
:type storage: StorageAdapter
:return: Return the first statement in the response list.
"""
logger = logging.getLogger(__name__)
logger.info('Selecting first response from list of {} options.'.format(
len(response_list)
))
return response_list[0]
[docs]
def get_random_response(input_statement: Statement, response_list: list[Statement], storage=None) -> Statement:
"""
:param input_statement: A statement, that closely matches an input to the chat bot.
:type input_statement: Statement
:param response_list: A list of statement options to choose a response from.
:type response_list: list
:param storage: An instance of a storage adapter to allow the response selection
method to access other statements if needed.
:type storage: StorageAdapter
:return: Choose a random response from the selection.
"""
from random import choice
logger = logging.getLogger(__name__)
logger.info('Selecting a response from list of {} options.'.format(
len(response_list)
))
return choice(response_list)