负样本生成方法及装置

文档序号:511326 发布日期:2021-05-28 浏览:10次 >En<

阅读说明:本技术 负样本生成方法及装置 (Negative sample generation method and device ) 是由 吴信东 单迎春 洪炎 卜晨阳 于 2021-01-28 设计创作,主要内容包括:本发明公开了一种负样本生成方法及装置。其中,该方法包括:对知识图谱进行社区划分,得到多个社区;从多个实体中选择两个实体和两个实体之间的关系组成目标三元组;确定目标三元组所在的社区,并确定目标三元组所在社区的社区类型;依据社区类型,选择非目标三元组所在社区的实体或目标三元组所在社区的实体,对目标三元组样本中的实体进行替换,得到负样本。本发明解决了由于未考虑知识图谱的社区类型,导致生成的负样本质量不高的技术问题。(The invention discloses a negative sample generation method and device. Wherein, the method comprises the following steps: carrying out community division on the knowledge graph to obtain a plurality of communities; selecting two entities from a plurality of entities and a relation between the two entities to form a target triple; determining a community in which the target triple is located, and determining a community type of the community in which the target triple is located; and selecting an entity of the community in which the non-target triple is located or an entity of the community in which the target triple is located according to the community type, and replacing the entity in the target triple sample to obtain a negative sample. The method solves the technical problem that the quality of the generated negative sample is not high due to the fact that the community type of the knowledge graph is not considered.)

负样本生成方法及装置

技术领域

本发明涉及机器学习领域,具体而言,涉及一种负样本生成方法及装置。

背景技术

基于翻译规则的知识表示模型在学习过程中依赖负样本的生成方法,负样本在知识表示学习模型中起着关键的作用。目前有五类负样本生成方法,分别是完全随机的方法、基于概率的方法、基于类型限制的方法、基于生成式对抗网络的方法和批量负样本生成方法。但是这些方法在生成负样本的过程中,均未考虑到知识图谱的社区类型信息,因此生成的负样本质量不够高。

针对上述的问题,目前尚未提出有效的解决方案。

发明内容

本发明实施例提供了一种负样本生成方法及装置,以至少解决由于未考虑知识图谱的社区类型,导致生成的负样本质量不高的技术问题。

根据本发明实施例的一个方面,提供了一种负样本生成方法,包括:对知识图谱进行社区划分,得到多个社区,其中,知识图谱的组成元素为多个实体和多个实体之间的关系;从多个实体中选择两个实体和两个实体之间的关系组成目标三元组,其中,选择的两个实体分别被称为头实体和尾实体;确定目标三元组所在的社区,并确定目标三元组所在社区的社区类型;依据社区类型,选择非目标三元组所在社区的实体或目标三元组所在社区的实体,对目标三元组样本中的实体进行替换,得到负样本。

可选地,对知识图谱进行社区划分,得到多个社区,包括:为多个实体中的每个实体设置不同的标签;遍历多个实体,对多个实体中的每个实体,扫描与每个实体有关联的实体的标签;将扫描过程中出现次数最多的标签作为每个实体的候选标签,候选标签包括每个实体所属的社区名称;依据社区名称,将知识图谱划分为多个社区,并确定多个社区的社区类型。

可选地,确定目标三元组样本所在的社区,并确定社区的社区类型,包括:根据目标三元组样本中两个实体的社区名称,确定目标三元组样本所在的社区;计算社区中的实体密度;将实体密度与密度阈值进行比较,其中,当实体密度大于密度阈值时,社区的社区类型为第一社区类型;当实体密度不大于密度阈值时,社区的社区类型为第二社区类型。

可选地,依据目标三元组样本所在社区的社区类型,对目标三元组样本中的实体进行替换,得到负样本,包括:当目标三元组样本所在社区的社区类型为第一社区类型,从目标三元组样本所在社区中选择未在目标三元组样本中的实体,替换目标三元组样本的头实体或尾实体,得到负样本;当目标三元组样本所在社区的社区类型为第二社区类型,从非目标三元组样本所在社区中选择实体,替换目标三元组样本的头实体或尾实体,得到负样本。

可选地,当负样本所在的社区中实体或实体关系发生变化时,方法还包括:通过负样本,对负样本所在的社区中的实体或实体之间的关系进行更新。

