知识图到文本的生成(七)

本文深入剖析了vectorize库中的rev_ents函数和重点解析了reverse函数。在reverse函数中,通过遍历batch数据,利用vocab转换并筛选元素,构建新的向量表示。同时,对preds进行两层遍历,根据eos标记进行切割,并依据句尾标点进行适当截取,最终形成处理后的序列。整个过程涉及词汇转换、序列操作和文本处理,对于理解向量化处理流程具有指导意义。
摘要由CSDN通过智能技术生成

2021SC@SDUSC 

本文将针对vectorize中的rev_ents函数和reverse函数进行分析

重点在于对reverse函数的分析和理解

 vocab = self.NERD.vocab
    es = []
    for e in batch:
      s = [vocab.itos[y].split(">")[0]+"_"+str(i)+">"

        for i,y in enumerate(e)

         if vocab.itos[y] not in ['<pad>','<eos>']]
               es.append(s)
    return es

 首先传入我们的批数据batch,获取当前向量实例为vocab。同时,初始化一个空的集合便于后续的添加与结果返回,在这里表示为es=[],创建一个空列表。

遍历批数据batch中的每个元素e,创建一个新的向量s ,s的值为向量实例在y方向上的投影按>分割后第一位值与字符串_和字符串>的拼接,

enumerate函数将可迭代对象其组成一个索引序列,利用它可以同时获得索引和值,因此我们获得每个元素e的索引值i和y值,如果voab迭代器y值不在我们的划分内,则在es中加上s值

ents = ents[0][0]
vocab = self.TGT.vocab
 ss = []

在反转reverse函数中,我们新初始化一个二维数组ents,空列表ss[],vocab表示传入vocab对象实例。

 for i,x in enumerate(preds):
      s = ' '.join([vocab.itos[y]

   if y<len(vocab.itos) else "COPY"

 同样使用enumerate遍历preds,获取每个元素值x和索引值i,并将空字符串’ ‘与vocab.itos[y]拼接起来(将其转换为字符串类型),如果我们vocab在y上的值大于等于itos容量时,需要对它进行一个复制转存。

 for j,y in enumerate(x)])   
      if "<eos>" in s:

       s = s.split("<eos>")[0]
      elif s[-1] not in ".?!":
        lastidx = [i for i,x in enumerate(s) if x in ".?!"]
        if lastidx:
          lastidx = max(lastidx)
          s = s[:lastidx+1]
      ss.append(s)

该层循环是上层循环的一个内嵌循环,对获得的x进行二次遍历,获得对应的y值和索引值j。如果s中包含我们的划分,我们就根据’<eos>'值进行划分,并获得首位的投影,再次赋值给s 

同时需要对s的末尾值进行一个判断,如果s数组不以.?!结束,则需启用依次遍历找到.?!所在的索引i,并赋值给lastidx,表示最后一个元素的索引值。

如果lastidx存在,返回最大的lastidx值,这时s的存储范围扩大到lastidx+1

最后再最初的空序列ss中追加上s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值