视频会议摘要提取系统

目录

一.视频文本提取

1.视频转音频        

2.音频转文本:

二.摘要提取

1.txetrank--抽取式摘要

3.聚类法--抽取式摘要

4.seq2seq法--生成式摘要

三.总结


前言

        笔者结合所学的文本分类和摘要提取知识,构建了一个可提取视频摘要信息的系统,可供参考学习。


一.视频文本提取

1.视频转音频        

视频转音频使用movie库(pip install movie),三行代码实现视频转换音频:

from moviepy.editor import AudioFileClip
my_audio_clip = AudioFileClip("E:\\电影\\视频素材\\航天器对接.mp4")
my_audio_clip.write_audiofile("E:\\电影\\视频素材\\航天器对接音频.wav")

2.音频转文本:

        使用speecrecognition库和pocketsphinx库进行识别。

        两者通过pip安装即可,但是注意若直接pip安装pocketsphinx失败,则先进行 conda install swig 安装其依赖,之后再pip安装pocketsphinx即可。 这是因为pocketsphinx是基于c++实现,而swig是一个可以把c/c++代码封装为python库的工具。

        同时注意,pocketsphinx默认只提供英文识别,中文识别需要去官方下载普通话升级包,并安装到英文包相同路径(D:\anaconda3\Lib\site-packages\speech_recognition\pocketsphinx-data)下

官网:CMU Sphinx - Browse /Acoustic and Language Models at SourceForge.net

        普通话升级包安装: ①目前最新版的Mandarin中只存在cmusphinx-zh-cn-5.2.tar.gz这个双重压缩文件,挂梯子下载后双重解压。 ②需要注意:把解压出来的zh_cn.cd_cont_5000文件夹重命名为acoustic-model、zh_cn.lm.bin命名为language-model.lm.bin、zh_cn.dic改为pronounciation-dictionary.dict。 ③在en-US,即默认英文包的同级目录创建"zh-CN"用于存放 ④把第②步中的四个文件放入zh-CN中即可。

import speech_recognition as sr
audio_file='E:\\电影\\视频素材\\航天器对接音频.wav'
r=sr.Recognizer()

with sr.AudioFile(audio_file)as source:
    audio=r.record(source)

try:
    print("识别的文本:",r.recognize_sphinx(audio,language='zh-CN'))
except Exception as e:
    print(e)

二.摘要提取

1.txetrank--抽取式摘要

        

from snownlp import SnowNLP

text='''就废弃茶叶被转手事件发声明本报讯(记者刘俊) “我们也是受害者!”昨日,有媒体报道称康师傅的废弃茶叶被
    转手卖给不良商家、冒充名茶流入市场,康师傅的一位联系人这样说。康师傅昨日晚间发出声明表示生产废料处理商
    作出了 “不良行为”,公司方面除表达严正关注的立场外,也已经配合政府有关单位进行调查。中止与生产废料厂
    商的合同康师傅在给本报的声明中确认,经查,与康师傅签订生产废料处理合同之厂商为吉安三石饲料商行,且系通
    过公开招标程序取得合同承揽资格,并签有保证透过合法渠道处理康师傅生产废料的承诺。昨日媒体报道的内容显示
    吉安三石饲料商行可能违反与康师傅签订之合同,即日起,康师傅已中止履行与吉安三石饲料商行的有关合同,并静待
    相关单位调查结果后从严追究责任。昨日,康师傅一位熟悉情况的人士告诉记者,这家商家是从去年三季度后开始
    给康师傅处理生产废料的,有关合同将在今年年底届满,这位联系人指康师傅和该商行之间没有参股或任何资本关系。'''
