第五章:依存关系解析 (English Resources)
压缩包ai.en.zip 包含Wikipedia文章”Artificial Intelligence“的文本。使用依存关系解析器解析该文本,并将结果存储至另一个文件中。编写程序读取含依存关系解析结果的文件,并完成下述任务。
为了便于处理,压缩包中已包含经解析器处理后的文本ai.en.txt.json
,它以JSON格式存储了经Stanford CoreNLP解析所得的依存关系树。
40. 读取解析结果(词汇)
定义Word
类(class)以表示词汇。这个类具有如下三个成员变量:
text
,存储词汇的表层形态;lemma
,存储词汇的词元;pos
,存储词汇的词性。
编写程序加载解析结果,将每个句子表示为由Word
类实例构成的列表,并将文章表示为由句子构成的列表。
完成上述处理后,输出正文的首句。
41. 读取解析结果(依存关系)
在第40问的基础之上,于Word
类增加以下三个成员变量:
head
,存储解析树中该实例的父节点;dep
,存储与父节点间依存关系的类型;children
,存储该实例在解析树中的所有子节点(列表)。
完成上述处理后,成对地输出正文首句中所有父节点与子节点。本章后续问题将沿用此处定义的Word
类。
42. 显示根节点
提取每个句子的根节点(即父节点为ROOT
的节点)。
43. 抽取名词依存于动词的关系
抽取所有以名词为子节点、以动词为父节点的依存关系,并成对地将其输出。
44. 可视化依存关系树
将句子中的依存关系以有向图(依存关系树)的形式可视化。你可以将依存关系树转化为DOT 语言、然后使用Graphviz绘制,或直接使用pydot。
45. 使用三元组表示SVO关系
考虑从文本中提取信息的任务。以三元组(subject, predicate, object)代表事实,试从依存关系树中提取这种三元组,其中:
- subject (主语)是过去式动词的名词性主语;
- predicate (谓语)是过去式动词;
- object (宾语)是动词的直接宾语。
具体地,考虑例句”Frank Rosenblatt invented the perceptron.”,我们想要从该例句中提取出符合要求的三元组(Rosenblatt, invented, perceptron)。 在本问中,只考虑主语和宾语是单个词的情况。
例句的依存关系树如下(可能因解析器而异):
为了从依存关系树中提取三元组,不妨设计一个抽取规则,例如:
\[\{ {\rm subject} \} \xleftarrow{\rm nsubj} \{ {\rm predicate\}_{\tt pos=VBD}} \xrightarrow{\rm dobj} \{ {\rm object} \}\]46. 扩展主语与宾语的单位
改进45问中的程序,使得所提取的主语与宾语不仅仅是单个词,还可以是词组。
具体地,对于例句”Frank Rosenblatt invented the perceptron”,我们想要从中提取三元组(Frank Rosenblatt, invented, perceptron)。
47. 提取被动句中的三元组
从包含被动语态的句子中提取信息。 具体地,对于例句”Artificial intelligence was founded as an academic discipline in 1955”,可从中提取出如下两个三元组:
- (Artificial intelligence, founded-as, academic discipline)
- (Artificial intelligence, founded-in, 1955)
48. 提取从根节点到名词的路径
对于依存关系树中的每个名词节点,分别提取从根节点到它们的路径。 每条路径须满足以下要求:
- 节点上的单词皆维持表层形态(即不做词形还原);
- 节点间皆以” -> “连接;
- 路径中不必包含依存关系的类型(如 nsubj, dobj)。
具体地,对于例句”Frank Rosenblatt invented the perceptron”,程序的输出应为:
invented -> Rosenblatt
invented -> Rosenblatt -> Frank
invented -> perceptron
49. 提取两个名词节点间的最短路径
提取每一对名词间的最短路径。 对于句中的第\(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