2

我首先使用 Spacy 训练了我的 NER 模型,其微 F1 分数为 64.7%(8 类)。下一步我想训练Flair,希望能得到更好的成绩。当然,spacy 格式的数据将通过一些自定义代码转换为适当的 Flair 语料库。

有关输入数据的信息:语料库:“语料库:4037 个训练 + 840 个开发 + 448 个测试句子”

在训练集中:'Kultur' (1512), 'Erreger' (1376), 'Mittel' (1083), 'Auftreten' (583), 'Zeit' (285), 'Witterung' (238), 'BBCH_Stadium' ( 214),“奥特”(161)

在测试集中:“Erreger”(390)、“Mittel”(311)、“Kultur”(221)、“BBCH_Stadium”(148)、“Auftreten”(54)、“Witterung”(54)、“Ort”( 53),“时代”(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 和相同的结果。

我需要调整一些参数吗?我的语料库有问题吗?

如果你有这方面的经验,谢谢。

4

0 回答 0