本文目录导读:
的核心思想是从原文中直接挑选出最重要的句子,然后按照原文顺序拼接成摘要,它不生成新的词句,只做“选择题”。
下面我将从核心流程、具体步骤、常用算法以及实战工具四个方面为你详细拆解。
核心流程
通常遵循 “句子排序 -> 句子打分 -> 抽取Top-K” 的流水线:
- 预处理:将原文拆成句子。
- 句子表示:将每个句子转成计算机能理解的向量(数学表示)。
- 句子评分:计算每个句子代表整篇文章“主题”或“重要性”的得分。
- 句子选择:按得分高低选取前N个高价值句子,同时避免冗余(即内容相似的句子只选一个)。
- 排序输出:将选出的句子按原文出现的先后顺序重新排列,形成流畅的摘要。
具体步骤(用代码逻辑模拟)
假设我们有下面这段文本:
文本:”苹果公司今天发布了新款iPhone,这款手机配备了更强大的A17芯片,摄像系统也进行了升级,新机的起售价为999美元,苹果还推出了新的iPad产品线。“
第1步:句子分割
使用NLTK或spaCy等工具将文本切分为句子列表:
sentences = [
"苹果公司今天发布了新款iPhone。",
"这款手机配备了更强大的A17芯片。",
"摄像系统也进行了升级。",
"新机的起售价为999美元。",
"苹果还推出了新的iPad产品线。"
]
第2步:句子向量化
需要将每个句子转换为数值向量,常用方法包括:
- TF-IDF:将句子表示为词频-逆文档频率向量。
- Word2Vec / GloVe:将句子中所有词的词向量取平均。
- BERT / Sentence-BERT:使用预训练语言模型直接生成句子嵌入向量(效果最好)。
- 使用API:调用大模型API,将句子传给模型,拿到其内部表示(比如最后一层hidden state的平均值)。
第3步:评分与选择
根据不同的算法(见下文),计算每个句子的重要性得分。
- 基于主题词:统计全文中出现频率最高的词(如“iPhone”、“苹果”、“A17”),包含高频词的句子获得高分。
- 基于向量相似度:将整个文章所有句子的向量求平均,得到“中心向量”,离这个中心向量最近的句子被认为更代表全文主旨。
- 基于图算法(TextRank):将每个句子当作一个节点,句子之间的相似度作为边的权重,然后运行PageRank算法,得分最高的节点(句子)最值得抽取。
用TextRank算完后,得分排名可能是:
- 句子2(A17芯片):0.45分
- 句子1(发布iPhone):0.42分
- 句子4(起售价999美元):0.40分
- 句子3(摄像升级):0.38分
- 句子5(新iPad):0.30分
第4步:去冗余
高分的句子可能都是在讲相机,如果都选进来,摘要信息密度会下降,需要用MMR(最大边际相关性) 算法进行重排序:
- 核心公式:
MMR = λ * 重要性 - (1-λ) * 与已选句子的相似度 - 第一个候选句:选重要性最高的(句子2)。
- 第二个候选句:不仅要重要,还要和句子2不相似,如果句子2和句子4语义重叠很小,则句子4入选;如果句子3和句子2很像(都在说相机),则句子3被抑制。
第5步:排序输出
将选好的句子(例如句子2、句子1、句子4)按它们在原文中的顺序排好:
”苹果公司今天发布了新款iPhone,这款手机配备了更强大的A17芯片,新机的起售价为999美元。“
这就是最终的抽取式摘要。
常用算法对比
| 算法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| TextRank | 基于PageRank的图模型,句子间的相似度作为边权重。 | 无需训练数据,无监督,通用性强。 | 对长文本、专业领域效果一般;可能选中结构相似但内容无关的句子。 |
| 基于TF-IDF | 计算句子的TF-IDF向量,与全文向量比较相似度。 | 简单快速,适合关键词明显的文本。 | 忽略词序和语义,对同义词不敏感。 |
| 基于BERT | 使用BERT模型句子嵌入,计算句子与全文CLS向量或中心向量的余弦相似度。 | 语义理解能力强,效果最好。 | 需要GPU,计算成本高;依赖预训练模型领域匹配度。 |
| MMR | 在相关性(与主题的相似度)和多样性(与已选句子的差异度)之间做平衡。 | 显著去除冗余,生成更紧凑的摘要。 | 需要人工调整 λ 参数(通常0.5-0.7)。 |
实战工具与代码片段(Python)
方案1:快速使用 sumy(TextRank)
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.text_rank import TextRankSummarizer
# 示例文本
text = "苹果公司今天发布了新款iPhone,这款手机配备了更强大的A17芯片,摄像系统也进行了升级,新机的起售价为999美元,苹果还推出了新的iPad产品线。"
# 解析文本
parser = PlaintextParser.from_string(text, Tokenizer("chinese"))
# 创建TextRank摘要器
summarizer = TextRankSummarizer()
# 抽取前2个句子作为摘要
summary = summarizer(parser.document, 2)
# 输出
for sentence in summary:
print(sentence)
方案2:使用 transformers + Sentence-BERT(效果更好)
from sentence_transformers import SentenceTransformer, util
import numpy as np
# 加载句子嵌入模型(中文模型推荐 paraphrase-multilingual-MiniLM-L12-v2)
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
sentences = [
"苹果公司今天发布了新款iPhone。",
"这款手机配备了更强大的A17芯片。",
"摄像系统也进行了升级。",
"新机的起售价为999美元。",
"苹果还推出了新的iPad产品线。"
]
# 1. 生成句子向量
embeddings = model.encode(sentences)
# 2. 计算全文中心向量
center_vec = np.mean(embeddings, axis=0)
# 3. 计算每个句子与中心向量的余弦相似度(作为重要性得分)
scores = util.cos_sim(embeddings, center_vec).numpy().flatten()
# 4. 按得分排序,取前2个(这里先不处理冗余)
top_indices = np.argsort(scores)[-2:][::-1]
# 5. 按原文顺序输出
summary = [sentences[i] for i in sorted(top_indices)]
print(" ".join(summary))
# 输出示例: 苹果公司今天发布了新款iPhone,这款手机配备了更强大的A17芯片。
进阶技巧与注意事项
- 长文本处理:如果文章太长,可以按段落分段,每段内先做一次句子选择,再合并段落候选。
- 冗余控制:一定要使用MMR或基于相似度的去重逻辑,否则摘要可能反复说同一件事。
- 句子完整性:避免抽取残缺句(如“因为...”这种开头),最好结合依存句法分析,确保句子结构完整。
- 主题覆盖:可以给不同段落分配不同的权重(比如首段1.5倍权重,尾段1.2倍),确保开头和结尾的关键信息被包含。
- 长度控制:按字数或句子数设定上限,避免摘要过多。
其实就是 “挑金句” 的过程:
- 用TF-IDF或词频挑出关键词最密集的句子。
- 用TextRank找出在句间关系上“最核心”的句子。
- 用BERT做更精准的语义匹配。
- 最后用MMR确保摘要不重复。 更像人写的(比如能整合信息、转述表达),那就要考虑生成式摘要了,通常需要基于预训练模型(如BART、T5、ChatGPT)进行微调。
标签: 文本摘要