1 信息提取

信息有很多种形状和大小。一个重要的形式是结构化数据:实体和关系的可预测的规范的结构。例如,我们可能对公司和地点之间的关系感兴趣。给定一个公司,我们希望能够确定它做业务的位置;反过来,给定位置,我们会想发现哪些公司在该位置做业务。如果我们的数据是表格形式,如1.1中的例子,那么回答这些问题就很简单了。

表 1.1:

位置数据

  1. >>> locs = [('Omnicom', 'IN', 'New York'),
  2. ... ('DDB Needham', 'IN', 'New York'),
  3. ... ('Kaplan Thaler Group', 'IN', 'New York'),
  4. ... ('BBDO South', 'IN', 'Atlanta'),
  5. ... ('Georgia-Pacific', 'IN', 'Atlanta')]
  6. >>> query = [e1 for (e1, rel, e2) in locs if e2=='Atlanta']
  7. >>> print(query)
  8. ['BBDO South', 'Georgia-Pacific']

表 1.2:

在亚特兰大运营的公司

  1. >>> def ie_preprocess(document):
  2. ... sentences = nltk.sent_tokenize(document) ![[1]](/projects/nlp-py-2e-zh/Images/f4891d12ae20c39b685951ad3cddf1aa.jpg)
  3. ... sentences = [nltk.word_tokenize(sent) for sent in sentences] ![[2]](/projects/nlp-py-2e-zh/Images/e5fb07e997b9718f18dbf677e3d6634d.jpg)
  4. ... 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>,这些不必要一定与确定的NPs 和适当名称一样的方式指示实体。

最后,在提取关系时,我们搜索对文本中出现在附近的实体对之间的特殊模式,并使用这些模式建立元组记录实体之间的关系。