【AI理论学习】n-gram语言模型和神经网络语言模型

news2024/11/19 10:19:44

n-gram语言模型和神经网络语言模型

  • 什么是语言模型
  • 语言模型的计算
  • 什么是n-gram模型
  • n-gram平滑技术
  • 什么是神经网络语言模型(NNLM)?
    • 基于前馈神经网络的模型
    • 基于循环神经网络的模型
    • 语言模型评价指标
  • 总结
  • 参考资料

什么是语言模型

语言模型是自然语言处理中的重要技术,假设一段长度为 T T T的文本中的词依次为 w 1 , w 2 , … , w T w_1, w_2, \ldots, w_T w1,w2,,wT,语言模型将计算该序列的概率: P ( w 1 , w 2 , . . . , w T ) P(w_1,w_2,...,w_T) P(w1,w2,...,wT)
语言模型有助于提升自然语言处理任务的效果,例如在语音识别任务中,给定一段“厨房里食油用完了”的语音,有可能会输出“厨房里食油用完了”和“厨房里石油用完了”这两个读音完全一样的文本序列。合适的语言模型能够判断出前者的概率大于后者的概率,于是可以得到正确的“厨房里食油用完了”这个文本序列。

语言模型的计算

把文本看作一段离散的时间序列 w 1 , w 2 , … , w T w_1, w_2, \ldots, w_T w1,w2,,wT,假设每个词是按时间先后顺序依次生成的,那么在离散的时间序列中, w t ( 1 ≤ t ≤ T ) w_t(1 \leq t \leq T) wt1tT可看作在时间步(time step) t t t的输出或标签。于是,对于一个句子而言,有:
P ( w 1 , w 2 , … , w T ) = ∏ t = 1 T P ( w t ∣ w 1 , … , w t − 1 ) P(w_1, w_2, \ldots, w_T) = \prod_{t=1}^T P(w_t \mid w_1, \ldots, w_{t-1}) P(w1,w2,,wT)=t=1TP(wtw1,,wt1).
例如,一段含有4个词的文本序列的概率:
P ( w 1 , w 2 , w 3 , w 4 ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) P ( w 4 ∣ w 1 , w 2 , w 3 ) P(w_1, w_2, w_3, w_4) = P(w_1) P(w_2 \mid w_1) P(w_3 \mid w_1, w_2) P(w_4 \mid w_1, w_2, w_3) P(w1,w2,w3,w4)=P(w1)P(w2w1)P(w3w1,w2)P(w4w1,w2,w3).

什么是n-gram模型

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列

每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

n-gram 模型基于马尔可夫假设,第n个词的出现只与前面 n-1 个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积:
P ( w 1 , w 2 , … , w T ) ≈ ∏ t = 1 T P ( w t ∣ w t − ( n − 1 ) , … , w t − 1 ) P(w_1, w_2, \ldots, w_T) \approx \prod_{t=1}^T P(w_t \mid w_{t-(n-1)}, \ldots, w_{t-1}) P(w1,w2,,wT)t=1TP(wtwt(n1),,wt1) .
该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram
例如,长度为4的序列 w 1 , w 2 , w 3 , w 4 w_1, w_2, w_3, w_4 w1,w2,w3,w4 在Bi-Gram和Tri-Gram中的概率分别为:
P ( w 1 , w 2 , w 3 , w 4 ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 ) P ( w 4 ∣ w 3 ) P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w2)P(w4∣w3) P(w1,w2,w3,w4)=P(w1)P(w2w1)P(w3w2)P(w4w3),
P ( w 1 , w 2 , w 3 , w 4 ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) P ( w 4 ∣ w 2 , w 3 ) P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w2,w3) P(w1,w2,w3,w4)=P(w1)P(w2w1)P(w3w1,w2)P(w4w2,w3)

