当前位置: 首页 > 编程日记 > 正文

知识图谱实体链接是什么?一份“由浅入深”的综述


作者 | 尼古拉·瓦砾

来源 | Paperweekly(ID:paperweekly)

【导读】这个世界充斥着无数的结构化数据(wiki)和非结构化数据(web),然而,如何将两者有效地集成仍然是个非常困难的问题。

本文介绍实体链接 (Entity Linking) 这一技术方向,会先从最基础的概念讲起,然后对EL中的三个主要模块做一个清晰的梳理。在此基础上,选取三篇比较有代表性的论文,详述其中的核心方法和思想。

EL入门


1. 任务定义

实体链接,就是把文本中的mention链接到KG里的entity的任务。如下图所示[1]:

Entity Linking示意图

有些读者可能对知识图谱的概念不甚了解,这边先解释一下图谱里常用的一些概念。

  • Knowledge Graph (知识图谱):一种语义网络,旨在描述客观世界的概念实体及其之间的关系,有时也称为Knowledge Base (知识库)。

    • 图谱由三元组构成:<实体1,关系,实体2> 或者 <实体,属性,属性值>;

    • 例如:<姚明,plays-in,NBA>、<姚明,身高,2.29m>;

    • 常见的KB有:Wikidata、DBpedia、YOGO。

  • Entity (实体):实体是知识图谱的基本单元,也是文本中承载信息的重要语言单位。

  • Mention (提及):自然文本中表达实体的语言片段。

回过头再看,上面的这个图中,“乔丹”、“美国”、“NBA”这些蓝色的片段都是mention,其箭头所指的“块块”就是它们在图谱里对应的entity。


2. 几个应用

EL有什么用呢?一般有KB的地方就离不开EL。以下是EL的几个应用[2]:

  1. Question Answering:EL是KBQA的刚需,linking到实体之后才能查询图数据库;

  2. Content Analysis:舆情分析、内容推荐、阅读增强;

  3. Information Retrieval:基于语义实体的搜索引擎,google搜索一些实体,右侧会出现wikipedia页面;

  4. Knowledge Base population:扩充知识库,更新实体和关系。


3. Taxonomy

Taxonomy

大体来说,EL的工作可以分为两类[3]:

  • End-to-End:先从文本中提取到实体mention (即NER),对应到候选实体,然后将提取到的entities消除歧义,映射到给定的KB中。

  • Linking-Only:与第一种方法对比,跳过了第一步。该方法直接将text和mention作为输入,找到候选实体并消除歧义,映射到给定的KB中。

由于端到端的工作比较少,且NER也没太多可讲的。本文着重介绍Linking-Only的相关技术方向和工作。

EL的三大模块

EL的工作非常有挑战性,主要有两个原因:

  1. Mention Variations:同一实体有不同的mention。(<科比>:小飞侠、黑曼巴、科铁、蜗壳、老科。)

  2. Entity Ambiguity:同一mention对应不同的实体。(“苹果”:中关村苹果不错;山西苹果不错。)

针对上述两个问题,一般会用Candidate Entity Generation (CEG) 和Entity Disambiguation (ED) 两个模块[2]来分别解决:

  1. Candidate Entity Generation:从mention出发,找到KB中所有可能的实体,组成候选实体集 (candidate entities);

  2. Entity Disambiguation:从candidate entities中,选择最可能的实体作为预测实体。

下面我们来讲讲这两个模块里都有些啥东西。其中,CEG的方法都比较朴素,没什么可讲的,笔者会把重点放在ED上。

1. Candidate Entity Generation (CEG)

  • 最重要的方法:Name Dictionary ( {mention: entity} )

  • 哪些别名:首字母缩写、模糊匹配、昵称、拼写错误等。

  • 构建方法:

    • Wikipedia(Redirect pages, Disambiguation pages, Hyperlinks);

    • 基于搜索引擎:调google api,搜mention。若前m个有wiki entity,建立map;

    • Heuristic Methods;

    • 人工标注、用户日志。

