本文目录导读:

我来介绍几种用脚本生成摘要的方法,从简单到复杂:
Python + NLTK(最常用)
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import sent_tokenize, word_tokenize
import heapq
def generate_summary(text, num_sentences=3):
# 文本预处理
sentences = sent_tokenize(text)
# 去除停用词
stop_words = set(stopwords.words('english'))
# 计算词频
word_frequencies = {}
for word in word_tokenize(text.lower()):
if word not in stop_words and word.isalnum():
if word not in word_frequencies:
word_frequencies[word] = 1
else:
word_frequencies[word] += 1
# 计算句子权重
sentence_scores = {}
for sent in sentences:
for word in word_tokenize(sent.lower()):
if word in word_frequencies:
if len(sent.split(' ')) < 30: # 忽略过长句子
if sent not in sentence_scores:
sentence_scores[sent] = word_frequencies[word]
else:
sentence_scores[sent] += word_frequencies[word]
# 选取权重最高的句子
summary = heapq.nlargest(num_sentences, sentence_scores, key=sentence_scores.get)
return ' '.join(summary)
# 使用示例
text = "这里输入你的文本..."
summary = generate_summary(text, 3)
print(summary)
使用TextRank算法(更智能)
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import networkx as nx
def textrank_summarize(text, num_sentences=3):
# 分割句子
sentences = text.split('. ')
# 计算TF-IDF向量
vectorizer = TfidfVectorizer(stop_words='english')
vectors = vectorizer.fit_transform(sentences)
# 计算句子间相似度
similarity_matrix = cosine_similarity(vectors)
# 构建图并应用PageRank
graph = nx.from_numpy_array(similarity_matrix)
scores = nx.pagerank(graph)
# 选取排名最高的句子
ranked = sorted(((scores[i], i) for i in range(len(sentences))),
reverse=True)[:num_sentences]
summary = []
for _, idx in sorted(ranked, key=lambda x: x[1]):
summary.append(sentences[idx])
return '. '.join(summary)
中文文本摘要(适合中文)
import jieba
import re
from collections import Counter
def chinese_summary(text, num_sentences=3):
# 中文分句
sentences = re.split('[!?。;]', text)
# 分词并统计词频
words = []
for sent in sentences:
words.extend(jieba.lcut(sent))
# 过滤停用词
stop_words = set(['的', '了', '在', '是', '我', '有'])
word_freq = Counter(word for word in words if word not in stop_words)
# 计算句子得分
sentence_scores = {}
for sent in sentences:
score = sum(word_freq[word] for word in jieba.lcut(sent)
if word in word_freq)
sentence_scores[sent] = score
# 排序并选取
ranked = sorted(sentence_scores.items(), key=lambda x: x[1], reverse=True)
summary = [sent for sent, _ in ranked[:num_sentences]]
return '。'.join(summary)
使用Transformers(最先进)
from transformers import pipeline
def transformer_summary(text):
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
summary = summarizer(text, max_length=150, min_length=30)
return summary[0]['summary_text']
# 中文模型
def chinese_transformer_summary(text):
summarizer = pipeline("summarization", model="mthorse/bart-large-chinese")
summary = summarizer(text, max_length=150, min_length=30)
return summary[0]['summary_text']
命令行工具(简单快速)
#!/usr/bin/env python3
import argparse
import sys
def main():
parser = argparse.ArgumentParser(description='Generate text summary')
parser.add_argument('-f', '--file', help='Input file')
parser.add_argument('-s', '--sentences', type=int, default=3,
help='Number of sentences in summary')
parser.add_argument('text', nargs='*', help='Text to summarize')
args = parser.parse_args()
if args.file:
with open(args.file, 'r') as f:
text = f.read()
else:
text = ' '.join(args.text)
# 调用摘要函数
summary = generate_summary(text, args.sentences) # 使用第一个方法
print(summary)
if __name__ == "__main__":
main()
使用命令行调用(无需写代码)
# 安装工具 pip install sumy # 使用命令行 sumy text-rank --length=3 your_file.txt # 或者使用lex-rank算法 sumy lex-rank --length=3 your_file.txt
使用建议:
- 快速测试:用NLTK方法
- :用jieba分词版本
- 高质量结果:用Transformers
- 大规模处理:用TextRank或TF-IDF
- 实时需求:用pipeline API
安装依赖:
pip install nltk scikit-learn networkx jieba transformers torch
选择哪种方法取决于你的需求:如果你是简单的测试,方法1就够了;如果是专业应用,建议用Transformers或TextRank。