n n n较小时, n n n元语法往往并不准确。然而,当 n n n较大时, n n n元语法需要计算并存储大量的词频和多词相邻频率。
对于Bi-Gram而言,有:
p ( w t ∣ w t − 1 ) = c ( w t − 1 , w t ) ∑ w t c ( w t − 1 , w t ) p(w_t|w_{t-1}) = \frac{c(w_{t-1},w_t)}{\sum_{w_t}c(w_{t-1},w_t)} p(wtwt1)=wtc(wt1,wt)c(wt1,wt)
t = 1 t=1 t=1时,为了使上式有意义,在句子的开头加上 < B O S > <BOS> <BOS>,即对于所有的句子 w 0 = < B O S > w_0 = <BOS> w0=<BOS>。同时,给每个句子加上一个结束符 < E O S > <EOS> <EOS>,加上结束符的目的是使得所有的字符串的概率之和 ∑ s p ( s ) = 1 \sum_sp(s)=1 sp(s)=1
下面举个例子:使用自己构建的小型语料库

商品 和 服务
商品 和服 物美价廉
服务 和 货币

n-gram

我 打 篮球
我 打 游泳

n-gram语言模型
随着n的取值越大,n-gram模型在理论上越精确,但是也越复杂,需要的计算量和训练语料数据量也就越大,并且精度提升的不够明显,所以在实际的任务中很少使用n ≥ 4的语言模型

n-gram平滑技术

无论是原始的语言模型还是n-gram语言模型,都是使用极大似然估计法来估计概率值,通过统计频次来近似概率值,统计频次极有可能统计不到较长句子的频次。

  • 如果分子为0,估计的概率值为0,由于连乘的方式会导致最终计算出句子的概率值为0;
  • 如果分母为0,分母为0,计算的公式将没有任何意义;

这被称为数据稀疏,对于n-gram语言模型来说,n越大,数据稀疏的问题越严重。即使是使用n相对比较小的二元语言模型,许多二元靠语料库也是统计不到的。

这也就是说,在自然语言处理处理中,难免会遇到未登录词(OOV),即测试集中出现了训练集中未出现过的词,或者未出现过的子序列,导致语言模型计算出的概率为0。比如对于下面这个小型的语料库:

商品 和 服务
商品 和服 物美价廉
服务 和 货币

"商品 货币"的频次就为0,当n-gram语言模型中的n越小,可统计的n元也就越丰富,一个很自然的解决方案就是利用低阶n元语法平滑到高阶n元语法。所谓的平滑就是字面上的意思:使n元语法频次的折线平滑为曲线。我们不希望二元语法"商品 货币"的频次突然跌倒0,因此使用一元语法"商品"和(“或”,不同的平滑方法可能需要不同的处理)"货币"的频次去平滑它。

使用平滑技术的目的就是在条件概率为0时,防止整个句子的概率为0,人为按一定规则,给0条件概率一定的值。常见的平滑方法有:

  • 加法平滑方法
  • 古德-图灵(Good-Turing)估计法
  • Katz平滑方法
  • Jelinek-Mercer平滑方法
  • Witten-Bell平滑方法
  • 绝对减值法

总结基于统计的 n-gram 语言模型的优缺点
优点:①采用极大似然估计,参数易训练;②完全包含了前 n-1 个词的全部信息;③可解释性强,直观易理解;
缺点:①缺乏长期依赖,只能建模到前 n-1 个词;②随着 n 的增大,参数空间呈指数增长;③数据稀疏,难免会出现OOV的问题;④单纯的基于统计频次,泛化能力差;

什么是神经网络语言模型(NNLM)?

神经网络语言模型先给每个词赋予一个词向量,利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系,即通过神经网络去学习词的向量表示

基于前馈神经网络的模型

基于前馈神经网络的模型如下图所示:
神经网络语言模型
先给每个词在连续空间中赋予一个向量(词向量),再通过神经网络去学习这种分布式表征。利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系。
很显然这种方式相比 n-gram 具有更好的泛化能力,只要词表征足够好。从而很大程度地降低了数据稀疏带来的问题。但是这个结构的明显缺点是仅包含了有限的前文信息。

