您当时的方位:主页 > IT编程 > python
| C言语 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle |

根据python言语,主动生成文章摘要(中文)

51自学网 2019-05-12 14:12:48
  python

# -*- coding: utf-8 -*-
import jieba,copy,re,codecs
from collections import Counter


title = '2018年最佳新小工具'
# coding = gbk
text = '''推动技术从精巧的手表到书架式扬声器,快速开展的技术不断推出新的用处和先进的小工具,并不断推向市场。这便是咱们今日国际的实际,你能够花一整天的时刻经过出售科技产品的商铺,这能够把你的家变成一个智能的房子。以下是最新的小工具,它们将让您走在科技前沿,让您的日子更夸姣:FITBIT ALTA HR Fitbit Alta HR是一款牢靠的健身追寻器,配有满足的电池汁,可让您长达一周。它监控您的步数,睡觉时刻,焚烧的卡路里数和心率。腕带选用OLED显示屏,可与核算机无线同步。 NINTENDO NES CLASSIC EDITION这款Nintendo迷你游戏机经过为现代科技增加经典品尝,带您回到曩昔。它包括30个经典的8位游戏,支撑双人游戏,并答应怀旧游戏玩家经过HDMI衔接到任何电视。 SHINOLA书架音箱新Shinola书架音箱是Shinola与作业室监听专家Barefoot Sound协作的效果。自供电双向扬声器不只能够带来声响,还能够为客厅增加颜色,这要归功于它们整齐的手艺橡木橱柜。它们装备了蓝牙,AUX和USB输入,为您供给一系列选项。 DELL XPS 13(2018)时髦。令人形象深入。强壮。耐久。这款13英寸笔记本电脑具有满足的冲击力,能够方便地处理任何您扔的东西。 XPS 13的机身比简直一切类型的笔记本电脑都小,简直没有边框屏幕。 SAMSUNG GALAXY S9 +假如你需求的设备供给超呈现有规范的东西并界说了高质量,那么你不应该看过三星Galaxy S9 +。它可能与S8 +有所不同,但这款智能手机自身便是一流的领导者。作为三星最新推出的产品,S9 +装备6.22英寸无限显示屏,装备革命性的2倍变焦背式摄像头,可捕捉传神的图画。其3500mAh电池可在Wi-Fi和4G衔接上为您供给长达15小时的互联网使用时刻。 APPLE TV 4K苹果电视4K能够说是现在市场上最好的流媒体。该小工具可让您以4K HDR方法观看喜爱的节目,并供给长途和Siri语音选项,以取得优质体会。 SONOS PLAY:5无线多房间扬声器不会比Play:5更大。 Sonos的新产品不只能够为您的房间充溢丰厚的声响,还能够为您供给全球80多种流媒体服务。您能够将小工具衔接到Amazon Echo或Dot。有一个3.5毫米音频插座,旨在让您衔接非流音频设备。'''

# 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)
        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)
        #**** 核算词频TF *****
        c = Counter(words) # 词典
        #**** 去除停用词(为了进步功率,该过程放到核算词频之后)
        self.delStopwords(c)
        #**** 标题中提取特征 *********
        words_title = [word for word in jieba.cut(title,cut_all=True)]
        self.delStopwords(words_title)
        #**** 获取topN ************
        topN = c.most_common(n)
        # 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))
        return words_topN

    #**** 去除停用词 *******************************
    def delStopwords(self,dict):
        sw_file = codecs.open('stopwords.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:# 进步首句权重
                sents_score[sent] = 2 * score
        #**** 排序 **********************
        dict_list = sorted(sents_score.items(),key=lambda x:x[1],reverse=True)
        # print(dict_list)
        #**** 回来topN ******************
        sents_topN = []
        for i in dict_list[:n]:
            sents_topN.append(i[0])
            # print i[0],i[1]
        sents_topN = list(set(sents_topN))
        #**** 按份额提取 **************************
        if len_sentences <= 5:
            sents_topN = sents_topN[:1]
        elif len_sentences < 9:
            sents_topN = sents_topN[:2]

        return sents_topN

    #**** 康复topN语句在文中的相对次序 *********
    def sents_sort(self,sents_topN,sentences):
        keysents = []
        for sent in sentences:
            if sent in sents_topN and sent not in keysents:
                keysents.append(sent)
        keysents = self.post_processing(keysents)

        return keysents

    def post_processing(self,keysents):
        #**** 删去不完整语句中的具体部分 ********************
        detail_tags = [',一是',':一是',',榜首,',':榜首,',',首要,',';首要,']
        for i in keysents:
            for tag in detail_tags:
                index = i.find(tag)
                if index != -1:
                    keysents[keysents.index(i)] = i[:index]
        #**** 删去编号 ****************************
        for i in keysents:
            # print(i)
            regex = re.compile(r'^一、|^二、|^三、|^三、|^四、|^五、|^六、|^七、|^八、|^九、|^十、|^\d{1,2}、|^\d{1,2} ')
            result = re.findall(regex,i)
            if result:
                keysents[keysents.index(i)] = re.sub(regex,'',i)
        #**** 删去补白性质的语句 ********************
        for i in keysents:
            regex = re.compile(r'^注\d*:')
            result = re.findall(regex,i)
            if result:
                keysents.remove(i)
        #**** 删去句首括号中的内容 ********************
        for i in keysents:
            regex = re.compile(r'^

.∗.∗
')
            result = re.findall(regex,i)
            if result:
                keysents[keysents.index(i)] = re.sub(regex,'',i)
        #**** 删去来历(空格前的部分) ********************
        for i in keysents:
            regex = re.compile(r'^.{1,20} ')
            result = re.findall(regex,i)
            if result:
                keysents[keysents.index(i)] = re.sub(regex,'',i)
        #**** 删去引号部分(如:银行间债市小幅跌落,见下图:) ********************
        for i in keysents:
            regex = re.compile(r',[^,]+:$')
            result = re.findall(regex,i)
            if result:
                keysents[keysents.index(i)] = re.sub(regex,'',i)

        return keysents

    def main(self,title,text):
        sentences = self.cutSentence(text)
        keywords = self.getKeywords(title, sentences, n=8)
        sents_topN = self.getTopNSentences(sentences, keywords, n=3)
        keysents = self.sents_sort(sents_topN, sentences)
        print(keysents)
        return keysents


if __name__=='__main__':
    summary=Summary()
    summary.main(title,text)

51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C言语、自学css3实例,是一个经过网络自主学习作业技术的自学渠道,网友喜爱的软件自学网站。
京ICP备13026421号-1