(2018 -NIPS)SimplE embedding for link prediction in knowledge

本文为阅读论文过程中的个人总结加上翻译内容构成。

摘要

介绍知识图谱,知识图谱补全(链接预测),并说明了张量分解方法(Tensor factorization approaches)对于这类问题有着显著的效果,其中正则多元分解( Canonical Polyadic (CP))是最早的张量分解方法,但CP是有局限性的,它学习了每个实体的两个独立的嵌入向量,而它们实际上是绑定的。我们提出了一个简单的CP增强(我们称之为simpIE),以允许独立地学习每个实体的两个嵌入。简单算法的复杂度随嵌入的大小线性增长。通过simpleare学习到的嵌入是可解释的,某些类型的背景知识可以通过权重绑定被纳入这些嵌入。我们证明了simple是完全表达的,并为充分表达推导了其嵌入的大小的界限。我们通过经验证明,尽管simplet很简单,但它的性能优于几种最先进的张量分解技术。

GitHub地址:https://github.com/Mehran-k/SimplE.

相关介绍:

浅谈张量分解(一):如何简单地进行张量分解?

1. 介绍

第一段介绍,知识图谱补全是在统计关系学习(SRL)的框架下,看成在现有三元组的基础上预测新的三元组的过程。

第二段介绍张量分解被证明是一种有效的SRL方法,预测的评判标准是将三元组作为输入,输出一个概率代表该三元组是否正确的概率。

张量分解的第一种方法是正则多元(CP)分解。该方法为每个关系学习一个嵌入向量,为每个实体学习两个嵌入向量,当实体是头时使用一个,当实体是尾时使用一个。一个实体的头部嵌入是独立于(并且与)其尾部嵌入无关的。这种独立性导致CP在KG补全中表现不佳。本文提出了一种基于CP的张量分解方法,解决了实体的两个嵌入向量之间的独立性问题。由于模型的简单性,我们称其为simple (SimpleEmbedding)。

本文证明了:

  • 可以被认为是一个双线性模型
  • 是完全表达的
  • 能够通过参数共享将背景知识编码到它的嵌入中
  • 尽管原理很简单,但在经验上表现得非常好。我们还讨论了其他现有方法的几个缺点
  • 证明了现有的一些编码方法并不能完全表达,并找出了表达的严格限制
  • 证明了ComplEx是一种最先进的链路预测方法,涉及到冗余计算

2. 背景和符号

定义了一些符号,例如:(具体定义建议看原文,更清楚,这里只列出定义了哪些)

  • 小写字母表示向量,大小字母表示矩阵,向量拼接的公式,向量乘积的公式:⟨vh,vr,vt⟩\left\langle v_{h}, v_{r}, v_{t}\right\ranglevh,vr,vt
  • 知识图谱头实体、尾实体、关系的集合定义、正确三元组集合、错误三元组集合
  • 定义对称关系、非对称关系以及传递关系、以及关系的倒数

3. 相关工作

普通嵌入方法

定义:头实体为简单向量ve∈Rdv_{e} \in \mathbb{R}^{d}veRd ,尾实体为vr∈Rd′v_{r} \in \mathbb{R}^{d^{\prime}}vrRd以及两个矩阵:Pr∈Rd′×dP_{r} \in \mathbb{R}^{d^{\prime} \times d}PrRd×dQr∈Rd′×dQ_{r} \in \mathbb{R}^{d^{\prime} \times d}QrRd×d

同时得分函数的定义为:∥Prvh+vr−Qrvt∥i\left\|P_{r} v_{h}+v_{r}-Q_{r} v_{t}\right\|_{i}Prvh+vrQrvtiPrvh+vr≈Qrvt)\left.P_{r} v_{h}+v_{r} \approx Q_{r} v_{t}\right)Prvh+vrQrvt)

例如:

  • TransE中:d=d′,Pr=Qr=Idd=d^{\prime}, P_{r}=Q_{r}=\mathcal{I}^{d}d=d,Pr=Qr=Id
  • TransR中:Pr=Qr.P_{r}=Q_{r} .Pr=Qr.
  • STransE中:对矩阵没有限制
  • FTransE中:定义得分函数为∥Prvh+vr−αQrvt∥i\left\|P_{r} v_{h}+v_{r}-\alpha Q_{r} v_{t}\right\|_{i}Prvh+vrαQrvti

本文中采用FSTransE代替FTransE,结合两者的优点。

