news 2026/10/14 10:10:37

基于DeepDive的股权交易公告关系抽取与概率推理实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于DeepDive的股权交易公告关系抽取与概率推理实战

1. 从一份股权交易公告里,到底能挖出什么关系信号

先把场景说清楚。假设你手里有一批上市公司或非上市公众公司的股权交易公告,比如“某公司拟受让某标的企业30%股权”“某投资机构通过协议转让方式取得某公司5%股份”这类文本。表面上看,它只是一条交易信息披露,但如果你把时间线拉长、把主体对齐、把交易方向理清楚,就会发现这些公告其实在持续输出一种非常关键的信息:企业与企业之间正在发生或已经发生的交易关系。

这件事的价值在哪儿?举几个实际场景你就明白了。做供应链风险分析的人,需要知道A公司和B公司之间有没有股权层面的绑定;做投资研究的人,想从公告里提前发现产业资本在往哪个方向布局;做企业知识图谱的人,希望把“交易关系”作为一条边,补全原本稀疏的企业关系网络。而“概率”这个词之所以出现在标题里,是因为公告文本本身存在大量模糊表达——有的写“拟收购”,有的写“达成初步意向”,有的写“已完成过户”,这些不同措辞对应的关系确定性完全不同。如果只是简单地把两个公司名抽出来连一条线,那这张关系网会充满噪声,根本没法用。

所以这个项目的核心目标可以拆成三层:第一层是从非结构化的公告文本里准确识别出交易双方主体;第二层是判断这笔交易当前处于什么状态,从而给出一个关系成立的概率值;第三层是把这些结果沉淀成可查询、可追溯的结构化数据。DeepDive在这个流程里扮演的角色,是把“文本抽取”和“概率推理”缝合在一起的推理引擎。它不像传统正则那样只能做硬匹配,也不像纯大模型那样给出一个黑盒结论,而是允许你把抽取规则、特征函数和概率模型组合起来,对每一条候选关系给出一个可解释的置信度。

我最初接触这个方向时,最大的感受是:公告文本的“脏”远超想象。同一家公司在不同公告里可能叫“XX科技股份有限公司”“XX科技”“XX公司”,标的企业可能用简称、全称、甚至“标的公司”这种代称。更麻烦的是,一笔交易可能分多次公告披露,第一次是意向,第二次是协议签署,第三次是过户完成。如果你不把这三条公告串起来看,就会把同一段关系重复计算三次,概率值直接失真。这也是为什么我后来坚持在抽取之前先做主体对齐和时间线归并,而不是一上来就写抽取规则。

下面我会按照实际搭建这套流程的顺序来讲:先讲数据准备和主体对齐怎么做,再讲DeepDive里怎么设计抽取规则和特征函数,然后重点讲概率值到底怎么算、怎么校准,最后讲我在实际跑数据时踩过的几个坑以及怎么绕过去。整个过程我会尽量给出可复现的配置思路和参数取值依据,而不是只讲概念。

2. 公告文本的前置清洗与交易主体对齐

2.1 为什么不能直接拿原始公告文本喂给抽取器

原始公告文本里混杂着大量与交易关系无关的内容:董事会决议程序、独立董事意见、法律意见书摘要、财务数据表格、甚至风险提示段落。如果你直接把整篇公告丢给抽取器,它会抽出一堆“公司与控股股东”“公司与实际控制人”这类内部关系,而不是我们想要的企业与企业之间的外部交易关系。所以第一步必须做段落级过滤,把真正描述交易本身的段落圈出来。

我的做法是先用一组关键词做粗筛,比如“受让”“转让”“收购”“增资”“协议转让”“股份过户”等,把包含这些词的段落保留下来。但这里有个细节:关键词不能只做正向匹配,还要做负向排除。比如“公司拟为子公司提供担保”这种段落里也可能出现“子公司”和“公司”,但它描述的是担保关系,不是股权交易关系。所以我会额外维护一个负向词表,包含“担保”“质押”“冻结”“诉讼”等,命中负向词的段落直接丢弃。这一步做完,文本量通常能压缩到原来的20%到30%,后续抽取的噪声会小很多。

