赞
踩
作为一个数据科学家,在日常工作中,我严重依赖搜索引擎(尤其是Google)。我的搜索结果涉及各种查询:Python代码问题,机器学习算法,自然语言处理(NLP)框架的比较等。我一直很好奇这些搜索引擎如何理解我的查询并提取相关结果,就像他们知道我在想什么一样。我想了解NLP方面在这里是如何工作的:该算法如何理解非结构化文本数据并将其转换为结构化数据并显示相关结果?让我们举个例子。我在Google上输入了两个不同的查询:
首先,Google迅速确定了实体(world cup)和动作(won)。在第二个查询中,在得到结果之前,我甚至还没有完成句子!你认为Google如何理解这些查询背后的上下文?这是一个令人着迷的想法,我们将在本文中对其 讲解。我们将了解根据搜索查询如何生成这些有意义且相关的结果的核心思想。是的,我们甚至将深入研究Python代码并动手实践。让我们开始吧!
注意:我建议你阅读这篇有关数据科学中的计算语言学和依赖树简介的文章1,以更好地了解我们将在此处学习的内容。
信息提取(IE)在自然语言处理(NLP)和语言学领域是至关重要的。它广泛用于诸如问答系统,机器翻译,实体提取,事件提取,命名实体链接,指代消解,关系提取等任务。在信息提取中,有一个重要的三元组概念。
三元组代表实体以及它们之间的关系。例如,(奥巴马,出生于,夏威夷)是一个三元组,其中"奥巴马"和"夏威夷"是相关实体,它们之间的关系是"出生于"。
在本文中,我们将重点介绍从给定文本中提取这些类型的三元组。
在继续之前,让我们看一下信息提取的不同方法。我们可以将信息提取大致分为两个分支,如下所示:
在传统信息提取中,要提取的关系是预先定义的。在本文中,我们将仅介绍基于规则的方法。
在开放信息提取中,关系不是预先定义的。该系统可以自由提取在处理文本数据时遇到的任何关系。
看看下面的文字片段:
你能想到从该文本中提取有意义的信息的任何方法吗?让我们尝试逐句解决此问题:
在第一句话中,我们有两个实体 (“Food Tutorials” 和 “Wes Anderson”),这些实体通过术语 "Directed"相关起来的,因此, (Wes Anderson, directed, Food Tutorials) 是一个三元组。同样,我们也可以从其他句子中提取关系:
事实证明,我们可以根据文本的句法结构和语法来获得结构化信息,如上例所示。
在上一节中,我们设法从几个句子中轻松提取出三元组。但是,在现实世界中,数据量巨大,并且人工提取结构化信息是不可行的。因此,自动化此信息提取变得很重要。
有多种方法可以自动执行信息提取。让我们一一理解它们:
我们在这里对理论有所了解,因此让我们进入Python代码层面。我敢肯定,你很想了解本节内容!
我们将做一个小项目,从非结构化数据(在本例中为文本数据)中提取结构化信息。我们已经看到,文本中的信息以不同实体之间的关系形式存在。
因此,在本节中,我们将尝试发现和提取与某种关系或另一种关联的不同实体对。
在开始之前,让我们谈谈Marti Hearst。她是计算语言学研究员,也是加州大学伯克利信息学院的教授。
Marti教授实际上已经对信息提取主题进行了广泛的研究。她最有趣的研究之一是致力于建立一组文本模式,这些模式可用于从文本中提取有意义的信息。这些模式俗称“Hearst Patterns”。
让我们看下面的例子:
仅通过查看句子的结构,我们就可以推断出"Gelidium"是"red algae"的一种。
我们可以将此模式形式化为"X such as Y",其中X是上位词,Y是下位词。这是"Hearst Patterns"中的许多模式之一。下图可让你直观了解该想法:
现在,我们尝试使用这些模式/规则来提取上位词-下为词对。我们将使用spaCy的基于规则的匹配器来执行此任务。
首先,我们将导入所需的库:
import re
import string
import nltk
import spacy
import pandas as pd
import numpy as np
import math
from tqdm import tqdm
from spacy.matcher import Matcher
from spacy.tokens import Span
from spacy import displacy
pd.set_option('display.max_colwidth', 200)
接下来,加载一个spaCy模型:
# 加载spaCy模型
nlp = spacy.load("en_core_web_sm")
我们将根据这些Hearst Patterns从文本中挖掘信息。
# 示例文本
text = "GDP in developing countries such as Vietnam will continue growing at a high rate."
# 创建spaCy对象
doc = nlp(text)
为了能够从上面的句子中提取所需的信息,理解其句法结构(例如主语,宾语,修饰语和词性(POS))非常重要。
通过使用spaCy,我们可以轻松地探索句子中的这些语法细节:
# 打印标记,依赖和词性标记
for tok in doc:
print(tok.text, "-->",tok.dep_,"-->", tok.pos_)
output:
GDP --> nsubj --> NOUN
in --> prep --> ADP
developing --> amod --> VERB
countries --> pobj --> NOUN
such --> amod --> ADJ
as --> prep --> ADP
Vietnam --> pobj --> PROPN
will --> aux --> VERB
continue --> ROOT --> VERB
growing --> xcomp --> VERB
at --> prep --> ADP
a --> det --> DET
high --> amod --> ADJ
rate --> pobj --> NOUN
. --> punct --> PUNCT
看看术语"such"和"as"。它们跟在一个名词(“countries”)后。在它们之后,我们有一个专有名词(“Vietnam”)充当下位词。因此,让我们使用依赖项标签和词性标签创建所需的模式:
# 定义模式
pattern = [{
'POS':'NOUN'},
{
'LOWER': 'such'},
{
'LOWER': 'as'},
{
'POS': 'PROPN'} # 专有名词]
让我们从文本中提取模式:
# Matcher类对象
matcher = Matcher(nlp.vocab)
matcher.add("matching_1"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。