相乘嵌入方法

Multiplicative Approaches 是什么意思

DistMult:(最简单的方法之一)

  • 定义实体和关系的嵌入为ve∈Rdv_{e} \in \mathbb{R}^{d}veRdvr∈Rdv_{r} \in \mathbb{R}^{d}vrRd
  • 定义得分函数为:⟨vh,vr,vt⟩\left\langle v_{h}, v_{r}, v_{t}\right\ranglevh,vr,vt
  • DistMult不区分头尾关系,所以只能模拟对称关系

ComplEx:(在DistMult基础上扩充,考虑复数)

  • ree∈Rdr e_{e} \in \mathbb{R}^{d}reeRdime∈Rdi m_{e} \in \mathbb{R}^{d}imeRd 代表实体的实部和虚部
  • rer∈Rdr e_{r} \in \mathbb{R}^{d}rerRdimr∈Rdi m_{r} \in \mathbb{R}^{d}imrRd 代表关系的实部和虚部
  • 相似函数为:Real⁡(∑j=1d(reh[j]+imh[j]i)∗(rer[j]+imr[j]i)∗(ret[j]−imt[j]i))\operatorname{Real}\left(\sum_{j=1}^{d}\left(r e_{h}[j]+i m_{h}[j] i\right) *\left(r e_{r}[j]+\right.\right.\left.\left.i m_{r}[j] i\right) *\left(r e_{t}[j]-i m_{t}[j] i\right)\right)Real(j=1d(reh[j]+imh[j]i)(rer[j]+imr[j]i)(ret[j]imt[j]i)) Real⁡(α+βi)=α\operatorname{Real}(\alpha+\beta i)=\alphaReal(α+βi)=α
  • ⟨reh,rer,ret⟩+⟨reh,imr,imt⟩+⟨imh,rer,imt⟩−⟨imh,imr,ret⟩.\left\langle r e_{h}, r e_{r}, r e_{t}\right\rangle+\left\langle r e_{h}, i m_{r}, i m_{t}\right\rangle+\left\langle i m_{h}, r e_{r}, i m_{t}\right\rangle-\left\langle i m_{h}, i m_{r}, r e_{t}\right\rangle .reh,rer,ret+reh,imr,imt+imh,rer,imtimh,imr,ret.

RESCAL

  • 定义实体嵌入为:ve∈Rdv_{e} \in \mathbb{R}^{d}veRd
  • 定义关系嵌入为:vr∈Rd×dv_{r} \in \mathbb{R}^{d \times d}vrRd×d
  • 得分函数为:vr⋅vec⁡(vh⊗vt)v_{r} \cdot \operatorname{vec}\left(v_{h} \otimes v_{t}\right)vrvec(vhvt) ⊗\otimes表示外积 vec⁡(.)\operatorname{vec}(.)vec(.)对输入矩阵进行矢量化

深度学习方法

E-MLP

  • 定义实体嵌入:ve∈Rdv_{e} \in \mathbb{R}^{d}veRd,
  • 定义关系嵌入:Mr∈R2k×mM_{r} \in \mathbb{R}^{2 k \times m}MrR2k×mvr∈Rm.v_{r} \in \mathbb{R}^{m} .vrRm.
  • 拼接头尾实体:[vh;vt]∈R2d\left[v_{h} ; v_{t}\right] \in \mathbb{R}^{2 d}[vh;vt]R2d,神经网络第一层参数为Mr∈R2k×mM_{r} \in \mathbb{R}^{2 k \times m}MrR2k×m 、神经网络第二层参数为vr∈Rm.v_{r} \in \mathbb{R}^{m} .vrRm.
  • 输入 [vh;vr;vt]∈R3d\left[v_{h} ; v_{r} ; v_{t}\right] \in \mathbb{R}^{3 d}[vh;vr;vt]R3d 到两层的神经网络模型中.

4. SimpIE:完全表达模型

在正则多元分解(CPD)中,每个实体有两个嵌入he,te∈Rdh_{e}, t_{e} \in \mathbb{R}^{d}he,teRd,得分函数为:⟨he1,vr,te2⟩.\left\langle h_{e_{1}}, v_{r}, t_{e_{2}}\right\rangle .he1,vr,te2.。同时两个嵌入向量是相互独立的,更新也是单独更新。

示例 1

解释了同一个实体的两个嵌入向量是如何单独更新的。

