EntLM icon indicating copy to clipboard operation
EntLM copied to clipboard

关于Label Mapping

Open huangjia2019 opened this issue 2 years ago • 1 comments

您好,

根据我对论文的理解,数据集的label应该是类似于'Michael', 'John'这样的名词,然而,再调试时,我发现train_transformer.py的389行之后,label_token_map从下表 'I-PER':['Michael', 'John', 'David', 'Thomas', 'Martin', 'Paul'] 'I-ORG':['Corp', 'Inc', 'Commission', 'Union', 'Bank', 'Party'] 'I-LOC':['England', 'Germany', 'Australia', 'France', 'Russia', 'Italy'] 'I-MISC':['Palestinians', 'Russian', 'Chinese', 'Dutch', 'Russians', 'English'] 变成了下面4个新字符 'I-PER':'I-PER' 'I-ORG':'I-ORG' 'I-LOC':'I-LOC' 'I-MISC':'I-MISC' 这4个新字符tokenize之后就变成 {28997: 'I-PER', 28998: 'I-ORG', 28999: 'I-LOC', 28996: 'I-MISC'},这样,在训练过程中,所有实体的token所对应的label都被转换为28997,28998,28999,28996四者其中之一。这似乎与论文的label word engineering的思路不符。

请指教一下应该如何转换为论文中所说的discrete word或virtual word,作为Label。

huangjia2019 avatar Jan 31 '23 08:01 huangjia2019

你好,

感谢你关注我们的论文。关于你提出的问题,我们使用的label word确实是"John" (discrete)或者['Michael', 'John', 'David', 'Thomas', 'Martin', 'Paul'] (virtual)这样的形式,其中virtual实际上是由多个词一起构建得到label word的。

在代码train_transformer.py中的第912行的add_label_token_bert中,我们 (1)先向tokenizer的词表中插入一些新token作为label word,这些label word在词表中的key为其对应的标签(比如"I-PER") (2)然后我们为这些词表中的新token初始化embedding,这里的embedding就是使用"John" 或者['Michael', 'John', 'David', 'Thomas', 'Martin', 'Paul'] 对应的词的embedding进行初始化。

比如,'I-PER':['Michael', 'John', 'David', 'Thomas', 'Martin', 'Paul']时,词表里实际插入了一个名称为"I-PER"的新token,它初始化的embedding为['Michael', 'John', 'David', 'Thomas', 'Martin', 'Paul']这些词的embedding的平均。而{28997: 'I-PER', 28998: 'I-ORG', 28999: 'I-LOC', 28996: 'I-MISC'}的key和value就是我们插入的label word在词表中的id和对应的label word名称。

希望可以解答你的疑问。

rtmaww avatar Jan 31 '23 12:01 rtmaww