ShannonAI / mrc-for-flat-nested-ner

Code for ACL 2020 paper `A Unified MRC Framework for Named Entity Recognition`
657 stars 117 forks source link

关于dataset处理offset的部分的问题 #104

Closed Yefeiyang-luis closed 2 years ago

Yefeiyang-luis commented 2 years ago

代码用了words = context.split() start_positions = [x + sum([len(w) for w in words[:x]]) for x in start_positions] end_positions = [x + sum([len(w) for w in words[:x + 1]]) for x in end_positions] 来获取每个word的offset。 后面又拿BertWordPieceTokenizer来取 query+context的offset。用了预训练bert-large的vocab.txt。 但是词典里对长单词和数字的划分不是按照空格来的。如数据里中一段”being bowled out for 296 with England”,按照BertWordPieceTokenizer来切分,会把“296”切成 29/6,这样切分个数对不上,offset不就错位了吗。忘大佬解答。 另一个问题是:论文里对输出的每一个token都判断是不是起始位置或者结束位置,并作softmax,代码里就只是经过linear(dim, 1),然后squeeze了最后一维,这和论文是同一个操作吗? 还有一个问题是:在哪个地方把同一个输入得到的各个实体给合并起来的,我看qas_id分开的sample_id没地方去用它啊?

Yefeiyang-luis commented 2 years ago

第一个问题我明白了,在tokenizer里面它记录了每一个token序号对应的offset,和划分无关,因为offset仅仅是和单词的长度有关的。后面只要空格划分的offset匹配了tokenizer产生的offset,就能记录 加了query后应该从哪里去找原始的始末位置。