零基础入门--中文实体关系抽取(BiLSTM+attention,含代码)

前面写过一片实体抽取的入门,实体关系抽取就是在实体抽取的基础上,找出两个实体之间的关系。

本文使用的是BiLSTM+attention模型,代码在这里,不定期对代码进行修改添加优化。

数据处理

其实数据处理的方法有很多,我用的是近两年英文论文使用的比较多的词向量+位置向量的方法。

中文实体关系抽取的数据实在是太难找了,我现在只有忘记在哪里找到的一个人物关系数据集。希望同学们能分享一些其他的数据集。

先看原始数据(其实原始数据里好多句子我都看不出来其中人物实体的关系):

霍启山 霍启刚 兄弟姐妹 两位弟弟:霍震霆与朱玲玲育有三子,大公子霍启山、二公子霍启刚、三公子霍启仁

先是两个实体,然后是两个实体之间的关系,最后是两个实体所在的句子,都用空格分开。

所以数据处理先将这4部分分开。

先将句子转换成词向量,或者叫字向量。具体方法是建立word2id词典,把每个字都转换成id。

然后记录句子中每个字距离两个实体的距离。比如前面的例子,霍启山是第一个实体,这里假设实体后面为正,汉字和标点符号都计算在内,句子开始“两”和实体一的距离是-20,“位”和实体一的距离是-19。。。最后一个字“仁”和实体一的距离为16。

每个字距离实体二的距离同上。

这样每个字都有了一个字向量和两个距离向量,将这三个向量结合起来,就可以作为模型的输入了

  • 34
    点赞
  • 272
    收藏
    觉得还不错? 一键收藏
  • 75
    评论
下面是一个简单的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]) ``` 需要注意的是,上述代码仅供参考,具体实现细节还需要根据实际情况进行调整。同时,该模型的训练和预测需要大量的计算资源和时间,在实际应用中需要进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 75
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值