中文文本摘要提取 (文本摘要提取 有代码)基于python
任务简介
文本摘要旨在将文本或文本集合转换为包含关键信息的简短摘要。文本摘要按照输入类型可分为单文档摘要和多文档摘要。单文档摘要从给定的一个文档中生成摘要,多文档摘要从给定的一组主题相关的文档中生成摘要。按照输出类型可分为抽取式摘要和生成式摘要。
摘要:意思就是从一段文本 用几句话来概括这段话的意思
方法有很多
本文只讲我会的 。
思路
1 :将文本分词,统计一段文本的词频(当然是去除停用词之后的词频),得到{词:词频}
2: 对文本进行分句
3:对句子进行打分,统计这个句子中出现的每个词的词频,
句子得分=sum(每个词的词频 )
4.找到得分最高多的几个句子 作为摘要
得分最高的几个句子,包含了多个高频词 ,原则上可以作为概括文本的摘要。
算例:
数据集:《乘风破浪的小姐姐》 的一段网文
《乘风破浪的姐姐》现在已经播出到了第2期节目,在初舞台之后,现在大家都对姐姐们的实力是有所了解的了。在看完初舞台之后,很多观众就都清楚了哪些姐姐的实力是不错的,哪些姐姐是比较弱的了。不过呢只看了初舞台就认定姐姐们的实力是片面的了,因为小编发现在这么多“姐姐”中其实有一些姐姐是黑马选手呀。
像是在最新一期节目中,小编就发现了一位“黑马”姐姐,而这个人是谁呢?就是王智了,在最新播出的这一期节目中,王智可是成功逆袭了,她这回成功让观众们看到了她,让导师认可了自己的实力。《浪姐》出现“黑马”姐姐,初舞台最后一名,这一期却连连被夸!说到王智,在初舞台的时候小编对她的印象是不深的。
而在这一期节目中呢当小组在排练的时候,王智会反复跟老师强调自己是“最后一名”,这下小编采知道她原来在初舞台的时候是最后一名。王智在初舞台得到了最后一名,这打击对她来说还是挺大的,在排练的时候大家也可以看出了她的不自信。然而这回她很幸运地遇到了伊能静,在伊能静的教学下,最后她可是受到了老师的连连夸赞。
《浪姐》出现“黑马”姐姐,初舞台最后一名,这一期却连连被夸!此次节目中姐姐们进行了一段时间的练习,就去进行评测了,而在王智这一组表演完后,最终导师们也给出了评价,在她们三个人这一组中,王智就是被夸得最多的那一个。当在看了王智这次的表演后,最后赵兆老师竟然跟她道歉了。
赵兆老师说昨天很抱歉给她打了最低分,但是今天呢她真的让他觉得“傻”了,因为他将这首歌演唱得太好了,他觉得王智非常适合这首歌呢!一向比较严格的赵兆老师这回对王智很是赞扬,看来是被她的表演给惊喜到了。能够得到了专业的赵兆老师的赞扬,可见王智的实力那是很棒的呀。
而在赵兆说完后,黄晓明也补充说道“真的是,你一张嘴我们都惊了,真的。”这次可以从导师们的话中了解到王智的进步真的是很大了,她这次选择了一首合适自己的歌曲,并且有认真努力地去唱好它,就将它很好地诠释了出来了!这个姐姐其实并不是没有实力,只是实力没有一开始就表现出来。她真的是一匹“黑马”了,当看了这一期节目后,现在观众们都在期待着她后面带来的惊喜了!
代码来了
1读取文件;
第1,2,3行读取文件,读取后的文件格式为数组
第5,6,7将读取的文件转换为字符串
#读取文件
f=open('文档练手.txt',encoding='utf-8')
data = f.readlines() # 直接将文件中按行读到list里,效果与方法2一样
f.close() # 关
#将文件转换成字符串
text=""
for line in data:
text+=line
print(text)
2清洗数据:
第1,2行导入包
第3行去除一些类型[1]引用,本文用不上
第4行 单个空格替换额外空格
第5行分句
re.split(’(。|!|!|.|?|?)’,text) 加括号则保留分句符号如。!,不加则不保留分句符号
import re
import jieba
text = re.sub(r'[[0-9]*]',' ',text)#去除类似[1],[2]
text = re.sub(r'\s+',' ',text)#用单个空格替换了所有额外的空格
sentences = re.split('(。|!|\!|\.|?|\?)',text)#分句
print(sentences)
3加载停用词
#加载停用词
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()]
return stopwords
stopwords = stopwordslist("停用词.txt")
停用词.txt 样子
4统计文本词频
第1行:创建一个空字典
第2行:文本分词,对每个单词循环
第3行:检查单词是否在stopwords停用词中,然后再次检查单词是否在word2count词频key中,不在则把word2count [word]置为1,否则word2count [word] 加1。
最后对词频归一化
#词频
word2count = {} #line 1
for word in jieba.cut(text): #对整个文本分词
if word not in stopwords:
if word not in word2count.keys():
word2count[word] = 1
else:
word2count[word] += 1
for key in word2count.keys():
word2count[key] = word2count[key] / max(word2count.values())
print(word2count)
5计算句子得分
第1行:创建一个空字典
第2行:对sentences中每个sentence进行循环
第3行:将sentence分词,对每个word循环
第4行:使用if检查word2count.keys()中是否存在该单词
第5行:这里我指定计算句子长度小于300的那部分,你可以根据需要更改
第6行:再次使用if-else条件,判断如果句子不存在于sentence2keys()中,则执行 sent2score [sentence] = word2count [word],否则执行 sent2score [sentence] + = word2count [word]
#计算句子得分
sent2score = {}
for sentence in sentences:
for word in jieba.cut(sentence):
if word in word2count.keys():
if len(sentence)<300:
if sentence not in sent2score.keys():
sent2score[sentence] = word2count[word]
else:
sent2score[sentence] += word2count[word]
print(sent2score)
6 字典排序
#字典排序
def dic_order_value_and_get_key(dicts, count):
# by hellojesson
# 字典根据value排序,并且获取value排名前几的key
final_result = []
# 先对字典排序
sorted_dic = sorted([(k, v) for k, v in dicts.items()], reverse=True)
tmp_set = set() # 定义集合 会去重元素
for item in sorted_dic:
tmp_set.add(item[1])
for list_item in sorted(tmp_set, reverse=True)[:count]:
for dic_item in sorted_dic:
if dic_item[1] == list_item:
final_result.append(dic_item[0])
return final_result
7选取句子得分最高的5句话作为摘要
final_resul=dic_order_value_and_get_key(sent2score,5)
print(final_resul)
结果:
['”这次可以从导师们的话中了解到王智的进步真的是很大了,她这次选择了一首合适自己的歌曲,并且有认真努力地去唱好它,就将它很好地诠释了出来了', ' 赵兆老师说昨天很抱歉给她打了最低分,但是今天呢她真的让他觉得“傻”了,因为他将这首歌演唱得太好了,他觉得王智非常适合这首歌呢', ' 而在这一期节目中呢当小组在排练的时候,王智会反复跟老师强调自己是“最后一名”,这下小编采知道她原来在初舞台的时候是最后一名', '她真的是一匹“黑马”了,当看了这一期节目后,现在观众们都在期待着她后面带来的惊喜了', '此次节目中姐姐们进行了一段时间的练习,就去进行评测了,而在王智这一组表演完后,最终导师们也给出了评价,在她们三个人这一组中,王智就是被夸得最多的那一个']
代码汇总
:
#读取文件
f=open('文档练手.txt',encoding='utf-8')
data = f.readlines() # 直接将文件中按行读到list里,效果与方法2一样
f.close() # 关
#将文件转换成字符串
text=""
for line in data:
text+=line
#清洗数据
import re
import jieba
text = re.sub(r'[[0-9]*]',' ',text)#去除类似[1],[2]
text = re.sub(r'\s+',' ',text)#用单个空格替换了所有额外的空格
sentences = re.split('(。|!|\!|\.|?|\?)',text)#分句
#加载停用词
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()]
return stopwords
stopwords = stopwordslist("停用词.txt")
#词频
word2count = {} #line 1
for word in jieba.cut(text): #对整个文本分词
if word not in stopwords:
if word not in word2count.keys():
word2count[word] = 1
else:
word2count[word] += 1
for key in word2count.keys():
word2count[key] = word2count[key] / max(word2count.values())
#计算句子得分
sent2score = {}
for sentence in sentences:
for word in jieba.cut(sentence):
if word in word2count.keys():
if len(sentence)<300:
if sentence not in sent2score.keys():
sent2score[sentence] = word2count[word]
else:
sent2score[sentence] += word2count[word]
#字典排序
def dic_order_value_and_get_key(dicts, count):
# by hellojesson
# 字典根据value排序,并且获取value排名前几的key
final_result = []
# 先对字典排序
sorted_dic = sorted([(k, v) for k, v in dicts.items()], reverse=True)
tmp_set = set() # 定义集合 会去重元素 --此处存在一个问题,成绩相同的会忽略,有待改进
for item in sorted_dic:
tmp_set.add(item[1])
for list_item in sorted(tmp_set, reverse=True)[:count]:
for dic_item in sorted_dic:
if dic_item[1] == list_item:
final_result.append(dic_item[0])
return final_result
#摘要输出
final_resul=dic_order_value_and_get_key(sent2score,5)
print(final_resul)
来源 @Author: yudengwu