Внедрение Bi-LSTM и CRF для задачи анализа паролей в Китае - PullRequest
0 голосов
/ 21 марта 2019

Сейчас я работаю над моделью Bi-LSTM-CRF с keras и keras_contrib для задачи разбора китайского адреса.Я построил обе модели со слоем CRF и без него, и после добавления слоя CRF я получил странный прогноз, повторяющий одну и ту же ошибку.

Address: ['長', '沙', '灣', '億', '利', '工', '業', '中', '心']
Pred: ['d', 'd', 'd', 'b', 'b', 'b', 'b', 'd', 'b']
Ture: ['d', 'd', 'd', 'b', 'b', 'b', 'b', 'b', 'b']

Address: ['銅', '鑼', '灣', '東', '角', '中', '心']
Pred: ['d', 'd', 'd', 'b', 'b', 'd', 'b']
True: ['d', 'd', 'd', 'b', 'b', 'b', 'b']

Символ «中» всегда помечается знаком «d»(район), однако оно должно быть частью названия здания, которое должно быть помечено буквой «b» (здание).中心 имеет значение центра, которое следует рассматривать как единое целое.Пометка 中 с d и 心 как b недопустима.Общее количество обучающих данных составляет 4476, но 1564 из них имеют неправильную метку, и большинство из них содержит неправильную метку пометки «中» как «d».По сравнению с моделью без слоя CRF, существует только 136 неверных прогнозов.Я попытался использовать другие функции активации и оптимизатор и изменил размер вложения или количество нейронов в разных слоях, но оказалось, что он возвращает либо сломанную модель, которая ничего не может предсказать, либо ту же ошибку выше.Я хочу знать, сделал ли я что-то не так в настройках или каковы возможные решения?

input = Input(shape=(max_len,))
model = Embedding(input_dim=n_words + 1, output_dim=20, input_length=max_len, mask_zero=True)(input)
model = Bidirectional(LSTM(units=50, return_sequences=True, recurrent_dropout=0.1))(model) 
model = TimeDistributed(Dense(50, activation="relu"))(model)
crf = CRF(n_tags)
out = crf(model)
model = Model(input, out)
model.compile(optimizer="rmsprop", loss=crf.loss_function, metrics=[crf.accuracy])
print(model.summary())
history = model.fit(X_tr, np.array(y_tr), batch_size=32, epochs=10, validation_split=0.1, verbose=1)
...