SimpLE利用关系的逆来解决CP中每个实体的两个向量的独立性。关系的逆已经用在许多地方,但用在解决CP实体向量的独立性还是首次提出。

模型定义

  • 实体定义:he,te∈Rdh_{e}, t_{e} \in \mathbb{R}^{d}he,teRd
  • 关系定义:vr,vr−1∈Rdv_{r}, v_{r^{-1}} \in \mathbb{R}^{d}vr,vr1Rd 为关系的逆矩阵
  • 得分函数定义:12(⟨hei,vr,tej⟩+⟨hej,vr−1,tei⟩)\frac{1}{2}\left(\left\langle h_{e_{i}}, v_{r}, t_{e_{j}}\right\rangle+\left\langle h_{e_{j}}, v_{r^{-1}}, t_{e_{i}}\right\rangle\right)21(hei,vr,tej+hej,vr1,tei)

同时考虑SimpLE-ignr变体:

  • 训练阶段:更新嵌入,使得正确三元组的嵌入更大,错误三元组的嵌入更小
  • 测试阶段:忽略关系的逆,定义得分函数为:⟨hei,vr,tej⟩\left\langle h_{e_{i}}, v_{r}, t_{e_{j}}\right\ranglehei,vr,tej

SimpLE模型学习过程

  • 采用小批量随机梯度下降
  • 迭代的获取正三元组,同时将正三元组转换为负三元组
    • 具体方法为,如果破坏的是头实体,则从E−{h}\mathcal{E}-\{h\}E{h}中选取一个实体作为代替。如果破坏的是尾实体,则从E−{t}\mathcal{E}-\{t\}E{t}中选取一个实体作为代替。
  • 定义损失函数为:min⁡θ∑((h,r,t),l)∈LB\min _{\theta} \sum_{((h, r, t), l) \in \mathbf{L B}}minθ((h,r,t),l)LBsoftplus (−l⋅ϕ(h,r,t))+λ∥θ∥22(-l \cdot \phi(h, r, t))+\lambda\|\theta\|_{2}^{2}(lϕ(h,r,t))+λθ22
    • PS:最外层喊是最小化函数,求和所有三元组包括正三元组和负三元组,softplus函数是激活函数,l表示三元组标签(正还是负),ϕ(h,r,t))\phi(h, r, t))ϕ(h,r,t))为得分函数,+λ∥θ∥22+\lambda\|\theta\|_{2}^{2}+λθ22为正则化超参数。
    • softplus⁡(x)=log⁡(1+exp⁡(x))\operatorname{softplus}(x)=\log (1+\exp (x))softplus(x)=log(1+exp(x)) 激活函数(这里不用基于边际的损失函数是因为,认为基于边际的损失函数更容易过拟合。)

5. 理论分析

本阶段对SimpLE以及其他嵌入模型进行理论分析。(具体证明过程看原文)

5.1 完全表达

命题1

  • 对于所有的关于实体和关系的真实事实,存在一个SimpLE模型用有限维的嵌入向量min⁡(∣E∣⋅∣R∣,γ+1)\min (|\mathcal{E}| \cdot|\mathcal{R}|, \gamma+1)min(ER,γ+1)来表示事实。

  • 证明过程:

    • 首先证明∣E∣⋅∣R∣|\mathcal{E}| \cdot|\mathcal{R}|ER有界
    • 然后证明γ+1\gamma+1γ+1有界

    DistMult并不是完全表达的,因为他强制关系是对称的,ComplEx是完全表达的,嵌入长度最多为∣E∣⋅∣R∣|\mathcal{E}| \cdot|\mathcal{R}|ER,同时有证明表明TransE也并不是完全表达的。

命题2

  • FSTransE并不是完全表达的,他有着以下限制:

    • 如果一个关系r是reflexive,r必须是对称的
    • 如果一个关系r是reflexive,r必须是可传递的
    • 如果实体e1e_{1}e1和一个集合中所有实体都有关系r,而实体e2e_{2}e2与集合中的一个实体有关系r,那么e2e_{2}e2必须与集合中的所有实体都有关系r。

推论 1

  • 其他嵌入变体如:TransE, FTransE, STransE, TransH和TransR 都有着命题2的限制

5.2 将背景知识融入嵌入

