1. 文本摘要方法有很多,主要分为抽取式和生成式,应用比较多的是抽取式,也比较简单,就是从文本中抽取重要的句子或段落。本方法主要是利用句子中的关键词的距离,主要思想和参考来自阮一峰的网络日志http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html
    #!/user/bin/python
  2. # coding:utf-8
  3. __author__ = 'yan.shi'
  4. import nltk
  5. import numpy
  6. import jieba
  7. import codecs
  8.  
  9. N=100#单词数量
  10. CLUSTER_THRESHOLD=5#单词间的距离
  11. TOP_SENTENCES=5#返回的top n句子
  12.  
  13. #分句
  14. def sent_tokenizer(texts):
  15. start=0
  16. i=0#每个字符的位置
  17. sentences=[]
  18. punt_list='.!?。!?'.decode('utf8') #',.!?:;~,。!?:;~'.decode('utf8')
  19. for text in texts:
  20. if text in punt_list and token not in punt_list: #检查标点符号下一个字符是否还是标点
  21. sentences.append(texts[start:i+1])#当前标点符号位置
  22. start=i+1#start标记到下一句的开头
  23. i+=1
  24. else:
  25. i+=1#若不是标点符号,则字符位置继续前移
  26. token=list(texts[start:i+2]).pop()#取下一个字符
  27. if start<len(texts):
  28. sentences.append(texts[start:])#这是为了处理文本末尾没有标点符号的情况
  29. return sentences
  30.  
  31. #停用词
  32. def load_stopwordslist(path):
  33. print('load stopwords...')
  34. stoplist=[line.strip() for line in codecs.open(path,'r',encoding='utf8').readlines()]
  35. stopwrods={}.fromkeys(stoplist)
  36. return stopwrods
  37.  
  38. #摘要
  39. def summarize(text):
  40. stopwords=load_stopwordslist('E:\stopwords.txt')
  41. sentences=sent_tokenizer(text)
  42. words=[w for sentence in sentences for w in jieba.cut(sentence) if w not in stopwords if len(w)>1 and w!='\t']
  43. wordfre=nltk.FreqDist(words)
  44. topn_words=[w[0] for w in sorted(wordfre.items(),key=lambda d:d[1],reverse=True)][:N]
  45. scored_sentences=_score_sentences(sentences,topn_words)
  46. #approach 1,利用均值和标准差过滤非重要句子
  47. avg=numpy.mean([s[1] for s in scored_sentences])#均值
  48. std=numpy.std([s[1] for s in scored_sentences])#标准差
  49. mean_scored=[(sent_idx,score) for (sent_idx,score) in scored_sentences if score>(avg+0.5*std)]
  50. #approach 2,返回top n句子
  51. top_n_scored=sorted(scored_sentences,key=lambda s:s[1])[-TOP_SENTENCES:]
  52. top_n_scored=sorted(top_n_scored,key=lambda s:s[0])
  53. 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])
  54.  
  55. #句子得分
  56. def _score_sentences(sentences,topn_words):
  57. scores=[]
  58. sentence_idx=-1
  59. for s in [list(jieba.cut(s)) for s in sentences]:
  60. sentence_idx+=1
  61. word_idx=[]
  62. for w in topn_words:
  63. try:
  64. word_idx.append(s.index(w))#关键词出现在该句子中的索引位置
  65. except ValueError:#w不在句子中
  66. pass
  67. word_idx.sort()
  68. if len(word_idx)==0:
  69. continue
  70. #对于两个连续的单词,利用单词位置索引,通过距离阀值计算族
  71. clusters=[]
  72. cluster=[word_idx[0]]
  73. i=1
  74. while i<len(word_idx):
  75. if word_idx[i]-word_idx[i-1]<CLUSTER_THRESHOLD:
  76. cluster.append(word_idx[i])
  77. else:
  78. clusters.append(cluster[:])
  79. cluster=[word_idx[i]]
  80. i+=1
  81. clusters.append(cluster)
  82. #对每个族打分,每个族类的最大分数是对句子的打分
  83. max_cluster_score=0
  84. for c in clusters:
  85. significant_words_in_cluster=len(c)
  86. total_words_in_cluster=c[-1]-c[0]+1
  87. score=1.0*significant_words_in_cluster*significant_words_in_cluster/total_words_in_cluster
  88. if score>max_cluster_score:
  89. max_cluster_score=score
  90. scores.append((sentence_idx,max_cluster_score))
  91. return scores;
  92.  
  93. if __name__=='__main__':
  94. dict=summarize(u'腾讯科技讯(刘亚澜)10月22日消息,'
  95. u'前优酷土豆技术副总裁黄冬已于日前正式加盟芒果TV,出任CTO一职。'
  96. u'资料显示,黄冬历任土豆网技术副总裁、优酷土豆集团产品技术副总裁等职务,'
  97. u'曾主持设计、运营过优酷土豆多个大型高容量产品和系统。'
  98. u'此番加入芒果TV或与芒果TV计划自主研发智能硬件OS有关。'
  99. u'今年3月,芒果TV对外公布其全平台日均独立用户突破3000万,日均VV突破1亿,'
  100. u'但挥之不去的是业内对其技术能力能否匹配发展速度的质疑,'
  101. u'亟须招揽技术人才提升整体技术能力。'
  102. u'芒果TV是国内互联网电视七大牌照方之一,之前采取的是“封闭模式”与硬件厂商预装合作,'
  103. u'而现在是“开放下载”+“厂商预装”。'
  104. u'黄冬在加盟土豆网之前曾是国内FreeBSD(开源OS)社区发起者之一,'
  105. u'是研究并使用开源OS的技术专家,离开优酷土豆集团后其加盟果壳电子,'
  106. u'涉足智能硬件行业,将开源OS与硬件结合,创办魔豆智能路由器。'
  107. u'未来黄冬可能会整合其在开源OS、智能硬件上的经验,结合芒果的牌照及资源优势,'
  108. u'在智能硬件或OS领域发力。'
  109. u'公开信息显示,芒果TV在今年6月对外宣布完成A轮5亿人民币融资,估值70亿。'
  110. u'据芒果TV控股方芒果传媒的消息人士透露,芒果TV即将启动B轮融资。')
  111. print('-----------approach 1-------------')
  112. for sent in dict['top_n_summary']:
  113. print(sent)
  114. print('-----------approach 2-------------')
  115. for sent in dict['mean_scored_summary']:
  116. print(sent)

