深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)【下篇】

news2024/9/28 11:21:16

在这里插入图片描述
【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

在这里插入图片描述
专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等

本专栏主要方便入门同学快速掌握相关知识。后续会持续把深度学习涉及知识原理分析给大家,让大家在项目实操的同时也能知识储备,知其然、知其所以然、知何由以知其所以然。

声明:部分项目为网络经典项目方便大家快速学习,后续会不断增添实战环节(比赛、论文、现实应用等)

专栏订阅:

  • 深度学习入门到进阶专栏
  • 深度学习应用项目实战篇

2.BiLSTM+CRF实现命名实体识别

2.3 CRF建模的损失函数

前边我们讲到,CRF能够帮助我们以一种全局的方式建模,在所有可能的路径中选择效果最优,分数最高的那条路径。那么我们应该怎么去建模这个策略呢,下面我们来具体谈谈。

image-20210416135113033

图5 CRF解码过程图

图5展示了CRF的工作图,现在我们有一串输入 x = [ x 0 , x 1 , x 2 , x n ] x=[x_0, x_1, x_2, x_n] x=[x0,x1,x2,xn](这里的 x x x是文本串对应的发射分数,每个字词 x i x_i xi都对应着一个发射分数向量,也就是前边提到的标签向量,该向量的维度就是标签数量),期待解码出相应的标签序列 y = [ y 0 , y 1 , y 2 , . . . , y n ] y=[y_0, y_1,y_2, ..., y_n] y=[y0,y1,y2,...,yn],形式化为对应的条件概率公式如下:

( y ∣ x ) = P ( y 0 , y 1 , . . . , y n ∣ x 0 , x 1 , . . . , x n ) (y|x) = P(y_0,y_1,...,y_n|x_0,x_1,...,x_n) (yx)=P(y0,y1,...,ynx0,x1,...,xn)

在第2节我们提到,CRF的解码策略在所有可能的路径中,找出得出概率最大,效果最优的一条路径,那这个标签序列就是模型的输出,假设标签数量是 k k k,文本长度是 n n n,显然会有 N = k n N=k^n N=kn条路径,若用 S i S_i Si代表第 i i i条路径的分数,那我们可以这样去算一个标签序列出现的概率:

P ( S i ) = e S i ∑ j N e S j P(S_i)=\frac{e^{S_i}}{\sum_j^{N}{e^{S_j}}} P(Si)=jNeSjeSi

现在我们有一条真实的路径 r e a l real real,即我们期待CRF解码出来的序列就是这一条。那它的分数可以表示为 s r e a l s_{real} sreal,它出现的概率就是:

P ( S r e a l ) = e S r e a l ∑ j N e S j P(S_{real})=\frac{e^{S_{real}}}{\sum_j^{N}{e^{S_j}}} P(Sreal)=jNeSjeSreal

所以我们建模学习的目的就是为了不断的提高 P ( S r e a l ) P(S_{real}) P(Sreal)的概率值,这就是我们的目标函数,当目标函数越大时,它对应的损失就应该越小,所以我们可以这样去建模它的损失函数:

l o s s = − P ( S r e a l ) = − e S r e a l ∑ j N e S j loss=-P(S_{real})=-\frac{e^{S_{real}}}{\sum_j^{N}{e^{S_j}}} loss=P(Sreal)=jNeSjeSreal

为方便求解,我们一般将这样的损失放到log空间去求解,因为log函数本身是单调递增的,所以它并不影响我们去迭代优化损失函数。

l o s s = − l o g e S r e a l ∑ j N e S j = − ( l o g ( e S r e a l ) − l o g ( ∑ j N e S j ) ) = l o g ( ∑ j N e S j ) − l o g ( e S r e a l ) = l o g ( e S 1 + e S 2 + . . . + e S N ) − S r e a l \begin{align} loss &= -log \frac{e^{S_{real}}}{\sum_j^{N}{e^{S_j}}} \\ &= -(log(e^{S_{real}}) - log(\sum_j^{N}{e^{S_j}})) \\ &= log(\sum_j^{N}{e^{S_j}}) - log(e^{S_{real}}) \\ &= log(e^{S_1}+e^{S_2}+...+e^{S_N}) - S_{real} \\ \end{align} loss=logjNeSjeSreal=(log(eSreal)log(jNeSj))=log(jNeSj)log(eSreal)=log(eS1+eS2+...+eSN)Sreal

千呼万唤始出来,这就是我们CRF建模的损失函数了。我们整个BiLSTM+CRF建模的目的就是为了让这个函数越来越小。从这个损失函数可以看出,这个损失函数包含两部分:单条真实路径的分数 S r e a l S_{real} Sreal,归一化项 l o g ( e S 1 + e S 2 + . . . + e S N ) log(e^{S_1}+e^{S_2}+...+e^{S_N}) log(eS1+eS2+...+eSN),即将全部的路径分数进行 l o g _ s u m _ e x p log\_sum\_exp log_sum_exp操作,即先将每条路径分数 S i S_i Si进行 e x p ( S i ) exp(S_i) exp(Si),然后再将所有的项加起来,最后取 l o g log log值。

讲到这里,有的同学可能会有疑惑,这里的每条路径分数应该怎么算呢?接下来,我们就来解决这个问题。

2.4 单条路径的分数计算

在开始之前,我们再来做一些约定,前边我们提到了发射分数和转移分数,假设 E E E代表发射分数矩阵, T T T代表转移分数矩阵, n n n代表文本序列长度, t a g _ s i z e tag\_size tag_size代表标签的数量。另外为方便书写,我们为每个标签编个id号(参考图5中涉及到的标签),如图6所示。

image-20210416135218612

图6 Tag和Tag Id 对应表

其中, E E E的shape为 [ n , t a g _ s i z e ] [n, tag\_size] [n,tag_size],每行对应着一个文本字词的发射分数,每列代表一个标签,例如, E 01 E_{01} E01代表 x 0 x_0 x0取id为1的标签分数, E 23 E_{23} E23代表 x 2 x_2 x2取id为3的标签分数。 T T T的shape为 [ t a g _ s i z e , t a g _ s i z e ] [tag\_size, tag\_size] [tag_size,tag_size],它代表了标签之间相互转移的分数,例如, T 03 T_{03} T03代表id为3的标签向id为0的标签转移分数。

