目录

  • 《Skip-Though Vector》 —— 跳跃思维句表示
  • 1、句表示简介
    • 1.1 基于词袋模型的句表示
      • 1.1.1 词袋模型
      • 1.1.2 词表示加权 -> 句表示
    • 1.2 基于神经网络的句表示
      • 1.2.1 语言模型
      • 1.2.2 doc2vec
      • 1.2.3 基于复述句匹配的句表示
  • 2、论文动机
    • 2.1 Skip-gram模型
  • 3、Skip-Thought模型
    • 3.1 Skip-Thought具体原理
    • 3.2 Skip-Thought模型损失函数
    • 3.3 未登录词处理
  • 4、实验结果
    • 4.1 语义相似性度量:两个句子的语义相似性计算(余弦相似度)
    • 4.2 复述句检测:判断两个句子是否语义一致(二分类)
    • 4.3 句子分类:判断句子属于哪个类别
  • 5、后续改进
    • 5.1 Quick Thought
  • 6、总结
    • 6.1 论文主要创新点

《Skip-Though Vector》 —— 跳跃思维句表示

作者:Ryan Kiros
单位:University of Toronto
发表会议及时间:NIPS 2015

1、句表示简介

神经网络模型生成的词表示被称为词向量,这是一个低维的向量表示,已经成为了当前工业界和学术界的通用文本表示方法。在自然语言处理领域,有着很多句子级别的任务,例如情感分析、句对匹配等。毫无疑问,句子级别的建模能够更为有效地改善这些任务的处理性能。

通过某种方式将句子编码为计算机可以处理的形式(向量),实现一次表示,多领域应用,是自然语言表示总的重要任务。

句表示研究意义

一次表示,多领域应用,以及预先训练,应用微调已经成为了工业界解决具体NLP任务的最佳思路,因为其可以充分利用无监督的数据来辅助有监督任务学习语言信息,往往也能取得很好的效果。

两种应用思路:句表示训练完毕后不再调整,只在具体任务上训练分类器;或者句表示的编码模型也随着下游任务进行训练,如Bert。

句表示发展历史

趋势:让句子的语义更“准确”地编码到有限维的向量中,在向量子空间中保持句子的语义关系,更好地利用语言模型以及无监督上下文信息;

1.1 基于词袋模型的句表示

1.1.1 词袋模型

One-hot编码,又称为独热编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有其独立的寄存器位,并且在任意时候,其中只有一位有效,One-hot在特征提取上属于词袋模型(bag of words)。关于如何使用one-hot抽取文本特征向量我们通过以下例子来说明,假设语料库中有三段话:

1.1.2 词表示加权 -> 句表示

另一种基于词袋模型的方法是将词向量进行加权得到稠密的句表示,词向量的加权方式一般遵循一个准则,越常见的词权重越小,这里简单介绍两种:

(1)TF-IDF算法

TF-IDF算法(Term Frequency-Inverse Document Frequency,词频-逆文档频次算法)是一种基于统计的计算方法,常用于评估在一个文档集中一个词对某份文档的重要程度。

从算法的名称就可以看出,TF-IDF算法由两部分组成:TF算法及IDF算法。

TF算法是统计一个词在一篇文档中出现的频次,其基本思想是,一个词在文档中出现的次数越多,则其对文档的表达能力也就越强。

IDF算法是统计一个词在文档集的多少个文档中出现,其基本思想是,如果一个词在越少的文档中出现,则其对文档的区分能力也就越强。

TF算法和IDF算法也能单独使用,但是在使用过程中发现这两种算法都有其不足之处。TF算法仅衡量词的出现频次,但是没有考虑到词对文档的区分能力。

比如下面这篇文档:

世界献血日,学校团体、献血服务志愿者等可到血液中心参观检验加工过程,我们会对检验结果进行公示,同时血液的价格也将进行公示。

上文中“献血”“血液”“进行”“公示”等词出现的频次为2,如果从TF算法的角度,它们对于这篇文档的重要性是一样的。但是实际上明显“血液”“献血”对这篇文档来说更关键。而IDF则是相反,强调的是词的区分能力,但是一个词既然能在一篇文档中频繁出现,那说明这个词能够很好地表现这篇文档的特征,忽略这一点显然也是不合理的,于是,学者们将这两种算法综合进行使用,构成TF-IDF算法,从词频、逆文档频次两个角度对词的重要性进行衡量。

在实际使用中,TF的计算公式如下所示:tfij=nij∑knijtf_{ij}=\frac{n_{ij}}{\sum_kn_{ij}}tfij=knijnij

