@staticmethod
def sequence_dec(s_seq, e_seq, q_type, start, end, c_start, distance, context):
ans_index = []
i_start, i_end = [], []
for i in range(start, end + 1):
if s_seq[i][1] > args["threshold"]:
i_start.append(i)
if e_seq[i][1] > args["threshold"]:
i_end.append(i)
# 然后遍历i_end
cur_end = -1
for e in i_end:
s = [] #以e为end pos的entity的list
for i in i_start:
if e >= i >= cur_end and (e - i) <= max_dec_len_map[q_type]:
s.append(i)
max_s = 0.0
t = None
for i in s:
if s_seq[i][1] + e_seq[e][1] > max_s:
t = (i, e)
max_s = s_seq[i][1] + e_seq[e][1]
cur_end = e
if t is not None:
ans_index.append(t)
out = []
for item in ans_index:
out.append({"type": q_type, "start": distance + item[0] - c_start, "end": distance + item[1] + 1 - c_start,
"label": context[item[0]-c_start: item[1]-c_start+1]})
return out
在这个实现里面,首先选出大于阈值的start_list与end_list,然后去遍历每一个end_idx,这样的话,就针对于flat ner进行解码,并没有考虑nested ner的entity,请问当时为什么会这么做呢?是因为这样做的效果更好吗?
2. 在数据构造方式上,比较疑惑的是:训练集与验证集的构造方式不一样(我指的是通过继承Dataset产生的数据),请问为什么要这么做呢?实际上,训练集与验证集的原始数据格式是一样的,为什么在产生输入到模型的数据格式会不一样?因为如果我构造成一样的,似乎也是可以训练与验证的。是有什么原因吗?
3. 原始的那片论文里面有添加span loss,而您有提到,加入span loss会导致模型无法训练,这个怎么理解呢?因为我也有去看那篇原始的原始的实现,似乎是在数据构造的时候,多了一个span matrix,其shape是:[seq_len,seq_len],然后在模型里面添加了span loss,似乎训练没有问题,您所提到的无法训练指的是:训练太慢了还是真的就没有办法训练?