CEG这部分,最主流也最有效的方法就是Name Dictionary,说白了就是配别名。虽然CEG很朴素,但作为EL任务中的第一道门槛,其重要性不言而喻。对于每一个entity,紧凑而充分地配置别名,才能保证生成的candidate entites没有遗漏掉ground truth entity。

具体的,要配置哪些别名,要用什么构建方法,往往取决于EL的使用场景。比如做百科问答或是通用文本的阅读增强,就很依赖于wikipedia和搜索引擎;但如果是某个具体的行业领域,就需要通过一些启发式的方法、用户日志、网页爬取,甚至人工标注的方法来构建Name Dictionary。

2. Entity Disambiguation (ED) (手动划重点)

  • Features

    • Context-Independent Features:

      • LinkCount:#(m->e),知识库中某个提及m指向实体e的次数;

      • Entity Attributes:Popularity、Type;

    • Context-Dependent Features:

      • Textual Context:BOW, Concept Vector

      • Coherence Between Entities:WLM、PMI、Jaccard Distance

实体消歧时,不同场景的特征选取是非常重要的。总的来说,实体消歧的特征分为,context独立和context不独立的。

特征里,独立的有:mention到实体的LinkCount、实体自身的一些属性(比如热度、类型等等)。其中,LinkCount作为一个先验知识,在消歧时,往往很有用,比如当我们在问“姚明有多高?”时,大概率都是在问<篮球运动员姚明>,而不是其他不为人知的“姚明”。虽然context中完全没有包含篮球运动员这一信息,但大多数情况下,根据“姚明”到<篮球运动员姚明>的LinkCount最高,选其作为实体进行查询,都会是一个不错的答案。

不独立的有:文本的context、实体间的coherence (一致性)。这部分,可深入挖掘的东西比较多,文本context可以用一些深度学习的方法去深度理解文本的语义,从而实现消歧;实体间的一致性更加有趣,由于文本包含的所有的mention都没有确定,所以全局地进行entities的消歧实际上是一个NP-hard的问题。因此,如何更加快速有效地利用一致性特征,是一个非常有趣的方向。

基于这些常用的特征,消歧的方法可以大致分为以下几种:

  • Learning to Rank Methods:Point-wise、Pair-wise、List-wise。由于ED任务ground truth只有一个实体,一般都是用point-wise来做。输入是文本的context、mention、某个entity的一些attributes,输出mention指向该entity的置信度,以此rank,选出最可信的entity;

  • Probabilistic Methods:Incorporate heterogeneous knowledge into a probabilistic model。结合不同信息,得到条件概率  ,其中 c 是输入文本,e 为实体, m 是mention。比如用归一化的LinkCount信息,作为先验概率  ;

  • Graph-Based Approaches:maximize coherene between entities。利用图特征 (entity embedding、relation),在消歧时,考虑全局消歧后实体的一致性;

一般来说,现在的ED工作都会综合以上的方法来设计,后面我们会具体介绍几篇近期的论文,大家可以对照这三类方法看看。

3. 还有个小问题:Unlinkable Mention Prediction

除了上面的两大模块,还有一个小问题,就是如何拒识掉未知实体,毕竟你不可能建立一个能穷举万物的KB。这就涉及到Unlinkable Mention Prediction,不是很复杂,一般就三种做法:

  • NIL Threshold:通过一个置信度的阈值来卡一下;

  • Binary Classification:训练一个二分类的模型,判断Top-rankeded Entity是否真的是文中的mention想要表达的实体;

  • Rank with NIL:在rank的时候,在候选实体中加入NIL Entity。

一般就阈值卡一下就好了,不是太大的问题。但如果具体的场景是做KB Population且实体还不是很全的时候,就需要重点关注一下了。


EL的近期工作

为了让读者能更清楚地了解EL,笔者在这里选取了三篇近两年出的,比较有代表性的工作[4] [5] [6],给大家具体讲讲:

  1. Deep Joint Entity Disambiguation with Local Neural Attention. (Ganea and Hofmann, 2017, EMNLP)

  2. Improving entity linking by modeling latent relations between mentions. (Le et al., 2018, ACL)

  3. DeepType: multilingual entity linking by neural type system evolution. (Raiman et al., 2018, AAAI)


