Wangpeiyi9979 / ESD

Code for NAACL2022 Long Paper "An Enhanced Span-based Decomposition Method for Few-Shot Sequence Labeling"
27 stars 2 forks source link

关于span的获取 #3

Closed yiphingzhang closed 2 years ago

yiphingzhang commented 2 years ago

您好!我发现span这个变量里,一个句子中总是把它正确的槽标签起始位置放在前面,后面才是枚举了一些别的span。那在进行预测的时候,在计算增强后的span representation,以及每类的原型向量,不就相当于已经提前知道了query set的正确的槽边界,并且利用它来计算了representation,后面才进行span的分类?就是指query set虽然不知道槽的类别,但是它提前得到了边界信息。不知道我有没有理解错,期待您的回复

Wangpeiyi9979 commented 2 years ago

不存在边界信息泄漏。 span相关的模块都是attention(CSA,ISA, INSA,PSA等)或者是距离计算操作(matching),这些操作都是位置(排列顺序)无关的,因此按照正常枚举顺序排列将entity span放在O类span进行排列是等价的。

yiphingzhang commented 2 years ago

这样吗,那请问获取chunk的时候,判断一个chunk的起始位置和结束位置的函数,不是根据它的BIESO来判断的吗,这个不是得有正确的标签才可以得到吗?我是想请问获得最原始的span的时候,也就是存储了span的起始和结束的下标的时候,通过get_entityies()得到了class2span。然后它先得到了有实体位置的部分span,再通过判断边界+枚举,得到了后面的一些类型为O的。

Wangpeiyi9979 commented 2 years ago

哦哦,对于query,我们会枚举所有可能潜在的span。除了下列3种类型的span:

1、我们不要长度大于L的span。line167 line188 2、如果一个token是BERT切词后的subword,我们不要以这个token为起始边界的span。line182 3、如果一个token,它的下一个token是subword,我们不要这个以这个token为结束边界的span。line184

根据条件1、2、3的query span枚举逻辑,是没有利用BIO/BIESO的标签信息的。

虽然代码里面确实是先把所有entity的span根据标签信息选出来了,然后放在O类span的前面, 但是因为entity span的边界token一定不满足条件2和条件3, 所以代码枚举逻辑得到的结果 和 根据条件1、2、3按照正常顺序枚举的结果是一样的,只是排列顺序不一样而已。

不知道说清楚没有。总之等价来看,在test的时候,我对query span的枚举,其实是没有用到标签信息的。

yiphingzhang commented 2 years ago

下面枚举得到的是O类型的,而且是依赖于前面得到的正确的entity span的边界来进行选择(Line 191),所以我会觉得下面的枚举也是在得知了entity span的情况下,选择性地枚举(根据您上面说的几种条件选择)。 因为在代码的Line 164, Line 170,可以看到gold_entitys和span变量的添加的内容是一样的,除了gold_entitys那里多了一个tag。然后这个函数最终的返回值,spans + downsample_O_spans,也是拿正确的entity span,加上 在entity span条件下枚举、筛选出来的O_span。 然后后续的模型是拿这个返回值,去获取span_representation,然后去做attention相关模块。所以这个不算是间接包含、利用了标签信息嘛?以上是我的疑惑,有什么不对的烦请指正!

Wangpeiyi9979 commented 2 years ago

gold_entities不会作为模型的输入,只会用来作为标签计算模型的表现。这当然需要根据真实标签来获取,不存在什么信息泄露。 gold_entites没有根据条件1过滤,所以不是一样的。

测试的时候,对于query sentence,最直接的枚举query span的逻辑,是根据我上面提到的条件1、2、3来枚举,这样的逻辑是没有用到标签信息的,是肯定没问题的。

当时为了方便,比如训练的时候利用到长度大于L的entity span的监督信息,我写成了现在代码里的枚举逻辑,先枚举所有entity,再枚举O类span。

在测试的时候,对于query: 对于entity span,我用了条件1过滤,因为它们一定不满足条件2和条件3。 对于O span,我用了条件1、2、3过滤

等价来看,其实就是对于所有span,我用了条件1、2、3过滤。

代码里面的逻辑得到的query span和根据条件1、2、3枚举得到的query span【结果是一样的】,除了排列顺序 (但是我们的模型内部的操作其实是排列顺序无关的)。

我们可以仅仅使用条件1、2、3来枚举得到query span,但是这样的结果和现在代码得到的结果其实完全等价。

yiphingzhang commented 2 years ago

噢噢噢!我明白了,脑子终于转过来了T^T 。span的抽取只是根据分词后的词是不是subword,以及长度是否大于L等条件来选择。 感谢您不厌其烦地及时回复,解答了我的疑问!!!再次感谢!

Wangpeiyi9979 commented 2 years ago

哈哈哈,没事,可能是我最开始表述不太清楚。 对了,如果你要研究这个方向,我这篇文章其实不是sota了。 Decomposed Meta-Learning for Few-Shot Named Entity Recognition,这篇文章的效果其实会比我的好蛮多的,你可以看看。

yiphingzhang commented 2 years ago

可恶,怎么sota刷新得这么快(感谢提醒!!!)......看了下您说的这个新sota的论文,原来它在您还是预印版的时候,就已经把您作为sota来PK了(手动大拇指