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を参照してください。
(?<=\()
マッチの前に「(」を保証する後読みアサーションです。
(?=\))
一致後に ")" を保証する先読みアサーションです。
[^()]+
(1 つ以上の) 任意の文字に一致しますが、丸かっこに一致します。
この質問に関連付けられたタグに基づいてスタンフォード NLP を使用していると仮定します。
もっと簡単な方法は、Tree クラスで組み込みメソッドgetLeaves()を使用することです。
必要な正規表現は\(([^ ]+) +([^()]+)\)
\(
開き括弧、
([^ ]+)
次にスペース以外の 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
}