11.21 解决了复杂、多层的采购需求bug
This commit is contained in:
parent
9c3b56b2f0
commit
ac8bd8022b
@ -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"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user