# RoleRulePredictor 的上下文角色召回规则(角色分类流程优化 Phase B)。 # # 来源:dl/predictors/role.py RoleRulePredictor.__init__(约 32-116 行) # 的 pattern_left / pattern_whole / pattern_right 三组模式。 # # 说明: # - 命名组后缀数字为概率权重(_55 → 0.55,_60 → 0.60), # 无后缀时 ser_role 默认 0.55;此处显式写入 prob 字段。 # - applies_to 映射:left→front(实体前文)、right→behind(实体后文)、 # whole→whole(前文+实体+后文拼接,ser_role 用 before+center+after)。 # - 本文件为 source of truth(校验+文档);predictors 消费 YAML 须待 # Phase C 规则注入机制就绪(见 predictors/role_context.py 模块注释)。 version: 1 category: ROLE description: >- 角色上下文召回规则:按实体前文(front)/后文(behind)/整句(whole)的 关键词模式召回 tenderee/agency/winTenderer/secondTenderer/thirdTenderer。 规则执行顺序 = pattern_left → pattern_whole → pattern_right(见 RoleRulePredictor.rule_predict)。 patterns: # ---- 招标人(tenderee)---- - id: tenderee_front_60 description: '前文出现"采购人:/招标单位:"等强表达(要求行首或句读引导)。doc 367784094 隆道-大企业采购平台' role: tenderee prob: 0.6 applies_to: front pattern: '(?P(,|。|^)(项目)?((遴选|寻源|采购|招标|竞价|议价|比选|委托|询比?价|比价|评选|谈判|邀标|邀请|洽谈|约谈|选取|抽取|抽选|项目|需求|甲|转让|招租|议标|合同主体|挂牌|出租|出让|出售|标卖|处置|发包)(人|方|单位|组织|用户|业主|主体|部门|公司|企业|工厂|银行))[))]?(信息|联系方式|概况)?[,,。::]?([((]?(1|2|1.1|1.2)[))]?)?((公司|单位)?名称)?([((](全称|盖章|异议受理部门)[))])?(是|为|:|:|,|\s*)+$)' golden_examples: - input: '。采购人:' should_match: true - input: ',招标单位名称:' should_match: true - input: '供应商名称:' should_match: false - id: tenderee_front_55 description: '前文出现"招标人/买方/业主"等表达(不要求句读引导)' role: tenderee prob: 0.55 applies_to: front pattern: '(?P((遴选|寻源|采购|招标|竞价|议价|比选|委托|询比?价|比价|评选|谈判|邀标|邀请|洽谈|约谈|选取|抽取|抽选|项目|需求|甲方?|转让|招租|议标|合同主体|挂牌|出租|出让|出售|标卖|处置|发包|最终|建设|业主|竞卖|申购|公选)(人|方|单位|组织|用户|业主|主体|部门|公司|企业|工厂|银行)|需求?方|买方|业主|权属人|甲方当事人|询价书企业|比选发起人|采购(执行|实施)单位|优选人的?)[))]?(信息|联系方式|概况)?[,,::]?([((](1|2|1.1|1.2)[))])?((公司|单位)?名称)?([((](全称|盖章|异议受理部门)[))])?(是|为|:|:|\s*)+$)' golden_examples: - input: '招标人:' should_match: true - input: '买方:' should_match: true - input: '中标人:' should_match: false - id: tenderee_front_50 description: '前文出现"采购商:/文章来源:/实施主体名称:"等弱表达' role: tenderee prob: 0.5 applies_to: front pattern: '(?P((所需|需[用求]|购货|征集|发布|交易发起|开户|申报|填报|开票|收货|竞拍发起|发标)(人|方|单位|组织|用户|业主|主体|部门|公司|企业|工厂)|[转流]出方|文章来源|委托机构|产权所有人|承包权人|结算单位|收货地址|询价商家)[))]?(信息|联系方式|概况)?[,,::]?([((](1|2|1.1|1.2)[))])?((公司|单位)?名称)?([((](全称|盖章|异议受理部门)[))])?(是|为|:|:|\s*)+$|(采购商|招标人):(\w{2,10}-)?$|实施主体(基本情况,)?名称:$)' golden_examples: - input: '采购商:' should_match: true - input: '文章来源:' should_match: true - input: '实施主体名称:' should_match: true - input: '供应商:' should_match: false - id: tenderee_whole_center description: '整句出现"受…委托/签订《成交确认书》"等。doc 659470425' role: tenderee prob: 0.55 applies_to: whole pattern: '(?P(受.{5,20}的?委托|现将[\w()()]{5,20}[\d年月季度至()]+采购意向|尊敬的供应商(伙伴)?:\w{5,20}(以下简称“\w{2,5}”)|与\w{5,20}签[署订]《成交确认书》))' golden_examples: - input: '受济南市城乡建设委员会的委托' should_match: true - input: '与澄迈县自然资源和规划局签订《成交确认书》' should_match: true - input: '委托代理机构办理' should_match: false - id: tenderee_behind_50 description: '后文出现"(以下简称…招标人)/#须采购一批/作为采购人"等' role: tenderee prob: 0.5 applies_to: behind pattern: '(?P^(机关)?,?([((](以下简称)?[,"“:]*((招标|采购|发标)(人|单位|机构)|(服务)?购买方)(名称)?[,"”]*[))]|^委托|^将于[\d年月日,::]+进行|^现委托|^的\w{2,10}正在进行|[\d年月季度至]+采购意向|^)?的招标工作已圆满结束)|^([拟须需]|计划)(采购|招标|购置|购买)|^须购[买置]一批|作为(采购|招标)(人|单位))' golden_examples: - input: '(以下简称“招标人”)' should_match: true - input: '拟采购' should_match: true - input: '须购置一批' should_match: true - input: ',中标人,' should_match: false - id: tenderee_or_agency_behind description: '后文"现就/拟对/现对"——招标或代理不确定,由 is_agency(实体名) 决定' role: tenderee prob: 0.55 applies_to: behind pattern: '(?P(^拟对|^现?就|^现对))' golden_examples: - input: '现就' should_match: true - input: '拟对' should_match: true - input: '现委托' should_match: false # ---- 代理机构(agency)---- - id: agency_front description: '前文出现"代理机构:/受…委托,"' role: agency prob: 0.55 applies_to: front pattern: '(?P((代理|拍卖)(?:人|机构|公司|企业|单位|组织)|专业采购机构|集中采购机构|招标组织机构|交易机构|集采机构|[招议))]+标机构|(采购|招标)代理)(名称|.{,4}名,?称|全称)?(是|为|:|:|[,,]?\s*)$|(受.{5,20}委托,?$))' golden_examples: - input: '代理机构:' should_match: true - input: '受某某某建设工程公司委托,' should_match: true - input: '招标人:' should_match: false - id: agency_behind description: '后文出现"(代理机构)/#受…委托"' role: agency prob: 0.55 applies_to: behind pattern: '(?P^,?([((](以下简称)?[,"“]*(代理)(人|单位|机构)(名称)?[,"”]*[))])|^受.{5,20}委托|^受委?托,)' golden_examples: - input: '(代理机构)' should_match: true - input: '受某某某招标代理公司委托' should_match: true - input: '作为代理' should_match: false # ---- 中标人(winTenderer)---- - id: winner_front_60 description: '前文出现"中标单位:/,成交人:/第一名,"等强表达(要求句读引导)' role: winTenderer prob: 0.6 applies_to: front pattern: '(?P(,|。|:|^)((中标(投标)?|[拟预]中标|中选|中价|中签|成交)(公告)?(人|单位|机构|中介(服务)?机构|供应商|客户|方|公司|企业|厂商|商家?|社会资本方?|银行)|(中标候选人)?第?[一1]名|第[一1](中标|中选|成交)?候选人|服务机构)(:?单位名称|:?名称|盖章)?[,,]?([((]按综合排名排序[))]|:择优选取)?[::,,]$|选取(情况|说明):中选,中介机构名称:$|排名如下:1、$|第[一1]名,?投标(人|单位|银行|公司):$)' golden_examples: - input: ',中标单位:' should_match: true - input: '中标人:' should_match: true - input: '招标人:' should_match: false - id: winner_front_55 description: '前文出现"中标供应商:"等表达(不要求句读引导)' role: winTenderer prob: 0.55 applies_to: front pattern: '(?P(中标(投标)?|[拟预]中标|中选|中价|中签|成交|入选)(人|单位|机构|中介(服务)?机构|供应商|客户|方|公司|企业|厂商|商家?|社会资本方?|银行)(:?单位名称|:?名称|盖章)?([((]按综合排名排序[))]|:择优选取|[及和](\w{,2}金额|\w{,2}价格|资格))?[::是为]+$|结果公示如下:摇出球号:\d+号,中介机构:$|(中标|成交|中选)(单位|人|供应商)及\w{,2}金额:$|确定的?中标人公告如下:$)' golden_examples: - input: '中标供应商:' should_match: true - input: '成交单位:' should_match: true - input: '采购人:' should_match: false - id: winner_front_51 description: '前文出现"乙方/供货单位/单一来源供应商/供应商名称"等弱表达' role: winTenderer prob: 0.51 applies_to: front pattern: '(?P(乙|竞得|受让|签约|供货|供应?|合作|承办|承做|承包|承建|承销|承保|承接|承制|承担|承修|承租((包))?|入围|入选|竞买|拟采?用)(候选|投标)?(人|单位|机构|供应商|方|公司|企业|厂商|商|社会资本方?|银行)(:?单位名称|:?名称|盖章)?[::是为]+$|(选定单位|指定的中介服务机构|实施主体|中标银行|中标通知书,致|征集结果|选择中介|选择结果|成交对象|勘察人|(,|审计|处置|勘察|设计)服务单位|受托[人方]|(直接)?采购对象)[::是为]+$|((评审结果|名次|排名|中标结果)[::]*第?[一1]名?)[::是为]+$|成交供应商信息[,:]?(序号1)?:?|供应商名称$|竞争性选择申请人名称:$|、(中标|中选|成交)候选人:$|单一来源(采购)?(供应商|供货商|服务商|方式向)$|((中标|成交)(结果|信息))[::是为]+$|(中标|成交)供应商、(中标|成交)(金额|价格),$|合作伙伴名称:$|供应商(乙方)-?$|合作单位:$|拟选商(信息|名称):$|现(公布|宣布|公示)中标单位如下:$|现将中标单位(公布|公示)如下:$|现宣布以下(企业|单位|公司)中标:$|经讨论,决定采用$|第\d+(包件?|标段?)(中标|中选|成交)候选人:$|入围供应商如下(排名不分先后)[,:]$)' golden_examples: - input: '供应商名称' should_match: true - input: '单一来源采购供应商' should_match: true - input: '乙方:' should_match: true - input: '采购人:' should_match: false - id: winner_behind description: '后文出现"为中标单位,/以100.5万元中标"等。doc 244261884 633061180' role: winTenderer prob: 0.55 applies_to: behind pattern: '(?P(^[是为](首选)?((采购|中标|成交)(供应商|供货商|服务商)|(第[一1]|预)?(拟?(中标|中选|中价|成交)(候选|排序)?(人|单位|机构|供应商|公司|企业|厂商|银行)))|^((报价|价格)最低,|以\w{5,10})?(确定|成|作)?为[\w“”()]{3,25}((成交|中选|中标|服务)(人|单位|供应商|企业|公司)|供货单位|供应商|第一中标候选人)[,。]|^:贵公司参与|^:?你方于|^(胜出)?(中标|成交)[,。]|^取得中标(单位)?资格|^以\d+[\d,.]+万?元(中标|成交|中选)|^(公司)?:恭喜您中标|^通过(挂牌|拍卖)方式(以[\d.,]+万?元)?竞得|^[((](中标|成交|承包)人名?称?[))])|^确定为(中标|成交|中选)人|^,中标候选单位名次:第一中标候选人|^(分数|得分|评分|综合)排[在名]第一[位名]?|^,排名:1[^\w\d])' golden_examples: - input: '为中标单位,' should_match: true - input: '以7.63277万元中标' should_match: true - input: ',排名:2;' should_match: false - id: winner_whole_center description: '整句出现"确定…为…的中标单位/单一来源谈判"等' role: winTenderer prob: 0.55 applies_to: whole pattern: '(?P(贵公司|由).{,15}以\w{,15}中标|确定[\w()]{5,20}为[^,。;]{5,50}的?中标单位|选定报价最低的[“”\w()]{5,25}为[^,。;]{5,50}的?(服务|中标|成交)单位|现将中标结果公布如下:[“”\w()]{5,25}恭喜中标|拟邀请[\w()]{5,20}(进行)?单一来源谈判|(承办单位|报价人|投标人|中介机构)(名称)?:[\w()]{5,20},(中标|承办|中选)(价格|金额)|(谈判结果:|结果|最终|确定|决定)[以由为][^,。;]{5,25}(向我单位)?(供货|承担|承接|中标|竞买成功)|中标通知书.{,15}你方|单一来源方?式?[从向][()\w]{5,20}采购|供应商名称:[()\w]{5,20},独家采购原因)' golden_examples: - input: '确定山东电建三公司为该采购项目的中标单位' should_match: true - input: '现将中标结果公布如下:青岛特锐德电气股份有限公司恭喜中标' should_match: true - input: '招标人为某公司' should_match: false # ---- 第二/第三候选人 ---- - id: second_front description: '前文出现"第二中标候选人:/排名:第二名,供应商:"' role: secondTenderer prob: 0.55 applies_to: front pattern: '(?P((第[二2]名?(名|((中标|中选|中价|成交|候选)(候选)?(人|单位|机构|供应商|公司|银行))))(名称)?[::是为]+$)|((评审结果|名次|排名|排序)[::]第?[二2]名?,?(投标(供应)?商|供应商)(名称)?[::]+$))' golden_examples: - input: '第二中标候选人:' should_match: true - input: '排名:第二名,供应商:' should_match: true - input: '第一中标候选人:' should_match: false - id: second_behind description: '后文出现"为第二中标候选人/#,排名:2;/#,评审排名:2;"' role: secondTenderer prob: 0.55 applies_to: behind pattern: '(?P^[是为\(]第[二2](名|(中标|中选|中价|成交)(候选)?(人|单位|机构|供应商|公司|银行))|^,中标候选单位名次:第二中标候选人|^,排名:2[^\w\d]|^,评审排名:2;)' golden_examples: - input: ',排名:2;' should_match: true - input: '为第二成交单位' should_match: true - input: ',排名:3;' should_match: false - id: third_front description: '前文出现"第三中标候选人:/排名:第三名,供应商:"' role: thirdTenderer prob: 0.55 applies_to: front pattern: '(?P(第[三3]名?(名|((中标|中选|中价|成交|候选)(候选)?(人|单位|机构|供应商|公司|银行))))(名称)?[::是为]+$|((评审结果|名次|排名|排序)[::]第?[三3]名?,?(投标(供应)?商|供应商)(名称)?[::]+$))' golden_examples: - input: '第三中标候选人:' should_match: true - input: '第二中标候选人:' should_match: false - id: third_behind description: '后文出现"为第三中标候选人/#,排名:3;/#,评审排名:3;"' role: thirdTenderer prob: 0.55 applies_to: behind pattern: '(?P^[是为\(]第[三3](名|(中标|中选|中价|成交)(候选)?(人|单位|机构|供应商|公司|银行))|^,中标候选单位名次:第三中标候选人|^,排名:3[^\w\d]|^,评审排名:3;)' golden_examples: - input: ',排名:3;' should_match: true - input: ',排名:2;' should_match: false # ---- 候选人统称 / 所有投标人 ---- - id: candidate_front description: '前文出现"候选人:/投标人:"等候选人统称(不区分名次)' role: other prob: 0.55 applies_to: front pattern: '(?P(((中[标选商]|成交|入围|入选)?候选|投标)(人|单位|机构|中介(服务)?机构|供应商|客户|方|公司|厂商|商家?|社会资本方?|银行)|服务单位|候选企业)(1.)?(:?单位名称|:?名称|全称|(?盖\w{,5}章)?|如下|:?牵头人|[及与和]((成交|中标)?金额|资格))?[::是为【]+(1[.、])?$)' golden_examples: - input: '候选人:' should_match: true - input: '投标单位:' should_match: true - input: '招标人:' should_match: false - id: tenderer_front description: '前文出现"投标人/供应商/报价人"等所有投标人统称(存管类全量召回用)' role: other prob: 0.55 applies_to: front pattern: '((候选|入围|入选|投标|报价|成交|中标|中选|供[货应]|应答|响应)(人|方|人?单位|机构|厂?商|商家|服务商|公司|企业)|(通过|入围)名单|第[\d一二三四五六七八九十]+名)(名称|名单|全称|\d)?[是为:]?$' golden_examples: - input: '投标人:' should_match: true - input: '供应商' should_match: true - input: '招标人:' should_match: false # ---- 金额召回(RoleRulePredictor.predict 中 money 实体分支,Phase E 迁移)---- # 原 role.py __init__ 中 pattern_money_* / pattern_pack 类属性; # 命中后 label=0(招标金额)或 label=1(中标金额),概率阶梯见代码(0.5/0.55/0.6/0.62)。 - id: money_tenderee_front description: '前文出现"最高限价/项目预算/预算金额/标底/资金来源"等招标金额表达' prob: 0.62 applies_to: front pattern: '投?标?最高限价|采购计划金额|项目预算|招标金额|采购金额|项目金额|投资估算|采购(单位|人)委托价|招标限价|拦标价|预算金额|标底|总计|限额|资金来源,?[为:]+\w{2,4}资金|采购成本价|总费用约?为|(招标|采购)总?(规模|额度|资金)|资金来源|合同价暂定|包合计:$' golden_examples: - input: '项目预算' should_match: true - input: '预算金额:' should_match: true - input: '成交金额:' should_match: false - id: money_tenderer_front description: '前文出现"合同金额/成交总价/中标结果"等中标金额表达' prob: 0.6 applies_to: front pattern: '((合同|成交|中标|应付款|交易|投标|验收|订单)[)\)]?(综合)?(总?金额|结果|[单报总]?价))|标的基本情况|承包价|报酬(含税):|经评审的价格|报价不?含税' golden_examples: - input: '合同金额' should_match: true - input: '成交总价:' should_match: true - input: '项目预算' should_match: false - id: money_tenderer_whole description: '整句出现"以金额…中标/以100万元中标"等(前后文拼接才成立的表达)' prob: 0.6 applies_to: whole pattern: '(以金额.*中标)|中标供应商.*单价|以.*元(报价)?(中标|中选|成交)' golden_examples: - input: '以金额最低中标' should_match: true - input: '以7.63277万元中标' should_match: true - input: '预算金额' should_match: false - id: money_other_fee description: '排除条件:前文出现"代理费/服务费"(不计入招标或中标金额)' prob: 0.5 applies_to: front pattern: '代理费|服务费' golden_examples: - input: '代理费' should_match: true - input: '服务费:' should_match: true - input: '合同金额' should_match: false - id: money_bank_tenderee_front description: '存款类项目:前文出现"存款总额/资金总量/定期存款/日均存款"等招标金额表达' prob: 0.6 applies_to: front pattern: '存[款放](操作)?,?总?(金额|总额|规模|额度|资金)|招标的?资金总量|(项目|资金)总?(规模|额度)|现金管理的?(操作)?(额度|规模|总额)|定期存款|存款大?约|定期存储|竞争性存放|项目资金|日均存款|资金现状|存量金额|招标分配的资金量|资金总[量额]|总(规模|额度|金额)|投资金额' golden_examples: - input: '定期存款' should_match: true - input: '存款总额' should_match: true - input: '合同金额' should_match: false - id: money_bank_tenderee_behind description: '存款类项目:后文出现"提供定期存放服务/存款期限/结构性存款"等' prob: 0.55 applies_to: behind pattern: '^,?(提供定期存放服务|存[款放](期限|时间)|存期|结构性存款|期限|\w{,4}(定期存款|公款存放|资金存放))' golden_examples: - input: ',提供定期存放服务' should_match: true - input: ',存款期限' should_match: true - input: ',中标人' should_match: false - id: pack_signal description: '金额扩展:上下文出现"包/标段/分包"编号信号(招标金额+连续未识别金额扩展为招标金额用)' prob: 0.5 applies_to: whole pattern: '(([^承](包|标[段号的包]|分?包|包组)编?号?|项目)[::]?[\((]?[0-9A-Za-z一二三四五六七八九十]{1,4})[^至]?|(第?[0-9A-Za-z一二三四五六七八九十]{1,4}(包号|标[段号的包]|分?包))|[0-9]个(包|标[段号的包]|分?包|包组)' golden_examples: - input: ',标段一' should_match: true - input: '分包编号:2' should_match: true - input: '供应商名称' should_match: false