在SimplE中,实体的嵌入向量的每个元素都可以被视为实体的一个特征,而关系的对应元素可以被视为该特征对关系的重要性的度量。这种可解释性允许通过SimplE学习到的嵌入内容可以潜在地转移到其他领域。它还允许通过固定观察值的嵌入向量的一个元素,将观察到的实体特征纳入嵌入。Nickelet al.[30]表明,结合这些特征有助于减小嵌入物的大。

近年来,将背景知识融入张量因子分解方法已成为众多研究的焦点。为了达到这一目标,许多现有的方法依靠后处理步骤或在损失函数中添加额外的项来惩罚违反背景知识的预测[34,42,45,13,9]。Minerviniet al.[25]展示了如何通过参数绑定将等价和反演方面的背景知识整合到几个张量分解模型中。通过参数绑定结合背景知识的优点是保证所有嵌入的预测都遵循背景知识。在本节中,我们将展示如何将三种类型的背景知识,即对称、反对对称和反对称,通过绑定参数3(我们忽略了两个关系之间的等价性,因为它是微不足道的)整合到SimplE的嵌入中。

命题3

  • 建立这样的一个关系,对于两个实体,我们有他们的关系r是对称的,那么这个关系r可以和关系r的逆来联系起来

命题4

  • 建立这样的一个关系,对于两个实体,我们有他们的关系r是反对称的,那么这个关系r可以和关系r的逆来联系起来

命题5

  • 对于两个关系r1与r2,有(实体1,关系r1,实体2)、(实体2,关系r2,实体1),则关系r1与关系r2的逆联系起来,关系r2与关系r1的逆联系起来

5.3 时间复杂度和参数增长

模型要扩展到当前KGs的大小并跟上它们的增长,关系模型必须具有线性时间和内存复杂度。此外,设计张量分解模型的一个重要挑战是表达性和模型复杂性之间的权衡。参数多的模型通常会过拟合,性能较差。而TransE的时间复杂度是O(d),其中d为嵌入向量的大小,添加STransE中的投影(通过两个关系矩阵)增加了时间复杂度为O(d2)O(d^2)O(d2)。除了时间复杂度外,从数据中学习的参数数量也随着d呈二次增长。二次时间复杂度和参数增长可能会产生两个问题:

  • 1-可扩展性问题,
  • 2-过拟合问题。

同样的问题也存在于具有二次或更高时间复杂性和参数增长的模型,如RESCAL和NTNs。DistMult和ComplEx具有线性时间复杂度,它们的参数数随d线性增长。

5.4 双线性模型族

双线性模型对应于模型族,其中每个实体的嵌入是∈Rd\in \mathbb{R}^{d}Rd,每个关系是∈Rd×d\in \mathbb{R}^{d \times d}Rd×d(有一定的限制),对于一个三重(h,r,t)的相似函数定义为vthmrvt。这些模型在知识图[31]中的链接预测方面表现出了良好的性能。众所周知,DistMult、ComplEx和RESCAL属于双线性模型家族。我们表明SimplE(和CP)也属于这个家族。

  • 如图2(a)所示,DistMult可以被认为是一个限制矩阵为对角线的双线性模型。
  • 对于ComplEx,如果我们认为每个实体的嵌入是一个单一的向量[ree;ime]∈R2d\left[r e_{e} ; i m_{e}\right] \in \mathbb{R}^{2 d}[ree;ime]R2d,那么它可以被认为是一个双线性模型,其受到了图2(b)的约束。
  • RESCAL可以被认为是一个双线性模型,它对矩阵没有约束。考虑到每个实体的嵌入是单个向量[he;te]∈R2d\left[h_{e} ; t_{e}\right] \in \mathbb{R}^{2 d}[he;te]R2d,
  • CP可以看作是一个双线性模型,其 MrM_{r}Mr受到了约束,如图2©所示。对于三元组(e1,r,e2)\left(e_{1}, r, e_{2}\right)(e1,r,e2),将 [he1;te1]\left[h_{e_{1}} ; t_{e_{1}}\right][he1;te1]MrM_{r}Mr相乘得到一个ve1rv_{e_{1} r}ve1r ,其前半部分为零,后半部分对应于he1h_{e_{1}}he1Mr.M_{r} .Mr.中的参数的元素乘积。将ve1rv_{e_{1} r}ve1r[he2;te2]\left[h_{e_{2}} ; t_{e_{2}}\right][he2;te2]相乘相当于忽略he2h_{e_{2}}he2(因为ve1rv_{e_{1} r}ve1r的前半部分是零),然后取 ve1rv_{e_{1} r}ve1rte2t_{e_{2}}te2的后半部分的点积。
  • SimplE可以看作是一个类似于CP的双线性模型,除了MrM_{r}Mr受到如图2(d)所示的约束。与CP相比,在矩阵中加入的额外参数对应于关系逆的参数。

