从非结构化文本中抽取实体及其之间的关系构建知识图谱

这篇博文将探讨我们在项目期间调查的一个用例:从非结构化数据中提取信息。长期以来,组织在从非结构化数据中提取有意义的见解方面一直面临挑战。此类数据包括文本内容、图像、音频和其他非表格格式,具有巨大的潜力,但由于其固有的复杂性,往往难以使用。我们在这篇文章中的主要重点是通过将非结构化文本转换为节点和关系来从中提取信息。

Imagine.art的“从非结构化数据中提取信息”插图

近年来,自然语言处理技术取得了重大进展,彻底改变了非结构化数据向有价值知识的转化方式。随着 OpenAI 的 GPT 模型等强大语言模型的出现以及机器学习的强大功能,将非结构化文本数据转换为结构化表示的过程变得更加便捷和高效。

知识图谱就是这样一种表示方法它提供了一个强大的框架来表示各种实体之间的复杂关系和联系。它们提供了数据的结构化表示,使人们能够直观地查询和探索其中包含的信息。这种结构化特性允许进行高级语义分析、推理和推断,从而促进更准确、更全面的决策过程。

知识提取管道示例

我们将探索大型语言模型 ( LLM ) 如何简化非结构化数据到知识图谱的转换,使用的方法利用 LLM 的语言技能来执行几乎所有部分。该过程可分为三个步骤:

  1. 提取节点和边
  2. 实体歧义消除
  3. 导入 Neo4j

让我们逐步了解每个步骤:

1. 提取节点和关系:为了解决这个问题,我们采用最简单的方法,将输入数据传递给 LLM,让它决定提取哪些节点和关系。我们要求 LLM 以特定格式返回提取的实体,包括名称、类型和属性。这使我们能够从输入文本中提取节点和边。

然而,LLM 有一个称为上下文窗口的限制(大多数 LLM 的标记数在 4 到 16,000 个之间),它很容易被较大的输入所淹没,从而阻碍此类数据的处理。为了克服这一限制,我们采用了一种策略,将输入文本划分为更小、更易于管理的块,以适合上下文窗口。

确定文本的最佳分割点本身就是一项挑战。为了简单起见,我们选择将文本划分为最大大小的块,从而最大限度地利用每个块的上下文窗口。此外,我们引入了一些与前一个块的重叠,以解决句子或描述跨越多个块的情况。这种方法使我们能够从每个块中提取节点和边,表示其中包含的信息。

为了在各个块中保持不同类型实体的标签一致性,我们为 LLM 提供了在先前块中提取的节点类型列表。这些节点类型开始形成提取的“模式”。我们观察到这种方法增强了最终标签的一致性。例如,LLM 不会为“公司”和“游戏公司”生成单独的类型,而是将所有类型的公司合并到“公司”标签下。

我们的方法中一个显著的障碍是重复实体的问题。由于每个块都是半独立处理的,当我们合并结果时,不同块中发现的关于同一实体的信息将产生重复。自然,这个问题将我们引向下一步。

2. 实体歧义消除:我们现在有一组实体。为了解决重复问题,我们再次使用 LLM。首先,我们根据实体的类型将实体组织成集合。随后,我们将每个集合提供给 LLM,使其能够合并重复的实体,同时合并它们的属性。我们使用 LLM 来实现这一点,因为我们不知道每个实体的名称。例如,初始提取可能最终得到两个节点:(Alice {name:“Alice Henderson”}) 和 (Alice Henderson {age: 25})。它们引用同一个实体,应该合并为一个具有 name 和 age 属性的节点。我们使用 LLM 来实现这一点,因为它可以很好地快速了解哪些节点实际上引用了同一个实体。

通过对所有实体组迭代执行此过程,我们获得了可以进一步处理的结构化数据集。

