自然语言处理实战第二版(MEAP)(六)(2)

简介: 自然语言处理实战第二版(MEAP)(六)

自然语言处理实战第二版(MEAP)(六)(1)https://developer.aliyun.com/article/1519685

11.3 知识提取管道

一旦您组织好句子,就可以开始从自然语言文本中提取概念和关系。例如,想象一下,聊天机器人用户说"提醒我在星期一阅读 AI Index。"^([13]) 您希望这个声明能触发一个日历条目或在当前日期之后的下一个星期一设置一个闹钟。说起来容易做起来难。

要通过自然语言触发正确的动作,您需要类似 NLU 流水线或解析器的东西,它比变压器或大型语言模型稍微清晰一些。您需要知道"我"表示一种特定类型的命名实体:一个人。命名实体是自然语言术语或 n-gram,指的是现实世界中的特定事物,如人、地方或物品。听起来熟悉吗?在英语语法中,一个人、地方或物体的词性 (POS) 是"名词"。因此,您会发现 spaCy 与命名实体的标记所关联的标记是"NOUN"。

并且聊天机器人应该知道它可以通过替换该单词与该人的用户名或其他识别信息来扩展或解析它。您还需要让聊天机器人识别"aiindex.org"是一个缩写的 URL,它是一个命名实体-一个特定实例的名称,比如一个网站或公司的名称。您还需要知道这种特定类型的命名实体的规范化拼写可能是"aiindex.org",“aiindex.org”,甚至是"www.aiindex.org"。同样,您需要让您的聊天机器人识别星期一是一周的某一天(称为"事件"的另一种命名实体)并能够在日历上找到它。

为了使聊天机器人能够正确地回应这个简单的请求,您还需要它来提取命名实体"我"和命令"提醒"之间的关系。您甚至需要识别出句子的暗示主语"你",指的是聊天机器人,另一个命名实体。而且您还需要教聊天机器人提醒事件发生在未来,因此它应该找到最接近的下一个星期一来创建提醒。

而这仅仅是一个简单的使用案例。您可以使用自己的常识知识或者您希望您的 AI 知道的领域知识从零开始构建一个图。但是,如果您能从文本中提取知识,您可以更快地构建更大的知识图谱。此外,您还需要这个算法来验证由您的语言模型生成的任何文本。

知识提取需要四个主要步骤:

图 11.2 知识提取的四个阶段


幸运的是,spaCy 语言模型包含了知识提取的构建块:命名实体识别、指代消解和关系提取。你只需要知道如何将每个步骤的结果组合起来,将这些碎片连接在一起。让我们分别看看每个阶段,通过查看关于 AI 伦理思想领袖 Timnit Gebru 的一篇文章来继续使用我们在前一节中初始化的 spaCy nlp 模型。

让我们开始下载维基百科关于 Timnit Gebru 的文章。

>>> from nlpia2 import wikipedia as wiki
>>> page = wiki.page('Timnit Gebru')
>>> text = page.content

你之前听说过 Timnit Gebru 吗?她在你感兴趣的领域中很有名,并且撰写了几篇有影响力的论文:

>>> i1 = text.index('Stochastic')
>>> text[i1:i1+51]
'Stochastic Parrots: Can Language Models Be Too Big?'

那是一个相当有趣的研究论文标题。这肯定是她的老板们有兴趣发表的东西。但你并不想阅读整个维基百科来找到关于随机鹦鹉和 AI 伦理专家 Timnit Gebru 的有趣片段。一个信息提取管道可以自动识别有趣的命名实体(人、地点、事物,甚至是日期和时间)。如果你想支持她,你的 NLP 管道将能够识别在 X 条信息(推文)中隐藏在代词后面的提及。

11.4 实体识别

提取有关某 事物 的知识的第一步是找到你想了解的 事物。自然语言文本中最重要的东西是人名、地点和事物的名称。在语言学中,这些被称为“命名实体”。这些不仅仅是名称 - 它们可能是诸如日期、地点和任何可以放入你的知识图中的信息。

与句子一样,你可以有两种方式来处理命名实体识别(NER)的任务 - 使用模式匹配和使用神经方法。

你会发现,有些情况下,正则表达式的精度甚至比神经网络更高。以下是一些值得投入“手工制作”正则表达式的关键性定量信息:

  • GPS 位置
  • 日期
  • 价格
  • 数字

让我们在下一节学习如何提取这样的数字数据时,快速地绕个弯。

