赞
踩
1. 我们如何能构建一个系统,从非结构化文本中提取结构化数据?
2. 有哪些稳健的方法识别一个文本中描述的实体和关系?
3. 哪些语料库适合这项工作,我们如何使用它们来训练和评估我们的模型?
7.1 信息提取
#一个重要的形式是结构化数据:实体和关系的可预 测的规范的结构。
#如果这个位置数据被作为一个元组(entity, relation, entity)的链表存储在 Python 中,那么 这个问题:“哪些组织在亚特兰大经营?”可翻译如下:
locs = [('Omnicom', 'IN', 'New York'),
('DDB Needham', 'IN', 'New York'),
('Kaplan Thaler Group', 'IN', 'New York'),
('BBDO South', 'IN', 'Atlanta'),
('Georgia-Pacific', 'IN', 'Atlanta')]
print([e1 for (e1, rel, e2) in locs if e2=='Atlanta'])
#建立一个非常通用的意义重现
#首先将自然语言句子这样 的非结构化数据转换成表 7-1 的结构化数据。
#然后,利用强大的查询工具,如 SQL。这种从文本获取意义的方法被称为信息提取。
#信息提取有许多应用,包括商业智能、简历收获、媒体分析、情感检测、专利检索、电子邮件扫描。
#当前研究的一个特别重要的领域是提取出电子科学文献的结构化数据,特别是 在生物学和医学领域。
信息提取结构
#首先,使用句子分割器将该文档的原始文本分割成句,使用分词器将每个句子进一步细分为词。
#接下来,对每个句子进行词性标注,在下一步命名实体识别 中将证 明这是非常有益的。
#在这一步,我们寻找每个句子中提到的潜在的有趣的实体。
#最后,我们 使用关系识别搜索文本中不同实体间的可能关系。
#要执行前面三项任务,我们可以定义一个函数,简单地连接 NLTK 中默认的句子分割器,分词器和词性标注器
import nltk
import re
import pprint
def ie_preprocess(document):
sentences = nltk.sent_tokenize(document)#分句
sentences = [nltk.word_tokenize(sent) for sent in sentences]#分词
sentences = [nltk.pos_tag(sent) for sent in sentences]#词性标注
#接下来,命名实体识别中,我们分割和标注可能组成一个有趣关系的实体
#最后,在提取关系时,我们搜索对文本中出现在附近的实体对之间的特殊模式,并使用 这些模式建立元组记录实体之间的关系。
7.2 分块
#将用于实体识别的基本技术是分块(chunking)
名词短语分块
#NP-分块(NP-chunking)
#NP-块被定义为不 包含其他的 NP-块
#个名词的任何介词短语或从句将不包括在相应的 NP-块内, 因为它们几乎可以肯定包含更多的名词短语。
#NP-分块信息最有用的来源之一是词性标记。这是在我们的信息提取系统中进行词性标 注的动机之一。
#为了创建一个 NP-块,我们将首先定义一个块语法,规则句子应如何分块。
#在本例中,我们将用一个正则 表达式规则定义一个简单的语法。
#这条规则是说一个 NP-块由一个可选的限定词(DT) 后面跟着任何数目的形容词(JJ)然后是一个名词(NN)组成。
#使用此语法,我们创建了 一个块分析器,测试我们的例句4。结果是一棵树,我们可以输出5或图形显示6。
sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"), ("dog", "NN"),
("barked", "VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]
grammer = "NP: {?*}"
cp = nltk.RegexpParser(grammer)
result = cp.parse(sentence)
print(result)
result.draw()
标记模式
#组成一个块语法的规则使用标记模式来描述已标注的词的序列。
#一个标记模式是一个用 尖括号分隔的词性标记序列,如?*。
#标记模式类似于正则表达式模式
sentence =[("another", "DT"), ("sharp", "JJ"), ("dive", "NN"),
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。