如何使用stanford corenlp以tregex模式查找命名节点的索引?

时间:2015-07-31 10:13:35

标签: regex stanford-nlp

如何找到给定tregex模式中命名节点匹配的字符串的索引?
这是我的意思的一个例子:

text="You can eat fruits such as apples and oranges."
tree="(ROOT (S (NP (PRP You)) (VP (MD can) (VP (VB eat) (NP (NP (NNS fruits)) (PP (JJ such) (IN as) (NP (NNS apples) (CC and) (NNS oranges)))))) (. .)))"
tregex="(JJ < such) $ (IN < as) $ (NP=examples)"
examples="(NP (NNS apples) (CC and) (NNS oranges))"

我想在原始字符串examples中找到命名节点text的位置。假设我有text的HTML,我可能<span>命名节点如下:

<div id="text">You can bring fruits such as <span class="eg">apples and oranges</span>.

Update1:​​方法leftCharEdge()rightCharEdge()不起作用。似乎它们被空格数或“令牌分隔符”所取代。我看了source code,看来 CharEdge 是通过添加 leaves 的长度来计算的。

根据我的观察:

Tree eg = matcher.getNode("examples");
int start = tree.leftCharEdge(eg);
int end = tree.rightCharEdge(eg);
System.out.println("start, end:" + start + "," + end);
//start, end: 21,37

是否还应考虑空格?使用(大约)之前的空格数抵消startend似乎可以解决问题:

System.out.println("text[start,end]:" + text.substring(start+6, end+8));
//text[start,end]:apples and oranges

apples and oranges之前的字数= 6 =开始的偏移量
apples and oranges中的字数= 3 +开始的偏移量 - 1 =结束的偏移量。

1 个答案:

答案 0 :(得分:1)

如果您使用的是实际文字(与您的变量tree只是一个单独的String的示例不同),则字符偏移将嵌入CoreLabel代币中在Tree。请参阅下面的示例代码。 (我添加评论说左/右查找方法对此没有用。)

  public static void main(String[] args) {
    LexicalizedParser parser = LexicalizedParser.getParserFromFile("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz", new Options());

    String[] texts = {"You can eat fruits such as apples and oranges.",
            "  You can  eat fruits   such as apples and   oranges .",
    };

    for (String text : texts) {
      Tree tree = parser.parse(text);

      List<CoreLabel> yield = tree.yield(new ArrayList<CoreLabel>());

      for (CoreLabel cl : yield) {
        System.out.printf("Word |%s| over char offsets [%d,%d)%n", cl.word(),
                cl.get(CoreAnnotations.CharacterOffsetBeginAnnotation.class),
                cl.get(CoreAnnotations.CharacterOffsetEndAnnotation.class));
      }
      System.out.println();
    }
  }