对于bert_sum中的总结(1)

本次主要复习了bert_sum中的抽取方式提取文本摘要的部分。记录自己现在的收获与遇到的问题。

01数据集:数据集是来自一份汽车对话的数据集,其中内容主要是技师和车主的对话内容。然后对这一份数据集合的每一个样本的整体性内容做了文本摘要。我们需要做的是在一份相类似的数据集上,根据技师和车主的主要对话内容,然后结合该样本的其它辅助信息,给出文本摘要的预测。

02 数据处理部分,

<1>把数据集中技师和车主的对话内容中,多段对话的内容,根据特定的符号如:'/'、'|'、','、'。'进行分离。然后把关于车的其它信息整合到一起。然后将隔断的对话内容转化为自己列表内容字符级别的。进行拼接。 摘要部分的内容,看作者的处理方式是没有进行对多段内容进行特别的分隔处理。由于文本的内容比较大,作者采用了将一个大文本分别转化为若干个小文本内容进行存储。

<2>将对话内容中,每句话分隔的地方的开始部分和结束部分,分别用[CLS]、[SEP]相连,[CLS]的作用是可以区分出每个句子的标识,[SEP]的作用是代表当前句子的结尾,在计算segment的时候,需要用。将技师和车主的对话内容,转化为整个字符串后,引入bert的预训练模型,进行切词。并且将所切词,转化为对应的id记作src、将src中cls对应的对应的索引位置拿出来,记为cls。

将文本摘要内容转换为

将车主和技师的每句话的对话的文字内容连接起来,不同句用','隔开,记为src_txt。将标签摘要内容中不同句子通过连接起来,记为tgt_txt。

然后将车主和技师每段对话的内容,通过内部循环,这里现在采用的是greedy的方法,找出对应标签文本摘要最重要的三个句子。然后将此3个句子,不同索引位置的地方记录为1。记录为sent_label。

最后将处理后的每个样本部分转化为src、cls、segment、src_txt、tgt_txt、sent_label的一个个字典。然后将格式转化为.pt的格式。

<3> 下载数据集,并做转化为torch前的处理。作者在将数据集转化为batch的时候,做了特别的处理方式,使得最大化的利用计算机的性能。其中作者多次用到了yield的操作使用。我这里理解的是yield是一个生成器的作用。不会立即执行只有在进入for循环或者调用next的时候才会执行。作者首先在下载在<2>阶段的时候数据集的时候,第一次使用了yield的方法,每次从多个数据集文件中调用其中一个。然后作者通过了2个类来获取并构建数据集部分。其中第一个类别,是调用load中的文件数据集,然后引入数据集的时候,调用了第二个类,而第二个类才是真正的去构建batch数据集。两个类别中都使用了__iter__的方法。该方法是当对类别进行循环的时候,会调用此方法。在第二个类别的__iter__方法中,作者构建了对一个文本中bach的循环。也采用了yield的方式。当得到的数据量达到一个大的batch的时候,根据不同的情况判断返回的大的batch量,也是用了yield返回的。其次在构造这个大的batch量的时候,对其中的数据做了一定的处理方式。比如单个样本中句子的最大长度应该限制到多少。以及最小的文本数量是多少,低于这个值的句子就去掉。然后重新整合计算。然后这个大的batch量在通过一个和上一个获取大的batch一样的方式,从中获取小的batch量。然后对这个小的batch做真正的处理。

当得到这个小的batch之后呢。对每个当前的batch的src、cls、segment、tgt都进行了补零的处理操作。然后得到对应的mask_src、mask_cls。然后将对应的数据传入到模型中去。

03 模型部分

模型第一个搭建的是bert模型。将src、mask_src、segment输入bert模型中。这里在构建bert模型之后,通过了nn.embeding的方式对位置变量进行了重新的构建,将位置变量也变成了需要反向更新的的方式的情况。bert采用了transformer的encoder部分。因此会经过self-attention、feed_forward的方式进行传播。这里返回的是最后一层的输出。然后根据矩阵变换的方式,通过cls部分的索引,得到对应样本每个句子cls组成的新的矩阵形式。在这里矩阵变化的过程现在不太理解,比如:虽然知道所得的结果是每个句子对应的矩阵表示。但是计算没有看懂。

sents_vec = top_vec[torch.arange(top_vec.size(0)).unsqueeze(1), clss]

sents_vec = sents_vec * mask_cls[:, :, None].float()

 然后将sents_vec和对应的mask_cls经过了transformer再进行计算。引入了位置变量,经过了几层的self-attention和feed_forward和残差层、layernorm层。这里应该回忆到多头注意力的计算方式、feed_forward的计算方式。得到最后的输出。然后经过一个线性层,最终得到的结果为当前每个句子对应的得分。

04 计算loss

经过模型得到的输出得分与数据处理过程中通过greedy部分,得到的最接近标签摘要的几个句子,计算loss。

05 验证集

验证集还是用训练集中得到loss的方式,此时梯度不会更新,来测试当前的loss如何,模型是否得到稳定。

06 测试集

根据模型的输出,计算loss得到对应的预测的文本摘要和标签的文本摘要,查看结果。

你可能感兴趣的:(python,人工智能,自然语言处理,深度学习,算法)