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

本文介绍使用BiLSTM+attention模型进行中文实体关系抽取的入门教程,包括数据处理、训练过程及准确度评估。提供代码资源,适用于零基础学习者。

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

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

数据处理

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

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

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

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

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

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

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

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

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

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

模型的输出就是人物关系的id,这个数据集里一共有11+1个人物关系。

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

训练<

### 使用BiLSTMAttention机制进行关系抽取 #### 构建模型架构 为了有效提取实体间的关系,可以构建基于BiLSTMAttention机制的神经网络模型。该方法利用了双向长短期记忆网络(BiLSTM),其能捕捉序列数据中的前后向依赖关系,并通过引入注意力机制来增强对重要特征的关注度[^1]。 ```python from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, LSTM, Bidirectional, Dense, Dropout, Attention, Concatenate def build_bilstm_attention_model(max_len, embedding_dim, vocab_size): inputs = Input(shape=(max_len,)) # Embedding layer to convert words into dense vectors of fixed size embed_layer = tf.keras.layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim)(inputs) # Bi-directional LSTM Layer captures context from both directions bilstm_output = Bidirectional(LSTM(units=hidden_units, return_sequences=True))(embed_layer) # Apply dropout regularization drop_out = Dropout(rate=dropout_rate)(bilstm_output) # Define attention mechanism over the sequence outputs attenction_weights = Attention()([drop_out]*2) # Simplified representation # Combine attended features with original ones via concatenation or addition etc. combined_features = Concatenate(axis=-1)([attenction_weights, drop_out]) # Fully connected layers followed by softmax activation function for classification task dense_1 = Dense(dense_units, activation='relu')(combined_features) predictions = Dense(num_classes, activation='softmax')(dense_1) model = Model(inputs=[inputs], outputs=predictions) return model ``` 此代码片段展示了如何定义一个包嵌入层、双向循环单元以及注意模块在内的完整框架结构。值得注意的是,在实际应用过程中还需要考虑更多细节设置,比如超参数调整、损失函数选择等方面的内容[^3]。 #### 数据准备与预处理 在训练之前,需先准备好输入给定模型的数据集并完成必要的转换操作。这通常涉及到词典映射、填充至固定长度等步骤以确保每条样本都具有相同的形状规格以便于批量计算。此外,还需指定合适的批次大小(batch size),学习率(learning rate)等相关配置项[^4]。 ```python import numpy as np from sklearn.model_selection import train_test_split from keras.preprocessing.sequence import pad_sequences from keras.utils.np_utils import to_categorical # Assume `sentences` is a list containing tokenized sentences and labels are one-hot encoded arrays. X_train, X_val, y_train, y_val = train_test_split(sentences, labels, test_size=0.2, random_state=42) word_index = tokenizer.word_index vocab_size = len(word_index)+1 train_seq = [[word_index.get(w, 0) for w in s.split()]for s in X_train] val_seq = [[word_index.get(w, 0) for w in s.split()]for s in X_val] pad_train = pad_sequences(train_seq,maxlen=max_length,padding="post",truncating="post") pad_val = pad_sequences(val_seq,maxlen=max_length,padding="post",truncating="post") y_train_cat = to_categorical(y_train,num_classes=num_class) y_val_cat = to_categorical(y_val,num_classes=num_class) ``` 上述脚本说明了怎样分割原始语料库为训练集和验证集合;接着创建词汇表并将词语转化为索引形式表示;最后按照设定的最大句子长度补齐或截断各实例,并将其标签编码为目标分类格式。
评论 75
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值