使用hanlp训练ner模型时报KeyError: 'average_subwords'错误

训练语料是自己准备的

在 O
格 B-HTL
瑞 I-HTL
斯 I-HTL
黄 I-HTL
金 I-HTL
海 I-HTL
岸 I-HTL
店 I-HTL
开 O
启 O
美 O
好 O
心 O
情 O
! O

发 O
现 O
一 O
个 O
海 B-LOC
南 I-LOC
海 I-LOC
口 I-LOC
一 O
个 O
必 O
打 O
卡 O
的 O
地 O
方 O
, O
美 O
哭 O
了 O
, O
热 O
带 O
雨 O
林 O
中 O
的 O
皇 O
家 O
庄 O
园 O

代码:

class Train(object):
    def __init__(self, save_dir, epoch):
        self.recognizer = TransformerNamedEntityRecognizer()
        self.save_dir = save_dir
        self.average_subwords = False
        # self.trainset = trainset
        # self.testset = testset
        self.pretrained_model = hanlp.pretrained.ner.MSRA_NER_ALBERT_BASE_ZH
        self.epoch = epoch

    def fit(self, trainset, testset):

        logging.info("Training...")
        self.recognizer.fit(trn_data=trainset,
                            dev_data=testset,
                            save_dir=self.save_dir,
                            epochs=self.epoch,
                            max_seq_len=128,
                            average_subwords=self.average_subwords,
                            transformer='albert_base_zh',
                            finetune=self.pretrained_model
                            )
        logging.info("Model saved in {}" % self.save_dir)

    def predict(self, text):
        rec_model = self.recognizer.load(self.save_dir)
        ner_res = rec_model.predict(list(text))
        return ner_res

报错:

请问是什么原因呢?自己排查了好久都不知道。。。

2 Likes

我也碰到这个问题了!!!

如果finetune=hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH,这个模型的话,使用ner_transformer中的TransformerNamedEntityRecognizer(),还是这个错误,我看模型train.log,发现是tf模型,是不是只能使用ner_tf中的TransformerNamedEntityRecognizer()微调。
对了我随便问一个问题,ner中四个预训练模型,是不是使用时都得进过分词才行(中文领域),但是我看如果单纯使用字符级预测,效果也不错。我想知道作者在训练ner模型时,使用的是分词信息还是字符级信息?

已发布的PyTorch的TransformerNamedEntityRecognizer模型都是词颗粒度的,因为做过实验,在上游分词器准确率超过98%时,下游词颗粒度NER显著超过字颗粒度。当然这里的显著指的是3-5%的F1,你人眼不一定感受得到。

但是,TransformerNamedEntityRecognizer的巧妙之处在于,它没有规定输入一定得是词,你也可以训练字符级别的NER,完全取决于你的语料。如果你科学地比较两者,你会发现显著的差异。HanLP自2.1之后不发布字颗粒度的NER模型,就是因为内部实验验证了这一点。

非常感谢作者的耐心回答,目前由于我的工作需要微调MSRA_NER_BERT_BASE_ZH,使其在我特定领域精度更高,我想知道作者在训练MSRA_NER_BERT_BASE_ZH模型时,使用的是您公开的MSRA_NER_CHAR_LEVEL_TRAIN这个训练集吗(我看这是char level),所以说我的特定领域数据集也需要弄成char level的,这样微调效果才好吗?
期待作者的回答!

我这几天尝试看了TransformerNamedEntityRecognizer的源码,一步步调试,但是还是不太清楚,最后一批次句子embedding后[batch,max_sequence_len,embedding_size]中,max_sequence_len是以词为单位,还是字符为单位(就是说embedding向量化,是以词为单位向量化,还是字为单位向量化)

对。微调与原模型保持一致。

你的语料是什么单位,这里的max_sequence_len就是什么单位。

1 Like

作者训练MSRA_NER_BERT_BASE_ZH模型使用char level数据集吗(上面我指的那个),那么我在进行模型预测的时候,我中文就不需要进行分词对吗(因为和训练数据集对应),直接用字颗粒度预测。所以说作者训练的这个MSRA_NER_BERT_BASE_ZH算字颗粒度模型?

目前训练成功,但是 加载模型时,却报一些错误