文章目录

  • 1. 背景与相关技术
    • 1.1 解决的问题与方法
    • 1.2 HowNet
    • 1.3 Word lattice graph
    • 1.4 Graph attention networks
  • 2. LET
    • 2.1 模型整体架构
    • 2.2 input module
      • 2.2.1 word embedding
      • 2.2.2 sense embedding
    • 2.3 SaGT
      • 2.3.1 sense embedding迭代
      • 2.3.2 word embedding迭代
    • 2.4 sentence matching
    • 2.5 relation classify
  • 3. Experiments

上周在组里做了一次分享,介绍了《LET: Linguistic Knowledge Enhanced Graph Transformer for Chinese Short Text Matching》论文中提出的中文短文本匹配的方法,趁假期有空,做一下笔记。

1. 背景与相关技术

1.1 解决的问题与方法

这篇paper中介绍了一种针对中文短文本的交互式的文本匹配方法,记为LET。论文中,作者觉得当前中文短文本匹配的方法中,存在以下两个问题:

  1. 中文文本中存在一词多义的情况,而在中文短文本情况下,由于缺少上下文信息,导致中文短文本中的语义信息未能被充分挖掘。
  2. 中文分词中分词粒度不合适,会导致最终文本匹配的效果。

针对以上两种问题,文章中提出了两个方法:

  1. 引入HowNet外部知识库来帮助解决短文本中语义信息未能充分挖掘的问题。
  2. 利用多种分词工具,建立词网格图,解决分词粒度不合适的问题。

在后面介绍具体模型细节之前,我们需要先了解一下相关背景技术,以便后面更好的理解模型设计与作用。

1.2 HowNet

那么,啥是HowNet呢?
HowNet的官网上,是这么介绍的:

OpenHowNet源自在中文世界有巨大影响力的语言知识库——知网(HowNet)。知网的构建秉承还原论思想,即所有词语的含义可以由更小的语义单位构成,而这种语义单位被称为“义原”(Sememe),即最基本的、不宜再分割的最小语义单位。知网构建了包含2000多个义原的精细的语义描述体系,并为十几万个汉语和英语词所代表的概念标注了义原。

HowNet是一种经过人工整理的语言知识库,里面每一个词有不同的语义,每一个语义下还会拆分更细粒度的“义愿”,该知识库中包含了人对语言的知识与理解。论文中,就是通过引入了这样的外部语言知识库,来帮助模型学习到更多的语义信息。

为帮助理解,下面给出一个栗子:

我们以苹果这个词为例。我们知道,对于苹果这个词,我们可以理解为苹果公司这样的品牌,或者可以吃的水果,即上图中的sense1sense2。HowNet中,又对语义进行细拆,将每一个语义细拆违“义原”,比如sense1下面的[电脑, 样式值, , 携带, 特定牌子],sense2下面的[, 生殖, 水果]。并且HowNet会对每一个“义原”给出一个语义向量。
HowNet中,会对每一个词建立这样一个三层的树结构,从更细粒度来可以每一个词的每一语义。那么,我们可以利用这里面的语言知识,来帮助我们的模型获取更多的语义信息。

1.3 Word lattice graph

这里涉及到上面1.1节所说的建立词网格图word lattice graph的方法。我们知道,对于同一个中文句子,我们使用不同的分词工具,最终的分词结果可能会不一样,而这里面就包含了不同的信息。论文中使用了jieba, pkuseg, thulac这三种分词工具。

我们来看看这个所谓的词网格图是怎么建立的。比如,对于“北京人和宾馆”这个文本,我们按照字拆分,以及通过不同的分词工具拆分,会得到以下三种拆分结果:

[, , , , , ]
[北京人, , 宾馆]
[北京, 人和宾馆]

然后,我们根据这样的拆分结果,可以建立如下的词网格图:

图中,每一个拆分后的词,都是图中的一个节点,若两个词在原句子中是相邻的,那么这两个词之间有一条边相连。比如,北京人W8与W4之间有一条边相连,W3与W4之间有一条边相连。但是北京人W8与W3之间是没有边相连的,因为这两个词之间是包含关系,而非相连关系。
后面在介绍模型中,我们会详细介绍论文中是怎么使用这个词网格图的。

1.4 Graph attention networks

这里再介绍一下图注意力网络Graph attention networks。图注意力网络是图神经网络中的一种特殊类型,将注意力机制引入到图结构中。

