抽取式摘要如何做?

访客 自然语言处理 2

本文目录导读:

  1. 核心流程
  2. 具体步骤(用代码逻辑模拟)
  3. 常用算法对比
  4. 实战工具与代码片段(Python)
  5. 进阶技巧与注意事项

的核心思想是从原文中直接挑选出最重要的句子,然后按照原文顺序拼接成摘要,它不生成新的词句,只做“选择题”。

下面我将从核心流程、具体步骤、常用算法以及实战工具四个方面为你详细拆解。


核心流程

通常遵循 “句子排序 -> 句子打分 -> 抽取Top-K” 的流水线:

  1. 预处理:将原文拆成句子。
  2. 句子表示:将每个句子转成计算机能理解的向量(数学表示)。
  3. 句子评分:计算每个句子代表整篇文章“主题”或“重要性”的得分。
  4. 句子选择:按得分高低选取前N个高价值句子,同时避免冗余(即内容相似的句子只选一个)。
  5. 排序输出:将选出的句子按原文出现的先后顺序重新排列,形成流畅的摘要。

具体步骤(用代码逻辑模拟)

假设我们有下面这段文本:

文本:”苹果公司今天发布了新款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算完后,得分排名可能是:

  1. 句子2(A17芯片):0.45分
  2. 句子1(发布iPhone):0.42分
  3. 句子4(起售价999美元):0.40分
  4. 句子3(摄像升级):0.38分
  5. 句子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芯片。

进阶技巧与注意事项

  1. 长文本处理:如果文章太长,可以按段落分段,每段内先做一次句子选择,再合并段落候选。
  2. 冗余控制:一定要使用MMR或基于相似度的去重逻辑,否则摘要可能反复说同一件事。
  3. 句子完整性:避免抽取残缺句(如“因为...”这种开头),最好结合依存句法分析,确保句子结构完整。
  4. 主题覆盖:可以给不同段落分配不同的权重(比如首段1.5倍权重,尾段1.2倍),确保开头和结尾的关键信息被包含。
  5. 长度控制:按字数或句子数设定上限,避免摘要过多。

其实就是 “挑金句” 的过程:

  • TF-IDF词频挑出关键词最密集的句子。
  • TextRank找出在句间关系上“最核心”的句子。
  • BERT做更精准的语义匹配。
  • 最后用MMR确保摘要不重复。 更像人写的(比如能整合信息、转述表达),那就要考虑生成式摘要了,通常需要基于预训练模型(如BART、T5、ChatGPT)进行微调。

标签: 文本摘要

抱歉,评论功能暂时关闭!