论文翻译解读:Anytime Bottom-Up Rule Learning for Knowledge Graph Completion【AnyBURL】

随时自底向上的知识图谱完成规则学习

简要信息

序号属性
1模型名称AnyBURL
2所属领域知识图谱
3研究内容链接预测
4核心内容基于规则的链接预测
5GitHub源码AnyBURL
6论文PDFAnytime Bottom-Up Rule Learning for Knowledge Graph Completion
7发表年份2019

我们提出了一种随时自底向上的技术,用于从大型知识图中学习逻辑规则。我们应用学习到的规则来预测候选人在知识图完成的背景下。我们的方法优于其他基于规则的方法,并且与当前基于潜在表示的技术具有竞争力。此外,我们的方法明显更快,需要更少的计算资源,并产生了一个解释的规则,提出一个候选。

1 介绍

近十年来,知识图谱完成已成为一个生动的研究领域。虽然目前的研究主要是基于将知识图嵌入到低维向量空间的想法,但符号方法的关注要少得多[Wang et al., 2017]。然而,这种方法有一个很大的优势,那就是它们能够根据触发预测的规则产生解释。在本文中,我们提出了一种自底向上的技术来有效地从大型知识图中学习逻辑规则。我们的工作受到了自底向上的规则学习方法Golem [Muggleton and Feng, 1990]和Aleph [Srinivasan, 2000]的启发,它们是在归纳逻辑编程(ILP)的早期发展起来的。自底向上方法基于这样一种思想:一个示例是一个非常具体的规则的紧凑表示,可以将其一般化,以捕获所有正示例的一个全面子集。Aleph就是这样一种方法。它将一个给定的正例子转换成称为底规则的Horn规则。然后,通过从规则体中删除原子来一般化该规则,直到找到满足所选质量标准的规则。该规则涵盖的示例将被删除,并再次应用该方法,直到涵盖所有示例。

我们的方法在几个方面有所不同。首先,我们没有一个严格的边界来告诉我们哪些观察结果属于给定的例子,哪些不属于它。相反,我们必须决定用什么来作为例子。我们以路径的概念作为例子的基础。从这个意义上说,我们的方法类似于路径排序算法(PRA) [Lao et al., 2011]。然而,PRA认为特性只是我们可以学习的规则的一个子集。其次,我们感兴趣的是学习不确定的规则,即至少包括一些积极的例子,通常也包括一些消极的例子的规则。即使是一个信心很低的规则也可能帮助我们为知识图完成任务创建一个更好的候选人排名。此外,我们不能删除规则覆盖的示例,因为可能有其他规则也(部分)覆盖这些示例和其他示例,具有不同的置信度得分。第三,我们的算法被设计成一个高效的知识图规则挖掘器。在知识图中,所有事实(也称为三元组)都来自于具有常数的二元谓词。因此,一个知识图可以被解构成一组边缘标记的路径。这就是为什么专注于没有一元谓词或n≥3的n元谓词的路径是有意义的。

目前,知识图补全(或链接预测)问题主要是将给定的知识图嵌入潜在特征空间的方法。学习一个明确的符号表示很少被提议作为替代。这可能与以下基本假设有关:仅使用基于规则的方法只能解决一个微不足道的子集。例如,[Dettmers等人,2018]中提出的逆模型的讨论和有关FB15k冗余的批评[Toutanova和Chen, 2015]。另一个假设可能是规则学习不能应用于大型数据集。因此,目前的研究关注规则和嵌入的结合(例如,[Guo et al., 2018])。我们认为根本的假设是错误的,并提出了支持我们主张的结果。特别地,我们提出了一种随时自底向上的规则学习算法,并将该算法应用于知识完成任务。我们给出了五个不同数据集的结果。其中三种方法被认为是利用对称性和其他冗余的简单(基于规则的)方法的硬案例。我们的方法与最近提出的大多数模型一样好,有时甚至更好。如果我们在短时间内停止算法,我们的方法仍然是非常好的结果。此外,与潜在方法所需的资源相比,所需的内存和运行时资源要小得多。

2 语言偏差

知识图G定义在词汇表hC, Ri上,其中C是一组常量,R是一组二元谓词。因此,G = {r(a, b) | r∈r, a, b∈C}是一组底层原子或事实。二元谓词称为关系,常量(或常量所指的)也称为实体。下面我们使用小写字母表示常量,大写字母表示变量。由于我们不学习任意的Horn规则,对于可以学习什么样的规则存在一种语言偏见,如下所述。