text2="""记者傅亚雨沈阳报道 来到沈阳,国奥队依然没有摆脱雨水的困扰。7月31日下午6点,国奥队的日常训练再度受到大雨的干扰,无奈之下队员们只慢跑了25分钟就草草收场。
  31日上午10点,国奥队在奥体中心外场训练的时候,天就是阴沉沉的,气象预报显示当天下午沈阳就有大雨,但幸好队伍上午的训练并没有受到任何干扰。
  下午6点,当球队抵达训练场时,大雨已经下了几个小时,而且丝毫没有停下来的意思。抱着试一试的态度,球队开始了当天下午的例行训练,25分钟过去了,天气没有任何转好的迹象,为了保护球员们,国奥队决定中止当天的训练,全队立即返回酒店。
  在雨中训练对足球队来说并不是什么稀罕事,但在奥运会即将开始之前,全队变得“娇贵”了。在沈阳最后一周的训练,国奥队首先要保证现有的球员不再出现意外的伤病情况以免影响正式比赛,因此这一阶段控制训练受伤、控制感冒等疾病的出现被队伍放在了相当重要的位置。而抵达沈阳之后,中后卫冯萧霆就一直没有训练,冯萧霆是7月27日在长春患上了感冒,因此也没有参加29日跟塞尔维亚的热身赛。队伍介绍说,冯萧霆并没有出现发烧症状,但为了安全起见,这两天还是让他静养休息,等感冒彻底好了之后再恢复训练。由于有了冯萧霆这个例子,因此国奥队对雨中训练就显得特别谨慎,主要是担心球员们受凉而引发感冒,造成非战斗减员。而女足队员马晓旭在热身赛中受伤导致无缘奥运的前科,也让在沈阳的国奥队现在格外警惕,“训练中不断嘱咐队员们要注意动作,我们可不能再出这样的事情了。”一位工作人员表示。
  从长春到沈阳,雨水一路伴随着国奥队,“也邪了,我们走到哪儿雨就下到哪儿,在长春几次训练都被大雨给搅和了,没想到来沈阳又碰到这种事情。”一位国奥球员也对雨水的“青睐”有些不解。"""
s=SnowNLP(text2)
print(s.summary(9))
print(s.summary(1))

2.TF-IDF法--抽取式摘要


#coding:utf-8
import nltk
import jieba
import numpy



#分句
def sent_tokenizer(texts):
    start=0
    i=0#每个字符的位置
    sentences=[]
    punt_list=',.!?:;~,。!?:;~'#标点符号

    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()#取下一个字符.pop是删除最后一个
    if start<len(texts):
        sentences.append(texts[start:])#这是为了处理文本末尾没有标点符号的情况
    return sentences

#对停用词加载
def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
    return stopwords

#对句子打分
def score_sentences(sentences,topn_words):#参数 sentences:文本组(分好句的文本,topn_words:高频词组
    scores=[]
    sentence_idx=-1#初始句子索引标号-1
    for s in [list(jieba.cut(s)) for s in sentences]:# 遍历每一个分句,这里的每个分句是 分词数组 分句1类似 ['花', '果园', '中央商务区', 'F4', '栋楼', 'B33', '城', ',']
        sentence_idx+=1 #句子索引+1。。0表示第一个句子
        word_idx=[]#存放关键词在分句中的索引位置.得到结果类似:[1, 2, 3, 4, 5],[0, 1],[0, 1, 2, 4, 5, 7]..
        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。类似[[0, 1, 2], [4, 5], [7]]
        cluster=[word_idx[0]] #存放的是一个类别(簇) 类似[0, 1, 2]
        i=1
        while i<len(word_idx):#遍历 当前分句中的高频词
            CLUSTER_THRESHOLD=2#举例阈值我设为2
            if word_idx[i]-word_idx[i-1]<CLUSTER_THRESHOLD:#如果当前高频词索引 与前一个高频词索引相差小于3,
                cluster.append(word_idx[i])#则认为是一类
            else:
                clusters.append(cluster[:])#将当前类别添加进clusters=[]
                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;

#结果输出
def results(texts,topn_wordnum,n):#texts 文本,topn_wordnum高频词个数,为返回几个句子
    stopwords = stopwordslist("C:\\Users\\cuguanren\\pytorch实践项目\\语音识别\\data\\stopwords\\hit_stopwords.txt")#加载停用词
    sentence = sent_tokenizer(texts)  # 分句
    words = [w for sentence in sentence 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)][:topn_wordnum]  # 取出词频最高的topn_wordnum个单词

    scored_sentences = score_sentences(sentence, topn_words)#给分句打分

    # 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)]  # sent_idx 分句标号,score得分

    # 2,返回top n句子
    top_n_scored = sorted(scored_sentences, key=lambda s: s[1])[-n:]  # 对得分进行排序,取出n个句子
    top_n_scored = sorted(top_n_scored, key=lambda s: s[0])  # 对得分最高的几个分句,进行分句位置排序
    c = dict(mean_scoredsenteces=[sentence[idx] for (idx, score) in mean_scored])
    c1=dict(topnsenteces=[sentence[idx] for (idx, score) in top_n_scored])
    return c,c1