我们以1.3中,以北京人和宾馆构建的词网格图为例,来介绍一下图注意力网络具体是如何的。对于上面这样的图,我们可以表示为
G=(V,ε)G=(V, \varepsilon)G=(V,ε)
其中V为图中的节点,ε\varepsilonε为图中的边。我们用hih_ihi来表示图中第i个节点的向量,通过下面公式来表示hih_ihi的第lll次迭代
hil=σ(∑xi∈N+(xi)αijl⋅(Wlhjl−1))h^{l}_{i}=\sigma(\sum_{x_i\in N^{+}(x_i)}\alpha^{l}_{ij}·(W^{l}h^{l-1}_{j}))hil=σ(xiN+(xi)αijl(Wlhjl1))
其中,xix_ixi表示第i个节点,N+(xi)N^{+}(x_i)N+(xi)表示图中包括节点xix_ixi以及与xix_ixi相邻的节点的集合,αijl\alpha^{l}_{ij}αijl表示注意力系数,WlW^{l}Wl是可训练参数。αijl\alpha^{l}_{ij}αijl是通过如下公式得到αijl=softmaxjfsiml(hil−1,hjl−1)=softmaxj(Wqlhil−1)(Wklhjl−1)\alpha^{l}_{ij}=softmax_jf^{l}_{sim}(h^{l-1}_{i}, h^{l-1}_{j})=softmax_j(W^{l}_{q}h^{l-1}_{i})(W^{l}_{k}h^{l-1}_{j})αijl=softmaxjfsiml(hil1,hjl1)=softmaxj(Wqlhil1)(Wklhjl1)上面的式子中αijl\alpha^{l}_{ij}αijl是一个标量,论文中进一步使用多维注意力机制,将注意力系数改为向量,如下αijl=MDsoftmaxj(αijl+fml(hjl−1))\pmb{\alpha}^{l}_{ij} = {MDsoftmax}_j(\alpha^{l}_{ij}+f^{l}_{m}(h^{l-1}_{j}))αααijl=MDsoftmaxj(αijl+fml(hjl1))其中,αijl\alpha^{l}_{ij}αijl就是前面公式中计算得到的标量,fml(hjl−1)=W2lσ(W1lhjl−1+b1l)+b2lf^{l}_{m}(h^{l-1}_{j})=W^{l}_{2}\sigma(W^{l}_{1}h^{l-1}_{j}+b^{l}_{1})+b^{l}_{2}fml(hjl1)=W2lσ(W1lhjl1+b1l)+b2l最终得到的hih_{i}hi的迭代公式为hil=σ(∑xi∈N+(xi)αijl⊙(Wlhjl−1))h^{l}_{i}=\sigma(\sum_{x_i\in N^{+}(x_i)}\pmb{\alpha}^{l}_{ij}\odot(W^{l}h^{l-1}_{j}))hil=σ(xiN+(xi)αααijl(Wlhjl1))其中,⊙\odot表示两个向量之间的按位乘积。以上,便得到了图注意力网络的向量迭代公式。

由于后面很多地方都会使用到这个图注意力网络的向量迭代过程,因此,为方便起见,我们用如下公式表示hil=MDGAT(hil−1,{hjl−1∣xj∈N+(xi)})h^{l}_{i}=MDGAT(h^{l-1}_{i}, \{h^{l-1}_{j}|x_j\in N^{+}(x_i)\})hil=MDGAT(hil1,{hjl1xjN+(xi)})

2. LET

有了上面一些的背景介绍之后,我们接下来就可以详细介绍论文中所提出的模型的具体细节了。

2.1 模型整体架构

首先,我们来看一下这个模型的整体架构。

这个模型,从下到上,可以分为4个部分,分别是输入模块input module, 语义图转换器SaGT,sentence matching, 以及最后输出的relation classify。

  • input module: 得到word embedding和sense embedding,其中word embedding是每一个句子的词网格图中每个节点的向量,sense embedding是从hownet中得到的词网格图中每一个词的若干个语义向量;
  • SaGT:通过交叉迭代的方式,更新word embedding和sense embedding,最终得到包含上下文信息和语义信息的向量;
  • sentence matching:进行a文本和b文本的交互匹配;
  • relation classify:判断a,b文本的匹配关系

下面,我们对模型的各个部分进行详细介绍。

2.2 input module