下面是测试结果:

python实现的一个中文文本摘要程序的更多相关文章

  1. 用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  2. 如何用java完成一个中文词频统计程序

    要想完成一个中文词频统计功能,首先必须使用一个中文分词器,这里使用的是中科院的.下载地址是http://ictclas.nlpir.org/downloads,由于本人电脑系统是win32位的,因此下 ...

  3. python 模拟实现一个ATM + 购物商城程序

    思路:ATM是一个单独程序,提供给消费的是一个接口core下的settlement.py,只做了个人的,没写管理的模块 Shopping也是一个单独的,只做了一个购物的消费模块,没写商家模块,偷懒用了 ...

  4. Python中判断一个中文是否中文数字的方法

    Python内置功能非常强大,在字符串内置函数中提供了一个判断字符串是否全数字的方法,而且这个方法不只是简单判断阿拉伯数字,包括中文数字和全角的阿拉伯数字都认识,这个函数就是字符串的isnumeric ...

  5. 初学python类编的一个求矩形小程序

    简单的程序不简单,里面包含类定义类,传参,初始化,方法调用,创建实例,格式输出.主要在python中随时定义变量随时用,我这道题题想好久就是我初识类,传参,不是所有参数都的加单引号.简单的东西,复杂话 ...

  6. 基于Text-CNN模型的中文文本分类实战 流川枫 发表于AI星球订阅

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  7. 基于Text-CNN模型的中文文本分类实战

    Text-CNN 1.文本分类 转眼学生生涯就结束了,在家待就业期间正好有一段空闲期,可以对曾经感兴趣的一些知识点进行总结. 本文介绍NLP中文本分类任务中核心流程进行了系统的介绍,文末给出一个基于T ...

  8. 推荐 | 中文文本标注工具Chinese-Annotator(转载)

    自然语言处理的大部分任务是监督学习问题.序列标注问题如中文分词.命名实体识别,分类问题如关系识别.情感分析.意图分析等,均需要标注数据进行模型训练.深度学习大行其道的今天,基于深度学习的 NLP 模型 ...

  9. SnowNLP:一个处理中文文本的 Python 类库[转]

    SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和Te ...

随机推荐

  1. Hadoop三种架构介绍及搭建

    apache  hadoop三种架构介绍(standAlone,伪分布,分布式环境介绍以及安装) hadoop 文档 http://hadoop.apache.org/docs/ 1.StandAlo ...

  2. Oracle RAC安装文档

    http://www.itpub.net/thread-1895813-2-1.html chkconfig iptables offservice iptables stop 1.修改主机名rac1 ...

  3. c++学习笔记之类和对象(一、类定义)

    类和对象是 C++ 的重要特性,它们使得 C++ 成为面向对象的编程语言. 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化.每个对象都是类的一个 ...

  4. excel库中数据下载

    PHP实现EXCEL下载数据 <?php include("Classes/PHPExcel.php"); $exce=new PHPExcel(); $exce->s ...

  5. windows10升级更新1709版本 在桌面和文件夹中点击右键刷新,会引起卡顿反应慢

    win10,升级更新,1709,右键,卡机,刷新,反应慢,桌面,文件夹 windows自动升级到1709版本后出现的问题,而之前是没有这种问题的. 最终解决办法:(需要设置注册表) 运行:快捷键Win ...

  6. 刚接触SkyLine的一点小收获与感触

    因为刚接触Skyline不到一个星期,也怕把学习到的忘记掉,所以写一点学习到的一些皮毛的东西,赶紧记录一下,怕回头忘记 1.网上关于web端的开发非常多,也有很多牛人分享自己的经验,所以学习起来也相对 ...

  7. axios设置了responseType: 'json‘’,ie问题

    在ie会有问题 如果返回的数据会变成字符串 在拦截器中用json.parse转 // 在axios的响应头中设置~~~ axios.interceptors.response.use( respons ...

  8. this —— javascript

    目录 为什么要讨论this this是什么 如何改变this的指向 箭头函数中的this 为什么要讨论this 代码一: function fun1(){ var aa = 'I am aa'; co ...

  9. 多Y轴示例

    //多Y轴示例 <template> <div id="main" :style="{width:'1000px',height:'500px' }&q ...

  10. LeetCode——回文链表

    题目 给定一个链表的头节点head,请判断该链表是否为回 文结构. 例如: 1->2->1,返回true. 1->2->2->1,返回true. 15->6-> ...