可选地,当负样本所在的社区中实体或实体间的关系在第一预设时间周期内变化次数超过预设变化次数阈值,且社区包含的实体数量超过预设数量阈值,方法还包括:在第二预设时间周期后,根据社区内的实体和社区内的负样本,对社区的实体表示进行更新,其中,社区的实体表示为实体在表示模型中的向量。

可选地,负样本用于对基于翻译规则的知识表示模型进行训练,其中,模型在训练后,可以实现根据输入的头实体和头实体与尾实体之间的关系,确定与头实体对应的尾实体,并输出。

根据本发明实施例的另一方面,还提供了一种负样本生成装置,包括:划分模块,用于对知识图谱进行社区划分,得到多个社区,其中,知识图谱的组成元素为多个实体和多个实体之间的关系;第一确定模块,用于从多个实体中选择两个实体和两个实体之间的关系组成目标三元组,其中,两个实体分别被称为头实体和尾实体;第二确定模块,用于确定目标三元组所在的社区,并确定目标三元组所在社区的社区类型;生成模块,用于依据社区类型,选择非目标三元组所在社区的实体或目标三元组所在社区的实体,对目标三元组样本中的实体进行替换,得到负样本;更新模块,用于依据负样本,在负样本所在社区中包含的实体或实体间的关系发生变化时,对负样本所在社区中的实体或实体间的关系进行更新。

可选地,划分模块还用于:为多个实体中的每个实体设置不同的标签;遍历多个实体,对多个实体中的每个实体,扫描与每个实体有关联的实体的标签;将扫描过程中出现次数最多的标签作为每个实体的候选标签,候选标签包括每个实体所属的社区名称;依据社区名称,将知识图谱划分为多个社区。

根据本申请实施例的又一方面,还提供了一种非易失性存储介质,存储介质包括存储的程序,其中,在程序运行时,执行上述负样本生成方法。

在本发明实施例中,采用对知识图谱进行社区划分,得到多个社区,其中,知识图谱的组成元素为多个实体和多个实体之间的关系;从多个实体中选择两个实体和两个实体之间的关系组成目标三元组,其中,选择的两个实体分别被称为头实体和尾实体;确定目标三元组所在的社区,并确定目标三元组所在社区的社区类型;依据社区类型,选择非目标三元组所在社区的实体或目标三元组所在社区的实体,对目标三元组样本中的实体进行替换,得到负样本的方式,通过对知识图谱进行社区划分,达到了生成负样本目的,从而实现了提高负样本质量的技术效果,进而解决了由于未考虑知识图谱的社区类型,导致生成的负样本质量不高的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的一种负样本生成方法的流程示意图;

图2是根据本发明实施例的一种负样本生成装置的结构示意图;

图3是根据本发明实施例的一种稠密社区和稀疏社区的示意图;

图4是根据本发明实施例的知识图谱表示动态更新示例;

图5是根据本法明实施例的一种生成负样本并对知识图谱更新的流程示意图;

图6是根据本发明实施例的一种知识图谱的示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

现有的知识表示学习模型中的负样本生成策略,均未考虑知识图谱所具有的社区类型信息,本申请实施例提出一种新的通用的负样本生成方法,即考虑社区类型的负样本生成方法(Community Structure based Negatives Sampling,CNS)。然后将CNS算法用于基于翻译规则的模型训练,得到CNS-TransX通用模型,其中TransX表示TransE、TransH、TransD等基于翻译规则的模型。改进后的模型在训练过程中,对于较稀疏的社区中的三元组,应尽量与其他社区中的实体分离,即负样本通过从其他社区中选择的实体替换产生;而对于稠密的社区,本社区内的实体尽量分离,即负样本通过从本社区中选择实体替换产生。

根据本发明实施例,提供了一种负样本生成的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

图1是根据本发明实施例的负样本生成方法,如图1所示,该方法包括如下步骤:

步骤S102,对知识图谱进行划分,得到多个社区;

在本申请的一些实施例中,为了得到知识图谱的全局社区结构,可以使用全局划分的方法对知识图谱进行社区划分。基于全局优化的社区发现算法主要从全局的角度划分结构化的网络,可以大致分为四类:(1)模块度优化,模块是量社区发现结果好坏的重要指标,这种社区发现方法的思想是寻找一种使得模块度最大的社区划分方案,如Louvain算法;(2)标签传播算法,这是一种基于启发式规则的标签传播过程,将社区划分视为节点标签预测问题;(3)基于动力学与仿生模拟算法,如Markov聚类算法、遗传算法;(4)以图论为基础的聚类算法,如谱聚类算法。

