Exemple #1
0
def wikihow_question_request(ngrams, vars):
    flag = False
    shared_memory = state_utils.get_shared_memory(vars)
    curr_pages = shared_memory.get("curr_pages", [])
    if not curr_pages:
        found_entity_substr, _, found_entity_types = find_entity(
            vars, "current")
        if found_entity_substr and found_entity_substr in wikihowq_by_substr:
            flag = True
    logger.info(f"wikihow_question_request={flag}")
    return flag
Exemple #2
0
def wikihow_question_response(vars):
    response = ""
    shared_memory = state_utils.get_shared_memory(vars)
    curr_pages = shared_memory.get("curr_pages", [])
    if not curr_pages:
        found_entity_substr, _, found_entity_types = find_entity(
            vars, "current")
        if found_entity_substr and found_entity_substr in wikihowq_by_substr:
            wikihow_questions = wikihowq_by_substr[found_entity_substr]
            wikihow_articles = list(wikihow_questions.keys())
            chosen_article = random.choice(wikihow_articles)
            article_content = get_wikihow_content(chosen_article)
            if article_content:
                all_page_titles = article_content.keys()
                found_title = ""
                for title in all_page_titles:
                    if title != "intro":
                        found_title = title
                        break
                if found_title:
                    state_utils.save_to_shared_memory(
                        vars, prev_wikihow_title=found_title)
                    used_wikihow_titles = [found_title]
                    state_utils.save_to_shared_memory(
                        vars, used_wikihow_titles=used_wikihow_titles)
            response = wikihow_questions[chosen_article]
            if not response:
                response = f"Would you like to know how to {chosen_article.replace('-', ' ').lower()}?"
            logger.info(
                f"wikihow_question_response, chosen_article {chosen_article} response {response}"
            )
            state_utils.save_to_shared_memory(vars,
                                              wikihow_article=chosen_article)
    if response:
        state_utils.save_to_shared_memory(vars, start=True)
        state_utils.set_confidence(vars, confidence=CONF_DICT["WIKI_TOPIC"])
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_CONTINUE_PROMPT)
    else:
        state_utils.set_confidence(vars, confidence=CONF_DICT["UNDEFINED"])
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_NOT_CONTINUE)
    return response
Exemple #3
0
def intro_question_response(vars):
    response = ""
    shared_memory = state_utils.get_shared_memory(vars)
    curr_pages = shared_memory.get("curr_pages", [])
    if not curr_pages:
        found_entity_substr, _, found_entity_types = find_entity(
            vars, "current")
        if found_entity_substr and found_entity_substr in questions_by_entity_substr:
            response = questions_by_entity_substr[found_entity_substr]
    if response:
        state_utils.save_to_shared_memory(vars, start=True)
        state_utils.set_confidence(vars, confidence=CONF_DICT["WIKI_TOPIC"])
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_CONTINUE_PROMPT)
    else:
        state_utils.set_confidence(vars, confidence=CONF_DICT["UNDEFINED"])
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_NOT_CONTINUE)
    return response
Exemple #4
0
def tell_fact_request(ngrams, vars):
    flag = False
    user_uttr = state_utils.get_last_human_utterance(vars)
    isno = is_no(state_utils.get_last_human_utterance(vars))
    shared_memory = state_utils.get_shared_memory(vars)
    wikipedia_page = shared_memory.get("cur_wikipedia_page", "")
    wikihow_page = shared_memory.get("cur_wikihow_page", "")
    if "wikihow_content" in facts_memory and facts_memory["wikihow_content"]:
        used_wikihow_nums = shared_memory.get("used_wikihow_nums",
                                              {}).get(wikihow_page, [])
        if len(facts_memory["wikihow_content"]) > len(used_wikihow_nums):
            flag = True
    elif "wikipedia_content" in facts_memory and facts_memory[
            "wikipedia_content"]:
        used_wikipedia_nums = shared_memory.get("used_wikipedia_nums",
                                                {}).get(wikipedia_page, [])
        if len(facts_memory["wikipedia_content"]) > len(used_wikipedia_nums):
            flag = True
    else:
        found_entity_substr, _, found_entity_types = find_entity(
            vars, "current")
        logger.info(
            f"request, found_entity_substr {found_entity_substr} found_entity_types {found_entity_types}"
        )
        curr_page = get_page_title(vars, found_entity_substr)
        wikihow_articles = []
        if found_entity_substr in wikihowq_by_substr:
            wikihow_questions = wikihowq_by_substr[found_entity_substr]
            wikihow_articles = list(wikihow_questions.keys())
        if curr_page or wikihow_articles:
            flag = True

    not_want = re.findall(COMPILE_NOT_WANT_TO_TALK_ABOUT_IT, user_uttr["text"])
    if isno or not_want:
        flag = False

    logger.info(f"tell_fact_request={flag}")
    return flag