由于该论文中介绍的方法是做文本匹配的,因此,模型是输入是两个待匹配的文本,针对每一个输入的文本,我们可以通过1.3节中介绍的方法建立词网格图。

input module在输入文本对之后,会输出两类向量,word embedding和sence embedding。Word embedding就是这里图中每一个节点的词向量,sence embedding就是每个节点的词在hownet中对应语义的向量。我们分别来介绍一下这两类向量是怎么得到的。

2.2.1 word embedding

首先,我们可以将两个文本拆分为字级别的序列,并按照bert的输入方式进行拼接,如下C={[CLS],c1a,⋅⋅⋅,cTaa,[SEP],c1b,⋅⋅⋅,cTbb,[SEP]}C=\{[CLS], c^{a}_{1}, ···, c^{a}_{T_a}, [SEP], c^{b}_{1}, ···, c^{b}_{T_b}, [SEP]\}C={[CLS],c1a,,cTaa,[SEP],c1b,,cTbb,[SEP]}其中,Ta,TbT_a, T_bTa,Tb分别表示a, b文本的长度。将上述序列输入Bert之后,能够得到每一个输入字符的输出向量。

然后在词网格图(可以参考1.3节中北京人和宾馆的词网格图)中,每一个词可能是有多个字符组成,那么我们通过对每一个这样的字符向量序列进行注意力池化,得到每一个词的向量,注意力池化的公式如下uk=MDsoftmaxk(FFN(ck))u_k=MDsoftmax_k(FFN(c_k))uk=MDsoftmaxk(FFN(ck))vi=∑k=t1t2uk⊙ckv_i=\sum^{t_2}_{k=t_1}u_k\odot c_kvi=k=t1t2ukck其中,ckc_kck就是文本中第k个字的bert输出向量,FFNFFNFFN表示一个前向神经网络(论文中使用2层网络),t1,t2t_1, t_2t1,t2表示词网格图中第i个词在文本中是从第t1t_1t1个字到t2t_2t2个字。通过上面公式,我们可以得到每一个词的向量表示viv_ivi

由于上面的注意力池化的过程后续也会使用到,因此,我们这里同样将这个过程表示为vi=AttPooling({ck∣t1<=k<=t2})v_i=AttPooling(\{c_k|t_1<=k<=t_2\})vi=AttPooling({ckt1<=k<=t2})

2.2.2 sense embedding

2.2.1中得到的word embedding,是通过bert来得到的,由于bert中的self-attention,word embedding中包含了上下文信息。虽然在正常情况下,我们通过上下文信息中能够获取每一个字的语义信息,但是在短文本情况下,由于文本较短,上下文无法提供足够的语义信息。因此,该论文使用了hownet外部知识库来帮助获取每一词下面每一个语义的向量。

我们还是以1.2节中所举的苹果为例,如下图

苹果这个词可以有苹果品牌和苹果食物两个语义,每一个语义下面都可以有若干义原。首先我们可以对每一个义原的初始向量(论文中是使用HowNet提供的向量)进行图注意力转化(就是1.4节中介绍的图注意力网络),从而获取每一个义原的最终向量。只是1.4节中,我们使用的是每一个词节点的有直接相连的词作注意力,而这里是通过在同一个语义节点下的所有义原作注意力。公式如下oi,km=MDGAT(ei,km,{ei,km′∣oi,km′∈O(si,k)})o^{m}_{i,k}=MDGAT(e^{m}_{i,k},\{e^{m'}_{i,k}|o^{m'}_{i,k}\in O^{(s_i,k)}\})oi,km=MDGAT(ei,km,{ei,kmoi,kmO(si,k)})其中ei,kme^{m}_{i,k}ei,km表示HowNet提供的义原向量通过SAT转化后得到的向量,oi,kmo^{m}_{i,k}oi,km表示第i个词的第k个语义的第m个义原的向量。在经过图注意力转化得到每一个义原的向量之后,再通过注意力池化,便得到每一个语义的向量si,ks_{i,k}si,ksi,k=AttPooling({oi,km∣oi,km∈O(si,k)})s_{i,k}=AttPooling(\{o^{m}_{i,k}|o^{m}_{i,k}\in O^{(s_i,k)}\})si,k=AttPooling({oi,kmoi,kmO(si,k)})

至此,我们就分别得到了词网格图中每一个词的词向量word embedding和每一个词下的语义向量sense embedding。

