如何解决命名实体识别任务的预测结果错误
在使用 RoBERTa 架构训练 NER 任务后,我得到以下结果
{
'eval_loss': 0.003242955543100834,'eval_precision': 0.9959672534053343,'eval_recall': 0.9959672534053343,'eval_f1': 0.9959672534053343,'eval_accuracy': 0.9995624335836689
}
结果通常很高,正如我所料。但这是我的困惑,当我随机输入一组句子(来自训练集)以真正了解模型的性能时。
我的伪代码:
def tokenize_and_align_labels_random(examples,tokenizer):
tokenized_inputs = tokenizer(examples['tokens'],truncation=True,is_split_into_words=True)
return tokenized_inputs
def preprocess_datasets(tokenizer,**datasets) -> Dict[str,Dataset]:
tokenize_ner = partial(tokenize_and_align_labels_random,tokenizer=tokenizer)
return {k: ds.map(tokenize_ner) for k,ds in datasets.items()}
address=Testing_Dataset[Testing_Dataset['address']==1]['text'].apply(clean_doc).tolist()
da_datasets_random_Test = preprocess_datasets(tokenizer,test=Dataset.from_dict({'tokens':address}))
results=da_trainer.predict(da_datasets_random_Test['test'])
predictions=results.predictions
predictions = np.argmax(predictions,axis=2)
# Remove ignored index (special tokens)
true_predictions = [
[label_list[p] for (p,l) in zip(prediction,label) if l != -100]
for prediction,label in zip(predictions,labels)
]
我输入的句子中包含一些分词器词汇表中不存在的词,模型将通过自动生成它们的子标记来为我处理那部分。
这意味着“input_ids”将生成更多用于呈现这些情况的令牌 ID,问题是它们的预测标签也会增加(基于传递给模型的令牌数量)。
例如
-
输入句子:“Giao tôi lê_lai phường hai tân_bình hcm”
-
分词器后的值:
{ 'input_ids': [0,64003,17489,6115,64139,64151,6446,64313,1340,74780,2],'token_type_ids': [0,0],'attention_mask': [1,1,1] }
-
因为“lê_lai”的tokenize是['lê@@','l@@','ai']; "tân_bình" 是 ['tân@@','bình']; "hcm" 是 ['h@@','cm']
我最终得到的结果:
['O','O','B-LOC','I-LOC','O']
事实上,他们的预测应该只有 7 个标签作为输入标记,但现在已经不止这些了。那么大家对此有什么策略吗(我有一个策略,我们可以用更多的标记来训练分词器)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com(将#修改为@)