每条路径的分数就是由对应的发射分数和转移分数组合而成的,对于图5标记出来的黄色路径来说, x 0 x_0 x0的标签是B-Person,对应的发射分数是 E 00 E_{00} E00 x 1 x_1 x1的标签是I-Person,对应的发射分数是 E 11 E_{11} E11,由B-Person向I-Person转移的分数是 T 10 T_{10} T10,因此到这一步的分数就是: E 00 + T 10 + E 11 E_{00}+T_{10}+E_{11} E00+T10+E11

接下来 x 2 x_2 x2的标签是 O O O,由 x 1 x_1 x1的标签向I-Person向 x 2 x_2 x2的标签O转移的概率是 T 41 T_{41} T41,因此到这一步的分数是: E 00 + T 10 + E 11 + T 41 + E 24 E_{00}+T_{10}+E_{11}+T_{41}+E_{24} E00+T10+E11+T41+E24,依次类推,我们可以计算完整条路径的分数。假设第 i i i个位置对应的标签为 y i y_i yi,则整条路径的分数计算形式化公式为:

S r e a l = ∑ i = 0 n − 1 E i , y i + ∑ i = 0 n − 2 T y i + 1 , y i S_{real}=\sum_{i=0}^{n-1}{E_{i,y_i}} + \sum_{i=0}^{n-2}{T_{y_{i+1}, y_{i}}} Sreal=i=0n1Ei,yi+i=0n2Tyi+1,yi

2.5 全部路径的分数计算

2.3节中的损失函数包括两项,单条真实路径分数的计算和归一化项(如上所述,全部路径分数的 l o g _ s u m _ e x p log\_sum\_exp log_sum_exp,为方便描述,后续直接将个归一化项描述为全部路径之和)的计算。这里你或许会问,现在知道了单条路径分数的计算方式,遍历一下所有的路径算个分数,不就可以轻松算出全部路径之和吗?是的,这在理论上是可行的。

但是,前边我们提到这个路径的数量是个指数级别的量纲,假设我对串包含50个字的文本串进行实体识别,标签的数量是31,那么这个路径的数量将是 3 1 50 31^{50} 3150条,这是真的是难以接受的一件事情,它会远远拖慢模型的训练和预测效率。

因此,我们要换一种高效的思路,这里其实用到了一种被称为前向算法的动态规划,它能帮助我们将图5所有路径的和计算,拆解为每个位置的和计算,最终得出所有的路径之和。如果这是你第一次听到这个算法,那也没关系,我会通过示例的方式,为你展现这个算法的工作原理,但是在看这部分内容之前,我们再来回顾一下我们的计算目标,即损失函数中的第1项:

l o g ( e S 1 + e S 2 + . . . + e S N ) log(e^{S_1}+e^{S_2}+...+e^{S_N}) log(eS1+eS2+...+eSN)

另外,为方便描述这个原理,我们来简化下这个问题,假设我们现在在计算图7所示的所有路径之和。

image-20210416144818180

图7 简化版的CRF工作图

图7中,共包含2个标签 T a g Tag Tag 0 和 T a g Tag Tag 1, 文本串有3个单词 x 0 , x 1 , x 2 x_0, x_1, x_2 x0,x1,x2。我们再来做些约定如下:

e m i s s i o n i = [ x i 0 , x i 1 ] emission_i=[x_{i0},x_{i1}] emissioni=[xi0,xi1], 代表 x i x_i xi位置的发射分数。

其中, x i 0 x_{i0} xi0代表 x i x_i xi位置输出 T a g Tag Tag 0 标签的分数, x i 1 x_{i1} xi1代表 x i x_i xi位置输出 T a g Tag Tag 1 标签的分数。

$ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] $, 代表转移矩阵。

其中, t 01 t_{01} t01代表从 T a g Tag Tag 1 转移到 T a g Tag Tag 0的分数, t 10 t_{10} t10代表从 T a g Tag Tag 0 转移到 T a g Tag Tag 1的分数,依次类推。

a l p h a i = [ s i 0 , s i 1 ] alpha_i=[s_{i0},s_{i1}] alphai=[si0,si1], 其中各个数值代表到当前位置 x i x_i xi为止,以 x i x_i xi位置相应标签结尾的路径分数之和。

x 2 x_2 x2步为例, a l p h a 2 = [ s 20 , s 21 ] alpha_2=[s_{20},s_{21}] alpha2=[s20,s21],其中 s 20 s_{20} s20代表截止到 x 2 x_2 x2步骤为止,以标签 T a g Tag Tag 0 结尾所有的路径分数之和, s 21 s_{21} s21代表截止到 x 2 x_2 x2步骤为止,以标签 T a g Tag Tag 1结尾的所有路径分数之和。

这里比较抽象,如图7所示,参与 x 2 x_2 x2步的 s 20 s_{20} s20分数计算的路径包括4条,即 s 20 s_{20} s20是下边4条路径分数之和,依次如下

  • x 00 , x 10 , x 20 x_{00},x_{10},x_{20} x00,x10,x20
  • x 00 , x 11 , x 20 x_{00},x_{11},x_{20} x00,x11,x20
  • x 01 , x 10 , x 20 x_{01},x_{10},x_{20} x01,x10,x20
  • x 01 , x 11 , x 20 x_{01},x_{11},x_{20} x01,x11,x20

恭喜,我们完成了一些枯燥的定义,下边我们来看看如何计算所有路径的分数和吧,这里我们分成3步走来解释,首先计算截止到 x 0 x_0 x0位置,到各个标签的分数(上边的 a l p h a alpha alpha内容)是多少;截止到 x 1 x_1 x1位置,到各个标签的分数是多少;截止到 x 2 x_2 x2位置,到各个标签的分数是多少。


第1步,截止到 x 0 x_0 x0位置

当前位置 x 0 x_0 x0输入的发射分数为: e m i s s i o n 0 = [ x 00 , x 01 ] emission_0=[x_{00},x_{01}] emission0=[x00,x01],因为这是序列的起始,显然截止到 x 0 x_0 x0位置有: a l p h a 0 = [ x 00 , x 01 ] alpha_0=[x_{00},x_{01}] alpha0=[x00,x01]

截止到 x 0 x_0 x0这一步,将 x 0 x_0 x0位置的所有标签的分数累计作为所有路径的分数为:

t o t a l 0 = l o g ( e x 00 + e x 01 ) total_0 = log(e^{x_{00}}+e^{x_{01}}) total0=log(ex00+ex01)


第2步,截止到 x 1 x_1 x1位置