公式中的nijn_{ij}nij表示词i在文档j中的出现频次,但是仅用频次来表示,长文本中的词出现频次高的概率会更大,这一点会影响到不同文档之间关键词权值的比较。所以在计算过程中一般会对词频进行归一化。分母部分就是统计文档中每个词出现次数的总和,也就是文档的总次数。

以上文文档为例,“献血”一次出现次数为2,文档的总词数为30,则:tf(献血)=n(献血)/n(总)=2/30≈0.067tf(献血)=n(献血)/n(总)=2/30\approx 0.067tf()=n()/n()=2/300.067

更直白的表示方式就是:tf(word)=(word在文档中出现的次数)/(文档总次数)tf(word)=(word在文档中出现的次数)/(文档总次数)tf(word)=(word)/()

而IDF的计算常用式为:idfi=log(∣D∣1+∣Di∣)idf_i = log(\frac{|D|}{1+|D_i|})idfi=log(1+DiD)

∣D∣|D|D为文档集中总文档数,∣Di∣|D_i|Di为文档集中出现词i的文档数量。分母加1是采用了拉普拉斯平滑,避免有部分新的词没有在语料库中出现过而导致分母为零的情况出现,增强算法的健壮性。

TF-IDF算法就是TF算法和IDF算法的综合使用,具体计算方法如下所示:tf−idf(i,j)=tfij∗idfi=nij∑knij∗log(∣D∣1+∣Di∣)tf-idf(i,j)=tf_{ij}*idf_{i}=\frac{n_{ij}}{\sum_kn_{ij}}*log(\frac{|D|}{1+|D_i|})tfidf(i,j)=tfijidfi=knijnijlog(1+DiD)

以上文文档为例,经过计算得到“献血”“血液”“进行”“公示”四个词出现的频次均为2,因此它们的tf值都是0.067。现在假设我们具有的文档集有1000篇文档,其中出现“献血”“血液”“进行”“公示”的文档数分别为10、15、100、50,则根据上述TF-IDF计算公式可以得到每个词的tf-idf值。

(2)SIF算法

SIF算法仅仅考虑TF,其计算公式如下:SIF(x)=αTF(x)+αSIF(x)=\frac{\alpha}{TF(x)+\alpha}SIF(x)=TF(x)+αα

这种方法的优点是简单快捷,缺点是没有考虑语序,没有合理地利用句子语义信息;

1.2 基于神经网络的句表示

1.2.1 语言模型

  • Sentence 1:美联储主席本·伯南克昨天告诉媒体7000亿元的救助资金;
  • Sentence 2:美主席联储本·伯南克告诉昨天媒体7000亿元的资金救助;

以上哪一个句子更像一个合理的句子?如何量化评估?

使用语言模型:P(S)=P(w1,w2,⋯,wn)=P(w1)P(w2∣w1)P(w3∣w1,w2)⋯P(wn∣w1,w2,⋯,wn−1)P(S)=P\left(w_{1}, w_{2}, \cdots, w_{n}\right)=P\left(w_{1}\right) P\left(w_{2} \mid w_{1}\right) P\left(w_{3} \mid w_{1}, w_{2}\right) \cdots P\left(w_{n} \mid w_{1}, w_{2}, \cdots, w_{n-1}\right)P(S)=P(w1,w2,,wn)=P(w1)P(w2w1)P(w3w1,w2)P(wnw1,w2,,wn1)

量化评估:L=∑w∈Clog⁡P(w∣context⁡(w))L=\sum_{w \in C} \log P(w \mid \operatorname{context}(w))L=wClogP(wcontext(w))

1.2.2 doc2vec

doc2vec利用的就是语言模型,doc2vec在模型中加入了段落ID或者句子ID,如果语料中有K个句子,该模型就会随机初始化一个K∗DK*DKD的矩阵,D表示要训练的句子的维度,训练完成后就得到了句子表示的向量。

这种方法的优点是能够充分利用语言模型,但是该模型没有考虑到句子之间的信息。

1.2.3 基于复述句匹配的句表示

  • Sentence 1:小王是老王的儿子;
  • Sentence 2:老王是小王的爸爸;

上述两个句子互为复述句,应该语义接近(句表示近似)。

