文本摘要方法有很多,主要分为抽取式和生成式,应用比较多的是抽取式,也比较简单,就是从文本中抽取重要的句子或段落。本方法主要是利用句子中的关键词的距离,主要思想和参考来自阮一峰的网络日志http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html

#!/user/bin/python
# coding:utf-8
__author__ = 'yan.shi'
import nltk
import numpy
import jieba
import codecsN=100#单词数量
CLUSTER_THRESHOLD=5#单词间的距离
TOP_SENTENCES=5#返回的top n句子#分句
def sent_tokenizer(texts):start=0i=0#每个字符的位置sentences=[]punt_list='.!?。!?'.decode('utf8') #',.!?:;~,。!?:;~'.decode('utf8')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+=1else:i+=1#若不是标点符号,则字符位置继续前移token=list(texts[start:i+2]).pop()#取下一个字符if start<len(texts):sentences.append(texts[start:])#这是为了处理文本末尾没有标点符号的情况return sentences#停用词
def load_stopwordslist(path):print('load stopwords...')stoplist=[line.strip() for line in codecs.open(path,'r',encoding='utf8').readlines()]stopwrods={}.fromkeys(stoplist)return stopwrods#摘要
def summarize(text):stopwords=load_stopwordslist('E:\stopwords.txt')sentences=sent_tokenizer(text)words=[w for sentence in sentences 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)][:N]scored_sentences=_score_sentences(sentences,topn_words)#approach 1,利用均值和标准差过滤非重要句子avg=numpy.mean([s[1] for s in scored_sentences])#均值std=numpy.std([s[1] for s in scored_sentences])#标准差mean_scored=[(sent_idx,score) for (sent_idx,score) in scored_sentences if score>(avg+0.5*std)]#approach 2,返回top n句子top_n_scored=sorted(scored_sentences,key=lambda s:s[1])[-TOP_SENTENCES:]top_n_scored=sorted(top_n_scored,key=lambda s:s[0])return dict(top_n_summary=[sentences[idx] for (idx,score) in top_n_scored],mean_scored_summary=[sentences[idx] for (idx,score) in mean_scored])#句子得分
def _score_sentences(sentences,topn_words):scores=[]sentence_idx=-1for s in [list(jieba.cut(s)) for s in sentences]:sentence_idx+=1word_idx=[]for w in topn_words:try:word_idx.append(s.index(w))#关键词出现在该句子中的索引位置except ValueError:#w不在句子中password_idx.sort()if len(word_idx)==0:continue#对于两个连续的单词,利用单词位置索引,通过距离阀值计算族clusters=[]cluster=[word_idx[0]]i=1while i<len(word_idx):if word_idx[i]-word_idx[i-1]<CLUSTER_THRESHOLD:cluster.append(word_idx[i])else:clusters.append(cluster[:])cluster=[word_idx[i]]i+=1clusters.append(cluster)#对每个族打分,每个族类的最大分数是对句子的打分max_cluster_score=0for c in clusters:significant_words_in_cluster=len(c)total_words_in_cluster=c[-1]-c[0]+1score=1.0*significant_words_in_cluster*significant_words_in_cluster/total_words_in_clusterif score>max_cluster_score:max_cluster_score=scorescores.append((sentence_idx,max_cluster_score))return scores;if __name__=='__main__':dict=summarize(u'腾讯科技讯(刘亚澜)10月22日消息,'u'前优酷土豆技术副总裁黄冬已于日前正式加盟芒果TV,出任CTO一职。'u'资料显示,黄冬历任土豆网技术副总裁、优酷土豆集团产品技术副总裁等职务,'u'曾主持设计、运营过优酷土豆多个大型高容量产品和系统。'u'此番加入芒果TV或与芒果TV计划自主研发智能硬件OS有关。'u'今年3月,芒果TV对外公布其全平台日均独立用户突破3000万,日均VV突破1亿,'u'但挥之不去的是业内对其技术能力能否匹配发展速度的质疑,'u'亟须招揽技术人才提升整体技术能力。'u'芒果TV是国内互联网电视七大牌照方之一,之前采取的是“封闭模式”与硬件厂商预装合作,'u'而现在是“开放下载”+“厂商预装”。'u'黄冬在加盟土豆网之前曾是国内FreeBSD(开源OS)社区发起者之一,'u'是研究并使用开源OS的技术专家,离开优酷土豆集团后其加盟果壳电子,'u'涉足智能硬件行业,将开源OS与硬件结合,创办魔豆智能路由器。'u'未来黄冬可能会整合其在开源OS、智能硬件上的经验,结合芒果的牌照及资源优势,'u'在智能硬件或OS领域发力。'u'公开信息显示,芒果TV在今年6月对外宣布完成A轮5亿人民币融资,估值70亿。'u'据芒果TV控股方芒果传媒的消息人士透露,芒果TV即将启动B轮融资。')print('-----------approach 1-------------')for sent in dict['top_n_summary']:print(sent)print('-----------approach 2-------------')for sent in dict['mean_scored_summary']:print(sent)