SimplE中的矩阵约束与DistMult中的约束非常相似。SimplE和DistMult都可以被认为是参数的元素乘积,除了简单中的MrM_{r}Mr交换结果向量的前半部分和后半部分。与ComplEx相比,SimplE去掉了MrM_{r}Mr主对角线上的参数。请注意其他几个限制在矩阵上等价于SimplE,例如,限制矩阵在除反对角线外的所有地方为零。将SimplE视为每个实体的单向量模型,使其易于与其他嵌入模型(在知识图补全、计算机视觉和自然语言处理中)集成(或兼容),如[35,47,36]。

5.5ComplEx模型的冗余

如前所述,在参数数量相同的情况下,ComplEx中的计算数量比SimplE-ignr和SimplE多4x和2x。这里我们展示了ComplEx进行预测的部分计算是多余的。

6. 实验和结果

数据集:WN18、FB15k

基线

我们将SimplE与现有的几种张量分解方法进行了比较。我们的基线包括正则多元(CP)分解、transse、TransR、DistMult、NTN、strse、ER-MLP和ComplEx。鉴于我们使用与ComplEx相同的数据分割和目标函数,我们报告了来自[39]的CP、TransE、DistMult和ComplEx的结果。我们报道了[27]的TransR和NTN以及[32]的ER-MLP的结果,以作进一步的比较。

评价指标:MRR与Hit@K

实现细节

这里就不详细说了,具体参数看原文

6.1 实体预测结果

实验表明我们的结果是最好的

6.2 结合背景知识

在有背景知识的情况下,我们可能会认为知识图中不包含冗余信息,因为冗余信息是由背景知识隐含的,所以不包含背景知识的方法永远无法学习冗余信息。在第5.2节中,我们展示了如何将可以用三种类型规则表示的背景知识整合到简单嵌入中。为了检验这一点,我们在WN18上进行了一个实验,在实验中,我们将几个这样的规则合并到命题3、4和5所概述的嵌入中。

规则见表2。从表2中可以看出,大多数规则的形式为∀ei, ej∈E: (ei,r1,ej)∈ζ try try (ej,r2,ei)∈ζ。对于像r1andr2这样的(可能相同的)关系参与到这样的规则中,如果(ei,r1,ej)和(ej,r2,ei)都在训练集中,其中一个是冗余的,因为一个可以从另一个推导出来。我们根据背景规则,将训练集中的两个可以从另一个推导出来的三元组中的一个随机剔除,从而去除训练集中的冗余三元组。去除冗余三元组将训练集中三元组的数量从(约)141k减少到(约)90K,几乎减少了36%。注意,这个实验提供了一个上限,在多大程度上背景知识可以提高SimplE模型的性能。

结果表明,背景知识可以有效地融入到SimplE嵌入中,从而提高SimplE嵌入的性能。

7. 总结

我们提出了一个简单的可解释的全表达双线型知识图补全模型。叫做SimplE,在实验上表现得非常好,并且有几个有趣的特性。例如,通过绑定嵌入,可以将三种类型的背景知识整合到SimplE中。在未来,SimplE可以通过以下几种方式进行改进或帮助改善关系学习:

  • 1-像[18]为DistMult所做的那样构建SimplE模型的集合,
  • 2-将SimplE添加到[44]的关系级集合中,
  • 3-显式地建模[23]中类似的关系结构,使用[8]的1-N评分方法为一个正三元组生成多个负三元组([39]表明生成更多的负三元组提高了准确性)将SimplE与其他类别的关系学习技术相结合(或将SimplE作为子组件使用),就像[33]处理ComplEx一样。

