def response_matrix(last_utterance, chatbot, conversation): with open("../data/da_matrix.csv") as f_matrix: mat = np.loadtxt(f_matrix, delimiter=",", skiprows=1, usecols=range(1, 27)) mat = mat / np.sum(mat, axis=0) da_names = [ da.name for da in DA if da.name not in ["statement", "question", "response_action"] ] response_col = da_names.index(last_utterance.dialogue_act.name) sentiment = np.random.normal(chatbot.personality.mood, 2) while sentiment < 1 or sentiment > 10: sentiment = np.random.normal(chatbot.personality.mood, 2) assertiveness = np.random.normal(chatbot.personality.mood, 2) while assertiveness < 1 or assertiveness > 10: assertiveness = np.random.normal(chatbot.personality.mood, 2) utterance = Utterance( chatbot.name, DA[np.random.choice(da_names, p=mat[:, response_col])], last_utterance.topic, int(sentiment), int(assertiveness)) text = nlg.generate_response_text(utterance, chatbot, conversation) utterance.set_text(text) return utterance
def new_conversation(conversation, chatbot, user, personas=None, last_utterance=None): # New conversation started # prev = greeting, then greeting, query, etc. if last_utterance.dialogue_act == DA.greeting: #TODO overcome limitation of not making text here. (use meta text) # Ideal, would be able to be assertive and make # greeting + question_ or statement_ # call nlg module here, from IA. assertiveness = response_assertiveness(chatbot) if respond_passively(assertiveness): # if passive response, then only greeting. utterance = Utterance(chatbot.name, DA.greeting, "self_user", chatbot.personality.mood, chatbot.personality.assertiveness) text = nlg.generate_response_text(utterance, chatbot, conversation) utterance.set_text(text) return utterance else: # respond with greeting AND something else. # else: query user general greeting_text = generic_response.greeting(chatbot, conversation, chatbot.personality.mood) greeting_text = greeting_text[0].upper() + greeting_text[1:] greeting_text = (greeting_text + "." if chatbot.personality.mood < 8 and chatbot.personality.assertiveness < 8 else greeting_text + "!") utterance = tactic.query_user_general(conversation, chatbot, user, personas) text = greeting_text + " " + utterance.text utterance.set_text(text) return utterance elif (not topic_is_self(last_utterance.topic) and not topic_is_user(last_utterance.topic) and is_question(last_utterance.dialogue_act)): return Utterance(chatbot.name, question_to_statement(last_utterance.dialogue_act), last_utterance.topic, chatbot.personality.mood, chatbot.personality.assertiveness) elif (not topic_is_self(last_utterance.topic) and not topic_is_user(last_utterance.topic) and is_statement(last_utterance.dialogue_act)): return Utterance(chatbot.name, statement_to_question(last_utterance.dialogue_act), last_utterance.topic, chatbot.personality.mood, chatbot.personality.assertiveness) else: return tactic.psychiatrist(last_utterance, chatbot.name)
def static_matrix(conversation, chatbot, user, personas=None): """ A manually constructed decision tree to implement a rule based system as a baseline. :param conversation: current Conversation :param chatbot: Persona of chatbot :param user: Persona of user :param personas: Dictionary of str "persona_id" to Persona """ last_utterance = conversation.last_utterance # Assess mood and magnitude of change to mood necessary mood_magnitude = chatbot.personality.mood - user.personality.mood # Assess topic sentiment in relation to desired mood topic_magnitude = user.topic_magnitude(last_utterance.topic, chatbot.personality.mood) # static reactions: if last_utterance.dialogue_act == DA.farewell: utterance = Utterance(chatbot.name, DA.farewell, "self_user", chatbot.personality.mood, chatbot.personality.assertiveness) text = nlg.generate_response_text(utterance, chatbot, conversation) utterance.set_text(text) return utterance #if len(conversation.topic_to_utterances.keys()) <= 0: if conversation.new_convo: conversation.new_convo = False # New conversation started if last_utterance.dialogue_act == DA.greeting: utterance = Utterance(chatbot.name, DA.greeting, "self_user", chatbot.personality.mood, chatbot.personality.assertiveness) text = nlg.generate_response_text(utterance, chatbot, conversation) utterance.set_text(text) return utterance elif (not topic_is_self(last_utterance.topic) and not topic_is_user(last_utterance.topic) and is_question(last_utterance.dialogue_act)): utterance = Utterance( chatbot.name, question_to_statement(last_utterance.dialogue_act), last_utterance.topic, chatbot.personality.mood, chatbot.personality.assertiveness) text = nlg.generate_response_text(utterance, chatbot, conversation) utterance.set_text(text) return utterance elif (not topic_is_self(last_utterance.topic) and not topic_is_user(last_utterance.topic) and is_statement(last_utterance.dialogue_act)): utterance = Utterance( chatbot.name, statement_to_question(last_utterance.dialogue_act), last_utterance.topic, chatbot.personality.mood, chatbot.personality.assertiveness) text = nlg.generate_response_text(utterance, chatbot, conversation) utterance.set_text(text) return utterance else: return tactic.psychiatrist(last_utterance, chatbot.name) else: # Ongoing Conversation # topics have been discussed, and conversation ongoing if topic_is_self(last_utterance.topic) \ or topic_is_user(last_utterance.topic): return tactic.psychiatrist(last_utterance, chatbot.name) else: return response_matrix(last_utterance, chatbot, conversation)