使用正则表达式提取短语结构树中的叶节点

时间:2013-02-23 18:10:46

标签: regex nlp stanford-nlp

我想在Java中使用正则表达式来提取句子或短语结构树中的叶节点。 例如, 给出一个句子“这是一个简单的句子。”,

我有句法信息

输入: (ROOT (S (NP (DT This)) (VP (VBZ is) (NP (DT an) (JJ easy) (NN sentence))) (. .)))

我想使用正则表达式来提取叶节点

输出:

DT This
VBZ is
DT an
JJ easy
NN sentence
.  .

3 个答案:

答案 0 :(得分:1)

如果您没有嵌套括号,则可以使用:

(?<=\()[^()]+(?=\))

here on Regexr

(?<=\()lookbehind assertion,可确保匹配前的“(”)

(?=\))lookahead assertion,确保匹配后的“)”

[^()]+negated character class,匹配(一个或多个)任何字符,但是圆括号。

答案 1 :(得分:1)

假设您根据与此问题相关的标签使用Stanford NLP:

更简单的方法是在Tree类中使用内置方法getLeaves()

答案 2 :(得分:0)

您需要的正则表达式为\(([^ ]+) +([^()]+)\)

它将:
\(匹配一个空心支架,
([^ ]+)然后是一个或多个空格而不是空格(并将其称为组#1),
 +然后是一个或多个空格,
([^()]+)然后是括号以外的一个或多个字符(并称之为组#2),
\),最后是结束括号。

要在Java中使用它,请在您的类中预编译模式:

static final Pattern leaf = Pattern.compile("\\(([^ ]+) +([^()]+)\\)");

然后在每个输入字符串上创建一个匹配器并遍历其find方法:

Matcher m = leaf.matcher(input);
while (m.find()) {
    // here do something with each leaf,
    // where m.group(1) is the node type (DT, VBZ...)
    // and m.group(2) is the word
}
相关问题