ShannonAI / mrc-for-flat-nested-ner

Code for ACL 2020 paper `A Unified MRC Framework for Named Entity Recognition`

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于msra的实验复现,训练因某几条特殊数据报错

another1s opened this issue · comments

您好!

我这边使用提供的脚本试图对msra实验进行复现。发现一个问题。在训练数据中几条带有公司股票名称的时候,会造成entity start和end在encode之后丢失的情况,导致训练报错

比如下面这条,如果我数据集没下错的话?
“1 美 亚 股 份 3 2 . 6 6 2 民 族 集 团 2 2 . 3 8 3 鲁 石 化 a 1 9 . 1 1 4 四 川 湖 山 1 7 . 0 9 5 太 原 刚 玉 1 0 . 5 8 1 咸 阳 偏 转 1 6 . 1 1 2 深 华 发 a 1 5 . 6 6 3 渝 开 发 a 1 5 . 5 2 4 深 发 展 a 1 3 . 8 9 5 深 纺 织 a 1 3 . 2 2 1 太 极 实 业 2 3 . 2 2 2 友 好 集 团 2 2 . 1 4 3 双 虎 涂 料 2 0 . 2 0 4 新 潮 实 业 1 5 . 5 8 5 信 联 股 份 1 2 . 5 7 1 氯 碱 化 工 2 1 . 1 7 2 百 隆 股 份 1 5 . 6 4 3 贵 华 旅 业 1 5 . 1 5 4 南 洋 实 业 1 4 . 5 0 5 福 建 福 联 1 3 . 8 0"

这条数据中在预处理时获得的entity 鲁石化a所对应的(start,end)应该为(21, 25),但用vocab.txt初始化的bertTokenizer在encode的时候,会把非中文字符先归并再encode,体现在encode以后的offset上就是只有”鲁石化a”只会对应(21,24)而后面那个a19被归并到一起去,变成(24,26)了

这样的结果就造成在encode以后,run_mrc_dataset.py里面目前的写法根本无法正常处理拼接了query和special token以后的index 偏移,因为entity丢失了一部分。总而言之就是,一旦entity中出现了多个非中文字符,非中文字符的对应的offset就会丢失

我这里的解法是,先根据原始(start,end)单独把context里的entities encode,再把剩余部分encode,最后再拼接。不知道贵司有没有什么好的办法?我反正是无法通过原版的脚本复现实验

您好,
麻烦请您参考https://github.com/ShannonAI/dice_loss_for_NLP/blob/master/datasets/mrc_ner_dataset.py 中处理tokenizer处理之后entity start/end position的代码。
并且依据您提供的例子,测试样本如下:
http://github.com/xiaoya-li/mrc-for-flat-nested-ner/blob/master/tests/illegal_entity_boundary.py

结果输出为:
test_result

非常感谢!

您好,
麻烦请您参考https://github.com/ShannonAI/dice_loss_for_NLP/blob/master/datasets/mrc_ner_dataset.py 中处理tokenizer处理之后entity start/end position的代码。
并且依据您提供的例子,测试样本如下:
http://github.com/xiaoya-li/mrc-for-flat-nested-ner/blob/master/tests/illegal_entity_boundary.py

结果输出为:
test_result

非常感谢!

测试了可用,多谢回复!

hi,这个代码迁移过去好像少个label_mask没定义
label_mask = [
(0 if token_idx <= first_sep_token or token_idx == end_sep_token else 1)
for token_idx in range(len(non_pad_tokens))
]