3、基于统计的摘要方法:TF-IDF、TextRank算法原理及其在金融新闻中的应用
各位同学,今天我们来聊聊文本摘要里最经典的两个统计方法。说实话,虽然现在深度学习大行其道,但TF-IDF和TextRank这两个老家伙,在金融场景下依然能打。我自己的项目里,很多时候先用它们做快速筛选,再上BERT,效率能翻倍。
3.1 TF-IDF:关键词的“投票器”
TF-IDF的全称是Term Frequency-Inverse Document Frequency。说白了,就是给每个词打个分。这个词在单篇文档里出现越多,同时在所有文档里出现越少,分数就越高。
公式拆解:
- TF(词频):某个词在文档中出现的次数 / 文档总词数。比如“降息”在一篇500字的新闻里出现了5次,TF就是0.01。
- IDF(逆文档频率):log(总文档数 / 包含该词的文档数 + 1)。如果“降息”在1000篇新闻里只出现在10篇中,IDF就很大。
- TF-IDF = TF × IDF
核心思想:一个词对文档的重要性,与它在文档中出现的频率成正比,与它在整个语料库中出现的频率成反比。
我在做金融舆情监控时,遇到过一个问题:很多金融新闻里“的”、“了”、“在”这些停用词TF很高,但毫无意义。所以,预处理阶段一定要做分词和去停用词。我习惯用jieba分词,配合自定义的金融词典,效果不错。
3.2 TextRank:基于图的“社交网络”
TextRank的思路很有意思。它把每个句子看作一个节点,句子之间的相似度就是边的权重。然后通过迭代计算,找出那些“人缘最好”的句子作为摘要。
算法流程:
- 将文本切分成句子,每个句子作为一个节点。
- 计算句子之间的相似度(通常用词重叠或余弦相似度)。
- 构建带权重的无向图。
- 迭代计算每个节点的PageRank值,直到收敛。
- 按得分排序,取Top-K个句子作为摘要。
避坑指南:我曾经在计算句子相似度时,直接用词袋模型,结果“央行降息”和“美联储加息”这两个句子相似度很低,但其实是强相关的金融事件。后来我加入了同义词扩展(比如“降息”和“下调利率”),效果好了很多。
3.3 金融新闻中的实战应用
金融新闻有个特点:信息密度高,专业术语多。比如“LPR”、“MLF”、“逆回购”这些词,在普通文本里很少出现,但在金融新闻里是高频词。TF-IDF能很好地捕捉这些专业术语的重要性。
一个典型的应用场景:
- 输入:一篇关于“央行下调LPR”的2000字新闻。
- TF-IDF提取关键词:“LPR”、“下调”、“房贷”、“利率”、“央行”。
- TextRank提取摘要句:“央行宣布下调1年期LPR至3.45%,5年期以上LPR至4.20%。”、“此次降息预计将降低企业融资成本。”。
你想想看,如果直接用深度学习模型,2000字的新闻跑一次推理可能要几百毫秒。但TF-IDF+TextRank的组合,几十毫秒就能搞定。在实时行情推送的场景下,这个速度优势非常明显。
3.4 代码示例:用Python实现TF-IDF摘要
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
# 示例金融新闻
news = "央行今日宣布下调LPR利率,其中1年期LPR下调10个基点至3.45%。分析人士指出,此次降息有助于降低实体经济融资成本,提振市场信心。"
# 分词
words = jieba.lcut(news)
# 去停用词(简化版)
stopwords = set(['的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好', '自己', '这'])
filtered_words = [w for w in words if w not in stopwords and len(w) > 1]
# 计算TF-IDF
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform([' '.join(filtered_words)])
feature_names = vectorizer.get_feature_names_out()
scores = tfidf_matrix.toarray()[0]
# 输出Top-5关键词
top_indices = scores.argsort()[-5:][::-1]
print("Top-5关键词:")
for idx in top_indices:
print(f"{feature_names[idx]}: {scores[idx]:.4f}")
注意:上面的代码只是演示原理。实际项目中,你需要构建一个完整的金融停用词表,并且要处理数字、百分比等特殊token。我建议把“3.45%”这种作为一个整体token处理,而不是拆成“3.45”和“%”。
3.5 两种方法的对比
| 维度 | TF-IDF | TextRank |
|---|---|---|
| 核心思想 | 基于词频和逆文档频率 | 基于图排序和句子相似度 |
| 输出结果 | 关键词列表 | 摘要句子 |
| 计算复杂度 | O(N),N为文档数 | O(N²),N为句子数 |
| 金融场景适用性 | 适合提取专业术语、事件关键词 | 适合生成连贯的摘要段落 |
| 缺点 | 忽略词序和语义 | 短文本效果差,句子数少时不稳定 |
嗯,这里要注意:两种方法不是互斥的。我个人的习惯是先用TF-IDF提取关键词,再用这些关键词去加权TextRank的句子相似度计算。这样既保留了专业术语的重要性,又能生成流畅的摘要。
3.6 知识体系图
这张图把TF-IDF和TextRank的关系梳理得很清楚。左边是TF-IDF的分支,右边是TextRank的分支,底部是它们在金融新闻中的具体应用。我个人建议,初学者先把这个图刻在脑子里,再去看代码,会轻松很多。
公众号:蓝海资料掘金营,微信deep3321