11.4.1 基于模式的实体识别:提取 GPS 位置

GPS 位置是你希望使用正则表达式从文本中提取的数值数据的典型示例。GPS 位置由纬度和经度的数值对组成。它们有时还包括第三个数字表示海拔或高度,但你暂时会忽略这个。让我们只提取用度数表示的十进制纬度/经度对。这对许多 Google 地图 URL 都适用。尽管 URL 不属于技术上的自然语言,但它们经常是非结构化文本数据的一部分,你希望提取这一部分信息,以便你的聊天机器人也能了解地点和事物。

让我们使用之前示例中的十进制数模式,但是让我们更为严格,以确保值在有效的纬度(±90 度)和经度(±180 度)范围内。您不能到达比北极更北的任何地方(+90 度),也不能到达南极比更南的任何地方(-90 度)。如果你从英国的格林威治出发东行 180 度(+180 度经度),你会到达日期变更线,那儿也是距离格林威治 180 度西经度(-180 度)。

列出了 GPS 坐标的正则表达式 11.1
>>> import re
>>> lat = r'([-]?[0-9]?[0-9][.][0-9]{2,10})'
>>> lon = r'([-]?1?[0-9]?[0-9][.][0-9]{2,10})'
>>> sep = r'[,/ ]{1,3}'
>>> re_gps = re.compile(lat + sep + lon)
>>> re_gps.findall('http://...maps/@34.0551066,-118.2496763...')
[(34.0551066, -118.2496763)]
>>> re_gps.findall("https://www.openstreetmap.org/#map=10/5.9666/116.0566")
[('5.9666', '116.0566')]
>>> re_gps.findall("Zig Zag Cafe is at 45.344, -121.9431 on my GPS.")
[('45.3440', '-121.9431')]

数字数据很容易提取,特别是如果数字是机器可读的格式的一部分。URL 和其他机器可读的字符串将纬度和经度等数字以可预测的顺序、格式和单位排列,使我们的工作更易于进行。

然而,如果我们想提取人名、国籍、地名和其他没有标准格式的内容,情况会变得更加复杂。当然,我们可以考虑所有可能的名称、位置和组织,但是维护这样的集合将是一项巨大的工作。因此,我们需要神经网络的方法。

11.4.2 使用 spaCy 进行命名实体识别。

因为命名实体识别(NER)只是一个基础任务,所以在神经网络出现之前,研究人员已经开始尝试高效地完成它。

然而,神经网络大大提高了在文本上执行 NER 的速度和准确性。请注意,识别和分类命名实体并不像您想象的那样简单。命名实体识别的一个常见挑战是 分段 ,即定义命名实体的边界(例如“纽约”是一个命名实体还是两个不同的实体?)另一个更加棘手的挑战是分类实体的类型。例如,姓名华盛顿可以用于表示人(如作家华盛顿·欧文)、地点(华盛顿特区)、组织机构(《华盛顿邮报》)甚至运动队(如在“华盛顿在上赛季赢了两场比赛”中)。

因此,您可以看到实体的 上下文 - 包括它前面和后面的单词,可能远在句子之后 - 很重要。这就是为什么使用多级 CNN 和双向转换器(如 BERT 或双向 LSTM)进行 NER 的流行方法,以及与称为条件随机场(CRF)的技术相结合,是 spaCy 在命名实体识别模块中使用的方法。

当然,您不必知道如何构建神经网络才能从文本中提取命名实体。在运行 spaCy 处理文本后创建的 doc 对象的 ‘ents’ 属性包含了所有这些命名实体的列表。

>>> doc = nlp(text)
>>> doc.ents[:6]  # #1
(Timnit Gebru, Amharic, 13, May 1983, Ethiopian, Black in AI)

命名实体识别的挑战与一个更基本的问题——词性(POS)标记密切相关。为了识别句子中的命名实体,你需要知道每个单词属于哪个词性。在英语语法中,人、地点或物体的词性(POS)是"noun"。而你的命名实体通常会是一个专有名词——一个指代现实世界中的特定人、地点或物体的名词。而与关系相关的词性标记是一个动词。动词标记将用于将命名实体连接到知识图谱中的边缘。

词性标记在我们流水线的下一个阶段——依存解析中也非常重要。为了确定句子中不同实体之间的关系,我们需要识别出动词。

幸运的是,spaCy 在你提供文本的那一刻已经为你完成了这一切。

