不确定是否有办法直接从三元组中获取此信息。但是,如果我没记错的话,您可以在依赖项上调用 deps.triples() 以获取这种三元组格式。在那个依赖对象(上面的deps)上,您还可以调用deps.get_by_address(i) 来获取指定索引处的单词。您可以尝试这些是否已连接(即您从 .get_by_address(position) 获得的任何对象以及 deps.triples() 中的每个项目)。如果是这样,您可以在从 dep 三元组到位置之前制作字典。
而 .get_by_address() 是从 1 开始的(不是从 0 开始的),因为 0 始终是根节点。
编辑:刚刚发现 .triples() 似乎只是返回一个元组列表,看起来不像你可以从中检索到的任何花哨的东西。位置信息。不过,以下内容可能会对您有所帮助(对于德语示例感到抱歉):
s = 'Ich werde nach Hause gehen .'
res = depParser.parse(s.split()) # can use a simple .split since my input is already tokenised
deps = res.__next__()
traverse(deps, 0) # 0 is always the root node
然后遍历如下:
def traverse(deps, addr):
dep = deps.get_by_address(addr)
print(dep)
for d in dep['deps']:
for addr2 in dep['deps'][d]:
traverse(deps, addr2)
这应该只是递归遍历图中的所有依赖项,并给我以下输出:
{'word': None, 'head': None, 'address': 0, 'lemma': None, 'feats': None, 'ctag': 'TOP', 'deps': defaultdict(<class 'list'>, {'root': [3]}), 'tag': 'TOP', 'rel': None}
{'word': 'nach', 'head': 0, 'address': 3, 'lemma': '_', 'rel': 'root', 'ctag': 'VBP', 'feats': '_', 'deps': defaultdict(<class 'list'>, {'dobj': [5], 'nsubj': [2]}), 'tag': 'VBP'}
{'word': 'gehen', 'head': 3, 'address': 5, 'lemma': '_', 'rel': 'dobj', 'ctag': 'NN', 'feats': '_', 'deps': defaultdict(<class 'list'>, {'amod': [4]}), 'tag': 'NN'}
{'word': 'Hause', 'head': 5, 'address': 4, 'lemma': '_', 'rel': 'amod', 'ctag': 'JJ', 'feats': '_', 'deps': defaultdict(<class 'list'>, {}), 'tag': 'JJ'}
{'word': 'werde', 'head': 3, 'address': 2, 'lemma': '_', 'rel': 'nsubj', 'ctag': 'NNP', 'feats': '_', 'deps': defaultdict(<class 'list'>, {'compound': [1]}), 'tag': 'NNP'}
{'word': 'Ich', 'head': 2, 'address': 1, 'lemma': '_', 'rel': 'compound', 'ctag': 'NNP', 'feats': '_', 'deps': defaultdict(<class 'list'>, {}), 'tag': 'NNP'}
与您使用的 .triples() 格式略有不同,但希望这会有所帮助。