# -*- coding: utf-8 -*- """``interface/predictor.py`` — Phase 5 清理后的兼容层。 原 10756 行已缩减为本文件。所有 Predictor 实现已迁移到 ``predictors/`` 子模块, 训练函数迁移到 ``training/save_models.py``, 本文件仅通过 re-export 保持旧 import 路径不变。 保留内容: - ``getPredictor(_type)``:委托给 ``predictors.registry.PredictorRegistry`` - ``dict_predictor``:Phase 2 兼容别名(注释标记 Phase 5 后可删除) - 完整 re-export 块:28 个 Predictor 类 + 19 个工具函数 + 11 个训练函数 旧路径仍然有效:: from BiddingKG.dl.interface.predictor import getPredictor from BiddingKG.dl.interface.predictor import CodeNamePredict from BiddingKG.dl.interface.predictor import TableTag2List from BiddingKG.dl.interface.predictor import get_role, is_agency # ... 等所有原公共符号 清理说明: - 删除 28 个已迁移到 ``predictors/`` 的 Predictor 类本地定义 - 删除 18 个已迁移到 ``predictors/_common`` 的工具函数本地定义 - 删除 11 个已迁移到 ``training/save_models.py`` 的训练函数本地定义 - 删除 ``sess_config`` / ``agency_set`` / ``header_set`` 本地加载逻辑(已由 re-export 覆盖) - 删除 ``__main__`` 测试块(兼容层不再承载可执行入口) - 保留所有 ``import *`` 以维持隐式 re-export 语义 """ import os import sys from BiddingKG.dl.common.nerUtils import * sys.path.append(os.path.abspath("../..")) from BiddingKG.dl.common.Utils import * from BiddingKG.dl.interface.modelFactory import * import tensorflow as tf import pandas as pd from BiddingKG.dl.product.data_util import decode, process_data from BiddingKG.dl.interface.Entitys import Entity from BiddingKG.dl.complaint.punish_predictor import Punish_Extract from BiddingKG.dl.money.re_money_total_unit import extract_total_money, extract_unit_money from bs4 import BeautifulSoup import copy import calendar import datetime from BiddingKG.dl.entityLink.entityLink import get_business_data from BiddingKG.dl.proposed_building.pb_extract import PBPredictor from BiddingKG.dl.common.Utils import del_tabel_achievement, clean_company from BiddingKG.dl.common.attr_utils import turnMoneySource, extract_serviceTime from BiddingKG.dl.time.re_servicetime import extract_servicetime from collections import Counter from dataclasses import dataclass, field from typing import List, Dict, Tuple, Set, Any from threading import RLock # Phase 2: dict_predictor 保留为兼容别名,真正的实例缓存迁移到 # BiddingKG.dl.predictors.registry.PredictorRegistry。 # 老 import ``from interface.predictor import dict_predictor`` 仍可用, # 但 dict_predictor 不再被 getPredictor 写入,新实例只存在于 registry 中。 # Phase 5 迁移完成后本字典可删除。 dict_predictor = {"codeName":{"predictor":None,"Lock":RLock()}, "prem":{"predictor":None,"Lock":RLock()}, "epc":{"predictor":None,"Lock":RLock()}, "roleRule":{"predictor":None,"Lock":RLock()}, "roleRuleFinal":{"predictor":None,"Lock":RLock()}, "tendereeRuleRecall":{"predictor":None,"Lock":RLock()}, "form":{"predictor":None,"Lock":RLock()}, "time":{"predictor":None,"Lock":RLock()}, "punish":{"predictor":None,"Lock":RLock()}, "product":{"predictor":None,"Lock":RLock()}, "product_attrs":{"predictor":None,"Lock":RLock()}, "channel": {"predictor": None, "Lock": RLock()}, "deposit_payment_way": {"predictor": None, "Lock": RLock()}, "total_unit_money": {"predictor": None, "Lock": RLock()}, "industry": {"predictor": None, "Lock": RLock()}, "rolegrade": {"predictor": None, "Lock": RLock()}, "moneygrade": {"predictor": None, "Lock": RLock()}, "district": {"predictor": None, "Lock": RLock()}, 'tableprem': {"predictor": None, "Lock": RLock()}, 'candidate': {"predictor": None, "Lock": RLock()}, 'websource_tenderee': {"predictor": None, "Lock": RLock()}, 'project_label': {"predictor": None, "Lock": RLock()}, 'industry_label': {"predictor": None, "Lock": RLock()}, 'pb_extract': {"predictor": None, "Lock": RLock()}, 'property_label': {"predictor": None, "Lock": RLock()}, 'approval': {"predictor": None, "Lock": RLock()}, # 审批项目预测 'bid_score': {"predictor": None, "Lock": RLock()}, # 评标评分 'entity_type_rule': {"predictor": None, "Lock": RLock()}, # 地址、时间分类 } def getPredictor(_type): """获取 predictor 实例(线程安全、懒加载)。 Phase 2 改动:委托给 BiddingKG.dl.predictors.registry.PredictorRegistry。 原 dict_predictor 字典保留为兼容别名,不再被写入。 新 Predictor 迁移到 predictors/.py 后,可通过 ``registry.register(name, factory)`` 覆盖默认 factory, 本函数无需改动即可返回新实例。 :raises NameError: _type 未注册时(保持原异常类型兼容)。 """ # 延迟 import 避免模块加载循环:predictors.registry 不在 import 时 # 触发本模块加载,register_defaults() 内部才反向 import 本模块。 # 使用绝对 import 与本仓库约定一致(from BiddingKG.dl.xxx)。 from BiddingKG.dl.predictors.registry import get_default_registry, register_defaults registry = get_default_registry() if not registry.is_registered(_type): # 首次访问时注册全部默认 predictor factory(幂等)。 # 注册后仍查不到 _type,说明 key 不在 28 个默认值中。 register_defaults() try: return registry.get(_type) except KeyError: # 保持原异常类型和消息,老调用方若捕获 NameError 不受影响。 raise NameError("no this type of predictor") # ============================================================ # Phase 5 re-exports: implementations moved to predictors/ # 直接 import(无别名):清理后已无本地定义冲突,名称在 import 行执行时 # 即绑定到模块命名空间,可被循环 import 的下游模块(如 training.save_models) # 即时访问,避免 "cannot import name X from partially initialized module" 错误。 # 详见 REFACTOR_LOG.md §Phase 5 # ============================================================ from BiddingKG.dl.predictors._common import ( # noqa: E402 sess_config, agency_set, header_set, is_agency, get_td_companys, get_role, ) from BiddingKG.dl.predictors.codename import CodeNamePredict # noqa: E402 from BiddingKG.dl.predictors.prem import PREMPredict, EPCPredict # noqa: E402 from BiddingKG.dl.predictors.form import FormPredictor # noqa: E402 from BiddingKG.dl.predictors.role import ( # noqa: E402 RoleRulePredictor, RoleRuleFinalAdd, TendereeRuleRecall, RoleGrade, role_special_predictor, ) from BiddingKG.dl.predictors.money import ( # noqa: E402 MoneyGrade, DepositPaymentWay, TotalUnitMoney, ) from BiddingKG.dl.predictors.time import TimePredictor # noqa: E402 from BiddingKG.dl.predictors.product import ProductPredictor # noqa: E402 from BiddingKG.dl.predictors.product_attrs import ( # noqa: E402 TableResult, ProductAttributesPredictor, ) from BiddingKG.dl.predictors.channel import DocChannel # noqa: E402 from BiddingKG.dl.predictors.label import ( # noqa: E402 ProjectLabel, IndustryLabel, PropertyLabel, BiddingScore, ) from BiddingKG.dl.predictors.industry import IndustryPredictor # noqa: E402 from BiddingKG.dl.predictors.district import DistrictPredictor # noqa: E402 from BiddingKG.dl.predictors.table_prem import ( # noqa: E402 TableTag2List, TablePremExtractor, CandidateExtractor, is_head_line, get_header_line, ) from BiddingKG.dl.predictors.websource import WebsourceTenderee # noqa: E402 from BiddingKG.dl.predictors.approval import ApprovalPredictor # noqa: E402 from BiddingKG.dl.predictors.entity_type import ( # noqa: E402 EntityTypeRulePredictor, get_package_moneys, ) # Re-export training functions from training/. # 放在所有 Predictor 类 re-export 之后:training.save_models 内部会 # `from interface.predictor import PREMPredict, EPCPredict, FormPredictor`, # 这些名称必须已绑定到本模块命名空间,否则触发循环 import 错误。 from BiddingKG.dl.training.save_models import ( # noqa: E402 getSavedModel, getBiLSTMCRFModel, h5_to_graph, initialize_uninitialized, save_codename_model, save_role_model, save_money_model, save_person_model, save_form_model, save_codesplit_model, save_timesplit_model, )