2.3 SaGT

在上一步中,虽然我们得到了词网格图中每一个词的词向量word embedding和每一个词下的语义向量sense embedding,但是在短文本情况下,word embedding中只包含了上下文信息,并没有语义信息,sense embedding只包含了语义信息,并没有上下文信息,因此,我们还需要讲这两者进行交替迭代,融合两边的信息。

首先,这里说明一下符号的变化。为了方便说吗后面的向量迭代的过程,将向量符号进行如下变化vi→hi0v_i \rightarrow h^0_ivihi0si,k→gi,k0s_{i, k} \rightarrow g^0_{i,k}si,kgi,k0上标表示迭代的轮次,0表示初始状态。

在迭代过程中,依次是分别对sense embedding和word embedding进行交替迭代,下面分别进行介绍。

2.3.1 sense embedding迭代

在sense embedding迭代中,分别通过下面两个式子来获取前向的向量和后向的向量mi,kl,fw=MDGAT(gi,kl−1,{hjl−1∣xj∈Nfw+(xi)})m^{l,fw}_{i,k}=MDGAT(g^{l-1}_{i,k},\{h^{l-1}_{j}|x_j \in N^{+}_{fw}(x_i)\})mi,kl,fw=MDGAT(gi,kl1,{hjl1xjNfw+(xi)})mi,kl,bw=MDGAT(gi,kl−1,{hjl−1∣xj∈Nbw+(xi)})m^{l,bw}_{i,k}=MDGAT(g^{l-1}_{i,k},\{h^{l-1}_{j}|x_j \in N^{+}_{bw}(x_i)\})mi,kl,bw=MDGAT(gi,kl1,{hjl1xjNbw+(xi)})其中,Nfw+(xi)和Nbw+(xi)N^{+}_{fw}(x_i)和N^{+}_{bw}(x_i)Nfw+(xi)Nbw+(xi)分别表示词网格图中包含节点xix_ixi在内的前向连接和后向连接的节点的集合。

然后,对mi,kl,fw和mi,kl,bwm^{l,fw}_{i,k}和m^{l,bw}_{i,k}mi,kl,fwmi,kl,bw进行拼接,得到mi,kl=[mi,kl,fw,mi,kl,bw]m^{l}_{i,k}=[m^{l,fw}_{i,k}, m^{l,bw}_{i,k}]mi,kl=[mi,kl,fw,mi,kl,bw]最后,使用GRU来获取迭代后的gi,klg^{l}_{i, k}gi,klgi,kl=GRU(gi,kl−1,mi,kl)g^{l}_{i, k}=GRU(g^{l-1}_{i, k}, m^{l}_{i,k})gi,kl=GRU(gi,kl1,mi,kl)
由此,完成sense embedding的一次迭代。

2.3.2 word embedding迭代

在完成了sense embedding的迭代之后,便可以利用已经迭代后的gi,klg^{l}_{i, k}gi,kl向量来进行word embedding的迭代。迭代公式如下qil=MDGAT(hil−1,{gi,kl∣si,k∈S(wi)})q^l_i=MDGAT(h^{l-1}_{i},\{g^l_{i,k}|s_{i,k} \in S^{(w_i)}\})qil=MDGAT(hil1,{gi,klsi,kS(wi)})hil=GRU(hil−1,qil)h^l_i=GRU(h^{l-1}_i, q^l_i)hil=GRU(hil1,qil)其中,S(wi)S^{(w_i)}S(wi)表示词网格图中 与wiw_iwi相连的词的集合。

从上面两边的迭代式子中我们可以看到,sense embedding的第lll轮迭代中会使用到l−1l-1l1轮的word embedding,word embedding的第lll轮迭代中会使用到lll轮的sense embedding。如此进行若干轮迭代之后,最终得到的word embedding就包含了上下文信息和语义信息,可以用于之后的文本匹配的使用了。

2.4 sentence matching

到上一步为止,input module和SaGT都是a文本和b文本分别在自身内部进行的操作和计算。而到了这一步,便进行a文本和b文本的交互。

在上一步,我们已经得到了a文本和b文本的词网格图中每个节点上的词经过迭代后融合上下文信息和语义信息的向量hilh^l_ihil,在sentence matching模块需要将这个信息融入到字符中。

