From ac8bd8022b6d556f40254e1caedda13febe8514b Mon Sep 17 00:00:00 2001 From: zy123 <646228430@qq.com> Date: Thu, 21 Nov 2024 19:18:42 +0800 Subject: [PATCH] =?UTF-8?q?11.21=20=E8=A7=A3=E5=86=B3=E4=BA=86=E5=A4=8D?= =?UTF-8?q?=E6=9D=82=E3=80=81=E5=A4=9A=E5=B1=82=E7=9A=84=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E9=9C=80=E6=B1=82bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flask_app/货物标/技术参数要求提取.py | 76 +++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/flask_app/货物标/技术参数要求提取.py b/flask_app/货物标/技术参数要求提取.py index 518a134..76240c2 100644 --- a/flask_app/货物标/技术参数要求提取.py +++ b/flask_app/货物标/技术参数要求提取.py @@ -18,7 +18,7 @@ def generate_key_paths(data, parent_key='', good_list=None, seen=None): """ 生成嵌套字典中的键路径,并提取最内层的键名。 同时,提取特定模式的键(如 '交换机-1', '交换机-2')的父路径。 - 如果同一层级下只有'交换机-1'但没有'交换机-2',则视为错误输入,删除后缀'-1',将'交换机'加入key_paths。 + 如果同一层级下只有'交换机-1'但没有'交换机-2',则视为错误输入,将键名中的后缀'-1'删除,直接修改为'交换机',保持顺序。 参数: data (dict): 输入的字典数据 @@ -44,7 +44,7 @@ def generate_key_paths(data, parent_key='', good_list=None, seen=None): prefix_groups = {} other_keys = [] - for key in data: + for key in list(data.keys()): # 使用 list(data.keys()) 防止修改字典时出错 clean_key = key.replace(" ", "") match = pattern.match(clean_key) if match: @@ -66,14 +66,29 @@ def generate_key_paths(data, parent_key='', good_list=None, seen=None): seen.add(prefix) no_keys_added = False else: - # 只有一个键匹配:删除后缀并添加到 key_paths - key = keys[0] - key_path = current_prefix_path # 去掉后缀后,路径为父路径 + 前缀 + # 只有一个键匹配:重命名键,删除后缀,并保持顺序 + old_key = keys[0] + new_key = prefix # 删除后缀后的新键名 + value = data.pop(old_key) # 移除旧键并获取其值 + + # 插入新键以保持顺序 + # 由于 Python 3.7+ 字典保持插入顺序,我们需要重新插入键 + # 创建一个新的临时字典来保持顺序 + temp_dict = {} + for k in data: + temp_dict[k] = data[k] + if k == parent_key or (parent_key and k.startswith(parent_key + ".")): + # 在适当的位置插入新键 + continue + data[new_key] = value # 添加新键 + + key_path = f"{parent_key}.{new_key}" if parent_key else new_key key_paths.append(key_path) if prefix not in seen: good_list.append(prefix) seen.add(prefix) no_keys_added = False + # 注意:由于直接修改字典,键的顺序可能会受到影响 # Step 3: Handle other keys for key in other_keys: @@ -127,9 +142,11 @@ def generate_key_paths(data, parent_key='', good_list=None, seen=None): seen.add(clean_key) # 更新 no_keys_added no_keys_added = False - + # Step 4: 删除 key_paths 中包含在 grouped_paths 中的元素 + key_paths = [path for path in key_paths if path not in grouped_paths] #排除同一层下既有'xx',又有'xx-1'的情况 return key_paths, good_list, grouped_paths, no_keys_added + def combine_and_update_results(original_data, updates): def normalize_key(key): """ @@ -355,13 +372,13 @@ def get_technical_requirements(file_path,invalid_path): ffinal_res = postprocess(cleaned_res) else: # user_query_template = "请你根据该货物标中采购要求部分的内容,请你给出\"{}\"的技术参数(或采购要求),请以json格式返回结果,外层键名为\"{}\", 键值对中的键是你对该要求的总结,而值需要完全与原文保持一致,不可擅自总结删减。" - user_query_template = """请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。请以 JSON 格式返回结果,键名为\"{}\",键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求的字符串,内容需与原文一致,即若技术参数前存在序号也要保留,但不可擅自增添或删减。 + user_query_template = """请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。请以 JSON 格式返回结果,键名为\"{}\",键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求的字符串,请按原文内容回答,保留三角▲、五角★和序号,不可擅自增添内容,尤其是不可擅自添加序号。 要求与指南: 1. 如果该货物没有相关采购要求或技术参数要求,键值应为空列表。 2. 如果存在嵌套结构,且原文为Markdown 的表格语法,如'摄像机|有效像素|≥900W像素', 请不要返回该Markdown语法,而是使用冒号':'将相关信息拼接在一起,生成一条完整且清晰的技术参数(或采购要求)描述,作为列表中的一个字符串。如"摄像机:有效像素:≥900W像素"。 3. 字符串中的内容为具体的技术参数要求或采购要求,请不要返回诸如'(1)高清录像功能'这种标题性质且不能体现要求的内容。 4. 你的键值应该全面,对于同一个单元格内的数据,尽量全面,不要遗漏。 - + ### 示例输出1如下: {{ "摄像机控制键盘": [ @@ -376,10 +393,10 @@ def get_technical_requirements(file_path,invalid_path): "摄像机:有效像素:≥900W像素", "摄像机:最低照度:彩色≤0.001lx", "协议:routes 接口开放:具备;支持标准 ONVIF 协议与第三方厂家设备进行互联;支持 GB/T28181;应提供 SDK" - ] + ] }} """ - user_query_template_two="""请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。由于该货物存在多种不同的采购要求或技术参数,请逐一列出,并以 JSON 格式返回结果。请以'货物名-编号'区分多种型号,编号为从 1 开始的自然数,依次递增,即第一个键名为\"{}-1\", 键值为一个列表,列表中包含若干描述\"{}\"的技术参数(或采购要求)的字符串,需与原文完全一致,即若技术参数前存在序号也要保留,但不可擅自增添或删减。 + user_query_template_two="""请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。由于该货物存在多种不同的采购要求或技术参数,请逐一列出,并以 JSON 格式返回结果。请以'货物名-编号'区分多种型号,编号为从 1 开始的自然数,依次递增,即第一个键名为\"{}-1\", 键值为一个列表,列表中包含若干描述\"{}\"的技术参数(或采购要求)的字符串,请按原文内容回答,保留三角▲、五角★和序号(若有),不可擅自增添内容。 请注意以下特殊情况: 要求与指南: 1. 如果该货物没有相关采购要求或技术参数要求,键值应为空列表。 @@ -480,11 +497,46 @@ def test_all_files_in_folder(input_folder, output_folder): # "业务视频应用": { # "视频回放": {} # }, - +#TODO:{ 顺序变了 +# "采购需求": { +# "高清数字枪机-1": [], +# "枪机支架-1": [], +# "高清数字半球机-1": [], +# "网络硬盘录像机-1": [], +# "监硬控硬盘-1": [], +# "交换机-1": [], +# "交换机-2": [], +# "监视器-1": [], +# "电源线-1": [], +# "网线-1": [], +# "水晶头-1": [], +# "PVC线槽-1": [], +# "辅料-1": [], +# "安装调试-1": [] +# } +# } +# { +# "采购需求": { +# "交换机-1": [], +# "交换机-2": [], +# "高清数字枪机": [], +# "枪机支架": [], +# "高清数字半球机": [], +# "网络硬盘录像机": [], +# "监硬控硬盘": [], +# "监视器": [], +# "电源线": [], +# "网线": [], +# "水晶头": [], +# "PVC线槽": [], +# "辅料": [], +# "安装调试": [] +# } +# } if __name__ == "__main__": start_time=time.time() # truncate_file="C:\\Users\\Administrator\\Desktop\\fsdownload\\469d2aee-9024-4993-896e-2ac7322d41b7\\ztbfile_procurement.docx" - truncate_file=r"C:\Users\Administrator\Desktop\货物标\output1\招标文件(107国道)_procurement.pdf" + truncate_file=r"C:\Users\Administrator\Desktop\fsdownload\db79e9e0-830e-442c-8cb6-1d036215f8ff\ztbfile_procurement.pdf" # invalid_path="D:\\flask_project\\flask_app\\static\\output\\output1\\e7dda5cb-10ba-47a8-b989-d2993d34bb89\\ztbfile.pdf" # truncate_file="D:\\flask_project\\flask_app\\static\\output\\output1\\e7dda5cb-10ba-47a8-b989-d2993d34bb89\\ztbfile_procurement.docx" # output_folder="C:\\Users\\Administrator\\Desktop\\货物标\\output1\\tmp"