实体关系抽取:BiLSTM + Attention (含代码+详细注释)

把代码放github上面了:链接地址 (记得给个star哦)

数据集介绍

本文采用的是一份中文数据集(数据质量不高,我们主要目的是展现实体关系抽取过程,掌握方法后可以用于高质量数据集上)

每个样例格式如下:

实体1    实体2    实体间关系    句子xxxxxxxxxxxxxxxxx

示例:

郭全宝 郭启儒    合作 、郭全宝)、我是家长(侯宝林、郭启儒)、武松打虎(侯宝林、郭全宝)、戏剧杂谈(侯宝林、郭启儒)、

数据集共11+1种关系 (包括unknow)

unknown 0
父母 1
夫妻 2
师生 3
兄弟姐妹 4
合作 5
情侣 6
祖孙 7
好友 8
亲戚 9
同门 10
上下级 11

 我们本质上是把关系抽取问题转换成了多分类问题。

 

数据分布

1、获取实体关系分布状况:

标签的分布状况
relation_id    numbers
        0     78642
        2     36889
        1     28864
        5     1
  • 15
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
下面是一个简单的Python代码示例,用于实现基于word2vec+bilstm+crf的实体关系抽取模型: ``` python import gensim import numpy as np import pandas as pd import tensorflow as tf from keras.preprocessing.sequence import pad_sequences from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Embedding, Bidirectional, LSTM, Dense, TimeDistributed from keras_contrib.layers import CRF # 加载预训练的word2vec模型 w2v_model = gensim.models.KeyedVectors.load_word2vec_format('path/to/word2vec/model') # 加载训练数据 train_data = pd.read_csv('path/to/train/data') # 将文本转换为词向量序列 X_train = [] for sentence in train_data['text']: words = sentence.split() word_vectors = [] for word in words: if word in w2v_model: word_vectors.append(w2v_model[word]) else: word_vectors.append(np.zeros(w2v_model.vector_size)) X_train.append(word_vectors) # 对词向量序列进行填充,使其长度相同 X_train = pad_sequences(X_train, padding='post', maxlen=100) # 将标签转换为one-hot编码 y_train = to_categorical(train_data['label'].values) # 构建模型 model = Sequential() model.add(Embedding(input_dim=len(w2v_model.vocab), output_dim=w2v_model.vector_size, weights=[w2v_model.vectors])) model.add(Bidirectional(LSTM(units=128, return_sequences=True))) model.add(TimeDistributed(Dense(units=128, activation='relu'))) crf = CRF(units=len(y_train[0]), sparse_target=True) model.add(crf) # 编译模型 model.compile(optimizer='adam', loss=crf.loss_function, metrics=[crf.accuracy]) # 训练模型 model.fit(X_train, y_train, epochs=10, batch_size=32) # 加载测试数据 test_data = pd.read_csv('path/to/test/data') # 将测试数据转换为词向量序列 X_test = [] for sentence in test_data['text']: words = sentence.split() word_vectors = [] for word in words: if word in w2v_model: word_vectors.append(w2v_model[word]) else: word_vectors.append(np.zeros(w2v_model.vector_size)) X_test.append(word_vectors) # 对词向量序列进行填充,使其长度相同 X_test = pad_sequences(X_test, padding='post', maxlen=100) # 预测测试数据 y_pred = model.predict(X_test) # 将预测结果转换为标签 y_pred_labels = [] for i in range(len(y_pred)): pred_labels = [] for j in range(len(y_pred[i])): pred_labels.append(np.argmax(y_pred[i][j])) y_pred_labels.append(pred_labels) # 输出预测结果 for i in range(len(test_data)): print(test_data['text'][i]) print('Predicted labels:', y_pred_labels[i]) ``` 需要注意的是,上述代码仅供参考,具体实现细节还需要根据实际情况进行调整。同时,该模型的训练和预测需要大量的计算资源和时间,在实际应用中需要进行优化。
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值