2.2 主体对齐:简称、全称与代称的统一

主体对齐是整条链路里最容易被低估、但实际最影响结果的一步。公告里对同一家公司的称呼可能有五六种变体,如果不做归一化,DeepDive抽出来的就是一堆散点,根本连不成边。我一般分三步走。

第一步是建立主体别名词典。来源可以是公告自身的“释义”段落——很多公告开头会写“除非文义另有所指,下列简称具有如下含义”,这里往往直接给出了简称和全称的对应关系。把这段抽出来,就能拿到一批高质量的别名对。第二步是用规则做后缀归一化,比如把“股份有限公司”“有限责任公司”“有限公司”统一去掉,再比对核心字号。第三步是处理“标的公司”“目标公司”“受让方”这类代称,这类词必须结合上下文回指来解析,不能单独处理。

这里有个实操心得:别名词典不要追求一次建全,而是边跑边补。我第一版只覆盖了不到200个主体,跑完一批公告后发现大量未对齐的实体,把高频未对齐项人工确认后补进词典,第二轮覆盖率就上来了。这个过程迭代三四轮之后,主体对齐准确率能稳定在95%以上。

2.3 交易时间线的归并与去重

一笔股权交易从首次披露到最终完成,可能跨越几个月甚至一年,中间会有多份公告。如果每份公告都独立抽一条关系,那同一段关系就会被重复计数。我的处理方式是给每笔交易生成一个交易指纹,由“出让方+受让方+标的公司+交易比例区间”组成,然后把同一指纹下的多条公告按时间排序,取最新状态作为该关系的当前状态。

具体来说,我会把交易状态分成几个阶段:意向阶段、协议签署阶段、审批阶段、过户完成阶段、终止阶段。每个阶段对应一个基础概率值,比如意向阶段给0.3,协议签署给0.6,过户完成给0.95,终止给0.05。这个基础值不是拍脑袋定的,而是根据历史公告的回溯统计得出的——我统计过一批已完成过户的交易,其中有多少比例在“意向阶段”公告后最终真的完成了,这个比例就是意向阶段概率值的经验来源。当然,这个值会随行业和市场环境变化,需要定期重新校准。

3. DeepDive抽取规则与特征函数的设计逻辑

3.1 DeepDive的工作方式:规则、特征与概率的缝合

DeepDive的核心思路是用声明式规则做候选抽取,用特征函数做信号聚合,最后用概率模型输出置信度。它不像传统NLP流水线那样把抽取和分类割裂开,而是允许你在同一个框架里定义“什么样的文本片段算候选关系”以及“哪些信号能提升或降低这个关系的概率”。

在这个项目里,我把流程拆成两个阶段。第一阶段是候选生成,用一组抽取规则从过滤后的段落里找出所有可能的“企业-交易-企业”三元组。第二阶段是特征打分,对每个候选三元组计算一组特征,比如交易动词的强度、交易比例的明确程度、公告类型、主体是否在别名词典中命中、是否有多份公告互相印证等。这些特征会被DeepDive的概率模型组合起来,输出最终的关系概率。

3.2 抽取规则怎么写才不容易漏抽和误抽

抽取规则的核心是触发词+论元位置。触发词就是“受让”“转让”“收购”“增资”这类交易动词,论元就是动作的发出方和接收方。但公告文本的句式非常灵活,同一个意思可能有十几种表达方式。我一般会先手工标注一批样本,统计高频句式,然后针对每种句式写一条规则。

比如“A拟以现金方式受让B持有的C公司30%股权”这种句式,规则可以写成:触发词“受让”,其左侧最近的主体是受让方,右侧“持有的”之前的主体是出让方,“持有的”之后的主体是标的公司。再比如“B拟将所持C公司30%股权转让给A”,触发词变成“转让给”,论元位置就反过来了。这里的关键是规则要覆盖主动语态和被动语态两种主要变体,否则会漏掉将近一半的候选。

