| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- # -*- coding: utf-8 -*-
- """站源招标人预测器。
- 按 ARCHITECTURE.md Phase 5 拆分建议,从 ``interface/predictor.py`` 迁出以下类:
- - ``WebsourceTenderee`` — 通过数据源唯一招标人召回调整 prem 中的招标人
- (原 predictor.py 第 9199-9296 行)
- 原 ``from common.Utils import *`` / ``from interface.modelFactory import *``
- 已替换为显式 import;``os.path.dirname(__file__)`` 路径引用替换为
- ``predictors._common.INTERFACE_DIR``。
- ``interface/predictor.py`` 仍保留原定义,老 import 不受影响。
- """
- from __future__ import absolute_import
- import re
- import json
- from BiddingKG.dl.common.logging import log
- from BiddingKG.dl.entityLink.entityLink import get_business_data
- from BiddingKG.dl.predictors._common import INTERFACE_DIR
- __all__ = ["WebsourceTenderee"]
- class WebsourceTenderee():
- def __init__(self):
- with open(INTERFACE_DIR+'/websource_tenderee.pkl', 'r', encoding='utf-8') as f:
- self.webno2ree = json.load(f)
- def get_websource_tenderee(self, docid, web_source_no, web_source_name, prem):
- '''
- 通过数据源唯一招标人召回调整prem中的招标人,
- :param web_source_no:
- :param prem:
- :return:
- '''
- p = '(医院|学院|学校|中学|小学|大学|幼儿园|保健院|党校|银行|研究院|血站|红十字会|防治院|研究所)'
- web_ree = self.webno2ree.get(web_source_no, '')
- if web_source_no.startswith('18591-') and web_ree == "":
- web_ree = '中国人民解放军总医院'
- elif web_source_no.startswith('Y00484-') and web_ree == "":
- web_ree = '航空总医院'
- elif web_source_no.startswith('DX015142-'):
- web_ree = '海尔集团'
- if web_source_name == '圣泉集团采购平台(新)':
- web_ree = '济南圣泉集团股份有限公司'
- elif web_source_name == '中信重工招标采购网':
- web_ree = '中信重工机械股份有限公司'
- elif web_source_name == '中国巨石采购管理平台':
- web_ree = '中国巨石股份有限公司'
- elif web_source_name == '卡奥斯模块商采购服务平台':
- web_ree = '卡奥斯数字科技(青岛)有限公司'
- elif web_source_name == '南山集团有限公司':
- web_ree = '南山集团有限公司'
- # elif web_source_name == '浪潮电子采购平台':
- # web_ree = '浪潮集团有限公司'
- if web_ree == "" and re.search('\w{2,8}(大学|医院|妇幼保健院)$', web_source_name): # 20240524 大学、医院类站源没唯一招标人默认为站源名称
- web_ree = web_source_name
- if web_source_no in ['DX013230-2', 'DX008427-1', 'DX001298', 'DX013230-3', 'DX003960-1', 'DX002797-1', 'DX010532',
- 'DX014075', 'DX002897', 'DX001242-1', 'DX000545', 'DX001069', 'DX009895', 'DX003270', 'DX006310-1',
- '02215-1', 'DX000820', 'DX002512-1', 'DX000443', 'DX008157', 'DX004927', 'DX005403', 'DX001425-1',
- 'DX000980', 'DX013748-1', 'DX002488', '07056-4', 'XX2102']: # 统计分析可能有问题的唯一招标人
- web_ree = ''
- if web_ree != '':
- flag = 0 # 是否被替换为站源招标人
- if 'Project' in prem[0]['prem']:
- find_tenderee = False
- for d in prem[0]['prem']['Project']['roleList']:
- if d['role_name'] == 'tenderee':
- find_tenderee = True
- if d['role_text'] == "":
- d['role_text'] = web_ree
- flag = 1
- elif re.search('大学$', web_ree) and re.search('学院$', d['role_text']) and web_ree not in d['role_text']:
- d['role_text'] = web_ree
- flag = 1
- elif d.get('role_prob', 0) < 0.8 and get_business_data(d['role_text'])[0] == False: # 20240201 概率低于0.8且没有工商数据的替换为站源招标人
- if re.search('银行', web_ree) and re.search('\w{2,}银行\w{2,}分行', d['role_text']): # 20251028 修复692502613 交通银行阜阳分行 被替换为 交通银行股份有限公司
- break
- d['role_text'] = web_ree
- flag = 1
- # elif re.search(p, web_ree) and (re.search(p, d['role_text'])==None and len(d['role_text'])<6): # 数据源唯一招标人以医院等结尾,角色中无相关关键词的,替换为数据源招标人
- # d['role_text'] = web_ree
- # elif re.search('有限(责任)?公司', web_ree) and (re.search('有限(责任)?公司', d['role_text'])==None and len(d['role_text'])<6):
- # d['role_text'] = web_ree
- break
- if not find_tenderee: # 没招标人的添加
- prem[0]['prem']['Project']['roleList'].append({'role_name': 'tenderee',
- 'role_text': '%s' % web_ree,
- 'role_money': {'money': 0, 'money_unit': '',
- 'floating_ratio': '',
- 'downward_floating_ratio': '',
- 'discount_ratio': ''},
- 'linklist': [],
- 'serviceTime': '',
- 'address': ''})
- flag = 1
- else:
- prem[0]['prem']['Project'] = {'code': '',
- 'tendereeMoney': 0,
- 'roleList': [
- {'role_name': 'tenderee',
- 'role_text': '%s' % web_ree,
- 'role_money': {'money': 0, 'money_unit': '', 'floating_ratio': '',
- 'downward_floating_ratio': '', 'discount_ratio': ''},
- 'linklist': [],
- 'serviceTime': '',
- 'address': ''}
- ]}
- flag = 1
- 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)]
- if flag == 1:
- log('规则补充站源招标人:%s,docid:%s'%(web_ree, docid))
- return prem
|