衡量指标为:1∣S∣(∑<s1,s2>∈Smax⁡(0,δ−cos⁡(g(s1),g(s2))+−cos⁡(g(s1),g(t1)))+max⁡(0,δ−cos⁡(g(s1),g(s2))+−cos⁡(g(s2),g(t2))))\frac{1}{|S|}(\sum_{<s_{1}, s_{2}>\in S}\max \left(0, \delta-\cos \left(g\left(s_{1}\right), g\left(s_{2}\right)\right)+-\cos \left(g\left(s_{1}\right), g\left(t_{1}\right)\right)\right)+\max \left(0, \delta-\cos \left(g\left(s_{1}\right), g\left(s_{2}\right)\right)+-\cos \left(g\left(s_{2}\right), g\left(t_{2}\right)\right)\right))S1(<s1,s2>Smax(0,δcos(g(s1),g(s2))+cos(g(s1),g(t1)))+max(0,δcos(g(s1),g(s2))+cos(g(s2),g(t2))))

测试数据集包括情感分类、主题分类、语义相似度度量、复述句检测、文本蕴含等;
测试方法为:固定句表示,在对应任务等训练数据集上学习分类器;

两类方法对比

基于语言模型的句表示:利用了无监督文本语料,利用了词与词共现信息,可大规模训练;

  • 优点:利用无监督语料,成本低;语言模型学习语言知识;
  • 缺点:句子之间隐藏的语义联系;学习句表示,忽略句子间的信息是极为不合理的;

基于复述句对的句表示方法:语料可通过机器翻译大规模获得;建模句对关系;

  • 优点:建模了句对之间的相似与不相似关系;
  • 缺点:仅仅建模了相关性,忽略了句子间复杂的语义关系;

Skip-thought的目的是利用大规模无监督语料建模句子间的关系

2、论文动机

在词向量表征中,我们可以由一个词的上下文了解词的语义信息,我们把这一个定理推广到句子级别是否也成立呢?

假设语料库中有一段话:

  • 自然语言处理是计算机科学领域与人工智能领域中的一个重要方向;
  • 它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法;
  • 自然语言处理是一门融语言学、计算机科学、数学于一体的科学。

在一段话中,句子与其上下句总是存在某些语义联系的,能否通过一个句子预测出其上下文的句子?

先回顾一下Skip-gram模型。

2.1 Skip-gram模型

Skip-gram模型是通过中心词预测背景词,如下图所示,通过中心词learning预测其上下文两个背景词。


其损失函数和概率计算公式如下所示:L=−1T∑t=1T∑−m≤j≤m,j≠0log⁡p(wt+j∣wt)L=-\frac{1}{T} \sum_{t=1}^{T} \sum_{-m \leq j \leq m,j \neq 0} \log p\left(w_{t+j} \mid w_{t}\right)L=T1t=1Tmjm,j=0logp(wt+jwt) p(wt+j∣wt)=exp⁡(vwtTvwt+j)∑i=1⌈V∣exp⁡(vwtTvwi)p\left(w_{t+j} \mid w_{t}\right)=\frac{\exp \left(\mathbf{v}_{w_{t}}^{\mathrm{T}} \mathbf{v}_{w_{t+j}}\right)}{\sum_{i=1}^{\lceil V \mid} \exp \left(\mathbf{v}_{w_{t}}^{\mathrm{T}} \mathbf{v}_{w_{i}}\right)}p(wt+jwt)=i=1Vexp(vwtTvwi)exp(vwtTvwt+j)

Skip-gram的思想能否迁移到句子级别?

3、Skip-Thought模型

3.1 Skip-Thought具体原理

给定一个句子"I could see the cat on the steps",其对应的上一句话为"I got back home",其下一句话为"This was strange"。

Skip-Though模型希望通过编码中间的句子来预测其前一个句子和后一个句子,前一个句子和后一个句子分别用不同的解码器进行解码,也就是根据中间句子的句向量表示进行自回归的Decoder把句子解码出来,这借鉴了机器翻译中的思想。

使用两个独立的Decoder分别建模前一句和后一句是为了用独立的语义去编码前一句和后一句。