我们称之为h(c0, c1)←b1(c1, c2),…, bn(cn, cn+1)是一个长度为n的地面路径规则。规则的头部是h(…),b1(…)到bn(…)是它的主体。如果ck6 = cl对于l, k∈{1,…, n}, l 6= k,如果c0 6= ck, 0 < k < n + 1。这样的规律在体内是没有周期的。在我们的形式化中,我们从某种意义上对变量的顺序进行了抽象,我们也考虑了翻转变量的规则,而没有显式地把它们写下来。直线接地路径规则可以分为c0 = cn+1的循环规则和c0 6= cn+1的非循环规则。我们认为,长度为n的直线地面路径规则的任何有用的推广都属于下面定义的三种类型AC1、AC2或C之一,它不是较短路径规则的推广,也不是非直线路径规则的推广。我们使用X和Y表示出现在头部的变量,而Ai是只出现在身体中的变量。AC1 h(c0, X)←b1(X, A2),…, bn(An, cn+1) AC2 h(c0, X)←b1(X, A2),…, bn(An, An+1) C h(Y, X)←b1(X, A2),…, bn(An, Y) AC2规则是无循环地路径规则的泛化,C规则是循环地路径规则的泛化,AC1规则可以由循环(c0 = cn+1)和无循环(c0 6= cn+1)两种形式泛化。

任何比属于这三种类型的规则更具体的规则必须具有k < n + 1的常数ck,而不是变量Ak。对于AC1和AC2类型,我们必须区分两种情况:(1)身体原子bk(…)到bn(…)的结合计算结果为true,因此可以从规则中删除它们。在这种情况下,规则也可以从长度为k的更短的路径创建。稍后将阐明,我们在整个算法的前一次迭代中学习了该规则。(2)原子bk(…)与bn(…)结合的结果总是为false,从而产生一个永远不会触发的规则。对于C类型,这样的常量ck会将规则分成两部分,其中一部分与X相关,另一部分与Y相关。这样的规则也可以被创建为规则h(c0, c1)←b1(c1, c2),…, bk−1(ck−1,ck), b−1n (c0, cn),…, b−1 k (ck+1, ck)。因此,我们将生成一个规则,其规则主体是两个较短规则主体的结合。

图1显示了知识图G的一个小子集。假设我们对寻找解释为什么Ed说荷兰语的规则感兴趣,这对应于factspeaks(Ed, d)。为了构建有用的规则,我们查看所有从Ed或d开始的长度为n的路径。我们稍后会解释,我们创建长度为n的规则,直到满足一定的饱和程度,然后再继续使用n + 1。请注意,我们允许通过跟随入边和出边来构造路径。我们在图1中标记了三条从ed开始的路径。其中两条路径是无循环路径,终点在知识图的某个地方,而第三条路径与spoke (ed, d)一起是循环的。规则(1)、(2)和(3)是必须推广的底层规则。
在这里插入图片描述

图1:用于路径采样的小知识图G。我们标记了规则1(蓝色)、规则2(绿色)和规则3(红色)的主体。

我们在上面讨论过,任何符合上述标准的有用规则都是三种类型之一。因此,我们可以直接实例化这些类型,而不是构建一个完整的泛化格。我们在下面列出了归纳规则2和规则3的所有规则。

显然,规则6比规则7更普遍。这意味着规则6总是在规则7触发时触发。然而,这些规则可能有不同的信心得分。因此,在预测阶段使用这两个规则是有意义的。一个规则的置信度通常定义为身体接地的数量,除以那些身体接地的数量,使头部为真。注意,我们根据头部接地进行计数,例如,我们根据规则6计算不同的hX, Y i接地的数量,以及根据规则7计算不同的X接地的数量。为了处理缺失的信息,对基本定义进行了一些细微的修改,例如PCA置信度[Galárraga等人,2013]或完整性感知评分函数[Tanon等人,2017]。在本文中,我们坚持标准定义,并在后面解释了附加平滑的小修改。计算精确置信度的成本可能很高,因为它需要根据身体原子的数量进行多次连接。因此,我们只对身体接地进行采样,然后计算各自的头部接地。因此,计算出的置信度是正确置信度的近似。

