python实现的一个文本摘要程序

文本摘要方法有很多,主要分为抽取式和生成式,应用比较多的是抽取式,也比较简单,就是从文本中抽取重要的句子或段落。本方法主要是利用句子中的关键词的距离,主要思想和参考来自阮一峰的网络日志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 codecs

N=100#单词数量
CLUSTER_THRESHOLD=5#单词间的距离
TOP_SENTENCES=5#返回的top n句子

#分句
def sent_tokenizer(texts):
    start=0
    i=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+=1
        else:
            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=-1
    for s in [list(jieba.cut(s)) for s in sentences]:
        sentence_idx+=1
        word_idx=[]
        for w in topn_words:
            try:
                word_idx.append(s.index(w))#关键词出现在该句子中的索引位置
            except ValueError:#w不在句子中
                pass
        word_idx.sort()
        if len(word_idx)==0:
            continue
        #对于两个连续的单词,利用单词位置索引,通过距离阀值计算族
        clusters=[]
        cluster=[word_idx[0]]
        i=1
        while 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+=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,score))
    return scores;

if __name__==‘__main__‘:
    #dict=summarize(u‘由佟大为、陈妍希领衔主演的双十一档重磅减压喜剧电影《外公芳龄38》即将于明天(11月11日)全国公映。今日,电影发布由佟大为温情献唱的暖心曲《Linda》MV。此次发布的暖心曲一改之前轻松欢快的喜剧风格,歌词温情,就像对&ldquo;女儿&rdquo;陈妍希的轻声告白,而这首被佟大为称作&ldquo;走心&rdquo;的情歌经其现场清唱后圈粉无数,佟大为戏里歌手身份夭折,戏外却意外因&ldquo;歌手&rdquo;身份走红。喜剧也温情!佟大为隐忍父爱暖心告白电影《外公芳龄38》中,明星主播佟大为被突然而至的女儿唐宛如和外孙唐家栋打乱了原本&ldquo;逍遥快活&rdquo;的黄金单身汉生活,此次发布的《Linda》MV中,佟大为和&ldquo;女儿&rdquo;同居惨遭偷拍曝出绯闻,事业二次受挫,佟大为因此迁怒女儿和外孙,加上外来误会导致矛盾重重,父女关系陷入僵局。颠覆往日里曝出的轻松搞笑剧情,父女感情走向变得扑簌迷离。与先前曝光的陈妍希&ldquo;双十一&rdquo;主题曲《买买买》欢快明朗的曲调不同,此次发布的《Linda》旋律温情中带点小伤感,将更多的笔墨着眼于这对陌路二十余年、一朝相认的&ldquo;另类父女&rdquo;之间的感情,通过环环紧扣的矛盾冲突,展现了父女之间感情所面临的&ldquo;内忧外患&rdquo;。末了,佟大为淡淡的一句&ldquo;没说的,你都懂吗?&rdquo;将不善表达的父爱诠释得淋漓尽致。陈妍希曾在采访中表示&ldquo;特别喜欢片中&lsquo;矛盾&rsquo;的那一段,演到入戏的时候自己都会哭。真正好的喜剧应该是走心的,应该让观众在笑声中感受到最真挚的感情。‘)
    #dict=summarize(u‘【环球网军事11月10日报道】据美国 《海军时报》网站11月8日报道称。美国海军陆战队一架F-35 B联合攻击战斗机的武器舱在最近的一次训练中着火,这是该机型首次出现重大事故。美国海军陆战队第二飞行联队的发言人约翰&middot;罗伯茨中尉称,飞行员没有受伤,并将飞机安全降落在海军陆战队位于南加利福尼亚博福特的航空基地。这一事故发生在10月27日,罗伯茨8日说,这架F-35B属于海军陆战队501攻击训练中队。他说,正在对事故进行调查,现在还不能确定是什么原因造成起火。海军陆战队发言人萨拉&middot;伯恩斯上校说,这是F-35B的首个A类事故。这类事故意味着会造成人员伤亡,或者损失高达200万美元以上。10月27日的着火不会影响海军陆战队建立F-35中队的时间表,伯恩斯8日说。这是F-35项目自9月以来的第二个重大事故。9月份时,美国空军一架F-35A战斗机在爱达荷州芒廷霍姆空军基地训练时着火。另据英国 《简氏防务周刊》网站11月8日报道称,五角大楼F-35项目联合计划办公室8日证实,该战机项目需要追加5.3亿美元才能完成研发。联合计划办公室发言人乔&middot;德拉&middot;维多瓦对记者说:&ldquo;据联合计划办公室估计,需追加5.3亿美元才能完成F-35系统设计和研发项目。&rdquo;德拉&middot;维多瓦说,需要追加资金出于以下几个原因。首先,美国国防部曾对F-35系统设计和研发项目削减了1亿美元资金。其次,联合计划办公室过去几年针对多项新需求拨款1.65亿美元,当前需要支付这笔款项。最后,为弥补&ldquo;项目意外拖延&rdquo;造成的损失还需2.65亿美元资金。您看完这条新闻的表情是?‘)
    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)

下面是测试结果:

时间: 2024-10-21 02:00:36

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