具体而言,假设当前词出现的概率只依赖于前 n − 1 n-1 n1个词。即:
p ( w t ∣ w 1 , . . . , w t − 1 ) = p ( w t ∣ w t − n + 1 , . . . , w t − 1 ) p(w_t|w_1,...,w_{t-1})=p(w_t|w_{t-n+1},...,w_{t-1}) p(wtw1,...,wt1)=p(wtwtn+1,...,wt1)
假设 V V V表示所有 N N N个词的集合, w t ∈ V w_t\in V wtV,存在一个 ∣ V ∣ × m |V|\times m V×m的参数矩阵 C C C,矩阵的每一行代表一个词的特征向量, m m m代表每个特征向量有 m m m个维度。 C ( w t ) C(w_t) C(wt)表示第 t t t个词 w t w_t wt的对应的特征向量。
如上图所示,将句子的前n-1个词特征对应的向量 C ( w t − n + 1 ) . . . C ( w t − 1 ) C(w_{t-n+1})...C(w_{t-1}) C(wtn+1)...C(wt1)作为神经网络的输入,输出当前词是 w t w_t wt的概率。计算过程如下: y = b + W x + U tanh ⁡ ( d + H x ) y=b+Wx+U\tanh (d+Hx) y=b+Wx+Utanh(d+Hx)
其中, x = ( C ( w t − 1 ) , C ( w t − 2 ) , ⋅ ⋅ ⋅ , C ( w t − n + 1 ) ) x = (C(w_{t−1}),C(w_{t−2}),··· ,C(w_{t−n+1})) x=(C(wt1),C(wt2),⋅⋅⋅,C(wtn+1))
经过上式得到 y w = ( y w , 1 , y w , e , . . . , y w , N ) T y_w=(y_{w,1},y_{w,e},...,y_{w,N})^T yw=(yw,1,yw,e,...,yw,N)T,其中,将 y w y_w yw进行softmax之后, y w , i y_{w,i} yw,i表示当上下文为context(w)时,下一个词切好是词典中第 i i i个词的概率,即: P ( w ∣ c o n t e x t ( w ) ) = e y w , i w ∑ i = 1 N e y w , i P(w|context(w))=\frac{e^{y_{w,i_w}}}{\sum_{i=1}^Ne^{y_{w,i}}} P(wcontext(w))=i=1Neyw,ieyw,iw
其中, i w i_w iw表示词在词典中的索引。
计算集中在隐藏层和输出层之间的矩阵向量运算,以及输出层上的softmax归一化运算。该模型的参数是: θ = ( b , d , W , U , C ) \theta=(b,d,W,U,C) θ=(b,d,W,U,C)
损失函数是:
L = − 1 T ∑ t log ⁡ p ^ ( w t = i ∣ w t − n + 1 , . . . , w t − 1 ) + R ( θ ) L=-\frac{1}{T}\sum_t \log \hat{p}(w_t=i|w_{t-n+1},...,w_{t-1})+R(\theta) L=T1tlogp^(wt=iwtn+1,...,wt1)+R(θ)
R ( θ ) R(\theta) R(θ)是正则化项,用于控制过拟合。
有了损失函数,我们可以用梯度下降法,在给定学习率 η \eta η的条件下,进行参数更新:更新: θ ← θ − η ∂ L ∂ θ \theta \leftarrow \theta - \eta \frac{\partial L}{\partial \theta} θθηθL直至收敛,得到一组最优参数。

基于循环神经网络的模型

为了解决定长信息的问题,Mikolov 于2010年发表的论文 Recurrent neural network based language model 正式揭开了循环神经网络(RNN)在语言模型中的强大历程。

注意力机制(attention mechanism)应用在 seq2seq 中也是为了克服 encoder 对任意句子只能给出一个固定size的表征,而这个表征在遇到长句时则显得包含信息量不够。

以序列“我想你”为例介绍RNN语言模型的建模过程:
RNN语言模型
在统计语言模型中,介绍过需要给序列添加起始符和结束符,神经网络语言模型也不例外。网络的输入层是" < s > 我想你 <s>我想你 <s>我想你",输出层可以看作是分别计算条件概率 P ( w ∣ < s > ) P(w|<s>) P(w<s>) P ( w ∣ < s > 我 ) P(w|<s>我) P(w<s>) P ( w ∣ < s > 我想 ) P(w|<s>我想) P(w<s>我想) P ( w ∣ < s > 我想你 ) P(w|<s>我想你) P(w<s>我想你)在整个词表图片中值。而我们的目标就是使期望词对应的条件概率尽可能大。

