4、实体识别与抽取:人名、公司名、时间、金额的NER技术
做内幕交易图谱,第一步不是画图,而是从海量文本里把关键信息捞出来。
说白了,你得先知道谁(人名)、在哪个公司(公司名)、什么时候(时间)、涉及多少钱(金额)。
这四个要素,是内幕交易网络的「原子」。我这些年踩过的坑,有一半都出在实体识别这一步。
4.1 为什么NER是内幕交易图谱的「入口」?
你想想看,一份证监会处罚决定书,洋洋洒洒几千字。里面提到「李某于2018年3月12日,向王某转账500万元,用于购买XX公司股票」。如果机器看不懂「李某」是人、「XX公司」是公司、「500万」是金额,那后面的关系推理根本无从谈起。
我习惯把NER比作「筛子」。文本数据进来,筛子一过,留下的是结构化的实体。筛子孔多大、怎么设计,直接决定了后面图谱的质量。
核心观点:内幕交易场景下的NER,不是通用NER。它需要针对「人名别名」、「公司简称」、「模糊时间」、「隐蔽金额」做专项优化。
4.2 四大实体的「坑」与「解」
4.2.1 人名识别:不止是「张三」
内幕交易里,人名的花样最多。我遇到过的情况包括:
- 别名与化名:「老李」、「李总」、「李先生」、「李某」——这些在通用NER里可能被识别为不同实体,但在内幕交易里,它们指向同一个人。
- 亲属关系:「其妻」、「其子」、「配偶」——这些词本身不是人名,但暗示了人。我曾经在项目中漏掉「其妻王某」,导致一条关键关系链断了。
- 职位指代:「董事长」、「总经理」、「董秘」——这些职位名在特定语境下就是人名代称。
我的做法:
- 先用通用NER(如LAC、BERT-BiLSTM-CRF)做第一轮识别。
- 再构建一个「别名映射表」,把「李某」→「李某某」、「老李」→「李某某」做归一化。
- 对「亲属关系」和「职位指代」做规则补充。比如「其妻」后面紧跟的实体,强制标记为人名。
避坑指南:我曾经在「其妻王某」这个短语上栽过跟头。通用模型把「其妻」识别为代词,「王某」识别为人名,但两者之间的「关系」丢了。后来我加了一条规则:如果「其妻/其子/配偶」后面跟着人名,自动生成一条「亲属关系」边。
4.2.2 公司名识别:简称与全称的博弈
公司名在内幕交易文本里,几乎不会出现全称。你看到的往往是「XX股份」、「XX集团」、「XX科技」。更头疼的是,有些公司简称和普通名词撞车了——比如「光大」既可以是公司名,也可以是形容词。
我总结的几种模式:
| 模式 | 示例 | 识别策略 |
|---|---|---|
| 全称 | 「北京华联综合超市股份有限公司」 | 通用NER + 字典匹配 |
| 简称 | 「华联股份」、「华联综超」 | 股票简称库 + 上下文校验 |
| 模糊指代 | 「该公司」、「上述公司」 | 指代消解 + 前文实体回溯 |
| 集团/子公司 | 「XX集团旗下子公司」 | 规则模板 + 关系抽取 |
我个人习惯维护一个「上市公司简称词典」。把A股、港股、美股的常见简称都收录进去。遇到「华联股份」,直接查表,命中率极高。
注意:公司简称有歧义。比如「三一」可能指「三一重工」,也可能指「三一集团」。这时候需要看上下文——如果后面跟着「股票」、「股价」,大概率是上市公司;如果跟着「集团」、「旗下」,可能是母公司。
4.2.3 时间识别:模糊时间的「归一化」难题
内幕交易的时间线,是定罪的关键。但文本里的时间表达,往往不是标准格式。
常见的坑:
- 相对时间:「三日后」、「次日」、「上周五」——这些需要锚定一个基准时间才能解析。
- 模糊区间:「2018年3月左右」、「2018年上半年」——这些不能简单当成一个时间点。
- 事件时间:「停牌前」、「复牌后」、「公告日」——这些需要结合事件图谱才能理解。
我的解决方案:
- 用正则表达式先抓取所有「数字+时间单位」的组合(如「3月12日」、「2018年」)。
- 对「相对时间」,用规则引擎做归一化。比如「次日」= 前文提到的时间 + 1天。
- 对「模糊区间」,保留原始文本,同时标注一个「时间类型」字段(精确/模糊/相对)。
一个小技巧:我习惯把时间实体分成「点时间」和「段时间」。点时间用时间戳存储,段时间用「开始时间-结束时间」存储。这样在图谱里,可以精确计算「某人在某时间段内是否持有某股票」。
4.2.4 金额识别:单位与精度的「陷阱」
金额是内幕交易里最敏感的数字。但文本里的金额表达,简直是「八仙过海」。
我见过的奇葩写法:
- 「500万」、「500万元」、「500W」——单位不统一。
- 「约500万」、「近500万」、「500余万」——带了修饰词。
- 「500万至800万」——区间表达。
- 「获利50万」、「亏损30万」——带了盈亏方向。
我的处理流程:
- 用正则抓取「数字+单位」组合,支持「万」、「万元」、「亿」、「亿元」、「W」、「w」等。
- 统一归一化到「元」单位。比如「500万」→ 5,000,000。
- 对区间金额,拆分成「最小金额」和「最大金额」两个字段。
- 对「获利/亏损」方向,单独标注一个「金额类型」字段。
经验之谈:金额识别最容易出错的地方是「单位遗漏」。比如「500」——到底是500元还是500万元?我建议结合上下文判断。如果前面提到「股票交易」,大概率是「万元」;如果前面是「工资」,可能是「元」。
4.3 NER技术选型:从规则到深度学习
说到技术选型,我这些年试过不少方案。简单总结一下:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 正则+字典 | 速度快、可解释性强 | 泛化能力差、维护成本高 | 金额、时间等格式固定的实体 |
| CRF | 序列标注效果好、特征可定制 | 依赖人工特征工程 | 人名、公司名等序列依赖强的实体 |
| BiLSTM-CRF | 自动学习特征、效果稳定 | 训练数据需求大 | 通用NER任务 |
| BERT+CRF | 语义理解强、准确率高 | 推理速度慢、资源消耗大 | 复杂语境下的实体识别 |
我个人习惯用「混合方案」:
- 金额和时间,用正则+字典搞定,又快又准。
- 人名和公司名,用BERT+CRF做主体,再叠一层规则做后处理。
避坑指南:我曾经在BERT模型上投入太多精力,结果发现90%的金额识别错误都是因为「单位没归一化」。后来我加了一个后处理模块,专门做金额归一化,准确率直接从85%跳到97%。
4.4 实体识别的「后处理」:归一化与对齐
NER不是终点。识别出实体后,还有两步关键操作:
1. 实体归一化
把「李某」、「李某某」、「李总」都映射到同一个ID上。我维护了一个「实体别名表」,每次识别出新实体,先查表,如果命中别名,直接合并。
2. 实体对齐
不同数据源(新闻、公告、处罚书)里提到的同一家公司,可能用不同名字。比如「华联股份」和「华联综超」其实是同一家上市公司。我通过股票代码来做对齐——只要股票代码相同,就认为是同一个实体。
核心原则:实体识别不是「认出名字」就完了,而是「认出是谁」。归一化和对齐,才是NER真正产生价值的地方。
4.5 本章小结
嗯,实体识别与抽取,说白了就是给文本数据「打标签」。人名、公司名、时间、金额,这四个标签打好了,后面的图谱构建才有根基。
我建议你在实际项目中,先花70%的精力在「规则+后处理」上,再花30%在「模型」上。别一上来就上BERT,先把基础规则做扎实了。
记住:内幕交易场景下的NER,拼的不是模型多先进,而是对业务场景的理解有多深。