1 信息提取
信息有很多种形状和大小。一个重要的形式是结构化数据:实体和关系的可预测的规范的结构。例如,我们可能对公司和地点之间的关系感兴趣。给定一个公司,我们希望能够确定它做业务的位置;反过来,给定位置,我们会想发现哪些公司在该位置做业务。如果我们的数据是表格形式,如1.1中的例子,那么回答这些问题就很简单了。
表 1.1:
位置数据
>>> locs = [('Omnicom', 'IN', 'New York'),
... ('DDB Needham', 'IN', 'New York'),
... ('Kaplan Thaler Group', 'IN', 'New York'),
... ('BBDO South', 'IN', 'Atlanta'),
... ('Georgia-Pacific', 'IN', 'Atlanta')]
>>> query = [e1 for (e1, rel, e2) in locs if e2=='Atlanta']
>>> print(query)
['BBDO South', 'Georgia-Pacific']
表 1.2:
在亚特兰大运营的公司
>>> def ie_preprocess(document):
... sentences = nltk.sent_tokenize(document) ![[1]](/projects/nlp-py-2e-zh/Images/f4891d12ae20c39b685951ad3cddf1aa.jpg)
... sentences = [nltk.word_tokenize(sent) for sent in sentences] ![[2]](/projects/nlp-py-2e-zh/Images/e5fb07e997b9718f18dbf677e3d6634d.jpg)
... sentences = [nltk.pos_tag(sent) for sent in sentences] ![[3]](/projects/nlp-py-2e-zh/Images/6372ba4f28e69f0b220c75a9b2f4decf.jpg)
注意
请记住我们的例子程序假设你以import nltk, re, pprint
开始交互式会话或程序。
接下来,命名实体识别中,我们分割和标注可能组成一个有趣关系的实体。通常情况下,这些将被定义为名词短语,例如 the knights who say “ni”或者适当的名称如 Monty Python。在一些任务中,同时考虑不明确的名词或名词块也是有用的,如<cite>every student</cite>或<cite>cats</cite>,这些不必要一定与确定的NP
s 和适当名称一样的方式指示实体。
最后,在提取关系时,我们搜索对文本中出现在附近的实体对之间的特殊模式,并使用这些模式建立元组记录实体之间的关系。