相比单纯的前馈神经网络,隐状态的传递性使得RNN语言模型原则上可以捕捉前向序列的所有信息(虽然可能比较弱)。通过在整个训练集上优化交叉熵来训练模型,使得网络能够尽可能建模出自然语言序列与后续词之间的内在联系。

神经网络语言模型小结:神经网络语言模型(NNLM)通过构建神经网络的方式来探索和建模自然语言内在的依赖关系。尽管与统计语言模型的直观性相比,神经网络的黑盒子特性决定了NNLM的可解释性较差,但这并不妨碍其成为一种非常好的概率分布建模方式。

  • 优点:(1) 长距离依赖,具有更强的约束性;(2) 避免了数据稀疏所带来的OOV问题;(3) 好的词表征能够提高模型泛化能力。
  • 缺点:(1) 模型训练时间长;(2) 神经网络黑盒子,可解释性较差。

语言模型评价指标

信息论中常采用**相对熵(relative entropy)**来衡量两个分布之间的相近程度。对于离散随机变量X,熵、交叉熵以及相对熵的定义分别如下:
H ( p ) = − ∑ i p ( x i ) log ⁡ p ( x i ) H(p)=-\sum_ip(x_i)\log p(x_i) H(p)=ip(xi)logp(xi)
H ( p , q ) = − ∑ i p ( x i ) log ⁡ q ( x i ) H(p,q)=-\sum_ip(x_i)\log q(x_i) H(p,q)=ip(xi)logq(xi)
D ( p ∣ ∣ q ) = H ( p , q ) − H ( p ) = ∑ i p ( x i ) log ⁡ p ( x i ) / q ( x i ) D(p||q)=H(p,q)-H(p)=\sum_{i}p(x_i)\log p(x_i)/q(x_i) D(p∣∣q)=H(p,q)H(p)=ip(xi)logp(xi)/q(xi)
其中, p ( x ) p(x) p(x) q ( x ) q(x) q(x)都是对随机变量概率分布的建模。

假定 p p p是样本的真实分布, q q q是对其的建模。因为真实分布的熵 H ( p ) H(p) H(p)值是确定的,因此优化相对熵 D ( p ∣ ∣ q ) D(p||q) D(p∣∣q)等价于优化交叉熵 H ( p , q ) H(p,q) H(p,q)。这里有个小细节是 H ( p , q ) ≥ H ( p ) H(p,q)\ge H(p) H(p,q)H(p)恒成立.

对于自然语言序列 W = w 1 , w 2 , . . . , w N W=w_1,w_2,...,w_N W=w1,w2,...,wN,可以推导得到对每个词的平均交叉熵为: H ( W ) = − 1 N log ⁡ P ( w 1 , w 2 , . . . , w N ) H(W)=-\frac{1}{N}\log P(w_1,w_2,...,w_N) H(W)=N1logP(w1,w2,...,wN)
显然,交叉熵越小,则建模的概率分布越接近真实分布。交叉熵描述的是样本的平均编码长度,虽然物理意义很明确,但是不够直观。因此,在此基础上,我们定义困惑度(perplexity):
P r e p l e x i t y ( W ) = 2 H ( W ) = 1 P ( w 1 , w 2 , … , w N ) N Preplexity(W) = 2^{H(W)} = \sqrt[N]{\frac{1}{ P(w_1,w_2,\ldots,w_N)}} Preplexity(W)=2H(W)=NP(w1,w2,,wN)1

由公式可知:困惑度越小,说明所建模的语言模型越精确

总结

从特性上可以将 n-gram 语言模型看作是基于词与词共现频次的统计,而神经网络语言模型则是给每个词分别赋予分布式向量表征,探索它们在高维连续空间中的依赖关系。实验证明,神经网络的分布式表征以及非线性映射更加适合对自然语言进行建模。


语言模型在机器翻译和语音识别中的应用。基于贝叶斯定理,这两类应用都可以建模为如下形式
P ( y ∣ x ) = P ( x ∣ y ) P ( y ) P ( x ) P(y|x)=\frac{P(x|y)P(y)}{P(x)} P(yx)=P(x)P(xy)P(y)
从贝叶斯概率的角度出发,可以将语言模型 P ( y ) P(y) P(y) 看作为一种先验知识,从而指导最终结果选择。


参考资料

