BERT-BiLSTM-CRF-NER-pytorch
BERT-BiLSTM-CRF-NER-pytorch copied to clipboard
出现wordPiece应该怎么办?
这样导致原本的word和token之间对应不上。
理论上按照我的预处理方法处理出的数据应该不会有wordPiece出现,实在什么情况出现的该问题呢。
理论上按照我的预处理方法处理出的数据应该不会有wordPiece出现,实在什么情况出现的该问题呢。
您好,我在用英文数据集跑的时候会出现这样的问题,请问该如何解决?谢谢你。
在train的时候不去管他,在test的时候,如果有wordPiece出现,只保留第一个词。这样保证词的数量不变
if mode == "test" and len(token) > 1: token = token[0]
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)不能通过,请问如何解决?感谢您。
不好意思,之前没看到。 在train的时候,就是不考虑是否和之前的句子长度是否一样长,所以可以删掉你的这个assert。 在test的时候为了保证标签的输出一致,所以我只考虑了第一个分词
不好意思,之前没看到。 在train的时候,就是不考虑是否和之前的句子长度是否一样长,所以可以删掉你的这个assert。 在test的时候为了保证标签的输出一致,所以我只考虑了第一个分词
只保留第一个分词不会影响模型的预测结果吗?
可以尝试一下这样的做法。个人认为影响不是太大
可以尝试一下这样的做法。个人认为影响不是太大
好,我尝试一下,感谢您的回复。 您也是用英文数据的时候出现的这个情况吗?
if mode == "test" and len(token) > 1: token = token[0]
只考虑第一个好像需要 token = [token[0]], 否则后面在for m in range(len(token)):还是会分开 🙂
我刚好也碰到这个问题,做英文ner,用wordpiece方法分词,就以[['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']为例,我喂给bert的数据集features里tag_id是就只给第一个子词'do'原来’-docstart-‘的标签,其他的词用比如-100代替?那crf层的数据输入中mask也许要屏蔽掉除第一个字词的其他词嘛,输出结果又会是什么样的呢。
我刚好也碰到这个问题,做英文ner,用wordpiece方法分词,就以[['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']为例,我喂给bert的数据集features里tag_id是就只给第一个子词'do'原来’-docstart-‘的标签,其他的词用比如-100代替?那crf层的数据输入中mask也许要屏蔽掉除第一个字词的其他词嘛,输出结果又会是什么样的呢。
我翻了下pytorch-crf源码 它的input_mask中所有的padding只在右边,所以就会是错误的
我刚好也碰到这个问题,做英文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合理一些,可以做实验验证一下。