1

我想在 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
.  .
4

3 回答 3

1

如果你没有嵌套括号,那么你可以使用这个:

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

在 Regexr 上查看。

(?<=\()是一个lookbehind assertion,它确保匹配前的“(”

(?=\))是一个前瞻断言,它确保匹配后的“)”

[^()]+是一个否定字符类,匹配(一个或多个)任何字符,但圆括号除外。

于 2013-02-23T18:47:39.500 回答
1

假设您正在使用基于与此问题相关的标签的斯坦福 NLP:

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

于 2014-02-04T23:57:13.330 回答
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
}
于 2013-02-23T18:50:49.463 回答