截取pdf工程/货物尝试合并

This commit is contained in:
zy123 2025-01-09 17:24:02 +08:00
parent 6c5163b2fb
commit 8aa7875a52
9 changed files with 49 additions and 36 deletions

View File

@ -18,7 +18,7 @@ def judge_zbfile(file_path):
若有未涵盖的类型但其内容明确表达了项目需求采购或招标信息且包含指导投标人参与的关键要素则可视为招标文件 若有未涵盖的类型但其内容明确表达了项目需求采购或招标信息且包含指导投标人参与的关键要素则可视为招标文件
请基于上述内容判断文件是否属于招标文件 请基于上述内容判断文件是否属于招标文件
""" """
file_id = upload_file(pdf_path) file_id = upload_file(file_path)
model_res = qianwen_long(file_id, user_query) model_res = qianwen_long(file_id, user_query)
print(f"判断是否属于招标文件:{model_res}") print(f"判断是否属于招标文件:{model_res}")
if '' in model_res: if '' in model_res:

View File

@ -373,7 +373,7 @@ def extract_pages_tobidders_notice(pdf_path, begin_pattern, begin_page, common_h
# 定义基础的 mid_pattern # 定义基础的 mid_pattern
base_mid_pattern = r'^\s*(?:[(]\s*[一二12]?\s*[)]\s*[、..]*|' \ base_mid_pattern = r'^\s*(?:[(]\s*[一二12]?\s*[)]\s*[、..]*|' \
r'[一二12][、..]+|[、..]+)\s*(说\s*明|总\s*则|名\s*词\s*解\s*释)' \ r'[一二12][、..]+|[、..]+)\s*(说\s*明|总\s*则|名\s*词\s*解\s*释)' \
r'|(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!“\s*)(?<!”\s*)(?:投标人?|磋商|谈判|供应商|应答人)\s*须知正文\s*$' r'|(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!“\s*)(?<!”\s*)(?:投标人?|磋商|谈判|供应商|应答人).*须知正文\s*$'
# 合并基础模式和额外模式 # 合并基础模式和额外模式
if additional_mid_pattern: if additional_mid_pattern:
@ -440,8 +440,8 @@ def extract_pages_tobidders_notice(pdf_path, begin_pattern, begin_page, common_h
else: else:
# 定义新的 begin_pattern 和 end_pattern # 定义新的 begin_pattern 和 end_pattern
new_begin_pattern = regex.compile( new_begin_pattern = regex.compile(
r'.*(?:投标人|磋商|谈判|供应商|应答人)须知\s*$|' r'.*(?:投标人|磋商|谈判|供应商|应答人|比选申请人).*须知\s*$|'
r'(?:一\s*、\s*)?(?:投标人?|磋商|谈判|供应商|应答人)须知前附表', r'(?:一\s*、\s*)?(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知前附表',
regex.MULTILINE regex.MULTILINE
) )
new_end_pattern = regex.compile( new_end_pattern = regex.compile(
@ -458,7 +458,7 @@ def extract_pages_tobidders_notice(pdf_path, begin_pattern, begin_page, common_h
def extract_pages_twice_tobidders_notice(pdf_document, common_header, begin_page): def extract_pages_twice_tobidders_notice(pdf_document, common_header, begin_page):
output_suffix = "tobidders_notice" output_suffix = "tobidders_notice"
begin_pattern = regex.compile( begin_pattern = regex.compile(
r'^第[一二三四五六七八九十百千]+(?:章|部分).*(?:(?:投标人?|磋商|谈判|供应商|应答人)须知)+', r'^第[一二三四五六七八九十百千]+(?:章|部分).*(?:(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知)+',
regex.MULTILINE regex.MULTILINE
) )
end_pattern = regex.compile( end_pattern = regex.compile(

View File

@ -2,7 +2,10 @@
2.该招标文件的项目概况或工程概况项目基本情况是请按json格式给我提供信息键名分别为'项目概况','项目基本情况',若存在嵌套信息,嵌套内容键名以文件中对应字段命名,若存在未知信息,在对应的键值中填'未知'。 2.该招标文件的项目概况或工程概况项目基本情况是请按json格式给我提供信息键名分别为'项目概况','项目基本情况',若存在嵌套信息,嵌套内容键名以文件中对应字段命名,若存在未知信息,在对应的键值中填'未知'。
3.该招标文件的招标控制价或投标限价或项目预算金额请按json格式给我提供信息键名为'招标控制价',键值为具体金额,与原文保持一致,特别注意若原文中存在单位'万',不要省略;若存在未知信息,在对应的键值中填'未知'。 3.该招标文件的招标控制价或投标限价或项目预算金额请按json格式给我提供信息键名为'招标控制价',键值为具体金额,与原文保持一致,特别注意若原文中存在单位'万',不要省略;若存在未知信息,在对应的键值中填'未知'。示例输出如下,仅供格式参考:
{
"招标控制价":"48万元"
}
4.投标文件或响应文件递交截止时间是递交地点或方式请按json格式给我提供信息键名分别是'投标文件递交截止日期','投标文件递交地点'(或'投标文件递交方式',键值为原文中相关内容的表述,若存在未知信息,在对应的键值中填'未知',示例输出如下,仅供格式参考: 4.投标文件或响应文件递交截止时间是递交地点或方式请按json格式给我提供信息键名分别是'投标文件递交截止日期','投标文件递交地点'(或'投标文件递交方式',键值为原文中相关内容的表述,若存在未知信息,在对应的键值中填'未知',示例输出如下,仅供格式参考:
{ {

View File

@ -2,7 +2,10 @@
2.该招标文件的项目概况是项目基本情况是请按json格式给我提供信息键名分别为'项目概况','项目基本情况',若存在嵌套信息,嵌套内容键名以文件中对应字段命名,而嵌套键值必须与原文保持一致,若存在未知信息,在对应的键值中填'未知'。 2.该招标文件的项目概况是项目基本情况是请按json格式给我提供信息键名分别为'项目概况','项目基本情况',若存在嵌套信息,嵌套内容键名以文件中对应字段命名,而嵌套键值必须与原文保持一致,若存在未知信息,在对应的键值中填'未知'。
3.该招标文件的招标控制价或投标限价或项目预算金额请按json格式给我提供信息键名为'招标控制价',键值为具体金额,与原文保持一致,特别注意若原文中存在单位'万',不要省略;若存在未知信息,在对应的键值中填'未知'。 3.该招标文件的招标控制价或投标限价或项目预算金额请按json格式给我提供信息键名为'招标控制价',键值为具体金额,与原文保持一致,特别注意若原文中存在单位'万',不要省略;若存在未知信息,在对应的键值中填'未知'。示例输出如下,仅供格式参考:
{
"招标控制价":"48万元"
}
4.投标文件或响应文件递交截止时间是递交地点或方式请按json格式给我提供信息键名分别是'投标文件递交截止日期','投标文件递交地点'(或'投标文件递交方式',键值为原文中相关内容的表述,若存在未知信息,在对应的键值中填'未知',示例输出如下,仅供格式参考: 4.投标文件或响应文件递交截止时间是递交地点或方式请按json格式给我提供信息键名分别是'投标文件递交截止日期','投标文件递交地点'(或'投标文件递交方式',键值为原文中相关内容的表述,若存在未知信息,在对应的键值中填'未知',示例输出如下,仅供格式参考:
{ {

View File

@ -2,7 +2,10 @@
2.该招标文件的项目概况或工程概况项目基本情况是请按json格式给我提供信息键名分别为'项目概况','项目基本情况',若存在嵌套信息,嵌套内容键名以文件中对应字段命名,若存在未知信息,在对应的键值中填'未知'。 2.该招标文件的项目概况或工程概况项目基本情况是请按json格式给我提供信息键名分别为'项目概况','项目基本情况',若存在嵌套信息,嵌套内容键名以文件中对应字段命名,若存在未知信息,在对应的键值中填'未知'。
3.该招标文件的招标控制价或投标限价或项目预算金额请按json格式给我提供信息键名为'招标控制价',键值为具体金额,与原文保持一致,特别注意若原文中存在单位'万',不要省略;若存在未知信息,在对应的键值中填'未知'。 3.该招标文件的招标控制价或投标限价或项目预算金额请按json格式给我提供信息键名为'招标控制价',键值为具体金额,与原文保持一致,特别注意若原文中存在单位'万',不要省略;若存在未知信息,在对应的键值中填'未知'。示例输出如下,仅供格式参考:
{
"招标控制价":"48万元"
}
4.投标文件递交截止日期是请按json格式给我提供信息键名是'投标文件递交截止日期',若原文未提及明确日期时间,请返回原文对应的内容,若存在未知信息,在对应的键值中填'未知'。示例输出格式如下: 4.投标文件递交截止日期是请按json格式给我提供信息键名是'投标文件递交截止日期',若原文未提及明确日期时间,请返回原文对应的内容,若存在未知信息,在对应的键值中填'未知'。示例输出格式如下:
{ {

View File

@ -2,7 +2,10 @@
2.该招标文件的项目概况是项目基本情况是请按json格式给我提供信息键名分别为'项目概况','项目基本情况',若存在嵌套信息,嵌套内容键名以文件中对应字段命名,而嵌套键值必须与原文保持一致,若存在未知信息,在对应的键值中填'未知'。 2.该招标文件的项目概况是项目基本情况是请按json格式给我提供信息键名分别为'项目概况','项目基本情况',若存在嵌套信息,嵌套内容键名以文件中对应字段命名,而嵌套键值必须与原文保持一致,若存在未知信息,在对应的键值中填'未知'。
3.该招标文件的招标控制价或投标限价或项目预算金额请按json格式给我提供信息键名为'招标控制价',键值为具体金额,与原文保持一致,特别注意若原文中存在单位'万',不要省略;若存在未知信息,在对应的键值中填'未知'。 3.该招标文件的招标控制价或投标限价或项目预算金额请按json格式给我提供信息键名为'招标控制价',键值为具体金额,与原文保持一致,特别注意若原文中存在单位'万',不要省略;若存在未知信息,在对应的键值中填'未知'。示例输出如下,仅供格式参考:
{
"招标控制价":"48万元"
}
4.投标文件或响应文件递交截止时间是请按json格式给我提供信息键名是'投标文件递交截止日期',若原文未提及明确日期时间,请返回原文对应的内容,若存在未知信息,在对应的键值中填'未知'。示例输出格式如下: 4.投标文件或响应文件递交截止时间是请按json格式给我提供信息键名是'投标文件递交截止日期',若原文未提及明确日期时间,请返回原文对应的内容,若存在未知信息,在对应的键值中填'未知'。示例输出格式如下:
{ {

View File

@ -1,20 +1,23 @@
import re import regex
cleaned_text = """第三章 评标办法 (综合评分法) # 新的正则表达式
评标原则 begin_pattern = regex.compile(
1.评标将本着公平公正科学择优的原则进行 r'^第[一二三四五六七八九十百千]+(?:章|部分).*(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知+|'
2.依法评标严格保密 r'(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!"\s*)(?<!"\s*)(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知前附表\s*$',
... regex.MULTILINE
8.投标文件 含有招标人不能接受的附加条件的 )
"""
end_pattern = '^(?:第[一二三四五六七八九十百千]+(?:章|部分)\s*[\u4e00-\u9fff]+|评标办法前附表|附录(?:一)?[:]|附件(?:一)?[:]|附表(?:一)?[:]' # 测试文本
matches = list(re.finditer(end_pattern, cleaned_text, re.MULTILINE)) test_texts = [
"第一章 投标人 须知", # 匹配
"第九章 磋商 123 须知", # 匹配
"第十章 谈判一些内容须知", # 匹配
"第二章 投标人123abc须知前附表", # 匹配
"第一部分 供应商\n须知", # 不匹配,因为有换行
"第八章 其他内容须知" # 不匹配
]
if matches: # 测试匹配
end_index = matches[-1].start() for idx, text in enumerate(test_texts):
cleaned_text = cleaned_text[:end_index] match = begin_pattern.search(text)
print("匹配成功,截断后文本:") print(f"Test case {idx + 1}: {'Matched' if match else 'Not Matched'}")
print(cleaned_text)
else:
print("未匹配到内容。")

View File

@ -68,7 +68,7 @@ def extract_pages_tobidders_notice(pdf_path, output_folder, begin_pattern, begin
# 定义基础的 mid_pattern # 定义基础的 mid_pattern
base_mid_pattern = r'^\s*(?:[(]\s*[一二12]?\s*[)]\s*[、..]*|' \ base_mid_pattern = r'^\s*(?:[(]\s*[一二12]?\s*[)]\s*[、..]*|' \
r'[一二12][、..]+|[、..]+)\s*(说\s*明|总\s*则|名\s*词\s*解\s*释)' \ r'[一二12][、..]+|[、..]+)\s*(说\s*明|总\s*则|名\s*词\s*解\s*释)' \
r'|(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!“\s*)(?<!”\s*)(?:投标人?|磋商|谈判|供应商|应答人)\s*须知正文\s*$' r'|(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!“\s*)(?<!”\s*)(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知正文\s*$'
# 合并基础模式和额外模式 # 合并基础模式和额外模式
if additional_mid_pattern: if additional_mid_pattern:
combined_mid_pattern = regex.compile( combined_mid_pattern = regex.compile(
@ -179,9 +179,7 @@ def extract_pages_twice(pdf_path, output_folder, output_suffix, common_header, l
) )
# 定义结束匹配模式 - 章节标题、评标附表、投标人须知等 # 定义结束匹配模式 - 章节标题、评标附表、投标人须知等
end_pattern_chapter = regex.compile( end_pattern_chapter = regex.compile(
r'第[一二三四五六七八九]+(?:章|部分)\s*[\u4e00-\u9fff、()]+\s*$|' r'第[一二三四五六七八九]+(?:章|部分)\s*[\u4e00-\u9fff、()]+\s*$|',
r'\s*评标(?:办法|方法)前附表\s*$|'
r'投标人须知',
regex.MULTILINE regex.MULTILINE
) )
start_page = None start_page = None
@ -316,8 +314,8 @@ def truncate_pdf_main_engineering(input_path, output_folder, selection, logger,
pattern_pairs = [ pattern_pairs = [
( (
regex.compile( regex.compile(
r'^第[一二三四五六七八九十百千]+(?:章|部分).*(?:投标人?|磋商|谈判|供应商|应答人)须知+|' r'^第[一二三四五六七八九十百千]+(?:章|部分).*(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知+|'
r'(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!"\s*)(?<!"\s*)(?:投标人?|磋商|谈判|供应商|应答人)须知前附表\s*$', r'(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!"\s*)(?<!"\s*)(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知前附表\s*$',
regex.MULTILINE regex.MULTILINE
), ),
regex.compile( regex.compile(
@ -327,8 +325,8 @@ def truncate_pdf_main_engineering(input_path, output_folder, selection, logger,
), ),
( (
regex.compile( regex.compile(
r'.*(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!“\s*)(?<!”\s*)(?:投标人?|磋商|谈判|供应商|应答人)须知\s*$|' r'.*(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!“\s*)(?<!”\s*)(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知\s*$|'
r'(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!“\s*)(?<!”\s*)(?:投标人?|磋商|谈判|供应商|应答人)须知前附表\s*$', r'(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!“\s*)(?<!”\s*)(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知前附表\s*$',
regex.MULTILINE regex.MULTILINE
), ),
regex.compile( regex.compile(

View File

@ -267,8 +267,8 @@ def truncate_pdf_main_goods(input_path, output_folder, selection,logger, output_
local_output_suffix = "qualification1" local_output_suffix = "qualification1"
elif selection == 4: elif selection == 4:
begin_pattern = regex.compile( begin_pattern = regex.compile(
r'^第[一二三四五六七八九十百千]+(?:章|部分).*(?:投标人?|磋商|谈判|供应商|应答人)须知+|' r'^第[一二三四五六七八九十百千]+(?:章|部分).*(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知+|'
r'(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!"\s*)(?<!"\s*)(?:投标人?|磋商|谈判|供应商|应答人)须知前附表\s*$', r'(?<!见\s*)(?<!与\s*)(?<!"\s*)(?<!"\s*)(?<!"\s*)(?:投标人?|磋商|谈判|供应商|应答人|比选申请人).*须知前附表\s*$',
regex.MULTILINE regex.MULTILINE
) )
end_pattern = None end_pattern = None