def plan_ticket_handle(customer_utterance, state_tracker_obj, entities, lac, intent_model, senta_gru, confirm_interpreter, db_obj, collection_name):

    def ie_ticket_info_state_flow(customer_utterance, state_tracker_obj, entities, lac, db_obj, collection_name):
        give_up_state = give_up_nlu.whether_give_up(customer_utterance, senta_gru, confirm_interpreter)
        if give_up_state:
            state_tracker_obj.update_last_slot_state("stop")
            return give_up_nlg.response_give_up(), "stop"
        else:
            if state_tracker_obj.get_last_slot_state() != "change":
                if state_tracker_obj.get_last_slot_state() == "ask_dept":
                    ie_slot_result = ticket_nlu.ie_all_plan_ticket(customer_utterance, lac, entities, "ask_dept")
                elif state_tracker_obj.get_last_slot_state() == "ask_dest":
                    ie_slot_result = ticket_nlu.ie_all_plan_ticket(customer_utterance, lac, entities, "ask_dest")
                else:
                    ie_slot_result = ticket_nlu.ie_all_plan_ticket(customer_utterance, lac, entities)
            else:
                ie_slot_result = entities
            print("update all", ie_slot_result)
            state_tracker_obj.update_all_state(ie_slot_result)
            slot_state_dict = state_tracker_obj.judge_each_slot_state(plan_ticket_slot.keys())
            # if True not in slot_state_dict.values():
            if slot_state_dict["departure"] is False and slot_state_dict["destination"] is False and slot_state_dict["vehicle"] is False and slot_state_dict["departure_date"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return ticket_nlg.ask_depart_dest_vehicle_date(), "ask"
            elif slot_state_dict["departure"] is False:
                state_tracker_obj.update_last_slot_state("ask_dept")
                return ticket_nlg.ask_depart(), "ask_dept"
            elif slot_state_dict["destination"] is False:
                state_tracker_obj.update_last_slot_state("ask_dest")
                return ticket_nlg.ask_dest(), "ask_dest"
            elif slot_state_dict["vehicle"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return ticket_nlg.ask_vehicle(), "ask"
            elif slot_state_dict["departure_date"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return ticket_nlg.ask_departure_date(), "ask"
            else:
                # search_ticket_dict_results = db_conn.search_db(collection_name, state_tracker_obj.get_all_confident_slot_values())  # TODO: database
                # search_ticket_dict_results = {
                #     1: "线路1",
                #     2: "线路2",
                #     3: "线路3",
                #     4: "线路4"
                #  }    # TODO
                from make_data.ticket.make_ticket_data import search_ticket_interface
                search_ticket_dict_results = search_ticket_interface(state_tracker_obj.get_all_confident_slot_values(), 5)
                print(search_ticket_dict_results)
                state_tracker_obj.add_one_state("solutions", search_ticket_dict_results, 1)
                print("start to select solution")
            state_tracker_obj.update_last_slot_state("confirm_select")
            print("common last state", state_tracker_obj.get_last_slot_state())
            return ticket_nlg.response_solution_list(search_ticket_dict_results, state_tracker_obj.get_all_confident_slot_values()), "confirm_select"

    def ie_personal_info_state_flow(customer_utterance, state_tracker_obj, lac):
        give_up_state = give_up_nlu.whether_give_up(customer_utterance, senta_gru, confirm_interpreter)
        if give_up_state:
            state_tracker_obj.update_last_slot_state("stop")
            return give_up_nlg.response_give_up(), "stop"
        temp_ie_slot_result = ticket_nlu.ie_name_ID(customer_utterance, lac)
        state_tracker_obj.update_all_state(temp_ie_slot_result)
        slot_state_dict = state_tracker_obj.judge_each_slot_state(plan_ticket_slot.keys())
        if slot_state_dict["name"] is False and slot_state_dict["ID"] is False:
            state_tracker_obj.update_last_slot_state("perinfo_ask")
            return ticket_nlg.ask_name_ID(), "perinfo_ask"
        elif slot_state_dict["name"] is False:
            state_tracker_obj.update_last_slot_state("perinfo_ask")
            return ticket_nlg.ask_name(), "perinfo_ask"
        elif slot_state_dict["ID"] is False:
            state_tracker_obj.update_last_slot_state("perinfo_ask")
            return ticket_nlg.ask_ID(), "perinfo_ask"
        else:
            state_tracker_obj.update_last_slot_state("confirm_ticket")
            return ticket_nlg.confirm_ticket_info(state_tracker_obj.get_all_confident_slot_values()), "confirm_ticket"

    last_slot_state = state_tracker_obj.get_last_slot_state()
    print("last_slot_state:", last_slot_state)
    if last_slot_state == "select_done":
        return ie_personal_info_state_flow(customer_utterance, state_tracker_obj, lac)
    elif last_slot_state == "confirm_select":
        confirm_state, temp_entities = ticket_nlu.select_plan_ticket(customer_utterance, lac, intent_model, senta_gru, confirm_interpreter, state_tracker_obj.get_confident_slot_value("solutions"))
        print(5, confirm_state, temp_entities)
        if confirm_state == "select_done":
            state_tracker_obj.update_last_slot_state("select_done")
            state_tracker_obj.add_one_state("solution_no", temp_entities, 1)
            return ie_personal_info_state_flow(customer_utterance, state_tracker_obj, lac)  # TODO
        if confirm_state == "no":
            state_tracker_obj.update_last_slot_state("ask")
            return confirm_nlg.response_no("plan_ticket", state_tracker_obj.get_all_confident_slot_values()), "ask"
        if confirm_state == "stop":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_termination(), "stop"
        if confirm_state == "change":
            state_tracker_obj.update_last_slot_state("change")
            return ie_ticket_info_state_flow(customer_utterance, state_tracker_obj, temp_entities, lac, db_obj, collection_name)
        if confirm_state == "nothing" or confirm_state == "yes":
            state_tracker_obj.update_last_slot_state("confirm_select")
            # return confirm_nlg.response_uncertain(), "confirm"
            search_ticket_dict_results = state_tracker_obj.get_confident_slot_value("solutions")
            return ticket_nlg.response_solution_list(search_ticket_dict_results, state_tracker_obj.get_all_confident_slot_values()), "confirm_select"
    elif last_slot_state == "confirm_ticket":
        confirm_state, temp_entities = ticket_nlu.confirm_plan_ticket(customer_utterance, lac, intent_model, senta_gru, confirm_interpreter)
        print(5, confirm_state, temp_entities)
        if confirm_state == "yes":
            state_tracker_obj.update_last_slot_state("yes")
            return confirm_nlg.response_yes(), "yes"
        if confirm_state == "no":
            state_tracker_obj.update_last_slot_state("ask")
            return confirm_nlg.response_no("plan_ticket", state_tracker_obj.get_all_confident_slot_values()), "ask"
        if confirm_state == "stop":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_termination(), "stop"
        if confirm_state == "change":
            state_tracker_obj.update_last_slot_state("change")
            if len(set(list(temp_entities.keys())+["name", "ID"])) <= 2:
                return ie_personal_info_state_flow(customer_utterance, state_tracker_obj, lac)
            else:
                return ie_ticket_info_state_flow(customer_utterance, state_tracker_obj, temp_entities, lac, db_obj, collection_name)
        if confirm_state == "nothing":
            state_tracker_obj.update_last_slot_state("confirm_ticket")
            return confirm_nlg.response_uncertain("plan_ticket"), "confirm_ticket"
    # elif last_slot_state:
    #     if last_slot_state[:7] == "perinfo":
    #         return common_personal_info_flow(customer_utterance, state_tracker_obj, lac)  # TODO
    else:
        if last_slot_state:
            if last_slot_state[:7] == "perinfo":
                return ie_personal_info_state_flow(customer_utterance, state_tracker_obj, lac)  # TODO
        print("else......")
        return ie_ticket_info_state_flow(customer_utterance, state_tracker_obj, entities, lac, db_obj, collection_name)
def consult_weather_handle(customer_utterance, state_tracker_obj, entities,
                           lac, intent_model, senta_gru, confirm_interpreter,
                           db_obj, city_ls):
    def ie_weather_state_flow(customer_utterance, state_tracker_obj, entities,
                              city_ls):
        give_up_state = give_up_nlu.whether_give_up(customer_utterance,
                                                    senta_gru,
                                                    confirm_interpreter)
        if give_up_state:
            state_tracker_obj.update_last_slot_state("stop")
            return give_up_nlg.response_give_up(), "stop"
        else:
            if state_tracker_obj.get_last_slot_state() is not "change":
                ie_slot_result = weather_nlu.ie_city_date(
                    customer_utterance, city_ls)
            else:
                ie_slot_result = entities
            state_tracker_obj.update_all_state(ie_slot_result)

            slot_state_dict = state_tracker_obj.judge_each_slot_state(
                consult_weather_slot.keys())
            if slot_state_dict["city"] is False and slot_state_dict[
                    "date"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return weather_nlg.ask_city_date(), "ask"
            elif slot_state_dict["city"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return weather_nlg.ask_city(), "ask"
            elif slot_state_dict["date"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return weather_nlg.ask_date(), "ask"
            else:
                print(state_tracker_obj.get_all_confident_slot_values())
                state_tracker_obj.update_last_slot_state("confirm")
                weather_result = request_weather_interface(
                    state_tracker_obj.get_confident_slot_value("city"),
                    state_tracker_obj.get_confident_slot_value("date"))
                return weather_nlg.response_weather_result(
                    weather_result,
                    state_tracker_obj.get_all_confident_slot_values()
                ), "confirm"

    last_slot_state = state_tracker_obj.get_last_slot_state()
    print(last_slot_state)
    if last_slot_state != "confirm":
        return ie_weather_state_flow(customer_utterance, state_tracker_obj,
                                     entities, city_ls)
    else:
        confirm_state, temp_entities = weather_nlu.confirm_consult_weather(
            customer_utterance, confirm_interpreter, senta_gru, city_ls)
        print(5, confirm_state, temp_entities)
        if confirm_state == "yes":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_yes(), "stop"
        if confirm_state == "no":
            state_tracker_obj.update_last_slot_state("ask")
            return confirm_nlg.response_no(
                "consult_weather",
                state_tracker_obj.get_all_confident_slot_values()), "ask"
        if confirm_state == "stop":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_termination(), "stop"
        if confirm_state == "change":
            state_tracker_obj.update_last_slot_state("change")
            return ie_weather_state_flow(customer_utterance, state_tracker_obj,
                                         temp_entities, city_ls)
        if confirm_state == "nothing":
            state_tracker_obj.update_last_slot_state("confirm")
            return confirm_nlg.response_uncertain("consult_weather"), "confirm"
def consult_food_handle(customer_utterance, state_tracker_obj, entities, lac,
                        intent_model, senta_gru, confirm_interpreter, db_obj,
                        collection_name):
    def ie_food_state_flow(customer_utterance, state_tracker_obj, entities,
                           lac, db_obj, collection_name):
        give_up_state = give_up_nlu.whether_give_up(customer_utterance,
                                                    senta_gru,
                                                    confirm_interpreter)
        if give_up_state:
            state_tracker_obj.update_last_slot_state("stop")
            return give_up_nlg.response_give_up(), "stop"
        else:
            if state_tracker_obj.get_last_slot_state() is not "change":
                ie_slot_result = food_nlu.ie_all_consult_food(
                    customer_utterance, lac, entities)
            else:
                ie_slot_result = entities
            state_tracker_obj.update_all_state(ie_slot_result)

            slot_state_dict = state_tracker_obj.judge_each_slot_state(
                consult_food_slot.keys())
            if slot_state_dict["food"] is False and slot_state_dict[
                    "restaurant"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return food_nlg.ask_food_restaurant(), "ask"
            else:
                search_restaurants_results = search_consult_food(
                    state_tracker_obj.get_all_confident_slot_values(),
                    db_obj.get_db_conn()[collection_name])
                # print(state_tracker_obj.get_all_confident_slot_values())
                # search_restaurants_results = ''
                print(search_restaurants_results)
                state_tracker_obj.update_last_slot_state("confirm")
                return food_nlg.response_restaurant_list(
                    search_restaurants_results,
                    state_tracker_obj.get_all_confident_slot_values()
                ), "confirm"

    last_slot_state = state_tracker_obj.get_last_slot_state()
    print(last_slot_state)
    if last_slot_state != "confirm":
        return ie_food_state_flow(customer_utterance, state_tracker_obj,
                                  entities, lac, db_obj, collection_name)
    else:
        confirm_state, temp_entities = food_nlu.confirm_consult_food(
            customer_utterance, lac, intent_model, senta_gru,
            confirm_interpreter)
        print(5, confirm_state, temp_entities)
        if confirm_state == "yes":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_yes(), "stop"
        if confirm_state == "no":
            state_tracker_obj.update_last_slot_state("ask")
            return confirm_nlg.response_no(
                "consult_food",
                state_tracker_obj.get_all_confident_slot_values()), "ask"
        if confirm_state == "stop":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_termination(), "stop"
        if confirm_state == "change":
            state_tracker_obj.update_last_slot_state("change")
            return ie_food_state_flow(customer_utterance, state_tracker_obj,
                                      temp_entities, lac, db_obj,
                                      collection_name)
        if confirm_state == "nothing":
            state_tracker_obj.update_last_slot_state("confirm")
            return confirm_nlg.response_uncertain("consult_food"), "confirm"
Пример #4
0
def plan_scenic_spot_handle(customer_utterance, state_tracker_obj, entities,
                            lac, intent_model, senta_gru, confirm_interpreter,
                            db_obj, collection_name):
    def ie_scenic_spot_state_flow(customer_utterance, state_tracker_obj,
                                  entities, lac, db_obj, collection_name):
        give_up_state = give_up_nlu.whether_give_up(customer_utterance,
                                                    senta_gru,
                                                    confirm_interpreter)
        if give_up_state:
            state_tracker_obj.update_last_slot_state("stop")
            return give_up_nlg.response_give_up(), "stop"
        else:
            if state_tracker_obj.get_last_slot_state() != "change":
                ie_slot_result = scenic_spot_nlu.ie_all_plan_scenic_spot(
                    customer_utterance, lac, entities)
            else:
                ie_slot_result = entities
            print("ie_slot_result:", ie_slot_result)
            state_tracker_obj.update_all_state(ie_slot_result)

            slot_state_dict = state_tracker_obj.judge_each_slot_state(
                plan_scenic_spot_slot.keys())
            if slot_state_dict["city"] is False and slot_state_dict[
                    "days"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return scenic_spot_nlg.ask_city_days(), "ask"
            elif slot_state_dict["city"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return scenic_spot_nlg.ask_city(), "ask"
            elif slot_state_dict["days"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return scenic_spot_nlg.ask_days(), "ask"
            else:
                if state_tracker_obj.get_confidence("schemes") == 1:
                    state_tracker_obj.update_confidence("schemes", 0)
                search_scheme_dict_results = db_obj.search_db(
                    collection_name,
                    state_tracker_obj.get_all_confident_slot_values())
                if search_scheme_dict_results:
                    print("search_scheme_dict_results:",
                          search_scheme_dict_results[0]['schemes'])
                    state_tracker_obj.add_one_state(
                        "schemes", search_scheme_dict_results[0]["schemes"], 1)
                    print("start to select schemes")
                    state_tracker_obj.update_last_slot_state("confirm_select")
                    print("common last state",
                          state_tracker_obj.get_last_slot_state())
                    return scenic_spot_nlg.response_scheme_list(
                        search_scheme_dict_results[0]["schemes"],
                        state_tracker_obj.get_all_confident_slot_values()
                    ), "confirm_select"
                else:
                    state_tracker_obj.update_last_slot_state("confirm_select")
                    return scenic_spot_nlg.response_scheme_list(
                        '', state_tracker_obj.get_all_confident_slot_values()
                    ), "confirm_select"

    customer_utterance = customer_utterance.replace("个礼拜",
                                                    "周").replace("礼拜", "周")
    last_slot_state = state_tracker_obj.get_last_slot_state()
    print("last_slot_state:", last_slot_state)
    if last_slot_state != "confirm_select":
        return ie_scenic_spot_state_flow(customer_utterance, state_tracker_obj,
                                         entities, lac, db_obj,
                                         collection_name)
    else:
        confirm_state, temp_entities = scenic_spot_nlu.confirm_plan_scenic_spot(
            customer_utterance, lac, intent_model, senta_gru,
            confirm_interpreter,
            state_tracker_obj.get_confident_slot_value("schemes"))
        print(5, confirm_state, temp_entities)
        if confirm_state == "yes":
            state_tracker_obj.add_one_state("index", temp_entities, 1)
            state_tracker_obj.update_last_slot_state("yes")
            return confirm_nlg.response_yes(), "yes"
        if confirm_state == "no":
            state_tracker_obj.update_last_slot_state("ask")
            return confirm_nlg.response_no(
                "plan_scenic_spot",
                state_tracker_obj.get_all_confident_slot_values()), "ask"
        if confirm_state == "stop":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_termination(), "stop"
        if confirm_state == "change":
            state_tracker_obj.update_last_slot_state("change")
            return ie_scenic_spot_state_flow(customer_utterance,
                                             state_tracker_obj, temp_entities,
                                             lac, db_obj, collection_name)
        if confirm_state == "nothing":
            state_tracker_obj.update_last_slot_state("confirm_select")
            return confirm_nlg.response_uncertain(
                "plan_scenic_spot"), "confirm_select"
def consult_traffic_handle(customer_utterance, state_tracker_obj, entities,
                           lac, intent_model, senta_gru, confirm_interpreter,
                           db_obj, collection_name):
    def ie_traffic_state_flow(customer_utterance, state_tracker_obj, entities,
                              lac, db_obj, collection_name):
        give_up_state = give_up_nlu.whether_give_up(customer_utterance,
                                                    senta_gru,
                                                    confirm_interpreter)
        if give_up_state:
            state_tracker_obj.update_last_slot_state("stop")
            return give_up_nlg.response_give_up(), "stop"
        else:
            if state_tracker_obj.get_last_slot_state() != "change":
                if state_tracker_obj.get_last_slot_state() == "ask_dept":
                    ie_slot_result = traffic_nlu.ie_all_consult_traffic(
                        customer_utterance, lac, entities, "ask_dept")
                elif state_tracker_obj.get_last_slot_state() == "ask_dest":
                    ie_slot_result = traffic_nlu.ie_all_consult_traffic(
                        customer_utterance, lac, entities, "ask_dest")
                else:
                    ie_slot_result = traffic_nlu.ie_all_consult_traffic(
                        customer_utterance, lac, entities)
            else:
                ie_slot_result = entities
            print("update all", ie_slot_result)
            state_tracker_obj.update_all_state(ie_slot_result)
            slot_state_dict = state_tracker_obj.judge_each_slot_state(
                consult_traffic_slot.keys())
            # if True not in slot_state_dict.values():
            if slot_state_dict["departure"] is False and slot_state_dict[
                    "destination"] is False and slot_state_dict[
                        "vehicle"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return traffic_nlg.ask_depart_dest_vehicle(), "ask"
            elif slot_state_dict["departure"] is False:
                state_tracker_obj.update_last_slot_state("ask_dept")
                return traffic_nlg.ask_depart(), "ask_dept"
            elif slot_state_dict["destination"] is False:
                state_tracker_obj.update_last_slot_state("ask_dest")
                return traffic_nlg.ask_dest(), "ask_dest"
            elif slot_state_dict["vehicle"] is False:
                state_tracker_obj.update_last_slot_state("ask")
                return traffic_nlg.ask_vehicle(), "ask"
            else:
                pass
                # ie_time_result = traffic_nlu.ie_departure_time(customer_utterance, lac)
                # if ie_time_result:
                #     if state_tracker_obj.get_confident_slot_value("departure_time"):
                #         state_tracker_obj.update_slot_value("departure_time", ie_slot_result)
                #         state_tracker_obj.update_confidence("departure_time", 1)
                #     else:
                #         if state_tracker_obj.get_slot_value("departure_time") == ie_time_result:
                #             state_tracker_obj.update_confidence("departure_time", 1)
                #         else:
                #             state_tracker_obj.add_one_state("departure_time", ie_slot_result, 1)

            # search_traffic_results = db_conn.search_db(collection_name, state_tracker_obj.get_all_confident_slot_values())
            search_traffic_results = get_traffic_route_interface(
                state_tracker_obj.get_all_confident_slot_values())
            state_tracker_obj.update_last_slot_state("confirm")
            return traffic_nlg.response_traffic_list(
                search_traffic_results,
                state_tracker_obj.get_all_confident_slot_values()), "confirm"

    last_slot_state = state_tracker_obj.get_last_slot_state()
    if last_slot_state != "confirm":
        return ie_traffic_state_flow(customer_utterance, state_tracker_obj,
                                     entities, lac, db_obj, collection_name)
    else:
        confirm_state, temp_entities = traffic_nlu.confirm_consult_traffic(
            customer_utterance, lac, intent_model, senta_gru,
            confirm_interpreter)
        print(5, confirm_state, temp_entities)
        if confirm_state == "yes":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_yes(), "stop"
        if confirm_state == "no":
            state_tracker_obj.update_last_slot_state("ask")
            return confirm_nlg.response_no(
                "consult_traffic",
                state_tracker_obj.get_all_confident_slot_values()), "ask"
        if confirm_state == "stop":
            state_tracker_obj.update_last_slot_state("stop")
            return confirm_nlg.response_termination(), "stop"
        if confirm_state == "change":
            state_tracker_obj.update_last_slot_state("change")
            return ie_traffic_state_flow(customer_utterance, state_tracker_obj,
                                         temp_entities, lac, db_obj,
                                         collection_name)
        if confirm_state == "nothing":
            state_tracker_obj.update_last_slot_state("confirm")
            return confirm_nlg.response_uncertain("consult_traffic"), "confirm"