我们以a文本为例。首先,我们通过下面两个公式来对每一个字符的计算ytay^a_tytac^ta=AttPooling({hia∣wia∈W(cta)})\hat{c}^a_t=AttPooling(\{h^a_i|w^a_i \in W^{(c^a_t)}\})c^ta=AttPooling({hiawiaW(cta)})yta=LayerNorm(cta+c^ta)y^a_t=LayerNorm(c^a_t+\hat{c}^a_t)yta=LayerNorm(cta+c^ta)其中W(cta)W^{(c^a_t)}W(cta)表示包含ctac^a_tcta字符的词的集合。

然后进行a文本和b文本的交互mtself=MDGAT(yta,{yt′a∣ct′a∈Ca})m^{self}_t=MDGAT(y^a_t, \{y^a_{t'}|c^a_{t'} \in C^a\})mtself=MDGAT(yta,{ytactaCa})mtcross=MDGAT(yta,{yt′b∣ct′b∈Cb})m^{cross}_t=MDGAT(y^a_t, \{y^b_{t'}|c^b_{t'} \in C^b\})mtcross=MDGAT(yta,{ytbctbCb})注意,上面这两个式子中的MDGAT(⋅)MDGAT(·)MDGAT()中的参数共享的,这样设计的话,当a文本和b文本相等的时候,我们计算得到的mtself和mtcrossm^{self}_t和m^{cross}_tmtselfmtcross也会相等。

然后,计算mtself和mtcrossm^{self}_t和m^{cross}_tmtselfmtcross的相似度dk=cosine(wkcos⊙mtself,wkcos⊙mtcross)d_k=cosine(w^{cos}_k \odot m^{self}_t, w^{cos}_k \odot m^{cross}_t)dk=cosine(wkcosmtself,wkcosmtcross)这里,我们得到的dkd_kdk是一个标量,论文中为了能够通过更多维度去刻画这个相似度,获取更多信息,使用20个不同的wkcosw^{cos}_kwkcos来计算得到20个dkd_kdk,将这20个dkd_kdk组成向量dtd_tdt。然后通过下面公式,最总计算得到每一个字符的向量y^ta=FFN([mtself,dt])\hat{y}^a_t=FFN([m^{self}_t, d_t])y^ta=FFN([mtself,dt])最后,再通过注意力池化,文本整体的向量表示ra=AttPooling({y^ta∣cta∈Ca})r^a=AttPooling(\{\hat{y}^a_t|c^a_t \in C^a\})ra=AttPooling({y^tactaCa})b文本的最终整体的向量表示rbr^brb的计算方式也是类似。

2.5 relation classify

然后就是最后一步进行文本匹配的关系判断了。通过如下公式p=FFN([cCLS,ra,rb,ra⊙rb,∣ra−rb∣])p=FFN([c^{CLS}, r^a, r^b, r^a \odot r^b, |r^a-r^b|])p=FFN([cCLS,ra,rb,rarb,rarb])其中ra和rbr^a和r^brarb就是上一步得到的a文本和b文本的整体的向量表示,rCLSr^{CLS}rCLS是在第一步input module中,通过bert得到的CLS位的输出向量。最终得到的p就是模型最终判断得到的a文本和b文本是否匹配的概率值。

最后,模型使用交叉熵作为损失函数,进行模型的训练L=−∑i=1N(yilog(pi)+(1−yi)log(1−pi))L=-\sum^N_{i=1}(y_ilog(p_i)+(1-y_i)log(1-p_i))L=i=1N(yilog(pi)+(1yi)log(1pi))

以上,便是该论文所提出的中文短文本匹配模型的整体流程了。

3. Experiments


最后,该论文进行了一些实验,在BQ和LCQMC数据集上验证该模型的效果。论文分别在使用bert和未使用bert的情况下,跟其他同等模型进行比较,效果均优于其他使用bert和未使用bert的文本匹配模型。