[1] 自然语言处理中N-Gram模型介绍
[2] NLP基础:n-gram语言模型和神经网络语言模型
[3] nlp自然语言处理之word2vec–cbow和skip gram讲解
[4] 通俗理解n-gram语言模型
[5] 宗成庆老师的《统计自然语言处理 第二版》
[6] A Neural Probabilistic Language Model
[7] 深入理解语言模型 Language Model

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

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

相关文章

重磅!张文宏最新防治指南来了!

文 | 闲欢来源&#xff1a;Python 技术「ID: pythonall」最近全国各地最热门的话题恐怕都是跟“羊”有关的了。混乱时期两周之前&#xff0c;在所有人猝不及防的情况下&#xff0c;国家宣布放开疫情防控。从此我们再也不用每天排队做核酸&#xff0c;上班或者出去完也不用处处设…

二维Poisson方程五点差分格式与Python实现

最近没怎么写新文章&#xff0c;主要在学抽象代数下学期还有凸分析好累的一学期哦对&#xff0c;我不是数学系的&#xff0c;我是物理系的。而且博主需要澄清一下&#xff0c;博主没有对象&#xff0c;至少现在还没有。好&#xff0c;兄弟们&#xff0c;好习惯&#xff0c;先上…

SSM鹊巢大连分公司分销商管理系统

开发工具(eclipse/idea/vscode等)&#xff1a;idea 数据库(sqlite/mysql/sqlserver等)&#xff1a;mysql 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;、主要功能 一、&#xff1a;人员管理&#xff1a;自己派遣到各个地区的员工&#xff0c;也就是分销商&#xf…

Java平衡树之红黑树代码实现过程详解(2)

红黑树 前面介绍了2-3树&#xff0c;可以看到2-3树能保证在插入元素之后&#xff0c;树依然保持平衡状态&#xff0c;它的最坏情况下所有子结点都是2-结点&#xff0c;树的高度为lgN,相比于我们普通的二叉查找树&#xff0c;最坏情况下树的高度为N&#xff0c;确实保证了最坏情…

药学专业转行软件测试,真的可以月薪过万吗?

转行原因 我在大学里学的是药学专业&#xff0c;毕业之后也顺利从事了对口的工作——药物分析。工作很稳定&#xff0c;但是内容很繁琐&#xff0c;薪资也一般&#xff0c;但从我自己内心来说从来没有开心过&#xff0c;因为我不想从事这样枯草并且一眼就可以看到老的人生。 …

常见的DDoS攻击方式和预防方法

DDoS攻击指分布式拒绝服务攻击&#xff0c;即处于不同位置的多个攻击者同时向一个或数个目标发动攻击&#xff0c;或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。以下是三种常见的DDoS攻击方式&#xff1a; 1.TCP洪水攻击&#xff08;SYN …