if __name__=='__main__':
    texts = str(input('请输入文本:'))
    topn_wordnum=int(input('请输入高频词数:'))
    n=int(input('请输入要返回的句子个数:'))
    c,c1=results(texts,topn_wordnum,n)
    print(c)
    print(c1)


3.聚类法--抽取式摘要

        

下载中文spacy模型 python -m spacy download zh_core_web_lg

注意#from summarizer.sentence_handler import SentenceHandler中提到的sentence_handler已经被移除,取而代之的是summarizer.summary_processor.SentenceHandler方法。

from summarizer import Summarizer
#from summarizer.sentence_handler import SentenceHandler
from spacy.lang.zh import Chinese#spaCy是最流行的开源NLP开发包之一,中文版预训练模型包括词性标注、依存分析和命名实体识别等
from transformers import *
import summarizer
 
# 通过Transformers加载模型
modelName = "hfl/rbt6"  # 使用中文bert,可以换成自己常用的
custom_config = AutoConfig.from_pretrained(modelName)
custom_config.output_hidden_states = True
custom_tokenizer = AutoTokenizer.from_pretrained(modelName)
custom_model = AutoModel.from_pretrained(modelName, config=custom_config)
 
model = Summarizer(
    custom_model=custom_model,
    custom_tokenizer=custom_tokenizer,
    sentence_handler=summarizer.summary_processor.SentenceHandler(language=Chinese)  # 使用中文分词
)
 
