如何用脚本生成摘要

wen 实用脚本 2

本文目录导读:

如何用脚本生成摘要

  1. Python + NLTK(最常用)
  2. 使用TextRank算法(更智能)
  3. 中文文本摘要(适合中文)
  4. 使用Transformers(最先进)
  5. 命令行工具(简单快速)
  6. 使用命令行调用(无需写代码)
  7. 使用建议:

我来介绍几种用脚本生成摘要的方法,从简单到复杂:

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

使用建议:

  1. 快速测试:用NLTK方法
  2. :用jieba分词版本
  3. 高质量结果:用Transformers
  4. 大规模处理:用TextRank或TF-IDF
  5. 实时需求:用pipeline API

安装依赖:

pip install nltk scikit-learn networkx jieba transformers torch

选择哪种方法取决于你的需求:如果你是简单的测试,方法1就够了;如果是专业应用,建议用Transformers或TextRank。

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