知识图谱:一种从文本中挖掘信息的强大数据科学技术

本文介绍了知识图谱的概念,以及如何利用Python的spaCy库从Wikipedia文本构建知识图谱。通过句子分割、实体和关系提取,构建了一个包含实体、关系的图谱,展示了知识图谱在数据科学中的应用。

概览

  • 知识图谱是数据科学中最有趣的概念之一
  • 了解如何使用Wikipedia页面上的文本构建知识图谱
  • 我们将动手使用Python流行的spaCy库构建我们的知识图谱

介绍

梅西(Lionel Messi)无需介绍,甚至不喜欢足球的人都听说过,最伟大的球员之一为这项运动增光添彩。这是他的维基百科页面:

那里有很多信息!我们有文本,大量的超链接,甚至还有音频剪辑。在一个页面上有很多相关且可能有用的信息。

但是,有一个小问题。这不是要馈送到我们的计算机的理想数据源。无论如何都不是当前形式。

我们能否找到一种方法使该文本数据对计算机可读?从本质上讲,我们可以将这些文本数据转换为机器可以使用的内容,也可以由我们轻松地解释吗?

我们可以!我们可以借助知识图谱(KG)来做到这一点,KG是数据科学中最引人入胜的概念之一。知识图谱的巨大潜力和应用使我震惊,并且我相信你也会如此。

在本文中,你将了解什么是知识图谱,它们为何有用,然后我们将基于从Wikipedia提取的数据构建自己的知识图谱,从而深入研究代码。

什么是知识图谱?

让我们先确定一件事情,在本文中,我们会经常看到图一词。当我说图时,我们并不是指条形图,饼图和折线图。在这里,我们谈论的是相互联系的实体,这些实体可以是人员,位置,组织,甚至是事件。

我们可以将图定义为一组节点和边。看下图:

这里的节点A和节点B是两个不同的实体。这些节点由代表两个节点之间关系的边连接。现在,这是我们可以构建的最小知识图谱–也称为三元图。知识图谱有各种形状和大小。例如,截至2019年10月,Wikidata的知识图谱具有59,910,568个节点。

如何在图中表示知识?

在开始构建知识图谱之前,了解信息或知识如何嵌入这些图非常重要。
让我用一个例子来解释一下。如果节点A = Putin ,节点B = Russia,则边缘很可能是“president of”:

节点或实体也可以具有多个关系。普京不仅是俄罗斯总统,还曾在苏联安全机构克格勃苏联安全局(KGB)工作。但是,我们如何将有关普京的新信息纳入上面的知识图谱中?

实际上非常简单。只需为新实体KGB添加一个节点即可:

新关系不仅可以从知识图谱中的第一个节点出现,还可以从知识图谱中的任何节点出现,如下所示:

俄罗斯是亚太经济合作组织(APEC)的成员。

识别实体及其之间的关系对我们来说不是一件困难的任务。但是,手动构建知识图谱是不可扩展的。没有人会浏览成千上万的文档并提取所有实体及其之间的关系!

这就是为什么机器更适合执行此任务的原因,因为浏览甚至成百上千的文档对于他们来说都是很简单的事。但是,还有另一个挑战就是机器不懂自然语言。这是自然语言处理(NLP)进入图的地方。

要从文本构建知识图谱,重要的是使我们的机器能够理解自然语言。这可以通过使用NLP技术来完成,例如句子分段,依存关系分析,词性标记和实体识别。让我们更详细地讨论这些。

句子分割

构建知识图谱的第一步是将文本文档或文章拆分为句子。然后,我们将仅列出那些恰好具有1个主语和1个宾语的句子。让我们看下面的示例文本:

“Indian tennis player Sumit Nagal moved up six places from 135 to a career-best 129 in the latest men’s singles ranking. The 22-year-old recently won the ATP Challenger tournament. He made his Grand Slam debut against Federer in the 2019 US Open. Nagal won the first set.”

让我们将以上段落拆分为句子:

  1. Indian tennis player Sumit Nagal moved up six places from 135 to a career-best 129 in the latest men’s singles ranking
  2. The 22-year-old recently won the ATP Challenger tournament
  3. He made his Grand Slam debut against Federer in the 2019 US Open
  4. Nagal won the first set

在这四个句子中,我们将选择第二个和第四个句子,因为它们每个包含1个主语和1个宾语。在第二句中,主语为“22-year-old”,宾语为“ATP Challenger tournament”。在第四句中,主语是“Nagal”,“first set”是宾语:

挑战在于使你的机器理解文本,尤其是在多词主语和宾语的情况下。例如,提取以上两个句子中的对象有点棘手。你能想到解决此问题的任何方法吗?

###实体提取
从句子中提取单个单词实体并不是一项艰巨的任务。我们可以借助词性(POS)标签轻松地做到这一点。名词和专有名词将是我们的实体。

但是,当一个实体跨越多个单词时,仅靠POS标签是不够的。我们需要解析句子的依存关系树。

你可以在以下文章中阅读有关依赖项解析的更多信息1

让我们获取所选择的一句句子的依赖项标签。我将使用流行的spaCy库执行此任务:

import spacy
nlp = spacy.load('en_core_web_sm')

doc = nlp("The 22-year-old recently won ATP Challenger tournament.")

for tok in doc:
  print(tok.text, "...", tok.dep_)

Output:

The … det
22-year … amod
– … punct
old … nsubj
recently … advmod
won … ROOT
ATP … compound
Challenger … compound
tournament … dobj
. … punct

根据依赖性分析器,此句子中的主语(nsubj)为“old”。那不是想要的实体。我们想提取“22-year-old”。

“22-year”的依赖项标签是amod,这意味着它是“old”的修饰语。因此,我们应该定义一个规则来提取这些实体。

规则可以是这样的:提取主语/宾语及其修饰符,还提取它们之间的标点符号。

但是,然后看看句子中的宾语(dobj)。这只是“tournament”,而不是“ATP Challenger tournament”。在这里,我们没有修饰词,但有复合词。

复合词是那些共同构成一个具有不同含义的新术语的词。因此,我们可以将上述规则更新为⁠-提取主语/宾语及其修饰词,复合词,并提取它们之间的标点符号。

简而言之,我们将使用依赖性解析来提取实体。

提取关系

实体提取是完成工作的一半。要构建知识图谱,我们需要边缘将节点(实体)彼此连接。这些边缘是一对节点之间的关系。

让我们回到上一节中的示例。我们选择了几个句子来构建知识图谱:

你能猜出这两个句子中主语和宾语之间的关系吗?

两个句子具有相同的关系“won”。让我们看看如何提取这些关系。我们将再次使用依赖项解析:

doc = nlp("Nagal won the first set.")

for tok in doc:
  print(tok.text, "...", tok.dep_)

Output:

Nagal … nsubj
won … ROOT
the … det
first … amod
set … dobj
. … punct

要提取该关系,我们必须找到句子的根(也是句子的动词)。因此,从该句子中提取的关系将是“won”。最后,来自这两个句子的知识图谱将如下所示:

根据文本数据构建知识图谱

是时候开始编写一些代码了!

我们将使用一组与Wikipedia文章相关的电影和电影中的文本从头开始构建知识图谱。我已经从500多个Wikipedia文章中提取了大约4,300个句子。这些句子中的每个句子都恰好包含两个实体-一个主语和一个宾语。你可以从这里2下载这些句子。

我建议对此实现使用Google Colab,以加快计算时间。

导入库
import re
import pandas as pd
import bs4
import requests
import spacy
from spacy import displacy
nlp = spacy.load('en_core_web_sm')

from spacy.matcher import Ma
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值