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的思路很有意思。它把每个句子看作一个节点,句子之间的相似度就是边的权重。然后通过迭代计算,找出那些“人缘最好”的句子作为摘要。

算法流程:

  1. 将文本切分成句子,每个句子作为一个节点。
  2. 计算句子之间的相似度(通常用词重叠或余弦相似度)。
  3. 构建带权重的无向图。
  4. 迭代计算每个节点的PageRank值,直到收敛。
  5. 按得分排序,取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 词频(TF) 逆文档频率(IDF) TextRank 句子相似度 PageRank迭代 金融新闻摘要应用 关键词提取 摘要生成 舆情监控

这张图把TF-IDF和TextRank的关系梳理得很清楚。左边是TF-IDF的分支,右边是TextRank的分支,底部是它们在金融新闻中的具体应用。我个人建议,初学者先把这个图刻在脑子里,再去看代码,会轻松很多。


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