Я пытался построить модель BiLSTM - CRF (с вложениями слов и информацией POS) для выполнения задачи NER.По некоторым причинам, независимо от того, какие параметры я пробовал, и я много пробовал, максимальная оценка f1, которую может получить моя модель, составляет около 41,5% для вьетнамцев и 35% для английского (набор данных - Conll2003).
У меня нет никакого намерения стремиться к высочайшей точности искусства, я просто пытаюсь создать себе модель NER для целей обучения.Но из исследовательских работ, которые я читал, даже самая простая модель BiLSTM (без вложений слов) может получить оценку f1 более 70%.
Последовательности обрабатываются и дополняются Tokenizer Кераса:
tokenizer = Tokenizer(lower=False, filters='!"#$%&()*+,-./:;<=>?@[\\]^`{|}~\t\n')
# Make dictionary mapping word to an integer.
tokenizer.fit_on_texts(untag_txt)
words_index = tokenizer.word_index
# Turn sentences into sequences
train_untag_txt = tokenizer.texts_to_sequences(train_untag_txt)
test_untag_txt = tokenizer.texts_to_sequences(test_untag_txt)
# Pad sentence sequences
train_untag_txt = pad_sequences(train_untag_txt, maxlen=50, padding='post', truncating='post')
test_untag_txt = pad_sequences(test_untag_txt, maxlen=50, padding='post', truncating='post')
# Pad tag sequences
train_ner_tags = np.array(pad_sequences(train_ner_tags, maxlen=50, padding='post', truncating='post', value=tag2id['OTHERS']))
test_ner_tags = np.array(pad_sequences(test_ner_tags, maxlen=50, padding='post', truncating='post', value=tag2id['OTHERS']))
Моя модель:
model = Sequential([
Embedding(len(words_index)+1, 218, weights=[embedding_matrix], trainable=False),
Dropout(0.4),
Bidirectional(LSTM(256, kernel_initializer='glorot_normal', return_sequences=True,
bias_initializer='zeros', recurrent_dropout=0.4)),
Dropout(0.4),
Bidirectional(LSTM(256, kernel_initializer='glorot_normal', return_sequences=True,
bias_initializer='zeros', recurrent_dropout=0.4)),
Dropout(0.4),
Bidirectional(LSTM(256, kernel_initializer='glorot_normal', return_sequences=True,
bias_initializer='zeros', recurrent_dropout=0.4)),
Dropout(0.4),
Bidirectional(LSTM(256, kernel_initializer='glorot_normal', return_sequences=True,
bias_initializer='zeros', recurrent_dropout=0.4)),
CRF(9, kernel_initializer='glorot_normal', sparse_target=True)
Бумага, в которой я посмотрел f1 баллов различных типовмодель: https://www.aclweb.org/anthology/Q16-1026