Sentence-BERT论文阅读笔记

2023-11-20


这次阅读笔记主要介绍SBERT的两篇相关论文,第一篇为2019年Nils Reimers团队首次提出SBERT的论文,第二篇为2020年Nils Reimers团队在SBERT上使用的数据增强策略的论文。

SBERT是目前实用性较好的Representation-based的文本匹配模型。SBERT采用了孪生网络的结构,可以输出定长的、保有语义信息的句向量,再通过余弦相似度、曼哈顿距离或欧式距离来计算其相似度。

在这里插入图片描述(思维导图内容来自李rumor:21个经典深度学习句间关系模型|代码&技巧

1. 第一篇论文《Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks》

在这里插入图片描述


1.1 论文基本信息

论文来源:
EMNLP-IJCNLP 2019
论文引用:
Reimers N , Gurevych I . Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks[C]// Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP). 2019.
论文链接:
https://arxiv.org/abs/1908.10084
code:
https://www.sbert.net/index.html
摘要:
BERT(Devlin et al.,2018)和RoBERTa(Liu et al.,2019)在句子对打分任务(如语义-文本相似性(STS))上取得了最佳性能。然而,这需要将两个句子都输入到网络中,这会造成巨大的计算开销。例如,在10000个句子的集合中找到最相似的句子对需要使用BERT进行大约5000万次推理计算(~65小时)。BERT的构造使得它不适用于语义相似性搜索以及聚类等无监督任务。

在本文中,我们提出了Sentence-BERT(SBERT),这是对预训练BERT网络的一种修改,它使用孪生网络(siamese)和三重网络结构(triplet network)来推导语义上有意义的句子嵌入,可以使用余弦相似性进行比较。这减少了寻找最相似配对的工作量,从使用BERT/RoBERTa的65小时减少到使用SBERT的约5秒,同时保持了BERT的准确性。

我们评估了SBERT和SRoBERTa在普通STS任务和迁移学习任务中的表现,其表现优于其它最先进的句子嵌入方法。


1.2 动机

解决聚类和语义搜索的一种常用方法是将每个句子映射到向量空间,使得语义相似的句子的向量在向量空间中距离相近。

研究人员已经开始将单个句子输入到BERT中,并导出固定大小的句子嵌入。最常用的方法是平均BERT输出层(称为BERT embeddings)或使用第一个token([CLS]token)的输出。由于BERT本身的结构,这种方式得到的句子嵌入效果相当差,通常比使用GloVe词向量取平均得到的句子嵌入效果更差。

常规做法是将文本匹配转换成二分类任务。输入的两个文本拼接成一个序列(中间用特殊符号“SEP”分割),经过12层或24层Transformer模块编码后,将输出层的字向量取平均或者取“CLS”位置的特征作为句向量,经softmax完成最终分类。
在这里插入图片描述

从10,000条句子中找到最相似的一对句子,由于可能的组合众多,需要完成 n ( n − 1 ) / 2 = 49 , 995 , 000 n(n-1)/2 = 49,995,000 n(n1)/2=49,995,000次推理。

在一块V100 GPU上使用BERT计算,将消耗65小时

为了解决BERT输出的句子向量效果差\句子组合输入计算耗时太长的问题,本文提出了SBERT,采用了孪生网络的结构,可以输出定长的、保有语义信息的句向量。再通过余弦距离、曼哈顿距离或欧式距离来计算其相似度。

由于结构具有鲜明的对称性,就像两个孪生兄弟,所以下图这种神经网络结构被研究人员称作“Siamese Network”,即孪生网络

图片
其中最能体现“孪生”的地方,在于网络具有相同的编码器(sentence encoder),即将文本转换为高维向量的部分。网络随后对两段文本的特征进行交互,最后完成分类/相似预测。“孪生网络”结构简单,训练稳定,是很多文本任务不错的baseline模型。

例如,现在我们有文本1和2,首先把它们分别输入 sentence encoder 进行特征提取和编码,将输入映射到新的空间得到特征向量u和v;最终通过u、v的拼接组合,经过下游网络来计算文本1和2的相似性。

整个过程有2个值得关注的点:

  • 在训练和测试中,模型的编码器是权重共享的(“孪生”);编码器的选择非常广泛,传统的CNN、RNN和Attention、Transformer都可以
  • 得到特征u、v后,可以直接使用cosine距离、欧式距离得到两个文本的相似度;不过更通用的做法是,基于u和v构建用于匹配两者关系的特征向量,然后用额外的模型学习通用的文本关系映射;毕竟我们的场景不一定只是衡量相似度,可能还有问答、蕴含等复杂任务

由于得到了句子的嵌入向量,对于前文提到的任务,只需要计算10000个句子的余弦相似度,再计算这10000个句子的词向量两两的余弦相似度。SBert仅需5秒就能完成!

使用预先训练好的BERT和RoBERTa网络,只对其进行微调,以产生有用的句子嵌入。这大大减少了所需的训练时间:SBERT可以在不到20分钟内调整,同时比类似的句子嵌入方法产生更好的结果。

1.3 模型

SBERT沿用了孪生网络的结构,文本Encoder部分用同一个BERT来处理。

SBERT在BERT/RoBERTa的输出中添加一个Pooling操作,以导出一个固定大小的句子嵌入。

常用的Pooling操作有:

  • CLS-pooling:直接取[CLS]的Embedding
  • mean-pooling:取每个Token的平均Embedding
  • max-pooling:对得到的每个Embedding取max

为了微调BERT/RoBERTa,创建了孪生和三重网络以更新权重,从而使生成的句子嵌入具有语义意义,并且可以用余弦相似度进行比较。

同时使用了不同的目标函数进行训练。

  • 使用分类目标函数

    将u、v拼接,接入全连接网络,经softmax分类输出;损失函数用交叉熵。

在这里插入图片描述
W t ∈ R 3 n × k W_t \in R^{3n \times k} WtR3n×k, n n n为句子嵌入的维度, k k k为分类的标签数目

在这里插入图片描述

  • 回归目标函数

    直接计算、输出余弦相似度;训练损失函数采用均方根误差(MSE, mean-squared-error)

  • Triplet Objective Function

    论文中也给出了相应的损失函数
    在这里插入图片描述

对于STS(Semantic Textual Similarity )任务,SOTA方法通常学习一个(复杂的)回归函数,将句子嵌入映射到相似性分数。然而,这些回归函数是成对工作的,并且由于组合数量爆炸( N 2 N^2 N2),如果句子集合达到一定大小,这些函数通常是不可伸缩的。

在测试阶段,SBERT直接使用余弦相似度来衡量两个句向量之间的相似度,极大提升了推理速度。

在这里插入图片描述

1.4. 实验

1.4.1 训练所用的数据集

(1)SNLI语料库(1.0版)

https://nlp.stanford.edu/projects/snli/

是一个包含了57w条人工编写的英语句子对的集合,这些句子对经过手动标记以实现平衡分类,并带有蕴含,矛盾和中立(entailment, contradiction, and neutral.)标签,支持自然语言推理(NLI)的任务,也称为文本蕴含识别(textual entailment recognition)。
在这里插入图片描述
(2)Multi-Genre NLI

https://cims.nyu.edu/~sbowman/multinli/

Multi-Genre NLI是SNLI的升级版,格式一样,包含43w条英文句子对,不同之处是涵盖了口语和书面文本的一系列体裁,并支持独特的cross-genre transfer 评估

1.4.2 实验结果

测试数据:

  • STS12-STS16:SemEval 2012-2016

  • STSb: STSbenchmark

    STS基准(STSb)(Cer等人,2017年)提供了一个流行的数据集,用于评估有监督的STS系统。数据包括8628个句子对,来自三个类别:标题、新闻和论坛。分为train(5749)、dev(1500)和test(1379)。

    数据示例:

    3.750	A dog is trying to get bacon off his back.	A dog is trying to eat the bacon on its back.
    
  • SICK-R: SICK relatedness dataset

无监督实验结果

在这里插入图片描述

通过计算句子嵌入的余弦相似度和测试数据给出的参考相似度标签之间的斯皮尔曼秩相关来评估模型。

斯皮尔曼等级相关系数(Spearman’s rank correlation coefficient)

它利用单调方程评价两个统计变量的相关性。若数据中没有重复值,且当两变量完全单调相关时,斯皮尔曼相关系数为 +1 或 −1 。

斯皮尔曼相关系数被定义成等级变量之间的皮尔逊相关系数。对于样本容量为n的样本,n个原始数据 X i , Y i X_i,Y_i Xi,Yi被转换成等级数据 x i , y i x_i,y_i xi,yi相关系数为
ρ = ∑ i ( x i − x ˉ ) ( y i − y ˉ ) ∑ i ( x i − x ˉ ) 2 ∑ i ( y i − y ˉ ) 2 \Large \rho ={\frac {\sum _{i}(x_{i}-{\bar {x}})(y_{i}-{\bar {y}})}{{\sqrt {\sum _{i}(x_{i}-{\bar {x}})^{2}\sum _{i}(y_{i}-{\bar {y}})^{2}}}}} ρ=i(xixˉ)2i(yiyˉ)2 i(xixˉ)(yiyˉ)

等级数据 x i , y i x_i,y_i xi,yi是每个原始数据的降序位置的平均。

变量 降序位置(仅示意,不使用) 降序位置的平均(使用)
0.8 5 5
1.2 4 4 + 3 2 = 3.5 \frac {4+3} {2} = 3.5 24+3=3.5
1.2 3 4 + 3 2 = 3.5 \frac {4+3} {2} = 3.5 24+3=3.5
2.3 2 2
18 1 1

实际应用中,变量间的连结是无关紧要的,于是可以通过简单的步骤计算 ρ。

被观测的两个变量的等级的差值 d i = x i − y i d_i = x_i - y_i di=xiyi,则 ρ = 1 − 6 ∑ d i 2 n ( n 2 − 1 ) \Large \rho =1-{{\frac {6\sum d_{i}^{2}}{n(n^{2}-1)}}} ρ=1n(n21)6di2

在这里插入图片描述
正的斯皮尔曼相关系数反应两个变量 XY 单调递增的趋势。

结果表明,直接使用BERT的输出会导致相当差的性能。平均BERT嵌入实现的平均相关性仅为54.81,并且使用[CLS]token输出仅实现29.19的平均相关性。两者都比计算平均Glove词向量的效果差。

使用本文所提出的孪生网络结构和微调机制显著提高了相关性,大大优于InferSent和USE。

SBERT的表现比USE差的唯一数据集是SICK-R。

有监督实验结果
进行两部分的实验,只在STSb数据集上训练和先在NLI数据集上训练,再在STSb数据集上训练。
在这里插入图片描述
可以发现,更多的训练数据,带来了效果上的提升。同时,BERT和RoBERTa之间没有显著的性能差异。

1.4.3 消融实验

首先评估不同的池化策略,其次对于分类目标函数,评估不同的u,v向量拼接策略。

对于分类目标函数,我们基于SNLI和多NLI数据集训练SBERT。

对于回归目标函数,我们在STS基准数据集的训练集上进行训练。

使用余弦相似性和斯皮尔曼秩相关在STSb的dev set上评估。

当在NLI数据集上使用分类目标函数训练时,池化策略的影响非常小,u,v向量拼接方式的影响要更大一些。最重要的部分是element-
wise difference: ∣ u − v ∣ |u-v| uv,度量两个句子嵌入的维度之间的距离,确保相似对更接近,而不同对更远离。

1.5 小结

抛开具体任务,SBERT 可以帮助我们生成更好的句向量,在一些任务上可能产生更优结果。在推理阶段,SBert直接计算余弦相似度的方式,大大缩短了预测时间,在语义检索、信息搜索等任务中预计会有不错表现。


2. 第二篇论文:Augmented SBERT: Data augmentation method for improving bi-encoders for pairwise sentence scoring tasks

在这里插入图片描述


2.1 论文基本信息

论文来源:
arXiv
论文引用:
Thakur N, Reimers N, Daxenberger J, et al. Augmented sbert: Data augmentation method for improving bi-encoders for pairwise sentence scoring tasks[J]. arXiv preprint arXiv:2010.08240, 2020.
论文链接:
https://arxiv.org/abs/2010.08240
code:
https://www.sbert.net/index.html
摘要:
句子对评分有两种方法:一是Cross-encoders,对输入对执行full-attention;二是Bi-encoders,将每个输入独立地映射到密集向量空间。虽然Cross-encoders通常可以获得更高的性能,但对于许多实际使用场景来说,它们的速度太慢了。另一方面,Bi-encoders需要大量的训练数据和针对目标任务的微调,使模型达到具有竞争力的性能。本文提出了一种简单而有效的数据增强策略,称为增强SBERT,其中我们使用Cross-encoders来标记一组数据更多的输入对,以增强Bi-encoders的训练数据。我们展示了,在这个过程中,选择句子对是非常重要的,也是该方法成功的关键。我们在多个领域内任务和一个领域自适应任务上评估我们的方法。与Bi-encoders性能相比,增强SBERT在领域内任务和领域自适应任务上分别提高了6个百分点和37个百分点。


2.2 动机

通常Cross-encoders的性能指标更佳,但是运行效率不高,同时因为不能为可索引的输入生成独立的向量表示。相反,bi-encoders如SBERT,可以对每个句子进行独立编码,并将其映射到稠密向量空间,允许高效的索引和比较。

下面是一个对比试验,用经过微调的cross-encoder(BERT)和经过微调的bi-encoder(SBERT)做对比,两种模型使用不同规模的训练数据在STSb数据集上的测试分数对比。

在这里插入图片描述
可以发现,当训练数据不足的时候,性能的差距最为明显。因此,本文提出了一种数据增强的方法,称为Augmented SBERT(AugSBERT)

2.3 模型

2.3.1 Augmented SBERT

给定一个经过预训练、性能良好的cross-encoder,我们根据特定的采样策略(稍后讨论)对句子对进行采样,并使用cross-encoder标记这些句子对。我们将这些弱标记的示例称为silver数据集,它们将与gold训练数据集合并。然后,我们在这个扩展的训练数据集上训练bi-encoder。我们将此模型称为Augmented SBERT(AugSBERT)。

在这里插入图片描述
句子对采样策略:

使用cross-encoder标记的新句子对可以是新数据,也可以重复使用gold训练集中的单个句子并重新组合。在我们的领域内实验中,我们重复使用来自gold训练集的句子。

因为 n n n个句子就有 n × ( n − 1 ) / 2 n \times (n-1)/2 n×(n1)/2种可能的组合,选择正确的采样策略对性能提升是十分重要的。

  • Random Sampling(RS)

    随机抽样,随机选择两个句子通常会抽出一对不相似的句子,会使silver数据集的标签分布极度的倾向负对。

  • Kernel Density Estimation (KDE)

    目标是为silver数据集获得与golden训练集相似的标签分布。为此,我们对一大组随机抽样的对进行弱标记,然后只保留某些对。

    对于分类任务,我们保留sliver数据集中的所有正对。随后,我们从剩余的负对中随机抽取一些,使得sliver数据集的分布(正/负)比例与golden数据集训练相同。

    对于回归任务,我们使用核密度估计(KDE)来估计分数s的连续密度函数 F g o l d ( s ) F_{gold}(s) Fgold(s) F s l i v e r ( s ) F_{sliver}(s) Fsliver(s)。试图最小化分布间的K-L散度。

    以概率 Q ( s ) Q(s) Q(s)保留得分为 s s s的样本。
    在这里插入图片描述

  • BM25 Sampling

    BM25是信息索引领域用来计算query与文档相似度得分的经典算法,基于词汇重叠。

    对每个独特的句子进行索引,查询每个句子并检索前k个相似的句子,之后用cross-encoder进行弱标记。

  • Semantic Search Sampling

    BM25的缺点是只能找到有词汇重叠的句子。没有或几乎没有词汇重叠的同义句将不会返回,因此不会成为silver数据集的一部分。在golden训练集上训练一个SBERT,并使用它进一步对相似的句子对进行采样。我们使用余弦相似性,为每个句子检索集合中前k个最相似的句子。对于大型集合,可以使用近似最近邻搜索(如Faiss4)快速检索k个最相似的句子。

  • BM25 + Semantic Search Sampling

    同时应用BM25和语义搜索抽样技术。聚合这些策略有助于捕获词汇和语义相似的句子,但会使标签分布偏向否定对。

2.3.2 Domain Adaptation with AugSBERT

我们期望SBERT在域外数据上有更好的表现。

SBERT无法将带有未见过的术语的句子映射到一个有语义含义的向量空间。

不幸的是,新领域的标记数据很少可用。

在这里插入图片描述

因此,我们评估了本文提出的数据增强策略在领域自适应任务上的表现:

  1. 在包含成对注释的源域上微调cross-encoder(BERT)。
  2. 在微调之后,我们使用这个微调的cross-encoder来标记目标域的数据。
  3. 一旦完成标记,我们就用标记的句子对训练bi-encoder(SBERT)。

2.4 实验

2.4.1 数据集

句子对评分可以分为回归和分类任务。回归任务分配一个分数来表示输入之间的相似性。对于分类任务,我们有不同的标签,例如,paraphrase和 non-paraphrase。

2.4.1.1 单领域数据集

在我们的单域(即域内)实验中,设置了如下任务:

句子对回归任务:

  • 语义-文本相似度(SemEval Spanish STS)
  • 论点相似度(BWS Argument Similarity Dataset (BWS):)

二元句子对分类任务

  • 重复问题检测(Quora Question Pairs (Quora-QP))
  • 新闻转述识别(Microsoft Research Paraphrase Corpus (MRPC))

在这里插入图片描述

2.4.1.2 多领域数据集

重复问题检测建模为问题与问题(标题/标题)二元分类任务。

下面四个数据集全部是重复问题检测的数据集,用来做领域自适应实验。

  • AskUbuntu: 来自Stack Exchange,一个技术社区支持论坛
  • Quora: 源于Quora网站
  • Sprint: Sprint FAQ是从Sprint技术论坛网站爬取的数据集。
  • SuperUser: 来自Stack Exchange,一个技术社区支持论坛

在这里插入图片描述
比率表示重复对(正)比非重复对(负)。

2.4.2 实验结果

领域内任务的训练结果
在这里插入图片描述
可以发现,AugSBERT在回归和分类任务上的表现均超过了SBERT,并且在某些数据集上甚至超过了作为性能上界的BERT(cross-encoder)

再来看看AugSBERT模型的迁移能力。Source代表源域,Target代表目标域,In-Domain中的SBERT表示直接用目标域的数据进行训练
在这里插入图片描述
从实验结果中可以看出,同普通的SBERT模型相比,AugSBERT的模型迁移能力有较大提升,在多个任务上逼近了性能上限,特别当模型在Quora数据集上训练,在Sprint数据集上测试时,AugSBERT的效果甚至优于直接在Sprint数据集上训练的SBERT。

个人推测,实验结果与数据集的领域有较大关系。AskUbuntu,Sprint和 SuperUser均为来自技术社区论坛的数据集,而Quora数据集涉及的领域会更通用一些。 从实验结果中可以发现,如果SBERT在Quora数据集上训练,迁移到其它三个数据集上测试时,结果和瞎猜几无二致,而在另外三个数据集之间迁移的效果,并没有很糟糕。经过数据增强后,在Quora数据集上train出来的BERT能标注一些目标域的数据,AugSBERT还是“看到了”许多目标域的数据,因此提升较为明显。反之,在AskUbuntu,Sprint和 SuperUser数据集上trian出来的BERT,在标注Quora数据集时效果不佳,从实验结果中可以看出,向Quora数据集上迁移时,AugSBERT相比SBERT几乎没有提升。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sentence-BERT论文阅读笔记 的相关文章

  • html效果总结记录

    自动换行 style word break break all 改变布局或者显示文字 在html中插入如下类似代码
  • html5 图片下拉加载动画效果,HTML5和CSS3炫酷彩色loading加载动画特效

    这是一款HTML5和CSS3炫酷彩色loading加载动画特效 该loading加载动画特效共15种动画效果 它们分别通过div盒子或svg元素 配合CSS3来制作loading动画效果 使用方法 HTML结构 第一种loading加载动画
  • MySQL基本操作四:数据的查询

    之前我介绍了MySQL中 数据记录的增 删 改操作 本文我们看查询操作 为方便后面举例 还是先建立一个表 并插入一些数据 我在这里依旧建立一个学生信息表 建表的代码如下 CREATE TABLE tab student StuID CHAR
  • linux docker 基础命令

    docker常用命令 docker ps 显示所有的操作命令集合列表 docker login container registry oracle com 登录官方远程docker私有仓库 docker login username tes

随机推荐

  • spss练习数据_SPSS篇——数据的筛选

    前言 我们知道 在做数据分析时 经常要对数据库中的个案进行选择性的分析 由此排除一些数据 那么该如何利用SPSS进行数据的筛选呢 Step 1 打开SPSS 打开 数据 选择个案 Step 2 选择个案 对话框右侧 选择 栏有5个选项 所有
  • 云计算入门基础命令行

    严重声明 本人支持一切正规软件开发行为 接受知识付费理念 并坚决抵制盗版行为 用于学习交流的非盈利目的的 且法律允许且支持的条件下 可以进行相关文件交流 他人利用交流文件进行非法售卖等一切违法犯罪行为 本人概不负责 分享的网页链接能保证截止
  • Dynamics CRM online 添加附件

    1 创建一个字段 类型为文件 2 通过PoweApps将该字段添加到Form表单上
  • ESP8266上电时串口打印乱码原因和发送AT指令串口返回信息含义

    因为esp8266模块上电时 默认打印波特率为74880 其固件中通信与串口默认为115200 所以如果把串口设置为74880 之后再上电模块打印的信息就不会有乱码了 但AT指令默认通信波特率是115200 如果在使用AT通信时 在调到11
  • Docker 容器迁移

    1 把容器打包成镜像 docker commit m 描述 a 作者 CONTAINER ID 新的镜像名 docker commit m my rabbitmq a eric a922049125c4 rabbitmq my 1 0 2
  • QT 改编官方example QQuickView实现QQuickWidgt示波器

    先找到官方实例 将官方实例的QML文件全部搞到自己的资源中 pro中加入这个 DISTFILES 刚刚的QML文件路径 qml 还有这个 QT core gui quickwidgets QT qml 将官方的datasource cpp
  • k8s部署Prometheus抓取pods的metrics

    1 暴露pods给Prometheus抓取 spec replicas app replicas template metadata annotations prometheus io scrape true prometheus io p
  • centos7没有ens33网卡的解决方案

    1 首先设置在系统启动时激活网卡 vim etc sysconfig network scripts ifcfg ens33 将ONBOOT no改为ONBOOT yes 2 执行下面的命令 此时ifconfig 显示有了ens33网卡 但
  • 【Linux】Libevent库

    Libevent 高性能I O框架库 底层封装了select poll epoll 便于使用 I O框架库以库函数的形式 封装了较为底层的系统调用 给应用程序提供了一组更便于使用的接口 特点 1 跨平台 2 统一事件源 I O事件 信号 定
  • Jeesite框架实用 前端页面展示表如何插入其他表数据

    目录 前言 问题 解决方法 第一步 第二步 第三步 前言 最近做类似于OA产品时选用了Jeesite框架 也学习有一段时间 这个框架的初级操作嘛就是 设计好表然后用代码生成器生成 一张表生成一个前端页面显示 问题 代码生成器根据一张数据库表
  • Huggingface训练Transformer

    在之前的博客中 我采用SFT 监督优化训练 的方法训练一个GPT2的模型 使得这个模型可以根据提示语进行回答 具体可见博客召唤神龙打造自己的ChatGPT gzroy的博客 CSDN博客 Huggingface提供了一个TRL的扩展库 可以
  • Linux基础命令1(农夫笔记-自用)

    1 创建和查看隐藏文件 以 开头的文件或文档 攻击者可能要去传一个木马或者后门 或者自己要去做这些事情的时候需要用到 2 cd 等于cd 一样的作用 可以回到家目录 3 ll是ls l的别名 也具有同样的效果 就是使用较长格式列出信息 4
  • MATLAB中如何输入特殊符号

    alpha beta gamma theta Theta Gamma delta Delta xi Xi elta epsilong zeta miu nu tau lamda Lamda pi Pi sigma Sigma phi Phi
  • 初识express/路由/中间件

    路由的概念 模块化路由 中间件 要有输入输出 简化版本 全局生效中间件 局部生效中间件 注意事项 中间件分类 内置中间件 解析请求体 url encoded 自定义中间件 使用querystring模块解析请求体数据 编写接口
  • Linux笔记

    文章目录 一 初识Linux 1 操作系统概述 1 1 计算机由哪两个主要部分组成 1 2 操作系统是什么 有什么作用 1 3 常见的操作系统有哪些 2 Linux初识 3 虚拟机介绍 3 1 什么是虚拟机 3 2 为什么要使用虚拟机 4
  • 小程序扫码只允许扫码运单条形码

    wx scanCode success res gt console log res let result res result 只允许 字母 数字 字母 数字 if result 0 9a zA Z g test result wx sh
  • [网络安全自学篇] 二十七.Sqlmap基础知识、CTF实战及请求参数设置(一)

    这是作者的系列网络安全自学教程 主要是关于网安工具和实践操作的在线笔记 特分享出来与博友共勉 希望您们喜欢 一起进步 前文分享了Shodan搜索引擎的基本用法及Python命令行 本篇文章详细讲解了Sqlmap的基本用法 CTF实战 并且分
  • 由浅及深PCB布线设计

    第一部分 在当今激烈竞争的电池供电市场中 由于成本指标限制 设计人员常常使用双面板 尽管多层板 4层 6层及8层 方案在尺寸 噪声和性能方面具有明显优势 成本压力却促使工程师们重新考虑其布线策略 采用双面板 在本文中 我们将讨论自动布线功能
  • 动态规划——数字三角形C语言

    一 分析 先说一下相关动态规划的一些概念 参考下方博文 原文链接 https blog csdn net every day article details 88174082 一个模型三个特征 理论的讲解 动态规划作为一个非常成熟的算法思想
  • Sentence-BERT论文阅读笔记

    目录 1 第一篇论文 Sentence BERT Sentence Embeddings using Siamese BERT Networks 1 1 论文基本信息 1 2 动机 1 3 模型 1 4 实验 1 4 1 训练所用的数据集