优选地,在本申请的一些实施例中,可以使用SLPA(Speaker-listener LabelPropagation Algorithm)算法对知识图谱进行划分,并在此基础上研究重叠社区和非重叠社区对负样本生成方法的影响。SLPA是一种社区发现算法,它是对LPA算法(标签传播算法)的扩展。在进行社区划分时只考虑知识图谱的结构信息(有向图转化为无向图),不考虑语义信息。使用SLPA算法进行社区划分的优点是:SLPA为每个节点设置了一个标签存储列表来存储每次迭代所更新的标签,从而可以记住上一轮迭代中节点所更新的标签信息。根据标签存储列表得到最终的节点社区,如果一个节点观察到许多同样的标签,此节点很可能属于当前社区。且在传播过程中有可能将当前标签传播到下一个节点。另一个优势是,这种标签存储列表的设计使得算法可以同时支持重叠(overlapping)和非重叠(disjoint)社区的划分。

SLPA算法思想如下:首先,每一个节点的存储器初始化一个唯一的标签。其次,执行标签传播过程:(a)选择一个节点作为监听器;(b)从所选节点的每个邻居节点随机选择概率正比于该标签在其存储器中的出现频率的标签,把所选择的标签发送到听众;(c)监听器接收到最流行的标签后添加到内存;(d)算法收敛或遍历达到指定的次数时结束,否则标签在不断的遍历过程中传播。最后,根据在存储器里的标签和阈值进行后处理操作,输出社区结构信息。其中,上述传播过程(b)的具体实现方式是为监听器提供一个存储器,用来存储所选节点的每个邻居节点出现的次数或频率。然后随机选择邻居节点中邻居的标签与所选节点出现次数或频率呈正比的标签,作为所需标签。

具体算法描述如下:

其中,第4步中的一定的speaking策略指的是为监听器提供一个存储器,用来存储所选节点的每个邻居节点出现的次数或频率。然后随机选择邻居节点中邻居的标签与所选节点出现次数或频率呈正比的标签,作为所需标签。

使用SLPA算法对知识图谱进行社区划分可以通过以下步骤来实现:首先为知识图谱中的每个实体设置不同的标签;然后遍历所有实体,对每个实体,扫描与所述每个实体有关联的实体的标签;将扫描过程中出现次数最多的标签作为所述每个实体的候选标签,候选标签中包括每个实体所属的社区名称;最后依据社区名称,将知识图谱划分为多个社区。

步骤S104,从多个实体中选择两个实体和两个实体之间的关系组成目标三元组;

步骤S106,确定目标三元组所在的社区,并确定目标三元组所在社区的社区类型;

在本申请的一些实施例中,确定所述目标三元组样本所在的社区,并确定所述社区的社区类型,包括:根据目标三元组样本中所述两个实体的所述社区名称,确定目标三元组样本所在的社区;计算所述社区中的实体密度;将所述实体密度与所述密度阈值进行比较,其中,当所述实体密度大于所述密度阈值时,所述社区的社区类型为第一社区类型;当所述实体密度不大于所述密度阈值时,所述社区的社区类型为第二社区类型。其中,所述第一社区类型可以为稠密社区,所述第二社区类型可以为稀疏社区,如图3所示,实体用黑色圆点表示的社区为稠密社区,实体用空心圆圈表示的社区为稀疏社区。

不同社区包含不同的节点数,也就是不同的实体数量,较小社区所包含的实体更少,为描述不同社区的节点(实体)稠密情况,提出与知识图谱中社区的实体数量相关的社区实体密度(community entity density),其定义如下:

其中|Ci|表示社区Ci所包含的实体数,|E|表示所有的实体数。p(Ci)越大表示社区Ci包含的实体数越多,即此社区越稠密。

步骤S108,依据社区类型,选择非目标三元组所在社区的实体或目标三元组所在社区的实体,对目标三元组样本中的实体进行替换,得到负样本。

