第五章:依存关系解析 (English Resources)

压缩包ai.en.zip 包含Wikipedia文章”Artificial Intelligence“的文本。使用依存关系解析器解析该文本,并将结果存储至另一个文件中。编写程序读取含依存关系解析结果的文件,并完成下述任务。

为了便于处理,压缩包中已包含经解析器处理后的文本ai.en.txt.json,它以JSON格式存储了经Stanford CoreNLP解析所得的依存关系树。

40. 读取解析结果(词汇)Permalink

定义Word类(class)以表示词汇。这个类具有如下三个成员变量:

  • text,存储词汇的表层形态;
  • lemma,存储词汇的词元;
  • pos,存储词汇的词性。

编写程序加载解析结果,将每个句子表示为由Word类实例构成的列表,并将文章表示为由句子构成的列表。 完成上述处理后,输出正文的首句。

41. 读取解析结果(依存关系)Permalink

在第40问的基础之上,于Word类增加以下三个成员变量:

  • head,存储解析树中该实例的父节点;
  • dep,存储与父节点间依存关系的类型;
  • children,存储该实例在解析树中的所有子节点(列表)。

完成上述处理后,成对地输出正文首句中所有父节点与子节点。本章后续问题将沿用此处定义的Word类。

42. 显示根节点Permalink

提取每个句子的根节点(即父节点为ROOT的节点)。

43. 抽取名词依存于动词的关系Permalink

抽取所有以名词为子节点、以动词为父节点的依存关系,并成对地将其输出。

44. 可视化依存关系树Permalink

将句子中的依存关系以有向图(依存关系树)的形式可视化。你可以将依存关系树转化为DOT 语言、然后使用Graphviz绘制,或直接使用pydot

45. 使用三元组表示SVO关系Permalink

考虑从文本中提取信息的任务。以三元组(subject, predicate, object)代表事实,试从依存关系树中提取这种三元组,其中:

  • subject (主语)是过去式动词的名词性主语;
  • predicate (谓语)是过去式动词;
  • object (宾语)是动词的直接宾语。

具体地,考虑例句”Frank Rosenblatt invented the perceptron.”,我们想要从该例句中提取出符合要求的三元组(Rosenblatt, invented, perceptron)。 在本问中,只考虑主语和宾语是单个词的情况。

例句的依存关系树如下(可能因解析器而异):

SVO

为了从依存关系树中提取三元组,不妨设计一个抽取规则,例如:

{subject}nsubj{predicate}pos=VBDdobj{object}

46. 扩展主语与宾语的单位Permalink

改进45问中的程序,使得所提取的主语与宾语不仅仅是单个词,还可以是词组。

具体地,对于例句”Frank Rosenblatt invented the perceptron”,我们想要从中提取三元组(Frank Rosenblatt, invented, perceptron)。

47. 提取被动句中的三元组Permalink

从包含被动语态的句子中提取信息。 具体地,对于例句”Artificial intelligence was founded as an academic discipline in 1955”,可从中提取出如下两个三元组:

  • (Artificial intelligence, founded-as, academic discipline)
  • (Artificial intelligence, founded-in, 1955)

48. 提取从根节点到名词的路径Permalink

对于依存关系树中的每个名词节点,分别提取从根节点到它们的路径。 每条路径须满足以下要求:

  • 节点上的单词皆维持表层形态(即不做词形还原);
  • 节点间皆以” -> “连接;
  • 路径中不必包含依存关系的类型(如 nsubj, dobj)。

具体地,对于例句”Frank Rosenblatt invented the perceptron”,程序的输出应为:

invented -> Rosenblatt
invented -> Rosenblatt -> Frank
invented -> perceptron

49. 提取两个名词节点间的最短路径Permalink

提取每一对名词间的最短路径。 对于句中的第i个词与第j个词(i<j),它们之间的最短路径必须满足以下要求:

  • 节点上的单词皆维持表层形态(即不做词形还原);
  • 与第i个单词对应的节点以X表示;
  • 与第j个单词对应的节点以Y表示;
  • 以” -> “ 或 “ <- “表示依存关系的方向。

可以考虑如下两种依存关系路径:

  • 当第j个词出现在从第i个词到根节点的路径时,第i个词到第j个词的路径即为最短路径;
  • 当第i个词与第j个词在依存关系树中有共同的祖先(记作第k个词)时,从第i个词到第k个词之间以” <- “连接,从第k个词到第j之间以” -> “连接,即为最短路径。

具体地,对于例句”Frank Rosenblatt invented the perceptron”,程序的输出应为:

X <- Y
X <- invented -> Y
X <- Rosenblatt <- invented -> Y