Skip-Thought模型的编码器部分使用GRU进行Encoder,GRU中有更新门和重置门,更新门对应ztz^tzt,重置门对应rtr^trt。更新门用于控制前一个时刻的信息被带入当前时刻的程度,更新门的值越大,说明前一时刻的信息带入当前时刻越多。重置门控制的是前一时刻有多少信息被写入到当前时刻的候选集。GRU主要的公式如下所示:rt=σ(Wrxt+Urht−1)\mathbf{r}^{t}=\sigma\left(\mathbf{W}_{r} \mathbf{x}^{t}+\mathbf{U}_{r} \mathbf{h}^{t-1}\right)rt=σ(Wrxt+Urht1)zt=σ(Wzxt+Uzht−1)\mathbf{z}^{t}=\sigma\left(\mathbf{W}_{z} \mathbf{x}^{t}+\mathbf{U}_{z} \mathbf{h}^{t-1}\right)zt=σ(Wzxt+Uzht1)h‾t=tanh⁡(Wxt+U(rt⊙ht−1))\overline{\mathbf{h}}^{t}=\tanh \left(\mathbf{W} \mathbf{x}^{t}+\mathbf{U}\left(\mathbf{r}^{t} \odot \mathbf{h}^{t-1}\right)\right)ht=tanh(Wxt+U(rtht1))ht=(1−zt)⊙ht−1+zt⊙h‾t\mathbf{h}^{t}=\left(1-\mathbf{z}^{t}\right) \odot \mathbf{h}^{t-1}+\mathbf{z}^{t} \odot \overline{\mathbf{h}}^{t}ht=(1zt)ht1+ztht

接下来讲解一下Skip-Thought部分的解码器,Decoder部分使用的同样是GRU,Decoder部分的GRU是带有条件信息的,也就是编码器得到的中间句子的编码信息hih_ihi,从而使得Encoder部分的GRU每次都能携带中间句子的信息做出决策。

Skip-Thought解码器部分的计算公式为:rt=σ(Wrdxt−1+Urdht−1+Crhi)\mathbf{r}^{t}=\sigma\left(\mathbf{W}_{r}^{d} \mathbf{x}^{t-1}+\mathbf{U}_{r}^{d} \mathbf{h}^{t-1}+\mathbf{C}_{r} \mathbf{h}_{i}\right)rt=σ(Wrdxt1+Urdht1+Crhi)zt=σ(Wzdxt−1+Uzdht−1+Czhi)\mathbf{z}^{t}=\sigma\left(\mathbf{W}_{z}^{d} \mathbf{x}^{t-1}+\mathbf{U}_{z}^{d} \mathbf{h}^{t-1}+\mathbf{C}_{z} \mathbf{h}_{i}\right)zt=σ(Wzdxt1+Uzdht1+Czhi)h‾t=tanh⁡(Wdxt+Ud(rt⊙ht−1)+Chi)\overline{\mathbf{h}}^{t}=\tanh \left(\mathbf{W}^{d} \mathbf{x}^{t}+\mathbf{U}^{d}\left(\mathbf{r}^{t} \odot \mathbf{h}^{t-1}\right)+\mathbf{C h}_{i}\right)ht=tanh(Wdxt+Ud(rtht1)+Chi)hi+1t=(1−zt)⊙ht−1+zt⊙h‾t\mathbf{h}_{i+1}^{t}=\left(1-\mathbf{z}^{t}\right) \odot \mathbf{h}^{t-1}+\mathbf{z}^{t} \odot \overline{\mathbf{h}}^{t}hi+1t=(1zt)ht1+ztht

3.2 Skip-Thought模型损失函数

Skip-Thought模型的思想是给定中心句预测其上一个句子和下一个句子,所以只需要给定一段(三句)文本(si−1,si,si+1s_{i-1},s_i,s_{i+1}si1,si,si+1),因此可以用两个函数建模损失函数:∑tlog⁡P(wi+1t∣wi+1<t,hi)+∑tflog⁡P(wi−1t∣wi−1<t,hi)\sum_{t} \log P\left(w_{i+1}^{t} \mid w_{i+1}^{<t}, \mathbf{h}_{i}\right)+\sum_{t}^{f} \log P\left(w_{i-1}^{t} \mid w_{i-1}^{<t}, \mathbf{h}_{i}\right)tlogP(wi+1twi+1<t,hi)+tflogP(wi1twi1<t,hi)

损失函数的意义是首先对中心句进行编码得到hih_ihi,然后由hih_ihi进行损失函数的计算;

模型将训练集的所有句子组合加入训练,在测试时将句子所有单词的 embedding 输入到 encoder 即可得到句子的 embedding 。

3.3 未登录词处理

如果测试时某些单词未在训练时见过(未登录词),则可以通过一些广义词向量来解决。如:假设 Vw2vV_{w2v}Vw2v为更大规模的、通过 word2vec 训练得到的词向量,VrnnV_{rnn}Vrnn 为本模型训练得到的词向量。我们学习线性映射f:Vw2v→Vrnnf:V_{w2v}\rightarrow V_{rnn}f:Vw2vVrnn,然后对于模型的未登录词wuw_uwu,得到模型的词向量x→urnn=f(x→uw2v)\overrightarrow{\mathbf{x}}_{u}^{r n n}=f\left(\overrightarrow{\mathbf{x}}_{u}^{w 2 v}\right)x

