首页 > 代码库 > python实现的一个文本摘要程序

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)

下面是测试结果:

技术分享

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