11.21 解决了复杂、多层的采购需求bug

This commit is contained in:
zy123 2024-11-21 19:18:42 +08:00
parent 9c3b56b2f0
commit ac8bd8022b

View File

@ -18,7 +18,7 @@ def generate_key_paths(data, parent_key='', good_list=None, seen=None):
""" """
生成嵌套字典中的键路径并提取最内层的键名 生成嵌套字典中的键路径并提取最内层的键名
同时提取特定模式的键 '交换机-1', '交换机-2'的父路径 同时提取特定模式的键 '交换机-1', '交换机-2'的父路径
如果同一层级下只有'交换机-1'但没有'交换机-2'则视为错误输入删除后缀'-1''交换机'加入key_paths 如果同一层级下只有'交换机-1'但没有'交换机-2'则视为错误输入将键名中的后缀'-1'删除直接修改为'交换机'保持顺序
参数: 参数:
data (dict): 输入的字典数据 data (dict): 输入的字典数据
@ -44,7 +44,7 @@ def generate_key_paths(data, parent_key='', good_list=None, seen=None):
prefix_groups = {} prefix_groups = {}
other_keys = [] other_keys = []
for key in data: for key in list(data.keys()): # 使用 list(data.keys()) 防止修改字典时出错
clean_key = key.replace(" ", "") clean_key = key.replace(" ", "")
match = pattern.match(clean_key) match = pattern.match(clean_key)
if match: if match:
@ -66,14 +66,29 @@ def generate_key_paths(data, parent_key='', good_list=None, seen=None):
seen.add(prefix) seen.add(prefix)
no_keys_added = False no_keys_added = False
else: else:
# 只有一个键匹配:删除后缀并添加到 key_paths # 只有一个键匹配:重命名键,删除后缀,并保持顺序
key = keys[0] old_key = keys[0]
key_path = current_prefix_path # 去掉后缀后,路径为父路径 + 前缀 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) key_paths.append(key_path)
if prefix not in seen: if prefix not in seen:
good_list.append(prefix) good_list.append(prefix)
seen.add(prefix) seen.add(prefix)
no_keys_added = False no_keys_added = False
# 注意:由于直接修改字典,键的顺序可能会受到影响
# Step 3: Handle other keys # Step 3: Handle other keys
for key in 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) seen.add(clean_key)
# 更新 no_keys_added # 更新 no_keys_added
no_keys_added = False 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 return key_paths, good_list, grouped_paths, no_keys_added
def combine_and_update_results(original_data, updates): def combine_and_update_results(original_data, updates):
def normalize_key(key): def normalize_key(key):
""" """
@ -355,7 +372,7 @@ def get_technical_requirements(file_path,invalid_path):
ffinal_res = postprocess(cleaned_res) ffinal_res = postprocess(cleaned_res)
else: else:
# user_query_template = "请你根据该货物标中采购要求部分的内容,请你给出\"{}\"的技术参数或采购要求请以json格式返回结果外层键名为\"{}\", 键值对中的键是你对该要求的总结,而值需要完全与原文保持一致,不可擅自总结删减。" # user_query_template = "请你根据该货物标中采购要求部分的内容,请你给出\"{}\"的技术参数或采购要求请以json格式返回结果外层键名为\"{}\", 键值对中的键是你对该要求的总结,而值需要完全与原文保持一致,不可擅自总结删减。"
user_query_template = """请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。请以 JSON 格式返回结果,键名为\"{}\",键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求的字符串,内容需与原文一致,即若技术参数前存在序号也要保留,但不可擅自增添或删减 user_query_template = """请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。请以 JSON 格式返回结果,键名为\"{}\",键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求的字符串,请按原文内容回答,保留三角▲、五角★和序号,不可擅自增添内容,尤其是不可擅自添加序号
要求与指南 要求与指南
1. 如果该货物没有相关采购要求或技术参数要求键值应为空列表 1. 如果该货物没有相关采购要求或技术参数要求键值应为空列表
2. 如果存在嵌套结构且原文为Markdown 的表格语法'摄像机|有效像素|≥900W像素' 请不要返回该Markdown语法而是使用冒号':'将相关信息拼接在一起生成一条完整且清晰的技术参数或采购要求描述作为列表中的一个字符串"摄像机有效像素≥900W像素" 2. 如果存在嵌套结构且原文为Markdown 的表格语法'摄像机|有效像素|≥900W像素' 请不要返回该Markdown语法而是使用冒号':'将相关信息拼接在一起生成一条完整且清晰的技术参数或采购要求描述作为列表中的一个字符串"摄像机有效像素≥900W像素"
@ -379,7 +396,7 @@ def get_technical_requirements(file_path,invalid_path):
] ]
}} }}
""" """
user_query_template_two="""请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。由于该货物存在多种不同的采购要求或技术参数,请逐一列出,并以 JSON 格式返回结果。请以'货物名-编号'区分多种型号,编号为从 1 开始的自然数,依次递增,即第一个键名为\"{}-1\", 键值为一个列表,列表中包含若干描述\"{}\"的技术参数(或采购要求)的字符串,需与原文完全一致,即若技术参数前存在序号也要保留,但不可擅自增添或删减 user_query_template_two="""请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。由于该货物存在多种不同的采购要求或技术参数,请逐一列出,并以 JSON 格式返回结果。请以'货物名-编号'区分多种型号,编号为从 1 开始的自然数,依次递增,即第一个键名为\"{}-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__": if __name__ == "__main__":
start_time=time.time() start_time=time.time()
# truncate_file="C:\\Users\\Administrator\\Desktop\\fsdownload\\469d2aee-9024-4993-896e-2ac7322d41b7\\ztbfile_procurement.docx" # 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" # 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" # 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" # output_folder="C:\\Users\\Administrator\\Desktop\\货物标\\output1\\tmp"