1. Deep Joint Entity Disambiguation with Local Neural Attention

早期的EL工作都非常依赖manually-designed的特征,这篇文章是EL领域第一篇不依赖特征工程,用深度学习来学习基础特征的工作。主要的创新点和关键部件有三个:

  • Entity Embeddings:用到了知识库里实体的embedding;

  • Context Attention:用attention机制来获得context的表征;

  • Collective Disambiguation:考虑实体间的coherence,联合消歧。

给定文本  ,其中有一堆mention  。  对应的实体为  ,对应的context为  ,对应的候选实体集为  。文章提出了两种模型:Local model、Global model。local只考虑mention的context;global还需要考虑实体间的一致性,联合消歧。

  • Local model:令  为local score function,local model要解决的问题即:

  • Global model:除了context,还考虑实体间的coherence (为了简化,只考虑两元一致性)。令  为实体之间的pair-wise coherence score function,  ,全局搜索:

Local and pair-wise score function 的计算方法如下:

其中,  是实体  的embedding,  是对角矩阵。  是在上下文  上取attention后的表征,具体的attention计算如下图所示:

Local Model里的Attention机制

这里是用candidate entity embeddings做key,context word embeddings做value,得到score matrix之后,按列取max,如果某个word的score较高表示这个word至少和一个entity相关度高。为了去除stop words的影响,作者只取了top R的score,剩下的置为负无穷。

得到score后,还会结合m到e的LinkCount先验概率,计算出最终各个实体的概率。该工作在AIDA数据集上取得了SOTA ( local: 88.8、global: 92.22 )。


2. Improving entity linking by modeling latent relations between mentions

上一篇论文开创性地在EL中引入entity embedding作为信息,很自然的,我们会思考一个问题,KB中还有别的可利用的信息吗?参考本文一开始的那张图片,“乔丹”、“美国”、“Nike”这些实体之间还有着“公民”、“赞助商”等关系信息,显然,若加以利用,一定能成大器。

于是Le et al.在Ganea and Hofmann工作的基础上,增加了隐关系信息。假定图谱中有K个关系,令  之间为关系k的置信度为  ,上文中的pair-wise coherence score function可以写成:

其中,  都是用来表示关系k的对角矩阵 (类似于关系k的embedding),  为归一化因子,  为将  映射到  的函数。这样一来,我们就隐式地添加了关系k,丰富了计算全局实体一致性时所参考的信息。

看起来很fancy!但是有一个问题,这个归一化因子我们要咋算呢?作者提供了两种思路:

  1. Rel-norm:Relation-wise normalization。就是以关系k维度来norm;

  2. Ment-norm:Mention-wise Normalization。就是以实体j维度来norm。

两种norm方式的示意图

看一下上面这张图,就很清晰了。该工作在AIDA数据集上得到了新的SOTA (global: 93.07)。

3. DeepType: multilingual entity linking by neural type system evolution

前两篇论文都是在联合消歧的这个角度,做了一定的工作。DeepType这篇文章则另辟蹊径,从优化知识库的type系统来做。文章很重要的一个观点是:当我们能预测出实体mention的type,消歧这个任务就做的差不多了。EL系统主要分成三个模块:

  1. Type System:一组正交的type轴和一个type标注函数;

    1. type轴:一组互斥的type集合  (e.g.  )

    2. type标注函数: 

    3. 举个例子,假定一个包含两个轴 {IsA, Topic} 的 type 系统,<追一科技>对应的就是 {公司,人工智能}

  2. Type Classifier:给定mention和text,输出mention对应实体的type;

  3. Entity Prediction Model:给定mention、text和候选实体,预测概率最高的实体。(文中直接用的LinkCount)

很显然,这三个模块的核心点在于Type System的构建。由于Entity Prediction Model是直接用的LinkCount,实际上整个EL系统就只有两组参数,一组是Type System的离散参数  ,一组是Type Classifier的连续参数  。给定text及其所含的mention  ,其中  为ground truth的实体,  为候选实体集,令  为EL系统的消歧准确率,则我们的问题可以定义为:

其中  ,这个entity score可以看成是给定m后,EL系统给出的置信度,后面会给具体公式。

同步优化两组参数很耗时,因此文章分成Type System和Type Classfier两个部分独立优化。

a. Discrete Optimization of Type System:

为了避免同时训练Type System和Type Classifier,我们得先固定classifier,然后优化Proxy Objective  ,这里我们假设两个classifier model的极端:

  1. Oracle (极端优秀):假设Type Classifier开了天眼,不管  咋变,都能预测对mention的type,然后从该type对应的候选实体集的子集中选LinkCount最高的,令 

2. Greedy (极端蠢):不预测type,直接从候选实体集中选linkcount最高的。

最简单的思路直接  其实就完事了,但是我们要考虑到真正的classifier并没有开天眼,假设classifier的Learnability(学习能力)是  ,那么更合理的目标函数应该是:

但是怎么才能不依赖  去计算学习能力呢,如果是用softmax多分类,那就糟了,每换一次  ,就得重新训练一个classifier。因此作者巧妙的用二元分类器代替了多分类,令  ,这样就只需要最开始计算一次就好了,如下图所示:

a为训练type系统时的classifier,b为后面真正用的classifier

b. Type Classifier

就按照上图b优化就是了,没什么可说的。

c. Inference

在训练完Type System和Type Classifier之后,我们就可以计算我们上面说的EntityScore了:

其中  是k个type组成type轴,  是smoothing系数。最终在AIDA数据集上取得了新的SOTA(94.88)。

4. 三篇论文效果对比和思考

前两篇都是联合消歧的,而DeepType其实是个Local模型。这么看来,如果考虑联合消歧的话,应该还会有提升。


总结

Entity Linking其实算是个很复杂的技术领域,因为优化过程中,不仅要考虑text的文本信息、KB的信息、消歧后的一致性,还需要根据具体的业务场景采用不同的方案,同时也不能为了效果去暴力搜索NP-hard的离散优化问题。在具体实施的过程中不可能面面俱到,需要一定程度的trade-off。总结起来,四大特征:LinkCount、Context、Attributes、Coherence。方法千千万,大家灵活运用。

Appendices

  • 数据集:

  • Knowledge Base:Wikipedia, YAGO, DBpedia, Freebase;

  • EL监督数据:

    • 中文:CCKS

    • 英文:TAC KBP 2010 EL、AIDA CoNLL-YAGO

  • 一个不错的多因子消歧总结:cloud.tencent.com/devel

  • ccks实体链接第一名方案:github.com/panchunguang

  • DeepType原作博客 (有一些可玩的插件):openai.com/blog/discove


References

  1. 韩先培,实体链接:从文本到概念:docs.huihoo.com/infoq/b

  2. Wei Shen, Jiawei Han: Entity Linking with a Knowledge Base: Issues, Techniques, and Solutions. dbgroup.cs.tsinghua.edu.cn

  3. Sebastian Ruder: NLP Progress of Entity Linking. github.com/sebastianrud

  4. Ganea and Hofmann, 2017, EMNLP: Joint Entity Disambiguation with Local Neural Attention. arxiv.org/abs/1704.0492

  5. Le et al., 2018, ACL: Improving entity linking by modeling latent relations between mentions. arxiv.org/abs/1804.1063

  6. Raiman et al., 2018, AAAI: DeepType: multilingual entity linking by neural type system evolution. arxiv.org/abs/1802.0102

原文链接:

https://zhuanlan.zhihu.com/p/100248426

(*本文为AI科技大本营转载文章,转载请联系原作者)

精彩推荐

人工智能数学基础系列公开课通过人工智能热点问题开始,引出其中蕴涵的数学原理,然后构建解决实际问题的数学模型和方法,兼具趣味性与实用性。

1月16日晚8:00, 哈工大屈教授在线直播课---『看得见 』的数学,带大家解密计算机视觉背后的数学知识!

点击阅读原文,或扫描海报二维码免费报名