urnn=f(x

uw2v
)

4、实验结果

4.1 语义相似性度量:两个句子的语义相似性计算(余弦相似度)

4.2 复述句检测:判断两个句子是否语义一致(二分类)

4.3 句子分类:判断句子属于哪个类别

5、后续改进

5.1 Quick Thought

论文《An efficient framework for learning sentence representations》 提出了一种新的sentence vector 方式Quick thought Vector,相比较《Skip-Thought Vectors》 而言它的训练速度更快。


Quick thought Vector 通过分类器来区分句子的前后句和其它句子,模型结构如上图所示。这将生成问题视为从所有可能的句子中选择一个句子,因此可以看作是对生成问题的判别近似。

设句子si={wi(1),wi(2),⋯,wi(τi)}\mathbf{s}_{i}=\left\{w_{i}^{(1)}, w_{i}^{(2)}, \cdots, w_{i}^{\left(\tau_{i}\right)}\right\}si={wi(1),wi(2),,wi(τi)}τi\tau_{i}τi为句子长度。witw_i^{t}wit为句子sis_isi的第t个单词。

令句子sis_isi附近窗口大小d的句子集合为Si,ctxS_{i,ctx}Si,ctx、句子sis_isi的候选样本句子集合为Si,candS_{i,cand}Si,cand,其中满足Si,ctx⊂Si,cand\mathcal{S}_{i, c t x} \subset \mathcal{S}_{i, c a n d}Si,ctxSi,cand。即:Si,candS_{i,cand}Si,cand不仅包含了句子sis_isi附近的句子,也包含了很多其它句子。