Exemple #5
0
def tell_fact_response(vars):
    shared_memory = state_utils.get_shared_memory(vars)
    user_uttr = state_utils.get_last_human_utterance(vars)
    bot_uttr = state_utils.get_last_bot_utterance(vars)
    isyes = is_yes(state_utils.get_last_human_utterance(vars))
    wikipedia_page = shared_memory.get("cur_wikipedia_page", "")
    wikihow_page = shared_memory.get("cur_wikihow_page", "")
    used_wikihow_nums_dict = shared_memory.get("used_wikihow_nums", {})
    used_wikihow_nums = used_wikihow_nums_dict.get(wikihow_page, [])
    used_wikipedia_nums_dict = shared_memory.get("used_wikipedia_nums", {})
    used_wikipedia_nums = used_wikipedia_nums_dict.get(wikipedia_page, [])
    wikipedia_page_content_list = facts_memory.get("wikipedia_content", [])
    if not wikipedia_page:
        facts_memory["wikipedia_content"] = []
    logger.info(f"wikihow_page {wikihow_page} wikipedia_page {wikipedia_page}")
    if not facts_memory.get("wikihow_content", []) and not facts_memory.get(
            "wikipedia_content", []):
        found_entity_substr, _, found_entity_types = find_entity(
            vars, "current")
        state_utils.save_to_shared_memory(
            vars, found_entity_substr=found_entity_substr)
        state_utils.save_to_shared_memory(
            vars, found_entity_types=list(found_entity_types))
        logger.info(
            f"tell_fact_response, found_entity_substr {found_entity_substr} "
            f"found_entity_types {found_entity_types}")
        wikipedia_page = get_page_title(vars, found_entity_substr)
        if wikipedia_page:
            page_content, _ = get_page_content(wikipedia_page, wikipedia_cache)
            wikipedia_page_content_list = preprocess_wikipedia_page(
                found_entity_substr, found_entity_types, page_content)
            facts_memory["wikipedia_content"] = wikipedia_page_content_list
            state_utils.save_to_shared_memory(
                vars, cur_wikipedia_page=wikipedia_page)

        wikihow_articles = []
        if found_entity_substr in wikihowq_by_substr:
            wikihow_questions = wikihowq_by_substr[found_entity_substr]
            wikihow_articles = list(wikihow_questions.keys())
        if wikihow_articles:
            wikihow_page = random.choice(wikihow_articles)
            page_content = get_wikihow_content(wikihow_page)
            wikihow_page_content_list = preprocess_wikihow_page(page_content)
            facts_memory["wikihow_content"] = wikihow_page_content_list
            state_utils.save_to_shared_memory(vars,
                                              cur_wikihow_page=wikihow_page)

    found_fact = {}
    if facts_memory.get("wikihow_content", []):
        wikihow_page_content_list = facts_memory.get("wikihow_content", [])
        logger.info(f"wikihow_content {wikihow_page_content_list[:2]}")
        for num, fact in enumerate(wikihow_page_content_list):
            if num not in used_wikihow_nums:
                found_fact = fact
                used_wikihow_nums.append(num)
                used_wikihow_nums_dict[wikihow_page] = used_wikihow_nums
                state_utils.save_to_shared_memory(
                    vars, used_wikihow_nums=used_wikihow_nums_dict)
                break
        if len(wikihow_page_content_list) == len(used_wikihow_nums):
            state_utils.save_to_shared_memory(vars, cur_wikihow_page="")
            facts_memory["wikihow_content"] = []
    if not found_fact and facts_memory.get("wikipedia_content", []):
        wikipedia_page_content_list = facts_memory.get("wikipedia_content", [])
        logger.info(f"wikipedia_content {wikipedia_page_content_list[:2]}")
        for num, fact in enumerate(wikipedia_page_content_list):
            if num not in used_wikipedia_nums:
                found_fact = fact
                used_wikipedia_nums.append(num)
                used_wikipedia_nums_dict[wikipedia_page] = used_wikipedia_nums
                state_utils.save_to_shared_memory(
                    vars, used_wikipedia_nums=used_wikipedia_nums_dict)
                break
        if len(wikipedia_page_content_list) == len(used_wikipedia_nums):
            state_utils.save_to_shared_memory(vars, cur_wikipedia_page="")
            facts_memory["wikipedia_content"] = []

    response = ""
    if found_fact:
        facts_str = found_fact.get("facts_str", "")
        question = found_fact.get("question", "")
        response = f"{facts_str} {question}".strip().replace("  ", " ")
    if response:
        _, conf_type = if_switch_wiki_skill(user_uttr, bot_uttr)
        must_switch = if_must_switch(user_uttr, bot_uttr)
        state_utils.set_confidence(vars, confidence=conf_type)
        if isyes or must_switch:
            state_utils.set_can_continue(
                vars, continue_flag=common_constants.MUST_CONTINUE)
            state_utils.set_confidence(vars, confidence=CONF_DICT["HIGH_CONF"])
        else:
            state_utils.set_can_continue(
                vars, continue_flag=common_constants.CAN_CONTINUE_SCENARIO)
            state_utils.set_confidence(vars, confidence=CONF_DICT[conf_type])
        state_utils.save_to_shared_memory(vars, start=True)
    else:
        state_utils.set_confidence(vars, confidence=CONF_DICT["UNDEFINED"])
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_NOT_CONTINUE)
    return response