texts = [
    """四海网讯,近日,有媒体报道称:章子怡真怀孕了!报道还援引知情人士消息称,
    “章子怡怀孕大概四五个月,预产期是年底前后,现在已经不接工作了。”这到底是怎么回事?消息是真是假?针对此消息,23日晚8时30分,
    华西都市报记者迅速联系上了与章子怡家里关系极好的知情人士,这位人士向华西都市报记者证实说:“子怡这次确实怀孕了。
    她已经36岁了,也该怀孕了。章子怡怀上汪峰的孩子后,子怡的父母亲十分高兴。子怡的母亲,已开始悉心照料女儿了。
    子怡的预产期大概是今年12月底。”当晚9时,华西都市报记者为了求证章子怡怀孕消息,又电话联系章子怡的亲哥哥章子男,
    但电话通了,一直没有人接听。有关章子怡怀孕的新闻自从2013年9月份章子怡和汪峰恋情以来,就被传N遍了!
    不过,时间跨入2015年,事情却发生着微妙的变化。2015年3月21日,章子怡担任制片人的电影《从天儿降》开机,
    在开机发布会上几张合影,让网友又燃起了好奇心:“章子怡真的怀孕了吗?”但后据证实,章子怡的“大肚照”
    只是影片宣传的噱头。过了四个月的7月22日,《太平轮》新一轮宣传,章子怡又被发现状态不佳,不时深呼吸,
    不自觉想捂住肚子,又觉得不妥。然后在8月的一天,章子怡和朋友吃饭,在酒店门口被风行工作室拍到了,疑似有
    孕在身!今年7月11日,汪峰本来在上海要举行演唱会,后来因为台风“灿鸿”取消了。而消息人士称,汪峰原来打
    算在演唱会上当着章子怡的面宣布重大消息,而且章子怡已经赴上海准备参加演唱会了,怎知遇到台风,只好延期,相
    信9月26日的演唱会应该还会有惊喜大白天下吧。""",
    """鉴于统一误差计算模型简化方法自适应性差的问题,提出了一种根据地势特征自适应分割地形区域从而有选择性
    地进行误差计算和模型简化的方法.针对地形模型数据量大的特点,建立了细节层次结构,并证明了空间快速索引方
    法的有效性.为了解决平缓地势区域分割困难的问题,提出了基于凸点和扩散点相结合的特征选择算法,并有效控制
    了特征点的密度.在此基础上提出了多分辨率邻域节点查找与匹配方法,实现了区域的快速粗粒度分割.提出了地表
    起伏度计算方法,进一步评价了分割区域的地势特征,从而对部分区域进行细分处理.在真实数据上进行了实验研究,
    结果表明算法性能以及简化模型的精度和自适应性较好.""",
    """针对央视3·15晚会曝光的电信行业乱象,工信部在公告中表示,将严查央视3·15晚会曝光通信违规违法行为。
    工信部称,已约谈三大运营商有关负责人,并连夜责成三大运营商和所在省通信管理局进行调查,依法依规严肃处理。""",
    """就废弃茶叶被转手事件发声明本报讯(记者刘俊) “我们也是受害者!”昨日,有媒体报道称康师傅的废弃茶叶被
    转手卖给不良商家、冒充名茶流入市场,康师傅的一位联系人这样说。康师傅昨日晚间发出声明表示生产废料处理商
    作出了 “不良行为”,公司方面除表达严正关注的立场外,也已经配合政府有关单位进行调查。中止与生产废料厂
    商的合同康师傅在给本报的声明中确认,经查,与康师傅签订生产废料处理合同之厂商为吉安三石饲料商行,且系通
    过公开招标程序取得合同承揽资格,并签有保证透过合法渠道处理康师傅生产废料的承诺。昨日媒体报道的内容显示
    吉安三石饲料商行可能违反与康师傅签订之合同,即日起,康师傅已中止履行与吉安三石饲料商行的有关合同,并静待
    相关单位调查结果后从严追究责任。昨日,康师傅一位熟悉情况的人士告诉记者,这家商家是从去年三季度后开始
    给康师傅处理生产废料的,有关合同将在今年年底届满,这位联系人指康师傅和该商行之间没有参股或任何资本关系。
    “厂家承诺废料用来做枕头”“为了确保不会出现乱子我们在合同上跟这家商行更是明确约定,不能利用废弃茶叶
    做任何违法国家法律法规的事情的。”上述人士说,这家商行向他们承诺茶叶是用于做枕头等用品的,康师傅方面为了
    安全起见,还特意向他们索要用于做枕头等业务的单据,没有想到还是出了这样的事情。康师傅是内地最大的即饮茶
    饮料生产商,其市场份额近四成。据媒体昨日曝光的二手茶叶的产业链,回收商行将康师傅泡过后的废弃茶叶以低价
    出售给不良商家,商家将茶叶运往外地进行加工出售。每年百万斤的二手茶叶被制成名茶出口国外或卖给国内企业。
    据报道,泡后的茶叶先是被运往广州增城新塘永和龟山,在烘干后被运往东莞麻涌的茶厂加工,然后集中运至浙江安吉
    凯丰茶叶有限公司(下称凯丰茶厂)进行再次加工。作者:刘俊 (来源:广州日报)""",
    """记者傅亚雨沈阳报道 来到沈阳,国奥队依然没有摆脱雨水的困扰。7月31日下午6点,国奥队的日常训练再度受到
    大雨的干扰,无奈之下队员们只慢跑了25分钟就草草收场。31日上午10点,国奥队在奥体中心外场训练的时候,天
    就是阴沉沉的,气象预报显示当天下午沈阳就有大雨,但幸好队伍上午的训练并没有受到任何干扰。下午6点,当
    球队抵达训练场时,大雨已经下了几个小时,而且丝毫没有停下来的意思。抱着试一试的态度,球队开始了当天下
    午的例行训练,25分钟过去了,天气没有任何转好的迹象,为了保护球员们,国奥队决定中止当天的训练,全队立
    即返回酒店。在雨中训练对足球队来说并不是什么稀罕事,但在奥运会即将开始之前,全队变得“娇贵”了。在沈
    阳最后一周的训练,国奥队首先要保证现有的球员不再出现意外的伤病情况以免影响正式比赛,因此这一阶段控制
    训练受伤、控制感冒等疾病的出现被队伍放在了相当重要的位置。而抵达沈阳之后,中后卫冯萧霆就一直没有训练
    ,冯萧霆是7月27日在长春患上了感冒,因此也没有参加29日跟塞尔维亚的热身赛。队伍介绍说,冯萧霆并没有出
    现发烧症状,但为了安全起见,这两天还是让他静养休息,等感冒彻底好了之后再恢复训练。由于有了冯萧霆这个例
    子,因此国奥队对雨中训练就显得特别谨慎,主要是担心球员们受凉而引发感冒,造成非战斗减员。而女足队员马晓
    旭在热身赛中受伤导致无缘奥运的前科,也让在沈阳的国奥队现在格外警惕,“训练中不断嘱咐队员们要注意动作,
    我们可不能再出这样的事情了。”一位工作人员表示。从长春到沈阳,雨水一路伴随着国奥队,“也邪了,我们走到
    哪儿雨就下到哪儿,在长春几次训练都被大雨给搅和了,没想到来沈阳又碰到这种事情。”一位国奥球员也对雨水的“青睐”有些不解。""",
    """交会对接,简简单单四个字,包含了两个阶段,这是建设中国空间站的关键技术,也是航天器在轨运行中最复杂的技术之一。
    你问天为例,发射前,我们可以想象为地球带着他和长征火箭一起旋转。从起飞的那一瞬间,他们不在随地球运动,脱离地表直接
    利用太空。因此,起飞时刻的精准性决定了火箭是否被地球带着偏离了预期的初始条件,这里也就做了一个名词零窗口发射时间误
    差只能在政府一秒内不允许有任何延误与变更。发生后,两个航天器怎样找到彼此呢?将会对接常常被被誉为万里传真,其实距离
    并不与难度成正比,追踪确立,甚至也不一定多耗燃料。关键在于精准控制飞行过程中的高度差和航天器自身的时期,新生活,后
    悔到月底运行速度越快。打个比方,只要保持问题的轨道,英语空间站婚自然就以更快的速度飞向空间站追踪过程中,问题逐渐抬
    高,轨道空间站的相对速度也随之逐渐减小,问天与空间站轨道高度相似,两者的相对速度为零,对接就可望实现了。上公室。航
    天器达到第一种速度后,建立轨道飞行,此后速度大小,只于轨道高度有关。简单说,快速交会对接飞行速度变快了,而是轨道控
    制的流程变短了,所以快速交会对接模式,除了快速之外的另一个关键词是自主。自主就是追踪飞行器,不用再等待地面的指挥,
    而是利用自己掌握的数据来决定自己的前进方向。这里我们的北斗大哥可是出大力北斗全球导航的应用使得精确实时的轨道侧。"""]
 
