# -*- 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