基于Python的文本摘要提取

在今天的信息爆炸时代,我们每天都会接收到大量的信息,但是我们的时间和精力是有限的。因此,文本摘要提取成为了一种非常有价值的技术。本文将介绍如何使用Python进行文本摘要提取,让我们能够更快速地获取关键信息,提高工作效率。

一、文本摘要任务简介

文本摘要旨在将文本或文本集合转换为包含关键信息的简短摘要。文本摘要按照输入类型可分为单文档摘要和多文档摘要。单文档摘要从给定的一个文档中生成摘要,多文档摘要从给定的一组主题相关的文档中生成摘要。按照输出类型可分为抽取式摘要和生成式摘要。摘要的意思就是指用几句话来概括一段文字。

二、范例文本

10月9日,在加沙城,人们查看被以色列空袭炸毁的建筑废墟。以色列国防部长加兰特9日说,已指示以军"全面封锁"巴勒斯坦加沙地带。据以色列和巴勒斯坦医疗机构最新消息,冲突已造成1300多人死亡,5000多人受伤。以能源部长卡茨同在9日表示,他已下令切断以色列对加沙地带供水。此前,以色列能源部已宣布切断对加沙地带的供电。加沙地带三分之二供电来自以色列。以色列和巴勒斯坦7日爆发新一轮军事冲突。9日,以军证实在南部多处地点与巴勒斯坦伊斯兰抵抗运动(哈马斯)武装人员交火。巴勒斯坦加沙地带卫生部门9日说,以色列军队袭击加沙地带已造成巴方约560人死亡、2900人受伤。同一天,哈马斯下属武装派别卡桑旅说,以色列对加沙地带的空袭造成4名以色列被俘人员丧生,另有多名卡桑旅人员死亡。设于东耶路撒冷的联合国人道主义事务协调厅巴勒斯坦办公室8日晚发表声明说,巴以新一轮冲突已导致加沙地带至少2万个家庭、超过12万人流离失所,约7.3万人在加沙地带多所学校里避难。联合国已启动位于加沙地带的紧急避难所。以色列卫生部9日确认,冲突已造成至少800名以色列人死亡、2506人受伤。

三、文本分句

复制代码
#
# coding:utf-8
texts = "10月9日,在加沙城,人们查看被以色列空袭炸毁的建筑废墟。以色列国防部长加兰特9日说,已指示以军"全面封锁"巴勒斯坦加沙地带。据以色列和巴勒斯坦医疗机构最新消息,冲突已造成1300多人死亡,5000多人受伤。以能源部长卡茨同在9日表示,他已下令切断以色列对加沙地带供水。此前,以色列能源部已宣布切断对加沙地带的供电。加沙地带三分之二供电来自以色列。以色列和巴勒斯坦7日爆发新一轮军事冲突。9日,以军证实在南部多处地点与巴勒斯坦伊斯兰抵抗运动(哈马斯)武装人员交火。巴勒斯坦加沙地带卫生部门9日说,以色列军队袭击加沙地带已造成巴方约560人死亡、2900人受伤。同一天,哈马斯下属武装派别卡桑旅说,以色列对加沙地带的空袭造成4名以色列被俘人员丧生,另有多名卡桑旅人员死亡。设于东耶路撒冷的联合国人道主义事务协调厅巴勒斯坦办公室8日晚发表声明说,巴以新一轮冲突已导致加沙地带至少2万个家庭、超过12万人流离失所,约7.3万人在加沙地带多所学校里避难。联合国已启动位于加沙地带的紧急避难所。以色列卫生部9日确认,冲突已造成至少800名以色列人死亡、2506人受伤。"

