コード例 #1
0
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
コード例 #2
0
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)
コード例 #3
0
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)