首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NLTK和斯坦福依赖分析器-如何获得单词位置?

NLTK和斯坦福依赖分析器-如何获得单词位置?
EN

Stack Overflow用户
提问于 2018-08-06 10:58:15
回答 1查看 493关注 0票数 2

我可以通过NLTK获得这个单词在使用斯坦福依赖分析器时的位置,如这个问题所示

这是供参考的源代码

代码语言:javascript
复制

示例:

当我通过NLTK使用斯坦福的Dependency时,使用上面引用的SO post中的示例,我得到了如下所示的元组列表:

代码语言:javascript
复制
[((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$'))]

然而,当我使用在线工具时,我也会得到一个指向单词位置的指针,请参见下面文本中的数字:

代码语言:javascript
复制
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获得它呢?

(*)对于具体情况:考虑专业术语缩略词被简单英语关键字替换的技术文本,以简化解析器的工作

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-06 11:10:50

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

编辑:刚刚发现.triples()似乎只是返回了一个元组列表,看起来并不像你可以为ex检索的任何花哨。位置信息。不过,以下内容可能会对您有所帮助(对德国的例子表示遗憾):

代码语言:javascript
复制
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

然后遍历如下:

代码语言:javascript
复制
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)

它应该递归地遍历图中的所有依赖项,并给出以下输出:

代码语言:javascript
复制
{'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()格式略有不同,但希望这会有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51706023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档