3 算法

在下面的文章中,我们提出了一种随时自底向上的规则学习算法(算法1,称为AnyBURL),它使用了前一节中的泛化技术。该算法的基本思想是从给定的知识图G中抽取长度为n的路径,从n = 2开始。从长度为n的路径中,算法学习长度为n−1的规则。记住,我们用主体原子来计算规则长度,路径中的第一条边对应头部原子。这样做,直到达到长度规则n - 1的某个饱和为止。然后n增加1,算法继续学习更长的规则。所需饱和饱和度是一个需要指定的参数。另一个参数是质量标准Q,用于决定是否存储规则。例如,Q可以是置信度的一个阈值。我们使用抽样策略来有效地利用函数评分计算规则的置信度。样本的大小可以用参数s来指定。

学习过程是在一个长度为ts的时间跨度序列中进行的。在一个时间跨度内(重复-直到循环),算法通过迭代抽样随机路径学习尽可能多的规则。一旦给定的时间跨度结束,将评估在这个时间跨度内找到的规则。注意,R包含在以前的时间跨度中学习到的所有规则,Rs包含在当前的时间跨度中找到的所有规则,而R0s包含在当前的时间跨度中找到的在以前的迭代中找到的规则。我们计算分数|R0s|/|Rs|,如果这个数字高于sat参数,我们将路径(以及规则)长度增加1,并继续整个过程。n越高,通常达到饱和饱和所需的时间越长。

重要的是要理解饱和,例如,99%并不意味着所有可能的规则实例化的99%已经找到,而是99%的抽样活动导致已知的规则。这是由于在g中有更多规则留下它们的痕迹(就路径而言),这样的不平衡分布使得它相对容易达到高饱和度,这也是采样效果良好的原因之一。

4 应用程序规则

我们希望学习能够预测候选c与c∈c的规则,将r(a, ?)中的问号替换为r∈r和a∈c,使r(a, c) 6∈G为真。给定一个完成任务r(a, ?),我们必须计算出能够替换问号的前k个候选对象的排名。如果每个实体最多由一条规则生成,那么就可以直接创建这样的排名。我们可以根据建议实体的规则的置信度值对这些实体进行排序。然而,实体通常由几个规则建议。如果我们假设这些规则是独立的,我们就可以基于信心倍增来做出决定。这种预测策略被称为Noisy-Or聚合。然而,潜在的假设往往是无效的。假设我们有以下三条规则,公民(X, Y)描述X是Y国的公民,城市(X, Y)描述X城市位于Y国,首都(X, Y)表示X是Y国的首都;born(X, Y) and died表示X生于(死于)Y市。

即使这些规则之间没有直接的逻辑蕴涵,如果我们有背景知识,告诉我们资本关系比城市关系更具体,规则9也会引出规则10。然而,这种背景知识通常是不可得的。此外,如果给定的数据集是有噪声的,那么规则城市(X, Y)←大写(X, Y)的置信度将小于1。在死亡(X, Y)和出生(X, Y)之间存在相似但较弱的相关性(许多人死在他们出生的城市),这告诉我们规则9和规则11也不是完全独立的。然而,在一个有噪声和不完整的数据集中,不可能区分(i)规则9和规则10,其中选择两个置信度的最大值最有意义,以及(ii)规则9和规则11,其中基于规则体的独立性假设计算边际概率更合适。

我们采用一种相当简单但有效的方法。我们通过生成候选人的所有规则的置信度的最大值对候选人进行排序。如果几个候选者的最高分数相同,我们将通过生成它们的次优规则对这些候选者进行排序,以此类推,直到我们找到一个有影响的规则。这种方法可能会对触发两个独立规则的实体进行过低的评级,而如果触发的两个规则具有很强的依赖性,则评级不会受到负面影响。还要注意的是,这种方法的结果可以在不考虑所有相关规则的情况下计算出来。我们从高置信度规则开始计算低置信度规则的结果,直到确定正确的top-k排序顺序。我们还实现了一个Noise-Or并报告结果。在Noisy-Or设置中,我们需要计算所有规则,无论它们是否生成候选规则,这在许多情况下效率较低。我们将规则的置信度大致定义为头部和身体接地除以身体接地。根据这个定义,一个有很多体接地的规则可以与一个只有几个体接地的规则具有相同的置信度,例如3/4 = 750/1000。此外,我们通常会有很多规则却很少的基础,特别是有常数的规则,和有很多基础的规则。由于这个原因,一些缺乏基础的规则可能会有过高的信心。为了避免这个,我们在分母上加上一个常数,作为一种拉普拉斯平滑。这可以理解为标准置信值的悲观变体。接地点数量多的规则只受到轻微影响,而接地点数量少的规则得到的置信度明显较低。

