11.23 确保了系统下层级不超过2

This commit is contained in:
zy123 2024-11-23 16:32:07 +08:00
parent 823a5f0a46
commit 1c542377a9

View File

@ -15,7 +15,43 @@ from flask_app.货物标.截取pdf货物标版 import truncate_pdf_main
from flask_app.general.doubao import doubao_model, generate_full_user_query, pdf2txt
from flask_app.货物标.技术参数要求提取后处理函数 import postprocess, all_postprocess
def truncate_system_keys(data):
"""
遍历输入的字典若键名中包含'系统''软件'且其子键数量 >= 3则将其子键的值设置为[]限制深度为一层
Args:
data (dict or list): 输入的数据可以是嵌套的字典或列表
Returns:
dict or list: 处理后的数据
"""
if isinstance(data, dict):
new_data = {}
for key, value in data.items():
# 检查键名是否包含'系统'或'软件'
if '系统' in key or '软件' in key:
if isinstance(value, dict):
child_count = len(value)
# 判断子键数量是否 >= 3
if child_count >= 3:
# 截断子键,将其值设置为 []
new_data[key] = {subkey: [] for subkey in value.keys()}
else:
# 子键数量少于3递归处理子键
new_data[key] = truncate_system_keys(value)
else:
# 如果值不是字典(例如列表),直接设置为 []
new_data[key] = []
else:
# 不包含'系统'或'软件',递归处理子字典或列表
new_data[key] = truncate_system_keys(value)
return new_data
elif isinstance(data, list):
# 如果是列表,递归处理列表中的每个元素
return [truncate_system_keys(item) for item in data]
else:
# 对于其他类型的数据,保持不变
return data
def generate_key_paths(data):
"""
处理输入的字典生成 key_paths, grouped_paths good_list并根据条件修改原始字典
@ -342,7 +378,7 @@ def get_technical_requirements(file_path,invalid_path,processed_filepath):
2. 采购目标采购目标通常有硬件如设备货物和软件如系统软件应用APP一次采购活动可能同时包含这两种类型对于工程类的施工建设采购需求无需提取
3. 非清单形式处理若未出现采购清单则从表格或文字中摘取采购信息
4. 系统归属一些采购活动可能将采购目标划分为若干系统和货物每个系统可能包含若干货物则将这些货物名称作为该系统的二级键系统可以只包含总体'系统功能'而无货物
5. 软件需求对于软件应用或系统软件需求仅需列出系统模块构成若有并作为该系统键值的一部分无需在模块下再细分功能
5. 软件需求对于软件应用或系统软件采购若有多个系统且序号分明请不要遗漏最多仅需列出系统模块构成若有并作为该系统键值的一部分无需在模块下再细分功能
6. 系统功能若采购的某系统提及总体系统功能则在系统值中添加'系统功能'二级键不展开具体内容
7. 完整性确保不遗漏系统内的货物也不添加未提及的内容
@ -385,8 +421,8 @@ def get_technical_requirements(file_path,invalid_path,processed_filepath):
"系统功能":[],
"权限管理模块":[]
}},
"XX小程序":[],
"数据分析中心":[]
"XX管理系统":[],
"XX管理系统":[]
}}
}}
@ -410,7 +446,8 @@ def get_technical_requirements(file_path,invalid_path,processed_filepath):
print(model_res)
cleaned_res = clean_json_string(model_res) #转字典
key_paths, grouped_paths, good_list, data_copy= generate_key_paths(cleaned_res['采购需求']) # 提取需要采购的货物清单 key_list交通监控视频子系统.高清视频抓拍像机 ... grouped_paths是同一系统下同时有'交换机-1'和'交换机-2',提取'交换机' 输出eg:{'交通标志.标志牌铝板', '交通信号灯.交换机'}
processed_data=truncate_system_keys(cleaned_res['采购需求'])
key_paths, grouped_paths, good_list, data_copy= generate_key_paths(processed_data) # 提取需要采购的货物清单 key_list交通监控视频子系统.高清视频抓拍像机 ... grouped_paths是同一系统下同时有'交换机-1'和'交换机-2',提取'交换机' 输出eg:{'交通标志.标志牌铝板', '交通信号灯.交换机'}
modified_data=rename_keys(data_copy)
# user_query_template = "请你根据该货物标中采购要求部分的内容,请你给出\"{}\"的技术参数或采购要求请以json格式返回结果外层键名为\"{}\", 键值对中的键是你对该要求的总结,而值需要完全与原文保持一致,不可擅自总结删减。"
user_query_template = """请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。请以 JSON 格式返回结果,键名为\"{}\",键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求的字符串,请按原文内容回答,保留三角▲、五角★和序号,不可擅自增添内容,尤其是不可擅自添加序号。
@ -526,22 +563,10 @@ def test_all_files_in_folder(input_folder, output_folder):
except Exception as e:
print(f"处理文件 {file_path} 时出错: {e}")
#TODO:对于软件系统功能,提取偏离表的时候额外处理 包头市公安支队机动车查验监管系统招标文201907_procurement.pdf
#TODO: 提示词限制最多两层防止,嵌套过多,代码也要做处理,'系统'下的最多只有一层 eg 妇幼、陕西
# {
# "采购需求": {
# "查验视频监管软件系统": {
# "视频设备管理": {
# "查验通道初始化": {},
# "视频设备绑定": {}
# },
# "业务视频应用": {
# "视频回放": {}
# },
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\陕西省公安厅交通警察总队高速公路交通安全智能感知巡查系统项目 (1)_procurement.pdf"
truncate_file=r"C:\Users\Administrator\Desktop\货物标\output1\包头市公安支队机动车查验监管系统招标文201907_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"