当前步骤涉及到 x 0 x_0 x0 x 1 x_1 x1位置的转移,在这个过程中, x 1 x_1 x1位置输入的发射分数为: e m i s s i o n 1 = [ x 10 , x 11 ] emission_1=[x_{10}, x_{11}] emission1=[x10,x11], 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] , 前一个位置 , 前一个位置 ,前一个位置x_0 各标签的路径累计和 各标签的路径累计和 各标签的路径累计和alpha_0=[x_{00},x_{01}]$。

接下来我们expand一下 e m i s s i o n 1 emission_1 emission1 a l p h a 0 alpha_0 alpha0,力求通过矩阵计算的方式一次完成当前位置 x 1 x_1 x1各个标签的路径累计 a l p h a 1 alpha_1 alpha1,具体如下:

e m i s s i o n 1 = [ x 10 x 10 x 11 x 11 ] emission_1 = \left[ \begin{matrix} x_{10} & x_{10}\\ x_{11} & x_{11} \end{matrix} \right] emission1=[x10x11x10x11]

a l p h a 0 = [ x 00 x 01 x 00 x 01 ] alpha_0 = \left[ \begin{matrix} x_{00} & x_{01}\\ x_{00} & x_{01} \end{matrix} \right] alpha0=[x00x00x01x01]

然后我们来计算截止到 x 1 x_1 x1位置,到不同标签的每条路径的分数:

s c o r e s = a l p h a 0 + t r a n s + e m i s s i o n 1 = [ x 00 x 01 x 00 x 01 ] + [ t 00 t 01 t 10 t 11 ] + [ x 10 x 10 x 11 x 11 ] = [ x 00 + t 00 + x 10 x 01 + t 01 + x 10 x 00 + t 10 + x 11 x 01 + t 11 + x 11 ] \begin{align} scores &= alpha_0+trans+emission_1 \\ &= \left[ \begin{matrix} x_{00} & x_{01}\\ x_{00} & x_{01} \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{10} & x_{10}\\ x_{11} & x_{11} \end{matrix} \right] \\ &= \left[ \begin{matrix} x_{00}+t_{00}+x_{10} & x_{01}+t_{01}+x_{10}\\ x_{00}+t_{10}+x_{11} & x_{01}+t_{11}+x_{11} \end{matrix} \right] \end{align} scores=alpha0+trans+emission1=[x00x00x01x01]+[t00t10t01t11]+[x10x11x10x11]=[x00+t00+x10x00+t10+x11x01+t01+x10x01+t11+x11]

我们来看一条路径分数的计算,例如$ x_{00}+t_{10}+x_{11} , 它代表在 , 它代表在 ,它代表在x_0 的位置标签为 的位置标签为 的位置标签为Tag$ 0,在 x 1 x_1 x1的位置标签为 T a g Tag Tag 1,然后通过加上 t 10 t_{10} t10完成了 x 0 x_0 x0位置 T a g Tag Tag 0标签 向 x 1 x_1 x1位置标签 T a g Tag Tag 1的转移。

从上边的结果可以看到,第1行代表向当前位置 x 1 x_1 x1标签 T a g Tag Tag 0的转移路径,第2行代表向当前位置 x 1 x_1 x1标签 T a g Tag Tag 1的转移路径。以第1行为例,将第1行的路径分数相加,就相当于到当前位置 x 1 x_1 x1并且以 T a g Tag Tag 0结尾的所有路径之和。

因此,这样我们可以容易地算出当前位置 x 1 x_1 x1的各个标签的路径累计分数 a l p h a 1 alpha_1 alpha1:

a l p h a 1 = [ l o g ( e x 00 + t 00 + x 10 + e x 01 + t 01 + x 10 ) , l o g ( e x 00 + t 10 + x 11 + e x 01 + t 11 + x 11 ) ] alpha_1 = [log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}), log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})] alpha1=[log(ex00+t00+x10+ex01+t01+x10),log(ex00+t10+x11+ex01+t11+x11)]

最后,我们来算下截止到 x 1 x_1 x1位置,所有的路径和:

t o t a l 1 = l o g ( e a l p h a 1 [ 0 ] + e a l p h a 1 [ 1 ] ) = l o g ( e l o g ( e x 00 + t 00 + x 10 + e x 01 + t 01 + x 10 ) + e l o g ( e x 00 + t 10 + x 11 + e x 01 + t 11 + x 11 ) ) = l o g ( e x 00 + t 00 + x 10 + e x 01 + t 01 + x 10 + e x 00 + t 10 + x 11 + e x 01 + t 11 + x 11 ) \begin{align} total_1 &= log(e^{alpha_1[0]} + e^{alpha_1[1]}) \\ &=log(e^{log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}})}+e^{log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}})}) \\ &=log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}} + e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}}) \end{align} total1=log(ealpha1[0]+ealpha1[1])=log(elog(ex00+t00+x10+ex01+t01+x10)+elog(ex00+t10+x11+ex01+t11+x11))=log(ex00+t00+x10+ex01+t01+x10+ex00+t10+x11+ex01+t11+x11)

再回顾一下我们的计算目标: l o g ( e S 1 + e S 2 + . . . + e S N ) log(e^{S_1}+e^{S_2}+...+e^{S_N}) log(eS1+eS2+...+eSN),你可以看到如果图7最终只到 x 1 x_1 x1位置,那么上边的这个结果就是我们相求的全部路径之和,或者说是归一化项。


第3步,截止到 x 2 x_2 x2位置

我们再来看下 x 2 x_2 x2位置的一些输入信息, x 2 x_2 x2位置输入的发射分数为: e m i s s i o n 2 = [ x 20 , x 21 ] emission_2=[x_{20}, x_{21}] emission2=[x20,x21], 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] , 前一个位置 , 前一个位置 ,前一个位置x_1 各标签的路径累计和 各标签的路径累计和 各标签的路径累计和alpha_1=[log(e{x_{00}+t_{00}+x_{10}}+e{x_{01}+t_{01}+x_{10}}), log(e{x_{00}+t_{10}+x_{11}}+e{x_{01}+t_{11}+x_{11}})]$。

接下来继续expand一下 e m i s s i o n 2 emission_2 emission2 a l p h a 1 alpha_1 alpha1,力求通过矩阵计算的方式一次完成当前位置 x 2 x_2 x2各个标签的路径累计 a l p h a 2 alpha_2 alpha2,具体如下:

e m i s s i o n 2 = [ x 20 x 20 x 21 x 21 ] emission_2 = \left[ \begin{matrix} x_{20} & x_{20}\\ x_{21} & x_{21} \end{matrix} \right] emission2=[x20x21x20x21]

a l p h a 1 = [ l o g ( e x 00 + t 00 + x 10 + e x 01 + t 01 + x 10 ) l o g ( e x 00 + t 10 + x 11 + e x 01 + t 11 + x 11 ) l o g ( e x 00 + t 00 + x 10 + e x 01 + t 01 + x 10 ) l o g ( e x 00 + t 10 + x 11 + e x 01 + t 11 + x 11 ) ] alpha_1 = \left[ \begin{matrix} log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}) & log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}}) \\ log(e^{x_{00}+t_{00}+x_{10}}+e^{x_{01}+t_{01}+x_{10}}) & log(e^{x_{00}+t_{10}+x_{11}}+e^{x_{01}+t_{11}+x_{11}}) \end{matrix} \right] alpha1=[log(ex00+t00+x10+ex01+t01+x10)log(ex00+t00+x10+ex01+t01+x10)log(ex00+t10+x11+ex01+t11+x11)log(ex00+t10+x11+ex01+t11+x11)]

然后我们来计算截止到 x 2 x_2 x2位置,到不同标签的每条路径的分数:

继续按行累加,算出到当前位置 x 2 x_2 x2的各个标签的路径累计分数 a l p h a 2 alpha_2 alpha2:

最后,我们来算下截止到 x 2 x_2 x2位置,所有的路径和:

显然,这个式子的结果就是最终我们想要的计算目标,损失函数中的第1项,共计包含8条路径的分数。

2.6 CRF的Viterbi解码

在前边几节,我们讲过了CRF的损失函数、单条路径分数的计算、全部路径分数的计算,根据这些内容完全可以进行BiLSTM+CRF的训练。但是,我们如何使用CRF从全部的路径中解码出得分最高的那条路径呢?

同2.5节所述,计算全部路径分数后,选择得分最大的那条路径肯定是不行的。其实这里是使用了一种被称为Viterbi的算法,它的思想和2.5节介绍的前向算法有些类似,将从全部路径中查找最优路径的过程,拆解为选择每个位置累计的最大路径。如果这是你第一次接触Viterbi算法,也不用担心,本节依然会通过示例的方式展现这个算法原理。

我们依然以图7为例,解码这全部路径中分数最大的这条(图中橙色显示的这条路径)。在正式介绍之前,我们依然做些约定如下:

e m i s s i o n i = [ x i 0 , x i 1 ] emission_i=[x_{i0},x_{i1}] emissioni=[xi0,xi1], 代表 x i x_i xi位置的发射分数。

其中, x i 0 x_{i0} xi0代表 x i x_i xi位置输出 T a g Tag Tag 0 标签的分数, x i 1 x_{i1} xi1代表 x i x_i xi位置输出 T a g Tag Tag 1 标签的分数。

$ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] $, 代表转移矩阵。

其中, t 01 t_{01} t01代表从 T a g Tag Tag 1 转移到 T a g Tag Tag 0的分数, t 10 t_{10} t10代表从 T a g Tag Tag 0 转移到 T a g Tag Tag 1的分数,依次类推。

a l p h a i = [ s i 0 , s i 1 ] alpha_i=[s_{i0},s_{i1}] alphai=[si0,si1], 其中各个数值代表到当前位置 x i x_i xi为止,以当前位置 x i x_i xi相应标签结尾的路径中,取得最大分数的路径得分。

x 2 x_2 x2位置为例, a l p h a 2 = [ s 20 , s 21 ] alpha_2=[s_{20},s_{21}] alpha2=[s20,s21],其中 s 20 s_{20} s20代表截止到 x 2 x_2 x2步骤为止,以标签 T a g Tag Tag 0 结尾所有的路径中得分最大的路径分数, s 21 s_{21} s21代表截止到 x 2 x_2 x2步骤为止,以标签 T a g Tag Tag 1结尾的所有路径中得分最大的路径分数。

这里比较抽象,如图7所示,参与 x 2 x_2 x2步的 s 20 s_{20} s20分数计算的路径包括4条, s 20 s_{20} s20是这4条路径中得分最大这一条对应的分数,即下边这一条路径: x 00 , x 11 , x 20 x_{00},x_{11},x_{20} x00,x11,x20

b e t a i = [ p i 0 , p i 1 ] beta_i = [p_{i0},p_{i1}] betai=[pi0,pi1],其中各个数值代表到当前位置 x i x_i xi为止,以当前位置 x i x_i xi相应标签结尾的路径中,分数最大的那一条路径在前一个位置 x i − 1 x_{i-1} xi1的标签索引(每个标签对应的id号)。

x 2 x_2 x2位置为例, b e t a 2 = [ p 20 , p 21 ] beta_2 = [p_{20},p_{21}] beta2=[p20,p21],其中 p 20 p_{20} p20代表代表截止到 x 2 x_2 x2步骤为止,以标签 T a g Tag Tag 0 结尾所有的路径中得分最大的那条路径在 x i − 1 x_{i-1} xi1位置的标签索引,同理 p 21 p_{21} p21代表截止到 x 2 x_2 x2步骤为止,以标签 T a g Tag Tag 1结尾的最大路径在 x i − 1 x_{i-1} xi1位置的标签索引。

同样,如图7所示,在 x 2 x_2 x2位置,到标签 T a g Tag Tag 0的所有路径中,分数最大的路径是: x 00 , x 11 , x 20 x_{00},x_{11},x_{20} x00,x11,x20,因为前一个位置 x i − 1 x_{i-1} xi1的标签是 T a g Tag Tag 1,因此 p 20 = 1 p_{20}=1 p20=1

恭喜,我们又一次完成了这些枯燥的定义,下边我们来看看如何选择所有路径中得分最大的这一条吧,这里我们同样分成3步走来解释,首先计算截止到 x 0 x_0 x0位置,到各个标签的最大得分(上边的 a l p h a alpha alpha内容)是多少;截止到 x 1 x_1 x1位置,到各个标签的最大得分是多少;截止到 x 2 x_2 x2位置,到各个标签的最大得分是多少。


第1步,截止到 x 0 x_0 x0位置