ADI Blackfin DSP处理器-BF533的开发详解65:JPEG解码(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了将 480*272 尺寸的 JPEG 数据解码为 RGB888 数据功能&#xff0c;调用了 JPEG 解码库函数。 JPEG 图像数据以.dat 文件…

FineReport报表工具制作图表-JS实现下拉框选择后复选框默认全选

1. 概述 1.1 预期效果 参数联动查询时&#xff0c;希望下拉框选择后&#xff0c;复选框可以跟着选中全部所有参数值&#xff0c;效果如下图所示&#xff1a; 1.2 实现思路 参数联动查询时&#xff0c;希望下拉框选择后&#xff0c;复选框可以跟着选中全部所有参数值给下拉框添…

六、http模块

HTTP —— 超文本传输协议&#xff0c;用于规范客户端浏览器和服务端以何种格式进行通信和数据交互&#xff1b;HTTP由请求和响应构成的&#xff0c;是一个标准的客服端服务器模型。 HTTP请求响应过程 先简单的来了解以下HTTP的请求响应过程&#xff1a;1.地址解析&#xff1a…

深度学习实验(四)——卷积神经网络编程

深度学习实验四:卷积神经网络编程 本次实验练习使用torch.nn中的类设计一个卷积神经网络进行MNIST手写体数字图像分类。 name x#填写你的姓名 sid B02014152#填写你的学号print(姓名:%s, 学号:%s%(name, sid))姓名:x, 学号:B02014152import torch import torch.nn as nn im…

完全背包问题(超级详细地讲解优化过程)

完全背包问题一、问题描述二、思路分析1、状态转移方程2、循环设计三、代码模板1、朴素版2、优化版&#xff08;1&#xff09;时间优化&#xff08;2&#xff09;空间优化一、问题描述 二、思路分析 完全背包和01背包的区别就在于01背包中&#xff0c;每个物品只能选择一次&am…

Java架构师大厂面试致命十连问,你接得住吗?

1.什么是缓存雪崩&#xff1f;怎么解决&#xff1f; ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 通常&#xff0c;我们会使用缓存用于缓冲对 DB 的冲击&#xff0c;如果缓存宕机&#xff0c;所有请求将直接打在 DB&#xff0c;造…

故事分享|27岁的Leader:要成为别人的灯塔,自己得先会“发光”

学习编程的年龄跨度很大&#xff0c;有还在读小学的10后小朋友&#xff0c;也有子孙满堂的八十岁老太太&#xff0c;但主力军&#xff0c;当属90后。 很多年前&#xff0c;90后还是许多人口中“垮掉的一代”。 许多年过去了&#xff0c;当90后逐渐摘掉不成熟的标签&#xff0…

ssh前置代理

ssh前置代理ssh前置代理Linux和mac配置ssh前置proxyUbuntu和mac的ncCentos的ncWindows的ssh前置proxyssh前置代理 适用于服务器无法直接连接过去,需要用proxy才可以连接的场景. Linux和mac配置ssh前置proxy nc属命令属于nmap-ncat包 Centos的nmap-ncat版本太低了,需要到https:…

学习笔记 - MapStruct 映射工具

学习笔记 - MapStruct 映射工具简介Maven 依赖实体类 Entity数据传输对象 DTO映射接口测试类IDEA 插件与 Lombok 一起使用参考资料简介 MapStruct是一个代码生成器&#xff0c;它基于约定优于配置的方法&#xff0c;极大地简化了Java bean类型之间映射的实现。 生成的映射代码使…

第8章 关系数据库设计

第8章 关系数据库设计 考试范围&#xff1a; 8.1-8.5&#xff0c;8.8&#xff0c;8.9 考试题型: 模式分解 考试内容&#xff1a; INF概念 非规范化设计的问题&#xff1a;数据冗余&#xff0c;插入/删除/更新异常 函数依赖的概念 平凡函数依赖 函数依赖集 最小(正则)覆…

数据结构和算法学习笔记之 03.单向双向链表和环形链表构建

5.单向链表 把一个节点Node当做是一个对象&#xff0c;改对象里面包含了数据和指向下一个节点的引用指针 5.1 链表的添加和遍历 5.1.1 思路分析 添加 创建一个head头节点表示链表的头节点&#xff0c;里面的存放数据的data null每添加一个元素就直接添加到链表的最后(尾插法…

Practise test day9

另类加法_牛客网 解题思路&#xff1a;位运算符 1 0001 2 0010 按位与&&#xff1a;如果两个二进制位都为1&#xff0c;则返回1&#xff0c;否则返回0 按位异或&#xff1a;两个二进制位相同返回0&#xff0c;不同返回1。 1.二进制位异或的结果&#xff0c;是两个数对应相加…

https-OPenSSL证书生成及自签名证书

目录 SSL/TLS 1、搭建OPenssl服务器 1.1、下载 1.2、安装下载好的exe程序 2、服务器端证书-生成key、CSR、CRT 2.1、进入如下目录&#xff0c;执行cmd 2.2、生成一个私钥key 2.3、由生成的私钥key生成一个待签名的CSR证书文件(公钥) 2.4、查看证书内容 3、自建CA证书 3.1…

跨境电商卖家如何创建客户参与的 Facebook 广告?

关键词&#xff1a;跨境电商卖家、客户参与、Facebook广告 想要从您的 Facebook 广告中获得更多潜在客户或转化&#xff1f;正在寻找为您自己的广告建模的成功秘诀&#xff1f; 在本文中&#xff0c;您将了解创建消费者响应的 Facebook 广告的八个技巧。 将您现有的 Facebook 受…