[AI 或机器学习小工具:基于Python的智能文本摘要与关键词提取助手(支持命令行交互)]



一、背景介绍:从信息洪流中提取核心价值

在当今信息爆炸的时代,我们每天都会接触到大量的文本内容,包括新闻、论文、邮件、报告等。手动阅读并提取关键信息不仅效率低下,还容易遗漏重点。为了解决这一问题,我们设计并实现了一个基于Python的智能文本摘要与关键词提取助手,该工具能够自动读取文本文件,根据用户选择的算法(如 TF-IDF 或 TextRank)生成简洁的摘要,并提取出最具代表性的关键词,帮助用户快速理解文本核心内容。

该工具不仅具备清晰的输入输出行为,还支持命令行交互,便于集成到自动化流程中。它涵盖了自然语言处理(NLP)中的多个核心技术点,如文本分词、词频统计、句子相似度计算等,非常适合中级以下开发者在1~3天内完成,具备较高的学习价值和实用性。


二、思路分析:从文本处理到摘要生成

1. 功能目标

本项目的目标是实现一个命令行工具,能够:

  • 读取文本文件内容;
  • 使用 TF-IDF 或 TextRank 算法生成摘要;
  • 提取关键词;
  • 输出结果到控制台和文件。

2. 技术选型

  • Python:作为主要编程语言,适合文本处理和算法实现;
  • nltk:用于文本分词、停用词过滤等;
  • sklearn:用于 TF-IDF 向量化;
  • networkx:用于构建句子相似度图,实现 TextRank 算法;
  • argparse:用于命令行参数解析。

3. 核心算法实现

  • TF-IDF:基于词频和逆文档频率计算单词重要性,再根据单词分数计算句子重要性;
  • TextRank:将句子视为图中的节点,基于句子相似度构建图结构,使用 PageRank 算法计算句子重要性。

4. 模块化设计

项目采用模块化设计,将文本预处理、摘要生成、关键词提取等功能分别封装在 TextSummarizer 类中,便于扩展与维护。


三、代码实现:Python 实现智能文本摘要与关键词提取

以下为完整的代码实现,支持命令行交互,包含详细的注释说明。

# 智能文本摘要与关键词提取助手
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize, sent_tokenize
from nltk.probability import FreqDist
from sklearn.feature_extraction.text import TfidfVectorizer
from heapq import nlargest
import string
import numpy as np
import networkx as nx
from collections import defaultdict
import argparse

# 下载必要的NLP资源(仅需首次运行时执行)
nltk.download('punkt', quiet=True)
nltk.download('stopwords', quiet=True)

class TextSummarizer:
    def __init__(self):
        # 初始化停用词和标点符号集合
        self.stop_words = set(stopwords.words('english') + list(string.punctuation))

    def preprocess_text(self, text):
        """
        预处理文本:分句与分词
        """
        sentences = sent_tokenize(text)
        words = [word.lower() for word in word_tokenize(text) 
                if word.lower() not in self.stop_words and word.isalpha()]
        return sentences, words

    def calculate_word_scores(self, words):
        """
        计算单词重要性分数(基于词频)
        """
        freq_dist = FreqDist(words)
        max_freq = max(freq_dist.values())
        word_scores = {word: freq / max_freq for word, freq in freq_dist.items()}
        return word_scores

    def calculate_sentence_scores(self, sentences, word_scores):
        """
        计算句子重要性分数(基于单词分数)
        """
        sentence_scores = defaultdict(int)
        for i, sentence in enumerate(sentences):
            for word in word_tokenize(sentence.lower()):
                if word in word_scores:
                    sentence_scores[i] += word_scores[word]
            # 归一化处理
            sentence_scores[i] /= len(word_tokenize(sentence)) if len(word_tokenize(sentence)) > 0 else 1
        return sentence_scores

    def summarize_text(self, text, num_sentences=3):
        """
        基于TF-IDF的摘要生成
        """
        sentences, words = self.preprocess_text(text)
        if len(sentences) <= num_sentences:
            return text

        word_scores = self.calculate_word_scores(words)
        sentence_scores = self.calculate_sentence_scores(sentences, word_scores)

        # 获取最重要的句子
        selected_indices = nlargest(num_sentences, sentence_scores, key=sentence_scores.get)
        summary = ' '.join([sentences[i] for i in sorted(selected_indices)])
        return summary

    def summarize_with_graph(self, text, num_sentences=3):
        """
        使用TextRank算法生成摘要
        """
        sentences, _ = self.preprocess_text(text)
        if len(sentences) <= num_sentences:
            return text

        vectorizer = TfidfVectorizer(stop_words=list(self.stop_words))
        sentence_vectors = vectorizer.fit_transform(sentences)

        # 构建句子相似度矩阵
        similarity_matrix = np.zeros((len(sentences), len(sentences)))
        for i in range(len(sentences)):
            for j in range(len(sentences)):
                if i != j:
                    similarity_matrix[i][j] = (
                        sentence_vectors[i].dot(sentence_vectors[j].T) /
                        (np.linalg.norm(sentence_vectors[i]) * np.linalg.norm(sentence_vectors[j]))
                    )

        # 使用PageRank算法计算句子重要性
        nx_graph = nx.from_numpy_array(similarity_matrix)
        scores = nx.pagerank(nx_graph)

        ranked_sentences = sorted(((scores[i], s) for i, s in enumerate(sentences)), reverse=True)
        summary = ' '.join([s for _, s in ranked_sentences[:num_sentences]])
        return summary

    def extract_keywords(self, text, num_keywords=5):
        """
        基于TF-IDF提取关键词
        """
        _, words = self.preprocess_text(text)
        if not words:
            return []

        vectorizer = TfidfVectorizer(max_features=1000)
        tfidf_matrix = vectorizer.fit_transform([' '.join(words)])
        feature_array = np.array(vectorizer.get_feature_names_out())
        tfidf_sorting = np.argsort(tfidf_matrix.toarray()).flatten()[::-1]

        keywords = feature_array[tfidf_sorting][:num_keywords]
        return list(keywords)