当前位置 x 0 x_0 x0输入的发射分数为: e m i s s i o n 0 = [ x 00 , x 01 ] emission_0=[x_{00},x_{01}] emission0=[x00,x01],因为这是序列的起始,显然截止到 x 0 x_0 x0位置有: a l p h a 0 = [ x 00 , x 01 ] alpha_0=[x_{00},x_{01}] alpha0=[x00,x01]

另外因为起始位置前边没有路径,这里我们使用-1来初始化: b e t a 0 = [ − 1 , − 1 ] beta_0=[-1,-1] beta0=[1,1]


第2步,截止到 x 1 x_1 x1位置

当前步骤涉及到 x 0 x_0 x0 x 1 x_1 x1位置的转移,在这个过程中, x 1 x_1 x1位置输入的发射分数为: e m i s s i o n 1 = [ x 10 , x 11 ] emission_1=[x_{10}, x_{11}] emission1=[x10,x11], 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] , 到前一个位置 , 到前一个位置 ,到前一个位置x_0 各标签的最大路径得分为 各标签的最大路径得分为 各标签的最大路径得分为alpha_0=[x_{00},x_{01}]$。

接下来按照2.5节同样的方式,我们expand一下 e m i s s i o n 1 emission_1 emission1 a l p h a 0 alpha_0 alpha0,力求通过矩阵计算的方式一次完成到当前位置 x 1 x_1 x1各个标签的所有路径中得分最大的路径分数 a l p h a 1 alpha_1 alpha1,具体如下:

e m i s s i o n 1 = [ x 10 x 10 x 11 x 11 ] emission_1 = \left[ \begin{matrix} x_{10} & x_{10}\\ x_{11} & x_{11} \end{matrix} \right] emission1=[x10x11x10x11]

a l p h a 0 = [ x 00 x 01 x 00 x 01 ] alpha_0 = \left[ \begin{matrix} x_{00} & x_{01}\\ x_{00} & x_{01} \end{matrix} \right] alpha0=[x00x00x01x01]

然后我们来计算截止到 x 1 x_1 x1位置,到不同标签的每条路径的分数:

s c o r e s = a l p h a 0 + t r a n s + e m i s s i o n 1 = [ x 00 x 01 x 00 x 01 ] + [ t 00 t 01 t 10 t 11 ] + [ x 10 x 10 x 11 x 11 ] = [ x 00 + t 00 + x 10 x 01 + t 01 + x 10 x 00 + t 10 + x 11 x 01 + t 11 + x 11 ] \begin{align} scores &= alpha_0+trans+emission_1 \\ &= \left[ \begin{matrix} x_{00} & x_{01}\\ x_{00} & x_{01} \end{matrix} \right] + \left[ \begin{matrix} t_{00} & t_{01}\\ t_{10} & t_{11} \end{matrix} \right] + \left[ \begin{matrix} x_{10} & x_{10}\\ x_{11} & x_{11} \end{matrix} \right] \\ &= \left[ \begin{matrix} x_{00}+t_{00}+x_{10} & x_{01}+t_{01}+x_{10}\\ x_{00}+t_{10}+x_{11} & x_{01}+t_{11}+x_{11} \end{matrix} \right] \end{align} scores=alpha0+trans+emission1=[x00x00x01x01]+[t00t10t01t11]+[x10x11x10x11]=[x00+t00+x10x00+t10+x11x01+t01+x10x01+t11+x11]

同样地,以第1行为例,第1行代表到当前位置 x 1 x_1 x1标签 T a g Tag Tag 0结尾的所有路径的得分,那么第1行中分数最大这一条路径,就是到当前位置 x 1 x_1 x1并且以 T a g Tag Tag 0结尾的所有路径中得分最大的路径。

因此,这样我们可以容易地算出到当前位置 x 1 x_1 x1的各个标签的最大路径分数 a l p h a 1 alpha_1 alpha1:

a l p h a 1 = [ m a x ( s c o r e s [ 0 , 0 ] , s c o r e s [ 0 , 1 ] ) , m a x ( s c o r e s [ 1 , 0 ] , s c o r e s [ 1 , 1 ] ) ] = [ m a x ( x 00 + t 00 + x 10 , x 01 + t 01 + x 10 ) , m a x ( x 00 + t 10 + x 11 , x 01 + t 11 + x 11 ) ] \begin{align} alpha_1 &= [max(scores[0,0], scores[0,1]), max(scores[1,0], scores[1,1])] \\ &= [max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}), max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})] \end{align} alpha1=[max(scores[0,0],scores[0,1]),max(scores[1,0],scores[1,1])]=[max(x00+t00+x10,x01+t01+x10),max(x00+t10+x11,x01+t11+x11)]

显然从上边结果中,我们能够分析出到 x 1 x_1 x1位置各个标签的最大路径,例如到$Tag $ 0的路径有 x 00 + t 00 + x 10 x_{00}+t_{00}+x_{10} x00+t00+x10 和 $ x_{01}+t_{01}+x_{10} , 其中较大者就是我们想要的到 , 其中较大者就是我们想要的到 ,其中较大者就是我们想要的到x_1$位置 $Tag $ 0的最大路径。

这里不妨我们做个假设:

  • x 00 + t 00 + x 10 < x 01 + t 01 + x 10 x_{00}+t_{00}+x_{10} < x_{01}+t_{01}+x_{10} x00+t00+x10<x01+t01+x10
  • x 00 + t 10 + x 11 > x 01 + t 11 + x 11 x_{00}+t_{10}+x_{11} > x_{01}+t_{11}+x_{11} x00+t10+x11>x01+t11+x11

因此,我们可以获得 x 1 x_1 x1位置的索引 b e t a 1 = [ 1 , 0 ] beta_1=[1,0] beta1=[10],这代表在 x 1 x_1 x1位置,到标签 T a g Tag Tag 0的最大路径的前一个位置 x i − 1 x_{i-1} xi1的标签是 T a g Tag Tag 1, 到标签 T a g Tag Tag 1的最大路径的前一个位置 x i − 1 x_{i-1} xi1的标签是 T a g Tag Tag 0。


第3步,截止到 x 2 x_2 x2位置

我们再来看下 x 2 x_2 x2位置的一些输入信息, x 2 x_2 x2位置输入的发射分数为: e m i s s i o n 2 = [ x 20 , x 21 ] emission_2=[x_{20}, x_{21}] emission2=[x20,x21], 转移概率矩阵为: $ trans = \left[ \begin{matrix} t_{00} & t_{01}\ t_{10} & t_{11} \end{matrix} \right] , 前一个位置 , 前一个位置 ,前一个位置x_1 各标签的路径累计和 : 各标签的路径累计和: 各标签的路径累计和:alpha_1=[max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}), max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})]$。

