文本预处理技术:金融文本的“洗菜”功夫

做金融文本摘要,说白了第一步就是“洗菜”。

你想想看,一份财报、一篇研报,里面全是乱七八糟的符号、停用词、还有各种金融术语。直接扔给模型,它根本看不懂。我刚开始做这个方向的时候,就犯过这个错——把原始文本直接喂给BERT,结果出来的摘要全是“的”、“了”、“在”这种废话。

嗯,今天我们就聊聊金融文本预处理的四个核心步骤:分词、去停用词、词性标注、命名实体识别。每一步都有坑,我踩过的坑,你就不用再踩了。

核心观点:金融文本预处理不是简单的“切词+去停用词”,而是需要结合金融领域知识做定制化处理。比如“中国银行”不能切成“中国”和“银行”,“涨停”和“跌停”必须保留为一个完整词。

2.1 分词:金融领域的“切菜”艺术

分词是NLP最基础的一步。但金融文本的分词,跟新闻文本完全不一样。

我习惯用jieba分词,但必须加载自定义金融词典。为什么?因为“量化宽松”这个词,如果不加词典,jieba会切成“量化”和“宽松”,意思就变了。

import jieba
import jieba.analyse

# 加载金融领域自定义词典
jieba.load_userdict('finance_dict.txt')

# 示例:金融文本分词
text = "央行实施定向降准,释放长期资金约5000亿元"
words = jieba.lcut(text)
print(words)
# 输出:['央行', '实施', '定向降准', ',', '释放', '长期资金', '约', '5000亿元']

你看,“定向降准”和“5000亿元”都被正确识别为一个词。如果不加词典,结果会变成“定向”、“降准”、“5000”、“亿元”。

我的经验:金融词典至少包含以下三类词:

  • 政策术语:定向降准、逆回购、LPR、MLF
  • 公司名称:中国平安、贵州茅台、工商银行
  • 金融指标:ROE、PE、PB、EPS

我一般从证监会官网、央行报告、券商研报中提取这些词,大概准备5000-10000个就够用了。

2.2 去停用词:别让“的、了、在”干扰模型

停用词就是那些高频但无实际意义的词。比如“的”、“了”、“在”、“是”、“和”。

但金融文本的去停用词,有个特殊之处——有些词在通用场景是停用词,但在金融场景不是。

举个例子:“上”和“下”在通用场景是停用词,但在金融文本中,“上证指数”、“下探支撑”里的“上”和“下”就不能去掉。

# 自定义金融停用词表
stop_words = set()
# 加载通用停用词
with open('stopwords.txt', 'r', encoding='utf-8') as f:
    for line in f:
        stop_words.add(line.strip())

# 移除金融场景中不该去掉的词
finance_keep_words = ['上', '下', '高', '低', '涨', '跌', '多', '空']
for word in finance_keep_words:
    if word in stop_words:
        stop_words.remove(word)

# 过滤停用词
filtered_words = [w for w in words if w not in stop_words and w.strip()]

避坑指南:我曾经在一个项目中,把“高开低走”中的“高”和“低”当成停用词去掉了,结果模型完全无法理解股价走势。后来我专门整理了一份金融领域保留词表,才解决了这个问题。

2.3 词性标注:给每个词贴上“身份标签”

词性标注就是给每个词标上名词、动词、形容词等标签。在金融文本中,词性标注特别有用。

比如,我想提取“净利润增长20%”中的关键信息。通过词性标注,我可以快速定位到“净利润”(名词)和“增长”(动词),然后提取它们之间的关系。

import jieba.posseg as pseg

text = "贵州茅台2023年净利润同比增长19.16%"
words = pseg.lcut(text)
for word, flag in words:
    print(f'{word} -> {flag}')

# 输出示例:
# 贵州茅台 -> nt (机构名)
# 2023年 -> t (时间词)
# 净利润 -> n (名词)
# 同比 -> d (副词)
# 增长 -> v (动词)
# 19.16% -> m (数词)

你看,通过词性标注,我可以轻松提取出“(贵州茅台,净利润,增长,19.16%)”这个四元组。这就是后面做摘要的基础。

实用技巧:在金融文本中,我特别关注以下词性组合:

  • n + v + m: 名词+动词+数词(如“营收增长15%”)
  • nt + n: 机构名+名词(如“央行降准”)
  • v + n: 动词+名词(如“实施回购”)

这些组合往往包含了摘要的核心信息。

2.4 命名实体识别:金融领域的“找关键人物”

命名实体识别(NER)是金融文本预处理的重头戏。它要找出文本中的专有名词,比如公司名、人名、地名、时间、金额等。

我做过一个项目,要从1000份研报中提取“哪些公司被哪些机构推荐”。如果没有NER,你根本不知道“中信证券推荐买入贵州茅台”中的“中信证券”和“贵州茅台”是什么。

# 使用HanLP进行金融NER
from pyhanlp import *

text = "高盛将特斯拉目标价从800美元上调至950美元"
ner_result = HanLP.extractKeyword(text, 10)
print(ner_result)

# 更专业的做法:使用自定义金融NER模型
# 我习惯用BERT+CRF做金融NER,准确率能达到95%以上

金融NER的难点在于:

  • 嵌套实体:“中国工商银行股份有限公司”包含“中国”、“工商银行”、“股份有限公司”
  • 简称识别:“工行”=“工商银行”,“茅台”=“贵州茅台”
  • 数字实体:“5000亿”、“19.16%”、“3.5倍”

我的做法:我一般会构建一个金融实体词典,包含约2万个实体。同时用正则表达式辅助识别金额、百分比、日期等结构化实体。两者结合,效果最好。

2.5 知识体系总览

下面这张图,是我总结的金融文本预处理知识体系。你可以看到,四个步骤是层层递进的:

金融文本预处理知识体系 分词 自定义金融词典 政策术语/公司名 金融指标 去停用词 保留金融关键词 高/低/涨/跌 多/空 词性标注 n+v+m组合 提取关键信息 实体关系抽取 命名实体识别 公司/人名/地名 金额/时间/比例 嵌套实体识别 预处理后的金融文本 结构化、干净、富含金融语义 四个步骤层层递进,最终输出结构化金融文本 财报摘要 研报分析 舆情监控 智能投顾

2.6 实战经验总结

最后,我分享几个实战中的小经验:

  1. 先做NER,再做分词:我习惯先用NER识别出公司名、产品名等实体,然后把这些实体加入分词词典。这样分词准确率能提升10%以上。
  2. 停用词表要动态调整:不同金融场景,停用词不一样。比如债券分析中,“收益率”不能去掉;股票分析中,“涨停”不能去掉。
  3. 词性标注要结合金融语法:“降准”在金融文本中是动词,但在通用词性标注中可能被标为名词。需要做领域适配。
  4. 实体链接很重要:识别出“茅台”后,要能链接到“贵州茅台酒股份有限公司”这个标准实体。我一般用ES做实体链接,速度很快。

注意:预处理不是一次性工作。我通常会在模型训练过程中,根据bad case不断调整预处理策略。比如发现模型总是把“逆回购”切成“逆”和“回购”,那就把“逆回购”加入词典。这是一个迭代优化的过程。

好了,文本预处理就聊到这里。记住一句话:预处理做得好,模型训练事半功倍。下一节我们聊聊特征工程,看看怎么从预处理后的文本中提取更有用的特征。


公众号:蓝海资料掘金营,微信deep3321