最近无意中发现了一份某人自己注释的经济领域数据集,但是只是采用了简单的方法进行实体关系抽取,闲来之余,便将新关注的attention机制加以深度学习再一次实现该实体关系抽取,废话不多说,下面开始进入正题;
数据集描述:
该数据集的收集者可能参考了某比赛数据集(竟然有从属关系),定义了5种实体关系,其分别为:股票关系;买卖关系;从属关系;角色关系;合作关系;
其五种数据的关系展示分别如下:
<宣亚国际终止 >收购 <映客 >股票 巨量 封死 跌停 ----股票关系
日前 <永辉超市 >公告 称 <腾讯 >拟 42 亿元 受让 5% 公司 股份 ----买卖关系
e公司 讯 深交所 12 月 18 日 消息 指数 编制 规则 <深圳证券交易所> <深圳证券信息有限公司> 2018 年 1 月 第一个 交易日 深证 成指 深证 100 中小板 指 创业板 指 创新 指数 实施 样本股 定期 调整----从属关系
来源 中国 证券报 · 中证网 中证网 讯 12 月 17 日 中国 证券报 记者< 雅百特> 官网 获悉 公司 12 月 15 日 遭 证监会 行政处罚 一事 雅百特 董事长 <陆永> 发表 公司 投资者 员工 公开 致歉信----角色关系
经济 成 消费 升级 推手 <美柚> <广誉远> 跨界 合作----合作关系
模型构建:
虽然有些关系构建的不是那么精确,但是也确实存在那些关系,于是,我们就构建了词级attention机制+双向LSTM进行关系抽取;
实验环境:python3.5
词向量采用word2vec进行训练,也可以找训练好的直接用;
核心代码:
def attention(inputs, single_attention_vector=False):#attention机制
time_steps = K.int_shape(inputs)[1]
input_dim = K.int_shape(inputs)[2]
a = Permute((2, 1))(inputs)
a = Dense(time_steps, activation='softmax')(a)
if single_attention_vector:
a = Lambda(lambda x: K.mean(x, axis=1))(a)
a = RepeatVector(input_dim)(a)
a_probs = Permute((2, 1))(a)
output_attention_mul = Multiply()([inputs, a_probs])
return output_attention_mul
def bilstm(X_train, y_train,X_test, y_test):
inputs = Input(shape=(TIME_STEPS, INPUT_DIM))
drop1 = Dropout(0.3)(inputs)
lstm_out = Bidirectional(LSTM(lstm_units, return_sequences=True), name=‘bilstm’)(drop1)
attention_mul = attention(lstm_out)
attention_flatten = Flatten()(attention_mul)
drop2 = Dropout(0.25)(attention_flatten)
output = Dense(10, activation=‘sigmoid’)(drop2)
model = Model(inputs=inputs, outputs=output)
model.compile(optimizer=‘adam’, loss=‘categorical_crossentropy’, metrics=[‘accuracy’])
print(model.summary())
print(‘Training————’)
model.fit(X_train, y_train, epochs=10, batch_size=10)
print(‘Testing————–’)
loss, accuracy = model.evaluate(X_test, y_test)
print(‘test loss:’, loss)
print(‘test accuracy:’, accuracy)
最终的结果大家可以自行测试;
核心代码在这里已经给大家了,像什么embeding输入啦等等,大家可以自行实现,应该比较简单把!