接下来继续expand一下 e m i s s i o n 2 emission_2 emission2 a l p h a 1 alpha_1 alpha1,力求通过矩阵计算的方式一次完成当前位置 x 2 x_2 x2各个标签的路径累计 a l p h a 2 alpha_2 alpha2,具体如下:

e m i s s i o n 2 = [ x 20 x 20 x 21 x 21 ] emission_2 = \left[ \begin{matrix} x_{20} & x_{20}\\ x_{21} & x_{21} \end{matrix} \right] emission2=[x20x21x20x21]

a l p h a 1 = [ m a x ( x 00 + t 00 + x 10 , x 01 + t 01 + x 10 ) m a x ( x 00 + t 10 + x 11 , x 01 + t 11 + x 11 ) m a x ( x 00 + t 00 + x 10 , x 01 + t 01 + x 10 ) m a x ( x 00 + t 10 + x 11 , x 01 + t 11 + x 11 ) ] alpha_1 = \left[ \begin{matrix} max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \\ max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) & max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) \end{matrix} \right] alpha1=[max(x00+t00+x10,x01+t01+x10)max(x00+t00+x10,x01+t01+x10)max(x00+t10+x11,x01+t11+x11)max(x00+t10+x11,x01+t11+x11)]

然后我们来计算截止到 x 2 x_2 x2位置,到不同标签的每条路径的分数:

因此,这样我们可以容易地算出到当前位置 x 2 x_2 x2的各个标签的最大路径分数 a l p h a 2 alpha_2 alpha2:

a l p h a 1 = [ m a x ( s c o r e s [ 0 , 0 ] , s c o r e s [ 0 , 1 ] ) , m a x ( s c o r e s [ 1 , 0 ] , s c o r e s [ 1 , 1 ] ) ] = [ m a x ( m a x ( x 00 + t 00 + x 10 , x 01 + t 01 + x 10 ) + t 00 + x 20 , m a x ( x 00 + t 10 + x 11 , x 01 + t 11 + x 11 ) + t 01 + x 20 ) , m a x ( m a x ( x 00 + t 00 + x 10 , x 01 + t 01 + x 10 ) + t 10 + x 21 , m a x ( x 00 + t 10 + x 11 , x 01 + t 11 + x 11 ) + t 11 + x 21 ) ] \begin{align} alpha_1 &= [max(scores[0,0], scores[0,1]), max(scores[1,0], scores[1,1])] \\ &= [max(max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) +t_{00}+x_{20}, max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})+t_{01}+x_{20}), max(max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10})+t_{10}+x_{21}, max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) +t_{11}+x_{21} )] \end{align} alpha1=[max(scores[0,0],scores[0,1]),max(scores[1,0],scores[1,1])]=[max(max(x00+t00+x10,x01+t01+x10)+t00+x20,max(x00+t10+x11,x01+t11+x11)+t01+x20),max(max(x00+t00+x10,x01+t01+x10)+t10+x21,max(x00+t10+x11,x01+t11+x11)+t11+x21)]

这里我不妨再假设:

  • m a x ( x 00 + t 00 + x 10 , x 01 + t 01 + x 10 ) + t 00 + x 20 > m a x ( x 00 + t 10 + x 11 , x 01 + t 11 + x 11 ) + t 01 + x 20 ) max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10}) +t_{00}+x_{20} > max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11})+t_{01}+x_{20}) max(x00+t00+x10,x01+t01+x10)+t00+x20>max(x00+t10+x11,x01+t11+x11)+t01+x20)

  • m a x ( x 00 + t 00 + x 10 , x 01 + t 01 + x 10 ) + t 10 + x 21 < m a x ( x 00 + t 10 + x 11 , x 01 + t 11 + x 11 ) + t 11 + x 21 ) max(x_{00}+t_{00}+x_{10}, x_{01}+t_{01}+x_{10})+t_{10}+x_{21} < max(x_{00}+t_{10}+x_{11}, x_{01}+t_{11}+x_{11}) +t_{11}+x_{21} ) max(x00+t00+x10,x01+t01+x10)+t10+x21<max(x00+t10+x11,x01+t11+x11)+t11+x21)

上一步我们曾假设:

  • x 00 + t 00 + x 10 < x 01 + t 01 + x 10 x_{00}+t_{00}+x_{10} < x_{01}+t_{01}+x_{10} x00+t00+x10<x01+t01+x10
  • x 00 + t 10 + x 11 > x 01 + t 11 + x 11 x_{00}+t_{10}+x_{11} > x_{01}+t_{11}+x_{11} x00+t10+x11>x01+t11+x11

因此有:

  • x 01 + t 01 + x 10 + t 01 + x 10 < x 00 + t 10 + x 11 + t 01 + x 20 x_{01}+t_{01}+x_{10}+t_{01}+x_{10} < x_{00}+t_{10}+x_{11}+t_{01}+x_{20} x01+t01+x10+t01+x10<x00+t10+x11+t01+x20
  • x 01 + t 01 + x 10 + t 10 + x 21 > x 00 + t 10 + x 11 + t 11 + x 21 x_{01}+t_{01}+x_{10}+t_{10}+x_{21} > x_{00}+t_{10}+x_{11}+t_{11}+x_{21} x01+t01+x10+t10+x21>x00+t10+x11+t11+x21

所以 x 2 x_2 x2位置的索引: b e t a 2 = [ 1 , 0 ] beta_2 = [1,0] beta2=[1,0]

此时: a l p h a 1 = [ x 00 + t 10 + x 11 + t 01 + x 20 , x 01 + t 01 + x 10 + t 10 + x 21 ] alpha_1=[x_{00}+t_{10}+x_{11}+t_{01}+x_{20}, x_{01}+t_{01}+x_{10}+t_{10}+x_{21} ] alpha1=[x00+t10+x11+t01+x20,x01+t01+x10+t10+x21]

图7中橘色路径分数最高,其对应的是 x 00 + t 10 + x 11 + t 01 + x 20 x_{00}+t_{10}+x_{11}+t_{01}+x_{20} x00+t10+x11+t01+x20,因此再假设:

