基于 global pointer 实体抽取。

长度为n的序列 有n/2(1+n)个 子序列   刚好是 文本长度*文本长度 的正方形 从对角线开始向上全部的格子数量

1  2    3       4          n

1 1+2 1+2+3 1+2+3+4 …. n/2(1+n)

上图。每个格子代表一种可能都是把实体当作一个整体的可能,北京为一个地名 竖边列为起始坐标 横列为结束坐标。

代码部分简化预处理逻辑

model_state_dict_dir = os.path.join(./outputs,cluener,2022-03-15_02:47:49)

ent2id = load_data(./datasets/cluener/ent2id.json)   = {'address': 0, 'book': 1, 'company': 2, 'game': 3, 'government': 4, 'movie': 5, 'name': 6, 'organization': 7, 'position': 8, 'scene': 9} 全部类别

ent_type_size = 10  类别个数

model = GlobalPointer(encoder, ent_type_size, 64)

encoder得到bert输出,ent_type_size 10类,每个位置q,k 64维。

加载数据  全部文本长度必须 小于预设的  128 , 假如全部文本最长是52,那么全部长度设为52

浙商银行企业信贷部叶老桂博士则从另一个角度对五道门槛进行了解读。叶老桂认为,对目前国内商业银行而言,

转换为一下:

ent2token_spans  [(10, 12, 'name'), (1, 4, 'company')]

labels.shape = 10,128,128 ->name的平面 10,12 =1 和 company的平面 1,4 =1

inpus_id = tensor([ 101, 3851, 1555, 7213, ..., 6241, 8024,  102])  len 52

attention_mask = tensor([1, 1, 1,....1, 1])     len 52

token_type_ids = tensor([0, 0, 0,.....0, 0, 0])  len 52

# 了解

model.train() 启用 Batch Normalization 和 Dropout

model.eval()  不启用 Batch Normalization 和 Dropout

train_dataloader : len = 79    79*64 =5000 条数据

一个批次推理:

1、

context_outputs = self.encoder(input_ids, attention_mask, token_type_ids)

context_outputs[0]      [64, 52, 768]

context_outputs[1]      [64, 768]

2、

self.dense = nn.Linear(self.hidden_size, self.ent_type_size * self.inner_dim * 2) = (768,10*64*2)

outputs = self.dense(context_outputs[0]) 得到 torch.Size([64, 52, 1280])

3、

生成 qw, kw =torch.Size([64, 52, 10, 64]),torch.Size([64, 52, 10, 64])

(qRm).T(Rnk) =q.T (Rn-m)k 具有相对位置关系

矩阵转置 公式( AB)^T = B^T*A^T

由于Rm的稀疏性,所以直接用矩阵乘法来实现会很浪费算力,推荐通过下述方式来实现RoPE

此处置讨论 批量1,当前类(0或者1,2,,9其中一类)时:

其中m为当前字符位置比如,0,1,2,3,4,….51

上述公式只是 一个位置的64维度向量q所需的操作,同理k向量一样

实际上:

句子长度(52,64) 52个64维q向量 做上面公式操作       ①

句子长度(52,64) 52个64维k向量 做上面公式操作       ②

然后①、②向量求内积就是得分 52*52个得分

10个类别,相当于(10,52,52)矩阵的得分。

其中θi=10000^−2(i/d),可以带来一定的远程衰减性

θ代码实现

indices = torch.arange(0, 64 // 2, dtype=torch.float)

indices = torch.pow(10000, -2 * indices / 64)

多标签分类

公式解释

 

代码解释

y_true = [0,1,0,1,0,1]

y_pred = [0,0.32,0,0.24,0,0.44]

处理后为这样

y_pred_neg = [ 0.e+00 -1.e+12  0.e+00 -1.e+12  0.e+00 -1.e+12,0]                  

y_pred_pos = [-1.0e+12 -3.2e-01 -1.0e+12 -2.4e-01 -1.0e+12 -4.4e-01,0]

最后多加了一个0 是因为公式里面log(1+sumexp)中的1对应即e^0

exp^(很大的负数为0),即exp(-1.e+12) = 0

对应log(1+sumexp(负样本集合时)) 对应正样本置0

对应log(1+sumexp(正样本集合时)) 对应负样本置0

pos=np.log(math.exp(-0.32)+math.exp(-0.24)+math.exp(-0.44)+1)
neg=np.log(math.exp(0)+math.exp(0)+math.exp(0)+1)

res = pos+neg

实体关系匹配

梁又琳的老公是北京的张明,张丽丽的老公是台湾的张东方。
[['梁又琳', '丈夫s_人物'], ['张丽丽', '丈夫s_人物']] ######## [['张明', '丈夫o_人物'], ['张东方', '丈夫o_人物']] 
即 s_同一类别有多个
那么 梁又琳 去找 丈夫o_的张明 和 丈夫o_的张东方 去比较 计算距离(相对位置距离+(如果有,,。|距离额外加50或100,否则加0))距离较近的匹配。
同理 张丽丽

["大女遭遇怪爸爸","主演s_影视作品"] ######## ["梁又琳","主演o_人物"],
即 s_同一类只有一个
那么 主演s_ 就去 找 主演o_  只有1个s_时可以对多个o_

有了实体对 可以送入bert在cls端进行多分类(包含无)

输入

训练时 对于每个句子 样本抽取 无的组合, 每个组个为一个样本,附加全部文本。然后全部含无样本,每次迭代 随机无关系的样本,只选取各类样本的均值。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值