5 实验

我们在实验中使用了FB15(k)数据集,它的改进型FB15-237, WN18,它的改进型WN18RR和YAGO03-10(简称YAGO)。FB (WN)数据集是基于FreeBase (WordNet)的一个子集。FB15和WN18已首次用于[Bordes等人,2013]。它们在几篇论文中受到了批评:由于冗余,大量的测试用例可以通过利用相当简单的规则来解决。FB15-237 [Toutanova和Chen, 2015]和WN18RR [Dettmers等人,2018]都被认为是冗余被抑制的修改变体。FB15-237则更进一步。它不包含可以用一个体原子的C规则解决的测试用例,即使训练集显示了归纳这些规则的规律。这使得FB15-237有点不现实,并且对于基于规则的方法来说是一个很难的测试集。数据集Y AGO在[Dettmers等人,2018]中被用作额外数据集。表1给出了这些数据集的概述。前三行报告的数字指的是训练集。最后一行表示测试集中三元组的数量。每个测试三元组可以分为两个测试用例。就三元组和实体(常量)而言,YAGO03-10是最大的数据集。

在[Bordes等人,2013]中,我们计算过滤后的hits@1and过滤后的hits@10。在下面的句子中,我们只提到这些值,不带形容词“filtered”。我们没有精确计算过滤后的MRR(平均秩倒数),因为我们的方法不是设计来计算完整的排名,而是只计算top-k排名。我们不计算准确的值,而是假设任何将被排在>k位置的候选人都不是一个正确的预测。这导致了过滤后的MRR的下界,我们在表2中给出了前缀≥。准确值通常略高。我们将我们的方法命名为AnyBURL(随时自底向上规则学习)。AnyBURL是用Java编写的,不需要外部库。实验中使用的源代码和数据集可以在http://web上找到。informatik.uni-mannheim.de / AnyBURL /。我们在一个拥有4个核心(每个2400 MHz)和16 GB RAM的虚拟机上进行了所有的实验。

我们没有使用验证集来查找数据集特定的参数设置。在我们所有的实验中,我们使用了完全相同的参数设置。我们选择了质量标准Q,只允许产生至少两个正确预测的规则,这是一个非常宽松的标准。我们已经将所需的饱和度设置为99%。我们设置ts = 1秒,pc = 5, s = 500,这是决定置信度值精度的样本大小。作为默认设置,我们使用最大聚合策略。我们还进行了一项实验,将该策略与Noisy-Or聚合进行了比较。我们还做了两个修改我们的实现在时间跨度之间交替,我们只采样循环路径;在时间跨度上,我们对所有可能的路径进行采样。这使得使用更有效地找到循环的算法成为可能。此外,一旦达到长度为3的C规则的定义饱和,我们就停止显式搜索循环路径,因为较长的循环规则在运行时方面的代价非常高。

5.1 随时行为和运行时

我们必须区分学习规则所需的时间和应用它们解决任务所需的时间。显然,我们花在学习上的时间越多,我们学到的规则就越多;我们学到的规则越多,应用这些规则所需的时间就越长。根据10秒、100秒、1000秒和10000秒后学习的规则集,为表2中的所有5个数据集指定Hits@1和hits@10结果。对于所有的数据集,我们观察到一个相似的模式。经过10秒钟的学习阶段,结果已经令人惊讶地好了。对于较小的数据集(WN18和WN18RR),这些结果已经和目前的最新结果一样好了。当我们学习100秒和1000秒(不到半小时)的规则时,结果得到了进一步的改进,而且这种改进对于更大的数据集来说更高。长时间(10000秒)学习规则会对结果产生轻微的负面影响。WN18和FB15数据集尤其如此。这些数据集以冗余为主,体现在长度为1的C规则中。这些规则一开始就能很快找到。如果我们学习的时间更长,可能会有一些非常具体的规则在大量的学习规则中产生噪音。然而,如果我们将工具运行更长时间,这种趋势就不会持续下去。我们还在WN18和FB15上运行了20000秒的AnyBURL,与10000秒运行的结果相比几乎没有差异(例如,WN18从95.42更改为95.40)。

