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',将'交换机'加入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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user