基于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,欢迎关注我留个言

相关推荐
q5673152312 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
是萝卜干呀13 分钟前
Backend - Python 爬取网页数据并保存在Excel文件中
python·excel·table·xlwt·爬取网页数据
代码欢乐豆14 分钟前
数据采集之selenium模拟登录
python·selenium·测试工具
白榆maple20 分钟前
(蓝桥杯C/C++)——基础算法(下)
算法
喵~来学编程啦21 分钟前
【论文精读】LPT: Long-tailed prompt tuning for image classification
人工智能·深度学习·机器学习·计算机视觉·论文笔记
JSU_曾是此间年少24 分钟前
数据结构——线性表与链表
数据结构·c++·算法
许野平37 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨41 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
零炻大礼包1 小时前
【SQL server】数据库远程连接配置
数据库
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python