Exemple #6
0
def news_step_response(vars):
    shared_memory = state_utils.get_shared_memory(vars)
    started_news = shared_memory.get("started_news", "")
    found_entity_substr, _, found_entity_types = find_entity(vars, "current")
    curr_page = get_page_title(vars, found_entity_substr)
    if not started_news and found_entity_substr and curr_page:
        state_utils.save_to_shared_memory(
            vars, found_entity_substr=[found_entity_substr])
        state_utils.save_to_shared_memory(vars, curr_pages=[curr_page])
        state_utils.save_to_shared_memory(
            vars, found_entity_types=[list(found_entity_types)])
    user_uttr = state_utils.get_last_human_utterance(vars)
    annotations = user_uttr["annotations"]
    nounphrases = annotations.get("cobot_entities",
                                  {}).get("labelled_entities", [])
    nounphrases = [nounphr["text"] for nounphr in nounphrases]
    logger.info(f"news_step_response {nounphrases}")
    response = ""
    news_entity = ""
    if not started_news:
        for nounphr in nounphrases:
            result_news = []
            try:
                result_news = get_news_about_topic(
                    nounphr,
                    "http://news-api-annotator:8112/respond",
                    return_list_of_news=True,
                    timeout_value=1.3)
            except Exception as e:
                sentry_sdk.capture_exception(e)
                logger.exception(e)
            if not result_news:
                result_news = annotations.get("news_api_annotator", [])
            if result_news:
                processed_news = preprocess_news(result_news)
                logger.info(f"processed_news {processed_news[:2]}")
                news_entity = nounphr
                state_utils.save_to_shared_memory(vars,
                                                  news_entity=news_entity)
                state_utils.save_to_shared_memory(vars,
                                                  news_memory=processed_news)
                break
    new_title = ""
    found_content = ""
    news_memory = shared_memory.get("news_memory", [])
    if not started_news:
        if news_entity and news_memory:
            new_title = news_memory[0]["title"]
            state_utils.save_to_shared_memory(vars, news_title=new_title)
    else:
        cur_news_title = shared_memory.get("news_title")
        title_num = -1
        found_sentence_num = -1
        for n, elem in enumerate(news_memory):
            if elem["title"] == cur_news_title:
                for sentence_num, (sentence,
                                   used_sent) in enumerate(elem["content"]):
                    if not used_sent:
                        found_content = sentence
                        found_sentence_num = sentence_num
                        news_memory[n]["content"][sentence_num][1] = True
                        break
                title_num = n
        if found_sentence_num == len(news_memory[title_num][
                "content"]) - 1 and -1 < title_num < len(news_memory) - 1:
            new_title = news_memory[title_num + 1]["title"]
            state_utils.save_to_shared_memory(vars, news_title=new_title)
        if not found_content and -1 < title_num < len(news_memory) - 1:
            title = news_memory[title_num + 1]["title"]
            found_content = news_memory[title_num + 1]["content"][0][0]
            news_memory[title_num + 1]["content"][0][1] = True
            state_utils.save_to_shared_memory(vars, news_title=title)
    state_utils.save_to_shared_memory(vars, news_memory=news_memory)
    logger.info(
        f"news_step_response found_content {found_content} new_title {new_title} news_entity {news_entity}"
    )

    if not started_news and news_entity and new_title:
        response = f"Talking about {news_entity}. I've recently heard that {new_title}. Do you want to hear more?"
    elif found_content:
        if new_title:
            response = f"{found_content} I also heard that {new_title}. Would you like to hear more?"
        else:
            continue_phrase = random.choice(NEWS_MORE)
            response = f"In details: {found_content} {continue_phrase}"

    if response:
        if started_news:
            state_utils.set_confidence(vars,
                                       confidence=CONF_DICT["WIKI_TOPIC"])
            state_utils.set_can_continue(
                vars, continue_flag=common_constants.CAN_CONTINUE_SCENARIO)
        else:
            state_utils.set_confidence(vars,
                                       confidence=CONF_DICT["IN_SCENARIO"])
            state_utils.set_can_continue(
                vars, continue_flag=common_constants.MUST_CONTINUE)
            state_utils.save_to_shared_memory(vars, started_news=True)
    else:
        state_utils.set_confidence(vars, confidence=CONF_DICT["UNDEFINED"])
        state_utils.set_can_continue(
            vars, continue_flag=common_constants.CAN_NOT_CONTINUE)
    return response