SnowGraph 介绍
总体介绍
SnowGraph(Software Knowledge Graph)是一个软件项目知识图谱自动生成和问答系统。它能够实现面向多源异质、动态增长的软件大数据的软件知识自动识别、抽取、关联与融合过程,提炼出大规模、内容全面、语义丰富的软件知识图谱,为实现面向特定软件项目的知识检索和问答系统提供了知识基础。针对开发者提出的自然语言问题,SnowGraph 提供了智能化的软件项目知识图谱的自然语言查询工具和融合代码知识的软件文档自然语言检索工具,从而为程序理解和软件开发提供了基础支撑。
软件项目知识图谱构造
软件项目知识图谱自动生成框架 SnowGraph 采取一种以源代码为核心、多种信息抽取方法协同的方式全自动化地进行软件知识图谱的构造,并采取插件机制进行图谱未来知识的扩展。软件项目知识图谱基于图数据库,实现了对知识图谱的存储、索引、查询等基础支持的建立,为软件项目数据的解析、关联融合与知识挖掘提炼提供了支撑环境。在数据解析方面,图谱兼容多种不同类型的软件工程数据,包括:软件源代码、各种版本控制系统(例如:svn,git)的版本记录、 邮件列表日志、缺陷追踪系统日志、html 网页文档、word 文档、pdf 文档等。对开源软件开发和企业软件开发中的绝大部分数据源都能实现支持。在知识关联融合提炼方面,该工具内置了多种可追踪性关联分析与知识补全模块,能够充分对不同来源的软件数据间的语义关联进行智能恢复补全,且能够从数据中提炼出更适合管理者、开发者与复用者理解的知识。
与其他主流软件知识图谱相比,SnowGraph 知识图谱在构造方法自动化程度、可扩展性以及图谱相关类型信息等方面具有明显优势:
SnowGraph 知识图谱在构造知识图谱的过程中,以源代码为核心,采取了多种信息抽取的方法协同进行知识图谱的全自动化构造,相较于其他主流软件知识图谱,SnowGraph 的知识图谱构造方法自动化程度最高;
SnowGraph 知识图谱采取一种插件机制,使得知识图谱对于其他数据源的软件相关数据具备很好的通用性和可扩展性,能够对未来可能出现的新的知识需求、知识来源和知识抽取、关联、提炼等进行支持;
SnowGraph 知识图谱的数据来源多样、广泛关联、语义丰富,其中,实体类型和关系类型明显丰富于其他主流软件知识图谱,从而,在对应的软件知识表示和知 识利用的任务上,具备更好的效果。
软件项目图谱示例:Apache Lucene
Apache Lucene是被广泛使用的开源全文搜索引擎库。目前,收集到的 Lucene 项目数据超过8GB,包括:
- 全部67个版本,超过80万行源代码
- 24万条邮件记录
- 5200条缺陷报告
- 500多个官方文档
- 大量相关技术博客
SnowGraph 为 Lucene 项目抽取出16种不同类型的378,897个实体,包含3,434,974条属性;关联融合了31种不同类型的1,902,683条边。具体的实体类型和边的分布如图所示。

软件项目知识图谱的自然语言查询工具
针对自然语言查询软件知识图谱中的实体和关系,SnowGraph 提供一套基于推理子图的自然语言-形式化查询转化方法。对于复用者给出的一个自然语言形式的问句,将其转换为软件项目知识图谱上的一个形式化的查询语句,从而返回准确的查询结果。
该工具通过一种基于隐藏结点扩展的推理子图转换技术,结合最小生成树算法和最短编辑距离算法,能够快速生成一个自然语言问题的候选推理子图;同时,基于推理子图的结构特征和自然语言的文本信息,能够对不同形状的推理子图进行度量,最终推荐出一个得分最高的推理子图,并据此生成相应的形式化查询语句、在知识图谱上查询得到答案。
在这个方法中,我们首次提出了推理子图的概念,并通过构造和度量推理子图,建立自然语言到形式化查询语句之间的转化桥梁。一方面,相较于传统的语义解析的逻辑形式系统,子图转化的方法更容易表达自然语言的语义信息;另一方面,利用推理子图的生成与度量可以很好地解决自然语言的歧义问题。
基于知识图谱的软件文档自然语言查询
对于复杂的自然语言提问,SnowGraph 提供了融合代码知识的答案检索工具。该工具借助软件项目的知识图谱来计算不同单词之间的潜在语义相关度,从而对候选文本集合进行筛选与评估,返回更为准确的答案。
在软件项目中,源代码可以看作是对领域知识的具体实现。对于具有良好的代码规范和设计模式的源代码而言,其中的各个代码实体的命名以及这些代码实体之间的结构依赖关系可以很好地反映出这个软件项目中的领域知识。因此,工具可以利用软件项目的知识图谱来帮助机器理解软件文本的语义,从而提升文档搜索的效果。
具体解决方案是:以单词匹配为主,结合多种歧义消除技术,识别出与一段软件文本相关的代码实体集合;参考信息检索领域的指标,度量软件文本与代码实体之间 的关联关系的强弱程度,从而将软件文本的语义结构化地表示为一个带权重的代码实体的集合;基于知识图谱表示学习技术,以代码实体之间的关联关系作为桥梁,度量软件文本间的语义相似度;以语义相似度作为核心特征,综合考虑多方面特征建立对候选答案段落的评估模型从而抽取出最为合适的文本片段作为答案返回给复用者。