predictor.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. # -*- coding: utf-8 -*-
  2. """``interface/predictor.py`` — Phase 5 清理后的兼容层。
  3. 原 10756 行已缩减为本文件。所有 Predictor 实现已迁移到 ``predictors/`` 子模块,
  4. 训练函数迁移到 ``training/save_models.py``,
  5. 本文件仅通过 re-export 保持旧 import 路径不变。
  6. 保留内容:
  7. - ``getPredictor(_type)``:委托给 ``predictors.registry.PredictorRegistry``
  8. - ``dict_predictor``:Phase 2 兼容别名(注释标记 Phase 5 后可删除)
  9. - 完整 re-export 块:28 个 Predictor 类 + 19 个工具函数 + 11 个训练函数
  10. 旧路径仍然有效::
  11. from BiddingKG.dl.interface.predictor import getPredictor
  12. from BiddingKG.dl.interface.predictor import CodeNamePredict
  13. from BiddingKG.dl.interface.predictor import TableTag2List
  14. from BiddingKG.dl.interface.predictor import get_role, is_agency
  15. # ... 等所有原公共符号
  16. 清理说明:
  17. - 删除 28 个已迁移到 ``predictors/`` 的 Predictor 类本地定义
  18. - 删除 18 个已迁移到 ``predictors/_common`` 的工具函数本地定义
  19. - 删除 11 个已迁移到 ``training/save_models.py`` 的训练函数本地定义
  20. - 删除 ``sess_config`` / ``agency_set`` / ``header_set`` 本地加载逻辑(已由 re-export 覆盖)
  21. - 删除 ``__main__`` 测试块(兼容层不再承载可执行入口)
  22. - 保留所有 ``import *`` 以维持隐式 re-export 语义
  23. """
  24. import os
  25. import sys
  26. from BiddingKG.dl.common.nerUtils import *
  27. sys.path.append(os.path.abspath("../.."))
  28. from BiddingKG.dl.common.Utils import *
  29. from BiddingKG.dl.interface.modelFactory import *
  30. import tensorflow as tf
  31. import pandas as pd
  32. from BiddingKG.dl.product.data_util import decode, process_data
  33. from BiddingKG.dl.interface.Entitys import Entity
  34. from BiddingKG.dl.complaint.punish_predictor import Punish_Extract
  35. from BiddingKG.dl.money.re_money_total_unit import extract_total_money, extract_unit_money
  36. from bs4 import BeautifulSoup
  37. import copy
  38. import calendar
  39. import datetime
  40. from BiddingKG.dl.entityLink.entityLink import get_business_data
  41. from BiddingKG.dl.proposed_building.pb_extract import PBPredictor
  42. from BiddingKG.dl.common.Utils import del_tabel_achievement, clean_company
  43. from BiddingKG.dl.common.attr_utils import turnMoneySource, extract_serviceTime
  44. from BiddingKG.dl.time.re_servicetime import extract_servicetime
  45. from collections import Counter
  46. from dataclasses import dataclass, field
  47. from typing import List, Dict, Tuple, Set, Any
  48. from threading import RLock
  49. # Phase 2: dict_predictor 保留为兼容别名,真正的实例缓存迁移到
  50. # BiddingKG.dl.predictors.registry.PredictorRegistry。
  51. # 老 import ``from interface.predictor import dict_predictor`` 仍可用,
  52. # 但 dict_predictor 不再被 getPredictor 写入,新实例只存在于 registry 中。
  53. # Phase 5 迁移完成后本字典可删除。
  54. dict_predictor = {"codeName":{"predictor":None,"Lock":RLock()},
  55. "prem":{"predictor":None,"Lock":RLock()},
  56. "epc":{"predictor":None,"Lock":RLock()},
  57. "roleRule":{"predictor":None,"Lock":RLock()},
  58. "roleRuleFinal":{"predictor":None,"Lock":RLock()},
  59. "tendereeRuleRecall":{"predictor":None,"Lock":RLock()},
  60. "form":{"predictor":None,"Lock":RLock()},
  61. "time":{"predictor":None,"Lock":RLock()},
  62. "punish":{"predictor":None,"Lock":RLock()},
  63. "product":{"predictor":None,"Lock":RLock()},
  64. "product_attrs":{"predictor":None,"Lock":RLock()},
  65. "channel": {"predictor": None, "Lock": RLock()},
  66. "deposit_payment_way": {"predictor": None, "Lock": RLock()},
  67. "total_unit_money": {"predictor": None, "Lock": RLock()},
  68. "industry": {"predictor": None, "Lock": RLock()},
  69. "rolegrade": {"predictor": None, "Lock": RLock()},
  70. "moneygrade": {"predictor": None, "Lock": RLock()},
  71. "district": {"predictor": None, "Lock": RLock()},
  72. 'tableprem': {"predictor": None, "Lock": RLock()},
  73. 'candidate': {"predictor": None, "Lock": RLock()},
  74. 'websource_tenderee': {"predictor": None, "Lock": RLock()},
  75. 'project_label': {"predictor": None, "Lock": RLock()},
  76. 'industry_label': {"predictor": None, "Lock": RLock()},
  77. 'pb_extract': {"predictor": None, "Lock": RLock()},
  78. 'property_label': {"predictor": None, "Lock": RLock()},
  79. 'approval': {"predictor": None, "Lock": RLock()}, # 审批项目预测
  80. 'bid_score': {"predictor": None, "Lock": RLock()}, # 评标评分
  81. 'entity_type_rule': {"predictor": None, "Lock": RLock()}, # 地址、时间分类
  82. }
  83. def getPredictor(_type):
  84. """获取 predictor 实例(线程安全、懒加载)。
  85. Phase 2 改动:委托给 BiddingKG.dl.predictors.registry.PredictorRegistry。
  86. 原 dict_predictor 字典保留为兼容别名,不再被写入。
  87. 新 Predictor 迁移到 predictors/<name>.py 后,可通过
  88. ``registry.register(name, factory)`` 覆盖默认 factory,
  89. 本函数无需改动即可返回新实例。
  90. :raises NameError: _type 未注册时(保持原异常类型兼容)。
  91. """
  92. # 延迟 import 避免模块加载循环:predictors.registry 不在 import 时
  93. # 触发本模块加载,register_defaults() 内部才反向 import 本模块。
  94. # 使用绝对 import 与本仓库约定一致(from BiddingKG.dl.xxx)。
  95. from BiddingKG.dl.predictors.registry import get_default_registry, register_defaults
  96. registry = get_default_registry()
  97. if not registry.is_registered(_type):
  98. # 首次访问时注册全部默认 predictor factory(幂等)。
  99. # 注册后仍查不到 _type,说明 key 不在 28 个默认值中。
  100. register_defaults()
  101. try:
  102. return registry.get(_type)
  103. except KeyError:
  104. # 保持原异常类型和消息,老调用方若捕获 NameError 不受影响。
  105. raise NameError("no this type of predictor")
  106. # ============================================================
  107. # Phase 5 re-exports: implementations moved to predictors/
  108. # 直接 import(无别名):清理后已无本地定义冲突,名称在 import 行执行时
  109. # 即绑定到模块命名空间,可被循环 import 的下游模块(如 training.save_models)
  110. # 即时访问,避免 "cannot import name X from partially initialized module" 错误。
  111. # 详见 REFACTOR_LOG.md §Phase 5
  112. # ============================================================
  113. from BiddingKG.dl.predictors._common import ( # noqa: E402
  114. sess_config,
  115. agency_set,
  116. header_set,
  117. is_agency,
  118. get_td_companys,
  119. get_role,
  120. )
  121. from BiddingKG.dl.predictors.codename import CodeNamePredict # noqa: E402
  122. from BiddingKG.dl.predictors.prem import PREMPredict, EPCPredict # noqa: E402
  123. from BiddingKG.dl.predictors.form import FormPredictor # noqa: E402
  124. from BiddingKG.dl.predictors.role import ( # noqa: E402
  125. RoleRulePredictor,
  126. RoleRuleFinalAdd,
  127. TendereeRuleRecall,
  128. RoleGrade,
  129. role_special_predictor,
  130. )
  131. from BiddingKG.dl.predictors.money import ( # noqa: E402
  132. MoneyGrade,
  133. DepositPaymentWay,
  134. TotalUnitMoney,
  135. )
  136. from BiddingKG.dl.predictors.time import TimePredictor # noqa: E402
  137. from BiddingKG.dl.predictors.product import ProductPredictor # noqa: E402
  138. from BiddingKG.dl.predictors.product_attrs import ( # noqa: E402
  139. TableResult,
  140. ProductAttributesPredictor,
  141. )
  142. from BiddingKG.dl.predictors.channel import DocChannel # noqa: E402
  143. from BiddingKG.dl.predictors.label import ( # noqa: E402
  144. ProjectLabel,
  145. IndustryLabel,
  146. PropertyLabel,
  147. BiddingScore,
  148. )
  149. from BiddingKG.dl.predictors.industry import IndustryPredictor # noqa: E402
  150. from BiddingKG.dl.predictors.district import DistrictPredictor # noqa: E402
  151. from BiddingKG.dl.predictors.table_prem import ( # noqa: E402
  152. TableTag2List,
  153. TablePremExtractor,
  154. CandidateExtractor,
  155. is_head_line,
  156. get_header_line,
  157. )
  158. from BiddingKG.dl.predictors.websource import WebsourceTenderee # noqa: E402
  159. from BiddingKG.dl.predictors.approval import ApprovalPredictor # noqa: E402
  160. from BiddingKG.dl.predictors.entity_type import ( # noqa: E402
  161. EntityTypeRulePredictor,
  162. get_package_moneys,
  163. )
  164. # Re-export training functions from training/.
  165. # 放在所有 Predictor 类 re-export 之后:training.save_models 内部会
  166. # `from interface.predictor import PREMPredict, EPCPredict, FormPredictor`,
  167. # 这些名称必须已绑定到本模块命名空间,否则触发循环 import 错误。
  168. from BiddingKG.dl.training.save_models import ( # noqa: E402
  169. getSavedModel,
  170. getBiLSTMCRFModel,
  171. h5_to_graph,
  172. initialize_uninitialized,
  173. save_codename_model,
  174. save_role_model,
  175. save_money_model,
  176. save_person_model,
  177. save_form_model,
  178. save_codesplit_model,
  179. save_timesplit_model,
  180. )