G:\B_Packages\PycharmProject\ChineseNRE.zip


基于BiLSTM + Attention实现的简单的关系抽取模型,代码效果并不十分理想,代码上传目的是为大家提供基本的实现思路。
资源截图
代码片段和文件信息
import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(1)  #为CPU设置种子用于生成随机数,以使得结果是确定的

class BiLSTM_ATT(nn.Module):
    def __init__(selfinput_sizeoutput_sizeconfigpre_embedding):
        super(BiLSTM_ATTself).__init__()
        self.batch = config[‘BATCH‘]

        self.input_size = input_size
        self.embedding_dim = config[‘embedDING_DIM‘] # 词向量长度
        
        self.hidden_dim = config[‘HIDDEN_DIM‘]
        self.tag_size = output_size # 最终结果状态数,即分类数
        
        self.pos_size = config[‘POS_SIZE‘]
        self.pos_dim = config[‘POS_DIM‘] #位置编码向量长度
        
        self.pretrained = config[‘pretrained‘]

        if self.pretrained:
            # freeze = False 表示训练过程中会更新这些词向量,默认为True 也就是不更新
            self.word_embeds = nn.embedding.from_pretrained(torch.FloatTensor(pre_embedding)freeze=False)
        else:
            self.word_embeds = nn.embedding(self.input_sizeself.embedding_dim)

        self.pos1_embeds = nn.embedding(self.pos_sizeself.pos_dim) # 实体1的embedding
        self.pos2_embeds = nn.embedding(self.pos_sizeself.pos_dim) # 实体2的embedding
        self.dense = nn.Linear(self.hidden_dimself.tag_sizebias=True)
        self.relation_embeds = nn.embedding(self.tag_sizeself.hidden_dim)

        ‘‘‘
            LSTM 输入变为 pos1_dim + pos2_dim + embedding_dim
            LSTM的output 保存了最后一层,每个time step的输出h,如果是双向LSTM,每个time step的输出h = [h正向 h逆向]
            TODO 这里hidden_size=hidden_dim/2 保证了后面BiLSTM输出的维度为(seq_lenbatch_sizehidden_dim)
            注意hidden_size 与 hidden_dim的区分
            hidden_size是单向的LSTM输出的维度
        ‘‘‘
        self.lstm = nn.LSTM(input_size=self.embedding_dim+self.pos_dim*2hidden_size=self.hidden_dim//2num_layers=1 bidirectional=True)
        self.hidden2tag = nn.Linear(self.hidden_dimself.tag_size)

        ‘‘‘
            在嵌入层,LSTM层和倒数第二层上使用drop_out。 
        ‘‘‘
        self.dropout_emb = nn.Dropout(p=0.5)
        self.dropout_lstm = nn.Dropout(p=0.5)
        self.dropout_att = nn.Dropout(p=0.5)
        
        self.hidden = self.init_hidden()

        # nn.Parameter 类型表示会算入计算图内进行求梯度
        self.att_weight = nn.Parameter(torch.randn(self.batch1self.hidden_dim))
        self.relation_bias = nn.Parameter(torch.randn(self.batchself.tag_size1))
        
    def init_hidden(self):
        return torch.randn(2 self.batch self.hidden_dim // 2)
        
    def init_hidden_lstm(self):
        return (torch.randn(2 self.batch self.hidden_dim // 2)
                torch.randn(2 self.batch self.hidden_dim // 2))
    ‘‘‘
        BiLSTM 最后一层的输出 (seq_lenbatch_sizehidden_dim)
        attention的参数H是经过转置的结果:(batch_sizehidden_dimseq_len)
        attention 目的就是根据不同词得到不同词的权重,然后根据权重组合得到整个句子级别的表示 
    ‘‘‘
    def attention(selfH):
        M = torch.tanh(H) # 非线性变换 size:(batch_sizehidden_dimseq_len)
        a = F.softmax(torch.bmm(self.att_weightM)dim=2) # a.Size : (batch_size1seq_len)
        a = torch.transpose(a12) # (batch_sizeseq_len1)
        return to

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-10-26 19:33  ChineseNRE
     目录           0  2019-10-30 11:37  ChineseNRE.idea
     文件         478  2019-10-24 10:38  ChineseNRE.ideaChineseNRE-master.iml
     文件         138  2019-10-24 10:35  ChineseNRE.ideaencodings.xml
     文件         301  2019-10-24 10:35  ChineseNRE.ideamisc.xml
     文件         293  2019-10-24 10:35  ChineseNRE.ideamodules.xml
     文件       29995  2019-10-30 11:37  ChineseNRE.ideaworkspace.xml
     文件        5300  2019-10-26 19:33  ChineseNREBiLSTM_ATT.py
     文件        2069  2019-10-26 12:37  ChineseNREREADME.md
     目录           0  2019-10-26 13:52  ChineseNRE\__pycache__
     文件        3192  2019-10-26 13:52  ChineseNRE\__pycache__BiLSTM_ATT.cpython-36.pyc
     文件        4628  2019-10-26 10:06  ChineseNRE\__pycache__main.cpython-36.pyc
     文件         450  2019-10-26 13:46  ChineseNRE\__pycache__params_config.cpython-36.pyc
     文件        6247  2019-10-26 11:39  ChineseNRE\__pycache__utils.cpython-36.pyc
     目录           0  2019-10-26 09:50  ChineseNREackup
     文件     2943945  2019-10-26 04:00  ChineseNREackupmodel_0005_no_drop_att_score55.pkl
     文件     2943943  2019-10-26 01:39  ChineseNREackupmodel_lr_0001.pkl
     文件     2943959  2019-10-25 23:00  ChineseNREackupmodel_lr_005.pkl
     目录           0  2019-10-26 12:35  ChineseNREdata
     目录           0  2019-10-28 18:45  ChineseNREdatapeople-relation
     文件        8213  2019-10-28 18:45  ChineseNREdatapeople-relationdata_util.py
     文件         119  2019-10-26 10:13  ChineseNREdatapeople-relation
elation2id.txt
     文件    32392893  2019-04-21 14:41  ChineseNREdatapeople-relation rain.txt
     文件     2909442  2019-10-26 12:35  ChineseNREdatapeople_relation_test.pkl
     文件    13815237  2019-10-26 12:35  ChineseNREdatapeople_relation_train.pkl
     文件     2909442  2019-10-26 12:35  ChineseNREdatapeople_relation_validate.pkl
     文件        9047  2019-10-26 15:41  ChineseNREmain.py
     目录           0  2019-10-26 15:07  ChineseNREmodel
     文件     2948058  2019-10-26 15:07  ChineseNREmodelmodel_best.pkl
     文件     2948058  2019-10-26 15:07  ChineseNREmodelmodel_final.pkl
     文件         772  2019-10-26 13:45  ChineseNREparams_config.py
............此处省略2个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)