131250208 / TPlinker-joint-extraction

438 stars 94 forks source link

代码可能有个地方写错了,decode_rel函数中循环增加offset,当序列长度比较大的时候,会出现超出token长度的token_span数值。 #69

Open txy960427 opened 2 years ago

txy960427 commented 2 years ago

非常感谢作者的论文和代码,但是在复现的时候发现点问题:

1、当序列长度很长时,即解码时,会出现超出token数量的token_span,我查询到应该时decode_rel函数中这三行缩进的问题: ` for ent in ent_list:

        ent["char_span"] = [ent["char_span"][0] + char_offset, ent["char_span"][1] + char_offset]

        ent["tok_span"] = [ent["tok_span"][0] + tok_offset, ent["tok_span"][1] + tok_offset]

` 主要是这三行,加在了对关系解码的循环里了,需要缩进回去,跳出循环,对每一个样本做一次这样的操作即可。 如果加循环里面,会导致在每一个样本中,每当有一个关系就会不停的增加offset...,解码的时候就有问题了,会超出长度..出现不可预测的token_span,这个问题也在历史问题中有查到过。

2、我发现解码时如果序列长度设置的很长,会出现一些超出100长度的错误实体被预测出来,其头和尾和正确的短实体一样,是否说明模型太过于关注了头和尾,忽略了长实体中间的信息?如果和训练一样,设置为100,就不会有这样的问题。

pcx-pcx commented 1 year ago

非常感谢作者的论文和代码,但是在复现的时候发现点问题:

1、当序列长度很长时,即解码时,会出现超出token数量的token_span,我查询到应该时decode_rel函数中这三行缩进的问题: ` for ent in ent_list:

        ent["char_span"] = [ent["char_span"][0] + char_offset, ent["char_span"][1] + char_offset]

        ent["tok_span"] = [ent["tok_span"][0] + tok_offset, ent["tok_span"][1] + tok_offset]

` 主要是这三行,加在了对关系解码的循环里了,需要缩进回去,跳出循环,对每一个样本做一次这样的操作即可。 如果加循环里面,会导致在每一个样本中,每当有一个关系就会不停的增加offset...,解码的时候就有问题了,会超出长度..出现不可预测的token_span,这个问题也在历史问题中有查到过。

2、我发现解码时如果序列长度设置的很长,会出现一些超出100长度的错误实体被预测出来,其头和尾和正确的短实体一样,是否说明模型太过于关注了头和尾,忽略了长实体中间的信息?如果和训练一样,设置为100,就不会有这样的问题。

你的第二个问题,可以不选cat,而选cat_plus+max_pooling/mean_pooling/mix_pooling就可以解决了,源代码里有具体实现