误抽主要来自两种情况:一是触发词出现在否定句或假设句里,比如“若本次交易未能完成,公司将……”;二是触发词出现在非交易语境里,比如“公司转让了一项专利”。对于第一种,我会在规则里加一个否定词窗口检测,触发词前后10个字符内出现“未”“不”“若”“如果”等词时降低权重。对于第二种,我会在特征函数里加入“标的类型”特征,如果标的不是“股权”“股份”“出资额”等词,就大幅降低概率。

3.3 特征函数的设计:哪些信号真正影响关系概率

特征函数是DeepDive里最灵活也最需要经验的部分。我实际用下来,真正有区分度的特征大概有这么几类。

第一类是交易动词强度。“已完成过户”比“拟收购”强,“签署正式协议”比“达成初步意向”强。我会给每个动词一个基础分,这个分来自历史统计——统计每个动词出现后交易最终完成的比例。

第二类是交易比例的明确程度。公告里写“30%股权”比写“部分股权”确定性高得多,因为比例明确意味着交易方案已经细化。我会把比例是否明确、比例数值大小都作为特征,比例越大通常意味着战略绑定越深。

第三类是公告类型。首次提示性公告、进展公告、完成公告,这三类公告对关系确定性的贡献完全不同。完成公告几乎可以直接给高概率,而提示性公告需要谨慎。

第四类是多源印证。如果同一笔交易在不同公告里被重复提及,或者被不同来源的信息交叉验证,概率应该上调。这个特征在DeepDive里可以通过统计同一交易指纹下的公告数量来实现。

第五类是主体可信度。如果交易双方都是已知的大型企业,且都在别名词典里稳定命中,概率可以适当上调;如果一方是模糊代称且无法回指,概率要下调。

把这些特征组合起来,DeepDive会为每个候选关系输出一个概率值。我一般会把阈值设在0.5左右做初步筛选,然后对0.3到0.7之间的灰色地带做人工抽检,根据抽检结果反过来调整特征权重。

4. 关系概率的校准与灰色地带处理

4.1 概率值不是拍脑袋:用历史数据做校准

很多人做关系抽取时,概率值往往是模型直接输出的softmax分数,但这个分数并不等于“这段关系真实成立的概率”。要让概率值有意义,必须做校准。我的做法是拿一批已经确认完成过户的交易作为正样本,再拿一批公告后终止的交易作为负样本,统计模型输出的概率分布,然后拟合一个校准曲线。

具体操作上,我会把模型输出的原始分数分桶,比如0到0.1一桶、0.1到0.2一桶,然后统计每个桶里正样本的实际比例。如果0.8到0.9这个桶里实际只有60%是正样本,说明模型在这个区间高估了,需要把输出值往下压。校准之后,概率值才能真正用于下游决策,比如“概率大于0.8的关系直接入库,0.5到0.8的进入人工复核队列”。

4.2 灰色地带:那些概率在0.4到0.6之间的候选怎么处理

实际跑数据时,最头疼的不是高概率和低概率的候选,而是中间那批“说不清”的。我遇到过几种典型的灰色情况。

一种是交易状态描述模糊,比如“双方正在协商本次交易的具体方案”,既没说签了协议,也没说终止。这种我一般会给一个中等偏低的概率,并标记为“待观察”,等后续公告出来再更新。

另一种是主体指代不清,比如公告里写“公司拟受让关联方持有的标的公司股权”,但“关联方”和“标的公司”都没有明确名称。这种候选我会保留但给低概率,因为一旦后续公告披露了具体名称,就可以通过交易指纹匹配上。

还有一种是交易比例极小,比如受让0.1%股权。这种交易虽然关系成立,但战略意义很弱,我一般会在概率之外再加一个“重要性权重”,避免这类弱关系淹没真正重要的强关系。

处理灰色地带的核心原则是:不要强行二值化。关系抽取的输出应该是一个带概率的连续值,而不是简单的“有”或“没有”。下游用的时候可以根据自己的阈值来筛选,而不是被上游的硬判断限制住。

