Python NLTK和Stanford依赖项解析器-如何获取单词位置?

Python NLTK和Stanford依赖项解析器-如何获取单词位置?,python,nltk,stanford-nlp,Python,Nltk,Stanford Nlp,当通过NLTK使用斯坦福大学的依赖项解析器时,我是否可以获得单词的位置,如中所示 这是供参考的最新版本 ~~~ 示例: 当我通过NLTK使用Stanford的依赖项解析器时,使用上面提到的SO post中的示例,我得到一个元组列表,如下所示: [((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')), ((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')), ((u'elephant', u'NN'), u'det

当通过NLTK使用斯坦福大学的依赖项解析器时,我是否可以获得单词的位置,如中所示

这是供参考的最新版本

~~~

示例:

当我通过NLTK使用Stanford的依赖项解析器时,使用上面提到的SO post中的示例,我得到一个元组列表,如下所示:

[((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
((u'elephant', u'NN'), u'det', (u'an', u'DT')),
((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))]
然而,当我使用在线工具时,我也会得到一个指向单词位置的指针,请参见以下文本中的数字:

nsubj(shot-2, I-1)
det(elephant-4, an-3)
dobj(shot-2, elephant-4)
prep(shot-2, in-5)
poss(sleep-7, my-6)
pobj(in-5, sleep-7)
在某些特定情况下,关于单词位置的信息是非常重要的*,因此仍然可以通过NLTK获得它吗


(*)对于特定情况:考虑技术文本,其中术语首字母缩略词被替换为简单的英语关键字,以简化解析器的工作

不确定是否有办法直接从三元组中获取。但是,如果我没记错的话,您可以调用依赖项上的
deps.triples()
,以获得这种三元组格式的依赖项。在该dependencies对象(上面的deps)上,您还可以调用
deps.get\u by\u address(i)
,以获取指定索引处的单词。如果这些是连接的,您可以尝试(即从.get_by_address(position)和deps.triples()中的每个项中获取的任何对象)。如果是这样,您可以在从dep triple到位置之前制作一本字典。 And.get_by_address()是基于1的(不是基于0的),因为0始终是根节点

编辑:刚刚发现.triples()似乎只是返回一个元组列表,看起来不像是任何可以从中检索ex.position信息的奇特的东西。以下内容可能会对您有所帮助(很抱歉,德国的例子):

然后遍历如下所示:

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'}
{'word':None,'head':None,'address':0,'lemma':None,'feats':None,'ctag':'TOP','deps':defaultdict(,{'root':[3]}),'tag':'TOP','rel':None}
{'word':'nach','head':0,'address':3,'引理':'u','rel':'root','ctag':'VBP','feats':'u','deps':defaultdict(,{'dobj':[5],'nsubj':[2]}),'tag:'VBP}
{'word':'gehen','head':3,'address':5,'引理':'u','rel':'dobj','ctag':'NN','feats':'u','deps':defaultdict(,{'amod':[4]}),'tag':'NN}
{'word':'Hause','head':5,'address':4,'lemma':'u','rel':'amod','ctag':'JJ','feats':'u','deps':defaultdict(,{}),'tag':'JJ}
{'word':'werde','head':3,'address':2,'引理':'u','rel':'nsubj','ctag':'NNP','feats':'u','deps':defaultdict(,{'component':[1]}),'tag':'NNP}
{'word':'Ich','head':2,'address':1,'lemma':'uu','rel':'component','ctag':'NNP','feats':'uu','deps':defaultdict(,{}),'tag':'NNP}
与您正在使用的.triples()格式略有不同,但希望这能有所帮助

{'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'}