BERT-BiLSTM-CRF-NER-pytorch icon indicating copy to clipboard operation
BERT-BiLSTM-CRF-NER-pytorch copied to clipboard

出现wordPiece应该怎么办?

Open yysirs opened this issue 4 years ago • 13 comments

这样导致原本的word和token之间对应不上。

yysirs avatar Jan 11 '21 02:01 yysirs

理论上按照我的预处理方法处理出的数据应该不会有wordPiece出现,实在什么情况出现的该问题呢。

hertz-pj avatar Jan 22 '21 06:01 hertz-pj

理论上按照我的预处理方法处理出的数据应该不会有wordPiece出现,实在什么情况出现的该问题呢。

您好,我在用英文数据集跑的时候会出现这样的问题,请问该如何解决?谢谢你。

Daniel19960601 avatar Feb 24 '21 15:02 Daniel19960601

在train的时候不去管他,在test的时候,如果有wordPiece出现,只保留第一个词。这样保证词的数量不变

yysirs avatar Feb 25 '21 01:02 yysirs

if mode == "test" and len(token) > 1: token = token[0]

yysirs avatar Feb 25 '21 01:02 yysirs

if mode == "test" and len(token) > 1: token = token[0]

您好,感谢回复。 可能是我描述不到位,我遇到的问题是: 数据集使用的Conll2003,Bert模型使用的是bert-base-cased。运行时出现如下错误:

File "D:\python-workspace\BERT-BiLSTM-CRF-NER-pytorch-master\utils.py", line 162, in convert_examples_to_features assert len(ori_tokens) == len(ntokens), f"{len(ori_tokens)}, {len(ntokens)}, {ori_tokens}, {ntokens}" AssertionError: 3, 8, ['[CLS]', '-DOCSTART-', '[SEP]'], ['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']

可见,是tokenizer将单词切分了,导致assert len(ori_tokens) == len(ntokens)不能通过,请问如何解决?感谢您。

Daniel19960601 avatar Feb 26 '21 03:02 Daniel19960601

不好意思,之前没看到。 在train的时候,就是不考虑是否和之前的句子长度是否一样长,所以可以删掉你的这个assert。 在test的时候为了保证标签的输出一致,所以我只考虑了第一个分词

yysirs avatar Mar 04 '21 06:03 yysirs

不好意思,之前没看到。 在train的时候,就是不考虑是否和之前的句子长度是否一样长,所以可以删掉你的这个assert。 在test的时候为了保证标签的输出一致,所以我只考虑了第一个分词

只保留第一个分词不会影响模型的预测结果吗?

Daniel19960601 avatar Mar 16 '21 09:03 Daniel19960601

可以尝试一下这样的做法。个人认为影响不是太大

yysirs avatar Mar 17 '21 03:03 yysirs

可以尝试一下这样的做法。个人认为影响不是太大

好,我尝试一下,感谢您的回复。 您也是用英文数据的时候出现的这个情况吗?

Daniel19960601 avatar Mar 17 '21 03:03 Daniel19960601

if mode == "test" and len(token) > 1: token = token[0]

只考虑第一个好像需要 token = [token[0]], 否则后面在for m in range(len(token)):还是会分开 🙂

Daniel19960601 avatar Mar 28 '21 04:03 Daniel19960601

我刚好也碰到这个问题,做英文ner,用wordpiece方法分词,就以[['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']为例,我喂给bert的数据集features里tag_id是就只给第一个子词'do'原来’-docstart-‘的标签,其他的词用比如-100代替?那crf层的数据输入中mask也许要屏蔽掉除第一个字词的其他词嘛,输出结果又会是什么样的呢。

altctrl00 avatar Aug 26 '21 12:08 altctrl00

我刚好也碰到这个问题,做英文ner,用wordpiece方法分词,就以[['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']为例,我喂给bert的数据集features里tag_id是就只给第一个子词'do'原来’-docstart-‘的标签,其他的词用比如-100代替?那crf层的数据输入中mask也许要屏蔽掉除第一个字词的其他词嘛,输出结果又会是什么样的呢。

我翻了下pytorch-crf源码 它的input_mask中所有的padding只在右边,所以就会是错误的

altctrl00 avatar Aug 27 '21 09:08 altctrl00

我刚好也碰到这个问题,做英文ner,用wordpiece方法分词,就以[['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']为例,我喂给bert的数据集features里tag_id是就只给第一个子词'do'原来’-docstart-‘的标签,其他的词用比如-100代替?那crf层的数据输入中mask也许要屏蔽掉除第一个字词的其他词嘛,输出结果又会是什么样的呢。

我翻了下pytorch-crf源码 它的input_mask中所有的padding只在右边,所以就会是错误的

之前确实没有考虑word piece的问题。这里我建议可能如果是word piece后的结果,也按照第一个开头的token标B,其他标注为I来进行标注,貌似比用-100合理一些,可以做实验验证一下。

hertz-pj avatar Aug 27 '21 12:08 hertz-pj