>>> first_sentence = list(doc.sents)[0]
>>> '  '.join(['{}_{}'.format(tok, tok.pos_) for tok in first_sentence])
 'Timnit_PROPN Gebru_PROPN (_PUNCT Amharic_PROPN :_PUNCT ትምኒት_NOUN ገብሩ_ADV
 ;_PUNCT Tigrinya_PROPN :_PUNCT  _SPACE ትምኒት_NOUN ገብሩ_PROPN )_PUNCT
 born_VERB 13_NUM May_PROPN 1983_NUM is_AUX an_DET Eritrean_ADJ
 Ethiopian_PROPN -_PUNCT born_VERB computer_NOUN scientist_NOUN
 who_PRON works_VERB on_ADP algorithmic_ADJ bias_NOUN and_CCONJ
 data_NOUN mining_NOUN ._PUNCT'

你能理解这个吗?PUNCT、NOUN 和 VERB 都很容易理解;你可以猜到 PROPN 代表 Proper Noun(专有名词)。但 CCONJ 是什么意思呢?幸运的是,你可以让 spaCy 为你解释它。

>>> spacy.explain('CCONJ')
'coordinating conjunction'

spaCy 给你的另一个工具是每个标记的tag_属性。尽管pos_标记为你提供了特定标记的词性,但tag_标记为你提供了更多关于标记的信息和细节。让我们看一个例子:

>>> '  '.join(['{}_{}'.format(tok, tok.tag_) for tok in first_sentence])
'Timnit_NNP Gebru_NNP (_-LRB- Amharic_NNP :_: ትምኒት_NN ገብሩ_RB ;_:
 Tigrinya_NNP :_:  __SP ትምኒት_NN ገብሩ_NNP )_-RRB- born_VBN 13_CD
 May_NNP 1983_CD is_VBZ an_DT Eritrean_JJ Ethiopian_NNP -_HYPH
 born_VBN computer_NN scientist_NN who_WP works_VBZ on_IN
 algorithmic_JJ bias_NN and_CC data_NNS mining_NN ._.'

哇,看起来更加神秘。你可以隐约地感觉到 PROPN 和 NNP 之间的关联,但 VBZ 是什么意思呢?

>>> spacy.explain('VBZ')
'verb, 3rd person singular present'

这无疑是更多信息,尽管以更加神秘的形式呈现。

让我们把关于你的标记的所有信息都汇总在一张表中。

>>> import pandas as pd
>>> def token_dict(token):
...    return dict(TOK=token.text,
...        POS=token.pos_, TAG=token.tag_,
...        ENT_TYPE=token.ent_type_, DEP=token.dep_,
...        children=[c for c in token.children])
>>> token_dict(doc[0])
{'TOK': 'Gebru', 'POS': 'PROPN', 'TAG': 'NNP',
 'ENT_TYPE': 'PERSON', 'DEP': 'nsubjpass', 'children': []}

现在你有一个函数,可以用它来从任何句子或文本(文档)中提取你感兴趣的标签。如果你将一个字典列表强制转换成一个 DataFrame,你就能够看到标记的序列和标签并排在一起。

>>> def doc2df(doc):
...    return pd.DataFrame([token_dict(tok) for tok in doc])
>>> pd.options.display.max_colwidth=20
>>> doc2df(doc)
            TOK    POS    TAG ENT_TYPE       DEP
