python jieba提取文章文本摘要代码
代码语言:python
所属分类:其他
代码描述:python jieba提取文章文本摘要代码,自定义summary提取类。
代码标签: python jieba 提取 文章 文本 摘要 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
#!/usr/local/python3/bin/python3 # -*- coding: utf-8 -* import jieba,copy,re,codecs from collections import Counter title='训练中不断嘱咐队员们要注意动作' #title = '国奥队的训练 ' #最后生成的东西和这个题目有关 # coding = gbk text = '来到沈阳,国奥队依然没有摆脱雨水的困扰。7月31日下午6点,国奥队的日常训练再度受到大雨的干扰,无奈之下队员们只慢跑了25分钟就草草收场。31日上午10点,国奥队在奥体中心外场训练的时候,天就是阴沉沉的,气象预报显示当天下午沈阳就有大雨,但幸好队伍上午的训练并没有受到任何干扰。下午6点,当球队抵达训练场时,大雨已经下了几个小时,而且丝毫没有停下来的意思。抱着试一试的态度,球队开始了当天下午的例行训练,25分钟过去了,天气没有任何转好的迹象,为了保护球员们,国奥队决定中止当天的训练,全队立即返回酒店。在雨中训练对足球队来说并不是什么稀罕事,但在奥运会即将开始之前,全队变得“娇贵”了。在沈阳最后一周的训练,国奥队首先要保证现有的球员不再出现意外的伤病情况以免影响正式比赛,因此这一阶段控制训练受伤、控制感冒等疾病的出现被队伍放在了相当重要的位置。而抵达沈阳之后,中后卫冯萧霆就一直没有训练,冯萧霆是7月27日在长春患上了感冒,因此也没有参加29日跟塞尔维亚的热身赛。队伍介绍说,冯萧霆并没有出现发烧症状,但为了安全起见,这两天还是让他静养休息,等感冒彻底好了之后再恢复训练。由于有了冯萧霆这个例子,因此国奥队对雨中训练就显得特别谨慎,主要是担心球员们受凉而引发感冒,造成非战斗减员。而女足队员马晓旭在热身赛中受伤导致无缘奥运的前科,也让在沈阳的国奥队现在格外警惕,“训练中不断嘱咐队员们要注意动作,我们可不能再出这样的事情了。”一位工作人员表示。从长春到沈阳,雨水一路伴随着国奥队' # file_object = open('comment.txt',encoding='utf8') # try: # text= file_object.read() # finally: # file_object.close() # summary = pyhanlp.HanLP.extractSummary(text, 3) # print(summary) class Summary(): #**** 切分句子 ************ def cutSentence(self,text): sents = [] text = re.sub(r'\n+','。',text) # 换行改成句号(标题段无句号的情况) text = text.replace('。。','。') # 删除多余的句号 text = text.replace('?。','。') # text = text.replace('!。','。') # 删除多余的句号 sentences = re.split(r'。|!|?|】|;',text) # 分句 (碰到句号或感叹号或问号或】或分号就切分开) # print(sentences) sentences = sentences[:-1] # 删除最后一个句号后面的空句 for sent in sentences: len_sent = len(sent) if len_sent < 4: # 删除换行符、一个字符等 continue # sent = sent.decode('utf8') sent = sent.strip(' ') sent = sent.lstrip('【') sents.append(sent) # print(sent) # sent就是用句号,感叹号等等分开后的句子 return sents #**** 提取特征词 ********************** def getKeywords(self,title,sentences,n=10): words = [] #**** 分词,获取词汇列表 ***** # split_result = pseg.cut(text) for sentence in sentences: split_result = jieba.cut(sentence) for i in split_result: words.append(i) #print(i) #这个i就是每个句子切分出来的一个个词 #**** 统计词频TF ***** c = Counter(words) # 词典 # print(c) #这个c得结果就包含了每个上面每个词出现的次数 即词频 #**** 去除停用词(为了提高效率,该步骤放到统计词频之后) self.delStopwords(c) # 这个delstopwords是自己定义的去除停用词的方法,传入的参数是一个记载词频的词典 #**** 标题中提取特征 ********* words_title = [word for word in jieba.cut(title,cut_all=True)] # print(words_title) # 是把题目title 切分之后的结果 self.delStopwords(words_title) #**** 获取topN ************ topN = c.most_common(n) # topN 就是上面那个记录了词频的词典 c # for i in topN: # print(i[0],i[1]) words_topN = [i[0] for i in topN if i[1]>1] #在topN中排除出现次数少于2次的词 words_topN = list(set(words_topN)|set(words_title)) # 正文关键词与标题关键词取并集 #这个有些情况下可以不要, 具体检测标准是? 题目有时候可能不能很好地反映信息,这个题目与词频取并集有时候并不能达到很好的效果 # print (' '.join(words_topN)) print(' '.join(words_topN)) return words_topN #**** 去除停用词 ******************************* def delStopwords(self,dict): sw_file = codecs.open('/data/wwwroot/default/asset/chineseStopWords.txt',encoding='utf8') stop_words = [] for line in sw_file.readlines(): stop_words.append(line.strip()) #***** 输入参数为list ************* # if type(dict) is types.ListType: if type(dict) is list: words = dict for word in words: if word in stop_words: words.remove(word)# 去除停用词 #***** 输入参数type为 <class 'collections.Counter'> ***** else: words = copy.deepcopy(list(dict.keys())) for word in words: if word in stop_words: del dict[word] return words #**** 提取topN句子 ********************** def getTopNSentences(self,sentences,keywords,n=3): sents_score = {} len_sentences = len(sentences) #**** 初始化句子重要性得分,并计算句子平均长度 len_avg = 0 len_min = len(sentences[0]) len_max = len(sentences[0]) for sent in sentences: sents_score[sent] = 0 l = len(sent) len_avg += l if len_min > l: len_min = l if len_max < l: len_max = l len_avg = len_avg / len_sentences # print(len_min,len_avg,len_max) #**** 计算句子权重得分 ********** for sent in sentences: #**** 不考虑句长在指定范围外的句子 ****** l = len(sent) if l < (len_min + len_avg) / 2 or l > (3 * len_max - 2 * len_avg) / 4: continue words = [] sent_words = jieba.cut(sent) # <generator object cut at 0x11B38120> for i in sent_words: words.append(i) keywords_cnt = 0 len_sent = len(words) if len_sent == 0: continue for word in words: if word in keywords: keywords_cnt += 1 score = keywords_cnt * keywords_cnt * 1.0 / len_sent sents_score[sent] = score if sentences.index(sent) == 0:# 提高首句权重 sent.........完整代码请登录后点击上方下载按钮下载查看
网友评论0