NLP:基于nltk和jieba库对文本实现提取文本摘要(两种方法实现:top_n_summary和mean_scored_summary)
目录
1、测试文本
- 今天一大早,两位男子在故宫抽烟对镜头炫耀的视频在网络上传播,引发网友愤怒。有人感到后怕,600年的故宫真要这两个人给点了,万死莫赎。也有评论称,把无知当成炫耀的资本,丢人!
- 视频中两位男子坐在故宫公共休息区的遮阳伞下,面对镜头问出:“谁敢在故宫抽烟?”语气极其嚣张,表情带有挑衅意味。话音刚落,另外一位男子面向镜头吸了一口烟。而视频中两人也表示知道有故宫禁止吸烟的规定。
- 事实上,2013年5月18日是国际博物馆日,故宫从这一天开始至今一直实行全面禁烟。根据规定,故宫博物院全体员工在院合作单位和个人不管在室内和室外,也不分开放区与工作区,一律禁止吸烟,对违反禁止吸烟规定的人员将进行严格处罚并通报全院。
- 此外,在2015年6月1日起北京全市也开始了《控制吸烟条例》,规定公共场所工作场所室内环境室外排队等场合禁止吸烟,违者将最高被罚200元,全市统一设立举报电话12320。
- 视频在网络上传播开来,不少网友担心故宫的安危,称一旦发生火情,后果不堪设想,有网友表示,这样的行为应该被旅游景区拉近黑名单,建议终身禁止进入任何景区和各种场馆。
后期更新……
- def sent_tokenizer(texts):
- start=0
- i=0每个字符的位置
- sentences=[]
- punt_list='.!?。!?'.encode('utf-8') ',.!?:;~,。!?:;~'.decode('utf8')
- punt_lists='.!?。!?'.decode()
- for text in texts:
- if text in punt_list and token not in punt_list: 检查标点符号下一个字符是否还是标点
- sentences.append(texts[start:i+1])当前标点符号位置
- start=i+1start标记到下一句的开头
- 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('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,max_cluster_score))
- return scores;
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!