如何理解非结构化文本数据的计算语言学和依赖树?

优采云 发布时间: 2021-08-09 21:11

  如何理解非结构化文本数据的计算语言学和依赖树?

  概述介绍

  作为一名数据科学家,在我的日常工作中,我非常依赖搜索引擎(尤其是 Google)。我的搜索结果涉及各种查询:Python代码问题、机器学习算法、自然语言处理(NLP)框架的比较等等。我一直很好奇这些搜索引擎是如何理解我的查询并提取相关结果的,好像他们知道什么一样我刚在想。我想在这里了解NLP方面是如何工作的:算法如何理解非结构化文本数据并将其转换为结构化数据并显示相关结果?让我们举个例子。我在 Google 上输入了两个不同的查询:

  

  首先,Google 快速确定了实体(世界杯)和行动(获胜)。在第二个查询中,我还没说完这句话就得到了结果!您认为 Google 如何理解这些查询背后的上下文?这是一个引人入胜的想法,我们将在本文中对其进行解释。我们将了解如何根据搜索查询生成这些有意义且相关的结果的核心思想。是的,我们甚至会深入研究 Python 代码并练习它。开始吧!

  注意:我建议你阅读这篇文章[^1] 关于数据科学中计算语言学和依赖树的介绍,以更好地理解我们将在这里学到的东西。

  信息提取

  信息提取 (IE) 在自然语言处理 (NLP) 和语言学领域至关重要。它广泛应用于问答系统、机器翻译、实体提取、事件提取、命名实体链接、引用解析和关系提取等任务。在信息抽取中,有一个重要的三元组概念。

  三元组代表实体以及它们之间的关系。例如,(Obama, Born in, Hawaii) 是一个三元组,其中“Obama”和“Hawaii”是相关实体,它们之间的关系是“born in”。

  在本文中,我们将重点介绍从给定文本中提取这些类型的三元组。

  在我们继续之前,让我们来看看信息提取的不同方法。我们大致可以将信息抽取分为两个分支,如下:

  

  在传统的信息抽取中,要抽取的关系是预先定义好的。在本文中,我们将只介绍基于规则的方法。

  在开放信息抽取中,关系不是预定义的。系统可以自由提取处理文本数据时遇到的任何关系。

  语义关系:从非结构化文本中获取结构化知识

  看下面的文本片段:

  

  你能想出什么方法从这段文字中提取有意义的信息吗?让我们试着逐句解决这个问题:

  

  在第一句中,我们有两个实体(“Food Tutorials”和“Wes Anderson”),这些实体通过术语“Directed”相关联,因此(Wes Anderson,directed,Food Tutorials)是一个三元组。同样,我们也可以从其他句子中提取关系:

  

  事实证明,我们可以根据文本的句法结构和语法获取结构化信息,如上例所示。

  不同的信息提取方法

  在上一节中,我们设法从几句话中轻松提取了三元组。然而,在现实世界中,数据量巨大,人工提取结构化信息是不可行的。因此,自动化这种信息提取变得很重要。

  有很多方法可以自动提取信息。让我们一一了解:

  使用 Python 和 spaCy 提取信息

  我们对这里的理论有了一些了解,接下来我们进入Python代码层面。我相信你想了解这个部分!

  我们将做一个小项目,从非结构化数据(在本例中为文本数据)中提取结构化信息。我们已经看到,文本中的信息以不同实体之间的关系形式存在。

  因此,在本节中,我们将尝试发现和提取与某种关系或其他关系相关的不同实体对。

  

  spaCy 基于规则的匹配

  在我们开始之前,让我们谈谈马蒂赫斯特。她是计算语言学研究员,加州大学伯克利信息学院教授。

  Marti 教授实际上对信息提取这一主题进行了广泛的研究。她最有趣的研究之一是致力于建立一组可用于从文本中提取有意义信息的文本模式。这些模式通常被称为“赫斯特模式”。

  让我们看看下面的例子:

  

  单看句子结构就可以推断出“Gelidium”是一种“红藻”。

  我们可以将这种模式形式化为“X如Y”,其中X是上位词,Y是下位词。这是“赫氏模式”中的众多模式之一。下图可以让你直观的理解这个想法:

  

  现在,我们尝试使用这些模式/规则来提取上词-下词对。我们将使用 spaCy 的基于规则的匹配器来执行此任务。

  首先,我们将导入所需的库:

  接下来,加载一个 spaCy 模型:

  我们将根据这些赫氏模式从文本中挖掘信息。

  模式:X如Y

  为了能够从上述句子中提取所需信息,了解其句法结构(如主语、宾语、修饰语和词性 (POS))非常重要。

  通过使用 spaCy,我们可以轻松探索句子中的这些语法细节:

  输出:

  查看术语“此类”和“作为”。它们跟在一个名词(“国家”)之后。在他们之后,我们有一个专有名词(“越南”)作为从属词。所以让我们使用依赖标签和词性标签来创建所需的模式:

  让我们从文本中提取模式:

  输出:

  看起来不错。但是,如果我们能得到“发展中国家”而不仅仅是“国家”,那么输出将更有意义。

  因此,我们现在还将使用以下代码捕获“例如”之前的名词修饰符:

  输出:

  这里,“发展中国家”是上位词,“越南”是下位词。两者在语义上是相关的。

  注意:上述模式中的关键“OP”:“?”表示修饰符(“amod”)可以出现一次也可以不出现。

  类似的,我们可以从其他文本中获取:

  现在,让我们使用其他一些赫斯特模式来提取更多的上下词。

  模式:X 和/或 Y

  输出:

  输出:

  让我们尝试使用相同的代码来捕获“X 或 Y”模式:

  其余代码保持不变:

  输出:

  模式:X,包括Y

  输出:

  输出:

  模式:X,尤其是 Y

  输出:

  输出:

  2.关系抽取的子树匹配

  简单的基于规则的方法非常适合信息提取任务。但是,它们也存在一些不足和不足。

  我们必须极富创造力,才能提出新规则来捕捉不同的模式。很难在不同的句子之间建立可以很好地概括的模式。

  为了增强基于规则的关系/信息提取方法,我们应该尝试了解现有句子的依存结构。我们以示例文本为例,构建其依赖图树:

  输出:

  

  你能在这句话中找到什么有趣的关系吗?如果您查看句子中的实体:Tableau 和 Salesforce,它们与术语“获得”有关。因此,我可以从这句话中提取的模式是“Salesforce 收购了 Tableau”或“X 收购了 Y”。

  现在考虑以下声明:中东的叫车专业公司 Careem 被优步收购。”

  依赖关系图如下所示:

  

  这很可怕,不是吗?不过不用担心,我们需要检查的是多个句子之间存在哪些共同的依赖路径。这种方法称为子树匹配。

  例如,如果我们将这个语句与前面的语句进行比较:

  

  

  我们将只考虑公共依赖路径,并提取实体及其关系(获得)。因此,从这些句子中提取的关系是:

  Salesforce 收购了 Tableau,Uber 收购了 Careem

  让我们尝试在 Python 中实现这项技术。我们将再次使用 spaCy,因为它很容易遍历依赖树。

  我们先看句子中单词的依存标签和词性:

  输出:

  这里“Tableau”的依赖标签是nsubjpass,代表被动主语(因为是被动句)。另一个实体“Salesforce”是句子中的宾语,术语“获得”是句子的词根,表示它以某种方式将宾语与主语联系起来。

  让我们定义一个函数来执行子树匹配:

  在这种情况下,我们只需要找到所有满足以下条件的句子:

  然后我们可以从句子中捕获主语和宾语。让我们调用上面的函数:

  输出:

  这里,主体是获取者,客体是被获取的实体。让我们使用相同的函数 subtree_matcher() 来提取由相同关系(“获得”)相关联的实体:

  输出:

  你看到这里发生了什么吗?这句话有更多的单词和标点符号,但我们的逻辑仍然有效并成功提取了相关实体。

  但是等等-如果我将句子从被动语态改为主动语态会怎样?我们的逻辑仍然有效吗?

  输出:

  这不是我们所期望的。该功能未能捕获“Salesforce”并错误地将“Tableau”返回为收购方。

  有什么问题吗?让我们了解一下这句话的依赖树:

  输出:

  事实证明,术语“Salesforce”和“Tableau”的语法功能(主语和宾语)在主动语态中互换了。但是,现在主题的依赖项标签已从“nsubjpass”更改为“nsubj”。他的标签表明句子是主动语态。

  我们可以使用这个属性来修改子树匹配函数。下面给出了子树匹配的新特性:

  让我们在主动句上试试这个新功能:

  输出:

  输出正确。让我们将之前的被动语句传递给这个函数:

  输出:

  这正是我们想要的。我们使该功能稍微更通用。希望您深入研究不同类型句子的语法结构,并尝试使此功能更加灵活。

  结论

  在本文中,我们了解了信息抽取、关系和三元组的概念以及关系抽取的不同方法。就我个人而言,我很乐意做这个主题的研究,并计划在更高级的信息提取方法上写更多文章。

  [^1]:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线