0        Timnit  PROPN    NNP           compound
1         Gebru  PROPN    NNP              nsubj  # #1
2             (  PUNCT  -LRB-              punct
3       Amharic  PROPN    NNP              appos
         ...    ...    ...      ...       ...
3277     Timnit  PROPN    NNP      ORG  compound  # #2
3278      Gebru  PROPN    NNP      ORG      pobj
3279         at    ADP     IN               prep
3280  Wikimedia  PROPN    NNP      FAC  compound  # #3
3281    Commons  PROPN    NNP      FAC      pobj

你对标记的’POS’和’TAG’标签已经很熟悉了。第四列’ENT_TYPE’为你提供了关于该标记所属的命名实体类型的信息。许多命名实体跨越多个标记,比如"Timnit Gebru"跨越两个标记。你可以看到小的 spaCy 模型做得不太好;它在文章开头没有正确识别出 Timnit Gebru 作为一个命名实体。而当 spaCy 最终在维基百科文章的末尾识别出它时,它将其实体类型标记为"组织"。

一个更大的 spaCy 模型应该能够在一定程度上提高你的准确性,特别是对于在训练 spaCy 时不太常见的词汇。

>>> nlp = spacy.load('en_core_web_lg')
>>> doc = nlp(text)
>>> doc2df(doc)
            TOK    POS    TAG ENT_TYPE       DEP
0        Timnit  PROPN    NNP   PERSON  compound
1         Gebru  PROPN    NNP   PERSON     nsubj
2             (  PUNCT  -LRB-              punct
3       Amharic  PROPN    NNP     NORP     appos
4             :  PUNCT      :              punct
         ...    ...    ...      ...       ...
3278     Timnit  PROPN    NNP   PERSON  compound
3279      Gebru  PROPN    NNP   PERSON      pobj
3280         at    ADP     IN               prep
3281  Wikimedia  PROPN    NNP      ORG  compound
3282    Commons  PROPN    NNP      ORG      pobj

这看起来更好!"Timnit Gebru"现在被正确分类为PERSON,"Wikimedia"被正确标记为ORG(组织)。所以通常这将是你知识提取流水线中的第一个算法,即 spaCy 语言模型,它对你的文本进行标记并给每个标记的语言特征。

一旦你了解了命名实体识别器的工作原理,你就可以扩展你想要识别的名词和名词短语的种类,并将它们包含在你的知识图中。这可以帮助泛化你的知识图,并创建一个更普遍的智能 NLP 管道。

但你还没有使用 DataFrame 中标记令牌的最后一列,即DEP(依赖关系)。DEP标记指示令牌在依赖关系树中的角色。在进行依赖关系分析和关系提取之前,你需要学习如何处理知识抽取管道的第 2 步,即指代消解。

自然语言处理实战第二版(MEAP)(六)(3)https://developer.aliyun.com/article/1519692

相关文章
|
30天前
|
机器学习/深度学习 人工智能 自然语言处理
自然语言处理实战第二版(MEAP)(六)(1)
自然语言处理实战第二版(MEAP)(六)
28 2
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
Python自然语言处理实战:文本分类与情感分析
本文探讨了自然语言处理中的文本分类和情感分析技术,阐述了基本概念、流程,并通过Python示例展示了Scikit-learn和transformers库的应用。面对多义性理解等挑战,研究者正探索跨域适应、上下文理解和多模态融合等方法。随着深度学习的发展,这些技术将持续推动人机交互的进步。
18 1
|
16天前
|
自然语言处理 监控 数据挖掘
NLP实战:Python中的情感分析
6月更文挑战第6天
31 2
|
30天前
|
自然语言处理 API 数据库
自然语言处理实战第二版(MEAP)(六)(5)
自然语言处理实战第二版(MEAP)(六)
30 3
|
30天前
|
机器学习/深度学习 自然语言处理 机器人
自然语言处理实战第二版(MEAP)(六)(4)
自然语言处理实战第二版(MEAP)(六)
25 2
|
30天前
|
机器学习/深度学习 自然语言处理 机器人
自然语言处理实战第二版(MEAP)(六)(3)
自然语言处理实战第二版(MEAP)(六)
29 1
|
13天前
|
机器学习/深度学习 自然语言处理 PyTorch
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词
【从零开始学习深度学习】48.Pytorch_NLP实战案例:如何使用预训练的词向量模型求近义词和类比词
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
探索未来AI技术的前沿——自然语言处理的发展与应用
本文将深入探讨自然语言处理技术在人工智能领域中的重要性和应用前景。通过分析当前自然语言处理技术的发展趋势和实际应用案例,揭示了其在改善用户体验、提升工作效率以及推动产业创新方面的巨大潜力。
|
17天前
|
自然语言处理 前端开发 Java
探索自然语言生成技术的进展与应用
本文将介绍自然语言生成技术在不同领域的进展和应用。从前端到后端,从Java到Python,从C到PHP,从Go到数据库,我们将深入探讨这些技术的发展趋势和应用场景,并展示它们在实际项目中的价值。
|
25天前
|
机器学习/深度学习 人工智能 自然语言处理
技术探索:人工智能在自然语言处理中的挑战与机遇
在当今数字化时代,人工智能技术的快速发展对各行各业都带来了巨大的变革与机遇。特别是在自然语言处理领域,人工智能的应用已经深入到了我们日常生活的方方面面。本文将探讨人工智能在自然语言处理中所面临的挑战,并分析其中蕴藏的机遇,以及未来发展的方向。
25 1

热门文章

最新文章