x 00 + t 10 + x 11 + t 01 + x 20 > x 01 + t 01 + x 10 + t 10 + x 21 x_{00}+t_{10}+x_{11}+t_{01}+x_{20} > x_{01}+t_{01}+x_{10}+t_{10}+x_{21} x00+t10+x11+t01+x20>x01+t01+x10+t10+x21

这其实代表在 x 2 x_2 x2位置的所有标签对应的最大路径中, T a g Tag Tag 0 对应的那条路径是最大的,这条路径也是全局所有路径中分数最大的那一条,是我们要解析出的期望路径。

第4步,开始解码标签序列

到现在位置,我们通过 b e t a 0 beta_0 beta0记录下了最大路径上的节点,接下来我们可以通过回溯来找出全局所有路径中的最大路径。

首先,在 x 2 x_2 x2位置所有标签对应的最大路径中, T a g Tag Tag 0 对应的路径分数最大。因此 x 2 x_2 x2位置对应的标签就是 T a g Tag Tag 0。

然后, b e t a 2 = [ 1 , 0 ] beta_2 = [1,0] beta2=[1,0],因此 x 2 x_2 x2位置解析出的标签 T a g Tag Tag 0,对应的上一位置 x 1 x_1 x1的标签是 T a g Tag Tag 1。

接下来, b e t a 1 = [ 1 , 0 ] beta_1=[1,0] beta1=[10],因此 x 1 x_1 x1位置解析出的标签 T a g Tag Tag 1,对应的上一位置 x 0 x_0 x0的标签是 T a g Tag Tag 0。

最后, b e t a 0 = [ − 1 , − 1 ] beta_0=[-1,-1] beta0=[1,1],当解析到这一步的时候,反回的标签肯定是-1,因此这个回溯过程也就结束了。

当回溯完成之后,将解析出的结果倒序排序,就是我们期望的最大路径。以图7为例,该路径就是 T a g Tag Tag 0 --> T a g Tag Tag 1 --> T a g Tag Tag 0。

恭喜,看到这里,相信你已经懂得了CRF的核心原理。江湖虽路远,但总会再见,如对笔者的文章满意,还请多多支持。

  • Reference
    [1] 邱锡鹏. 神经网络与深度学习[M]. 北京:机械工业出版社,2021.
    [2] 吴飞. 人工智能导论:模型与算法[M]. 北京:高等教育出版社,2020.
    [3] CRF Layer on the Top of BiLSTM

3. PLM Fine-tuning预训练的模型

3.1 目前前沿方法

  1. Transformer-CRF模型:基于Transformers的神经网络结构和条件随机场模型的联合训练,通过提取输入的上下文信息、全局概率建模,结合现有的BERT和RoBERTa预训练模型,在多语种的命名实体识别任务中有很好的表现。

  2. Pre-trained Language Model Fine-tuning (PLM Fine-tuning):该方法是基于预训练模型和微调技术的思想,利用预训练的模型(如BERT、RoBERTa等)作为初始参数,通过在命名实体识别的数据集上进行微调,来提升NER的性能。它可以在少量标注数据上快速训练,并在各种语言和领域中展现出优良的泛化能力。

  3. Neural Architecture Search (NAS):利用神经网络搜索算法和强化学习,生成NN结构,并进行自动化架构搜索。NAS可以使模型具有更好的鲁棒性和泛化性能,并在不使用任何人工特征编码的情况下提高命名实体识别的准确性。

这些算法常用于实际应用中,并取得了良好的效果。当然,还有很多其他的NER算法,如模板匹配、CRF、SVM等,每种算法都有自己的优缺点,需要根据具体场景进行选择和组合。

3.2 小样本下NER

针对小样本问题,可以使用迁移学习或元学习等技术来解决。迁移学习是指将预先训练好的模型应用于新任务中,从而将新任务的训练时间缩短,但前提是预训练模型和待解决的任务有一定的相关性。元学习则是一种针对小样本学习问题的方法,它能够通过学习如何学习来提高模型在少量样本的情况下的泛化能力。

针对小样本NER问题,下面介绍两种常用的小样本模型:

  1. Few-shot learning模型:该模型是一种基于元学习的模型,它可以用较少的数据进行训练,同时在新领域中进行良好的泛化,具有很强的适应性。Few-shot learning的主要思想是利用少量标注数据来训练一个编码器,通过训练来学习具有较好泛化性能的模型。在NER任务中,通过将少量文本做为一个任务,来进行训练,该模型可以在稀缺标注数据的情况下,识别新类别的命名实体。

  2. Adaptive Span模型:该模型可以自适应地在输入序列中发现实体边界,从而进一步提高命名实体识别的性能。它可以利用现有的NER模型和表示学习方法,在少量数据情况下快速训练,并在大规模未标记的数据上表现优秀。Adaptive Span模型实现了端到端的自适应边界预测,它通过动态地选择每个输入序列中的子区间,来预测给定实体类别的标签。

更多文章请关注公重号:汀丶人工智能

3.3 推荐!实体、关系、属性抽取实战项目合集(含智能标注)

实体、关系、属性抽取实战项目合集(含智能标注)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/637157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZYNQ 7020 开发板开机检测

拿到开发板后检测开发板能否正常工作。 检测需要的工具&#xff1a;电脑、显示器(有HDMI接口)、HDMI线、鼠标、键盘、网线、USB转串口驱动软件。 在检测之前&#xff0c;先要在自己的电脑上安装好终端工具和USB转串口的驱动软件。 终端工具我安装的是 MobaXterm。 USB转串口的驱…

深入理解JavaScript模块化开发

前言&#xff1a; 随着JavaScript应用程序的复杂性不断增加&#xff0c;模块化开发成为了一种必备的技术。通过将代码划分为模块&#xff0c;我们可以提高代码的可维护性、可重用性和可扩展性。在本文中&#xff0c;我们将深入探讨JavaScript模块化开发的概念、优势和不同的模块…

热门自定义报表系统推荐,哪款自定义报表系统更功能更强大?

随着企业管理的日益复杂&#xff0c;越来越多的企业需要一款高效、灵活、易用的自定义报表系统来满足其各种报表制作和数据分析需求。然而&#xff0c;在众多自定义报表系统中&#xff0c;哪款更加强大&#xff1f;今天&#xff0c;我将向大家推荐5款热门自定义报表系统&#x…

设施设备管理系统

凡尔码搭建设施设备管理系统是一种为企业和机构提供维护和管理设备、设施、建筑物和环境等设施的系统。它通过自动化设施的巡检计划、保养计划、通知和维护任务&#xff0c;使设施维护管理的工作更高效率、更科学化&#xff0c;并提高了设施设备的可靠性和使用价值。该系统具有…

