2. 金融文本特性与预处理
在金融Embedding与向量检索系统中,模型效果的上限往往在预处理阶段就已经被决定。金融文本不同于通用网页语料,它同时具备高度结构化与强噪声两种矛盾特性:一份年报既有规范的章节层级,又夹杂页眉页脚、表格残片与免责声明;一条快讯可能只有几十字,却包含精确到分钟的时间戳与关键数值。若直接送入分词器与Embedding模型,噪声会稀释语义信号,数值与时间会被错误切分,最终导致检索召回偏离业务意图。本节围绕金融文本的结构、分词清洗、实体术语处理与时间数值归一化四条主线展开。
一、核心原理:四类金融文本的结构差异
金融语料并非同质,其结构差异直接决定切分策略。理解这一点,是后续所有预处理动作的前提。
| 文本类型 | 典型结构 | 预处理重点 |
|---|---|---|
| 定期报告(年报/半年报) | 章节—小节—段落—表格,层级深 | 保留标题路径,剥离页眉页脚与目录 |
| 临时公告 | 标题+正文+落款,篇幅短 | 标题与正文拼接,识别公告类型 |
| 财经新闻 | 导语—主体—背景,叙事性强 | 去广告与推荐位,保留时间地点 |
| 券商研报 | 摘要—正文—图表—评级,观点密集 | 抽取评级与目标价,区分事实与观点 |
关键洞察在于:结构信息本身就是语义。年报中“第三节 管理层讨论与分析”下的段落,与“第十节 财务报告”下的段落,即使文字相似,其检索意图也完全不同。因此预处理不应把结构“洗掉”,而应把结构“编码进文本”,例如在切块时前置标题路径。
二、方法流程:从原始文本到可嵌入块
一个稳健的金融文本预处理流水线通常包含以下阶段,各阶段可独立测试与回滚。
- 格式解析:PDF用版面分析提取文本与表格,HTML用DOM树定位正文容器,剔除导航与脚本。
- 噪声清洗:删除页眉页脚、页码、免责声明、水印字符、连续空白与乱码。
- 结构还原:识别标题层级,为每个段落附加“章节路径”前缀。
- 分词与术语处理:加载金融自定义词典,保护专有名词不被切碎。
- 实体与数值归一化:统一时间、金额、百分比、股票代码的表示形式。
- 切块与元数据:按语义边界切块,写入来源、日期、类型等元数据。
三、分词、实体与术语处理
通用分词器会把“宁德时代”“可转债”“市盈率TTM”切成碎片,导致Embedding无法形成稳定语义单元。解决方案是构建领域词典并配合规则保护。
# 金融自定义词典示例(每行:词 词频 词性)
宁德时代 1000 nz
可转换公司债券 800 nz
市盈率TTM 600 nz
归母净利润 900 nz
上海证券交易所 700 nt
# jieba 加载与分词
import jieba
jieba.load_userdict("finance_dict.txt")
text = "宁德时代发布可转债公告,市盈率TTM为28倍"
tokens = jieba.lcut(text)
print(tokens)
# ['宁德时代', '发布', '可转债', '公告', ',', '市盈率TTM', '为', '28', '倍']
实体处理还需关注别名归一:同一主体可能以“贵州茅台”“茅台”“公司”出现,应映射到统一实体ID。术语处理则要区分同义词与反义词,例如“增持”与“减持”仅一字之差,语义完全相反,切块与检索时不可混淆。
四、时间与数值归一化
金融文本中的时间与数值是检索的高频过滤条件,必须转为标准形式。
- 时间:“2024年3月15日”“2024-03-15”“去年三季度”统一为ISO格式或季度标识,相对时间需结合文档发布日期换算。
- 金额:“1.2亿元”“120,000,000元”“1.2亿”统一为数值加单位,注意“元/万元/亿元”量级换算。
- 百分比:“增长15%”“同比增长15个百分点”需区分比率与百分点。
- 代码:“600519.SH”“600519”统一为带市场后缀的标准代码。
五、案例与误区复盘
某团队在构建公告检索时,直接对PDF全文做固定长度切块,结果“拟回购金额不超过5亿元”被切成“拟回购金额不超”和“过5亿元”两块,检索“回购金额”时召回质量极差。复盘发现三个问题:未按语义边界切块、未保护数值短语、未附加公告标题。修正后采用“标题路径+段落”切块,并对数值短语加保护规则,召回准确率显著提升。
综上,金融文本预处理是一项“保结构、护术语、归数值”的系统工程。它决定了后续Embedding能否捕捉到业务真正关心的语义单元,也决定了向量检索在时间、主体与数值过滤上的可靠性。把预处理做扎实,是金融检索系统稳定可用的第一道防线。