如何打印依赖关系图的一部分

时间:2013-09-30 12:35:34

标签: java nlp stanford-nlp

我想打印依赖图的子树。具体针对句子“I turn the red meat”和起始词meat-NN,输出应为:“the red meat”。

现在我这样做:

protected String printSubGraph(IndexedWord startingWord, SemanticGraph graph) {
    Iterable<SemanticGraphEdge> outiter = graph.outgoingEdgeIterable(startingWord);

    // set the default bounds to the startingWord 
    int start = startingWord.beginPosition();
    int end = startingWord.endPosition();

    // search the next level for larger bounds
    // assume that everything in between the bounds belongs to the sub-graph of the startingWord
    for (SemanticGraphEdge edge : outiter) {
        start = Math.min(start, edge.getGovernor().beginPosition());
        start = Math.min(start, edge.getDependent().beginPosition());
        end = Math.max(end, edge.getGovernor().endPosition());
        end = Math.max(end, edge.getDependent().endPosition());
    }

    return graph.toRecoveredSentenceString().substring(start, end);
}

这有三个原因:

  1. 我假设令牌之间的所有内容都属于起始字的子树。
  2. 我不会在整个子树中搜索更大的边界。
  3. 我假设图形是整个文本,并且边界对RecoveredSentenceString有效。 (如果原始文本包含多个句子,则不然。)
  4. 有没有办法在没有自己实现DFS的情况下从SemanticGraph或CoreMap获取这个子树(并且只有这个子树)?我知道the other way,但我不知道在树中找到IndexedWord的任何方法。

1 个答案:

答案 0 :(得分:1)

也许您正在寻找的不是依赖解析而是短语结构解析。

你的判决是:

  

我转过红肉。

短语结构解析为:

  

(ROOT    (S      (NP(PRP I))      (VP(VBP转)        (NP(DT)(JJ红)(NN肉)))      (。))))

您可以写一个TregexPattern表格:

  

NP&LT; (NN&lt; meat)

获取所需的子树或只是

  

NP

获取所有名词短语。