3. 将数据导入 Neo4j:在流程的最后一步,我们专注于将从 LLM 获得的结果导入 Neo4j 数据库。这需要 Neo4j 可以理解的格式。为此,我们解析 LLM 生成的文本并将其转换为单独的 CSV 文件,对应于各种节点和关系类型。随后将这些 CSV 文件映射到与 Neo4j 数据导入器工具兼容的格式通过这种转换,我们可以在启动导入 Neo4j 数据库的过程之前预览数据,从而利用 Neo4j 导入器工具提供的功能。

应用程序概述

综上所述,我们创建了一个由三部分组成的应用程序:用于输入文件的 UI、执行前面解释的流程的控制器以及与控制器通信的 LLM。此演示应用程序可在此处找到,源代码可在GitHub上找到。

我们还创建了此管道的一个版本,其工作方式基本相同,但可以选择包含架构。此架构的工作方式类似于过滤器,用户可以在其中限制 LLM 应在其结果中包含哪些类型的节点和关系以及哪些属性。

如果您有兴趣了解有关生成 AI 和知识图谱的更多信息,我建议您查看Neo4j 关于生成 AI 的页面

示范

我通过向应用程序提供詹姆斯邦德系列电影的维基百科页面来测试该应用程序并检查生成的知识图谱。

结果图示例

提供的图表子集展示了生成的图表,在我看来,它相当准确地描述了维基百科文章。该图主要由代表书籍和与这些书籍相关的个人(例如作者和出版商)的节点组成。

然而,该图存在一些问题。例如,伊恩·弗莱明在大多数他写的书中都被标记为出版商而不是作者。这种差异可能是由于语言模型难以理解维基百科文章的这一特定方面。

另一个问题是包含书籍节点和同名电影的导演之间的关系,而不是为电影创建单独的节点。

最后,值得注意的是,法学硕士在解释关系时似乎非常字面化,这一点可以从使用关系类型“used”将詹姆斯邦德角色与他驾驶的汽车联系起来看出。这种字面方法可能源于文章使用动词“used”而不是“drove”。

问题

就演示而言,这种方法效果很好,我们认为它表明可以使用 LLM 创建知识图谱。但是,我们承认这种方法需要解决某些问题:

  • 不可预测的输出:这是 LLM 的固有特性。我们不知道 LLM 将如何格式化其结果。即使我们要求它以特定格式输出,它也可能不会服从。这可能会在尝试解析其生成的内容时导致问题。我们在对数据进行分块时看到了这种情况的一个实例:大多数情况下,LLM 会生成一个简单的节点和边列表,但有时 LLM 会对列表进行编号。解决这个问题的工具已经开始发布,例如GuardrailsOpenAIs Function API。LLM工具领域还处于早期阶段,因此我们预计这不会成为长期的问题。
  • 速度:这种方法很慢,通常仅处理一个相当大的网页就需要几分钟。也许存在一种完全不同的方法,可以使提取速度更快。
  • 缺乏责任感:无法知道 LLM 为何决定从源文档中提取某些信息,或者这些信息是否存在于源文档中。因此,生成的知识图谱的数据质量远低于未利用 LLM 的流程所创建的图谱。

总结

这篇博文探讨了使用 Neo4j 的大型语言模型的用例,通过将非结构化数据转换为知识图谱形式的结构化表示来从中提取见解。

我们讨论了一种三步方法,重点是提取节点和关系、实体消歧以及将数据导入 Neo4j。通过利用 LLM,任何人都可以自动化提取过程并高效处理大量非结构化数据。

然而,仍存在一些挑战需要解决,包括不可预测的输出格式、速度限制和缺乏责任感。尽管存在这些问题,但 LLM 和 Neo4j 的结合功能为解锁非结构化数据中的隐藏价值提供了一种有希望的解决方案,即使对于非技术用户也是如此。

项目开源地址

NaLLM项目开源地址:GitHub - neo4j/NaLLM: Repository for the NaLLM project

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

泰山AI

原创不易,感谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值