|
@@ -29,7 +29,7 @@ import datetime
|
|
|
from BiddingKG.dl.entityLink.entityLink import get_business_data
|
|
|
from BiddingKG.dl.proposed_building.pb_extract import PBPredictor
|
|
|
# from BiddingKG.dl.interface.getAttributes import turnMoneySource
|
|
|
-from BiddingKG.dl.common.Utils import del_tabel_achievement
|
|
|
+from BiddingKG.dl.common.Utils import del_tabel_achievement, clean_company
|
|
|
from BiddingKG.dl.interface.getAttributes import turnMoneySource, extract_serviceTime
|
|
|
from BiddingKG.dl.time.re_servicetime import extract_servicetime
|
|
|
# import fool # 统一用 selffool ,阿里云上只有selffool 包
|
|
@@ -79,7 +79,8 @@ def get_role(text, nlp_enterprise):
|
|
|
elif ner[2] in ['location'] and re.search('^\w{3,10}(海关|殡仪馆|店|村委会|纪念馆|监狱|管教所|修养所|社区|农场|林场|羊场|猪场|石场)$', ner[3]):
|
|
|
roles.append(ner[3])
|
|
|
if roles and len(''.join(roles)) > len(text)*0.8:
|
|
|
- return roles[0]
|
|
|
+ entity = clean_company(roles[0])
|
|
|
+ return entity
|
|
|
else:
|
|
|
return ''
|
|
|
|
|
@@ -883,7 +884,7 @@ class PREMPredict():
|
|
|
elif re.search('受托人((盖章))?:$', front):
|
|
|
label = 1
|
|
|
values[label] = 0.501
|
|
|
- elif re.search('采用$|异议受理部门|本次招标有:$|直购企业:$|主报名人:$', front): # 368177736 因本项目招标采用广西壮族自治区公共资源交易平台系统- 标公告,本次招标有:内黄县汇融钢材有限公司、安阳正元建筑工程有限公司、内黄县鸿业贸易有限责任公司三家合格供应商进行报名投标。 438880541 直购企业可能为多个,其中一个中标
|
|
|
+ elif re.search('采用$|异议受理部门|本次招标有:$|直购企业:$|主报名人:$|采购候选人:$', front): # 368177736 因本项目招标采用广西壮族自治区公共资源交易平台系统- 标公告,本次招标有:内黄县汇融钢材有限公司、安阳正元建筑工程有限公司、内黄县鸿业贸易有限责任公司三家合格供应商进行报名投标。 438880541 直购企业可能为多个,其中一个中标
|
|
|
label = 5
|
|
|
elif re.search(',单位名称:$', front) and re.search('^,(中标|中选)价格', behind):
|
|
|
label = 2
|
|
@@ -895,7 +896,7 @@ class PREMPredict():
|
|
|
elif re.search('尊敬的供应商:.{,25}我公司', whole):
|
|
|
label = 0
|
|
|
values[label] = 0.801
|
|
|
- elif re.search('尊敬的供应商:$', front):
|
|
|
+ elif re.search('尊敬的供应商:$|本项目确定1名中[标选]人为$', front):
|
|
|
label = 0
|
|
|
values[label] = 0.501
|
|
|
elif re.search('第[4-9四五六]中标候选人|(提交单位|竞投单位):$|第[4-9四五六七八九十]名', front): #修复第4以上的预测错为中标人
|
|
@@ -915,7 +916,7 @@ class PREMPredict():
|
|
|
elif re.search('^,?(投标报价|(资格性审查:|符合性审查:)?(不通过|不符合))', behind) and re.search('中标|成交|中选|排名|排序|名次|第[一1]', front)==None and values[2]<0.7: #20241126补充条件避免漏提 560768263 第一候选人:单位名称: 上海理想信息产业(集团)有限公司 ,投标报价:
|
|
|
values[2] = 0.5
|
|
|
label = 5
|
|
|
- elif re.search('(承包权人|帐户名称|债务人|推荐预审合格投标人名单):$|确定为标的的受让方,$|[主次出]入口?,?$|确定(项目|\w{,2})成交供应商,$|,承刻单位:$|乙方接受为$|丙方:$', front): # 234501112 民币元,序号:1,债务人: 东营市海宁工贸有限责任公司 ,债权本金: 262414286 八、中标后签约单位,合同签约单位: 241929628 1月9,承刻单位: 肃宁县超凡网络光敏印章刻印部 ,印章预留印模
|
|
|
+ elif re.search('(承包权人|帐户名称|债务人|推荐预审合格投标人名单):$|确定为标的的受让方,$|[主次出]入口?,?$|确定(项目|\w{,2})成交供应商,$|,承刻单位:$|乙方接受为$|丙方:$|来源名称:$', front): # 234501112 民币元,序号:1,债务人: 东营市海宁工贸有限责任公司 ,债权本金: 262414286 八、中标后签约单位,合同签约单位: 241929628 1月9,承刻单位: 肃宁县超凡网络光敏印章刻印部 ,印章预留印模 600825761 来源名称:红星集团,评标时间:
|
|
|
label = 5
|
|
|
elif re.search(',来源:$', front) and re.search('^,', behind): # 修复 472062585 项目采购-关于定制手机询比价采购中标公告,来源:深圳市网联安瑞网络科技有限公司 预测为中标
|
|
|
label = 0
|
|
@@ -925,6 +926,16 @@ class PREMPredict():
|
|
|
values[label] = 0.5
|
|
|
elif re.search('现由$', front) and re.search('^作为\d个单位的牵头(单位|公司)?', behind): # 修复 469369884 站源批量预测错误 现由第七合同段保利长大工程有限公司作为6个单位的牵头单位,
|
|
|
label = 5
|
|
|
+ elif re.search('(中标|成交)?|结果)?)(人|公告|公示),$|中标人信息:$', front): # 20250227修复中标错误 588005167 现确定贵公司为该项目的中标人,中国二冶集团有限公司,2025年01月26日,
|
|
|
+ label = 5
|
|
|
+ elif re.search('确定$', front) and re.search('^\w{,5}(项目|采购|招标)', behind):
|
|
|
+ label = 5
|
|
|
+ elif re.search('由$', front) and re.search('^进行招标', behind):
|
|
|
+ label = 0
|
|
|
+ values[0] = 0.5
|
|
|
+ elif re.search('^为\w{,10}第二(成交|中标)单位', behind): # 中标预测错误,例:601143888 河南省创慧新材料科技有限公司为铸咀采购项目第二成交单位
|
|
|
+ label = 3
|
|
|
+ values[3] = 0.5
|
|
|
elif re.search('是否中标:是,供应商', front) and label == 5:
|
|
|
label = 2
|
|
|
values[label] = 0.9
|
|
@@ -1475,8 +1486,8 @@ class RoleRulePredictor():
|
|
|
"(乙|竞得|受让|买受|签约|供货|供应?|合作|承做|承包|承建|承销|承保|承接|承制|承担|承修|承租((包))?|入围|入选|竞买)(候选|投标)?(人|单位|机构|供应商|方|公司|企业|厂商|商|社会资本方?|银行)(:?单位名称|:?名称|盖章)?[::是为]+$" \
|
|
|
"|(选定单位|指定的中介服务机构|实施主体|中标银行|中标通知书,致|征集结果|选择中介|选择结果|成交对象|勘察人|(,|审计|处置|勘察|设计)服务单位|受托[人方])[::是为]+$" \
|
|
|
"|((评审结果|名次|排名|中标结果)[::]*第?[一1]名?)[::是为]+$|成交供应商信息[,:]?(序号1)?:?|供应商名称$|竞争性选择申请人名称:$" \
|
|
|
- "|单一来源(采购)?(供应商|供货商|服务商|方式向)$|((中标|成交)(结果|信息))[::是为]+$|(中标|成交)供应商、(中标|成交)(金额|价格),$" \
|
|
|
- "|现(公布|宣布|公示)中标单位如下:$|现将中标单位(公布|公示)如下:$|现宣布以下(企业|单位|公司)中标:$|经讨论,决定采用$|第\d+(包件?|标段?)(中标|中选|成交)候选人:$)" # 承办单位:不作为中标 83914772 |施工 单位不作为中标人 例:386692187
|
|
|
+ "|单一来源(采购)?(供应商|供货商|服务商|方式向)$|((中标|成交)(结果|信息))[::是为]+$|(中标|成交)供应商、(中标|成交)(金额|价格),$|合作伙伴名称:$|供应商(乙方)-?$" \
|
|
|
+ "|现(公布|宣布|公示)中标单位如下:$|现将中标单位(公布|公示)如下:$|现宣布以下(企业|单位|公司)中标:$|经讨论,决定采用$|第\d+(包件?|标段?)(中标|中选|成交)候选人:$|入围供应商如下(排名不分先后)[,:]$)" # 承办单位:不作为中标 83914772 |施工 单位不作为中标人 例:386692187
|
|
|
self.pattern_winTenderer_left_60 = "(?P<winTenderer_left_60>" \
|
|
|
"(,|。|:|^)((中标(投标)?|[拟预]中标|中选|中价|中签|成交)(人|单位|机构|中介(服务)?机构|供应商|客户|方|公司|企业|厂商|商家?|社会资本方?|银行)|(中标候选人)?第?[一1]名|第[一1](中标|中选|成交)?候选人|服务机构)" \
|
|
|
"(:?单位名称|:?名称|盖章)?[,,]?([((]按综合排名排序[))]|:择优选取)?[::,,]$|选取(情况|说明):中选,中介机构名称:$|排名如下:1、$|第[一1]名,?投标(人|单位|银行|公司):$)" # 解决表头识别不到加逗号情况,需前面为,。空 20240621补充 中选 云南省投资审批中介超市 补充排名如下 南阳师范学院
|
|
@@ -1499,7 +1510,7 @@ class RoleRulePredictor():
|
|
|
self.pattern_thirdTenderer_left = "(?P<thirdTenderer_left>(第[三3]名?(名|((中标|中选|中价|成交|候选)(候选)?(人|单位|机构|供应商|公司|银行))))(名称)?[::是为]+$|((评审结果|名次|排名|排序)[::]第?[三3]名?,?(投标(供应)?商|供应商)(名称)?[::]+$))"
|
|
|
self.pattern_thirdTenderer_right = "(?P<thirdTenderer_right>^[是为\(]第[三3](名|(中标|中选|中价|成交)(候选)?(人|单位|机构|供应商|公司|银行)))"
|
|
|
|
|
|
- self.condadate_left = "(?P<candidate_left>(((中[标选商]|成交|入围|入选)候选|投标)(人|单位|机构|中介(服务)?机构|供应商|客户|方|公司|厂商|商家?|社会资本方?|银行)|服务单位)(:?单位名称|:?名称|全称|(?盖\w{,5}章)?|如下|:?牵头人|[及与和](成交|中标)金额)?[::是为]+$)"
|
|
|
+ self.candidate_left = "(?P<candidate_left>(((中[标选商]|成交|入围|入选)候选|投标)(人|单位|机构|中介(服务)?机构|供应商|客户|方|公司|厂商|商家?|社会资本方?|银行)|服务单位)(:?单位名称|:?名称|全称|(?盖\w{,5}章)?|如下|:?牵头人|[及与和](成交|中标)金额)?[::是为]+$)"
|
|
|
|
|
|
self.pattern_left = [
|
|
|
self.pattern_tenderee_left_60,
|
|
@@ -1528,7 +1539,7 @@ class RoleRulePredictor():
|
|
|
|
|
|
self.SET_NOT_TENDERER = set(["人民政府","人民法院","中华人民共和国","人民检察院","评标委员会","中国政府","中国海关","中华人民共和国政府"])
|
|
|
|
|
|
- self.pattern_money_tenderee = re.compile("投?标?最高限价|采购计划金额|项目预算|招标金额|采购金额|项目金额|投资估算|采购(单位|人)委托价|招标限价|拦标价|预算金额|标底|总计|限额|资金来源,?[为:]+\w{2,4}资金|采购成本价|总费用约?为|(招标|采购)总?(规模|额度|资金)|资金来源") # |建安费用 不作为招标金额
|
|
|
+ self.pattern_money_tenderee = re.compile("投?标?最高限价|采购计划金额|项目预算|招标金额|采购金额|项目金额|投资估算|采购(单位|人)委托价|招标限价|拦标价|预算金额|标底|总计|限额|资金来源,?[为:]+\w{2,4}资金|采购成本价|总费用约?为|(招标|采购)总?(规模|额度|资金)|资金来源|合同价暂定") # |建安费用 不作为招标金额
|
|
|
self.pattern_money_tenderer = re.compile("((合同|成交|中标|应付款|交易|投标|验收|订单)[)\)]?(综合)?(总?金额|结果|[单报总]?价))|标的基本情况|承包价|报酬(含税):|经评审的价格|报价不?含税") # 单写 总价 不能作为中标金额,很多表格有单价、总价
|
|
|
self.pattern_money_tenderer_whole = re.compile("(以金额.*中标)|中标供应商.*单价|以.*元(报价)?(中标|中选|成交)")
|
|
|
self.pattern_money_other = re.compile("代理费|服务费")
|
|
@@ -1797,7 +1808,7 @@ class RoleRulePredictor():
|
|
|
p_entity.values[_label] = _prob + p_entity.values[int(_label)] / 10
|
|
|
# log('正则召回实体: %s, %s, %d, %.4f, %s'%(kw, p_entity.entity_text, p_entity.label, p_entity.values[p_entity.label], before+" "+after))
|
|
|
break
|
|
|
- if re.search(self.condadate_left, before) and re.search('尊敬的|各', before[-10:])==None:
|
|
|
+ if re.search(self.candidate_left, before) and re.search('尊敬的|各', before[-10:])==None:
|
|
|
candidates.append(p_entity)
|
|
|
elif channel_dic['docchannel']['docchannel'] in ['中标信息', '候选人公示', '合同公告'] and re.search(':$', before) and re.search('^[,。]', after) and re.search('候选人', before): # 补充 577756336 候选人,三期A160、A166地块:中国建设银行成都第九支行,
|
|
|
candidates.append(p_entity)
|
|
@@ -1858,7 +1869,7 @@ class RoleRulePredictor():
|
|
|
# p_entity.values[int(_label)] = on_value*_prob_weight + p_entity.values[int(_label)] / 10
|
|
|
# # log('正则召回实体: %s, %s, %s, %d, %.4f, %s'%(_group, _v_group, p_entity.entity_text, p_entity.label, p_entity.values[p_entity.label], list_spans[_i_span]))
|
|
|
# break
|
|
|
- # if _i_span == 0 and re.search(self.condadate_left, list_spans[_i_span]):
|
|
|
+ # if _i_span == 0 and re.search(self.candidate_left, list_spans[_i_span]):
|
|
|
# candidates.append(p_entity)
|
|
|
|
|
|
elif str(p_entity.label) in ['2', '3', '4']:
|
|
@@ -1905,6 +1916,8 @@ class RoleRulePredictor():
|
|
|
front_text = _span[0][re.search(self.pattern_money_tenderer, _span[0]).end():]
|
|
|
if re.search('\d[万亿]?元|元)?:?\d', front_text): # 当前金额与关键词中间有金额的过滤掉
|
|
|
break
|
|
|
+ elif re.search('合同价暂定为?$', _span[0]): # 20250310 修复 598504921 合同价暂定 为招标金额
|
|
|
+ break
|
|
|
if re.search(self.pattern_money_other, _span[0]) is not None:
|
|
|
if re.search(self.pattern_money_tenderer, _span[0]).span()[1] > \
|
|
|
re.search(self.pattern_money_other, _span[0]).span()[1]:
|
|
@@ -2419,7 +2432,7 @@ class RoleGrade():
|
|
|
b = entity.wordOffset_begin
|
|
|
e = entity.wordOffset_end
|
|
|
not_found = 1
|
|
|
- if re.search('(乙方:甲方:|甲方:乙方:)$', text[max(0, b-span):b]):
|
|
|
+ if re.search('(乙方:甲方:|甲方((买方)?,|:)乙方((卖方)?)?:)$', text[max(0, b-span):b]):
|
|
|
entity.label = 0 if entity.entity_type == 'org' else 5 # 修复 290777022 乙方:甲方: 重庆机场集团有限公司 错分为中标
|
|
|
entity.values[entity.label] = 0.55
|
|
|
continue
|
|
@@ -3724,6 +3737,10 @@ class ProductAttributesPredictor():
|
|
|
for link in product_link: # 预防最后一列总价为所有产品总价,列补全后所有产品总价一样情况
|
|
|
if 'total_price' in link:
|
|
|
link['total_price'] = ""
|
|
|
+ if len(demand_link) > 2 and demand_link[0].get('budget', '') != '' and len(set([d.get('budget', '') for d in demand_link])) == 1: # 20250310 去掉多项目共用招标金额 例:598019007
|
|
|
+ for d in demand_link:
|
|
|
+ if 'budget' in d:
|
|
|
+ d['budget'] = ""
|
|
|
if len(unit_price_list)>0 and len(unit_price_list)==len(product_link) and len(set(unit_price_list))/len(unit_price_list)<=0.5: # 2023/7/18 如果单价重复率高不算总产品价避免错误
|
|
|
# print('如果单价重复率高不算总产品价避免错误')
|
|
|
total_product_money = 0
|
|
@@ -4149,14 +4166,14 @@ class DocChannel():
|
|
|
'产权交易': '经营权|承包权|使用权|租赁权|股权|债权|排污权|化学需氧量|储备量|竞价销售|销售结果|出租|招租|拍租|竞租|续租|挂牌|出让|废[旧弃]?(物资|设备|资源|金属|钢筋|料)处[置理]',
|
|
|
'产权交易2': '使用权|租赁权|股权|债权|排污权|竞价销售|销售结果|出租|招租|拍租|竞租|续租|挂牌|出让|废[旧弃]?(物资|设备|资源|金属|钢筋|料)处[置理]',
|
|
|
# '采招数据': '(采购|招标|询价|议价|比价|比选|遴选|邀请|邀标|磋商|洽谈|约谈|谈判|征询|调研)的?(公告|公示|中标|成交|结果|$)|工程招标|定点服务|(设备|服务|\w{2})[直采]购|(建设|改造)项目|工程|拦标价|控制价|银行|资格选定|资金|公款|存款|存放|现金管理|招募|入围|入库',
|
|
|
- '采招数据': '(采购|招标|询价|议价|比价|比选|遴选|邀请|邀标|磋商|洽谈|约谈|谈判|征询|调研)的?(公告|公示|中标|成交|结果|$)|工程招标|定点服务|(设备|服务|\w{2})[直采]购|(建设|改造)项目|拦标价|控制价|资格选定|资格认定|资金|公款|存款|现金管理|招募|入库',
|
|
|
+ '采招数据': '(采购|招标|询价|议价|比价|比选|遴选|邀请|邀标|磋商|洽谈|约谈|谈判|征询|调研)的?(公告|公示|中标|成交|结果|$)|工程招标|定点服务|(设备|服务|\w{2})[直采]购|(建设|改造)项目|拦标价|控制价|资格选定|资格认定|资金|公款|存款|现金管理|招募|入库|遴选.{,25}(服务|事务所|机构)',
|
|
|
# |竞价 采招/产权都有竞价方式 # 意向|需求|预公?告|报建|总承包|工程|施工|设计|勘察|代理|监理 |变更|答疑|澄清|中标|成交|合同|废标|流标
|
|
|
'新闻资讯': '(考试|面试|笔试)成绩|成绩的?(公告|公示|公布)|公开招聘|招聘(公告|简章|启事|合同制)|疫情防控\s{,5}(通知|情况|提示)|行政审批结果'
|
|
|
}
|
|
|
self.life_dic = {
|
|
|
'采购意向': '采购意向|招标意向|选取意向|意向公告|意向公示',
|
|
|
'采购意向neg': '发布政府采购意向|采购意向公告已于',
|
|
|
- '招标预告': '(预计|计划)(采购|招标)(时间|日期)|采购(计划编号|需求方案|预告|预案)|(预|需求)公示|需求(方案|信息|论证|公告|公示)',
|
|
|
+ '招标预告': '(预计|计划)(招标|采购|发标|发包)(时间|日期)|采购(计划编号|需求方案|预告|预案)|(预|需求)公示|需求(方案|信息|论证|公告|公示)',
|
|
|
'招标公告': '(采购|招标|竞选|报名)条件|报名(时间|流程|方法|要求|\w{,5}材料)[:\s]|[^\w]成交规则|参加竞价采购交易资格|(申请人|投标人|供应商|报价人|参选人)的?资格(要求|条件)|获取(采购|招标|询价|议价|竞价|比价|比选|遴选|邀请|邀标|磋商|洽谈|约谈|谈判|竞谈|应答)文件|(采购|招标|询价|议价|竞价|比价|比选|遴选|邀请|邀标|磋商|洽谈|约谈|谈判|竞谈|应答)文件的?(获取|领取)|评选方式:?\s*价格最低',
|
|
|
'资审结果': '资审及业绩公示|资审结果及业绩|资格后审情况报告|资格(后审|预审|审查)结果(公告|公示)|(预审|审查)工作已经?结束|未通过原因', #|资格
|
|
|
'招标答疑': '现澄清(为|如下)|答疑补遗|澄清内容如下|第[0-9一二三四五]次澄清|答疑澄清|(最高(投标)?限价|控制价|拦标价)公示', # |异议的回复
|
|
@@ -4185,7 +4202,7 @@ class DocChannel():
|
|
|
'中标信息': '(中标|中选|中价|中租|成交)?|入选|确认)(候选人|人|供应商|记录|结果|变更|情况)?的?(公告|公示|结果)|未?入围(公示|公告)|(遴选|采购|招标|竞价|议价|比选|询比?价|评选|谈判|邀标|邀请|洽谈|约谈|评标|发包|磋商|交易|出让|抽取|抽签)\w{,2}结果|单一来源(采购|招标)?的?(中标|成交|结果)|中标通知书|中标$|项目中标|(项目|工程|服务|定点)的?结果公[告示]|超市直购订单', # |开标(记录|信息|情况)
|
|
|
'资审结果': '((资格|资质)(审查|预审|后审|审核)|资审)结果(公告|公示)?|(资质|资格)(预审|后审)公示|资审及业绩公示',
|
|
|
'招标公告': '(采购|招标|询价|议价|竞价|比价|比选|遴选|邀请|邀标|磋商|洽谈|约谈|谈判|拍卖|招租|交易|出让)的?(公告|公示|$)|公开(采购|招标|招租|拍卖|挂牌|出让)|(资审|预审|后审)公告',
|
|
|
- '开标记录': '开标记录|截标信息|评委名单公示|开标安排|开标数据表|开标信息|开标情况|开标一览表|开标结果|开标会|评审专家公示',
|
|
|
+ '开标记录': '开标记录|截标信息|评委名单公示|开标安排|开标数据表|开标信息|开标情况|开标一览表|开标结果|开标会|评审专家公示|开标日程',
|
|
|
'验收合同': '(验收|履约)(公告|公示)|(验收|履约)(结果|报告|意见|单)(公告|公示)|预留项目执行情况'
|
|
|
}
|
|
|
|
|
@@ -4781,11 +4798,14 @@ class DocChannel():
|
|
|
return False
|
|
|
|
|
|
tenderee = ""
|
|
|
+ agency = ""
|
|
|
try:
|
|
|
for k, v in prem['prem'].items():
|
|
|
for link in v['roleList']:
|
|
|
if link['role_name'] == 'tenderee' and tenderee == "":
|
|
|
tenderee = link['role_text']
|
|
|
+ if link['role_name'] == 'agency' and agency == "":
|
|
|
+ agency = link['role_text']
|
|
|
except Exception as e:
|
|
|
# print('解析prem 获取招标人、代理人出错')
|
|
|
pass
|
|
@@ -4796,6 +4816,9 @@ class DocChannel():
|
|
|
if tenderee:
|
|
|
title = title.replace(tenderee, " ")
|
|
|
text = text.replace(tenderee, " ")
|
|
|
+ if agency:
|
|
|
+ title = title.replace(agency, " ")
|
|
|
+ text = text.replace(agency, " ")
|
|
|
prem_json = json.dumps(prem, ensure_ascii=False)
|
|
|
if result['docchannel']['docchannel'] in ['中标信息', '合同公告'] and origin_dic.get(
|
|
|
original_docchannel, '') in ['招标公告', '采购意向', '招标预告', '公告变更'] and is_contain_winner(
|
|
@@ -4809,7 +4832,10 @@ class DocChannel():
|
|
|
msc += '最终规则修改:中标公告无中标人且包含新闻资讯关键词,返回新闻资讯类型'
|
|
|
elif result['docchannel']['docchannel'] == '废标公告' and is_contain_winner(prem_json) and re.search(
|
|
|
self.title_life_dic['废标公告'], title) == None:
|
|
|
- result['docchannel']['docchannel'] = '中标信息'
|
|
|
+ if re.search(self.title_life_dic['合同公告'], title):
|
|
|
+ result['docchannel']['docchannel'] = '合同公告'
|
|
|
+ else:
|
|
|
+ result['docchannel']['docchannel'] = '中标信息'
|
|
|
msc += '最终规则修改:预测为废标却有中标人且标题无废标关键词改为中标信息;'
|
|
|
elif result['docchannel']['docchannel'] in ['招标答疑'] and re.search(
|
|
|
self.title_life_dic['招标答疑'], title) == None and origin_dic.get(
|
|
@@ -4836,6 +4862,7 @@ class DocChannel():
|
|
|
elif result['docchannel']['doctype'] == '采招数据' and origin_dic.get(
|
|
|
original_docchannel, '') in ['产权交易', '土地矿产'] and re.search('产权|转让|受让|招租|出租|承租|竞价', text):
|
|
|
result['docchannel']['doctype'] = origin_dic.get(original_docchannel, '')
|
|
|
+ # print(re.findall('产权|转让|受让|招租|出租|承租|竞价', text))
|
|
|
msc += '最终规则修改:预测为采招数据,原始为产权且有关键词,返回原始类别'
|
|
|
elif result['docchannel']['docchannel'] == '废标公告' and origin_dic.get(
|
|
|
original_docchannel, '') in ['招标公告', '采购意向', '招标预告'] and re.search(
|
|
@@ -4991,11 +5018,11 @@ class ProjectLabel():
|
|
|
key_wrod = item[1]
|
|
|
# 关键词排除词
|
|
|
key_paichuci = item[2]
|
|
|
- key_paichuci_s = "|".join(key_paichuci.split('、'))
|
|
|
+ key_paichuci_s = "|".join(key_paichuci.strip('、').split('、'))
|
|
|
# 类型排除词
|
|
|
type_paichuci = item[3]
|
|
|
if type_paichuci:
|
|
|
- paichuci_split = type_paichuci.split('、')
|
|
|
+ paichuci_split = type_paichuci.strip('、').split('、')
|
|
|
if re.search("|".join(paichuci_split), main_text):
|
|
|
continue
|
|
|
|
|
@@ -5061,7 +5088,7 @@ class ProjectLabel():
|
|
|
key_wrod2 = item[1]
|
|
|
search_type = item[2]
|
|
|
info_type_list = item[3]
|
|
|
- info_type_list = info_type_list.split("|") if info_type_list else []
|
|
|
+ info_type_list = info_type_list.strip('|').split("|") if info_type_list else []
|
|
|
|
|
|
search_text = ""
|
|
|
if search_type=='正文':
|
|
@@ -5876,6 +5903,8 @@ class DistrictPredictor():
|
|
|
text = re.sub('茂名滨海新区', '茂名市', text)
|
|
|
text = re.sub('中山([东南西][部区环]|黄圃|南头|东凤|小榄|石岐|翠亨|南朗)', '中山市', text)
|
|
|
text = re.sub('横州市', '横县', text) # 例:547363890 修复广西南宁横州 不在地区表问题
|
|
|
+ text = re.sub('广东中山', '广东中山市', text)
|
|
|
+ text = re.sub('朝阳柳城经济开发区', '朝阳市', text)
|
|
|
ser = re.search('海南(昌江|白沙|乐东|陵水|保亭|琼中)(黎族)?', text)
|
|
|
if ser and '黎族' not in ser.group(0):
|
|
|
text = text.replace(ser.group(0), ser.group(0) + '黎族')
|
|
@@ -5893,7 +5922,7 @@ class DistrictPredictor():
|
|
|
for k, v in it.groupdict().items():
|
|
|
if v != None:
|
|
|
if it.end() == it.end(k) and re.search('[省市区县州旗盟]$', v) == None and re.search(
|
|
|
- '^([东南西北中一二三四五六七八九十大小]?(村|镇|街|路|道|社区)|酒店|宾馆|经济开发区|开发区|新区)',
|
|
|
+ '^([东南西北中一二三四五六七八九十大小]?(村|镇|街|路|道|社区|巷|坊)|酒店|宾馆|经济开发区|开发区|新区|公园|广场|医院|[大中小]学)',
|
|
|
# 城市不匹配为区的地址 修复 滨州北海经济开发区 北海新区 等提取为北海
|
|
|
text[it.end(k):]) != None:
|
|
|
continue
|
|
@@ -6704,7 +6733,7 @@ class TableTag2List():
|
|
|
td_text = cell.attrs['title'] # 修复 类似 215597851 省略号隐藏内容
|
|
|
elif len(td_text)>30:
|
|
|
if return_kv:
|
|
|
- td_text = cell.get_text()
|
|
|
+ td_text = cell.get_text().strip()
|
|
|
else:
|
|
|
td_text = re.sub('\xa0', '', text_process(cell, final=False))
|
|
|
if td_text == "":
|
|
@@ -6712,9 +6741,9 @@ class TableTag2List():
|
|
|
text = [td_text,0]
|
|
|
else:
|
|
|
if return_kv:
|
|
|
- td_text = cell.get_text()
|
|
|
+ td_text = cell.get_text().strip()
|
|
|
else:
|
|
|
- td_text = str(cell.get_text()).strip().replace("\x06", "").replace("\x05", "").replace("\x07", "").replace('\\', '').replace("(", "(").replace(')', ')').replace('?', '')
|
|
|
+ td_text = str(cell.get_text()).strip().replace("\x06", "").replace("\x05", "").replace("\x07", "").replace('\\', '').replace("(", "(").replace(')', ')').replace('?', '').replace(' ', '')
|
|
|
text = td_text
|
|
|
|
|
|
# text = str(cell.get_text()).strip().replace("\x06", "").replace("\x05", "").replace("\x07", "").replace('\\', '').replace("(", "(").replace(')', ')').replace('?', '')
|
|
@@ -7789,7 +7818,7 @@ class WebsourceTenderee():
|
|
|
web_ree = '中国人民解放军总医院'
|
|
|
elif web_source_no.startswith('Y00484-') and web_ree == "":
|
|
|
web_ree = '航空总医院'
|
|
|
- if web_ree == "" and re.search('\w{2,8}(大学|医院)$', web_source_name): # 20240524 大学、医院类站源没唯一招标人默认为站源名称
|
|
|
+ if web_ree == "" and re.search('\w{2,8}(大学|医院|妇幼保健院)$', web_source_name): # 20240524 大学、医院类站源没唯一招标人默认为站源名称
|
|
|
web_ree = web_source_name
|
|
|
if web_ree != '':
|
|
|
if 'Project' in prem[0]['prem']:
|
|
@@ -7818,6 +7847,7 @@ class WebsourceTenderee():
|
|
|
'linklist': [],
|
|
|
'serviceTime': '',
|
|
|
'address': ''})
|
|
|
+
|
|
|
else:
|
|
|
prem[0]['prem']['Project'] = {'code': '',
|
|
|
'tendereeMoney': 0,
|
|
@@ -7830,6 +7860,14 @@ class WebsourceTenderee():
|
|
|
'serviceTime': '',
|
|
|
'address': ''}
|
|
|
]}
|
|
|
+ tenderee_l = [d2['role_text'] for v in prem[0]['prem'].values() for d2 in v['roleList'] if
|
|
|
+ d2['role_name'] == 'tenderee']
|
|
|
+ winner_l = [d2['role_text'] for v in prem[0]['prem'].values() for d2 in v['roleList'] if
|
|
|
+ d2['role_name'] == 'win_tenderer']
|
|
|
+ if set(tenderee_l) & set(winner_l) and web_ree in tenderee_l: # 删除与站源招标人冲突的中标人
|
|
|
+ for k in prem[0]['prem']:
|
|
|
+ prem[0]['prem'][k]['roleList'] = [d for d in prem[0]['prem'][k]['roleList'] if
|
|
|
+ not (d['role_name'] == 'win_tenderer' and d['role_text'] in tenderee_l)]
|
|
|
return prem
|
|
|
|
|
|
def get_header_line(list_item):
|
|
@@ -8574,9 +8612,9 @@ class EntityTypeRulePredictor():
|
|
|
self.pattern_addr_bidopen = '([开评]标|开启|评选|比选|磋商|遴选|寻源|采购|招标|竞价|议价|委托|询比?价|比价|谈判|邀标|邀请|洽谈|约谈|选取|抽取|抽选))?(会议)?地[点址区]([((]网址[))])?[:为]'
|
|
|
self.pattern_addr_bidsend = '((\w{,4}文件)?(提交|递交)(\w{,4}文件)?|投标)地[点址区]([((]网址[))])?[:为]'
|
|
|
self.pattern_addr_delivery = '(交货|交付|收货|提货|交接|送货(安装)?|送达|到货|供货|卸货)((期|时间)[及和、])?)?(地[点址区]?|区域)[:为]'
|
|
|
- self.pattern_addr_project = '(项目|施工|实施|建设|工程|服务|展示|看样|拍卖)(实施|服务|现场)?(地[点址区]|位置|所在地区?)(位于)?[:为]|项目位于|[^\w]所[属在](区域|地区):|存放地[点址]?[:为]' # 银行所属区域:北京市西城区 不作项目地址
|
|
|
+ self.pattern_addr_project = '(项目|施工|实施|建设|工程|服务|展示|看样|拍卖)(实施|服务|现场)?(地[点址区]|位置|所在地区?)(位于)?[:为]|项目位于|[^\w]所[属在](区域|地区?):|存放地[点址]?[:为]' # 银行所属区域:北京市西城区 不作项目地址
|
|
|
self.pattern_addr_contact = '(联系|收件人?|邮寄)地[点址区][:为]|行政区:'
|
|
|
- self.pattern_time_planned = '(计划|预计|预期)(采购|招标|发包)时间|招标(公告|文件)(预计|预期|计划)发布时间'
|
|
|
+ self.pattern_time_planned = '(计划|预计|预期)(招标|采购|发标|发包)时间|招标(公告|文件)(预计|预期|计划)发布时间'
|
|
|
self.pattern_code_investment = '投资(审批)?项目[编代]码[:为]'
|
|
|
self.pattern_addr_dic = {'addr_bidopen': self.pattern_addr_bidopen,
|
|
|
'addr_bidsend': self.pattern_addr_bidsend,
|