Python AI办公神器:长文本秒变精华,摘要关键词一键提取

内容分享3小时前发布
0 0 0

Python AI办公神器:长文本秒变精华,摘要关键词一键提取

上一篇用LSTM实现电影评论情感分析后,后台收到大量职场人的留言:“每天要处理几十份客户报告、会议纪要,有没有办法让AI自动提炼核心内容?”这正是NLP技术最接地气的应用——文本摘要与关键词提取,能把上千字的长文浓缩成百字精华,还能自动抓取核心词,大幅节省阅读时间。

今天这篇,我们就用Python搭建两套实用工具:一套基于“TextRank算法”实现轻量级摘要与关键词提取(无需训练,开箱即用),另一套基于预训练模型实现更高质量的摘要生成。最后还会整合为批量处理工具,支持Word/Excel中的长文本批量处理,真正成为你的办公效率利器。

一、核心认知:AI如何“提炼”文本精华?

人类提炼摘要时,会先抓住“关键句”,再从关键句中提取“核心词”。AI则通过两种主流思路实现这一过程,分别适配不同场景:

无监督算法(如TextRank):把句子看作“节点”,句子间的类似度看作“连接”,通过计算节点权重找出关键句(摘要);再对关键句做同样处理,提取关键词。优点是无需训练数据,速度快,适合办公轻场景。

预训练模型(如BART、T5):基于海量文本训练的专业摘要模型,能理解上下文逻辑,生成更连贯、更贴合语义的摘要。优点是摘要质量高,适合复杂文本;缺点是对硬件有必定要求,速度略慢。

场景选择提议:日常办公处理会议纪要、报告等,用TextRank足够;处理学术论文、深度分析等复杂文本,优先用预训练模型。

二、核心工具与环境准备

文本摘要与关键词提取的工具链超级成熟,我们选用轻量级库为主,兼顾效率与效果,新手无需配置复杂环境:

  • jieba:中文分词核心库,为TextRank算法提供基础支持
  • textrank4zh:基于TextRank的中文摘要与关键词提取库,封装完善
  • transformers:Hugging Face开源库,提供预训练摘要模型(如BART)
  • python-docx/openpyxl:处理Word/Excel文件,实现办公场景落地

安装命令(一次性安装所有依赖,复制执行即可):

# 安装核心依赖库
pip install jieba textrank4zh transformers torch python-docx openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
# torch是transformers的依赖,用于模型计算;python-docx处理Word,openpyxl处理Excel

三、实战一:TextRank轻量工具(办公首选,开箱即用)

TextRank是办公场景的“性价比之王”,无需训练,只需3行代码就能实现摘要提取,我们从“单文本处理”到“批量处理”逐步实现。

步骤1:单文本摘要与关键词提取(核心代码)

以一段会议纪要为例,实现“提取3句摘要+5个关键词”的核心功能,代码可直接复制使用:

from textrank4zh import TextRank4Keyword, TextRank4Sentence

# 1. 准备测试文本(替换为你的会议纪要、报告等长文本)
long_text = """
2024年Q3产品迭代会议纪要:本次会议围绕Q3核心产品优化方向展开讨论,参会人员包括产品部、技术部、运营部负责人。
产品部提出,当前用户反馈聚焦在三个问题:一是APP启动速度慢,平均启动时间超过3秒,较行业均值高50%;二是搜索功能准确率低,用户搜索“优惠活动”时,常出现无关商品推荐;三是个人中心界面杂乱,核心功能入口不明显。
技术部回应,启动速度慢的核心缘由是缓存机制不合理,计划采用二级缓存架构优化,预计可将启动时间压缩至1.5秒以内;搜索准确率问题将引入新的分词算法,下周完成技术调研,本月内上线测试版本。
运营部提议,在优化功能的同时,配合开展“老用户召回”活动,结合优化后的搜索功能推送精准优惠,预计可提升30%的日活用户数。
会议明确各部门时间节点:技术部需在9月30日前完成启动速度和搜索功能的优化;运营部需在10月15日前完成召回活动方案并落地;产品部负责全程跟进进度,每周三召开进度同步会。
"""