4.3 概率更新:当新公告出现时如何增量修正

企业关系不是静态的,一笔交易可能今天还是“意向”,下个月就变成“完成”,再下个月又“终止”。所以概率值必须支持增量更新。我的做法是给每个交易指纹维护一个状态机,新公告进来时,先判断它属于哪个阶段,然后用贝叶斯方式更新概率。

举个具体例子:某笔交易初始意向公告给出0.3的概率,一个月后出了协议签署公告,协议签署阶段的历史完成率是0.7,那么更新后的概率大约是0.3乘以0.7再归一化,大概在0.5左右。再过两个月出了过户完成公告,完成阶段几乎确定,概率直接跳到0.95以上。如果中间出了终止公告,概率直接降到0.05。这套更新逻辑跑下来,最终入库的关系概率和实际状态的吻合度比一次性抽取高很多。

5. 实际跑数据时踩过的坑与绕行方案

5.1 公告格式差异导致的抽取失败

不同板块、不同行业的公告模板差异很大。有的公告把交易信息放在“交易概述”一节,有的放在“本次交易的主要内容”,还有的散落在“董事会决议”里。我最初写的抽取规则只针对一种模板,换一批公告后召回率直接掉到40%以下。

后来我的解决方案是不依赖章节标题,而是依赖触发词密度。具体来说,我把公告按段落切分,统计每段里交易触发词的数量,触发词密度高的段落优先处理。这样即使章节标题变了,只要交易描述还在,就能被捞出来。另外我会维护一个“模板指纹”库,对常见模板做适配规则,新模板出现时先人工看一眼,补一条规则进去。

5.2 否定句和条件句的误判

公告里大量存在“若本次交易未能获得股东大会批准,则本次交易终止”这类条件句。如果抽取器只看到“交易”“终止”就判定关系终止,那就完全错了。我的处理方式是在特征函数里加入句法依存特征,判断触发词是否处于条件从句中。如果触发词的主句是条件句的从属部分,就大幅降低该候选的权重。

这个坑我踩了两次才彻底解决。第一次是简单加否定词窗口,但条件句的否定词可能离触发词很远,窗口覆盖不到。第二次改用依存句法分析,把条件连词“若”“如果”“除非”作为根节点,判断触发词是否在其子树中,准确率才上来。

5.3 同一交易多份公告的重复计数

前面提过交易指纹去重,但实际做的时候发现指纹本身也可能不一致。比如第一次公告写“受让30%股权”,第二次公告写“受让30.5%股权”,因为中间有微调。如果指纹严格按比例匹配,这两条就会被当成两笔交易。

我的解决办法是指纹做模糊匹配:出让方、受让方、标的公司三个主体必须完全一致,交易比例允许在一定范围内浮动,比如正负5个百分点以内视为同一笔。同时加一个时间窗口,比如180天内的公告才归并到同一指纹。这样既避免了重复计数,又不会把真正独立的两笔交易错误合并。

5.4 概率阈值设得太高导致漏掉早期信号

一开始我把入库阈值设在0.7,结果发现很多最终完成的交易在早期公告阶段概率只有0.3到0.4,根本进不了库。等它们概率升上来时,已经过去好几个月了,失去了早期发现的意义。

后来我改成分层入库:概率大于0.7的进“确认库”,0.4到0.7的进“观察库”,低于0.4的进“原始候选库”。观察库里的关系会随着新公告持续更新概率,一旦升到0.7以上就自动转入确认库。这样既保证了确认库的精度,又不会漏掉早期信号。实际用下来,观察库里有相当一部分关系最终真的完成了,提前量平均在两个月左右。

6. 从抽取结果到可查询关系网络的落地形态

6.1 关系表的结构设计

抽取结果最终要落成一张关系表,我一般会设计这么几个字段:主体A、主体B、关系类型、关系方向、概率值、证据公告ID列表、首次出现时间、最后更新时间、当前状态。其中关系方向很重要,因为“A受让B的股权”和“B受让A的股权”是完全不同的两件事,不能混为一谈。

