如this SO question所示,通过NLTK使用斯坦福的依存解析器时,我能否得到单词的位置?
这是source code供参考
~~~
示例:
当我通过NLTK使用斯坦福的依赖性解析器时,使用上面引用的SO帖子中的示例,我会得到一个像这样的元组列表:
[((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来获取它吗?
(*)针对特定情况:考虑用专业术语将专业术语缩写用纯英文关键字替换,以简化解析器的工作
答案 0 :(得分:1)
不确定是否有办法直接从三元组中获取该值。但是,如果我没记错的话,您可以对依赖项调用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()格式略有不同,但希望对您有所帮助。