# 2. 提取关键词(核心词)
tr4w = TextRank4Keyword()
tr4w.analyze(text=long_text, lower=True, window=2)  # window=2表明计算相邻2个词的关联
# 获取排名前5的关键词,包含词的权重(权重越高越重大)
keywords = tr4w.get_keywords(num=5, word_min_len=2)  # word_min_len=2过滤单字

# 3. 提取摘要(关键句)
tr4s = TextRank4Sentence()
tr4s.analyze(text=long_text, lower=True, source='all_filters')
# 获取排名前3的关键句作为摘要,设置摘要长度范围(可选)
summaries = tr4s.get_key_sentences(num=3, sentence_min_len=15)  # 过滤短句子

# 4. 输出结果
print("=== 提取的关键词 ===")
for keyword in keywords:
    print(f"词:{keyword.word},权重:{keyword.weight:.4f}")

print("
=== 提取的摘要 ===")
summary_result = "。".join([sent.sentence for sent in summaries]) + "。"
print(summary_result)

# 5. 格式化输出(模拟办公场景的简洁结果)
print("
=== 办公版结果 ===")
print(f"【核心关键词】:{','.join([kw.word for kw in keywords])}")
print(f"【核心摘要】:{summary_result}")

运行结果说明:关键词会优先出现“产品”“优化”“启动速度”等核心词,摘要会提炼出“问题-解决方案-时间节点”的核心逻辑,完全符合人工提炼的思路。

步骤2:自定义调整(按需优化结果)

根据文本类型调整参数,让结果更贴合需求,列如学术论文需要更长摘要,新闻需要更精炼关键词:

# 自定义参数说明与调整示例
def extract_summary_keyword(text, 
                           keyword_num=5,    # 关键词数量,可设为3-10
                           summary_num=3,    # 摘要句数,可设为2-5
                           keyword_min_len=2,# 关键词最小长度,学术文本可设为3
                           summary_min_len=15):# 摘要句最小长度,新闻可设为10
    
    # 关键词提取
    tr4w = TextRank4Keyword()
    tr4w.analyze(text=text, lower=True, window=3)  # window=3适合长文本,关联更紧密
    keywords = tr4w.get_keywords(num=keyword_num, word_min_len=keyword_min_len)
    
    # 摘要提取
    tr4s = TextRank4Sentence()
    # source='all_filters' 过滤无意义句子,'no_filter' 保留所有句子
    tr4s.analyze(text=text, lower=True, source='all_filters')
    summaries = tr4s.get_key_sentences(num=summary_num, sentence_min_len=summary_min_len)
    
    # 结果整理
    result = {
        "keywords": [kw.word for kw in keywords],
        "keyword_weights": [kw.weight for kw in keywords],
        "summary": "。".join([sent.sentence for sent in summaries]) + "。",
        "summary_weights": [sent.weight for sent in summaries]
    }
    return result

# 测试:学术论文场景(更多关键词,更长摘要)
academic_text = """
深度学习在计算机视觉领域的应用已取得突破性进展。卷积神经网络(CNN)作为核心模型,通过局部感受野、权值共享等机制,有效提取图像的空间特征,在图像分类任务中实现了超过95%的准确率。
近年来,Transformer模型被引入计算机视觉领域,其自注意力机制能够捕捉全局特征关联,解决了CNN在长距离特征依赖上的不足。
基于Transformer的ViT(Vision Transformer)模型,将图像分割为多个patch,通过序列建模实现图像分类,在ImageNet数据集上的表现已超越传统CNN模型。
未来研究方向将聚焦于CNN与Transformer的融合架构,结合两者局部特征提取与全局关联捕捉的优势,进一步提升模型性能。
"""
# 调用自定义函数,适配学术场景
academic_result = extract_summary_keyword(
    text=academic_text,
    keyword_num=6,
    summary_num=4,
    keyword_min_len=3
)

print("=== 学术文本处理结果 ===")
print(f"关键词:{','.join(academic_result['keywords'])}")
print(f"摘要:{academic_result['summary']}")

四、实战二:预训练模型(高质量摘要,复杂文本首选)

对于小说片段、学术论文等复杂文本,TextRank的摘要可能缺乏连贯性,此时用Hugging Face的预训练模型(如“
uer/bart-base-chinese-cluecorpussmall”)效果更好,该模型专门针对中文文本优化:

步骤1:单文本高质量摘要生成

from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM

# 1. 加载预训练模型和分词器(中文摘要专用模型)
model_name = "uer/bart-base-chinese-cluecorpussmall"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

# 2. 构建摘要生成管道
summarizer = pipeline(
    "summarization",
    model=model,
    tokenizer=tokenizer,
    device=-1  # -1表明用CPU,若有GPU可设为0(速度提升5倍以上)
)

# 3. 准备复杂文本(以小说片段为例)
novel_text = """
林晓雨站在公司楼下的咖啡馆外,手里紧紧攥着那份刚刚打印好的离职申请。三个月前,她满怀憧憬地加入这家互联网大厂,成为产品经理团队的一员。
入职初期,她每天加班到深夜,精心打磨每一个产品方案,可每次汇报都被领导以“不够创新”驳回。上周,她提出的“老年用户专属功能”方案,被新来的实习生剽窃,领导却由于实习生是“名校毕业生”而偏袒对方。
此刻,咖啡馆的玻璃门反射出她疲惫的脸,她突然想起大学时导师说的话:“一份好的工作,应该让你看到成长,而不是消耗你的热烈。”
她深吸一口气,将离职申请塞进包里,转身走向公交站——她决定给自己放一个长假,然后重新寻找真正适合自己的舞台。
"""

# 4. 生成摘要(设置摘要长度范围)
summary = summarizer(
    novel_text,
    max_length=100,  # 摘要最大长度
    min_length=30,   # 摘要最小长度
    do_sample=False  # 不随机生成,保证结果稳定
)

# 5. 提取关键词(结合TextRank,兼顾效率与效果)
tr4w = TextRank4Keyword()
tr4w.analyze(text=novel_text, lower=True, window=2)
keywords = tr4w.get_keywords(num=4)

# 6. 输出结果
print("=== 预训练模型摘要结果 ===")
print(f"摘要:{summary[0]['summary_text']}")
print(f"关键词:{','.join([kw.word for kw in keywords])}")

结果优势:预训练模型生成的摘要会包含“林晓雨的经历+离职缘由+后续决定”的完整逻辑链,比TextRank更连贯,更贴近人类的叙事习惯。

步骤2:模型加速技巧(解决CPU速度慢问题)

如果用CPU运行预训练模型速度慢,可通过“模型量化”减小模型体积,提升运行速度,准确率几乎无损失:

from transformers import AutoModelForSeq2SeqLM

# 加载量化后的模型(仅需修改模型加载方式)
model = AutoModelForSeq2SeqLM.from_pretrained(
    model_name,
    load_in_8bit=True,  # 8位量化,模型体积减少75%,速度提升2-3倍
    device_map="auto"   # 自动分配设备
)

# 后续摘要生成代码与之前完全一致
summary_fast = summarizer(
    novel_text,
    max_length=100,
    min_length=30,
    do_sample=False
)

print("=== 量化后模型结果 ===")
print(f"摘要:{summary_fast[0]['summary_text']}")

五、实战三:办公落地——批量处理Word/Excel文本

将上述功能整合为批量处理工具,支持从Word/Excel中读取多条长文本,自动生成摘要和关键词并保存,直接对接办公场景:

场景1:批量处理Excel中的长文本

假设Excel中有“文档内容”列,批量生成“摘要”和“关键词”列并保存:

import pandas as pd

# 1. 读取Excel文件(替换为你的文件路径)
df = pd.read_excel("office_documents.xlsx")
print(f"读取到{len(df)}条文本数据")

# 2. 批量处理函数(整合TextRank,兼顾速度与办公需求)
def batch_process_excel(df, text_col="文档内容"):
    # 新增结果列
    df["摘要"] = ""
    df["关键词"] = ""
    
    for idx, row in df.iterrows():
        try:
            text = str(row[text_col])
            if text.strip() == "":
                df.loc[idx, "摘要"] = "无有效文本"
                df.loc[idx, "关键词"] = "无"
                continue
            
            # 提取摘要和关键词
            result = extract_summary_keyword(
                text=text,
                keyword_num=5,
                summary_num=3
            )
            
            # 填充结果
            df.loc[idx, "摘要"] = result["summary"]
            df.loc[idx, "关键词"] = ",".join(result["keywords"])
            
            # 进度提示
            if (idx + 1) % 10 == 0:
                print(f"已处理{idx + 1}条数据")
        except Exception as e:
            df.loc[idx, "摘要"] = f"处理错误:{str(e)[:20]}"
            df.loc[idx, "关键词"] = "处理错误"
    
    return df

# 3. 执行批量处理
result_df = batch_process_excel(df)

# 4. 保存结果到新Excel
result_df.to_excel("office_documents_with_summary.xlsx", index=False)
print("批量处理完成!结果已保存至 office_documents_with_summary.xlsx")

# 5. 简单统计
print(f"
统计信息:")
print(f"成功处理:{len(result_df[result_df['摘要'] != '处理错误'])}条")
print(f"处理失败:{len(result_df[result_df['摘要'].str.contains('处理错误')])}条")

场景2:批量处理Word文档

批量读取指定文件夹中的所有Word文档,提取内容后生成摘要和关键词,汇总保存到Excel:

import os
from docx import Document
import pandas as pd

# 1. 读取指定文件夹中的所有Word文档
word_folder = "word_documents"  # 替换为你的Word文件夹路径
word_files = [f for f in os.listdir(word_folder) if f.endswith(".docx")]
print(f"发现{len(word_files)}个Word文档")

# 2. 从Word中提取文本
def extract_text_from_word(file_path):
    doc = Document(file_path)
    full_text = []
    for paragraph in doc.paragraphs:
        if paragraph.text.strip():
            full_text.append(paragraph.text)
    return "
".join(full_text)

# 3. 批量处理
result_data = []
for file in word_files:
    file_path = os.path.join(word_folder, file)
    try:
        # 提取文本
        text = extract_text_from_word(file_path)
        # 提取摘要和关键词
        tr_result = extract_summary_keyword(text=text, keyword_num=5, summary_num=3)
        # 保存结果
        result_data.append({
            "文档名称": file,
            "原文内容": text[:500] + "..." if len(text) > 500 else text,  # 只保留前500字
            "摘要": tr_result["summary"],
            "关键词": ",".join(tr_result["keywords"])
        })
        print(f"已处理:{file}")
    except Exception as e:
        result_data.append({
            "文档名称": file,
            "原文内容": "读取失败",
            "摘要": f"错误:{str(e)[:20]}",
            "关键词": "处理错误"
        })
        print(f"处理失败:{file},缘由:{str(e)[:30]}")

# 4. 转为DataFrame并保存
result_df = pd.DataFrame(result_data)
result_df.to_excel("word_documents_summary.xlsx", index=False)
print(f"
所有Word文档处理完成!结果汇总至 word_documents_summary.xlsx")

六、新手避坑指南与工具优化

1. 中文分词坑:若文本包含专业术语(如“ViT模型”),可自定义jieba词典,避免被拆分成“ViT”“模型”两个词,影响关键词提取;

2. 文本清洗坑:处理办公文档时,先过滤掉“会议时间:XXX”“参会人:XXX”等无意义内容,摘要质量会显著提升;

3. 模型选择坑:短文本(少于300字)用TextRank足够,长文本(超过1000字)优先用预训练模型;

4. 优化技巧:可将批量处理工具打包为EXE文件(用pyinstaller),发给不懂Python的同事也能使用,命令:pyinstaller -F -w text_summary_tool.py。

七、下期预告与互动

本期用两种方案实现了文本摘要与关键词提取,你已经掌握了NLP在办公场景的核心落地技巧。下期专栏将进入NLP的“对话式AI”领域,教你用预训练模型搭建简易版“智能问答机器人”,能回答文档中的具体问题,列如“从这份会议纪要中,提取技术部的时间节点”,实现更精准的信息获取。

你在文本处理中遇到了哪些问题?是专业术语被拆分错误,还是批量处理Word时读取失败?欢迎在评论区留言,附上你的文本片段或文档格式,我来帮你排查!私信回复“文本工具”可获取完整代码和测试用文档。

#PythonAI #NLP办公神器 #文本摘要 #关键词提取 #效率工具

© 版权声明

相关文章

暂无评论

none
暂无评论...