在中文地址解析任务上实现Bi-LSTM和CRF

时间:2019-03-21 02:38:05

标签: python parsing keras lstm crf

我现在正在使用带有keras和keras_contrib的Bi-LSTM-CRF模型来进行中文地址解析任务。 我已经建立了带有和不带有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)

0 个答案:

没有答案