我想在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
. .
答案 0 :(得分:1)
如果您没有嵌套括号,则可以使用:
(?<=\()[^()]+(?=\))
(?<=\()
是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
}