LET: Linguistic Knowledge Enhanced Graph Transformer for Chinese Short Text Matching学习笔记相关推荐

  1. 【读】seq2seq—(4)LCSTS: A Large Scale Chinese Short Text Summarization Dataset

    本文转载自: 自动文摘(九) 目录 Abstract Introduction Data Collection Data Properties Experiment Conclusion and Fu ...

  2. 【2020-COLING】Regularized Graph Convolutional Networks for Short Text Classification 用于短文本分类的正则化图卷积网络

    文章目录 摘要 1 引言 2 提出的方法 3 图构建 3.1 产品查询分类PQC 3.2 4 实验和结果 5 结论 论文题目:Regularized Graph Convolutional Netwo ...

  3. ERNIE-ViL: Knowledge Enhanced Vision-Language Representations Through Scene Graph

    目录 Introduction Scene Graph (场景图) ERNIE-ViL Model Architecture Scene Graph Prediction (SGP) Experime ...

  4. 阅读《SentiLARE: Sentiment-Aware Language Representation Learning with Linguistic Knowledge》

    SentiLARE: Sentiment-Aware Language Representation Learning with Linguistic Knowledge Abstract 现有的预训 ...

  5. 详细介绍ERNIE 3.0: Large-scale Knowledge Enhanced Pre-training for Language Understanding and Generation

    系列阅读: 详细介绍百度ERNIE1.0:Enhanced Representation through Knowledge Integration 详细介绍百度ERNIE 2.0:A Continu ...

  6. (十九)【AAAI2021】Knowledge-Enhanced Hierarchical Graph Transformer Network for Multi-Behavior Recommend

    题目: Knowledge-Enhanced Hierarchical Graph Transformer Network for Multi-Behavior Recommendation 论文链接 ...

  7. 论文阅读课8-Chinese Relation Extraction with Multi-Grained Information and External Linguistic Knowledge

    文章目录 Abstract 1.Introduction 2.相关工作 3. 方法 3.1 输入 3.1.1 字符级别表示 3.1.2单词级表示 3.2encoder 3.2.1 base latti ...

  8. 论文解读:SentiPrompt: Sentiment Knowledge Enhanced Prompt-Tuning for Aspect-Based Sentiment Analysis

    论文解读:SentiPrompt: Sentiment Knowledge Enhanced Prompt-Tuning for Aspect-Based Sentiment Analysis 简要信 ...

  9. 【论文阅读】Knowledge Enhanced GAN for IoT Traffic Generation

    CCF A 用于物联网流量生成的知识图谱增强 GAN Shuodi Hui, Huandong Wang, Zhenhua Wang, Xinghao Yang, Zhongjin Liu, Depe ...

最新文章

  1. TensorFlow下的基础命令语句:数组、字典、判断、循环、与函数
  2. python中带星号的参数,带有一个星号 2个星号
  3. 面试:说说 Spring MVC 的执行过程?
  4. JZOJ 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
  5. 19岁中专学历是怎么在广州找到前端工作的?
  6. python 二进制流_Python中对字节流/二进制流的操作:struct模块简易使用教程
  7. 几件欣慰的事,关于.Net的培训和嵌入式开发效率
  8. Windows Vista和局域网聊天的计算机
  9. 草根教程 网友详解索尼本本装雪豹过程
  10. Web.xml in Hello1 project
  11. CISCO ACL配置(目前)
  12. 使用yum快速部署Oracle安装环境 11g
  13. C4D常用快捷键与自定义快捷键分享
  14. php curl jsonrpc,JsonRPC: Lightweight Json-RPC 2.0 client/server in PHP extension
  15. python股票量化投资刑不行_【邢不行|量化小讲堂系列10-Python量化入门】量化投资中如何处理复权、除权问题...
  16. [渝粤教育] 东北大学 现代科学运算—MATLAB语言与应用 参考 资料
  17. 业余爱好者,学习JAVA在实际中有什么用途?
  18. sas简单描述统计分析和散点图
  19. 独立显卡 台式计算机,解决方案:如何在台式计算机上安装独立显卡
  20. IMO班聊新版本更给力 企业用车、公费电话上线

热门文章

  1. 一级计算机ms上网,2014计算机一级MSOFFICE上网 1
  2. springboot学校学校运动会信息管理系统毕业设计-附源码
  3. 第一台计算机影片观后感,影片叫我第一名观后感
  4. 浅析企业私有云中的存储架构
  5. 微信小程序+阿里物联平台+合宙Air724UG搭建无服务器物联系统(一)
  6. 12. Vuepress2.x 隐藏指定页的 sidebar
  7. 自动售货机html代码,自动售货机系统源代码.doc
  8. 2012淘宝关键字优化淘宝关键字SEO优化助手|淘宝关键字SEO优化
  9. 看完就懂——MySQL备份与恢复
  10. 超级计算机模拟现实,超级计算机模拟出了地球磁场真实的模样