暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

图论 | 第四期:知识图谱(1)

数艺学苑 2020-12-01
893

不知道大家有没有这样的困惑呢?通常在想了解一个新知识的时候在网页上搜索相关知识的百科,搜到的经常都是一段文字,很难找到想了解的重点。那么如何才能更加清晰地了解相关知识呢?如何能让计算机了解文本数据并呈现给我们一个更加直观的结果呢?

今天想跟大家介绍一种强大的数据科学技术——知识图谱。一起来看看吧~

一· 背景介绍

莱昂内尔·梅西(Lionel Messi)无需介绍,即使是不喜欢足球的人,也听说过最伟大的球员之一的光彩。这是他的维基百科页面:

那里有很多信息!我们有文本,大量的超链接,甚至还有音频剪辑。在单个页面上有很多相关且可能有用的信息,将其放入用例的可能性是无限的。

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

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

我们可以!我们可以借助知识图(KG,Knowledge Graphs)来做到这一点。知识图的巨大潜力和应用使我震惊,我相信您也将如此。

在本文中,您将了解什么是知识图,为什么它们很有用,然后我们将通过在Wikipedia数据上构建自己的知识图来发现结构化信息和关系,从而深入研究代码。

二· 什么是知识图谱?

让我们解决一件事–在本文中,我们将经常看到“图形”一词。当我说图表时,我们并不是指条形图,饼图和折线图。在这里,我们谈论的是相互联系的实体,这些实体可以是人员,位置,组织,甚至是事件。
“我们可以将图定义为一组节点和边。”
看下图:

这里的节点A和节点B是两个不同的实体。这些节点由代表两个节点之间关系的边连接。现在,这是我们可以建立的最小知识图–也称为三元图。

知识图具有各种形状和大小。例如,截至2019年10月,Wikidata的知识图具有59,910,568个节点。

三· 如何在图中表示知识?

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

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

实际上很简单。只需为新实体KGB添加一个节点即可:
新关系不仅可以从知识图中的第一个节点出现,还可以从知识图中的任何节点出现,如下所示:

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

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

这就是为什么机器更适合执行此任务的原因,因为浏览甚至成百上千的文档对于他们来说都是小孩子的事。但是,还有另一个挑战–机器不懂自然语言。

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

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

“印度网球选手苏米特·纳加尔(Sumit Nagal)在最新的男单排名中从135位上升到职业生涯最好的129位,上升了6位。这位22岁的年轻人最近赢得了ATP Challenger锦标赛。他在2019年美国公开赛对阵费德勒的比赛中首次亮相大满贯。纳加尔赢得了第一盘。”

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

1.  印度网球选手苏米特·纳加尔(Sumit Nagal)在最新的男单排名中从135位上升到职业生涯最好的129位,上升了6位。
2.  这位22岁的年轻人最近赢得了ATP Challenger锦标赛
3.  他在2019年美国公开赛对阵费德勒的比赛中首次大满贯赛事
4.  纳加尔赢得了第一盘

在这四个句子中,我们选择第二个和第四个句子,因为它们每个包含1个主语和1个宾语。在第二句中,主题为“ 22岁”,主题为“ ATP挑战者锦标赛”。在第四句中,主语是“ Nagal”,“ first set”是宾语:
挑战在于使您的机器理解文本,尤其是在多词对象和主题的情况下。例如,提取以上两个句子中的对象有点棘手。您能想到解决此问题的任何方法吗?

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

但是,当一个实体跨越多个单词时,仅靠POS标签是不够的。让我们获取入围句子之一的依赖项标签。我将使用流行的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)为“旧”。那不是想要的实体。我们想提取“ 22岁”。

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

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

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

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

      # 关系提取
      实体提取是完成工作的一半。要构建知识图,我们需要边将节点(实体)彼此连接。这些边缘是一对节点之间的关系。
      让我们回到上一节中的示例。我们选择了几个句子来构建知识图:
      您能猜出这两个句子中主语和宾语之间的关系吗?

      这两个句子具有相同的关系-“获胜”。让我们看看如何提取这些关系。我们将再次使用依赖项解析:
        doc = nlp("Nagal won the first set.")


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

        输出:
          Nagal … nsubj
          won … ROOT
          the … det
          first … amod
          set … dobj
          . … punct
          要提取该关系,我们必须找到句子的根(也是句子的动词)。因此,从该句子中提取的关系将是“won”。

          最后,来自这两个句子的知识图将如下所示:

          至此,我们已经完成了构建知识图之前的准备,接下来,便根据文本数据构建知识图谱,当然,这些内容我们就留在下一期啦,下一期我们将从500多个Wikipedia文章中提取了大约4,300个句子,建立知识图,再会啦everybody。

          End

          本文作者

          指导老师


          长按二维码关注我们

          微信号 : cucbigdatalabs

          欢迎关注沈浩老师

          微信号 : artofdata

          新浪微博:沈浩老师

          原文链接:https://www.analyticsvidhya.com/blog/2019/10/how-to-build-knowledge-graph-text-using-spacy/
          文章转载自数艺学苑,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论