证据公告ID列表是这张表的灵魂。每条关系都必须能追溯到具体的公告段落,否则下游用的时候没法验证。我一般会把公告ID和段落偏移量都存下来,需要的时候可以直接定位到原文。

6.2 查询接口的设计思路

有了关系表之后,查询接口的设计要围绕实际使用场景来。最常见的查询是“给定一家公司,找出与它有关联交易的所有公司”,这个用主体A或主体B做索引就能快速返回。另一种查询是“给定两家公司,判断它们之间有没有交易关系”,这个需要建一个组合索引。

我还会加一个时间衰减因子:关系概率会随时间推移而衰减,因为一笔交易完成之后,它的信息价值会逐渐降低。比如三年前完成的一笔股权交易,对当前的关系网络贡献应该比上个月完成的要小。这个衰减因子可以简单按半衰期来算,比如半衰期设为一年。

6.3 与下游应用的对接方式

这套关系数据可以对接很多下游应用。做知识图谱的,可以把关系表作为边数据导入图数据库;做风险监控的,可以订阅观察库里的关系变化,一旦某条关系概率骤降或状态变为终止,就触发预警;做投资研究的,可以按行业和交易比例筛选出战略投资关系,辅助判断产业整合趋势。

对接时要注意的是概率值的语义一致性。如果下游应用把概率值当成“关系强度”来用,那就要确保概率值的校准是稳定的;如果当成“关系成立的可能性”来用,那就要确保校准曲线定期更新。我一般会在接口文档里明确写清楚概率值的含义和校准时间,避免下游误用。

7. 几个容易被忽略但很关键的实操细节

7.1 公告正文里的表格和附件怎么处理

很多公告会把交易细节放在表格里,比如股权结构表、交易前后持股比例对比表。这些表格如果直接当纯文本处理,会丢失行列对应关系,抽出来的主体和比例可能张冠李戴。我的做法是先把表格解析成结构化数据,再和正文段落做关联。比如表格里写“受让方:A公司,受让比例:30%”,我就把这条记录和正文里描述同一笔交易的段落绑定,互相印证。

附件里的法律意见书、财务顾问报告也包含大量交易信息,但格式更不规范。我一般只从附件里抽取主体名称和交易比例这类硬信息,不抽关系状态,因为附件的表述往往更保守和模糊。

7.2 交易比例缺失时怎么估概率

有些公告只写“受让部分股权”,不写具体比例。这种情况下,交易比例特征就缺失了。我的处理方式是用同类交易的比例分布做插补。比如统计历史上所有“受让部分股权”的公告,最终披露的具体比例中位数是多少,用这个中位数作为插补值,同时把“比例缺失”本身作为一个特征,适当降低概率。

这个插补逻辑听起来简单,但实际效果比直接丢弃这些候选好很多。因为很多早期公告确实不披露比例,如果直接丢弃,会漏掉大量早期信号。

7.3 主体名称变更和历史名称的处理

企业改名是常事,如果只按当前名称建词典,历史公告里的旧名称就匹配不上。我的做法是维护一个主体名称时间线,记录每个主体在什么时间段用什么名称。抽取时先按公告发布时间找到对应时间段的名称,再做匹配。这个时间线可以从公告自身的历史沿革段落里抽,也可以从外部工商变更信息里补。

这个细节看似小众,但实际影响不小。我遇到过一家公司三年内改了两次名,如果不做时间线对齐,同一家公司在关系网络里会变成三个独立节点,关系边直接断掉。

7.4 概率值的可解释性怎么保留

DeepDive输出的概率值虽然比黑盒模型好,但如果只给一个数字,下游还是不知道怎么用。我一般会同时输出特征贡献度,告诉下游这个概率主要是由哪些特征拉高或拉低的。比如某条关系概率0.75,其中“已完成过户”贡献了+0.4,“交易比例明确”贡献了+0.2,“主体名称模糊”贡献了-0.1。这样下游如果对某条关系有疑问,可以直接看是哪个特征出了问题,而不是只能选择相信或不信。

