diff --git a/api/constants.py b/api/constants.py index f2fb00b..fb20c56 100644 --- a/api/constants.py +++ b/api/constants.py @@ -1,5 +1,7 @@ # constants.py -SIMILARITY_VALUE = 0.7 +SIMILARITY_VALUE = 75 +# +COMPANYNAME_SHA = "顺安电网建设有限公司" #日期 DATE = "date" #工程名称 diff --git a/api/main.py b/api/main.py index 5aacf34..a0718d2 100644 --- a/api/main.py +++ b/api/main.py @@ -6,21 +6,22 @@ from pydantic import ValidationError from intentRecognition import IntentRecognition from slotRecognition import SlotRecognition -from fuzzywuzzy import process -from utils import CheckResult, StandardType, load_standard_name -from constants import PROJECT_NAME, PROJECT_DEPARTMENT, SIMILARITY_VALUE, IMPLEMENTATION_ORG +from utils import CheckResult, load_standard_name, generate_project_prompt, standardize_company_and_project, \ + load_standard_data, standardize_single_name, text_to_pinyin, multiple_standardize_single_name, \ + standardize_company_and_projectDepartment + +from constants import PROJECT_NAME, PROJECT_DEPARTMENT, SIMILARITY_VALUE, IMPLEMENTATION_ORG, RISK_LEVEL from langchain_openai import OpenAIEmbeddings from config import * - -MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-3540" -MODEL_UIE_PATH = R"../uie/output/checkpoint-3190" +MODEL_ERNIE_PATH = R"../ernie/output/checkpoint-12750" +MODEL_UIE_PATH = R"../uie/output/checkpoint-12150" # 类别名称列表 labels = [ "天气查询", "互联网查询", "页面切换", "日计划数量查询", "周计划数量查询", "日计划作业内容", "周计划作业内容", "施工人数", "作业考勤人数", "知识问答", - "通用对话" + "通用对话", "作业面查询","班组人数查询","班组数查询","作业面内容","班组详情" ] # 标签映射 @@ -41,37 +42,30 @@ label_map = { 13: 'B-teamName', 26: 'I-teamName', } -params = {'model': 'bge-large-zh-v1.5', - 'openai_api_base': 'http://127.0.0.1:9997/v1', - 'openai_api_key': 'EMPTY', - 'openai_proxy': ''} - -# 初始化工具类 +# # 初始化工具类 intent_recognizer = IntentRecognition(MODEL_ERNIE_PATH, labels) # 初始化槽位识别工具类 slot_recognizer = SlotRecognition(MODEL_UIE_PATH, label_map) # 设置Flask应用 -#标准工程名 +#标准公司名和项目名 +standard_company_program = load_standard_data("./standard_data/standard_company_program.json") + +# 标准工程名,标准工程名拼音和工程名映射,标准工程名拼音 standard_project_name_list = load_standard_name('./standard_data/standard_project.txt') -#标准项目名 -standard_program_name_list = load_standard_name('./standard_data/standard_program.txt') +pinyin_to_standard_project_name_map = {text_to_pinyin(kw): kw for kw in standard_project_name_list} +standard_project_name_pinyin_list = list(pinyin_to_standard_project_name_map.keys()) -#标准公司名 -standard_company_name_list = load_standard_name('./standard_data/standard_company.txt') +#标准分公司名,标准分公司名拼音和分公司名映射,标公司名拼音 +standard_company_name_list = list(standard_company_program.keys()) +pinyin_to_standard_company_name_map = {text_to_pinyin(kw): kw for kw in standard_company_name_list} +standard_company_name_pinyin_list = list(pinyin_to_standard_company_name_map.keys()) -# 创建嵌入模型 -embedding = OpenAIEmbeddings(**params) +print(f"标准化的工程名是:{standard_project_name_list}", flush=True) +print(f"pinyin标准化的工程名是 list:{standard_project_name_pinyin_list}", flush=True) +print(f"pinyin-工程民对应关系 map:{pinyin_to_standard_company_name_map}", flush=True) -# 获取标准项目部名称的嵌入向量 -standard_program_embeddings = embedding.embed_documents(standard_program_name_list, chunk_size=500) - -standard_project_embeddings = embedding.embed_documents(standard_project_name_list, chunk_size=500) - -standard_company_embeddings = embedding.embed_documents(standard_company_name_list, chunk_size=500) - -print(f":standard_project_name_list:{standard_project_name_list}") app = Flask(__name__) @@ -116,7 +110,6 @@ class LabelMessage(BaseModel): class Message(BaseModel): role: str = Field(..., description="消息内容") content: str = Field(..., description="消息内容") - # timestamp: str = Field(..., description="消息时间戳") # 请求数据的结构 @@ -199,6 +192,10 @@ def slot_reco(): def agent(): try: data = request.get_json() + except Exception as e: + print(f"body不是一个有效的json") + return jsonify({"error": str(e)}), 500 # 捕捉其他错误并返回 + try: # 使用 Pydantic 来验证数据结构 request_data = RequestData(**data) # Pydantic 会验证数据结构 messages = request_data.messages @@ -221,28 +218,34 @@ def agent(): # 再进行槽位抽取 entities = slot_recognizer.recognize(query) - print(f"第一轮意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}") - - # 如果是后续轮次(多轮对话),这里只做示例,可能需要根据具体需求进行处理 + print( + f"第一轮意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}",flush=True) + # 多轮 else: - query = messages[0].content # 使用 Message 对象的 .content 属性 - # 先进行意图识别 - predicted_label, predicted_probability, predicted_id = intent_recognizer.predict(query) - entities = multi_slot_recognizer(predicted_id, messages) - - print(f"多轮意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}") + res = extract_multi_chat(messages) + predicted_label, predicted_probability, predicted_id = intent_recognizer.predict(res) + #0:天气,1:互联网查询,9:知识问答,10:通用对话 + if predicted_id in [0, 1, 9, 10]: + print(f"多轮意图识别后的label:{predicted_label}, id:{predicted_id},message:{messages}", + flush=True) + return jsonify({ + "code": 200, "msg": "成功", + "answer": {"int": predicted_id, "label": predicted_label, "probability": predicted_probability}, + "finalQuery": res + }) + entities = slot_recognizer.recognize(res) + print( + f"多轮意图识别后的label:{predicted_label}, id:{predicted_id},槽位抽取后的实体:{entities},message:{messages}",flush=True) #必须槽位缺失检查 status, sk = check_lost(predicted_id, entities) if status == CheckResult.NEEDS_MORE_ROUNDS: return jsonify({"code": 10001, "msg": "成功", - "answer": { "miss": sk}, + "answer": {"miss": sk}, }) #工程名和项目名标准化 - print(f"start to check_project_standard_slot") result, information = check_project_standard_slot(predicted_id, entities) - print(f"end check_project_standard_slot,{result},{information}") if result == CheckResult.NEEDS_MORE_ROUNDS: return jsonify({ "code": 10001, "msg": "成功", @@ -250,8 +253,9 @@ def agent(): }) return jsonify({ - "code": 200,"msg": "成功", - "answer": {"int": predicted_id, "label": predicted_label, "probability": predicted_probability, "slot": entities }, + "code": 200, "msg": "成功", + "answer": {"int": predicted_id, "label": predicted_label, "probability": predicted_probability, + "slot": entities}, }) except ValidationError as e: @@ -259,33 +263,91 @@ def agent(): except Exception as e: return jsonify({"error": str(e)}), 500 # 捕捉其他错误并返回 - -def multi_slot_recognizer(intention_id, messages): +def extract_multi_chat(messages): from openai import OpenAI - client = OpenAI(base_url = api_base_url, api_key = api_key) + client = OpenAI(base_url=api_base_url, api_key=api_key) - # prompt = f''' - # 根据用户的输入{messages},抽取出用户最近最想了解的一个问题,要求:保持客观真实,简单明了,不要多余解释和阐述,不需要输出如“用户想了解的问题”类似的字眼 - # ''' - prompt = f'''根据以下对话记录,提取用户最近一次提问的核心意图,根据上下文的回答内容并且关注用户最后的问题,提取出的意图需表述为完整的问题句式: - 对话记录:{messages}''' + # 格式化对话历史 + chat_history = "\n".join([f"{msg.role}: {msg.content}" for msg in messages]) + + prompt = f'''你是一个智能助手,需要从以下对话记录中提取用户最近一次提问的完整问题: + 1. **仅关注用户的最后一个问题**,无论之前用户提问了什么,**不要受到之前用户问题的影响**。 + 2. **如果用户的最后一个问题包含指代词**(如“作业计划分别是什么”、“具体是哪2项”、“刚刚那个故事”、“明天呢”、“合肥中心变工程呢”等),请结合用户上一次的问题和**AI(助手)回答**,补充信息,使问题成为完整的句子。 + 3. **如果用户的最后一个问题包含“公司”这个字眼并且“公司”单独出现(如“公司今天有多少作业计划”)或者公司,工程,项目部等都不出现(如“今天有多少作业计划”),则不要参考对话历史进行补全,保持用户原始表达,不要替换为具体的公司名,工程名或项目部名等。** + 4. **如果用户的最后一个问题本身是完整的**(即未使用上述2里的指代词),直接输出该问题,不要受前文影响。 + 5. **如果问题缺少上下文信息**(如工程、项目部和时间等),仅在**最近的 AI 回答**提供了明确的上下文时进行补全,否则保持用户的原始输入,不要添加错误的补全信息。 + 6. **如果用户的最新问题包含时间信息**(如“今天、明天、本周”),请确保其被保留,并且不改变时间表达方式。 + - **如果用户的提问本身省略了时间信息,但最近 AI 回答包含时间信息,则补全时间**。 + - **例如:用户问“具体是哪20项”时,最近 AI 回答是“今天送1分公司第二项目管理部有20项作业计划”,那么补全后的问题应为“今天送1分公司第二项目管理部具体是哪20项作业计划”**。 + 7. **不要改写问题的主体和语序**,仅在需要时补全信息,避免误修改用户原始表达。 + 8. 直接输出补全后的完整问题,不需要额外解释,也不需要输出“用户想了解的问题”这样的字眼。 + + **对话记录:** + {chat_history} + + 请提取并补全用户的最新问题:''' + + # prompt = f'''你是一个智能助手,需要从以下对话记录中提取用户最近一次提问的完整问题: + # 1. **仅关注用户的最后一个问题**,无论之前用户提问了什么,**不要受到之前用户问题的影响**。 + # 2. **如果用户的最后一个问题包含指代词**(如“作业计划分别是什么”、“具体是哪2项”、“刚刚那个故事”、“明天呢”、“合肥中心变工程呢”等),请结合用户上一次的问题和**AI(助手)回答**,补充信息,使问题成为完整的句子。 + # 3. **如果用户的最后一个问题本身是完整的**(即未使用上述2里的指代词),直接输出该问题,不要受前文影响。 + # - **如果用户的最后一个问题包含“公司”字眼并且“公司”单独出现(如“公司今天有多少作业计划”)**,则不要参考对话历史进行补全,保持用户原始表达。 + # - **如果用户的最后一个问题里公司,工程,项目部等都不出现(如“今天有多少作业计划”),则不要参考对话历史进行补全,保持用户原始表达。 + # 4. **如果问题缺少上下文信息**(如工程、项目部和时间等),仅在**最近的 AI 回答**提供了明确的上下文时进行补全,否则保持用户的原始输入,不要添加错误的补全信息。 + # 5. **如果用户的最新问题包含时间信息**(如“今天、明天、本周”),请确保其被保留,并且不改变时间表达方式。 + # - **如果用户的提问本身省略了时间信息,但最近 AI 回答包含时间信息,则补全时间**。 + # - **例如:用户问“具体是哪20项”时,最近 AI 回答是“今天送1分公司第二项目管理部有20项作业计划”,那么补全后的问题应为“今天送1分公司第二项目管理部具体是哪20项作业计划”**。 + # 6. **不要改写问题的主体和语序**,仅在需要时补全信息,避免误修改用户原始表达。 + # 7. 直接输出补全后的完整问题,不需要额外解释,也不需要输出“用户想了解的问题”这样的字眼。 + # + # **对话记录:** + # {chat_history} + # + # 请提取并补全用户的最新问题:''' + + message = [ + {"role": "system", "content": "你是一个智能助手,负责提取用户最近的问题,并自动补全缺失信息,使其成为完整的问题句子。"}, + {"role": "user", "content": prompt} + ] - message = [{"role": "system", "content": prompt}] - message.extend(messages) - # print(message) response = client.chat.completions.create( messages=message, model=model_name, - max_tokens=1000, - temperature=0.001, + max_tokens=100, + temperature=0.3, # 降低随机性,提高确定性 stream=False ) - res = response.choices[0].message.content - print(f"多轮意图后用户想要的问题是{res}") - entries = slot_recognizer.recognize(res) + res = response.choices[0].message.content.strip() + print(f"多轮意图后用户想要的问题是:{res}", flush=True) + return res - return entries +# def multi_slot_recognizer(intention_id, messages): +# from openai import OpenAI +# client = OpenAI(base_url=api_base_url, api_key=api_key) +# +# # prompt = f''' +# # 根据用户的输入{messages},抽取出用户最近最想了解的一个问题,要求:保持客观真实,简单明了,不要多余解释和阐述,不需要输出如“用户想了解的问题”类似的字眼 +# # ''' +# prompt = f'''根据以下对话记录,提取用户最近一次提问的核心意图,根据关键信息和上下文的回答内容并且关注用户最后的问题,提取出的意图需表述为完整的问题句式: +# 对话记录:{messages}''' +# +# message = [{"role": "system", "content": prompt}] +# message.extend(messages) +# # print(message) +# response = client.chat.completions.create( +# messages=message, +# model=model_name, +# max_tokens=1000, +# temperature=0.001, +# stream=False +# ) +# res = response.choices[0].message.content +# +# print(f"多轮意图后用户想要的问题是{res}",flush=True) +# entries = slot_recognizer.recognize(res) +# +# return entries def check_lost(int_res, slot): #labels: ["天气查询","通用对话","页面切换","日计划数量查询","周计划数量查询","日计划作业内容","周计划作业内容","施工人数","作业考勤人数","知识问答"] @@ -297,10 +359,16 @@ def check_lost(int_res, slot): 6: [['date']], 7: [['date']], 8: [['date']], + 11: [['date']], + 12: [['date']], + 13: [['date']], + 14: [['date']], + 15: [['date']], } intention_mapping = {2: "页面切换", 3: "日计划数量查询", 4: "周计划数量查询", 5: "日计划作业内容", - 6: "周计划作业内容",7: "施工人数",8: "作业考勤人数"} + 6: "周计划作业内容", 7: "施工人数", 8: "作业考勤人数", 11: "作业面查询", + 12:"班组人数查询", 13:"班组数查询", 14:"作业面内容", 15:"班组详情"} if not mapping.__contains__(int_res): return 0, "" #提取的槽位信息 @@ -325,90 +393,135 @@ def check_lost(int_res, slot): return CheckResult.NO_MATCH, cur_k #符合当前意图的的必须槽位,但是不在提取的槽位信息里 left = [x for x in mapping[int_res][idx] if x not in cur_k] - print(f"符合当前意图的的必须槽位,但是不在提取的槽位信息里, {left}") + print(f"符合当前意图的的必须槽位,但是不在提取的槽位信息里, {left}",flush=True) apologize_str = "非常抱歉," if int_res == 2: return CheckResult.NEEDS_MORE_ROUNDS, f"{apologize_str}请问你想查询哪个页面?" - elif int_res in [3, 4, 5, 6, 7, 8]: + elif int_res in [3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15]: return CheckResult.NEEDS_MORE_ROUNDS, f"{apologize_str}请问你想查询什么时间的{intention_mapping[int_res]}?" #标准化工程名 def check_project_standard_slot(int_res, slot) -> tuple: - intention_list = {3, 4, 5, 6, 7, 8} + intention_list = {3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15} if int_res not in intention_list: return CheckResult.NO_MATCH, "" + #项目名 当项目名存在时需要一定存在分公司(实施组织)名 + if PROJECT_DEPARTMENT in slot: + if IMPLEMENTATION_ORG not in slot: + return CheckResult.NEEDS_MORE_ROUNDS, "请补充该项目部所属的分公司名称" + else: + standard_company, matched_projectDepartment = standardize_company_and_projectDepartment(slot[IMPLEMENTATION_ORG], slot[PROJECT_DEPARTMENT], standard_company_name_list, standard_company_program, pinyin_to_standard_company_name_map) + print(f"check_project_standard_slot : {slot[IMPLEMENTATION_ORG]}, {slot[PROJECT_DEPARTMENT]}") + # if not standard_company: + # return CheckResult.NEEDS_MORE_ROUNDS, f"未匹配到您说的分公司名:{slot[IMPLEMENTATION_ORG]},请提供更准确的分公司名" + # if not matched_projectDepartment: + # return CheckResult.NEEDS_MORE_ROUNDS, f"未匹配到您说的项目名:{slot[PROJECT_DEPARTMENT]},请提供更准确的项目名" + # if len(standard_company) > 1: + # prompt = generate_project_prompt(matched_projectDepartment) + # return CheckResult.NEEDS_MORE_ROUNDS, prompt + # if len(matched_projectDepartment) == 1: + # slot[IMPLEMENTATION_ORG] = standard_company[0] + # slot[PROJECT_DEPARTMENT] = matched_projectDepartment[0] + # elif len(matched_projectDepartment) > 1: + # prompt = generate_project_prompt(standard_company, original_name=slot[IMPLEMENTATION_ORG], type="分公司名") + # return CheckResult.NEEDS_MORE_ROUNDS, prompt + if not standard_company: + return CheckResult.NEEDS_MORE_ROUNDS, f"未匹配到您说的分公司名:{slot[IMPLEMENTATION_ORG]},请提供更准确的分公司名" + if not matched_projectDepartment: + return CheckResult.NEEDS_MORE_ROUNDS, f"未匹配到您说的项目名:{slot[PROJECT_DEPARTMENT]},请提供更准确的项目名" + if standard_company and len(matched_projectDepartment) == 1: + slot[IMPLEMENTATION_ORG] = standard_company + slot[PROJECT_DEPARTMENT] = matched_projectDepartment[0] + elif standard_company and len(matched_projectDepartment) > 1: + prompt = generate_project_prompt(matched_projectDepartment) + return CheckResult.NEEDS_MORE_ROUNDS, prompt + + #工程名和分公司名标准化 for key, value in slot.items(): if key == PROJECT_NAME: - # match_project, match_possibility = fuzzy_match(value, standard_project_name_list) - match_project, match_possibility = fuzzy_match(value,standard_project_embeddings,standard_project_name_list) - print(f"fuzzy_match project result:{match_project}, {match_possibility}") - if match_possibility >= SIMILARITY_VALUE: - slot[key] = match_project + print(f"check_project_standard_slot original project : {slot[PROJECT_NAME]}") + match_results = multiple_standardize_single_name(value, standard_project_name_list, standard_project_name_pinyin_list, pinyin_to_standard_project_name_map,30,70) + print(f"standardize_single_name 工程名 :result:{match_results}",flush=True) + if match_results and len(match_results) == 1: + slot[key] = match_results[0] else: - return CheckResult.NEEDS_MORE_ROUNDS, f"抱歉,您说的工程名是{match_project}吗" - - if key == PROJECT_DEPARTMENT: - # match_program, match_possibility = fuzzy_match(value, standard_program_name_list) - match_program, match_possibility = fuzzy_match(value,standard_program_embeddings, standard_program_name_list) - print(f"fuzzy_match program result:{match_program}, {match_possibility}") - if match_possibility >= SIMILARITY_VALUE: - slot[key] = match_program - else: - return CheckResult.NEEDS_MORE_ROUNDS, f"抱歉,您说的项目名是{match_program}吗" + prompt = generate_project_prompt(match_results, original_name=slot[PROJECT_NAME], type="工程名") + return CheckResult.NEEDS_MORE_ROUNDS, prompt if key == IMPLEMENTATION_ORG and slot[key] != "公司": - match_company, match_possibility = fuzzy_match(value,standard_company_embeddings, standard_company_name_list) - print(f"fuzzy_match program result:{match_company}, {match_possibility}") - if match_possibility >= SIMILARITY_VALUE: - slot[key] = match_company + print(f"check_project_standard_slot original company : {slot[IMPLEMENTATION_ORG]}") + match_results = multiple_standardize_single_name(value, standard_company_name_list, standard_company_name_pinyin_list, pinyin_to_standard_company_name_map, lower_score=70, high_score=8, isArabicNumConv = True) + print(f"standardize_single_name 分公司名: result:{match_results}",flush=True) + if match_results and len(match_results) == 1: + slot[key] = match_results[0] else: - return CheckResult.NEEDS_MORE_ROUNDS, f"抱歉,您说的分公司名是{match_company}吗" - + prompt = generate_project_prompt(match_results, original_name=slot[IMPLEMENTATION_ORG], type="分公司名") + return CheckResult.NEEDS_MORE_ROUNDS, prompt + if key == RISK_LEVEL: + if slot[RISK_LEVEL] not in["2级","3级","4级","5级"] and slot[RISK_LEVEL] not in["二级","三级","四级","五级"]: + return CheckResult.NEEDS_MORE_ROUNDS, "您查询的风险等级在系统中未找到,请确认风险等级后再次提问" return CheckResult.NO_MATCH, "" +# test_cases = [ +# ("安徽宏源电力建设有限公司", "第三项目管理部"), # 期望返回所有"第三项目管理部" +# ("安徽宏源电力建设有限公司", "第九项目部"), # 期望返回 "第九项目管理部" +# ("顺安电网公司", "第二项目部"), # 期望匹配"顺安电网建设有限公司"下的"第二项目管理部" +# ("送电一公司", "第三项目部"), # 期望返回"第三项目管理部" +# ("送电2公司", "第三项目部"), # 期望返回"第三项目管理部" +# ("消防分公司", "第七项目部"), # 期望返回"第七项目管理部 +# ("建筑分公司", "第七项目部"), # 期望返回"第七项目管理部" +# ("建筑消防分公司", "第七项目部"), # 期望返回"第七项目管理部" +# ("建筑分公司消防分公司", "第七项目部") # 期望返回"第七项目管理部" +# ] +# +# for company, project in test_cases: +# # result = standardize_company_and_project(company, project,standard_company_program) +# result = standardize_company_and_projectDepartment(company, project,standard_company_name_list, standard_company_program, pinyin_to_standard_company_name_map) +# # result = multiple_standardize_single_name("company", standard_project_name_list, standard_project_name_pinyin_list, pinyin_to_standard_project_name_map,40,70) +# print(f"输入: {company}, {project} -> 输出: {result}") +# +# result = standardize_single_name("送电一公司", standard_company_name_list) +# print(f"输入: 送一分公司-> 输出: {result}") +# +# prompt = generate_project_prompt(result, "分公司名") +# print(f"prompt:{prompt}") +# +# result = standardize_single_name("合肥中心变", standard_project_name_list) +# print(f"输入: 合肥中心变-> 输出: {result}") +# +# prompt = generate_project_prompt(result, "工程名") +# print(f"prompt:{prompt}") -# def fuzzy_match(user_input, standard_name): -# result = process.extract(user_input, standard_name) -# return result[0][0], result[0][1]/100 +# result = standardize_single_name("合肥中心变", standard_project_name_list, 60, 75) +# print(f"输入: 合肥中心变-> 输出: {result}") +# +# result = standardize_single_name("阜阳阜四变电站工程", standard_project_name_list, 60, 75) +# print(f"输入: 阜阳阜四变电站工程-> 输出: {result}") +# +# result = standardize_single_name("循环园变电站工程", standard_project_name_list, 60, 75) +# print(f"输入: 循环园变电站工程-> 输出: {result}") +# +# match_results = multiple_standardize_single_name("宋轶分公司", standard_company_name_list, standard_company_name_pinyin_list, pinyin_to_standard_company_name_map,75,80) +# print(f"standardize_pinyin_single_name 输入: 宋轶分公司-> 输出: {match_results}") +# # +# match_results = multiple_standardize_single_name("合肥中心变", standard_project_name_list, standard_project_name_pinyin_list, pinyin_to_standard_project_name_map,40,70) +# print(f"standardize_pinyin_single_name 输入: 合肥中心变-> 输出: {match_results}") +# +# match_results = multiple_standardize_single_name("淮南安丰", standard_project_name_list, standard_project_name_pinyin_list, pinyin_to_standard_project_name_map,40,70) +# print(f"standardize_pinyin_single_name 输入: 淮南安丰工程-> 输出: {match_results}") +# +# match_results = multiple_standardize_single_name("合州蚊度工程", standard_project_name_list, standard_project_name_pinyin_list, pinyin_to_standard_project_name_map,40,70) +# print(f"standardize_pinyin_single_name 输入: 合州站工程-> 输出: {match_results}") +# +# company, project = standardize_company_and_projectDepartment("宋轶分公司","第一项目部", standard_company_name_list, standard_company_program, pinyin_to_standard_company_name_map) +# print(f"company:{company}, project:{project}") +# company, project = standardize_company_and_projectDepartment("试验分公司","电缆班", standard_company_name_list, standard_company_program, pinyin_to_standard_company_name_map) +# print(f"company:{company}, project:{project}") +# company, project = standardize_company_and_projectDepartment("宏源电力公司","第三项目部(六安线路)", standard_company_name_list, standard_company_program, pinyin_to_standard_company_name_map) +# print(f"company:{company}, project:{project}") -def fuzzy_match(query, standard_embeddings, standard_name_list): - """ - 模糊匹配查询与标准名称列表,返回最相似名称及其相似度。 - - :param query: 查询名称 - :param standard_embeddings: 标准名称的嵌入向量列表 - :param standard_name_list: 标准名称列表 - :return: 最相似名称, 相似度(保留 2 位小数) - """ - from sklearn.metrics.pairwise import cosine_similarity - import numpy as np - try: - # 查询名称的嵌入向量 - query_embedding = embedding.embed_query(query) - - # 计算相似度 - similarities = cosine_similarity([query_embedding], standard_embeddings)[0] - - # 找到最相似的项目名称 - most_similar_index = np.argmax(similarities) - most_similar_name = standard_name_list[most_similar_index] - similarity_score = similarities[most_similar_index] - - # 打印日志 - print(f"输入名称: {query}") - print(f"最相似的名称: {most_similar_name}") - print(f"相似度: {similarity_score:.4f}") - - return most_similar_name, round(similarity_score, 2) - except Exception as e: - print(f"相似性判断错误: {e}") - return None, None - - -# match_program, match_possibility = fuzzy_match("第一项目部定西") -# print(f"fuzzy_match program result:{match_program}, {match_possibility}") if __name__ == '__main__': app.run(host='0.0.0.0', port=18074, debug=True) diff --git a/api/slotRecognition.py b/api/slotRecognition.py index fe8daf1..3d93677 100644 --- a/api/slotRecognition.py +++ b/api/slotRecognition.py @@ -1,6 +1,9 @@ import paddle from paddlenlp.transformers import ErnieForTokenClassification, ErnieTokenizer +from constants import SUBCONTRACTOR, CONSTRUCTION_UNIT, IMPLEMENTATION_ORG + + class SlotRecognition: def __init__(self, model_path: str, label_map: dict): """ @@ -56,6 +59,18 @@ class SlotRecognition: if current_entity: entities[current_label] = "".join(current_entity) # 对所有实体进行替换:替换每个实体中的 '##' 为 ' ' + # for key, value in entities.items(): + # entities[key] = value.replace('#', '') + updates = {} for key, value in entities.items(): + #对所有实体进行替换:替换每个实体中的 '##' 为 ' ' entities[key] = value.replace('#', '') - return entities + #暂时不支持分包商和监管单位的查询 + if key == SUBCONTRACTOR or key == CONSTRUCTION_UNIT: + updates[IMPLEMENTATION_ORG] = value # 统一映射到 IMPLEMENTATION_ORG + else: + updates[key] = value # 保留原 key + # 更新 entities + entities.clear() + entities.update(updates) + return entities \ No newline at end of file diff --git a/api/standard_data/standard_project.txt b/api/standard_data/standard_project.txt index 49ab46c..e17363c 100644 --- a/api/standard_data/standard_project.txt +++ b/api/standard_data/standard_project.txt @@ -1,199 +1,214 @@ -杨柳220kV变电站220kV南坪间隔扩建工程 -阜阳东坡110kV变电站新建工程 -杨柳圩110kV变电站110kV配电装置改造工程 -阜阳太和城南110kV变电站新建工程 -安庆石化110kV变电站新建 工程 -华南城220kV变电站新建工程 -马鞍山万济220kV变电站新建工程 -紫蓬500kV变电站间隔扩建工程 -安徽阜阳阜四500kV变电站新建工程 -安徽合肥杜岗220kV开关站新建工程 -庐北220kV变电站新建工程 -渝北±800千伏换流站工程电气安装A包 -宿州城东220kV变电站新建工程 -马鞍山金河口110kV变电站新建工程 -安庆四500kV变电站新建工程 -合肥循环园220kV变电站新建工程 -马鞍山郑蒲220kV变电站新建工程 -国网安徽宣城供电公司500kV河沥变加装固定融冰装置 -滁州堰陈110千伏变电站新建工程 -安徽河沥500kV变电站3号主变扩建工程 -安徽合肥义兴220kV变电站新建工程 -宣城中港110kV变电站新建工程 -安庆城南110kV变电站新建工程 -国网安徽安庆供电公司500kV双岭变电站加装固定融冰装置 -芜湖蛟矶220kV变电站新建工程 -国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造 -马鞍山横龙110kV变电站新建工程 -金牛500kV变电站新建工程 -安庆双港220kV变电站新建工程 -安庆银山220kV变电站新建工程 -芜湖高村220kV变电站新建工程 -滁州红桥220kV变电站新建工程 -安徽合肥方兴II110kV变电站新建工程 -银联黄山园区220kV变电站工程 -陕北-安徽±800千伏特高压直流输电工程陶大庄村接地极工程 -松滋-安丰220kV线路工程 -伯阳500千伏变电站220千伏间隔扩建工程 -道轩汇流站-伯阳 220kV 线路工程 -香涧-梨花220kV线路工程 -埇桥-萧砀Ⅰ回500千伏线路工程 -埇桥-萧砀Ⅱ回500千伏线路工程 -石岗-施桥110kV线路工程 -芦集-古沟π入潘集变电站220kV线路工程 -黄阳-仙河110kV线路工程 -淮南芦集220千伏变电站220千伏配电装置改造工程 -伯阳-谯城500kV线路工程 -魏武-桐花π入祝集变电站110kV线路工程 -耿皇-焦楼220kV线路工程 -蕴山-沙埂110kV线路工程 -蚌埠孝仪220kV变电站新建工程(建筑安装部分) -安徽六安春秋塘-山七π入汤池变电站110kV线路工程 -亳州城北110kV变电站新建工程 -蚌埠潼河110kV变电站新建工程 -沪宁合高铁安徽段500kV清同5737线等2处电力线路迁改工程 -伯阳-涡阳π入真源变电站220kV线路工程 -濉淮5379濉洪5380线147#-148#跨阜淮铁路迁改工程 -汤庄-平圩500kV线路工程 -换流站-金牛500kV线路工程 -包河10kV玉龙18网架结构化工程施工 -淮南安丰220千伏变电站新建工程 -祝集220kV变电站新建工程 -田家庵电厂秦集改接孝仪变电站220kV线路工程 -谯城500千伏变电站新建工程(建筑) -金牛500kV变电站新建工程(建筑) -陕北-安徽直流工程合州±800千伏换流站土建A包 -锁库500kV变电站新建工程 -安徽宿州萧砀500千伏变电站新建工程(建筑部分) -合肥中心变B包 -中心500kV变电站新建工程(A包) -国网北京检修公司2024年±500kV延庆换流站直流主设备及辅助设备不停电检修维护 -香涧-鹭岛500kV线路工程(一般线路东段) -香涧-鹭岛500kV线路工程(淮河大跨越段) -安徽滁州清流-环漪220kV线路改造工程 -香涧-鹭岛500kV线路工程(一般线路西段) -谢桥电厂-原鹿220kV线路工程 -阜四-椿树220千伏线路工程 -寨西-苦竹溪T接金桥变电站110kV线路工程 -韦寨-范兴集π入阜四变电站220kV线路工程 -金牛-福渡500kV线路工程(巢湖、无为段) -金牛-福渡500kV线路工程(庐江段) -安徽马鞍山当涂-万济220kV线路工程 -黄山巷联-水西220kV线路工程 -苍山-横龙110kV架空线路工程 -安徽马鞍山围屏-万济220kV线路工程 -甘肃-浙江±800千伏特高压直流输电线路工程(皖3标段) -广德-敬亭π入桂花(广五)变220kV线路工程 -绿雪-莲塘220kV线路工程 -芜湖福渡-蛟矶220kV线路工程 -塔岗-西梁山T接杨柳圩变电站110kV架空线路工程 -芜湖江北-通江π入蛟矶变电站220kV线路工程 -含山-环峰T接横龙110kV架空线路工程 -安徽宣城莲塘-敬亭220kV线路改造工程 -月桥-火龙岗π入高村变电站220kV线路工程 -太和-李腰π入城南变电站110kV架空线路工程 -文昌宫-淮北西牵引站220kV线路工程 -杨柳四铺π入况楼变110kV电缆线路工程 -陕北-安徽±800kV特高压直流输电线路工程(皖2标) -安徽合肥晶合220kV外部供电工程(合肥杜岗Ⅱ220kV输变电工程) -肥西-中心500kV线路工程(电缆部分) -池州电厂二期-涓桥220kV线路工程 -陶楼-下塘、陶楼-航锂(凯博)π入下塘变电站220kV电缆线路工程 -显通-白杨(T接刘桥)、显通-溪河(T接刘桥)π入凌云变电站110kV架空线路工程 -南屏-蓬莱路π入派河变电站110kV线路工程 -茗南-熙湖T接城南变电站110kV架空线路工程 -显通-碱河π入凌云变电站220kV电缆线路工程 -灵泗-奎河220kV线路工程 -合肥二电厂-长临河π入循环园变电站220kV线路工程 -安徽合肥铭传-华南城220kV线路工程 -孔店-龙门500kV线路增容改造工程 -游乐-南岗、游乐-湖光路T接方兴Ⅱ变电站110kV电缆线路工程 -桐城-独秀π入双港变电站220kV线路工程 -杨柳-南坪改接至双堆集牵引站220kV线路工程 -合肥二电厂-彭郢π入长临河变电站220kV线路工程 -合肥长临河-义兴220kV架空线路工程 -陂塘-草庙乡牵引站220kV架空线路工程 -安徽官山-涓桥I、II回π入池州二变500千伏线路工程 -南坪-双堆集牵引站220kV线路工程 -肥西-中心500kV线路工程(架空部分) -先锋-泉河π入安庆四变电站220kV线路工程 -况楼-杨柳220kV线路工程 -安庆四-涓桥500kV线路工程(一般线路段) -藕池-漆园π入杨柳变电站220kV线路工程 -金牛-紫蓬500kV线路工程 -合肥金牛-庐江π入庐江北变电站220KV线路工程 -独秀-谭桥牵引站π入和平变电站220kV线路工程 -龙门500kV变电站间隔扩建工程 -安徽合肥下塘220kV变电站新建工程 -芜湖潘坛220kV变电站新建工程 -安徽滁州护桥220kV变电站2号主变扩建工程 -岩歙220kV变电站新建工程 -安徽淮北凌云220千伏变电站新建工程 -六安汤池 110kV 变电站新建工程 -白莲-邵岗π入尧塘变电站35kV架空线路工程 -淮南至桐城高速公路淮南段500kV电力迁改工程 -国网安徽电力营销服务计量用房 -国网安徽亳州供电公司运检营销综合用房 -安庆四500kV变电站新建工程(建筑) -安徽沙河变至原鹿变500kV双回线路开断接入阜四变工程 -黄栗树-儒林π入堰陈变电站110kV线路工程 -金上-湖北线路工程(川12标) -安徽阜阳薛桥-花园220kV线路改造工程 -章塘-邰桥、石桥-邰桥π入万济变电站110kV线路工程 -围屏-石桥π入万济变电站110kV线路工程 -安庆-龙山π入安庆四变电站220kV线路工程 -夏湖-华都改接入真源变电站110kV线路工程 -蓼城-冯井π入尧塘变电站110kV线路工程 -汤池-河棚35kV架空线路工程 -埇桥-萧砀回500千伏线路工程 -安徽官山-涓桥、回π入池州二变500千伏线路工程 -众兴-草庙乡牵引站220kV架空线路工程 -湖站1000千伏1号主变A相局放配合项目 -肥西-繁昌Ⅰ、Ⅱ回500kV线路改造工程 -宁芜铁扩能改造(安徽段)涉及500kV线路跨越宁芜铁路迁改工程 -S334峨山路东延伸(沿江高速至芜宣高速)新建工程二期500kV电力迁改工程 -芜湖抖音220kV线路涉500kV峨峰5914、峨廻5904线改造工程 -包河10kV延安30与兴集18网架结构优化工程施工 -国网安徽马鞍山供电公司500kV峨廻5904线#92等拉线杆塔改造工程 -国网安徽合肥供电公司2024年500kV肥西变电站一键顺控系统完善提升 -淮南芦集 220千伏变电站220千伏配电装置改造工程 -国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造 -和襄高速机电工程总承包项目500kV-1100kV特高压电力线路迁建工程 -阜四500千伏变电站新建工程(建筑部分) -蚌埠孝仪220kV变电站新建工程 -陕北~安徽±800千伏特高压直流输电工程受端换流站四通一平工程 -无人机智能巡检技术实验室项目 -国网安徽淮北供电公司500kV濉溪变电站1号主变5022电流互感器改造 -况楼220kV变电站间隔扩建工程 -国网北京检修公司2024年±500kV延庆换流站阀冷系统设备驻站 -安庆武昌220kV变电站220kV江调间隔扩建工程 -香涧-梨花π入固镇南牵引站220kV线路工程 -安徽合肥杜岗Ⅱ220kV开关站新建工程 -国网安徽合肥供电公司2024年220kV板桥变电站一键顺控系统完善提升 -科学城-长岗Ⅰ回π入塘稍变电站110kV架空线路工程 -牛草山风电场-仙河T接黄阳变电站110kV线路 工程 -世袭庄园二期居配工程 -谷岭220kV变电站220kV蕲城电厂、埇南间隔扩建工程 -官塘-燕山π入孝仪变电站220kV线路工程 -甘肃-浙江线路工程施工包1(芜湖市无为市-芜湖市南陵县) -新河-建阳、明都-建阳π入红桥变电站220kV线路工程 -霸王-厉阳T接金河口110kV线路工程 -双港-独秀π入和平变电站220kV线路工程 -程集-牛庄π入阜四变220千伏线路工程 -合州换流站-文都500千伏线路工程 -安庆四-涓桥500kV线路工程(长江大跨越段) -和平-邓村π入双港变电站220kV线路工程 -安徽合肥包河区10kV王郢19开关网架结构优化工程施工 -合肥二电厂-彭郢π入长临河变电站 220kV 线路工程 -安徽合肥肥西-游乐π入华南城变220kV架空线路工程 -安徽阜阳颍上县110kV半岗-润河35kV线路工程 -游乐-南岗、游乐-湖光路T接方兴Ⅱ变电站110kV架空线路工程 -合肥轨道7号线10kV杆线迁改工程 -科学城-长岗(双回T接空港)改接塘稍变电站110kV架空线路工程 -安徽蚌埠濠州220kV变电站220千伏大唐凤阳红心镇光伏间隔扩建工程(电气安装) -余桥-银山220kV线路工程 -六庆城际铁路穿±500kV宜华线改造工程 -魏岗-古井π入祝集110kV线路工程 -灵泗500kV变电站新建工程 -蚌埠大唐滁州电厂220kV送出工程 -国网北京检修公司2024年±500kV延庆换流站直流主设备年度检修维护 +先锋-泉河π入安庆四变电站220kV线路工程(PROJ-2024-0834) +安徽滁州护桥220kV变电站2号主变扩建工程(PROJ-2024-0821) +金牛500kV变电站新建工程(PROJ-2024-0866) +香涧-鹭岛500kV线路工程(淮河大跨越段)(PROJ-2024-0722) +国网北京检修公司2024年±500kV延庆换流站直流主设备及辅助设备不停电检修维护(PROJ-2024-0841) +安徽宿州萧砀500千伏变电站新建工程(建筑部分)(PROJ-2024-0822) +蓼城-冯井π入尧塘变电站110kV线路工程(PROJ-2024-0897) +蚌埠潼河110kV变电站新建工程(PROJ-2024-0774) +龙门500kV变电站间隔扩建工程(调试部分)(PROJ-2025-0043) +包河10kV玉龙18网架结构化工程施工(PROJ-2024-0464) +松滋-安丰220kV线路工程(PROJ-2024-0438) +塔岗-西梁山T接杨柳圩变电站110kV架空线路工程(PROJ-2024-0886) +安庆武昌220kV变电站220kV江调间隔扩建工程(PROJ-2020-0465) +灵泗-奎河220kV线路工程(PROJ-2024-0704) +香涧-梨花220kV线路工程(PROJ-2024-0442) +和襄高速机电工程总承包项目500kV-1100kV特高压电力线路迁建工程(PROJ-2024-1052) +绿雪-莲塘220kV线路工程(PROJ-2024-0274) +香涧-梨花π入固镇南牵引站220kV线路工程(PROJ-2024-0441) +香涧-鹭岛500kV线路工程(一般线路西段)(PROJ-2024-0723) +换流站-金牛500kV线路工程(PROJ-2024-1249) +滁州堰陈110千伏变电站新建工程(PROJ-2024-0820) +安徽河沥500kV变电站3号主变扩建工程(PROJ-2024-0297) +显通-碱河π入凌云变电站220kV电缆线路工程(电缆敷设部分)(PROJ-2025-0038) +安徽合肥包河区10kV王郢19开关网架结构优化工程施工(PROJ-2024-0461) +黄栗树-儒林π入堰陈变电站110kV线路工程(PROJ-2024-0900) +阜四-椿树220千伏线路工程(PROJ-2024-0705) +国网安徽宣城供电公司500kV河沥变加装固定融冰装置(PROJ-2024-1061) +国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造(PROJ-2024-0271) +国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造(PROJ-2024-0271) +安徽阜阳颍上县110kV半岗-润河35kV线路工程(PROJ-2022-0097) +合肥长临河-义兴220kV架空线路工程(PROJ-2022-0112) +安徽合肥义兴220kV变电站新建工程(PROJ-2022-0168) +安庆石化110kV变电站新建 工程(PROJ-2022-0459) +濉淮5379濉洪5380线147#-148#跨阜淮铁路迁改工程(PROJ-2023-0169) +合肥循环园220kV变电站新建工程(PROJ-2023-0224) +金上-湖北线路工程(川12标)(PROJ-2023-0152) +安徽淮北凌云220千伏变电站新建工程(PROJ-2023-0178) +阜四500千伏变电站新建工程(建筑部分)(PROJ-2023-0201) +科学城-长岗(双回T接空港)改接塘稍变电站110kV架空线路工程(PROJ-2023-0060) +蚌埠大唐滁州电厂220kV送出工程(PROJ-2023-0154) +安徽沙河变至原鹿变500kV双回线路开断接入阜四变工程(PROJ-2023-0183) +国网安徽电力营销服务计量用房(PROJ-2023-0216) +显通-碱河π入凌云变电站220kV电缆线路工程(PROJ-2023-0237) +合肥二电厂-彭郢π入长临河变电站220kV线路工程(PROJ-2023-0254) +滁州红桥220kV变电站新建工程(PROJ-2023-0335) +南屏-蓬莱路π入派河变电站110kV线路工程(PROJ-2023-0363) +安庆四-涓桥500kV线路工程(一般线路段)(PROJ-2023-0413) +安徽合肥杜岗220kV开关站新建工程(PROJ-2023-0434) +安徽合肥晶合220kV外部供电工程(合肥杜岗Ⅱ220kV输变电工程)(PROJ-2023-0438) +新河-建阳、明都-建阳π入红桥变电站220kV线路工程(PROJ-2023-0440) +宿州城东220kV变电站新建工程(PROJ-2023-0445) +世袭庄园二期居配工程(PROJ-2023-0281) +安庆城南110kV变电站新建工程(PROJ-2023-0305) +池州电厂二期-涓桥220kV线路工程(PROJ-2023-0325) +阜阳东坡110kV变电站新建工程(PROJ-2023-0336) +孔店-龙门500kV线路增容改造工程(PROJ-2023-0405) +安庆四-涓桥500kV线路工程(长江大跨越段)(PROJ-2023-0412) +合肥二电厂-长临河π入循环园变电站220kV线路工程(PROJ-2023-0255) +众兴-草庙乡牵引站220kV架空线路工程(PROJ-2023-0327) +杨柳220kV变电站220kV南坪间隔扩建工程(PROJ-2023-0389) +安徽合肥下塘220kV变电站新建工程(PROJ-2023-0448) +茗南-熙湖T接城南变电站110kV架空线路工程(PROJ-2023-0287) +陂塘-草庙乡牵引站220kV架空线路工程(PROJ-2023-0326) +祝集220kV变电站新建工程(PROJ-2023-0379) +藕池-漆园π入杨柳变电站220kV线路工程(PROJ-2023-0387) +伯阳-涡阳π入真源变电站220kV线路工程(PROJ-2023-0393) +余桥-银山220kV线路工程(PROJ-2023-0423) +安庆四500kV变电站新建工程(PROJ-2024-0862) +安庆四500kV变电站新建工程(建筑)(PROJ-2023-0446) +安庆银山220kV变电站新建工程(PROJ-2023-0451) +金牛-福渡500kV线路工程(巢湖、无为段)(PROJ-2023-0507) +金牛-福渡500kV线路工程(庐江段)(PROJ-2023-0508) +宁芜铁扩能改造(安徽段)涉及500kV线路跨越宁芜铁路迁改工程(PROJ-2024-0009) +肥西-中心500kV线路工程(电缆部分)(PROJ-2024-0015) +黄阳-仙河110kV线路工程(PROJ-2024-0047) +牛草山风电场-仙河T接黄阳变电站110kV线路 工程(PROJ-2024-0048) +田家庵电厂秦集改接孝仪变电站220kV线路工程(PROJ-2024-0050) +官塘-燕山π入孝仪变电站220kV线路工程(PROJ-2024-0051) +渝北±800千伏换流站工程电气安装A包(PROJ-2024-0057) +谷岭220kV变电站220kV蕲城电厂、埇南间隔扩建工程(PROJ-2023-0466) +淮南至桐城高速公路淮南段500kV电力迁改工程(PROJ-2023-0467) +金牛-紫蓬500kV线路工程(PROJ-2023-0503) +金牛500kV变电站新建工程(建筑)(PROJ-2023-0506) +金牛500kV变电站新建工程(建筑)(PROJ-2023-0506) +灵泗500kV变电站新建工程(PROJ-2023-0544) +国网安徽亳州供电公司运检营销综合用房(PROJ-2024-0002) +沪宁合高铁安徽段500kV清同5737线等2处电力线路迁改工程(PROJ-2024-0003) +肥西-繁昌Ⅰ、Ⅱ回500kV线路改造工程(PROJ-2024-0012) +肥西-中心500kV线路工程(架空部分)(PROJ-2024-0014) +陶楼-下塘、陶楼-航锂(凯博)π入下塘变电站220kV电缆线路工程(PROJ-2024-0018) +安徽阜阳阜四500kV变电站新建工程(PROJ-2024-0041) +杨柳-南坪改接至双堆集牵引站220kV线路工程(PROJ-2024-0059) +南坪-双堆集牵引站220kV线路工程(PROJ-2024-0060) +龙门500kV变电站间隔扩建工程(PROJ-2024-0063) +蚌埠孝仪220kV变电站新建工程(建筑安装部分)(PROJ-2024-0072) +蚌埠孝仪220kV变电站新建工程(建筑安装部分)(PROJ-2024-0072) +游乐-南岗、游乐-湖光路T接方兴Ⅱ变电站110kV架空线路工程(PROJ-2024-0084) +游乐-南岗、游乐-湖光路T接方兴Ⅱ变电站110kV电缆线路工程(PROJ-2024-0085) +合肥金牛-庐江π入庐江北变电站220KV线路工程(PROJ-2024-0088) +耿皇-焦楼220kV线路工程(PROJ-2024-0091) +安徽合肥方兴II110kV变电站新建工程(PROJ-2024-0096) +文昌宫-淮北西牵引站220kV线路工程(PROJ-2024-0106) +国网安徽合肥供电公司2024年220kV板桥变电站一键顺控系统完善提升(PROJ-2024-0123) +杨柳四铺π入况楼变110kV电缆线路工程(PROJ-2024-0126) +华南城220kV变电站新建工程(PROJ-2024-0129) +寨西-苦竹溪T接金桥变电站110kV线路工程(PROJ-2024-0140) +中心500kV变电站新建工程(A包)(PROJ-2024-0175) +马鞍山郑蒲220kV变电站新建工程(PROJ-2024-0181) +马鞍山金河口110kV变电站新建工程(PROJ-2024-0182) +马鞍山横龙110kV变电站新建工程(PROJ-2024-0183) +显通-白杨(T接刘桥)、显通-溪河(T接刘桥)π入凌云变电站110kV架空线路工程(PROJ-2024-0201) +夏湖-华都改接入真源变电站110kV线路工程(PROJ-2024-0207) +魏岗-古井π入祝集110kV线路工程(PROJ-2024-0215) +桐城-独秀π入双港变电站220kV线路工程(PROJ-2024-0216) +安徽马鞍山当涂-万济220kV线路工程(PROJ-2024-0221) +安徽马鞍山围屏-万济220kV线路工程(PROJ-2024-0222) +霸王-厉阳T接金河口110kV线路工程(PROJ-2024-0224) +苍山-横龙110kV架空线路工程(PROJ-2024-0225) +亳州城北110kV变电站新建工程(PROJ-2024-0238) +银联黄山园区220kV变电站工程(PROJ-2024-0256) +芜湖潘坛220kV变电站新建工程(PROJ-2024-0257) +陕北~安徽±800千伏特高压直流输电工程受端换流站四通一平工程(PROJ-2024-0100) +庐北220kV变电站新建工程(PROJ-2024-0113) +国网北京检修公司2024年±500kV延庆换流站直流主设备年度检修维护(PROJ-2024-0124) +况楼-杨柳220kV线路工程(PROJ-2024-0125) +谯城500千伏变电站新建工程(建筑)(PROJ-2024-0133) +安庆双港220kV变电站新建工程(PROJ-2024-0136) +安徽合肥肥西-游乐π入华南城变220kV架空线路工程(PROJ-2024-0718) +伯阳-谯城500kV线路工程(PROJ-2024-0143) +安徽合肥铭传-华南城220kV线路工程(PROJ-2024-0146) +安徽合肥肥西-游乐π入华南城变220kV架空线路工程(PROJ-2024-0147) +香涧-鹭岛500kV线路工程(淮河大跨越段)综合试桩(PROJ-2024-0150) +合肥中心变B包(PROJ-2024-0176) +芦集-古沟π入潘集变电站220kV线路工程(PROJ-2024-0189) +陕北-安徽±800kV特高压直流输电线路工程(皖2标)(PROJ-2024-0203) +魏武-桐花π入祝集变电站110kV线路工程(PROJ-2024-0214) +和平-邓村π入双港变电站220kV线路工程(PROJ-2024-0217) +双港-独秀π入和平变电站220kV线路工程(PROJ-2024-0218) +独秀-谭桥牵引站π入和平变电站220kV线路工程(PROJ-2024-0219) +黄山巷联-水西220kV线路工程(PROJ-2024-0220) +含山-环峰T接横龙110kV架空线路工程(PROJ-2024-0227) +伯阳500千伏变电站220千伏间隔扩建工程(PROJ-2024-0239) +蕴山-沙埂110kV线路工程(PROJ-2024-0245) +淮南芦集220千伏变电站220千伏配电装置改造工程(PROJ-2024-0265) +安徽宣城莲塘-敬亭220kV线路改造工程(PROJ-2024-0906) +无人机智能巡检技术实验室项目(PROJ-2024-1213) +安徽蚌埠濠州220kV变电站220千伏大唐凤阳红心镇光伏间隔扩建工程(电气安装)(PROJ-2024-0794) +国网北京检修公司2024年±500kV延庆换流站阀冷系统设备驻站(PROJ-2024-0849) +中心500kV变电站新建工程(A包)(调试部分)(PROJ-2025-0033) +锁库500kV变电站新建工程(PROJ-2024-0275) +祝集220kV变电站新建工程(调试部分)(PROJ-2024-1188) +淮南安丰220千伏变电站新建工程(PROJ-2024-0456) +合肥轨道7号线10kV杆线迁改工程(PROJ-2021-0037) +陕北-安徽±800千伏特高压直流输电工程陶大庄村接地极工程(PROJ-2024-0773) +安庆-龙山π入安庆四变电站220kV线路工程(PROJ-2024-0835) +阜阳太和城南110kV变电站新建工程(PROJ-2024-0301) +安徽合肥方兴II110kV变电站新建工程(调试部分)(PROJ-2025-0016) +国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造(调试部分)(PROJ-2025-0053) +国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造(调试部分)(PROJ-2025-0053) +安庆四500kV变电站新建工程(调试部分)(PROJ-2025-0044) +章塘-邰桥、石桥-邰桥π入万济变电站110kV线路工程(PROJ-2024-0889) +谢桥电厂-原鹿220kV线路工程(PROJ-2024-0785) +六庆城际铁路穿±500kV宜华线改造工程(PROJ-2024-1247) +安徽淮北凌云220千伏变电站新建工程(调试部分)(PROJ-2025-0004) +国网安徽安庆供电公司500kV双岭变电站加装固定融冰装置(调试部分)(PROJ-2025-0084) +国网安徽淮北供电公司500kV濉溪变电站1号主变5022电流互感器改造(PROJ-2024-1271) +马鞍山横龙110kV变电站新建工程(调试部分)(PROJ-2025-0086) +甘肃-浙江±800千伏特高压直流输电线路工程(皖3标段)(PROJ-2024-1162) +六安汤池 110kV 变电站新建工程(PROJ-2024-0912) +芜湖福渡-蛟矶220kV线路工程(PROJ-2024-1230) +月桥-火龙岗π入高村变电站220kV线路工程(PROJ-2024-0923) +杨柳220kV变电站220kV南坪间隔扩建工程(调试部分)(PROJ-2025-0020) +芜湖高村220kV变电站新建工程(PROJ-2024-0790) +国网安徽合肥供电公司2024年500kV肥西变电站一键顺控系统完善提升(PROJ-2024-0772) +安徽滁州清流-环漪220kV线路改造工程(PROJ-2024-0793) +太和-李腰π入城南变电站110kV架空线路工程(PROJ-2024-0709) +金牛500kV变电站新建工程(调试部分)(PROJ-2025-0032) +岩歙220kV变电站新建工程(PROJ-2024-0815) +合州换流站-文都500千伏线路工程(PROJ-2024-1089) +芜湖江北-通江π入蛟矶变电站220kV线路工程(PROJ-2024-1231) +广德-敬亭π入桂花(广五)变220kV线路工程(PROJ-2024-0272) +白莲-邵岗π入尧塘变电站35kV架空线路工程(PROJ-2024-0899) +程集-牛庄π入阜四变220千伏线路工程(PROJ-2024-0708) +安徽滁州护桥220kV变电站2号主变扩建工程(调试部分)(PROJ-2025-0041) +安徽六安春秋塘-山七π入汤池变电站110kV线路工程(PROJ-2024-0932) +安徽官山-涓桥I、II回π入池州二变500千伏线路工程(PROJ-2024-1060) +陕北-安徽直流工程合州±800千伏换流站土建A包(PROJ-2024-0312) +石岗-施桥110kV线路工程(PROJ-2024-0276) +国网安徽宣城供电公司500kV河沥变加装固定融冰装置(调试部分)(PROJ-2025-0087) +香涧-鹭岛500kV线路工程(一般线路东段)(PROJ-2024-0725) +滁州红桥220kV变电站新建工程(调试部分)(PROJ-2024-1191) +围屏-石桥π入万济变电站110kV线路工程(PROJ-2024-0888) +汤池-河棚35kV架空线路工程(PROJ-2024-0934) +汤庄-平圩500kV线路工程(PROJ-2024-1258) +芜湖站1000千伏1号主变A相局放配合项目(PROJ-2025-0057) +韦寨-范兴集π入阜四变电站220kV线路工程(PROJ-2024-0707) +埇桥-萧砀Ⅰ回500千伏线路工程(PROJ-2024-0924) +紫蓬500kV变电站间隔扩建工程(PROJ-2024-0868) +安徽阜阳薛桥-花园220kV线路改造工程(PROJ-2024-1195) +国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造(电缆安装)(PROJ-2025-0037) +国网安徽马鞍山供电公司220kV恒兴变电站220kV配电装置改造(电缆安装)(PROJ-2025-0037) +包河10kV延安30与兴集18网架结构优化工程施工(PROJ-2024-0459) +国网安徽马鞍山供电公司500kV峨廻5904线#92等拉线杆塔改造工程(PROJ-2024-1241) +国网安徽安庆供电公司500kV双岭变电站加装固定融冰装置(PROJ-2024-1064) +况楼220kV变电站间隔扩建工程(PROJ-2024-0465) +芜湖抖音220kV线路涉500kV峨峰5914、峨廻5904线改造工程(PROJ-2024-0946) +杨柳圩110kV变电站110kV配电装置改造工程(PROJ-2024-1040) +马鞍山万济220kV变电站新建工程(PROJ-2024-0455) +马鞍山金河口110kV变电站新建工程(调试部分)(PROJ-2025-0011) +安徽河沥500kV变电站3号主变扩建工程(调试部分)(PROJ-2025-0085) +宣城中港110kV变电站新建工程(PROJ-2024-0816) +灵泗500kV变电站新建工程(调试部分)(PROJ-2024-1183) +芜湖蛟矶220kV变电站新建工程(PROJ-2024-1036) +埇桥-萧砀Ⅱ回500千伏线路工程(PROJ-2024-0925) \ No newline at end of file diff --git a/api/utils.py b/api/utils.py index 5f1bb47..3b5a667 100644 --- a/api/utils.py +++ b/api/utils.py @@ -1,19 +1,276 @@ from enum import Enum -def load_standard_name(file_path:str): + +from rapidfuzz import process, fuzz +import re +import json +from pypinyin import lazy_pinyin + +# 数字转换表(1-20,常见数字) +digit_to_chinese = { + "1": "一", "2": "二", "3": "三", "4": "四", "5": "五", + "6": "六", "7": "七", "8": "八", "9": "九", "10": "十", + "11": "十一", "12": "十二", "13": "十三", "14": "十四", + "15": "十五", "16": "十六", "17": "十七", "18": "十八", + "19": "十九", "20": "二十" +} + +def arabic_to_chinese_number(text): + """ + 将文中阿拉伯数字转换为中文数字 + :param text: 输入文本 + :return: 转换后的文本 + """ + cn_to_arabic = {'一': '1', '二': '2', '三': '3', '四': '4', '五': '5', + '六': '6', '七': '7', '八': '8', '九': '9', '零': '0'} + arabic_to_cn = {v: k for k, v in cn_to_arabic.items()} # 反向映射 + + for num, cn in arabic_to_cn.items(): + text = text.replace(num, cn) + + return text +def text_to_pinyin(text): + """将文本转换为拼音字符串""" + return ''.join(lazy_pinyin(text)) + +def load_standard_data(path): + with open(path, "r", encoding="utf-8") as f: + return json.load(f) + + +def extract_number(text): + """ + 提取项目部中的数字(支持阿拉伯数字和中文数字),并转换为统一格式(中文数字)。 + """ + match = re.search(r'(第?[一二三四五六七八九十百千零\d]+)', text) + if match: + num_str = match.group(1).replace("第", "") + if num_str.isdigit(): + return digit_to_chinese.get(num_str, num_str) # 阿拉伯数字转中文 + return num_str # 中文数字直接返回 + return None + + +def standardize_company_and_project(input_company, input_project, standard_data): + """ + 将口语化的公司名和项目部名转换为标准化名称。 + + 参数: + input_company (str): 用户输入的公司名(可能是口语化或不完整的名称)。 + input_project (str): 用户输入的项目部名(可能是口语化或不完整的名称)。 + standard_data (dict): 标准化的公司名和项目部名数据,格式为 {公司名: [项目部名1, 项目部名2, ...]}。 + + 返回: + tuple: (标准化公司名, 匹配的项目部名列表)。如果无法匹配,返回 (None, None)。 + """ + # **1. 标准化公司名** + company_match = process.extractOne(input_company, standard_data.keys(), scorer=fuzz.ratio) + if not company_match or company_match[1] < 65: # 相似度低于 70 可能匹配错误 + return None, None + standard_company = company_match[0] + + # **2. 先尝试直接匹配最相似的项目名** + project_match = process.extractOne(input_project, standard_data[standard_company], scorer=fuzz.ratio) + print(f"项目部名称最相似:{project_match[0]},{project_match[1]}", flush=True) + if project_match and project_match[1] >= 86: + return standard_company, [project_match[0]] # 直接返回匹配的项目名 + + # **3. 提取项目部的数字部分** + query_number = extract_number(input_project) + + # **4. 过滤所有符合数字的项目部** + matched_projects = [] + for project in standard_data[standard_company]: + project_number = extract_number(project) + if query_number and query_number == project_number: + matched_projects.append(project) + + return standard_company, matched_projects + +def standardize_company_and_projectDepartment(input_company, input_project, origianl_company_list , company_project_department_map, company_pinyin_to_original_map = None): + """ + 将口语化的公司名和项目部名转换为标准化名称。 + + 参数: + input_company (str): 用户输入的公司名(可能是口语化或不完整的名称)。 + input_project (str): 用户输入的项目部名(可能是口语化或不完整的名称)。 + company_project_department_map (dict): 标准化的公司名和项目部名数据,格式为 {公司名: [项目部名1, 项目部名2, ...]}。 + pinyin_to_original_map:分公司拼音和分公司原始名的映射 + + 返回: + tuple: (标准化公司名, 匹配的项目部名列表)。如果无法匹配,返回 (None, None)。 + """ + try: + # **1. 标准化公司名** + best_company_match = multiple_standardize_single_name(input_company, origianl_company_list,list(company_pinyin_to_original_map.keys()),company_pinyin_to_original_map,60,85,True) + + if not best_company_match: + return None, None + else: + standard_company = best_company_match[0] + + # **2. 先尝试直接匹配最相似的项目名** + project_match = process.extract(input_project, company_project_department_map[standard_company], scorer=fuzz.token_sort_ratio, limit=len(company_project_department_map[standard_company])) + # project_match = process.extractOne(input_project, company_project_department_map[standard_company], scorer=fuzz.ratio) + print(f"项目部名称最相似:{project_match[0]},{project_match[1]}", flush=True) + if project_match and project_match[1] >= 86: + return standard_company, [project_match[0]] # 直接返回匹配的项目名 + + # **3. 提取项目部的数字部分** + query_number = extract_number(input_project) + + # **4. 过滤所有符合数字的项目部** + matched_projects = [] + for project in company_project_department_map[standard_company]: + project_number = extract_number(project) + if query_number and query_number == project_number: + matched_projects.append(project) + + return standard_company, matched_projects + except Exception as e: + print(f"standardize_company_and_projectDepartment:{e}", flush=True) + return None,None + +#弃用 +def standardize_single_name(input_name, name_list, lower_score=70, high_score=85): + """ + 将输入的名称(可能是口语化或不完整的名称)转换为标准化名称。 + + 参数: + input_name (str): 用户输入的名称(可能是口语化或不完整的名称)。 + name_list (list): 标准化的名称列表。 + lower_score (int): 匹配的最低相似度阈值,默认值为 70。 + high_score (int): 匹配的高置信度阈值,默认值为 85。 + + 返回: + list: 匹配的标准化名称列表。如果未找到匹配项,返回 None。 + """ + match_results = process.extract(input_name, name_list, scorer=fuzz.token_sort_ratio, limit=len(name_list)) + + # 找到所有相似度 > 80 的匹配项 + high_confidence_matches = [(match[0], match[1]) for match in match_results if match[1] > lower_score] + print(f"standardize_single_name, high_confidence_matches:{high_confidence_matches}", flush=True) + if not high_confidence_matches: + return None # 没有找到匹配项 + # 返回匹配结果 + + best_match = max(high_confidence_matches, key=lambda x: x[1], default=None) + + print(f"best_match: {best_match}", flush=True) + if best_match and best_match[1] >= high_score: + return [best_match[0]] # 直接返回最高相似度的单个匹配项 + + return [match[0] for match in high_confidence_matches] + + +def multiple_standardize_single_name(origin_input_name, origin_name_list, pinyin_name_list = None, pinyin_to_original_map = None, lower_score=70, high_score=85, isArabicNumConv = False): + """ + 使用拼音 + rapidfuzz 进行关键词模糊匹配,并返回原始的标准名 + :param input_name: 口语化的名称(中文) + :param name_list: 关键词列表(中文) + :pinyin_name_list: 关键词列表(拼音) + :param pinyin_to_original_map: 拼音到原始标准名的映射 + :param lower_score: 低匹配分数阈值(默认70) + :param high_score: 高匹配分数阈值(默认85) + :return: 最匹配的原始关键词,或 None + """ + #First round, 原始标准名的匹配性查找,能找到直接返回 + if isArabicNumConv: + origin_input_name = arabic_to_chinese_number(origin_input_name) + + match_results = process.extract(origin_input_name, origin_name_list, scorer=fuzz.token_sort_ratio, limit=len(origin_name_list)) + + # 找到所有相似度 > 80 的匹配项 + original_high_confidence_matches = [(match[0], match[1]) for match in match_results if match[1] >= lower_score] + print(f"standardize_pinyin_single_name 原始名匹配, high_confidence_matches:{original_high_confidence_matches[:3]}", flush=True) + + combined_low_confidence_matches = [] + if original_high_confidence_matches: + origin_best_match = max(original_high_confidence_matches, key=lambda x: x[1], default=None) + + # 直接返回最高相似度的单个匹配项 + # print(f"原始名匹配: {origin_best_match}", flush=True) + if origin_best_match and origin_best_match[1] >= high_score: + return [origin_best_match[0]] + + else: + combined_low_confidence_matches = [match[0] for match in original_high_confidence_matches[:3]] + else: + if not pinyin_name_list or not pinyin_to_original_map: + return None # + + #第二轮, 拼音名的匹配性查找,能找到直接返回 + pinyin_input_name = text_to_pinyin(origin_input_name) + match_results = process.extract(pinyin_input_name, pinyin_name_list, scorer=fuzz.ratio, limit=len(pinyin_name_list)) + + # 筛选出匹配分数 > lower_score 的结果 + pinyin_high_confidence_matches = [(match[0], match[1]) for match in match_results if match[1] >= lower_score] + print(f"standardize_pinyin_single_name 拼音匹配, input_name:{pinyin_input_name}, high_confidence_matches:{pinyin_high_confidence_matches[:3]}", flush=True) + + if not pinyin_high_confidence_matches: + return combined_low_confidence_matches # 没有找到匹配项 + + # 选择最高相似度的匹配项 + pinyin_best_match = max(pinyin_high_confidence_matches, key=lambda x: x[1], default=None) + + if pinyin_best_match and pinyin_best_match[1] >= high_score: + return [pinyin_to_original_map[pinyin_best_match[0]]] # 直接返回最高相似度的原始工程名 + + combined_low_confidence_matches.extend( + [pinyin_to_original_map[match[0]] for match in pinyin_high_confidence_matches[:3]] + ) + # 返回所有匹配项对应的原始名,最多返回最低匹配项的前5个 + return list(dict.fromkeys(combined_low_confidence_matches)) + +def generate_project_prompt(matched_projects, original_name = "", type="项目部名"): + """ + 生成提示信息,用于让用户确认匹配的项目名或分公司名或项目名。 + + 参数: + matched_projects (list): 匹配的项目或分公司名称列表。 + type (str): 提示信息的类型(例如 "项目名" 或 "分公司名"),默认值为 "项目名"。 + + 返回: + str: 生成的提示信息。如果未找到匹配项,返回提示用户提供更准确信息的字符串。 + """ + if not matched_projects: + return f"未找到匹配的{type}:{original_name},请提供更准确的{type}信息。" + + prompt = f"您说的{type}可能是:" + for idx, project in enumerate(matched_projects, start=1): + prompt += f"第{idx}个: {project}," + + prompt += "请确认您要选择哪一个?" + return prompt + + +def load_standard_name(file_path: str): + """ + 从指定文件中加载标准化的名称列表。 + + 参数: + file_path (str): 文件路径,文件应包含标准化的名称列表,每行一个名称。 + + 返回: + list: 从文件中读取的标准化名称列表。 + + 异常: + FileNotFoundError: 如果文件不存在,抛出此异常。 + Exception: 如果读取文件时发生其他错误,抛出此异常。 + """ try: with open(file_path, 'r', encoding='utf-8') as file: lines = [line.strip() for line in file if line.strip()] return lines except FileNotFoundError: - print(f"错误:文件 {file_path} 不存在") + print(f"错误:文件 {file_path} 不存在", flush=True) raise FileNotFoundError(f"错误:文件 {file_path} 不存在") except Exception as e: - print(f"读取文件时发生错误:{e}") + print(f"读取文件时发生错误:{e}", flush=True) raise Exception(f"错误:文件 {file_path} 不存在") class CheckResult(Enum): - NO_MATCH = 0 # 不符合检查条件 + NO_MATCH = 0 # 不符合检查条件 MATCH_FOUND = 1 # 匹配到了值 NEEDS_MORE_ROUNDS = 2 # 需要多轮 diff --git a/ernie/data.yaml b/ernie/data.yaml index 6fe40c2..edc2f31 100644 --- a/ernie/data.yaml +++ b/ernie/data.yaml @@ -1,8 +1,9 @@ -model_path: E:\workingSpace\PycharmProjects\ernie\models\ernie-3.0-tiny-base-v2-zh #模型地址 -train: E:\workingSpace\PycharmProjects\ernie\ernie\data\train.json # 训练集路径 -val: E:\workingSpace\PycharmProjects\ernie\ernie\data\val.json # 验证集路径 -test: E:\workingSpace\PycharmProjects\ernie\ernie\data\test.json # (可选) 测试集路径 +model_path: ../models/ernie-3.0-tiny-base-v2-zh #模型地址 +train: ./data/train.json # 训练集路径 +val: ./data/val.json # 验证集路径 +test: ./data/test.json # (可选) 测试集路径 # 类别信息 -nc: 12 # 目标类别数 -labels: ["天气查询","页面切换","日计划数量查询","周计划数量查询","日计划作业内容","周计划作业内容","施工人数","作业考勤人数","知识问答","通用对话"] # 类别名称 +nc: 13 # 目标类别数 +labels: ["天气查询","互联网查询","页面切换","日计划数量查询","周计划数量查询","日计划作业内容","周计划作业内容", + "施工人数","作业考勤人数","知识问答","通用对话","作业面查询","班组人数查询","班组数查询","作业面内容","班组详情"] # 类别名称 diff --git a/generated_data/generated.py b/generated_data/generated.py index 5e27c52..e192cd3 100644 --- a/generated_data/generated.py +++ b/generated_data/generated.py @@ -11,24 +11,30 @@ if not os.path.exists(directory): # 基础数据定义 BASE_DATA = { # 实施组织 - "implementation_organizations": ["送电一分公司", "送电二分公司", "变电分公司", "消防分公司"], + "implementation_organizations": ["宏源电力建设公司(变电)", "送一分公司", "变电分公司", "消防分公司", "安徽宏源电力建设有限公司(线路)", "检修试验分公司"], # 工程性质 "project_types": ["基建", "技改大修", "用户工程", "小型基建"], # 工程名 "project_names": [ + "中心变", "1号工程", - "淮南芦集改造工程(线路部分)", - "第十号工程(变电部分)", - "合肥二电厂220kV线路工程", + "国网供电公司220kV恒兴变电站220kV配电装置改造(调试部分)", + "安徽蚌埠濠州220kV变电站220千伏大唐凤阳红心镇光伏间隔扩建工程(电气安装)" + "滁州堰陈110千伏变电站新建工程", + "安徽蚌埠濠州220kV变电站220千伏大唐凤阳红心镇光伏间隔扩建工程(电气安装)(PROJ-2024-0794)", + "金牛500kV变电站新建工程(建筑)(PROJ-2023-0506)", + "谷岭220kV变电站220kV蕲城电厂、埇南间隔扩建工程(PROJ-2023-0466)", + "渝北±800千伏换流站工程电气安装A包(PROJ-2024-0057)", "九号工程", - "阜四500千伏变电站新建工程(建筑部分)", - "涓桥500kV线路工程(长江大跨越段)" + "合州变电站", + "合州换流站" ], # 建管单位 "construction_units": ["国网安徽省电力有限公司建设分公司", "国网安徽省电力有限公司马鞍山供电公司", "中铁二局集团电务工程有限公司"], # 项目部名称 - "project_departments": ["第9项目管理部", "金上第十一项目部", "第八项目管理部", "肥东9号项目部","金上第一项目部管理部 (池州黄山)","第一项目部管理部 (肥东)"], + "project_departments": ["调试一队", "第9项目管理部", "金上第十一项目部", "第八项目管理部(合肥)", "肥东9号项目部", + "金上第一项目部管理部(池州黄山)", "第一项目部管理部(肥东)", "调试四队"], # 项目经理 "project_managers": ["陈少平项目经理", "范文立项目经理", "何东洋项目经理"], # 分包单位 @@ -42,7 +48,8 @@ BASE_DATA = { # 8+2工况 "operatings": ["8+2工况", "8加2工况"], # 页面切换 - "pages": ["风险管控", "日计划", "周风险", "日计划统计报表", "日计划推送","生产管控中心","考勤统计详情","今日作业计划","周风险统计报表","周风险推送"] + "pages": ["风险管控", "日计划", "周风险", "日计划统计报表", "日计划推送", "生产管控中心", "考勤统计详情", + "今日作业计划", "周风险统计报表", "周风险推送"] } @@ -62,63 +69,102 @@ TEMPLATE_CONFIG = { ("{date}工程性质为{project_type}的有多少条作业计划?", ["date", "project_type"]), ("公司工程性质为{project_type}{date}有多少作业计划?", ["project_type", "date"]), ("工程性质为{project_type}{date}有多少项作业计划?", ["project_type", "date"]), - ("查询{project_name}在{date}的作业计划数量", ["project_name", "date"]), - ("{date}{project_type}类作业计划有多少?", ["date", "project_type"]), - ("{project_type}类{date}作业计划有多少?", ["project_type", "date"]), - ("{construction_unit}在{date}有多少作业计划?", ["construction_unit", "date"]), - ("{construction_unit}在{date}有多少项作业计划?", ["construction_unit", "date"]), - ("{date}{construction_unit}有多少作业计划?", ["date", "construction_unit"]), - ("{date}公司有多少项作业计划?", ["date"]), - ("{date}有多少条作业计划?", ["date"]), - ("公司{date}有多少作业计划?", ["date"]), - ("{date}属于{operating}有多少项作业计划?", ["date", "operating"]), - ("{date}公司属于{operating}有多少项作业计划?", ["date", "operating"]), - ("{date}{implementation_organization}{project_department}有多少项作业计划?", - ["date", "implementation_organization", "project_department"]), - ("{implementation_organization}{project_department}{date}有多少条作业计划?", - ["implementation_organization", "project_department", "date"]), - ("{date}{implementation_organization}有多少项作业计划?", ["date", "implementation_organization"]), - ("{date}公司{project_department}有多少作业计划?", ["date", "project_department"]), - ("{date}{project_department}有多少项作业计划?", ["date", "project_department"]), - ("公司{project_department}{date}有多少项{risk_level}风险作业计划?", ["project_department", "date", "risk_level"]), - ("{project_department}{date}有多少项{risk_level}风险作业计划?", ["project_department", "date", "risk_level"]), - ("{project_department}{date}有多少{risk_level}风险作业计划?", ["project_department", "date", "risk_level"]), + ("查询{project_name}在{date}的作业计划数量", ["project_name", "date"]), + ("{date}{project_type}类作业计划有多少?", ["date", "project_type"]), + ("{project_type}类{date}作业计划有多少?", ["project_type", "date"]), + ("{construction_unit}在{date}有多少作业计划?", ["construction_unit", "date"]), + ("{construction_unit}在{date}有多少项作业计划?", ["construction_unit", "date"]), + ("{date}{construction_unit}有多少作业计划?", ["date", "construction_unit"]), + ("{date}公司有多少项作业计划?", ["date"]), + ("{date}有多少条作业计划?", ["date"]), + ("公司{date}有多少作业计划?", ["date"]), + ("{date}{operating}有多少项作业计划?", ["date", "operating"]), + ("{date}公司{operating}有多少项作业计划?", ["date", "operating"]), + ("{date}{implementation_organization}{project_department}有多少项作业计划?", + ["date", "implementation_organization", "project_department"]), + ("{date}{project_department}{implementation_organization}有多少项作业计划?", + ["date", "project_department", "implementation_organization"]), + ("{implementation_organization}{project_department}{date}有多少条作业计划?", + ["implementation_organization", "project_department", "date"]), + ("{date}{implementation_organization}有多少项作业计划?", ["date", "implementation_organization"]), + ("{date}公司{project_department}有多少作业计划?", ["date", "project_department"]), + ("{date}{project_department}{implementation_organization}有多少作业计划?", + ["date", "project_department", "implementation_organization"]), + ("{date}{project_department}有多少项作业计划?", ["date", "project_department"]), + ("公司{project_department}{date}有多少项{risk_level}风险作业计划?", + ["project_department", "date", "risk_level"]), + ("{project_department}{date}有多少项{risk_level}风险作业计划?", + ["project_department", "date", "risk_level"]), + ("{project_department}{date}有多少{risk_level}风险作业计划?", ["project_department", "date", "risk_level"]), - ("{date}{project_manager}有多少项作业计划?", ["date", "project_manager"]), - ("{date}{subcontractor}有多少条作业计划?", ["date", "subcontractor"]), - ("{date}{team_leader}有多少作业计划?", ["date", "team_leader"]), - ("{date}风险等级为{risk_level}的作业计划有多少?", ["date", "risk_level"]), - ("{date}公司{project_department}有多少{risk_level}风险作业计划?", ["date", "project_department", "risk_level"]), + ("{date}{project_manager}作业计划是多少?", ["date", "project_manager"]), + ("{date}{subcontractor}有多少条作业计划?", ["date", "subcontractor"]), + ("{date}{team_leader}有多少作业计划?", ["date", "team_leader"]), + ("{date}风险等级为{risk_level}的作业计划有多少?", ["date", "risk_level"]), + ("{date}公司{project_department}有多少{risk_level}风险作业计划?", + ["date", "project_department", "risk_level"]), ("{date}{project_department}有多少{risk_level}风险作业计划?", ["date", "project_department", "risk_level"]), ("{date}{project_type}类风险等级为{risk_level}的作业计划有多少?", ["date", "project_type", "risk_level"]), - ("{date}{construction_unit}有多少{risk_level}风险作业计划?", ["date", "construction_unit", "risk_level"]), + ("{date}{construction_unit}有多少{risk_level}风险作业计划?", ["date", "construction_unit", "risk_level"]), - ("{date}{project_type}类{construction_unit}负责的作业计划有多少?", - ["date", "project_type", "construction_unit"]), - ("{date}{project_type}类{implementation_organization}组织实施的作业计划有多少?", - ["date", "project_type", "implementation_organization"]), - ("{date}{project_department}管理的{project_type}类作业计划有多少?", - ["date", "project_department", "project_type"]), - ("{date}{subcontractor}承包的{project_type}类作业计划有多少?", ["date", "subcontractor", "project_type"]), - ("{date}{project_manager}负责的{project_type}类作业计划有多少?", - ["date", "project_manager", "project_type"]), - ("{date}{team_leader}带领的{project_type}类作业计划有多少?", ["date", "team_leader", "project_type"]), - ("{date}{project_name}由{project_manager}作业计划有多少?", ["date", "project_name", "project_manager"]), - ("{date}{project_name}中,风险等级为{risk_level}的作业计划有多少?", ["date", "project_name", "risk_level"]), - ("{date}{project_manager}作业计划有多少?", ["date", "project_manager"]), - ("{project_manager}在{date}作业计划有多少?", ["project_manager", "date"]), + ("{date}存在{risk_level}风险的有多少", ["date", "risk_level"]), + ("{implementation_organization}{date}{risk_level}风险的有多少", ["implementation_organization","date", "risk_level"]), + ("{implementation_organization}{date}存在{risk_level}风险的有多少", ["implementation_organization","date", "risk_level"]), - ("{date}{implementation_organization}{project_manager}的作业计划数量", - ["date", "implementation_organization", "project_manager"]), - ("{implementation_organization}{project_manager}在{date}的作业计划数量", - ["implementation_organization", "project_manager", "date"]), + ("{date}{project_type}类{construction_unit}负责的作业计划有多少?", + ["date", "project_type", "construction_unit"]), + ("{date}{project_type}类{implementation_organization}组织实施的作业计划有多少?", + ["date", "project_type", "implementation_organization"]), + ("{date}{project_department}管理的{project_type}类作业计划有多少?", + ["date", "project_department", "project_type"]), + ("{date}{subcontractor}承包的{project_type}类作业计划有多少?", ["date", "subcontractor", "project_type"]), + ("{date}{project_manager}负责的{project_type}类作业计划有多少?", + ["date", "project_manager", "project_type"]), + ("{date}{team_leader}带领的{project_type}类作业计划有多少?", ["date", "team_leader", "project_type"]), + ("{date}{project_name}由{project_manager}作业计划有多少?", ["date", "project_name", "project_manager"]), + ("{date}{project_name}中,风险等级为{risk_level}的作业计划有多少?", ["date", "project_name", "risk_level"]), + ("{date}{project_manager}作业计划有多少?", ["date", "project_manager"]), + ("{project_manager}在{date}作业计划有多少?", ["project_manager", "date"]), - # 班组 - ("{date}{team_name}有多少项作业计划?", ["date", "team_name"]), - ("{team_name}{date}有多少作业计划?", ["team_name", "date"]), - ("{team_name}{date}有多少条作业计划?", ["team_name", "date"]), - ("{team_name}{date}作业计划数量", ["team_name", "date"]), - ("{date}{team_name}作业计划数量", ["date", "team_name"]) + ("{date}{implementation_organization}{project_manager}的作业计划数量", + ["date", "implementation_organization", "project_manager"]), + ("{implementation_organization}{project_manager}在{date}的作业计划数量", + ["implementation_organization", "project_manager", "date"]), + + # 班组 + ("{date}{team_name}有多少项作业计划?", ["date", "team_name"]), + ("{team_name}{date}有多少作业计划?", ["team_name", "date"]), + ("{team_name}{date}有多少条作业计划?", ["team_name", "date"]), + ("{team_name}{date}作业计划数量", ["team_name", "date"]), + ("{date}{team_name}作业计划数量", ["date", "team_name"]), + #作业 + ("{date}{implementation_organization}{project_department}有多少作业?", + ["date", "implementation_organization", "project_department"]), + ("{implementation_organization}{project_department}{date}有多少条作业?", + ["implementation_organization", "project_department", "date"]), + ("{date}{project_department}{implementation_organization}有多少作业?", + ["date", "project_department", "implementation_organization"]), + ("{project_department}{implementation_organization}{date}有多少条作业?", + ["project_department", "implementation_organization", "date"]), + + ("{date}{implementation_organization}有多少项作业?", ["date", "implementation_organization"]), + ("{date}公司{project_department}有多少作业?", ["date", "project_department"]), + ("{date}{project_department}有多少项作业?", ["date", "project_department"]), + #有多少 + ("{date}{implementation_organization}{project_department}有多少?", + ["date", "implementation_organization", "project_department"]), + ("{project_department}{implementation_organization}{date}有多少?", + ["project_department", "implementation_organization", "date"]), + ("{date}{implementation_organization}有多少?", ["date", "implementation_organization"]), + ("{date}公司{project_department}有多少?", ["date", "project_department"]), + ("{date}{project_department}有多少?", ["date", "project_department"]), + ("{date}{project_name}有多少", ["date", "project_name"]), + ("{project_name}{date}有多少", ["project_name", "date"]), + ("{date}公司{project_name}有多少?", ["date", "project_name"]), + ("{date}工程性质是{project_type}有多少", ["project_type", "date"]), + ("工程性质是{project_type}{date}有多少", ["project_type", "date"]), + ("{date}存在{operating}的有多少", ["date", "operating"]), + ("{date}{operating}的有多少", ["date", "operating"]), ] }, @@ -138,7 +184,9 @@ TEMPLATE_CONFIG = { ("{date}{construction_unit}作业计划有多少?", ["date", "construction_unit"]), ("{date}{implementation_organization}作业计划有多少?", ["date", "implementation_organization"]), ("{date}{implementation_organization}{project_department}作业计划有多少?", - ["date", "implementation_organization","project_department"]), + ["date", "implementation_organization", "project_department"]), + ("{date}{project_department}{implementation_organization}作业计划有多少?", + ["date", "project_department", "implementation_organization"]), ("{date}{project_department}作业计划有多少?", ["date", "project_department"]), ("{date}{project_manager}作业计划有多少?", ["date", "project_manager"]), ("{date}{subcontractor}作业计划有多少?", ["date", "subcontractor"]), @@ -152,6 +200,9 @@ TEMPLATE_CONFIG = { ("{date}有多少项{risk_level}风险作业计划?", ["date", "risk_level"]), ("{date}有多少{risk_level}风险作业计划?", ["date", "risk_level"]), + ("{date}存在{risk_level}风险的作业计划有多少?", ["date", "risk_level"]), + ("{date}{risk_level}风险作业计划有多少", ["date", "risk_level"]), + # 🎯 date + construction_unit + risk_level ("{construction_unit}{date}有多少项{risk_level}风险作业计划", ["construction_unit", "date", "risk_level"]), @@ -176,34 +227,54 @@ TEMPLATE_CONFIG = { ("{team_name}{date}有多少作业计划?", ["team_name", "date"]), ("{team_name}{date}作业计划数量", ["team_name", "date"]), ("{date}{team_name}的作业计划数量", ["date", "team_name"]), + #有多少 + ("{date}{implementation_organization}{project_department}有多少?", + ["date", "implementation_organization", "project_department"]), + ("{implementation_organization}{project_department}{date}有多少?", + ["implementation_organization", "project_department", "date"]), + ("{date}{project_department}{implementation_organization}有多少项作业计划?", + ["date", "project_department", "implementation_organization"]), + ("{date}{implementation_organization}有多少?", ["date", "implementation_organization"]), + ("{date}公司{project_department}有多少?", ["date", "project_department"]), + ("{date}{project_department}有多少?", ["date", "project_department"]), + ("{date}{project_name}有多少", ["date", "project_name"]), + ("{project_name}{date}有多少", ["project_name", "date"]), + ("{date}公司{project_name}有多少?", ["date", "project_name"]), + ("{date}工程性质是{project_type}有多少", ["project_type", "date"]), + ("工程性质是{project_type}{date}有多少", ["project_type", "date"]) ] }, "日计划作业内容": { "date": ["今日", "昨日", "2024年5月24日", "5月24日", "今天", "昨天"], "templates": [ ("{date}{project_name}作业内容是什么?", ["date", "project_name"]), - ("{project_name}在{date}作业内容是什么", ["project_name", "date"]), - ("{date}{project_type}类作业内容是什么?", ["date", "project_type"]), - ("{project_type}类{date}作业内容是什么?", ["project_type", "date"]), + ("{project_name}在{date}的作业有哪些", ["project_name", "date"]), + ("{date}{project_type}类作业有哪些?", ["date", "project_type"]), + ("{project_type}类{date}具体作业内容是什么?", ["project_type", "date"]), ("{date}工程性质为{project_type}的作业内容是什么?", ["date", "project_type"]), - ("工程性质为{project_type}的{date}作业内容是什么?", ["project_type", "date"]), + ("工程性质为{project_type}的{date}作业计划分别是什么?", ["project_type", "date"]), + ("工程性质为{project_type}的{date}4项作业计划分别是什么?", ["project_type", "date"]), ("{construction_unit}在{date}作业内容是什么?", ["construction_unit", "date"]), # 1. 查询特定日期和项目的作业安排 - ("{date}{project_name}作业内容是什么?", ["date", "project_name"]), + ("{date}{project_name}作业是什么?", ["date", "project_name"]), ("{date}属于{operating}作业内容是什么?", ["date", "operating"]), + ("{date}存在{operating}作业是什么?", ["date", "operating"]), # 3. 查询特定日期和项目类型的工程计划 - ("{date}{project_type}类计划作业内容是什么?", ["date", "project_type"]), + ("{date}{project_type}类作业有哪些?", ["date", "project_type"]), ("{date}{construction_unit}{risk_level}风险的作业内容是什么?", ["date", "construction_unit", "risk_level"]), - ("{date}{implementation_organization}{risk_level}风险的作业内容是什么?", + ("{date}{implementation_organization}{risk_level}风险的作业是什么?", ["date", "implementation_organization", "risk_level"]), # 5. 查询特定日期和项目经理的任务安排 ("{project_manager}在{date}作业内容是什么?", ["project_manager", "date"]), + ("{project_manager}在{date}作业计划分别是什么?", ["project_manager", "date"]), + ("{project_manager}在{date}4项作业计划分别是什么?", ["project_manager", "date"]), # 6. 查询特定日期和风险等级的任务 - ("{date}风险等级为{risk_level}的作业内容是什么?", ["date", "risk_level"]), + ("{date}风险等级为{risk_level}的作业计划有哪些?", ["date", "risk_level"]), + ("{date}风险等级为{risk_level}四项作业计划分别有哪些?", ["date", "risk_level"]), # 7. 查询特定日期和实施单位的任务内容 ("{implementation_organization}在{date}作业内容是什么?", ["implementation_organization", "date"]), @@ -215,15 +286,17 @@ TEMPLATE_CONFIG = { ("{date}的{project_type}类风险等级为{risk_level}的作业内容是什么?", ["date", "project_type", "risk_level"]), # 10. 查询特定日期和风险等级的任务安排 - ("{date}风险等级为{risk_level}的作业内容是什么?", ["date", "risk_level"]), + ("{date}风险等级为{risk_level}2项作业计划分别是什么?", ["date", "risk_level"]), ("{date}{risk_level}的作业内容是什么?", ["date", "risk_level"]), # 11. 查询特定日期和施工单位的任务进展 - ("{construction_unit}在{date}作业内容是什么?", ["construction_unit", "date"]), + ("{construction_unit}{date}的作业计划是什么?", ["construction_unit", "date"]), + ("{construction_unit}{date}作业有哪些", ["construction_unit", "date"]), # 12. 查询特定日期和项目经理完成的任务 ("{project_manager}在{date}作业内容是什么?", ["project_manager", "date"]), + ("{project_manager}在{date}三项作业计划分别是什么?", ["project_manager", "date"]), # 13. 查询特定日期和项目经理的高风险任务 ("{project_manager}在{date}的风险等级为{risk_level}的作业内容是什么?", @@ -231,32 +304,57 @@ TEMPLATE_CONFIG = { # 15. 查询特定日期和所有任务安排 ("{date}作业内容是什么?", ["date"]), + ("{date}作业计划有哪些?", ["date"]), + ("{date}作业计划是什么?", ["date"]), + ("{date}三项作业计划分别是什么?", ["date"]), + ("{date}作业是什么?", ["date"]), + ("{date}作业有哪些?", ["date"]), + + ("{date}{implementation_organization}{project_department}作业内容是什么?", + ["date", "implementation_organization", "project_department"]), + ("{implementation_organization}{project_department}{date}作业计划有哪些?", + ["implementation_organization", "project_department", "date"]), + ("{implementation_organization}{project_department}{date}作业计划是什么?", + ["implementation_organization", "project_department", "date"]), + ("{implementation_organization}{project_department}{date}作业是什么?", + ["implementation_organization", "project_department", "date"]), + ("{implementation_organization}{project_department}{date}两项作业计划分别是什么?", + ["implementation_organization", "project_department", "date"]), + ("{project_department}{implementation_organization}{date}作业计划是什么?", + ["project_department", "implementation_organization", "date"]), + ("{date}{project_department}{implementation_organization}作业是什么?", + ["date", "project_department", "implementation_organization"]), + ("{date}{project_department}{implementation_organization}两项作业计划分别是什么?", + ["date", "project_department", "implementation_organization"]), # 16. 查询特定日期和项目进度 ("{date}{project_name}作业内容是什么?", ["date", "project_name"]), # 班组 - ("{date}{team_name}作业内容是什么?", ["date", "team_name"]), - ("{team_name}{date}作业内容", ["team_name", "date"]), + ("{date}{team_name}作业是什么?", ["date", "team_name"]), + ("{team_name}{date}作业内容", ["team_name", "date"]) ] }, "周计划作业内容": { "date": ["本周", "上周", "上一周", "下周", "下一周", "最近一周", "本周内", "这一周"], "templates": [ - ("工程性质为{project_type}在{date}作业内容是什么?", ["project_type", "date"]), + ("工程性质为{project_type}在{date}作业是什么?", ["project_type", "date"]), ("{date}工程性质为{project_type}作业内容是什么?", ["date", "project_type"]), - ("{date}{construction_unit}作业内容是什么?", ["date", "construction_unit"]), + ("{date}{construction_unit}作业有哪些?", ["date", "construction_unit"]), - ("{implementation_organization}在{date}作业内容是什么?", ["implementation_organization", "date"]), + ("{implementation_organization}{date}的作业有哪些?", ["implementation_organization", "date"]), + + ("{implementation_organization}{project_department}{date}2项作业计划分别是什么?", + ["implementation_organization", "project_department", "date"]), # 4. 查询某项目在指定周的所有作业计划 - ("{project_name}在{date}作业内容是什么?", ["project_name", "date"]), + ("{project_name}在{date}有哪些作业?", ["project_name", "date"]), # 5. 查询指定周的所有项目类型作业内容 ("{date}{project_type}类作业内容是什么?", ["date", "project_type"]), # 6. 查询某施工单位在指定周的作业任务 - ("{construction_unit}在{date}作业内容是什么?", ["construction_unit", "date"]), + ("{construction_unit}在{date}作业计划分别是什么?", ["construction_unit", "date"]), # 7. 查询某项目经理在指定周负责的作业内容 ("{project_manager}在{date}作业内容是什么?", ["project_manager", "date"]), @@ -270,19 +368,23 @@ TEMPLATE_CONFIG = { # 10. 查询某风险等级在指定周的作业内容 ("{date}风险等级为{risk_level}的作业内容是什么?", ["date", "risk_level"]), - ("{date}{risk_level}风险的作业内容是什么?", ["date", "risk_level"]), + ("{date}{risk_level}风险的作业计划分别是什么?", ["date", "risk_level"]), + ("{date}{risk_level}有哪些作业", ["date", "risk_level"]), # 11. 查询某施工单位在指定周的作业进展 ("{construction_unit}在{date}作业内容是什么?", ["construction_unit", "date"]), + ("{construction_unit}在{date}有哪些作业?", ["construction_unit", "date"]), # 13. 查询某团队在指定周的作业安排 - ("{team_leader}领导的团队在{date}作业内容是什么?", ["team_leader", "date"]), + ("{team_leader}领导的团队在{date}的作业有哪些?", ["team_leader", "date"]), # 15. 查询某项目部门在指定周的作业安排 ("{project_department}在{date}作业内容是什么?", ["project_department", "date"]), ("{date}{team_name}作业内容是什么", ["date", "team_name"]), - ("{team_name}{date}作业内容", ["team_name", "date"]), + ("{team_name}{date}2项作业计划分别有哪些", ["team_name", "date"]), + ("{team_name}{date}2项作业计划分别是什么", ["team_name", "date"]), + ("{team_name}{date}有哪些作业", ["team_name", "date"]), ] }, "施工人数": { @@ -290,8 +392,11 @@ TEMPLATE_CONFIG = { "templates": [ ("{date}{project_name}施工人员有多少?", ["date", "project_name"]), ("{date}{project_name}施工人数是多少?", ["date", "project_name"]), + ("{date}{project_name}现场有多少施工人员?", ["date", "project_name"]), + ("{date}{project_name}现场施工人数是多少?", ["date", "project_name"]), - ("{construction_unit}在{date}的施工人数是多少?", ["construction_unit", "date"]), + ("{construction_unit}{date}的施工人数是多少?", ["construction_unit", "date"]), + ("{construction_unit}{date}现场施工人数是多少?", ["construction_unit", "date"]), # 2. 统计某施工单位在指定日期的施工总人数 ("统计{construction_unit}在{date}的施工人数是多少?", ["construction_unit", "date"]), ("{date}属于{operating}的施工人数是多少?", ["date", "operating"]), @@ -299,21 +404,30 @@ TEMPLATE_CONFIG = { # 4. 查询某项目类型在指定日期的施工人员需求 ("{date}{project_type}类有多少施工人员?", ["date", "project_type"]), ("{date}工程性质为{project_type}有多少施工人员?", ["date", "project_type"]), + ("{date}工程性质为{project_type}有多少现场施工人员?", ["date", "project_type"]), ("{date}工程性质为{project_type}的施工人数是多少?", ["date", "project_type"]), ("工程性质为{project_type}{date}的施工人数是多少?", ["project_type", "date"]), + ("工程性质为{project_type}{date}的现场施工人数是多少?", ["project_type", "date"]), ("工程性质为{project_type}{date}有多少施工人员?", ["project_type", "date"]), # 5. 统计某施工单位在指定日期的各项目施工人数 ("{construction_unit}在{date}的施工人数是多少?", ["construction_unit", "date"]), # 8. 统计某项目经理管理的项目在指定日期的施工总人数 ("{project_manager}负责的项目在{date}的施工人数是多少?", ["project_manager", "date"]), - ("{date}{project_manager}负责的项目的施工人数是多少?", ["date", "project_manager"]), + ("{date}{project_manager}负责的项目的现场施工人数是多少?", ["date", "project_manager"]), # 9. 查询某分包商在指定日期的施工人员投入 - ("{subcontractor}{date}的施工人员有多少?", ["subcontractor", "date"]), + ("{subcontractor}{date}施工人员有多少?", ["subcontractor", "date"]), ("{subcontractor}{date}的施工人数是多少?", ["subcontractor", "date"]), ("{date}{subcontractor}的施工人员有多少?", ["date", "subcontractor"]), ("{date}{subcontractor}的施工人数是多少?", ["date", "subcontractor"]), + ("{implementation_organization}{date}现场施工人员有多少?", ["implementation_organization", "date"]), + ("{implementation_organization}{date}现场有多少施工人员?", ["implementation_organization", "date"]), + ("{implementation_organization}{date}的现场施工人数是多少?", ["implementation_organization", "date"]), + ("{date}{implementation_organization}现场有多少施工人员?", ["date", "implementation_organization"]), + ("{date}{implementation_organization}现场施工人数是多少?", ["date", "implementation_organization"]), + + ("{team_leader}{date}的施工人员有多少?", ["team_leader", "date"]), ("{team_leader}{date}的施工人数是多少?", ["team_leader", "date"]), ("{date}{team_leader}的施工人员有多少?", ["date", "team_leader"]), @@ -340,10 +454,29 @@ TEMPLATE_CONFIG = { ["construction_unit", "date", "risk_level"]), ("{date}{team_name}施工人数是多少", ["date", "team_name"]), - ("{date}{team_name}施工人数", ["date", "team_name"]), - ("{team_name}{date}施工人数是多少", ["team_name", "date"]), - ("{team_name}{date}施工人数", ["team_name", "date"]), + ("{date}{team_name}施工人数是什么", ["date", "team_name"]), + ("{team_name}{date}施工人数有多少", ["team_name", "date"]), + ("{team_name}{date}施工人数是什么", ["team_name", "date"]), + # + ("{date}{implementation_organization}{project_department}作业人数是多少?", + ["date", "implementation_organization", "project_department"]), + ("{implementation_organization}{project_department}{date}作业人员有多少?", + ["implementation_organization", "project_department", "date"]), + ("{implementation_organization}{project_department}{date}作业人数是多少?", + ["implementation_organization", "project_department", "date"]), + ("{date}{implementation_organization}{project_department}有多少作业人员?", + ["date", "implementation_organization", "project_department"]), + ("{implementation_organization}{project_department}{date}作业人数是多少?", + ["implementation_organization", "project_department", "date"]), + ("{project_department}{implementation_organization}{date}有多少作业人员?", + ["project_department", "implementation_organization", "date"]), + ("{date}{project_department}{implementation_organization}有多少作业人数?", + ["date", "project_department", "implementation_organization"]), + ("{date}{project_department}{implementation_organization}作业人员有多少?", + ["date", "project_department", "implementation_organization"]), + ("{project_department}{implementation_organization}{date}作业人员是多少", + ["project_department", "implementation_organization", "date"]), ] }, "作业考勤人数": { @@ -353,7 +486,13 @@ TEMPLATE_CONFIG = { ("{project_name}{date}作业考勤人数是多少", ["project_name", "date"]), ("查询{subcontractor}{date}的出勤记录", ["subcontractor", "date"]), ("查询{subcontractor}{date}的作业考勤人数是多少", ["subcontractor", "date"]), - ("{date}属于{operating}的作业考勤人数是多少?", ["date", "operating"]), + #出勤人 + ("{date}{project_name}出勤人数是多少", ["date", "project_name"]), + ("{project_name}{date}出勤人数是多少", ["project_name", "date"]), + ("查询{subcontractor}{date}的出勤记录", ["subcontractor", "date"]), + ("查询{subcontractor}{date}的作业出勤人数是多少", ["subcontractor", "date"]), + + ("{date}{operating}的作业考勤人数是多少?", ["date", "operating"]), ("{team_leader}{date}的作业考勤人数是多少", ["team_leader", "date"]), # 4. 统计某施工单位在指定日期的考勤人数 ("统计{construction_unit}{date}的考勤人数", ["construction_unit", "date"]), @@ -369,9 +508,12 @@ TEMPLATE_CONFIG = { # 10. 统计某项目在指定周的出勤总人数 ("{project_name}{date}的出勤人数是多少?", ["project_name", "date"]), + ("{project_name}{date}的考勤率是多少?", ["project_name", "date"]), + ("{project_name}{date}的考勤率", ["project_name", "date"]), # 11. 查询某分包商在指定周的出勤情况 ("{subcontractor}在{date}的出勤情况如何?", ["subcontractor", "date"]), + ("{subcontractor}在{date}的出勤情况怎么样?", ["subcontractor", "date"]), ("{date}{team_name}考勤人数是多少", ["date", "team_name"]), ("{team_name}{date}考勤人数", ["team_name", "date"]), @@ -399,7 +541,203 @@ TEMPLATE_CONFIG = { ("加载{page}", ["page"]), ("加载{page}页面", ["page"]), ] - } + }, + "作业面查询": { + "date": ["今日", "昨日", "2024年5月24日", "5月24日", "今天", "昨天"], + "templates": [ + ("{date}{project_name}有多少作业面?", ["date", "project_name"]), + + ("{date}{construction_unit}作业面有多少?", ["date", "construction_unit"]), + ("{date}{implementation_organization}作业面是多少?", ["date", "implementation_organization"]), + ("{date}{implementation_organization}{project_department}有多少作业面?", + ["date", "implementation_organization", "project_department"]), + ("{date}{project_department}有多少作业面?", ["date", "project_department"]), + ("{date}{project_manager}作业面是多少?", ["date", "project_manager"]), + ("{date}{subcontractor}有多少作业面?", ["date", "subcontractor"]), + ("{date}{team_leader}作业面是多少?", ["date", "team_leader"]), + ("{date}{project_name}有多少作业面?", ["date", "project_name"]), + ("{project_name}{date}有多少项作业面?", ["project_name", "date"]), + ("{date}公司{project_name}有多少作业面?", ["date", "project_name"]), + ("工程性质是{project_type}{date}有多少作业面?", ["project_type", "date"]), + ("工程性质是{project_type}{date}有多少项作业面?", ["project_type", "date"]), + ("工程性质是{project_type}{date}有多少条作业面?", ["project_type", "date"]), + ("{date}风险等级为{risk_level}的作业面有多少?", ["date", "risk_level"]), + ("公司{date}工程性质为{project_type}作业面有多少?", ["date", "project_type"]), + ("{date}工程性质为{project_type}作业面有多少?", ["date", "project_type"]), + ("公司工程性质为{project_type}{date}作业面有多少?", ["project_type", "date"]), + ] + }, + "班组人数查询": { + "date": ["今日", "昨日", "2024年5月24日", "5月24日", "今天", "昨天"], + "templates": [ + ("{date}{project_name}班组人员有多少?", ["date", "project_name"]), + ("{date}{project_name}班组人数是多少?", ["date", "project_name"]), + ("{date}{project_name}现场有多少班组人员?", ["date", "project_name"]), + ("{date}{project_name}现场班组人数是多少?", ["date", "project_name"]), + + ("{construction_unit}{date}的班组人数是多少?", ["construction_unit", "date"]), + ("{construction_unit}{date}现场班组人数是多少?", ["construction_unit", "date"]), + # 2. 统计某施工单位在指定日期的班组总人数 + ("统计{construction_unit}在{date}的班组人数是多少?", ["construction_unit", "date"]), + ("{date}属于{operating}的班组人数是多少?", ["date", "operating"]), + + # 4. 查询某项目类型在指定日期的班组工人员需求 + ("{date}{project_type}类有多少班组人员?", ["date", "project_type"]), + ("{date}工程性质为{project_type}有多少班组人员?", ["date", "project_type"]), + ("{date}工程性质为{project_type}有多少现场班组人员?", ["date", "project_type"]), + ("{date}工程性质为{project_type}的班组人数是多少?", ["date", "project_type"]), + ("工程性质为{project_type}{date}有多少班组人员?", ["project_type", "date"]), + ("工程性质为{project_type}{date}的现场班组人数是多少?", ["project_type", "date"]), + ("工程性质为{project_type}{date}有多少班组人员?", ["project_type", "date"]), + ("工程性质为{project_type}{date}的现场班组人数是多少?", ["project_type", "date"]), + # 5. 统计班组工单位在指定日期的各项目人数 + ("工程性质为{project_type}{date}的现场班组人数是多少?", ["project_type", "date"]), + ("{construction_unit}在{date}的班组人数是多少?", ["construction_unit", "date"]), + ("工程性质为{project_type}{date}的现场班组人数是多少?", ["project_type", "date"]), + # 8. 统计某项目经理管理的项目在指定日期的总人数 + ("工程性质为{project_type}{date}的现场班组人数是多少?", ["project_type", "date"]), + ("{project_manager}负责的项目在{date}的班组人数是多少?", ["project_manager", "date"]), + ("{date}{project_manager}负责的项目的现场班组人数是多少?", ["date", "project_manager"]), + # + ("{date}{implementation_organization}{project_department}班组人数是多少?", + ["date", "implementation_organization", "project_department"]), + ("{implementation_organization}{project_department}{date}班组人员有多少?", + ["implementation_organization", "project_department", "date"]), + ("{implementation_organization}{project_department}{date}班组人数是多少?", + ["implementation_organization", "project_department", "date"]) + ] + }, + "班组数查询": { + "date": ["今日", "昨日", "2024年5月24日", "5月24日", "今天", "昨天"], + "templates": [ + ("{date}{project_name}现场有多少班组?", ["date", "project_name"]), + ("{date}{project_name}现场有多少个班组?", ["date", "project_name"]), + ("{date}{project_name}现场班组有多少个?", ["date", "project_name"]), + ("{date}{project_name}班组数是多少?", ["date", "project_name"]), + ("{date}{project_name}班组数是什么?", ["date", "project_name"]), + ("{date}{project_name}班组是多少?", ["date", "project_name"]), + ("{date}{project_name}班组有多少个?", ["date", "project_name"]), + ("{date}{construction_unit}班组数有多少?", ["date", "construction_unit"]), + ("{date}{implementation_organization}现场班组数是多少?", ["date", "implementation_organization"]), + ("{date}{implementation_organization}{project_department}有多少班组?", + ["date", "implementation_organization", "project_department"]), + ("{date}{project_department}现场有多少个班组?", ["date", "project_department"]), + ("{date}{project_manager}现场班组数是多少?", ["date", "project_manager"]), + ("{date}{subcontractor}现场有多少班组?", ["date", "subcontractor"]), + ("{date}{team_leader}班组数是多少?", ["date", "team_leader"]), + ("{date}{team_leader}班组有多少?", ["date", "team_leader"]), + ("{date}{project_name}有多少班组?", ["date", "project_name"]), + ("{project_name}{date}有多少个班组?", ["project_name", "date"]), + ("{date}公司{project_name}有多少班组?", ["date", "project_name"]), + ("工程性质是{project_type}{date}有多少班组?", ["project_type", "date"]), + ("工程性质是{project_type}{date}有多少班组?", ["project_type", "date"]), + ("工程性质是{project_type}{date}有多少班组?", ["project_type", "date"]), + ("{date}风险等级为{risk_level}的班组有多少?", ["date", "risk_level"]), + ("公司{date}工程性质为{project_type}班组有多少个?", ["date", "project_type"]), + ("{date}工程性质为{project_type}现场班组有多少?", ["date", "project_type"]), + ("公司工程性质为{project_type}{date}有多少班组?", ["project_type", "date"]), + ] + }, + "作业面内容": { + "date": ["今日", "昨日", "2024年5月24日", "5月24日", "今天", "昨天"], + "templates": [ + ("{date}{project_name}作业面是什么?", ["date", "project_name"]), + ("{project_name}在{date}的作业面有哪些", ["project_name", "date"]), + ("{date}{project_type}类作业面有哪些?", ["date", "project_type"]), + ("{project_type}类{date}具体作业面内容是什么?", ["project_type", "date"]), + ("{date}工程性质为{project_type}的作业面内容是什么?", ["date", "project_type"]), + ("工程性质为{project_type}的{date}作业面分别是什么?", ["project_type", "date"]), + ("工程性质为{project_type}的{date}4项作业面分别是什么?", ["project_type", "date"]), + ("{construction_unit}在{date}作业面内容是什么?", ["construction_unit", "date"]), + # 1. 查询特定日期和项目的作业安排 + ("{date}{project_name}作业面是什么?", ["date", "project_name"]), + ("{date}属于{operating}作业面内容是什么?", ["date", "operating"]), + ("{date}存在{operating}作业面是什么?", ["date", "operating"]), + # 3. 查询特定日期和项目类型的工程计划 + ("{date}{project_type}类具体作业面有哪些?", ["date", "project_type"]), + + ("{date}{construction_unit}{risk_level}风险的作业面内容是什么?", ["date", "construction_unit", "risk_level"]), + + ("{date}{implementation_organization}{risk_level}风险的作业面是什么?", + ["date", "implementation_organization", "risk_level"]), + + # 5. 查询特定日期和项目经理的任务安排 + ("{project_manager}在{date}作业面内容是什么?", ["project_manager", "date"]), + ("{project_manager}在{date}作业面分别是什么?", ["project_manager", "date"]), + ("{project_manager}在{date}4项作业面分别是什么?", ["project_manager", "date"]), + + # 6. 查询特定日期和风险等级的任务 + ("{date}风险等级为{risk_level}的作业面有哪些?", ["date", "risk_level"]), + ("{date}风险等级为{risk_level}四项作业面具体分别有哪些?", ["date", "risk_level"]), + + + # 10. 查询特定日期和风险等级的任务安排 + ("{date}风险等级为{risk_level}2项作业面分别是什么?", ["date", "risk_level"]), + + ("{date}{risk_level}的作业面具体内容是什么?", ["date", "risk_level"]), + + # 11. 查询特定日期和施工单位的任务进展 + ("{construction_unit}{date}的作业面是什么?", ["construction_unit", "date"]), + ("{construction_unit}{date}作业面具体内容有哪些", ["construction_unit", "date"]), + + # 12. 查询特定日期和项目经理完成的任务 + ("{project_manager}在{date}三项作业面分别是什么?", ["project_manager", "date"]), + + # 13. 查询特定日期和项目经理的高风险任务 + ("{project_manager}在{date}的风险等级为{risk_level}的作业面内容是什么?", + ["project_manager", "date", "risk_level"]), + + # 15. 查询特定日期和所有任务安排 + ("{date}作业面内容是什么?", ["date"]), + ("{date}作业面有哪些?", ["date"]), + ("{date}作业面是什么?", ["date"]), + + ("{date}{implementation_organization}{project_department}具体作业面内容是什么?", + ["date", "implementation_organization", "project_department"]), + ("{implementation_organization}{project_department}{date}具体作业面有哪些?", + ["implementation_organization", "project_department", "date"]), + ("{implementation_organization}{project_department}{date}作业面是什么?", + ["implementation_organization", "project_department", "date"]), + ("{implementation_organization}{project_department}{date}两项作业面分别是什么?", + ["implementation_organization", "project_department", "date"]), + ("{project_department}{implementation_organization}{date}具体作业面是什么?", + ["project_department", "implementation_organization", "date"]), + ("{date}{project_department}{implementation_organization}两项作业面分别是什么?", + ["date", "project_department", "implementation_organization"]), + ] + }, + "班组详情": { + "date": ["今日", "昨日", "2024年5月24日", "5月24日", "今天", "昨天"], + "templates": [ + ("{date}{project_name}现场具体有哪些班组?", ["date", "project_name"]), + ("{date}{project_name}现场班组详情是什么?", ["date", "project_name"]), + ("{date}{project_name}现场班组情况", ["date", "project_name"]), + ("{date}{project_name}具体班组情况是什么?", ["date", "project_name"]), + ("{date}{project_name}具体班组详情是什么?", ["date", "project_name"]), + ("{date}{project_name}班组详细情况是什么?", ["date", "project_name"]), + ("{date}{project_name}班组详情", ["date", "project_name"]), + ("{date}{construction_unit}具体有哪些班组", ["date", "construction_unit"]), + ("{date}{implementation_organization}班组有哪些?", ["date", "implementation_organization"]), + ("{date}{implementation_organization}{project_department}现场具体有哪些班组?", + ["date", "implementation_organization", "project_department"]), + ("{date}{project_department}现场班组详情是什么?", ["date", "project_department"]), + ("{date}{project_manager}现场班组情况?", ["date", "project_manager"]), + ("{date}{subcontractor}具体班组情况是什么?", ["date", "subcontractor"]), + ("{date}{team_leader}具体班组详情是什么?", ["date", "team_leader"]), + ("{date}{team_leader}班组详细情况是什么?", ["date", "team_leader"]), + ("{date}{project_name}班组详情?", ["date", "project_name"]), + ("{project_name}{date}具体有哪些班组?", ["project_name", "date"]), + ("{date}公司{project_name}班组有哪些?", ["date", "project_name"]), + ("工程性质是{project_type}{date}现场具体有哪些班组?", ["project_type", "date"]), + ("工程性质是{project_type}{date}现场班组详情是什么?", ["project_type", "date"]), + ("工程性质是{project_type}{date}现场班组情况?", ["project_type", "date"]), + ("{date}风险等级为{risk_level}具体班组情况是什么?", ["date", "risk_level"]), + ("公司{date}工程性质为{project_type}具体班组详情是什么?", ["date", "project_type"]), + ("{date}工程性质为{project_type}班组详情?", ["date", "project_type"]), + ("公司工程性质为{project_type}{date}具体有哪些班组?", ["project_type", "date"]), + ("公司工程性质为{project_type}{date}班组有哪些?", ["project_type", "date"]), + ] + } } diff --git a/generated_data/合并数据.py b/generated_data/合并数据.py index 15789b0..f4069ab 100644 --- a/generated_data/合并数据.py +++ b/generated_data/合并数据.py @@ -22,7 +22,9 @@ def merge_json_files(file_list, output_file): json.dump(merged_data, f, ensure_ascii=False, indent=4) # 文件列表 -files = ['互联网查询.json','天气查询.json','知识问答.json','作业考勤人数.json', '周计划作业内容.json', '周计划数量查询.json','施工人数.json','日计划作业内容.json','日计划数量查询.json','页面切换.json','通用对话.json'] +files = ['互联网查询.json','天气查询.json','知识问答.json','作业考勤人数.json', '周计划作业内容.json', + '周计划数量查询.json','施工人数.json','日计划作业内容.json','日计划数量查询.json', + '页面切换.json','通用对话.json','作业面查询.json','班组人数查询.json','班组数查询.json','作业面内容.json','班组详情.json'] output_file = 'output/merged_data.json' # 执行合并