我想在 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
. .
我想在 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
. .
如果你没有嵌套括号,那么你可以使用这个:
(?<=\()[^()]+(?=\))
在 Regexr 上查看。
(?<=\()
是一个lookbehind assertion,它确保匹配前的“(”
(?=\))
是一个前瞻断言,它确保匹配后的“)”
[^()]+
是一个否定字符类,匹配(一个或多个)任何字符,但圆括号除外。
假设您正在使用基于与此问题相关的标签的斯坦福 NLP:
一个更简单的方法是使用 Tree 类中的内置方法getLeaves()。
您需要的正则表达式是\(([^ ]+) +([^()]+)\)
它将:
\(
匹配一个左括号,
([^ ]+)
然后是一个或多个除空格之外的字符(称为组#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
}