使用编码器 f对sis_isi编码、编码器 g对候选句子si,cand∈Si,cand\mathbf{s}_{i, \text {cand}} \in \mathcal{S}_{i, \text {cand}}si,candSi,cand编码,模型预测候选句子\mathbf{s}{i, c a n d} \in \mathcal{S}{i, c t x}的概率:p(si,cand∣si,Si,cand)=exp⁡[c(f(si),g(si,cand))]∑s′∈Si,candexp⁡[c(f(si),g(s′)]p\left(\mathbf{s}_{i, c a n d} \mid \mathbf{s}_{i}, \mathcal{S}_{i, c a n d}\right)=\frac{\exp \left[c\left(f\left(\mathbf{s}_{i}\right), g\left(\mathbf{s}_{i, c a n d}\right)\right)\right]}{\sum_{\mathbf{s}^{\prime} \in \mathcal{S}_{i, c a n d}} \exp \left[c\left(f\left(\mathbf{s}_{i}\right), g\left(\mathbf{s}^{\prime}\right)\right]\right.}p(si,candsi,Si,cand)=sSi,candexp[c(f(si),g(s)]exp[c(f(si),g(si,cand))]

  • 上述公式中的c(⋅,⋅)c(·,·)c(,)为一个打分函数(或者分类器),在论文中c(u→,v→)c(\overrightarrow{\mathbf{u}}, \overrightarrow{\mathbf{v}})c(u

    ,v

    )
    简单定义为c(u→,v→)=u→⋅v→c(\overrightarrow{\mathbf{u}}, \overrightarrow{\mathbf{v}})=\overrightarrow{\mathbf{u}} \cdot \overrightarrow{\mathbf{v}}c(u

    ,v

    )=
    u

    v

    。如此简单的分类器是为了迫使编码器能够学习到更加丰富的句子表示;
  • 编码器f和f使用不同的参数,这是借鉴了word2vec的结构:中心词通过WWW编码(输入向量)、目标词经过W′W'W映射(输出向量),两者点积得到得分;
  • 在测试时给定句子stests_{test}stest,其表示是两个编码器输出的拼接:f(stest):g(stest)f\left(\mathbf{s}_{\text {test}}\right): g\left(\mathbf{s}_{\text {test}}\right)f(stest):g(stest)

6、总结

6.1 论文主要创新点

  1. 提出了一种新的句表示方法——考虑了句子间的关系,利用了无监督语料;
  2. 证明了一次训练多次使用的可行性;
  3. 对后续工作有很大的启发——实验分析十分详尽;

Skip-Thought Vector —— 跳跃思维句表示相关推荐

  1. 1-2-3 skip list 确定性跳跃表的实现

    /Files/rocketfan/Deterministic_Skip_Lists.pdf /Files/rocketfan/determinsticList_readme.pdf 确定性跳跃表,可以 ...

  2. 跳跃表(Skip list)原理与java实现

    转载自 [算法导论33]跳跃表(Skip list)原理与java实现 Skip list是一个用于有序元素序列快速搜索的数据结构,由美国计算机科学家William Pugh发明于1989年.它的效率 ...

  3. 【算法导论33】跳跃表(Skip list)原理与java实现

    Skip list是一个用于有序元素序列快速搜索的数据结构,由美国计算机科学家William Pugh发明于1989年.它的效率和红黑树以及 AVL 树不相上下,但实现起来比较容易.作者William ...

  4. C++ :vector的使用

    VECTOR vector 定义 用法: 1.文件包含: 2.变量声明: 3.具体的用法以及函数调用: 4.内存管理与效率 5.Vector 内存管理成员函数的行为测试 6.vector的其他成员函数 ...

  5. 软件测试思维总结(2)-----跳跃性思维:不按套路出牌

    软件测试思维总结(2)-----跳跃性思维:不按套路出牌 [回顾] 上一章节聊到了,测试人员安身立命的核心能力和价值,以及比较思维,本章继续聊测试探索中的思维:跳跃性思维. 回想起十年之前,还在HW做 ...

  6. 词向量表示和句向量、文章向量计算方法

    本文介绍一种计算句向量和文章向量的方法及参考代码,自然语言处理的第一步即是要进行文本的向量化,包括获得词向量,句向量或者文章向量,以便输入各种机器学习模型或者深度学习模型. 词向量 可以笼统的认为词向 ...

  7. 肝了1W字!文本生成评价指标的进化与推翻

    一只小狐狸带你解锁 炼丹术&NLP 秘籍 作者:林镇坤(中山大学研一,对文本生成和猫感兴趣) 前言 文本生成目前的一大瓶颈是如何客观,准确的评价机器生成文本的质量.一个好的评价指标(或者设置合 ...

  8. 计算机专业术语对照表_艾孜尔江编

    A abstraction layer,抽象层 access,获取,存取 acoustic coupler,声音耦合器 Active Directory,活动目录 Acyclic Dependenci ...

  9. 文本生成评价指标串串烧

    1. 前言 ​ 语言与图像,作为当前AI领域的两大热门方向,吸引了无数研究人员的目光.相比于图像,语言有简单易得,数据易于收取,存储空间低等优点,不过,由于语言本身的特性,他还有时序复杂,句式多变等缺 ...

最新文章

  1. SpringMVC如何实现restful接口
  2. VC++中的通知消息
  3. k8s免安装-使用kubectl部署Pod, Deployment, LoadBalancer
  4. lstm 和自注意力机制 bert 本质区别的思考历程
  5. 工业环境老鼠目标检测
  6. 吐血整理所有常用端口,遇到端口问题一查就懂!
  7. c#oracle数据库操作类,Oracle数据库操作类(c#)
  8. PL/SQL Developer 和 instantclient客户端快速安装配置(图文)
  9. Nginx通过域名配置虚拟机
  10. Phalcon7 1.2.3 发布,高性能 PHP 7 框架
  11. Android的JNI开发涉及的char和string之间的互相转换
  12. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1071:菲波那契数
  13. Swing-BoxLayout用法-入门
  14. centos更改默认python_CentOS系统python默认版本由python2改为python3
  15. Vue2.0用户权限控制解决方案
  16. Hexo 添加百度统计
  17. 微软明年停止支持IE浏览器 鼓励使用Edge浏览器
  18. 如何在Linux系统服务器中重命名目录
  19. 鲲鹏平台兼容的操作系统介绍
  20. 医院机房建设A类机房建设标准和B类、C类机房建设标准有什么差别

热门文章

  1. 手工打造目标PE的步骤
  2. 2020年前端面试之JS手写代码题合集
  3. 容器编排技术 -- Kubernetes kubectl create secret 命令详解
  4. 容器编排技术 -- Kubernetes kubectl create service 命令详解
  5. Nacos支持三种部署模式
  6. sql语句执行步骤详解
  7. Android dp、dip、dpi、px、sp简介及相关换算,及其应用实例
  8. 移动端web 禁止长按弹出的菜单 Safari
  9. 【大学物理】毕奥萨伐尔定律
  10. 快速上手Linux核心命令(一):核心命令简介