【问题标题】:NLTK and Stanford Dependency Parser - How to get word position?NLTK 和 Stanford Dependency Parser - 如何获取单词位置?
【发布时间】:2018-08-06 19:32:56
【问题描述】:

我可以通过 NLTK 使用斯坦福的依赖解析器时获得单词的位置吗this SO question 所示?

这是source code供参考

~~~

示例:

当我通过 NLTK 使用斯坦福大学的 Dependency Parser 时,使用上面引用的 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 获取它?

(*) 针对特定情况:想想技术文本,其中行话首字母缩写词被简单的英文关键字替换以简化解析器的工作

【问题讨论】:

    标签: python nltk stanford-nlp


    【解决方案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() 格式略有不同,但希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2013-11-10
      • 2015-06-17
      • 1970-01-01
      相关资源
      最近更新 更多