# 主函数
def main():
    parser = argparse.ArgumentParser(description='智能文本摘要与关键词提取系统')
    parser.add_argument('text_file', help='输入文本文件路径')
    parser.add_argument('--sentences', type=int, default=3, help='摘要句子数量')
    parser.add_argument('--keywords', type=int, default=5, help='关键词数量')
    parser.add_argument('--algorithm', choices=['tfidf', 'textrank'], default='textrank', 
                       help='摘要算法选择')
    parser.add_argument('--output', default='summary_output.txt', help='输出文件路径')

    args = parser.parse_args()

    # 读取文本文件
    with open(args.text_file, 'r', encoding='utf-8') as f:
        text = f.read()

    summarizer = TextSummarizer()

    # 选择摘要算法
    if args.algorithm == 'tfidf':
        summary = summarizer.summarize_text(text, args.sentences)
    else:
        summary = summarizer.summarize_with_graph(text, args.sentences)

    # 提取关键词
    keywords = summarizer.extract_keywords(text, args.keywords)

    # 输出到控制台
    print(f"✅ 成功读取文本文件: {args.text_file}")
    print(f"使用算法: {args.algorithm.capitalize()}")
    print(f"生成摘要({args.sentences} 句):")
    print(summary)
    print(f"\n提取关键词({args.keywords} 个):")
    print(', '.join(keywords))

    # 输出到文件
    with open(args.output, 'w', encoding='utf-8') as f:
        f.write(f"= 摘要 =\n{summary}\n\n= 关键词 =\n" + '\n'.join(keywords))

if __name__ == '__main__':
    main()

四、项目结构与运行说明

1. 项目结构

text_summarizer/
│
├── text_summarizer.py
├── sample.txt
├── summary_output.txt
└── README.md

2. 运行环境要求

  • 操作系统:Windows、Linux、macOS
  • Python 版本:3.8 及以上
  • 依赖库nltk, scikit-learn, numpy, networkx
  • 安装方式
    bash
    pip install nltk scikit-learn numpy networkx

3. 运行方式

python text_summarizer.py sample.txt --sentences 2 --keywords 5 --algorithm textrank

4. 使用步骤

  1. 安装Python 3.8+;
  2. 安装所需依赖库;
  3. 准备一个文本文件(如 sample.txt);
  4. 运行命令,指定参数;
  5. 查看控制台输出和生成的 summary_output.txt 文件。

五、学习价值与扩展建议

学习价值

  • 自然语言处理基础:掌握文本分词、停用词过滤、句子提取等NLP基础操作;
  • TF-IDF 与 TextRank 算法:理解并实现两种主流的文本摘要方法;
  • 命令行参数解析:使用 argparse 实现灵活的用户交互;
  • 数据结构与算法应用:使用 defaultdictheapqnetworkx 等处理文本数据;
  • 模块化设计:便于后续扩展功能(如支持中文、GUI界面、API接口);
  • 文本特征提取:学习如何从文本中提取关键词与核心信息。

扩展建议

  • 支持中文处理:使用 jiebaHanLP 实现中文分词;
  • GUI界面集成:使用 tkinterPyQt 构建可视化操作界面;
  • 添加导出格式:支持导出为 .md.json.csv
  • 集成API服务:将工具封装为 Web API,供其他应用调用;
  • 支持语音输入:集成语音转文本功能,实现语音摘要;
  • 支持多语言处理:扩展为支持中文、法语、德语等语言的摘要系统。

六、总结

本项目实现了一个基于Python的智能文本摘要与关键词提取助手,支持使用 TF-IDF 或 TextRank 算法对文本进行自动摘要和关键词提取,具备清晰的输入输出行为和实际应用场景,适合中级以下开发者在1~3天内完成。通过该项目,开发者可以深入学习自然语言处理、算法实现与命令行交互设计,为构建更复杂的AI文本处理工具打下坚实基础。

本文由AI大模型(电信天翼量子AI云电脑-云智助手-Qwen3-32B)结合行业知识与创新视角深度思考后创作。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注