加入公开课福利群,每周还有精选学习资料、技术图书等福利发送、60+公开课免费学习

推荐阅读

  • 滴滴章文嵩:一个人的20年开源热情和国内互联网开源运动

  • 挑战NLP、量子计算难题,300多支本科生队伍同场角逐,2020 ASC超算竞赛一触即发

  • 微信付费阅读支付宝可用,iOS抽成30%;苹果安卓充电器或统一;UOS 20发布 | 极客头条

  • 如何实现自动化前端开发?

  • 斯坦福博士退学,在 3 个领域改变世界,科技狂人马斯克的巅峰之路

  • 我的第一个全栈 Web 应用程序

  • CPU 到底是怎么认识代码的?涨姿势了

  • 2019全年盘点之一:公链生死战场

  • BSV魔幻爆拉背后:CSW称拿到自证中本聪的关键证据

  • 你点的每个“在看”,我都认真当成了AI

相关文章:

Google Test(GTest)使用方法和源码解析——预处理技术分析和应用

预处理 在《Google Test(GTest)使用方法和源码解析——概况》最后一部分&#xff0c;我们介绍了GTest的预处理特性。现在我们就详细介绍该特性的使用和相关源码。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 测试特例级别预处理 Test Fixtures是建立一个固…

出色管理者的时间管理

出色管理者的时间管理不少管理者都有这样的感慨&#xff1a;“忙了一天&#xff0c;也不知道忙了什么&#xff0c;时间还不够用。”其实&#xff0c;只要有效地运用时间&#xff0c;就可以提高工作效率&#xff0c;在相同的时间里做更多的事&#xff0c;而且做得更好&#xff0…

精品软件 推荐 瑞星 杀毒软件 安全软件

一句话评价一下这软件&#xff1a; 功能好&#xff0c;速度一般。功能&#xff1a;设置中心&#xff1a;最后&#xff0c; 下载地址请到官方下载吧。转载于:https://blog.51cto.com/hangtc/1690981

Google Test(GTest)使用方法和源码解析——自定义输出技术的分析和应用

在介绍自定义输出机制之前&#xff0c;我们先了解下AssertResult类型函数。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 在函数中使用AssertionResult AssertionResult只有两种类型&#xff1a; AssertionSuccess()AssertionFailure()要么成功&#xff0…

五年循环期限已到,我们又要步入“AI寒冬”了吗?

作者 | Sam Shead译者 | Kolen编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 【导读】过去的十年对人工智能来说是一个重要的十年&#xff0c;但该领域的研究人员认为该行业即将进入一个新的阶段。 过去几年里&#xff0c;人工智能这项技术的…

相知用心.相爱用情

人如花 一生匆匆而过 不要等到你凋落的时候才去眷恋天空&#xff0c;眷恋蝴蝶爱情是短暂的&#xff0c;但却是美丽的该追求的就去追求吧不要留给自己遗憾&#xff0c;不要让自己美丽的花朵枯萎 人生就象一列急驰的火车 机遇和缘分会让许多素昧平生的乘客在旅途中相遇、相识、相…

Android:problem opening wizard the selected wizard could not be started

直接将Eclipse关掉&#xff0c;重新打开后也许就好了。 如还没好&#xff0c;就执行如下步骤&#xff1a; 1.如果还没有添加ADT&#xff0c;则&#xff1a;Help -> Add New Software -> Add 在“Name”中填入ADT。 2.如果已经安装了ADT&#xff0c;就直接将ADT的地址填写…

Google Test(GTest)使用方法和源码解析——私有属性代码测试技术分析

有些时候&#xff0c;我们不仅要测试类暴露出来的公有方法&#xff0c;还要测试其受保护的或者私有方法。GTest测试框架提供了一种方法&#xff0c;让我们可以测试类的私有方法。但是这是一种侵入式的&#xff0c;会破坏原来代码的结构&#xff0c;所以我觉得还是谨慎使用。&am…

170个新项目,579个活跃代码仓库,Facebook开源年度回顾