(2018 -NIPS)SimplE embedding for link prediction in knowledge相关推荐

  1. 【论文阅读笔记 + 代码解读】(2018 AAAI)ST-GCN

    写在前面 ST-GCN 是skeleton based action recognition 的开山鼻祖.MMLab 出品,必是精品! 开山鼻祖级别的论文必有很多理论 + 数学公式,再加上本人(菜鸡) ...

  2. ROS机器人操作系统新发布软件包摘录--(2018.03)

    ROS机器人操作系统功能包摘录--(2018.04) 可以编译并改进源码用于公选课研究论文的提交(适用本科一年级-三年级,专业不限). VisioTec ROS软件包 1 https://wiki.r ...

  3. 《人工智能标准化白皮书(2018版)》发布|附下载

    来源:光明网 概要:1月18日下午,2018人工智能标准化论坛在京召开,本次论坛发布了<人工智能标准化白皮书(2018版)>. 1月18日下午,2018人工智能标准化论坛在京召开,本次论坛 ...

  4. python爬虫从入门到精通-Python爬虫从入门到精通视频(2018新版)

    原标题:Python爬虫从入门到精通视频(2018新版) Python在软件质量控制.提升开发效率.可移植性.组件集成.丰富库支持等各个方面均处于先进地位,并且随着人工智能的兴起,Python发展得越 ...

  5. 基于vue2+nuxt构建的高仿饿了么(2018版)

    基于vue2+nuxt构建的高仿饿了么(2018版) 前言 高仿饿了么,以nuxt作为vue的服务端渲染,适合刚接触或者准备上vue ssr的同学参考和学习 项目地址如遇网络不佳,请移步国内镜像加速节 ...

  6. Python机器学习全流程项目实战精讲(2018版)

    Python机器学习全流程项目实战精讲(2018版) 网盘地址:https://pan.baidu.com/s/16SSVq74YC07M0dW1iDekPg 提取码: vu7r 备用地址(腾讯微云) ...

  7. python视频教程全集-Python 3视频教程全集(2018版)免费送啦

    原标题:Python 3视频教程全集(2018版)免费送啦 不仅很多计算机专业的小伙伴想学Python,很多零基础的也想学.为什么?因为它是一门更注重可读性和效率的语言,而且随着人工智能的发展而愈发火 ...

  8. 【智能制造】工信部:《国家智能制造标准体系建设指南(2018年版)》(征求意见稿)

    据工信部1月15日消息,为加快推进智能制造综合标准化工作,加强顶层设计,构建智能制造综合标准体系,发挥智能制造标准的规范和引领作用,工业和信息化部.国家标准化管理委员会组织开展智能制造综合标准化体系建 ...

  9. IDEA(2018.2)的下载、安装及破解

    IDEA(2018.2)的下载及安装 IDEA简介 从官网下载IDEA IDEA的安装 IDEA的破解 新建一个hello world程序 IDEA简介 IDEA 全称 IntelliJ IDEA,是 ...

最新文章

  1. CF786B Legacy(线段树优化建边模板 + 最短路)
  2. 太多人关注,太少人理解,这就是“量子计算”
  3. 你的厨房被水淹了!别担心,这只是3D深度估计做出的特效
  4. 使用SGD(Stochastic Gradient Descent)进行大规模机器学习
  5. 大图标与小图标模式定义 winform 1110
  6. Qt下libusb-win32的使用(一)打印设备描述符
  7. Linux C代码实现主函数参数选项解析
  8. probe request帧结构_WIFI基础知识(802.11)
  9. Drupal的登陆用户Cache功能
  10. hadoop fs.trash 详解
  11. 全网首发:JAVA中的+=,会直接把float赋值给int变量,编译器不报错
  12. html网页自动提示框代码,多种网页弹出窗口代码
  13. php 扫描条形码,将条形码扫描仪集成到PHP应用程序中?
  14. android 壁纸尺寸,常见手机壁纸的尺寸是多少
  15. 电脑突然找不到wifi 的解决方法
  16. Quantopian自学笔记03
  17. 005-电脑软件安装包20190408
  18. alm系统的使用流程_ALM——应用程序全生命周期管理核心功能有哪些
  19. 自动化立体仓库可以为企业带来什么效益?
  20. java sql 基础_Java SQL基础

热门文章

  1. 微信h5页面提交表单后返回键重复提交的问题
  2. SYN6288移植51程序
  3. 三:debian安装,附加开店系统
  4. 如何将matlab中的变量数据导出至excel中
  5. 【Shell简单练习2】Shell 脚本输出指定文件夹下的文件名到指定的文件中
  6. 高等数学---第八章隐函数偏导数与全微分
  7. Java面试题集(86-115)
  8. TortoiseGit 假定未变更
  9. SpotlessCity:第一个干洗服务网站 反映纽约人有多懒
  10. python之百度贴吧自动签到