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を参照してください。

(?<=\()マッチの前に「(」を保証する後読みアサーションです。

(?=\))一致後に ")" を保証する先読みアサーションです。

[^()]+(1 つ以上の) 任意の文字に一致しますが、丸かっこに一致します

于 2013-02-23T18:47:39.500 に答える
1

この質問に関連付けられたタグに基づいてスタンフォード NLP を使用していると仮定します。

もっと簡単な方法は、Tree クラスで組み込みメソッドgetLeaves()を使用することです。

于 2014-02-04T23:57:13.330 に答える
0

必要な正規表現は\(([^ ]+) +([^()]+)\)


\(開き括弧、
([^ ]+)次にスペース以外の 1 つ以上の文字 (グループ #1 と呼ぶ)、
 +1 つ以上のスペース、
([^()]+)次に角括弧以外の 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 に答える