保留可解释性还有一个好处:当概率值不符合预期时,你可以快速定位是特征设计的问题还是数据的问题。比如发现某类公告的概率普遍偏低,一看特征贡献度,发现是“公告类型”特征权重设错了,改一下权重就能修正,不用重新训练整个模型。

8. 这套流程跑通之后的一些个人体会

这套东西我从最初写规则到最终跑通,前后迭代了大概七八轮。最大的体会是:关系抽取的难点从来不在模型本身,而在数据理解和业务逻辑的映射。DeepDive也好,其他工具也好,都只是把你的业务逻辑翻译成概率值的载体。如果你对“什么算交易关系”“什么状态算关系成立”没有清晰的定义,再好的工具也跑不出可用的结果。

另一个体会是不要追求一步到位。我第一版只做了主体抽取,连概率都没有,就是简单的二元关系。第二版加了交易状态,第三版才加概率校准。每一版跑出来的结果都会暴露新的问题,然后针对性地补。如果一开始就想设计一个完美的全流程,大概率会卡在某个细节上出不来。

最后说一个实际使用中的小技巧:定期用新公告做回溯测试。我会每个月拿一批新公告跑一遍,然后等三个月后看这些公告里的交易有多少真的完成了,用这个实际完成率来校准概率值。这个习惯坚持下来,概率值的准确性会越来越稳,下游用起来也更有信心。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 10:10:34

图像采样与插值:从最近邻到双三次的工程实践指南

1. 图像采样与插值到底在解决什么问题很多人刚接触计算机视觉时,会觉得图像处理无非就是读一张图、改改尺寸、调调亮度,能有多复杂。但真正上手做项目就会发现,图像缩放这个看似最基础的操作,背后藏着一堆需要认真对待的细节。你拿…

作者头像 李华
网站建设 2026/10/14 10:09:16

Java汽车推荐系统:可运行的毕业设计工程闭环

简介:本资源是一套完整的Java毕业设计项目——个性化汽车推荐系统,面向计算机专业本科生及Java初学者,解决课程设计、毕设选题与推荐算法实践落地难题。项目采用Spring BootMyBatis技术栈,集成前端Bootstrap与FreeMarker模板引擎&…

作者头像 李华
网站建设 2026/10/14 10:08:57

换季整理衣橱,更适合先听完《别倒下,别投降》

当此刻正被「青春回望」咬住的人走到旧相册、旧聊天记录、旧歌单,《别倒下,别投降》往往会比空泛安慰更先开口——不是要你热闹起来,而是把说不清的那截情绪,轻轻按进旋律里。加班夜里风很冷。添火乐队《别倒下,别投降…

作者头像 李华
网站建设 2026/10/14 10:08:50

光伏PV三相并网逆变器MATLAB仿真全攻略:MPPT、PLL与双闭环控制

直接以标题为项目的主题,围绕光伏PV三相并网逆变器的MATLAB仿真展开。核心内容包括光伏电池建模、MPPT控制、三相逆变器拓扑选择、并网控制策略(如双闭环、PLL锁相)、滤波器设计、仿真参数设置、以及从仿真到硬件实施的迁移注意事项等。博文以…

作者头像 李华
网站建设 2026/10/14 10:08:43

2026法考民法精品笔记:体系化学习与案例解析

1. 项目背景与核心价值作为一名长期关注法律职业资格考试(法考)备考资料的从业者,我注意到市面上民法科目的复习资料普遍存在两大痛点:一是知识体系零散,二是案例解析脱离实务。这份《2026年法考孟献贵民法精品笔记》的…

作者头像 李华
网站建设 2026/10/14 10:08:33

数值分析上机:秦九韶算法与二分法求根的Python实现及性能对比

简介:这是广东工业大学数值分析课程的Python上机实验报告,围绕“减少运算次数”与“求解非线性方程”两个主题展开。前一部分对比直接法与秦九韶算法在计算同一多项式时的表现,通过录制Python源代码、统计乘法/加法次数及耗时,验证…

作者头像 李华