作者 | Dmitry Vinnik译者 | 泓礼编辑 | 夕颜出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 【导读】过去一年对于Facebook的开源工程师来说是繁忙的一年。在2019年&#xff0c;Facebook发布了170个新的开源项目&#xff0c;活跃代码仓库产品达到了579…

“怀才不遇”与“怀才不孕”怎么办?

今天在飞机上闲来无事&#xff0c;翻阅深航的随机杂志。一直以来&#xff0c;我乘的比较多的是南航和深航的杂志。南航的杂志基本上都是广告&#xff0c;没有一点可读性的内容。相反&#xff0c;不知道是不是深航的规模较小的原因&#xff0c;找不到合适的广告主吧&#xff0c;…

《评人工智能如何走向新阶段》后记(再续15)

由AI科技大本营下载自视觉中国170. 清华大学全球产业研究院和百度大学Alpha学院于2020年1月5日发表&#xff08;人工智能&#xff09;产业智能化白皮书讨论AI发展情况&#xff0c;应用TUMC模型&#xff0c;从技术和综合应用场景的角度&#xff0c;考察热点技术和场景的AI产业化…

Google Test(GTest)使用方法和源码解析——参数自动填充技术分析和应用

在我们设计测试用例时&#xff0c;我们需要考虑很多场景。每个场景都可能要细致地考虑到到各个参数的选择。比如我们希望使用函数IsPrime检测10000以内字的数字&#xff0c;难道我们要写一万行代码么&#xff1f;&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09…

Linux 指令篇:文件系统--fstab

Linux 指令篇:文件系统-----FSTAB指令&#xff1a;FSTAB使用权限 : 超级使用者 使用方式 : 使用编辑器来修改 /etc/fstab (eg. vi /etc/fstab) 说明 &#xff1a; 存放档案系统与目录结构对应资料的档案 fstab 栏位说明&#xff1a; 第一栏(fs_spec)&#xff1a; 实际的 device…

跨平台抓包软件,可以替代Fiddler

2019独角兽企业重金招聘Python工程师标准>>> Zed Attack Proxy (ZAP) 是个强大的跨平台的抓包工具&#xff0c;可以用来替代windows下的Fiddler https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project https://github.com/zaproxy/zaproxy/wiki/Download…

集五福,我用Python

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送作者 | Crossin先生编辑 | Jane来源 | Crossin的编程教室&#xff08;ID&#xff1a;crossincode&#xff09;【导读】你的五福集齐了吗&#xff1f;作为一名技术人&#xff0c;我们是不是可以…

Google Test(GTest)使用方法和源码解析——模板类测试技术分析和应用

写C难免会遇到模板问题&#xff0c;如果要针对一个模板类进行测试&#xff0c;似乎之前博文中介绍的方式只能傻乎乎的一个一个特化类型后再进行测试。其实GTest提供了两种测试模板类的方法&#xff0c;本文我们将介绍方法的使用&#xff0c;并分析其实现原理。&#xff08;转载…

IT人才职场受宠

面对就业压力的日益增大&#xff0c;就业难&#xff0c;工资水平低等问题困扰着所有的大学生。然而&#xff0c;IT业的迅猛发展却造成了数以万计的网络设计、运行、维护的网络工程师需求的空缺&#xff0c;巨大的人才缺口使得IT业“全线告急”&#xff0c;这也促使更多的研究人…

引用头文件#include queue出错

为什么80%的码农都做不了架构师&#xff1f;>>> 在工程头文件中引用头文件 #include <queue> 莫名奇妙出错&#xff0c;其原因很可能是由于头文件引用问题。 include/c/4.7.1/bits/stl_vector.h:1308:40: error: expected unqualified-id before ‘(’ token…

ZOJ1002 Fire Net(非递归版)

以前用递归的回溯搜索思路做过一次&#xff0c;参见ZOJ1002 Fire Net(递归版)&#xff0c;今天想着用非递归的方法试试看&#xff0c;呵呵&#xff0c;比我想象中要难啊&#xff0c;主要还是堆栈里究竟放什么&#xff0c;这一点上思路一直没理清。因此用了整整一天的时间&#…

“数学不行,干啥也不行”骨灰级程序员:其实你们都是瞎努力

