3. 文本预处理入门
在金融新闻主题聚类与热点发现任务中,原始文本往往夹杂着公告格式、行情代码、机构简称、时间戳与大量噪声。若直接送入向量化或聚类模型,效果通常不稳定。文本预处理的目标,是把“给人看的新闻”转换为“给算法用的结构化词元序列”,并保留对金融语义最关键的信息。本节围绕中文分词、去停用词、词性标注与命名实体识别四个环节,说明它们在金融文本中的基本应用与常见坑点。
一、核心原理:四个环节各自解决什么问题
中文与英文不同,词与词之间没有空格,因此分词是第一步。金融文本中大量专有名词、缩略语和数字单位,通用分词器容易切错。分词的输出是词元序列,后续所有统计与向量化都建立在这一步之上。
去停用词用于过滤高频但低信息量的词,如“的、了、在、我们、记者”等。但在金融场景中要谨慎:“不、未、无、非”等否定词若被删除,可能把“不及预期”变成“及预期”,直接反转情感与主题含义。因此停用词表应分通用停用词与金融保留词两层管理。
词性标注为每个词元标注名词、动词、形容词等类别。金融新闻中,名词性短语往往是主题核心(如“货币政策”“光伏组件”),动词常表达事件动作(“回购”“减持”“涨停”),形容词则多用于情绪判断(“强劲”“疲软”)。词性可用于筛选关键词、构建规则模板或辅助实体识别。
命名实体识别(NER)用于识别机构名、人名、地名、产品名、时间、金额等实体。金融文本中,机构名与产品名是聚类的重要锚点:同一则新闻若同时出现“央行”“逆回购”“流动性”,其主题大概率属于货币政策;若出现“宁德时代”“电池”“产能”,则更可能属于新能源产业链。
二、方法流程:一条可落地的预处理流水线
下面给出一条适合金融新闻的预处理流程,顺序不可随意调换。分词必须在去停用词之前,词性标注与NER通常依赖分词结果,因此应放在分词之后。
- 清洗与归一化:去除HTML标签、多余空白、广告尾巴;统一全角半角;将“%”统一为“%”。
- 加载自定义词典:把机构名、产品名、政策术语、股票简称加入分词器用户词典。
- 中文分词:输出词元序列,同时保留词元在原文中的位置,便于后续实体对齐。
- 去停用词:使用通用停用词表,但将否定词、程度词、金融保留词加入白名单。
- 词性标注:为每个词元标注词性,便于筛选名词短语与动词事件。
- 命名实体识别:识别人名、机构名、地名、时间、金额、产品名等,并统一别名。
- 输出结构化记录:每条新闻保留“词元列表、词性列表、实体列表、时间戳、来源”等字段。
在工程实现上,常用工具包括 jieba、HanLP、LTP、spaCy(中文模型)等。下面以 jieba 为例,展示分词、去停用词与词性标注的基本写法。
import jieba
import jieba.posseg as pseg
# 1. 加载金融自定义词典
jieba.load_userdict("finance_dict.txt") # 每行:词语 词频 词性
# 2. 加载停用词,并保留否定词
stopwords = set(open("stopwords.txt", encoding="utf-8").read().split())
keep_words = {"不", "未", "无", "非", "没有", "不及"}
text = "央行今日开展逆回购操作,市场流动性保持合理充裕,宁德时代股价小幅上涨。"
# 3. 分词 + 词性标注
words = []
for w, flag in pseg.cut(text):
if w in stopwords and w not in keep_words:
continue
words.append((w, flag))
print(words)
# 输出示例:[('央行', 'nt'), ('今日', 't'), ('开展', 'v'), ('逆回购', 'n'),
# ('操作', 'v'), ('市场', 'n'), ('流动性', 'n'), ('保持', 'v'),
# ('合理', 'a'), ('充裕', 'a'), ('宁德时代', 'nt'), ('股价', 'n'),
# ('小幅', 'd'), ('上涨', 'v')]
三、案例/场景:金融文本中的典型处理差异
以下表格对比了同一段金融新闻在“通用预处理”与“金融增强预处理”下的差异,说明为什么金融场景需要额外配置。
| 处理环节 | 通用做法 | 金融增强做法 | 对聚类的影响 |
|---|---|---|---|
| 分词 | 使用默认词典 | 加入“降准、逆回购、宁德时代”等词 | 避免主题词被切碎,提升主题纯度 |
| 去停用词 | 删除“不、未、无” | 保留否定词与程度词 | 避免情感与事件方向反转 |
| 词性标注 | 仅用于语法分析 | 筛选名词短语与动词事件 | 提升关键词抽取质量 |
| 命名实体识别 | 识别人名、地名 | 增加机构、产品、金额、时间 | 形成“机构+产品+事件”主题锚点 |
| 别名归一 | 通常不做 | “央行/中国人民银行”统一 | 减少同一实体的多形态分裂 |
一个典型场景是热点发现:当“央行”“逆回购”“流动性”三个实体在短时间内共现频率突增,系统可将其标记为货币政策热点;当“宁德时代”“电池”“产能”共现突增,则更可能对应新能源产业链热点。实体共现比单纯词频更能抵抗噪声,也更适合金融新闻的主题聚类。
四、误区与复盘:预处理中最容易踩的坑
- 过度去停用词:把否定词、程度词删掉,导致“不及预期”与“超预期”被当成同一主题。
- 忽略金融专名:未加载自定义词典,导致“降准”被切成“降/准”,“光伏组件”被切成“光伏/组件”。
- 实体不归一:同一机构出现“央行”“中国人民银行”“人行”三种写法,聚类时被拆成多个主题。
- 词性标注结果直接当关键词:名词未必都是主题词,需结合词频、位置与实体类型综合判断。
- 预处理与聚类脱节:预处理阶段删除了时间戳与来源,后续无法做时间窗口热点分析。
综上,中文分词、去停用词、词性标注与命名实体识别在金融文本中并非孤立步骤,而是共同构成“语义保留型预处理”的流水线。分词决定词元边界,停用词决定信息取舍,词性标注提供语法筛选依据,命名实体识别则提供主题锚点。四者配合得当,后续的主题聚类与热点发现才能既稳定又可解释。