for i, j in enumerate(texts):
    result = model(j)
    print(str(i + 1) + ':' + result)

4.seq2seq法--生成式摘要

        本模型采用清华大学开源的新闻集,涉及领域广泛,数量达80w条,同时采用哈工大提供的预训练bert模型实现。

## THUCNews 原始数据集
# -*- coding:utf-8 -*-

import torch 
from tqdm import tqdm
import time
import glob
from torch.utils.data import Dataset, DataLoader
from bert_seq2seq import Tokenizer, load_chinese_base_vocab
from bert_seq2seq import load_bert

vocab_path = "./state_dict/roberta_wwm_vocab.txt"  # roberta模型字典的位置
word2idx = load_chinese_base_vocab(vocab_path)
model_name = "roberta"  # 选择模型名字
model_path = "./state_dict/roberta_wwm_pytorch_model.bin"  # 模型位置
recent_model_path = "./state_dict/bert_auto_title_model.bin"   # 用于把已经训练好的模型继续训练
model_save_path = "./state_dict/bert_auto_title_model.bin"
batch_size = 4
lr = 1e-5
maxlen = 256

class BertDataset(Dataset):
    """
    针对特定数据集,定义一个相关的取数据的方式
    """
    def __init__(self) :
        ## 一般init函数是加载所有数据
        super(BertDataset, self).__init__()
        ## 拿到所有文件名字
        self.txts = glob.glob('./corpus/THUCNews/*/*.txt')
        self.idx2word = {k: v for v, k in word2idx.items()}
        self.tokenizer = Tokenizer(word2idx)

    def __getitem__(self, i):
        ## 得到单个数据
        # print(i)
        text_name = self.txts[i]
        with open(text_name, "r", encoding="utf-8") as f:
            text = f.read()
        text = text.split('\n')
        if len(text) > 1:
            title = text[0]
            content = '\n'.join(text[1:])
            token_ids, token_type_ids = self.tokenizer.encode(
                content, title, max_length=maxlen
            )
            output = {
                "token_ids": token_ids,
                "token_type_ids": token_type_ids,
            }
            return output

        return self.__getitem__(i + 1)

    def __len__(self):

        return len(self.txts)
        
