如何找到给定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
是否还应考虑空格?使用(大约)之前的空格数抵消start
和end
似乎可以解决问题:
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 =结束的偏移量。
答案 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();
}
}