赞
踩
在今天的信息爆炸时代,我们每天都会接收到大量的信息,但是我们的时间和精力是有限的。因此,文本摘要提取成为了一种非常有价值的技术。本文将介绍如何使用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,让你更容易记住,并且不会枯燥乏味。
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
如果你也想和我一起学习Python,欢迎关注我留个言
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。