def collate_fn(batch):
    """
    动态padding, batch为一部分sample
    """

    def padding(indice, max_length, pad_idx=0):
        """
        pad 函数
        """
        pad_indice = [item + [pad_idx] * max(0, max_length - len(item)) for item in indice]
        return torch.tensor(pad_indice)

    token_ids = [data["token_ids"] for data in batch]
    max_length = max([len(t) for t in token_ids])
    token_type_ids = [data["token_type_ids"] for data in batch]

    token_ids_padded = padding(token_ids, max_length)
    token_type_ids_padded = padding(token_type_ids, max_length)
    target_ids_padded = token_ids_padded[:, 1:].contiguous()

    return token_ids_padded, token_type_ids_padded, target_ids_padded

class Trainer:
    def __init__(self):
        # 判断是否有可用GPU
        self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        print("device: " + str(self.device))
        # 定义模型
        self.bert_model = load_bert(word2idx, model_name=model_name)
        ## 加载预训练的模型参数~
        
        self.bert_model.load_pretrain_params(recent_model_path)
        # 加载已经训练好的模型,继续训练

        # 将模型发送到计算设备(GPU或CPU)
        self.bert_model.set_device(self.device)
        # 声明需要优化的参数
        self.optim_parameters = list(self.bert_model.parameters())
        self.optimizer = torch.optim.Adam(self.optim_parameters, lr=lr, weight_decay=1e-3)
        # 声明自定义的数据加载器
        dataset = BertDataset()
        self.dataloader =  DataLoader(dataset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn)

    def train(self, epoch):
        # 一个epoch的训练
        self.bert_model.train()
        self.iteration(epoch, dataloader=self.dataloader, train=True)
    
    def save(self, save_path):
        """
        保存模型
        """
        self.bert_model.save_all_params(save_path)
        print("{} saved!".format(save_path))

    def iteration(self, epoch, dataloader, train=True):
        total_loss = 0
        start_time = time.time() ## 得到当前时间
        step = 0
        report_loss = 0
        for token_ids, token_type_ids, target_ids in tqdm(dataloader,position=0, leave=True):
            step += 1
            if step % 10 == 0:
                self.bert_model.eval()
                test_data = ["""就废弃茶叶被转手事件发声明本报讯(记者刘俊) “我们也是受害者!”昨日,有媒体报道称康师
                傅的废弃茶叶被转手卖给不良商家、冒充名茶流入市场,康师傅的一位联系人这样说。康师傅昨日晚间发出
                声明表示生产废料处理商作出了 “不良行为”,公司方面除表达严正关注的立场外,也已经配合政府有关单位进行调
                查。中止与生产废料厂商的合同康师傅在给本报的声明中确认,经查,与康师傅签订生产废料处理合同之厂商为
                吉安三石饲料商行,且系通过公开招标程序取得合同承揽资格,并签有保证透过合法渠道处理康师傅生产废料的承诺。
                昨日媒体报道的内容显示吉安三石饲料商行可能违反与康师傅签订之合同,即日起,康师傅已中止履行与吉安三石饲料商行
                的有关合同,并静待相关单位调查结果后从严追究责任。昨日,康师傅一位熟悉情况的人士告诉记者,这家商家是从去年三
                季度后开始给康师傅处理生产废料的,有关合同将在今年年底届满,这位联系人指康师傅和该商行之间没有参股或任何资本关系。""",
                 """交会对接,简简单单四个字,包含了两个阶段,这是建设中国空间站的关键技术,也是航天器在轨运行中最复杂的技术之一。
                 你问天为例,发射前,我们可以想象为地球带着他和长征火箭一起旋转。从起飞的那一瞬间,他们不在随地球运动,脱离地表直接利用太空。
                 因此,起飞时刻的精准性决定了火箭是否被地球带着偏离了预期的初始条件,这里也就做了一个名词零窗口发射时间误差只能在政府一秒内不
                 允许有任何延误与变更。发生后,两个航天器怎样找到彼此呢?将会对接常常被被誉为万里传真,其实距离并不与难度成正比,追踪确立,甚
                 至也不一定多耗燃料。关键在于精准控制飞行过程中的高度差和航天器自身的时期,新生活,后悔到月底运行速度越快。打个比方,只要保持
                 问题的轨道,英语空间站婚自然就以更快的速度飞向空间站追踪过程中,问题逐渐抬高,轨道空间站的相对速度也随之逐渐减小,问天与空间
                 站轨道高度相似,两者的相对速度为零,对接就可望实现了。上公室。航天器达到第一种速度后,建立轨道飞行,此后速度大小,只于轨道高
                 度有关。简单说,快速交会对接飞行速度变快了,而是轨道控制的流程变短了,所以快速交会对接模式,除了快速之外的另一个关键词是自主。
                 自主就是追踪飞行器,不用再等待地面的指挥,而是利用自己掌握的数据来决定自己的前进方向。这里我们的北斗大哥可是出大力北斗全球导航
                 的应用使得精确实时的轨道侧。""",
                 "8月28日,网络爆料称,华住集团旗下连锁酒店用户数据疑似发生泄露。从卖家发布的内容看,数据包含华住旗下汉庭、禧玥、桔子、宜必思等10余个品牌酒店的住客信息。泄露的信息包括华住官网注册资料、酒店入住登记的身份信息及酒店开房记录,住客姓名、手机号、邮箱、身份证号、登录账号密码等。卖家对这个约5亿条数据打包出售。第三方安全平台威胁猎人对信息出售者提供的三万条数据进行验证,认为数据真实性非常高。当天下午 ,华 住集 团发声明称,已在内部迅速开展核查,并第一时间报警。当晚,上海警方消息称,接到华住集团报案,警方已经介入调查。"]
                for text in test_data:
                    print(self.bert_model.generate(text, beam_size=3))
                print("loss is " + str(report_loss))
                report_loss = 0
                # self.eval(epoch)
                self.bert_model.train()
            if step % 8000 == 0:
                self.save(model_save_path)

            # 因为传入了target标签,因此会计算loss并且返回
            predictions, loss = self.bert_model(token_ids,
                                                token_type_ids,
                                                labels=target_ids,
                                               
                                                )
            report_loss += loss.item()
            # 反向传播
            if train:
                # 清空之前的梯度
                self.optimizer.zero_grad()
                # 反向传播, 获取新的梯度
                loss.backward()
                # 用获取的梯度更新模型参数
                self.optimizer.step()

            # 为计算当前epoch的平均loss
            total_loss += loss.item()

        end_time = time.time()
        spend_time = end_time - start_time
        # 打印训练信息
        print("epoch is " + str(epoch)+". loss is " + str(total_loss) + ". spend time is "+ str(spend_time))
        # 保存模型
        self.save(model_save_path)

    def testtry(self,s):
        #self.bert_model.train()
        self.bert_model.eval()
        with torch.no_grad():
            test_data = s
            for text in test_data:
                print(self.bert_model.generate(text, beam_size=1))

if __name__ == '__main__':

    trainer = Trainer()
    train_epoches = 1

    for epoch in range(train_epoches):
        # 训练一个epoch
        trainer.train(epoch)

三.总结

        在以上采用的4种摘要提取方法中,经读者测试,效果最好的应是第三种摘要提取方法,即聚类方法,不论是从摘要提取所需的时间,还是提取出摘要的质量,相对来说都是最好的选择。-

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值