def sent_tokenizer(texts):
    start = 0
    i = 0 #每个字符的位置
    sentences=[]
    punt_list=',.!?:;~,。!?:;~'#标点符号

    for text in texts: # 遍历每一个字符
        if text in punt_list and token not in punt_list: # 检查标点符号下一个字符是否还是标点
            sentences.append(texts[start:i + 1]) # 当前标点符号位置
            start=i + 1 # start标记到下一句的开头
            i += 1
        else:
            i += 1 # 若不是标点符号,则字符位置继续前移
            token=list(texts[start:i+2]).pop() # 取下一个字符.pop是删除最后一个
    if start < len(texts):
        sentences.append(texts[start:]) # 这是为了处理文本末尾没有标点符号的情况
    return sentences

sentence = sent_tokenizer(str(texts))
print(sentence)

运行结果如下:

四、加载停用词

停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。

复制代码
def load_stop_words(file = "./stopwords-master/hit_stopwords.txt"):
    with open(file,"r",encoding = "utf-8") as f:
        return f.read().split("\n")
stopwords = load_stop_words()

五、取出高频词

这里取出的前20个高频词。针对不同长度的文本可以取更多的高频词,文本越长,需要的高频词越多。

复制代码
sentence = sent_tokenizer(texts) # 分句
words = [w for sentence in sentence for w in jieba.cut(sentence) if w not in stopwords if len(w)>1 and w!='\t'] # 词语,非单词词,同时非符号
wordfre = nltk.FreqDist(words) # 统计词频
topn_words = [w[0] for w in sorted(wordfre.items(),key=lambda d:d[1],reverse=True)][:20] # 取出词频最高的20个单词

六、给句子打分

思路如下:

1.传入参数:sentences,topn_words。sentences为分句文本,topn_words为高频词数组

2.准备好记录每个分句的得分数组scores=[],初始化句子标号-1:sentence_idx=-1

3.对每一个分句分词。得到分句分词数组

4.遍历每一个分句分词数组

5.句子索引+1。0表示第一个句子:sentence_idx+=1

6.准备好word_idx=[],用来存放高频词在当前分句中的索引位置

7.遍历每一个高频词

8.记录高频词在当前分句出现索引位置

9.对字典进行排序,得到的类似1,2,3,4,5]或者[0,1]其中的0,1表示高频词在当前分句出现的索引位置

10.对得到的字典进行聚类,clusters存放的是当前分句的所有簇,cluster存放的是一个簇。

11.对当前分句的字典中的高频词索引进行遍历,如果相邻两个高频词索引位置差小于阈值(如果文本过长,阈值需增大),则这两个词是一类,添加进cluster。

12.clusters添加cluster。得到clusters类似[[0,1,2],[4,5],[7]]。(当前分句高频词索引为012457)

13.遍历clusters中的每一个簇,对每个簇进行打分,打分公式为:当前分句高频词总个数*当前分句高频词总个数/当前分句最后一个高频词与第一个高频词之间的距离

14.存放当前分句的最高分簇。

15.记录当前分句的的得分,记录格式(分句标号,簇的最高分)

16.重复步骤4-15,开始对下一个分句打分

17.返回scores

