Python PYBERT-NLP在命名实体识别中的应用

Python PYBERT-NLP在命名实体识别中的应用,python,nlp,data-science,named-entity-recognition,huggingface-transformers,Python,Nlp,Data Science,Named Entity Recognition,Huggingface Transformers,我已经为made1.0数据集使用了谷歌by的PyTorch实现很长一段时间了。直到上一次(2月11日),我一直在使用该库,通过微调模型,我的命名实体识别任务得到了F分数0.81。但本周,当我运行与先前编译和运行的代码完全相同的代码时,它在执行此语句时抛出了一个错误: input_ids = pad_sequences([tokenizer.convert_tokens_to_ids(txt) for txt in tokenized_texts], maxlen=MAX_LEN, dtype="

我已经为made1.0数据集使用了谷歌by的PyTorch实现很长一段时间了。直到上一次(2月11日),我一直在使用该库,通过微调模型,我的命名实体识别任务得到了F分数0.81。但本周,当我运行与先前编译和运行的代码完全相同的代码时,它在执行此语句时抛出了一个错误:

input_ids = pad_sequences([tokenizer.convert_tokens_to_ids(txt) for txt in tokenized_texts], maxlen=MAX_LEN, dtype="long", truncating="post", padding="post")
ValueError:令牌索引序列长度大于指定的长度 此BERT模型的最大序列长度(632>512)。运行这个 通过BERT的序列将导致索引错误

完整代码可在本文档中找到

为了避免这个错误,我将上面的语句修改为下面的语句,采用任何序列的前512个标记,并根据BERT的要求进行必要的更改,将[SEP]的索引添加到截断/填充序列的末尾

input_ids = pad_sequences([tokenizer.convert_tokens_to_ids(txt[:512]) for txt in tokenized_texts], maxlen=MAX_LEN, dtype="long", truncating="post", padding="post")
结果不应该改变,因为我只考虑序列中的前512个标记,然后将其截断为75个作为我的标记(MAX_LEN=75),但我的F分数下降到0.40,我的精度下降到0.27,而回忆保持不变(0.85)。我无法共享数据集,因为我已签署了保密条款,但我可以保证已完成BERT要求的所有预处理,并且所有扩展令牌(如(Johanson-->Johan###son)已标记为X,并在预测后替换,如中所述


有没有其他人遇到过类似的问题,或者可以详细说明这个问题可能是什么,或者PyTorch(Huggingface)的人最近做了哪些改变?

我已经找到了解决办法。 使用pytorch pretrained bert==0.4.0运行相同的代码可以解决此问题,并将性能恢复到正常状态。 在新的更新中,BERT标记器或BERTForTokenClassification中的模型性能受到了影响。 希望拥抱的脸能很快解决这个问题。:)

pytorch预训练bert==0.4.0,测试F1分数:0.82

pytorch预训练bert==0.6.1,测试F1分数:0.41


谢谢。

我认为您应该使用
batch\u encode\u plus
和掩码输出以及编码

请参阅中的批次编码