在引入社区划分的思想和使用SLPA划分算法后,可以得到知识图谱的社区结构,利用此结构设计一种新的负样本生成方法即CNS算法。CNS算法的主要步骤如下:利用社区划分算法SLPA找到知识图谱的社区结构信息;确定需要替换的目标头(或尾)实体;计算目标实体所在的社区实体密度,若社区实体密度大于或等于p,则从本社区内选择实体替换;若社区实体密度小于p,则从远离当前社区的其它社区选择实体进行替换;小批量梯度下降法进行训练。其中,在确定具体需要替换头实体还是尾实体时,可以根据知识图谱的类型和对应的模型具体应用场景来决定替换头实体还是尾实体,以提高训练效率。

将CNS用于TransE模型训练,其具体算法描述如下:

其中,上述算法中的第15步中的公式为TransE模型训练的目标函数。本申请在进行模型训练时,采用最大间隔方法对模型进行优化。公式中的f(h,r,t)=h+r-t,f(h`,r,t`)=h`+r-t`,均表示样本得分,其中,S为正样本集合,S`为负样本集合。

在本申请的一些实施例中,依据社区类型得到负样本的方法包括:当目标三元组样本所在社区的社区类型为所述第一社区类型,从目标三元组样本所在社区中选择未在目标三元组样本中的实体,替换目标三元组样本的头实体或尾实体,得到负样本;当目标三元组样本所在社区的社区类型为所述第二社区类型,从非目标三元组样本所在社区中选择实体,替换目标三元组样本的头实体或尾实体,得到所述负样本。

在本申请的一些实施例中,通过上述方法生成的负样本用于对基于翻译规则的知识表示模型进行训练,其中,所述模型用于根据输入的头实体和头实体与尾实体之间的关系,确定与所述头实体对应的尾实体。

上述知识表示模型是指将知识图谱中的实体和关系表示成低维稠密的向量,是计算机领域常用的一种表示知识的形式。而翻译规则是指将实体间的关系作为实体间的平移向量。

已有的知识表示学习模型主要面向静态数据,然而现实中的数据经常不断发生变化。例如,社交网络中人物之间可能会频繁地建立联系或取消联系;知识图谱中的事实三元组也可能频繁的发生变化。针对动态数据,重新训练模型会浪费大量计算资源,因此,本申请实施例利用找到的社区类型和CNS算法,针对变化的知识图谱,在线局部更新发生变化的实体所在的社区的实体或关系表示,进而提出基于社区类型的表示模型增量式更新方法。

在本申请的一些实施例中,当负样本所在的社区中实体或实体关系发生变化时,方法还包括:通过负样本,对负样本所在的社区中的实体或实体之间的关系进行更新。另外,当负样本所在的社区中实体或实体间的关系在第一预设时间周期内变化次数超过预设变化次数阈值,且社区包含的实体数量超过预设数量阈值时,方法还包括:在第二预设时间周期后,根据所述社区内的实体,对所述社区的实体表示进行更新,其中,所述社区的实体表示为所述实体在所述表示模型中的向量,所述第一预设时间周期,预设变化次数阈值,预设数量阈值和第二预设时间周期均可自由设定。

如图4所示,KG被划分为三个不同的社区,对整个知识图谱进行训练后得到表示模型。如果社区内发生变化,采用CNS算法生成的负样本对其内的实体或关系进行更新;如果社区较大且更新频繁,则采用累积更新的方式,即一段时间后,先使用负样本对社区内的实体或关系进行更新,然后使用本社区内的实体对其内的实体表示进行更新,而不需要对表示模型进行整体更新。

具体地,用CNS算法生成的负样本对社区内的实体或关系进行更新包括:利用生成的负样本,使用TransE等表示学习模型,对该社区内的实体以及关系进行重新训练,达到更新的效果。

通过上述步骤,可以实现生成高质量的负样本。该方法的主要思想是,首先使用一种社区划分算法,在本发明中采用的是SLPA算法,对知识图谱进行社区划分,然后从本社区内或者远离本社区的其他社区内选择实体进行替换从而得到负样本。为确定如何在各个社区间选择实体,本申请实施例又定义了一个社区实体密度概念,用来描述某个实体所在社区的实体密度,对于那些小于一个给定阈值的社区里的实体,选择社区外的实体替换产生负样本,反之则从本社区内选择实体进行替换。同时,根据本申请的分治策略,可以从社区划分角度为解决动态知识图谱的局部更新提供一种可行的建模思路和解决方案。

为了便于理解本发明,下面结合一个具体实例,对本发明实施例进行进一步阐述。

本发明实施例首先提出了一种负样本生成方法(CNS),随后将CNS算法用于表示学习中基于翻译规则的模型进行训练,得到CNS-TransX通用模型,最后提出动态更新表示学习模型的方法。具体实现流程如图5所示。该方法在知识推理领域,即动态知识图谱补全、智能问答系统等问题中均有着广泛的应用。

针对动态知识图谱补全问题,即传统的链接预测问题,需要对知识图谱时刻变化三元组中缺失的头实体、关系、尾实体进行预测,补全当前的图谱,使知识图谱的结构更加完整。针对智能问答系统,区别于传统的关键词匹配方法,需要分析自然语言问句,了解提问者的意图,寻找符合用户要求的最相近的答案。

该类问题通常将三元组进行向量表示,使用表示学习建模,在训练模型的过程中,使用负样本最小化损失函数,应用训练好的模型带入计算,完成预测。因此,为更高效、更准确的完成上述问题,在模型训练过程中选取合适的负样本是十分必要的。

该方法的具体样例如下:知识图谱样例如图6所示,传统方法采用随机替换尾实体的方法可能得到负样本(安徽,省会,数据结构),在训练过程效果较差。

根据本发明实施例提出的方法,对该图谱的处理流程如下:

划分社区。使用SLPA算法,执行标签传播过程,最终将该知识图谱划分为两个社区,即图中橙色社区C1以及蓝色社区C2。

计算当前两社区的实体密度。P(C1)=3/11=0.27,P(C2)=8/11=0.73,设定阈值为0.5。显然,C1社区较稀疏,C2社区较稠密。

构造负样本。Q1:对(安徽,省会,合肥)进行负样本构造,该三元组位于C2社区,高于设定的阈值,较稠密,在该社区内选择头尾实体构造负样本,替换头实体(杭州,省会,合肥)、替换尾实体(安徽,省会,浙江)等。Q2:对(XX大学,隶属,计算机学院)进行负样本构造,该三元组位于C1社区,低于设定的阈值,较稀疏,在其他社区内选择头尾实体构造负样本,替换头实体(小明,隶属,计算机学院)、替换尾实体(XX大学,隶属,杭州)等。

模型训练。将上述负样本生成策略用于基于翻译规则的表示模型(如TransE等)进行训练。

知识问答。用户提出问题“小明的祖籍在哪里?”,通过对该问句进行自然语言处理可以将该问题化简为连接预测问题,即预测(小明,祖籍,?)三元组的尾实体。

链接预测。(小明,祖籍,?),该三元组的尾实体缺失,将头实体和关系的向量带入模型的翻译规则进行计算,计算后得到尾实体‘杭州’,补全知识图谱,在小明与杭州两节点之间添加一条有向边。

图谱动态更新。Q1:C1社区数据变动,因该社区较小,则生成负样本进行更新。Q2:C2社区数据变动,因该社区较大,则需等待一段时间,待更新累计后再生成负样本进行更新。Q3:当数据变动较为频繁时,需等待一段时间,再生成负样本进行累计更新。

图2是根据本发明实施例的负样本生成装置的结构示意图,如图2所示,该装置包括:划分模块40,用于对知识图谱进行社区划分,得到多个社区,其中,知识图谱的组成元素为多个实体和多个实体之间的关系;第一确定模块42,用于从多个实体中选择两个实体和两个实体之间的关系组成目标三元组,其中,两个实体分别被称为头实体和尾实体;第二确定模块44,用于确定目标三元组所在的社区,并确定目标三元组所在社区的社区类型;生成模块46,用于依据社区类型,选择非目标三元组所在社区的实体或目标三元组所在社区的实体,对目标三元组样本中的实体进行替换,得到负样本;更新模块48,用于依据负样本,在负样本所在社区中包含的实体或实体间的关系发生变化时,对负样本所在社区中的实体或实体间的关系进行更新。

在本申请的一些实施例中,划分模块40具体通过以下步骤对知识图谱进行社区划分:为多个实体中的每个实体设置不同的标签;遍历多个实体,对多个实体中的每个实体,扫描与每个实体有关联的实体的标签;将扫描过程中出现次数最多的标签作为每个实体的候选标签,候选标签包括每个实体所属的社区名称;依据社区名称,将知识图谱划分为多个社区。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

14页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:自然语言生成及模型的训练方法、装置、设备和存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!