对于YAGO,我们展示了(i)学习时间对结果质量的影响(左边的y轴),(ii)应用学习规则所需的时间(x轴的投影),以及(iii)已学习规则的数量(紫色线,右边的y轴)。引用完整测试集的应用程序时间显示为到x轴的投影。例如,学习规则10秒,结果hits@10得分为55.3%,规则集由4531条规则组成。将该规则集应用到数据集的5000个测试用例需要42秒。注意,右边的x轴和y轴使用对数刻度。图2显示AnyBURL从一个较高的级别开始,并在对数函数方面改进了结果。我们运行AnyBURL的时间越长,学习到的规则集似乎就越接近线性增长,略微减少。AnyBURL在84秒后已经达到了长度为3的C规则的0.99的饱和,而AC1和长度为1的AC2规则的饱和在整个30000秒的时间跨度内没有达到。这显然是由Y AGO数据集中的大量常量造成的。这说明短时间内取得的好结果大多是基于C规则,而随后较小但稳定的改进则是基于AC1和AC2规则。对于较小的规则集,应用这些规则所需的时间比在整个测试集中学习它们所需的时间要长。但是,如果规则集变得更大,则所需的额外预测时间就更少。在1000秒内学会的规则集,也需要1000秒左右的时间来应用。对于较大的规则设置,学习时间占用应用时间。还要注意,对于其他四个数据集,应用程序时间要小一些。

5.2 与其他方法的比较

表2中的第一个块列出了当前使用嵌入的最先进的完成技术的结果。我们挑选了五种模型,它们取得了非常好的效果,并在去年的顶级会议上发表。AnyBURL在1000秒的学习阶段后获得的结果是相同的水平,有时比大多数这些模型稍好。例如,AnyBURL在hits@1、hits@10和MMR结果上优于ConvE [Dettmers等人,2018],除了FB15-237,在FB15-237中,AnyBURL的结果仅略差。当使用10秒后学会的规则时,AnyBURL的表现已经超过SimplE [Kazemi和Poole, 2018]。

例外的是,[Lacroix等人,2018]中提出的ComplEx-N3(倒数)模型,最初在[Trouillon等人,2016]中引入,取得了比包括AnyBURL在内的任何其他模型更好的结果。这个模型需要485秒× 25 epoch (100 epoch) = 12125(48500)秒在YAGO上使用一组固定的超参数进行一次运行。超参数是在28个组合的网格搜索中确定的,在最坏的情况下需要乘以28,即28 × 12125 = 339500≈4天,尽管提前停止准则可能会节省时间。虽然我们在标准笔记本电脑上运行AnyBURL,但ComplEx-N3运行时是基于Quadro GP100 GPU的使用。表2中的第二个块给出了两个替代规则学习系统RuleN和AMIE+的结果。AMIE+使用了一个完全的自顶向下的方法和类似于RuleN的语言偏见。在它的语言偏差内,它使用支持阈值作为修剪机制来构造一定长度的所有规则。RuleN学习C语言规则和一种特定类型的常数规则。它使用的抽样技术与我们提出的方法类似,但不那么通用。这两个系统已经在[Meilicke等人,2018]在一个类似于我们的环境中执行。没有一个系统有任何时刻的行为,但是,参数已经选择了特定的数据集,以利用10小时的时间框架尽可能好。因此,结果与AnyBURL的10000000个结果大致相当。除了WN18数据集的小例外,AnyBURL产生的结果明显优于AMIE和RuleN。对于RuleN来说,这部分与它无法学习某些规则有关。相对于AMIE的改进可能与自底向上方法中使用的抽样策略有关。RLvLR [Omran等人,2018]是一种规则学习器,使用嵌入来指导规则提取过程,以减少搜索空间。这种方法的结果只适用于FB15-237,其中RLvLR达到hits@10的39.3%和MMR的0.24。这些结果与AMIE和RuleN的结果相似。在最后一行,我们将默认的Maximum聚合与Noisy-Or进行比较,显示Noisy-Or减去Maximum的差异。这些数字是基于1000秒后学习的规则。noise - or在几乎所有数据集上的表现都明显更差。我们观察到WN18和FB15数据集的下降幅度最大。两个数据集都包含许多冗余,因此可能会由几个高度依赖(等效)的规则提出一个候选者,这就扭曲了生成的候选者排名。

