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
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
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
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
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
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