From 4b195f6a6a78a51454d65f52cdbdfd4afbb63277 Mon Sep 17 00:00:00 2001 From: zy123 <646228430@qq.com> Date: Fri, 8 Nov 2024 19:30:19 +0800 Subject: [PATCH] =?UTF-8?q?11.8=20=E6=88=AA=E5=8F=96=E8=B5=84=E6=A0=BC?= =?UTF-8?q?=E6=96=87=E4=BB=B6bug=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flask_app/main/商务评分技术评分整合.py | 68 ++++++++++++++---------- flask_app/main/截取pdf.py | 43 +++++++++++---- flask_app/static/提示词/第三章提示词.txt | 38 +++++++++++++ flask_app/货物标/评分标准提取main.py | 34 +++++++----- flask_app/货物标/货物标解析main.py | 3 ++ 5 files changed, 132 insertions(+), 54 deletions(-) diff --git a/flask_app/main/商务评分技术评分整合.py b/flask_app/main/商务评分技术评分整合.py index 5ab00d1..96a4669 100644 --- a/flask_app/main/商务评分技术评分整合.py +++ b/flask_app/main/商务评分技术评分整合.py @@ -114,38 +114,48 @@ def combine_evaluation_standards(evaluation_method): # "根据该文档中的评标办法前附表,请你列出该文件的技术评分,商务评分,投标报价评审标准以及它们对应的具体评分要求,若对应内容中存在其他信息,在键名如'技术评分'中新增子键名'备注'存放该信息。如果评分内容(因素)不是这3个,则返回文档中给定的评分内容(因素)以及它的评分要求。请以json格式返回结果,不要回答有关形式、资格、响应性评审标准的内容") user_query_2 = ( """ - 根据该文档中的评标办法前附表,请你列出该文件的技术评分,商务评分,投标报价评审标准以及它们对应的具体评分要求,请以json格式返回结果,请在这三大块评分中分别用若干键值对表示具体要求,其内层的键名为'评分'及'要求',若这三大块评分中存在其他信息,则在相应评分大块中新增键名'备注'存放该信息,键值为具体的要求,否则不需要。如果评分内容(因素)不是这3个,则返回文档中给定的评分内容(因素)以及它们的具体评分要求。不要回答有关形式、资格、响应性评审标准的内容,若存在未知信息,填充'未知'。以下为示例输出: - { - "技术评分": { - "主要监理岗位的职责": { - "评分": "4分", - "要求": "1、总监理工程师的职责全面、清晰、合理得 1.2-2分;一般的1.2分。2、其他主要监理人员及岗位的职责全面、清晰、合理得 1.2-2分;一般的 1.2分。" - } - }, - "商务评分": { - "控制系统内主板": { - "评分": "10分", - "要求": "所投电梯控制系统内主板为制造商原厂原品牌制造生产且为进口部件得 10分。(提供进口部件报关单及原产地证明扫描件加盖公章,否则不得分)" +根据该文档中的评标办法前附表,请你列出该文件的技术评分,商务评分,投标报价评审以及它们对应的具体评分要求,请以json格式返回结果,最外层键名分别是'技术评分','商务评分','投标报价评分',请在这三大项评分中分别用若干键值对表示具体评分项,外层键名为各评审因素,键值为一个列表,列表中包含若干(可为一)描述该评审因素的评分及要求的字典,内层键名分别是'评分'和'要求',若无评分,可删去'评分'键值对,'要求'中说明了该评审因素的评分标准;若这三大项评分中存在其他信息,则在相应评分大块内部新增键名'备注'存放该信息,键值为具体的要求,否则不需要。如果评分内容(因素)不是这三大项,则返回文档中给定的评分内容(因素)以及它们的具体评分要求。 +以下为需要考虑的注意事项:1.不要回答有关资格审查的内容,也不要从评标办法正文中提取回答 2.若大项的'xx评分'要求未在文中说明,则键名'xx评分'的键值设为'本项目无xx评分项',例如"技术评分":"本项目无技术评分项" 3. 如果该招标活动有多个包,则最外层键名为对应的包名,否则不需要 4.你无需将表格的单元格内的内容进行拆分,需要将它视为一个整体。以下为示例输出,仅供格式参考: + { + "一包": { + "技术评分": { + "主要监理岗位的职责": [ + { + "评分": "4分", + "要求": "1、总监理工程师的职责全面、清晰、合理得 1.2-2分;一般的1.2分。2、其他主要监理人员及岗位的职责全面、清晰、合理得 1.2-2分;一般的 1.2分。" + } + ], + "备注": "注:若不满足“与公安部、省公安厅、随州市公安局高清视频会议系统无缝对接互联互通”的要求,则本项技术部分(50分)不得分。" }, - "制造商技术实力": [ - { - "评分": "3分", - "要求": "一级证书得3分,二级证书得1分,其他不得分" - }, - { - "评分": "2分", - "要求": "行业销量排名连续前 2 名,得 2 分,第 4-6 名得 0.5 分,其他不得分" - } - ] - }, - "投标报价评审": { - "投标报价是否出现违反计价规范": { - "评分": "合格/不合格", - "要求": "A:投标报价未违反计价规范的,评审意见为“合格”;B:投标报价违反计价规范的,评审意见为“不合格”" + "商务评分": { + "控制系统内主板": [ + { + "评分": "10分", + "要求": "所投电梯控制系统内主板为制造商原厂原品牌制造生产且为进口部件得 10分。(提供进口部件报关单及原产地证明扫描件加盖公章,否则不得分)" + } + ], + "制造商技术实力": [ + { + "评分": "3分", + "要求": "一级证书得3分,二级证书得1分,其他不得分" + }, + { + "评分": "2分", + "要求": "行业销量排名连续前 2 名,得 2 分,第 4-6 名得 0.5 分,其他不得分" + } + ] + }, + "投标报价评审": { + "投标报价是否出现违反计价规范": [ + { + "评分": "合格制", + "要求": "A:投标报价未违反计价规范的,评审意见为“合格”;B:投标报价违反计价规范的,评审意见为“不合格”" + } + ] } } } - """ + """ ) evaluation_res = qianwen_long(file_id, user_query_2) @@ -156,7 +166,7 @@ def combine_evaluation_standards(evaluation_method): return update_json #商务标技术标整合 if __name__ == "__main__": # evaluation_method="C:\\Users\\Administrator\\Desktop\\招标文件\\招标01_evaluation_method.pdf" - evaluation_method="C:\\Users\\Administrator\\Desktop\\fsdownload\\1801777e-6746-4cd6-8b10-778b3ea57597\\ztbfile_evaluation_method.pdf" + evaluation_method= "C:\\Users\\Administrator\\Desktop\\招标文件\\招标test文件夹\\tmp\\zbtest1_evaluation_method.pdf" evaluation_standards_res=combine_evaluation_standards(evaluation_method) # 从结果中提取"商务标"和"技术标" technical_standards = {"技术评分": evaluation_standards_res.get("技术评分", {})} diff --git a/flask_app/main/截取pdf.py b/flask_app/main/截取pdf.py index 65133c8..bc6fdcc 100644 --- a/flask_app/main/截取pdf.py +++ b/flask_app/main/截取pdf.py @@ -233,36 +233,57 @@ def extract_pages_twice(pdf_path, output_folder, output_suffix, common_header, l try: pdf_document = PdfReader(pdf_path) if output_suffix == "qualification": + # 动态设置 include_keys + include_keys = ["资格", "资质", "能力", "信誉"] + # 定义起始匹配模式,仅匹配“附录”、“附件”或“附表” begin_pattern = r'^(?:附录(?:[一1])?[::]|附件(?:[一1])?[::]|附表(?:[一1])?[::])' - end_pattern = re.compile( - r'^(?:附录[一二三四五六七八九1-9]*[::]|附件[一二三四五六七八九1-9]*[::]|附表[一二三四五六七八九1-9]*[::])(?!.*(?:资质|能力|信誉)).*$|' - r'第[一二三四五六七八九]+(?:章|部分)\s*[\u4e00-\u9fff、()()]\s*$|\s*评标(办法|方法)前附表\s*$|投标人须知', + # 定义结束匹配模式 - 附录、附件、附表等(移除负向前瞻) + end_pattern_attachment = re.compile( + r'^(?:附录[一二三四五六七八九1-9]*[::]|附件[一二三四五六七八九1-9]*[::]|附表[一二三四五六七八九1-9]*[::]).*$', + re.MULTILINE + ) + # 定义结束匹配模式 - 章节标题、评标附表、投标人须知等 + end_pattern_chapter = re.compile( + r'第[一二三四五六七八九]+(?:章|部分)\s*[\u4e00-\u9fff、()()]+\s*$|' + r'\s*评标(?:办法|方法)前附表\s*$|' + r'投标人须知', re.MULTILINE ) start_page = None end_page = None - # 从章节开始后的位置进行检查 + # 从指定的开始页开始遍历 for i, page in enumerate(pdf_document.pages[last_begin_index:], start=last_begin_index): text = page.extract_text() if text: cleaned_text = clean_page_content(text, common_header) # 确定起始页,需在last_begin_index之后 - if "资格" in cleaned_text or "资质" in cleaned_text: # 当页包含这些内容可以认为是'资格审查资料部分' + if any(key in cleaned_text for key in include_keys): if re.search(begin_pattern, cleaned_text, re.MULTILINE): if start_page is None: start_page = i # 确保起始页不小于章节的开始页码 - # 确定结束页 - if start_page is not None and re.search(end_pattern, cleaned_text): + continue + # print(f"匹配到附录/附件/附表,设置起始页为: {start_page}") + # 确定结束页 - 附录、附件、附表等 + if start_page is not None and end_pattern_attachment.search(cleaned_text): + # 额外检查当前页面是否不包含任何 include_keys + if not any(key in cleaned_text for key in include_keys): + if i > start_page: + end_page = i + # print(f"找到结束页 (附件类): {end_page}") + break # 找到结束页后退出循环 + else: + print(f"当前页面匹配附件结束模式但包含 include_keys,继续查找。页面: {i}") + # 确定结束页 - 章节标题、评标附表、投标人须知等 + elif start_page is not None and end_pattern_chapter.search(cleaned_text): if i > start_page: end_page = i + # print(f"找到结束页 (章节标题等): {end_page}") break # 找到结束页后退出循环 - if start_page is None or end_page is None: print(f"{output_suffix} twice: 未找到起始或结束页在文件 {pdf_path} 中!") return [] else: - return [ - save_pages_to_new_pdf(pdf_path, output_folder, output_suffix, start_page, end_page, common_header)] + return [save_pages_to_new_pdf(pdf_path, output_folder, output_suffix, start_page, end_page, common_header)] elif output_suffix == "invalid": pdf_document = PdfReader(pdf_path) total_pages = len(pdf_document.pages) @@ -569,7 +590,7 @@ if __name__ == "__main__": # input_path="C:\\Users\\Administrator\\Desktop\\fsdownload\\0b1861e6-c7f6-4541-9182-b1384ba84f3b\\ztbfile.pdf" # input_path = "C:\\Users\\Administrator\\Desktop\\货物标\\zbfiles\\2-招标文件.pdf" input_path="C:\\Users\\Administrator\\Desktop\\招标文件\\招标test文件夹" - output_folder = "C:\\Users\\Administrator\\Desktop\\fsdownload\\0b1861e6-c7f6-4541-9182-b1384ba84f3b\\tmp" + output_folder = "C:\\Users\\Administrator\\Desktop\\招标文件\\招标test文件夹\\tmp" # files=truncate_pdf_multiple(input_path,output_folder) # selections = [4, 1] # 仅处理 selection 4、1 # files=truncate_pdf_specific_engineering(input_path,output_folder,selections) diff --git a/flask_app/static/提示词/第三章提示词.txt b/flask_app/static/提示词/第三章提示词.txt index 2fd7454..eded0d8 100644 --- a/flask_app/static/提示词/第三章提示词.txt +++ b/flask_app/static/提示词/第三章提示词.txt @@ -109,3 +109,41 @@ prompt=""" 投标内容==招标范围、监理服务期、监理工作范围、投标有效期、投标保证金、算术错误修正、投标价格(报价)、其他、工期、工程质量==(质量,质量标准)、权利义务、已标价工程量清单、技术标准和要求、招标人不能接受的条件、分包计划、重大偏差 +user_query = ( + """ + 根据该文档中的评标办法前附表,请你列出该文件的技术评分,商务评分,投标报价评审以及它们对应的具体评分要求,请以json格式返回结果,请在这三大块评分中分别用若干键值对表示具体要求,请精确到具体的评审项,内层的键名为'评分'及'要求',若这三大块评分中存在其他信息,则在相应评分大块内部新增键名'备注'存放该信息,键值为具体的要求,否则不需要。如果评分内容(因素)不是这3个,则返回文档中给定的评分内容(因素)以及它们的具体评分要求,如果该采购活动有多个包,则最外层键名为对应的包名,否则不需要。不要回答有关资格审查的内容,若存在未知信息,填充'未知'。以下为示例输出,仅供格式参考: + { + "一包": { + "技术评分": { + "主要监理岗位的职责": { + "评分": "4分", + "要求": "1、总监理工程师的职责全面、清晰、合理得 1.2-2分;一般的1.2分。2、其他主要监理人员及岗位的职责全面、清晰、合理得 1.2-2分;一般的 1.2分。" + }, + "备注": "注:若不满足“与公安部、省公安厅、随州市公安局高清视频会议系统无缝对接互联互通”的要求,则本项技术部分(50分)不得分。" + }, + "商务评分": { + "控制系统内主板": { + "评分": "10分", + "要求": "所投电梯控制系统内主板为制造商原厂原品牌制造生产且为进口部件得 10分。(提供进口部件报关单及原产地证明扫描件加盖公章,否则不得分)" + }, + "制造商技术实力": [ + { + "评分": "3分", + "要求": "一级证书得3分,二级证书得1分,其他不得分" + }, + { + "评分": "2分", + "要求": "行业销量排名连续前 2 名,得 2 分,第 4-6 名得 0.5 分,其他不得分" + } + ] + }, + "投标报价评审": { + "投标报价是否出现违反计价规范": { + "评分": "合格/不合格", + "要求": "A:投标报价未违反计价规范的,评审意见为“合格”;B:投标报价违反计价规范的,评审意见为“不合格”" + } + } + } + } + """ + ) \ No newline at end of file diff --git a/flask_app/货物标/评分标准提取main.py b/flask_app/货物标/评分标准提取main.py index 8ac6a7c..e3425d7 100644 --- a/flask_app/货物标/评分标准提取main.py +++ b/flask_app/货物标/评分标准提取main.py @@ -224,21 +224,25 @@ def combine_evaluation_standards(truncate_file): # user_query = "根据该文档中的评标办法前附表或者评分标准表,请你列出该文件的技术评分,商务评分,投标报价评审标准以及它们对应的具体评分要求,外层键名分别为'技术评分','商务评分','投标报价'。如果评分内容不是这3个,则返回文档中给定的评分内容以及它的评分要求,都以json的格式返回结果,如果该采购活动有多个包,则最外层键名为对应的包名。请不要回答有关资格审查的内容" user_query = ( """ - 根据该文档中的评标办法前附表,请你列出该文件的技术评分,商务评分,投标报价评审以及它们对应的具体评分要求,请以json格式返回结果,请在这三大块评分中分别用若干键值对表示具体要求,请精确到具体的评审项,内层的键名为'评分'及'要求',若这三大块评分中存在其他信息,则在相应评分大块内部新增键名'备注'存放该信息,键值为具体的要求,否则不需要。如果评分内容(因素)不是这3个,则返回文档中给定的评分内容(因素)以及它们的具体评分要求,如果该采购活动有多个包,则最外层键名为对应的包名,否则不需要。不要回答有关资格审查的内容,若存在未知信息,填充'未知'。以下为示例输出: + 根据该文档中的评标办法前附表(非评标办法正文部分),请你列出该文件的技术评分,商务评分,投标报价评审以及它们对应的具体评分要求,请以json格式返回结果,请在这三大块评分中分别用若干键值对表示具体评分项,外层键名为各评审因素,键值为列表,列表中包含若干描述该评审因素的评分及要求的字典,内层键名分别是'评分'及'要求',列表中可以仅包含一项内容;若这三大块评分中存在其他信息,则在相应评分大块内部新增键名'备注'存放该信息,键值为具体的要求,否则不需要。如果评分内容(因素)不是这3个,则返回文档中给定的评分内容(因素)以及它们的具体评分要求,如果该采购活动有多个包,则最外层键名为对应的包名,否则不需要。不要回答有关资格审查的内容,若存在未知信息,填充'未知',。以下为示例输出,仅供格式参考: { "一包": { "技术评分": { - "主要监理岗位的职责": { - "评分": "4分", - "要求": "1、总监理工程师的职责全面、清晰、合理得 1.2-2分;一般的1.2分。2、其他主要监理人员及岗位的职责全面、清晰、合理得 1.2-2分;一般的 1.2分。" - }, + "主要监理岗位的职责": [ + { + "评分": "4分", + "要求": "1、总监理工程师的职责全面、清晰、合理得 1.2-2分;一般的1.2分。2、其他主要监理人员及岗位的职责全面、清晰、合理得 1.2-2分;一般的 1.2分。" + } + ], "备注": "注:若不满足“与公安部、省公安厅、随州市公安局高清视频会议系统无缝对接互联互通”的要求,则本项技术部分(50分)不得分。" }, "商务评分": { - "控制系统内主板": { - "评分": "10分", - "要求": "所投电梯控制系统内主板为制造商原厂原品牌制造生产且为进口部件得 10分。(提供进口部件报关单及原产地证明扫描件加盖公章,否则不得分)" - }, + "控制系统内主板": [ + { + "评分": "10分", + "要求": "所投电梯控制系统内主板为制造商原厂原品牌制造生产且为进口部件得 10分。(提供进口部件报关单及原产地证明扫描件加盖公章,否则不得分)" + } + ], "制造商技术实力": [ { "评分": "3分", @@ -251,10 +255,12 @@ def combine_evaluation_standards(truncate_file): ] }, "投标报价评审": { - "投标报价是否出现违反计价规范": { - "评分": "合格/不合格", - "要求": "A:投标报价未违反计价规范的,评审意见为“合格”;B:投标报价违反计价规范的,评审意见为“不合格”" - } + "投标报价是否出现违反计价规范": [ + { + "评分": "合格/不合格", + "要求": "A:投标报价未违反计价规范的,评审意见为“合格”;B:投标报价违反计价规范的,评审意见为“不合格”" + } + ] } } } @@ -297,7 +303,7 @@ def combine_evaluation_standards(truncate_file): if __name__ == "__main__": start_time=time.time() - truncate_file="D:\\flask_project\\flask_app\\static\\output\\output1\\e7dda5cb-10ba-47a8-b989-d2993d34bb89\\ztbfile_evaluation_method.pdf" + truncate_file=r"C:\Users\Administrator\Desktop\fsdownload\1ca1d27d-fc21-4697-8075-9027103df030\ztbfile_evaluation_method.pdf" # truncate_file = "C:\\Users\\Administrator\\Desktop\\货物标\\output2\\2-招标文件(统计局智能终端二次招标)_evaluation_method.pdf" # truncate_file="C:\\Users\\Administrator\\Desktop\\货物标\\output2\\广水市妇幼招标文件最新(W改)_evaluation_method.pdf" # truncate_file = "C:\\Users\\Administrator\\Desktop\\fsdownload\\2d481945-1f82-45a5-8e56-7fafea4a7793\\ztbfile_evaluation_method.pdf" diff --git a/flask_app/货物标/货物标解析main.py b/flask_app/货物标/货物标解析main.py index 17de695..2cf5c3d 100644 --- a/flask_app/货物标/货物标解析main.py +++ b/flask_app/货物标/货物标解析main.py @@ -246,6 +246,9 @@ def goods_bid_main(output_folder, file_path, file_type, unique_id): #TODO:工程标的资格审查也增加第一章的内容。 #TODO:工程标 资格审查 +#TODO:把所有未知都删掉。 +#TODO:流式输出 +#商务标这里改为列表最里层 #good_list 金额 截取上下文 if __name__ == "__main__": # 配置日志器