第十四篇:一个文本查询程序的实现

前言 本文将讲解一个经典的文本查询程序,对前面所学的容器相关知识进行一个从理论到实际的升华,同时也对即将学习的面向对象知识来一次初体验. 程序描述 要求实现这样一个程序:读取用户指定的文件,然后允许用户从中查找某个单词所在的位置. 一个面向过程的落后的设计思想 将待检索文件以行为单位存放到Vector容器中,然后遍历容器,将容器内元素依次转存到字符串流对象中,然后在内层遍历这个字符串流对象,检索是否存在与给定单词匹配的单词.如果有则输出该行内容以及该行序号. 落后的原因及先进的设计思想 这是我以

给女朋友用Python写了一个自动抽奖程序!Python在手,奖品我有!

我相信大部分的女孩子都是喜欢买买买的,我还没有见过不喜欢买东西的女孩子,当然很多东西也是有抽奖这项优惠的,很多小程序都有抽奖这个功能的,好了废话不多说了,为了给女朋友写这款抽奖程序,可谓是呕心沥血!不过看到她开心就比什么都重要了,我虽然没钱,但是我会尽我最大的努力给她我能给的!哈哈哈 ,一般程序员都是单身狗,不好意思,给你们吃了一波狗粮! 我前几天发现了之后就把那里的所有奖品都点了一次,就突发萌想,能不能用 python 来实现自动抽奖啊?这样就不用我每天都点进去看了,我只需要关心是否中奖就可以

C++自学笔记_文本查询程序_《C++ Primer》

<C++ Primer> 第10章结束,用一个文本查询程序结束本章 :) 程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词.查询的结果是该单词出现的次数,并列出每次出现所在的行.如果某单词在同一行 中多次出现,程序将只显示该行一次.行号按照升序显示. 程序支持以下任务: · 它必须允许用户指明要处理的文件的名字.程序将存储该文件的内容,以便输出每个单词所在的原始行. · 它必须将每一行分解为各个单词,并记录每个单词所在的行.在输出行号时,应保证以升序输出,并且不重复. · 对特

【物联网(IoT)开发】使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

上篇"[物联网(IoT)开发]Arduino 入门 Hello World(LED闪烁)"只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断开网络提供电源依然还可以工作.本文将介绍如何开发一个应用程序,以便使用适用于物联网 (Internet of Things, IoT) 的技术.我们的应用程序通过串口收集数据,将其存储在一个 Web 服务器上,然后在网页上实时显式结果,并可以在网页上控制LED的开关. 构建一个类似的应用程序的前提条件 对于第

Python学习——第一个Python程序

(我只是个搬砖的:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431611988455689d4c116b2c4ed6aec000776c00ed52000) 现在,了解了如何启动和退出Python的交互式环境,我们就可以正式开始编写Python代码了. 在写代码之前,请千万不要用“复制”-“粘贴”把代码从页面粘贴到你自己的电脑上.写程序也讲究一个感觉,你需要一个字母一

快速配置Python编译环境与第一个py文件程序

1. Python基本语法在此不熬述. 2. 到管网下载Python 3.6.x 版本,与本机匹配的版本,如本机是 win7 64 python-3.6.5-amd64 3. 下载IDE:PythonCharm 如果只是个人开发,为避免不必要的麻烦,下载社区版. 4. 先安装Python 配置windows环境路径Path: 在 Windows 设置环境变量path 这个字符串的最后加上;D:\Python\Python36 即python的安装目录, 以上是我的安装目录 或在命令提示框中(cm

使用python做一个爬虫GUI程序

整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序 效果如下: 整体代码如下: 1 # -*- coding:utf-8 -*- 2 3 import requests 4 from requests.exceptions import RequestException 5 import tkinter as tk 6 from tkinter import ttk 7 from bs4 import BeautifulSoup 8 impor

TensorFlow文本摘要生成 - 基于注意力的序列到序列模型

1 相关背景 维基百科对自动摘要生成的定义是, "使用计算机程序对一段文本进行处理, 生成一段长度被压缩的摘要, 并且这个摘要能保留原始文本的大部分重要信息". 摘要生成算法主要分为抽取型(Extraction-based)和概括型(Abstraction-based)两类. 传统的摘要生成系统大部分都是抽取型的, 这类方法从给定的文章中, 抽取关键的句子或者短语, 并重新拼接成一小段摘要, 而不对原本的内容做创造性的修改. 这类抽取型算法工程上已经有很多开源的解决办法了, 例如Git

【知乎】怎么成为一个优秀的程序员,而不是一个优秀的码农?

怎么成为一个优秀的程序员,而不是一个优秀的码农? 9 条评论 分享 默认排序按时间排序 98 个回答 3844赞同反对,不会显示你的姓名 萧井陌 微信公众号:炼瓜研究所 技术社区 - 3844 人赞同 优秀的程序员会告诉你打根基的重要性,会劝你在厚积薄发前要隐忍. 优秀的码农会告诉你学啥底层.啥啥啥一拖就好了,学了python还要啥自行车啊,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?成为高手有很多种方法汇编是个屁啊? +++基础的分割线+++ 列举几个我认为比较重