下面是测试结果:

转载于:https://www.cnblogs.com/little-horse/p/6701974.html

python实现的一个中文文本摘要程序相关推荐

  1. 如何用Python和BERT做中文文本二元分类?| 程序员硬核评测

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 作者 | 王树义 来源 | 王树芝兰(ID:nkwangshuyi) 兴奋 去年, Google 的 B ...

  2. 中文文本摘要提取 (文本摘要提取 有代码)基于python

    任务简介 文本摘要旨在将文本或文本集合转换为包含关键信息的简短摘要.文本摘要按照输入类型可分为单文档摘要和多文档摘要.单文档摘要从给定的一个文档中生成摘要,多文档摘要从给定的一组主题相关的文档中生成摘 ...

  3. nlp中文文本摘要提取,快速提取文本主要意思

    文本摘要提取 之前写过一版 文本摘要提取,但那版并不完美.有所缺陷(但也获得几十次收藏). 中文文本摘要提取 (文本摘要提取 有代码)基于python 今天写改进版的文本摘要提取. 文本摘要旨在将文本 ...

  4. 独家 | Python利用深度学习进行文本摘要的综合指南(附教程)

    作者:ARAVIND PAI 翻译:和中华 校对:申利彬 本文约7500字,建议阅读15分钟. 本文介绍了如何利用seq2seq来建立一个文本摘要模型,以及其中的注意力机制.并利用Keras搭建编写了 ...

  5. Python 利用深度学习做文本摘要

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 python免费学习资料 ...

  6. 【编译原理】Python实现对一个英文文本的词频统计

    利用Python实现对一个英文文本的词频统计.文本链接:https://www.philippinetimes.com/news/257886068/australia-blocks-chinese- ...

  7. python写采集程序_用python写的一个wordpress的采集程序

    在学习python的过程中,经过不断的尝试及努力,终于完成了第一个像样的python程序,虽然还有很多需要优化的地方,但是目前基本上实现了我所要求的功能,先贴一下程序代码: 具体代码如下: #! /u ...

  8. Python脚本做一个淘宝秒杀程序!

    Python脚本做一个淘宝秒杀程序! 先上代码 from selenium import webdriver import datetime import time import os import ...

  9. 利用最大边缘相关改进一个简单的文本摘要程序

    关于文本摘要的介绍网上有很多资料,大家可以搜一搜.本文主要是针对单文档文本摘要的抽取方法,使用java实现.主要方法是基于两篇文献: 1. (这里引用阮一峰的博客介绍http://www.ruanyi ...

最新文章

  1. pap和chap交叉认证
  2. Jenkins与Docker的持续集成实践
  3. Oracle专家调优秘密
  4. python打开一个文件-python,一读取文件open()
  5. 将用户输入内容中的尖括号、引号等进行转义
  6. Oracle 创建及调用存储过程,脚本示例
  7. 【杂谈】梦想与饼干,AI是你的谁?
  8. Win7下Solr4.10.1和TomCat8的安装
  9. 网络技巧:分享几个路由器设置小技巧,总有用得到的一天!
  10. 《Python Cookbook 3rd》笔记(2.20):字节字符串上的字符串操作
  11. 创建服务器及请求响应等简单的node.js例子
  12. 希尔排序 最坏时间_算法篇----希尔排序
  13. jenkins java jar_Jenkins 安装和配置、启动jar包
  14. C语言——机器平台对强制类型转换的影响
  15. python操作个人简历,python爬虫开发工程师应届生个人简历模板(Word可以直接使用)...
  16. 【饭谈】领导叫你搞个自动化平台,你要怎么入手?不会上来就开始新建项目写代码吧?
  17. 知到网课中国戏曲剧种鉴赏考试试题|真题演练|题库(含答案)
  18. 怎样将系统防御升到服务器级别,H3C IPS入侵防御系统 Web配置手册-5PW104
  19. 几个常见网络故障修复命令
  20. SHELL对接国际验证码接口

热门文章

  1. git config命令详解
  2. 3Dmax插件 | 螺丝钉、挖洞、网格模型等可以分分钟搞定!
  3. 会计实务:用友U8各种采购暂估处理会计分录案例
  4. 抖音怎么涨粉和留住粉丝?几个维度分析抖音运营问题
  5. POI设置excel某列值为文本格式
  6. css 高度塌陷和BFC,解决方法
  7. 华为HCIP交换-RSTP
  8. 苹果官网上关于iOS/iPadOS设备尺寸
  9. 用 java 写一个迷你版的 Tomcat
  10. 物联网卡的作用有什么