编程圈一直都流传着一个段子&#xff1a;一流程序员靠数学&#xff0c;二流程序员靠算法&#xff0c;末端程序员靠百度&#xff0c;低端看高端就是黑魔法。懂的人其实都知道&#xff0c;这不是段子&#xff0c;其实就是程序员的真实写照。想一想&#xff0c;我们日常学习、求职…

Google Test(GTest)使用方法和源码解析——死亡测试技术分析和应用

死亡测试是为了判断一段逻辑是否会导致进程退出而设计的。这种场景并不常见&#xff0c;但是GTest依然为我们设计了这个功能。我们先看下其应用实例。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 死亡测试技术应用 我们可以使用TEST声明并注册一个简单的测…

java学习笔记11--Annotation

java学习笔记11--Annotation Annotation&#xff1a;在JDK1.5之后增加的一个新特性&#xff0c;这种特性被称为元数据特性&#xff0c;在JDK1.5之后称为注释&#xff0c;即&#xff1a;使用注释的方式加入一些程序的信息。 java.lang.annotation Annotation接口是所有的Annotat…

GoogleLog(GLog)源码分析

GLog是Google开发的一套日志输出框架。由于其具有功能强大、方便使用等特性&#xff0c;它被众多开源项目使用。本文将通过分析其源码&#xff0c;解析Glog实现的过程。 该框架的源码在https://github.com/google/glog上可以获取到。本文将以目前最新的0.3.3版本源码为范例进行…

Ajax Toolkit 控件学习系列(13) ——FilteredTextBoxExtender 控制输入

这个控件的作用是对TextBox所要输入的内容进行过滤控制。按照自己需要过滤&#xff0c;可以自定义&#xff0c;再或者使用定义好的方式。看效果。效果不是很突出&#xff0c;说明下&#xff0c;就是只能输入大写字母和数字。因为加了限制&#xff0c;但是具体有什么高深的应用呢…

Uber最新开源Manifold,助力机器学习开发者的可视化与调试需求

所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项&#xff0c;还有更多福利赠送作者 | Lezhi Li译者 | 凯隐编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】2019 年 1 月&#xff0c;Uber 推出了 Manifold&#xff0c;一款与模型无…

jQuery对象和DOM对象使用说明

1.jQuery对象和DOM对象第一次学习jQuery,经常分辨不清哪些是jQuery对象&#xff0c;哪些是 DOM对象&#xff0c;因此需要重点了解jQuery对象和DOM对象以及它们之间的关系.DOM对象&#xff0c;即是我们用传统的方法(javascript)获得的对象&#xff0c;jQuery对象即是用jQuery类库…

[WPF疑难]避免窗口最大化时遮盖任务栏

[WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是&#xff1a;如果窗口的WindowStyle被直接或间接地设置为None后&#xff08;比如很多情况下你会覆盖默认的窗体样式&#xff0c;即不采用Windows默认的边框和最大化最等按钮&#xff0c;来打造个…

Google Mock(Gmock)简单使用和源码分析——简单使用

初识Gmock是之前分析GTest源码时&#xff0c;它的源码和GTest源码在同一个代码仓库中&#xff08;https://github.com/google/googletest&#xff09;。本文我将以目前最新的Gmock1.7版本为范例&#xff0c;分析其实现原理。&#xff08;转载请指明出于breaksoftware的csdn博客…

浪潮刘军:为什么说计算力是AI时代“免费的午餐”?

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;产业AI、元脑生态是浪潮集团2019年度的两大关键词。作为一家以计算力为核心生产力的企业&#xff0c;浪潮还一直强调人工智能计算是未来最重要的计算力&#xff0c;而无论产业AI、元脑生态都构筑于计算的基础设施之上。…

Journey源码分析四:url路由

2019独角兽企业重金招聘Python工程师标准>>> 在入口函数main()的default分支中&#xff0c;对路由进行了注册&#xff0c;现在分析下。 ##main()中路由注册相关代码 源码: httpRouter : httptreemux.New() // Blog and pages as http server.InitializeBlog(httpRou…