复制代码
def _score_sentences(sentences,topn_words): # 参数 sentences:文本组(分好句的文本,topn_words:高频词组)
    scores = []
    sentence_idx = -1 # 初始句子索引标号-1
    for s in [list(jieba.cut(s)) for s in sentences]: # 遍历每一个分句
        sentence_idx += 1 # 句子索引+1。。0表示第一个句子
        word_idx = [] # 存放高频词在分句中的索引位置.得到结果类似:[1, 2, 3, 4, 5],[0, 1],[0, 1, 2, 4, 5, 7]
        for w in topn_words: # 遍历每一个高频词
            try:
                word_idx.append(s.index(w)) # 高频词出现在该分句子中的索引位置
            except ValueError: # 不在句子中
                pass
        word_idx.sort()
        if len(word_idx) == 0:
            continue

        # 对于两个连续的单词,利用单词位置索引,通过距离阀值计算族
        clusters = [] # 存放的是几个cluster。类似[[0, 1, 2], [4, 5], [7]]
        cluster = [word_idx[0]] # 存放的是一个类别(簇)类似[0, 1, 2]
        i = 1
        while i < len(word_idx):# 遍历当前分句中的高频词
            CLUSTER_THRESHOLD = 2 # 举例阈值设为2
            if word_idx[i]-word_idx[i-1] < CLUSTER_THRESHOLD: # 如果当前高频词索引与前一个高频词索引相差小于3,
                cluster.append(word_idx[i]) # 则认为是一类
            else:
                clusters.append(cluster[:]) # 将当前类别添加进clusters=[]
                cluster=[word_idx[i]] # 新的类别
            i += 1
        clusters.append(cluster)

        # 对每个族打分,每个族类的最大分数是对句子的打分
        max_cluster_score = 0
        for c in clusters: # 遍历每一个簇
            significant_words_in_cluster=len(c) # 当前簇的高频词个数
            total_words_in_cluster=c[-1]-c[0] + 1 # 当前簇里最后一个高频词与第一个的距离
            score = 1.0*significant_words_in_cluster*significant_words_in_cluster/total_words_in_cluster
            if score > max_cluster_score:
                max_cluster_score = score
        scores.append((sentence_idx,max_cluster_score)) # 存放当前分句的最大簇(说明下,一个分解可能有几个簇)存放格式(分句索引,分解最大簇得分)
    return scores;
scored_sentences = _score_sentences(sentence,topn_words)
print(scored_sentences)

运行结果如下:

七、摘要提取

通过返回得分最高的几个句子来提取摘要。

复制代码
top_n_scored = sorted(scored_sentences,key = lambda s:s[1])[-3:] # 对得分进行排序,取出3个句子
top_n_scored = sorted(top_n_scored,key = lambda s:s[0]) # 对得分最高的几个分句,进行分句位置排序
c = dict(top_n_summary = [sentence[idx] for (idx,score) in top_n_scored])
print(c)

运行结果如下:

以上就是基于Python实现对文本提取摘要的全过程介绍。文本摘要提取技术可以帮助我们更快速地获取关键信息,提高工作效率。希望本文能对大家有所帮助

如果你想学习编程给大家分享一份Python学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂。如果需要的话直接划到文末免费获得,让我们一起学习!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、清华编程大佬出品《漫画看学Python》

用通俗易懂的漫画,来教你学习Python,让你更容易记住,并且不会枯燥乏味。

配套600集视频:

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


如果你也想和我一起学习Python,欢迎关注我留个言

相关推荐
skywalk81632 分钟前
Graph Database Self-Managed Neo4j 知识图谱存储实践2:通过官方新手例子入门(未完成)
数据库·知识图谱·neo4j
Lucky GGBond4 分钟前
MySQL 报错解析:SQLSyntaxErrorException caused by extra comma before FROM
数据库·mysql
夜夜敲码12 分钟前
C语言教程(十六): C 语言字符串详解
c语言·开发语言
爱吃泡芙的小白白17 分钟前
爬虫学习——使用HTTP服务代理、redis使用、通过Scrapy实现分布式爬取
redis·分布式·爬虫·http代理·学习记录
宋康19 分钟前
C语言结构体和union内存对齐
c语言·开发语言
逢生博客24 分钟前
使用 Python 项目管理工具 uv 快速创建 MCP 服务(Cherry Studio、Trae 添加 MCP 服务)
python·sqlite·uv·deepseek·trae·cherry studio·mcp服务
xwz小王子27 分钟前
Nature Communications 面向形状可编程磁性软材料的数据驱动设计方法—基于随机设计探索与神经网络的协同优化框架
深度学习
居然是阿宋29 分钟前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
堕落似梦30 分钟前
Pydantic增强SQLALchemy序列化(FastAPI直接输出SQLALchemy查询集)
python
Claudio33 分钟前
【MySQL】联合索引和覆盖索引(索引失效的误区讲解+案例分析)
数据库