asp.net学生考勤管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net学生考勤管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net试卷自动生成系统VS开发sq…

谈谈 NLP中 大语言模型 LLM的In-Context Learning(ICL) 能力

In-Context Learning(ICL) 1.介绍 自GPT-3首次提出了In-Context Learning(ICL)的概念而来&#xff0c;ICL目前已经变成了一种经典的LLMs使用方法。 2.思路 ICL主要思路是&#xff0c;给出少量的标注样本&#xff0c;设计任务相关的指令形成提示模板&#xff0c;用于指导待测…

Can We Predict Australian Rainfall?建立LSTM模型预测澳大利亚平均降雨量

数据集&#xff1a;Rain in Australia | Kaggle 数据探索 首先df pd.read_csv(weatherAUS.csv)读入数据&#xff0c;df.shape查看形状为(145460, 23)。 通过df[RainTomorrow].value_counts(dropnaFalse)查看下雨与不下雨标签各自的数量&#xff0c;No为110316&#xff0c;Ye…

初识分类问题

分类问题 根据尺寸把图像分类为纵向图像和横向图像&#xff0c;是二分类问题。 将图像数据转换为坐标&#xff1a; 白色的点是纵向图像&#xff0c;黑色的点是横向图像 若增加更多的图像数据&#xff1a; 分类的目的就是找到这条线&#xff0c;用一条线将图中白色的点和黑色的…

windows 服务程序和桌面程序集成(五)集成为一个EXE

系列文章目录链接&#xff1a; windows 服务程序和桌面程序集成&#xff08;一&#xff09;概念介绍windows 服务程序和桌面程序集成&#xff08;二&#xff09;服务程序windows 服务程序和桌面程序集成&#xff08;三&#xff09;UDP监控工具windows 服务程序和桌面程序集成&…

《Python深度学习基于Pytorch》学习笔记

1.Numpy提供两种基本的对象&#xff1a;ndarray&#xff08;n维数组对象&#xff09;&#xff08;用于储存多维数据&#xff09;和ufunc&#xff08;通用函数对象&#xff0c;用于处理不同的数据&#xff09;。 2.numpy的主要优点&#xff1a;ndarray提供了很多数组化的运算&a…

springboot+vue大学生足球队管理系统 java

(1) 系统管理&#xff1a; 用户分为超级管理员、球队管理员、球队球员、游客&#xff0c;以区分不同用户的操作权限&#xff0c;用户的登录退出。 (2) 前台页面&#xff1a; 1.网站首页&#xff1a;展示系统简介&#xff0c;部分赛事信息&#xff0c;部分院系球队信息&#xff…

号称「碾压」LLaMA的Falcon实测得分仅49.08

作为开源模型界的扛把子&#xff0c;LLaMA 一直备受瞩目。 这是一组由 Meta 开源的大型语言模型&#xff0c;共有 7B、13B、33B、65B 四种版本。其中&#xff0c;LLaMA-13B 在大多数数据集上超过了 GPT-3&#xff08;175B&#xff09;&#xff0c;LLaMA-65B 达到了和 Chinchill…

服务器文件同步机制配置(rsync Sersync)

参考文章链接&#xff1a;http://static.kancloud.cn/curder/linux/78148 在上述参考文章中&#xff0c;对与主从同步部署过程做了详细的操作解释&#xff0c;但对于三台服务器如何互相同步&#xff08;即三个都是master&#xff09;&#xff0c;本文针对三台master相互同步进…

一文读懂redis持久化机制

持久化官网相关参考资料 https://redis.io/docs/manual/persistence/ 持久化就是把redis内存里面保存的数据保存磁盘中&#xff0c;在redis重启或者能够使得数据不会丢失。目前常用的持久化方式有&#xff1a;RDB方式、AOF方式以及RDB AOF两种方式 RDB持久化方式 所谓的RDB…

实现无间断的自动化:Jenkins与GitLab的定时任务工作流程

简介&#xff1a; Jenkins是一个流行的开源自动化服务器&#xff0c;而GitLab是一个强大的代码托管和协作平台。通过结合Jenkins和GitLab&#xff0c;我们可以建立一个强大的定时任务自动化工作流程&#xff0c;实现代码拉取、构建、测试和部署的自动化。本篇博客将介绍如何使…

大屏数据可视化开源项目

一、DataGear —— 数据可视化项目 官网&#xff1a;DataGear - 开源免费的数据可视化分析平台 DataGear 是一款开源免费的数据可视化分析平台&#xff0c;数据可视化看板。 功能特性&#xff1a; 1、多种数据源&#xff0c;支持运行时接入任意提供 JDBC 驱动的数据库&#…

Web网页端IM产品RainbowChat-Web的v5.0版已发布

一、关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统&#xff0c;是RainbowChat的姊妹系统&#xff08;RainbowChat是一套基于开源IM聊天框架 MobileIMSDK(Github地址) 的产品级移动端IM系统&#xff09;。 ► 详细介绍&#xff1a;http://www.52im.net/thread-248…

Python的pip install安装路径修改

背景 当我们在安装python的依赖包的时候&#xff0c;不知道默认安装在什么位置&#xff0c;或者不想安装在默认的位置&#xff0c;这时候我们可以手动修改pip install的安装位置。 1.打开cmd窗口, 执行python -m site 输入 python -m site 这个命令可以看到目前的USER_BASE和…

HarmonyOS ArkTS Ability内页面的跳转和数据传递

HarmonyOS ArkTS Ability的数据传递包括有Ability内页面的跳转和数据传递、Ability间的数据跳转和数据传递。本节主要讲解Ability内页面的跳转和数据传递。 打开DevEco Studio&#xff0c;选择一个Empty Ability工程模板&#xff0c;创建一个名为“ArkUIPagesRouter”的工程为…

亚马逊美国站 CPC认证-儿童毛绒玩具产品 毛绒玩具的作用

毛绒玩具等毛绒东西&#xff0c;其实能给孩子带来愉快和安全感&#xff0c;接触舒适&#xff0c;是儿童依恋的重要部分。我们常常能见到一些孩子晚上睡觉前一定要搂着毛绒玩具、或者一定要盖着毛绒毯子才能睡&#xff0c;丢掉了毛绒玩具&#xff0c;或者盖了其他布质的被子就会…