6 相关工作

我们在上一节讨论了AMIE和RuleN。RuDiK [Ortona等人,2018],另一个规则学习者的例子,可以学习积极和消极规则(约束)。与我们的方法相反,RuDiK的目的是找到一组小的规则,涵盖大部分的正例子和尽可能少的反例子。这与我们的目标不同,在我们的目标中,我们试图学习与创建顶级候选人排名相关的每一个可能的规则。

路径排序算法[Lao et al., 2011]是基于对C规则对应的路径进行采样。虽然AnyBURL的采样技术受到了这种方法的启发,但AnyBURL可以学习到比PRA更有表现力的规则。在[Lao et al., 2015]中,作者提出了一个扩展,它也可以处理实例(常量)。但是,该扩展支持的规则类似于长度为1的AC1规则和任意长度的C规则的结合,而根据我们的理解,AC1和AC2本身是不支持的。我们在上面已经讨论过,这样的连接将导致一个明显更大的搜索空间,我们试图以严格的语言偏见来避免。另一种有趣的方法是Gaifman模型[Niepert, 2016],在该模型中,街区而不是路径被取样。虽然这在原则上允许学习每一个可能的规则(如果邻域足够大),但作者报告的应用程序是基于一种限制性的语言偏见,只涵盖了我们学习的规则的一小部分。我们引入了一种语言偏差和一种紧密耦合的高效抽样技术,而在Gaifman模型上下文中进行抽样是一种创建(原则上)符合任何语言偏差的示例的方法。现有的知识图补全方法大多基于嵌入的概念。还有一系列尝试将嵌入和规则结合的方法(参见[Wang et al., 2017]的调查)。例如RLvLR [Omran et al., 2018],我们在上面添加了一些结果,以及Ruge [Guo et al., 2018]系统,它使用学习的规则将新的带有软标签的训练示例注入到学习嵌入的过程中。作者报告了FB15的结果,比AnyBURL 100秒的学习结果更差。我们相信,只有在我们首先知道每种方法各自能走多远的情况下,结合规则和嵌入的好处才能被理解。我们的工作表明,规则本身的表现令人惊讶的好,这是在进一步的结合嵌入和规则的工作中不可忽视的。

7 结论

我们提出了一种基于自底向上范式的随时学习知识图规则的算法。我们将这种称为AnyBURL的方法应用于五个不同的、经常使用的数据集。AnyBURL在短时间内生成的结果与许多最新的技术一样好,甚至更好,同时只使用有限的资源(在内存和计算能力方面)。由于采样,算法首先在选择的高支持度的语言偏差规则内学习。与此相反的是,AMIE必须学习某种类型的所有规则,以确保这些规则被覆盖。与潜在表示模型相比,AnyBURL与其他基于规则的方法有几个共同的优点

•候选人排名可以用生成排名的规则来解释。这样的解释很容易理解,甚至可以与统计证据相联系,例如,Ed会说荷兰语,因为他的配偶是出生在阿姆斯特丹的人,而与出生在阿姆斯特丹的人结婚的人说荷兰语的信心为82%。荷兰语是埃德说的语言中排名最高的候选者。英语排名第二,有67%的信心,因为……生成的模型(=规则集)可以使用相同的谓词和重叠的常数集对数据集进行部分重用。没有常量的规则肯定可以重用,如果(经常使用的)常量,如london或female也出现在新数据集中,则包含此类常量的规则也可以重用。•基于规则的方法不需要学习数据集特定的超参数。我们知道AnyBURL也有几个参数对其行为有影响。然而,这些参数的影响是透明的,并且与数据集特定的特征的依赖性较小。注意,我们在所有5个数据集上使用相同的参数设置运行AnyBURL。虽然这些优势是众所周知的,但它们的认可在激励当前的研究开发知识图完成的符号方法方面只起到了有限的作用。一个原因可能是规则学习不能有效地应用于更大的数据集的偏见。我们的研究结果表明,情况恰恰相反。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneTenTwo76

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值