仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
知识图谱作为一种高效的数据表示方法,能够将大数据中分散的信息连接成结构化、可查询的格式,显著提升数据发现效率。实践表明,采用知识图谱技术可将数据探索时间减少多达70%,从而极大地优化数据分析流程。
本文将基于相关理论知识和方法构建一个完整的端到端项目,系统展示如何利用知识图谱方法对大规模数据进行处理和分析。
首先,我们需要安装必要的Python库以支持后续的开发工作。以下是所需的关键依赖包:
安装完成后,为确保所有依赖正常加载,可能需要重启Jupyter内核或运行环境。接下来,我们导入所有必要的库:
至此,我们已完成开发环境的准备工作,所有必要的库已成功导入。
本项目使用CNN/DailyMail数据集作为研究对象。该数据集包含超过30万篇新闻文章及其对应的人工撰写摘要,是进行实体、关系和事件提取的理想资源。
使用HuggingFacedatasets库加载数据集:
我们选择版本\“3. 0.0\“,这是该数据集的最新稳定版本。下面打印数据集的基本信息:
通过输出可知,该数据集包含311,971篇新闻文章,这是一个相当庞大的语料库。从中提取有价值的洞察确实是一项具有挑战性的任务,而知识图谱正是解决此类问题的有效工具。
构建知识图谱时,直接处理整个包含30万多篇文章的数据集既不高效也不切实际,因为并非所有内容都具有相关性。更为合理的做法是将数据按主题或领域分割为子集,如技术新闻、体育新闻等,分别构建相应的知识图谱。
在大数据处理流程的早期阶段,将数据分解为更易管理的部分是一项关键步骤。对于新闻文章数据集,我们可以采用基于关键词的方法进行初步筛选。
首先定义与技术公司收购相关的关键词集合:
这些关键词是在文本分析中常见的术语,我们预先定义它们以简化处理流程。接下来,使用这些关键词从训练集中筛选相关文章:
现在检查过滤后的文章数量并查看其中一个样本:
通过关键词筛选,我们将数据集缩减至约65,000篇文章。接下来需要对这些文章进行清洗处理,移除不必要的信息。这一步骤尤为重要,因为这些数据将作为输入传递给大语言模型(LLM),过多的冗余信息会影响处理效率和成本。
在新闻数据清洗过程中,我们需要移除链接、不必要的特殊字符、发布渠道名称等元素:
这些清洗步骤基于对数据的观察和分析,旨在保留关键信息的同时最大限度地减少每篇文章的大小,为后续的知识图谱构建做好准备。
当前我们有65,000多篇新闻文章,从中提取实体是一项具有挑战性的任务。尽管可以使用大语言模型(LLM)从每个文本段落中提取实体,但首先需要确定LLM应该关注哪些类型的实体。
如果没有明确的指导,LLM可能会从每个文本块中提取不同类型的实体,导致结果不一致。为解决这个问题,我们需要使用自然语言处理(NLP)技术来定义一个固定的实体类型集合,作为LLM的提取依据。
虽然有多种方法可以实现这一目标,包括使用嵌入和其他高级技术,但本项目将采用预训练的SpaCy模型作为基础方法。该模型将分析我们的数据,提取实体标签,然后我们将使用这些标签指导LLM提取特定类型的实体:
打印实体计数情况:
为了更直观地了解数据中的实体分布情况,我们可以绘制这些标签的柱状图:
目前我们使用的是SpaCy的小型模型(en_core_web_sm),如需提取更深入、更准确的实体标签,可以考虑切换到更大的模型。这些实体标签将作为指导,帮助我们的大语言模型(如Microsoft的Phi-4)从文章中提取相关实体。
实体作为知识图谱中的节点,需要从文本中精确提取。为此,我们需要定义一个系统提示(指导LLM如何处理使用SpaCy提取的实体类型)、用户提示(即文章内容)以及其他必要组件。
首先,建立与LLM的连接:
接下来,创建一个辅助函数,用于打包请求并发送给LLM。该函数接收系统提示、用户提示(文章文本)和模型名称作为参数:
现在,我们需要创建一个系统提示。我们将使用Python的f-string格式化,动态插入从entity_counts. keys()获取的实体类型列表:
此系统提示将指导LLM以有效的JSON格式输出实体数据。在创建主处理循环前,我们需要一个JSON解析器函数,将文本输出转换为有效的JSON格式:
现在,创建一个循环,对数据集中的每篇文章应用这个系统提示:
此循环将处理我们的65,000篇新闻文章,从中提取实体。处理完成后,我们可以查看一篇文章的提取实体:
至此,我们已成功从65,000多篇新闻文章中提取了实体,这些实体将作为知识图谱中的节点。然而,要构建一个完整的知识图谱,我们还需要定义这些节点之间的关系(边),这将在下一步中进行。
为构建完整的知识图谱,除了识别实体(节点)外,还需明确这些实体间的关系(边)。这些关系将形成知识图谱的连接结构,使图谱能够表达复杂的语义信息。例如,我们需要确定:
哪家公司收购了哪家公司
收购交易的价格
收购公告的具体时间
我们将使用与实体提取相同的LLM调用函数,但需要重新定义一个专注于关系提取的系统提示:
在这个系统提示中,我们指导LLM以特定的JSON格式输出关系数据,格式示例如下:
与实体提取类似,我们需要一个解析函数来处理LLM返回的关系JSON数据:
现在,我们将使用这个系统提示和JSON解析器,对每篇文章进行处理以提取实体间的关系:
处理完成后,我们可以查看一篇文章中提取的关系样本:
至此,我们已成功从文章数据集中提取了实体(节点)和关系(边),完成了构建知识图谱所需的基本元素。
在处理非结构化文本时,同一实体可能以多种不同形式出现。例如,\“MicrosoftCorp.\“、\“Microsoft\“和\“MSFT\“实际上都指代同一家公司。如果在知识图谱中将这些视为独立节点,将导致重要连接的丢失。
实体规范化(也称为实体消歧或实体解析)旨在解决这一问题,确保相同实体的不同表述被识别为同一节点。虽然将实体链接到像Wikidata这样的大型外部知识库是一项复杂任务,但我们可以采用简化的方法:
URI生成:为每个规范化的实体及其类型创建唯一标识符(URI)。例如,类型为\“ORG\“的\“Microsoft\“将获得特定URI,后续出现的同一实体将使用相同的URI。
首先,创建一个函数来规范化实体文本:
接下来,我们将处理所有实体,规范化其文本并为每个唯一实体创建URI:
处理完成后可以查看一些规范化实体的样本:
至此,我们的数据集中每个唯一实体都有了规范化的名称和唯一的URI。这些处理后的实体,结合之前提取的关系,已准备好转换为RDF三元组,用于构建知识图谱。
为了赋予知识图谱更加正式的结构,我们需要进行模式设计或本体对齐。这一步骤相当于为图谱提供一个蓝图或字典:
模式(Schema)定义了可以存在于图谱中的实体类型和关系类型。
本体(Ontology)则更加正式,可包含更丰富的描述、规则和约束,如\“一家公司可以被另一家公司收购,但一个人不能被一座建筑物收购\“。
对于本项目,我们将进行简化版本的模式对齐。我们需要告诉图谱每个URI的实际类型,例如,ex:Microsoft_ORG不仅是一个随机字符串,它代表一个组织;而ex:Satya_Nadella_PERSON代表一个人。
我们将创建一个函数,将实体的简化类型(如\“ORG\“、\“PERSON\“、\“MONEY\“)映射到正式的RDF类。在RDF世界中,RDF类相当于一个分类或类型:
让我们测试这个函数,看看我们的实体类型会映射到哪些RDF类:
RDF三元组是使用资源描述框架(RDF)构建知识图谱的基本单元。每个三元组由三部分组成:
主语:我们谈论的实体(实体URI)
谓语:关于主语的描述(属性或关系URI)
宾语:与主语相关的值或其他实体(另一个实体URI或如名称、日期、数字等字面值)
可以将其视为一个简单的语句:
我们生成三元组的方法如下:
为每篇文章创建URI,将其标记为schema:Article,并添加其摘要
为每个实体使用其URI,分配rdf:type、rdfs:label和可选的skos:altLabel,并通过schema:mentions将其链接到文章
为每个关系获取主语和宾语URI,将谓语映射到RDF属性,并添加相应三元组
首先,我们定义一个关系谓语的辅助函数,类似于实体类型的映射函数:
现在,创建RDF图谱并填充它:
处理完成后,我们可以查看一些生成的三元组样本:
至此,我们的知识图谱已填充了RDF三元组。每个实体都有类型、标签,并通过有意义的关系相互连接。我们已成功将非结构化的新闻文本转换为结构化的、机器可读的知识图谱。
我们构建的知识图谱虽然具有良好的结构,包含实体(节点)和关系(边),但目前主要是符号性的。例如,图谱知道ex:Microsoft_ORG是一个schema:Organization,但它本质上无法理解Microsoft与Apple或Google之间的语义相似性,除非我们明确指定。
知识图谱嵌入(KGE)能够解决这一问题,它为图谱中的每个实体和关系生成密集向量表示,捕获它们的语义特性。这些嵌入使以下任务成为可能:
链接预测(建议缺失的关系)
实体相似性分析(比较实体)
类比推理(例如,\“SatyaNadella之于Microsoft就像TimCook之于?\“)
知识图谱补全(填补图谱中的空白)
从头开始训练完整的KGE模型(如TransE、ComplEx或DistMult)可能相当复杂。在本教程中,我们采用更简便的方法,使用预训练的嵌入模型。
首先,定义一个函数,使用LLM客户端获取文本嵌入:
接下来,从我们的unique_entities_map中收集所有唯一的、规范化的实体标签,并为每个唯一的normalized_text生成嵌入向量:
通过这个过程,我们的每个唯一实体(或更准确地说,它们的名称)都拥有一个存储在entity_uri_to_embedding_vector中的密集向量表示,这个向量捕获了实体的语义含义。
当前的知识图谱仅包含从文本中明确陈述或提取的事实。然而,可能存在一些未直接提及但可以通过推理发现的连接或相似性。链接预测(也称为知识发现)正是解决这一问题的技术。
在知识图谱中,链接预测是识别实体(节点)之间潜在关系(边)的任务。这种技术能够发现隐藏的关联,丰富图谱的语义表达能力,提供更完整的知识表示。
链接预测的一种简单方法是基于嵌入相似性。我们可以使用以下步骤:
选择一个源实体(例如,一家公司)
找到与该实体相似的其他实体
分析图谱中已存在的关系模式
预测可能存在但尚未明确提取的关系
让我们通过一个示例来展示这个过程:
基于这些相似性分析,我们可以生成可能的新关系,丰富知识图谱:
通过这种方式,我们能够基于实体之间的语义相似性和已知关系模式,预测和建议潜在的新关系,从而扩展和丰富知识图谱。
知识图谱的持久化存储是确保其可重用性和共享性的关键步骤。RDF知识图谱的存储方式多种多样,但最基础且通用的方法是将图谱序列化为标准格式文件。本项目采用Turtle(.ttl)格式,这是一种人类可读的RDF序列化格式,广泛应用于语义网技术领域。
下面定义一个通用函数,将我们构建的rdflib. Graph对象序列化到文件系统中:
现在,调用此函数将我们的知识图谱保存为Turtle格式文件:
Turtle格式是一种简洁且可读性强的RDF表示方法。如果在文本编辑器中打开生成的. ttl文件,您将看到类似以下内容的结构:
在Turtle语法中,文档开始部分定义命名空间前缀,随后是三元组表示。分号(;)用于在同一主语下列出多个谓语-宾语对,而句点(.)则表示一个主语的语句组结束。这种格式既人类可读又便于机器处理,是知识图谱交换的理想格式。
知识图谱的核心价值在于其灵活的查询能力。对于RDF知识图谱,SPARQL(SPARQLProtocolandRDFQueryLanguage)是专门设计用于查询和操作RDF数据的标准查询语言。通过SPARQL,我们可以从知识图谱中提取特定模式、关系或属性,执行复杂的分析,甚至修改图谱结构。
首先,创建一个辅助函数,用于执行SPARQL查询并格式化结果:
现在,让我们通过几个示例SPARQL查询,展示如何从知识图谱中提取有价值的信息:
示例1:查询图谱中的所有组织机构
执行结果:
示例2:查询所有公司收购关系
执行结果:
SPARQL的强大之处在于其表达能力和灵活性。通过组合不同的图模式、过滤条件和聚合函数,我们可以构建复杂的查询,从知识图谱中提取精确的信息。例如,我们可以查询特定时间段内的收购活动、特定金额以上的交易,或者识别出最活跃的收购方。
SPARQL还支持联合查询、可选匹配、过滤、聚合和排序等高级功能,使其成为知识图谱分析的强大工具。
数据可视化对于理解复杂的知识结构至关重要。对于知识图谱,网络图是最直观的可视化方式,能够同时展示实体(节点)和关系(边)。本项目采用pyvis库创建交互式网络可视化,该库基于vis. js构建,提供丰富的交互功能。
以下函数用于从RDF图谱生成交互式HTML可视化:
执行可视化函数:
执行此代码后,将在当前工作目录中生成一个HTML文件。在Web浏览器中打开该文件,您将看到一个交互式的知识图谱可视化,如下图所示:
这个交互式可视化具有以下特点:
节点分组:不同类型的实体(如组织、人物、金额等)使用不同的颜色分组
关系标签:边上显示关系类型(如\“ACQUIRED\“、\“HAS_PRICE\“等)
交互功能:支持缩放、平移、节点拖拽以及悬停查看详细信息
物理模拟:使用力导向算法自动布局,相关节点自然聚集
通过这种可视化,我们可以直观地理解知识图谱的结构,发现实体之间的关系模式,识别中心节点和关键连接。例如,我们可以轻松看出哪些公司是主要的收购方,哪些公司被多次提及,以及各种收购关系的网络结构。
完成知识图谱的构建、查询和可视化后,我们已经实现了从非结构化文本到结构化知识的完整转换。然而,这仅仅是知识图谱应用的起点。以下是一些值得探索的后续发展方向:
利用SPARQL的全部功能,构建更复杂的查询以回答业务问题:
链接预测器训练:基于现有实体嵌入,训练专门的链接预测模型,可以预测图谱中尚未明确表达的潜在关系。
与外部知识图谱对齐:将实体映射到Wikidata或DBpedia等公共知识库,丰富现有知识图谱的语义内容:
集成更多数据源:整合财务报告、社交媒体数据、专利信息等多样化数据源,构建更全面的企业知识图谱。
基于构建的知识图谱,可以开发各种实用应用:
知识图谱搜索引擎:创建一个Web应用,允许用户通过自然语言查询或结构化方式探索技术收购数据:
知识图谱推荐系统:根据公司间的相似性和关系,构建推荐系统,预测潜在的收购目标或合作伙伴。
趋势分析与可视化仪表板:创建分析仪表板,展示技术收购领域的趋势、主要参与者和市场动态。
设计自动化流程,持续更新知识图谱:
增量更新机制:定期从新闻源获取最新文章,仅处理新内容并将提取的知识集成到现有图谱中。
质量评估与修正:实现自动化验证程序,识别并修正知识图谱中的错误或不一致。
版本控制:建立知识图谱的版本控制系统,跟踪内容变化并支持回滚操作。
通过这些拓展,我们可以将初始的知识图谱转变为一个功能丰富、持续更新的知识系统,为商业智能、投资分析、市场研究等领域提供深刻洞察。知识图谱的真正价值在于其能够连接分散信息、发现隐藏关系以及支持智能决策的能力。
本文通过11个系统化步骤,展示了如何从非结构化新闻文本构建技术收购领域的知识图谱:
数据获取与预处理:从大型新闻数据集中筛选并清洗相关文章
实体标签检测:利用SpaCy确定目标实体类型
实体提取:使用大语言模型从文本中识别关键实体
关系提取:发现实体间的语义关联
实体规范化:统一不同表述的同一实体
本体对齐:将实体映射到标准化的语义模型
RDF三元组构建:生成知识图谱的基础单元
知识图谱嵌入:为实体创建语义向量表示
知识图谱存储:序列化并持久化RDF图谱
SPARQL查询分析:提取结构化知识
交互式可视化:直观呈现知识网络
通过这一过程,我们将大量分散、非结构化的信息转化为互联、可查询的知识网络,实现了数据到知识的转换。这种方法不仅适用于技术收购领域,还可扩展到金融、医疗、学术研究等众多领域,为数据分析和知识发现提供了强大工具。
知识图谱技术通过连接数据点创造额外价值,使信息检索更加精确,推理能力更加强大,为复杂问题的解决提供了新的途径。随着语言模型和知识表示技术的不断进步,这一领域仍有广阔的发展空间和应用前景。
长按👇关注-数据STUDIO-设为星标,干货速递