如何解决Flair 训练德国 NER 模型:Dev,f1 得分接近 0.0,为什么模型不学习?
我首先使用 Spacy 训练了我的 NER 模型,微型 F1 分数为 64.7%(8 类)。下一步我想训练Flair,希望得到更好的结果。 当然,spacy 格式的数据会通过一些自定义代码转换为适当的 Flair 语料库。
关于输入数据的信息: 语料库:“语料库:4037 个训练 + 840 个开发 + 448 个测试句子”
在训练集中: '文化' (1512)、'Erreger' (1376)、'Mittel' (1083)、'Auftreten' (583)、 '时代'(285)、'Witterung'(238)、'BBCH_Stadium'(214)、'Ort'(161)
在测试集中: 'Erreger' (390)、'Mittel' (311)、'Kultur' (221)、'BBCH_Stadium' (148)、 'Aufreten' (54),'Witterung' (54),'Ort' (53),'Zeit' (40)
语料库看起来像这样:
Der O
Schwerpunkt O
der O
Unkrautbekämpfung O
in O
Kartoffeln S-Kultur
liegt O
im O
Vorauflauf S-BBCH_Stadium
. O
Sind O
die O
mechanischen O
Maßnahmen O
abgeschlossen O,O
kann O
die O
erste O
Herbizidbehandlung O
auf O
gut O
abgesetzten O
Dämmen O,O
je O
nach O
Produkt O
bis O
kurz B-BBCH_Stadium
vor I-BBCH_Stadium
dem I-BBCH_Stadium
Durchstoßen E-BBCH_Stadium
der O
Kartoffeln S-Kultur
( O
kvD O
) O,O
erfolgen O
. O
训练代码:
from flair.datasets import ColumnCorpus
from flair.embeddings import TokenEmbeddings,WordEmbeddings,StackedEmbeddings,FlairEmbeddings
from flair.models import SequenceTagger
from flair.trainers import ModelTrainer
from typing import List
import time
start_time = time.time()
columns = {0: 'text',1: 'ner'}
data_path = "path/to/data"
# initializing the corpus
corpus: Corpus = ColumnCorpus(data_path,columns,train_file = 'bb_train.txt',# dev_file = 'bb_test_sm_sm.txt',test_file = 'bb_test_sm_sm.txt',)
# tag to predict
tag_type = 'ner'
tag_dictionary = corpus.make_tag_dictionary(tag_type=tag_type)
word_vectors = gensim.models.KeyedVectors.load_word2vec_format('german.model',binary=True)
word_vectors.save('german.model.gensim')
german_embedding = WordEmbeddings('german.model.gensim')
# init forward embedding for German
flair_embedding_forward = FlairEmbeddings('de-forward')
flair_embedding_backward = FlairEmbeddings('de-backward')
embedding_types: List[TokenEmbeddings] = [
german_embedding,flair_embedding_forward,flair_embedding_backward,]
embeddings: StackedEmbeddings = StackedEmbeddings(embeddings=embedding_types)
tagger: SequenceTagger = SequenceTagger(hidden_size=256,embeddings=embeddings,tag_dictionary=tag_dictionary,tag_type=tag_type,use_crf=True)
trainer : ModelTrainer = ModelTrainer(tagger,corpus)
trainer.train('resources/taggers/ner_bb',learning_rate=0.01,mini_batch_size=64,max_epochs=5,)
print(f"It took {time.time() - start_time}")
丢失日志是:
EPOCH TIMESTAMP BAD_EPOCHS LEARNING_RATE TRAIN_LOSS DEV_LOSS DEV_PRECISION DEV_RECALL DEV_F1
1 10:42:23 0 0.0100 42.28642028570175 28.403223037719727 0.0197 0.0748 0.0312
2 10:43:48 0 0.0100 17.928552985191345 14.348283767700195 0.3089 0.0312 0.0567
3 10:45:10 0 0.0100 10.604630261659622 13.98863697052002 0.3089 0.0312 0.0567
4 10:46:36 1 0.0100 10.26459190249443 13.614569664001465 0.3579 0.0279 0.0518
5 10:47:55 2 0.0100 9.987788125872612 13.339178085327148 0.3333 0.0164 0.0313
为什么分数这么低?该模型没有学到任何东西。 我一直尝试到 10 个 epoch 并且结果相同。
我需要调整一些参数吗?我的语料库有问题吗?
如果你有这方面的经验,谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。