ツリー検索 について TGrep-lite について XPath について
このウェブサイトでは、XPath クエリをテキスト・ボックスに直接入力して、XML 形式のデータを検索することができます。 XPath を使うには、まずは、XML 形式のデータがどのように作られているか知ることが必要です。 以下の解説を読む前に、「パターン・ブラウザー」から任意のパターンを検索、検索結果のひとつをツリー表示、表示方法を XML format に変更、そして、XML 形式のデータでどのような要素名、属性名、属性の値が使われているかを一瞥してみてください。
NPCMJ の検索には Alpino XML における次のような階層情報を、XPath クエリとして指定します。
例えば、次のクエリは:
「cat 属性が pp である node」を表します。 先頭のダブルスラッシュ(//)はこの node がツリー構造のどこにでも現れうることを表しています。 node に対する要件は角括弧([])の中に書き入れます。 この要件は通常は、属性とその値の指定の形をとります。 要件を組み合わせるには、ブール演算子 and、or、not を使います。 例えば、上のクエリは次のように and を用いることにより、「cat 属性が pp であり、かつ、文頭に現れた node」という風に拡張することができます:
要件をグループにまとめるには、括弧を使います。例えば、次のクエリは「cat 属性が pp または advp であって、かつ、文頭以外の位置に現れた node」に一致します:
要件に node の外側にあるものを指定することもできます。 次のクエリは、「cat 属性が pp であり、かつ、<cat 属性をもつが、その値は np ではない node>を子要素として持つ node」を表し、 PP の子に対して NP ではないものという制限をかけています。
シングルスラッシュ(/)を使うことで、ある node の中にある node を指定することができます。例えば、次のクエリは NP-OB1 の中に現れた N を指定しています。
XPath では、様々な軸の指定を使うことで node を選択することができます。 軸の指定はコンテクストノード(以下の図の中心)に対する様々な関係を表します:
軸には次のようなものがあります:
ancestor::
コンテクストノードの祖先すべて(親、親の親、と辿ってルートノードまで)
ancestor-or-self::
コンテクストノードとその祖先
attribute::
コンテクストノードの属性(@ と表現することもできる)
child::
コンテクストノードの子(属性は含まれない。子ノードはデフォルトの軸)
descendant::
コンテクストノードの子孫(子、子の子、と辿ってツリーの末端のリーフノードまで。descendant::*/ は .// と表現することもできる。
descendant-or-self::
コンテクストノードとその子孫
following::
コンテクストノードより後ろにあるノードすべて(コンテクストノードの子孫や属性は含まれない)
following-sibling::
コンテクストノードの兄弟ノードの中で、コンテクストのノードより後ろにあるものすべて
parent::
コンテクストノードの親ノード(parent::* は .. と表現することもできる)
preceding::
コンテクストノードより前にあるノードすべて(コンテクストノードの子孫や属性は含まれない)
preceding-sibling::
コンテクストノードの兄弟ノードの中で、コンテクストのノードより前にあるものすべて
self::
コンテクストノード自身(self::* は . と表現することもできる)
ある軸から見た node を選択するには、axis::e (e は XPath 表現)のような書式を使います。 例えば、次のクエリは埋め込み節を検索します。つまり、IP ノードであるが、ルートノード(alpino_ds)の直下にはなく、かつ、ルートノード(alpino_ds)の直下にある親(例えば、CP)を持たないようなものを検索します。
数を値としてとる属性の典型的なものは begin、end、index です。 次のクエリは、-SBJ(主語)が明示的な(ゼロでない)-OB1(目的語)の後に現れる例を検索します。 つまり、-SBJ2 ではなく -SBJ の begin 属性の値が、<その姉妹ノードであり、かつ、pt(品詞)の値が zero ではない> -OB1 の begin の値よりも大きい例を検索します。
@begin や @end の値を数値として扱うために、number 関数が使われていることに注意してください。 <、>、= といった演算子を使うためには、このようなデータ型の変換が必要です。
上記のクエリは、preceding-sibling:: という軸名を使って、次のように表現することもできます:
次のクエリは、名詞である子ノードを2つ以上持つ名詞句を検索します。子ノードを数えるために count(node[@cat='n']) が使われています:
上の例は、名詞句を検索しますが、次のクエリでは子ノードである名詞の方を検索します:
以下では、解析情報がどのように Alpino XML 形式に変換されるかについて説明します。 Alpino XML は元々は、オランダ語のツリーバンクのために開発された形式です(van Noord et al 2013)。 ツリー構造のノードは帰納的な XML の「ノード」の中に納められます。 ほかの情報は、ノードの持つ様々な属性の値として示されるようになります。例えば:
cat | ノードの統語範疇(リーフノード以外) |
pt | ノードの品詞(リーフノードのみ) |
word | 語形またはゼロ要素が値となる |
begin | 表層におけるノードの始まりの位置 |
end | 表層におけるノードの終わりの位置 |
Alpino XML 形式のデータの例を以下に示します:
この XML 形式のデータをツリーとして表示すると、次のようになります:
Alpino XML 形式の画期的な点は、ノードの線形順を属性 begin、end の値として記述することができる点にあります。 これによってツリーの線形軸にアクセスできるようになるからです。 例えば、ノード x がノード y の直後に現れるようなクエリを作るには、ノード x の begin 属性とノード y の end 属性をイコールにすればよいということになります。 また、構成素に含まれる語数を数えることも可能になります、この場合、その構成素の左端の語と右端の語の値が問題になります。
非終端ノードの cat 属性は統語タグを値としています。 ここには、ノードの持つ様々な機能情報が含まれています(例:ip-mat は主節、np-sbj は主語名詞句、pp-ob1 は目的語となる助詞句、等)。 リーフノードの pt 属性は品詞タグを値としています。
TGrep(by Richard Pito )は、ツリーの中のノードやノード間の関係をパターンとして表現するのに適したツールです。 TGrep を使って文字列や正規表現によるノードの検索を行うことができます(section 1)。 ノードの表現と、ノード間の関係の表現を組み合わせて、複雑な検索が可能になります(section 2)。 ノード間の関係として、どのようなものが指定できるのかについては、section 3 を参照してください。
TGrep-lite の文法に従った検索式を下のボックスに入力すると、 インターフェースはそれを解釈して検索を行います。 検索式が文法的に正しくても該当する例がない場合には、[Submit] ボタンを押しても何も表示されません。 検索式が文法的に正しくない場合には、“Not a valid TGrep-lite expression.” というメッセージが現れます。 検索結果ページでは [reveal] をチェックしてもう一度 [Submit] ボタンを押すと、XPath による同じ意味をもつ検索式が表示されます。 XPath の検索式を見ながら、自分の作った TGrep-lite の検索式が本当に意図したものだったかを確認することができます。
このインターフェースで使われている TGrep-lite はほかの TGrep に比べると簡素ですが、オンラインでコーパスを検索するのに適した充分な力を備えています。 ただし、その機能にはいくつかの制限があります。 ノード間の関係の制限については section 3 を参照してください。 TGrep-lite は TGrep2 や Tregex と比較すると、選言を表すことができないといった弱点がありますし、 終端ノードや終端よりひとつ前のノードの指定の仕方も違います(section 1 を参照)。
TGrep-lite は、TGrep 言語で書かれたクエリを XPath クエリに書き換えてから、XML ツリーを検索します。 XPath クエリへの書き換えの際には、3種類のノードを区別する必要があります。
ワイルドカードは(__)どのノードにも一致するため、例外的にノードの種類を考慮することなく使うことができます。 abc といった単純な文字列は、abc という文字列のみから成る終端(語)ノードにマッチします。 どのノードに対しても、区切り記号に挟まれた正規表現を使うことができますが、区切り記号がノード毎に異なることに注意してください。
文字列や区切り記号で囲まれた正規表現の前に ! を置くと、検索結果が逆になります。つまり、一致するものは一致しなくなり、一致しないものは一致するようになります。例えば、!abc は abc でないすべての語に、![^NP] はすべての品詞レベル・区レベルのノードで、NP で始まらないものに一致します。
正規表現は XPath に順じます。 正規表現として文字列を指定すると、その文字列が含まれるタグを検索します。 例えば、[PP|CP] は、PP と CP-THT 等を検索します。 キャレット(^)は語頭、ドル記号($)は語末を表します。 /^NP$/ のように、正規表現の中で ^ と$ を一緒に使うと、NP だけを検索するということになります。
オンラインのインターフェースは、品詞ノードや句レベルのノードの指定の際には大文字と小文字を区別しません (終端(語)ノードの指定では大文字・小文字を区別します)。
TGrep-lite のパターンは、ノードの後に関係の表現を置くことで作られます。 語形と見出し形の情報は、XML形式では品詞情報と同じノードに格納されるので、もしある語形(または見出し形)とある品詞の組み合わせを指定したいときは、 等号(==)を使う必要があります。 例えば、次の例は「/tuti/」と PHON という品詞タグの組み合わせを検索します:
次の例は、PP を直接の子として持ち、かつ、IP を直接・間接の子として持つ IP にマッチします。
ふたつめの << [IP] という関係は、最初の IP とのもので、PP とのものではないことに注意してください。
は、IP が PP を直接の子として持ち、その PP が IP を直接・間接の子として持つ場合にマッチします。
パターン中の最初のノード、あるいは左向き括弧に続く最初のノードは、「マスターノード」となり、右に置かれた関係の表現と関係づけられていきます。 つまり、TGrep-lite のパターンは、マスターノードに、他のノードとの関係が続いてゆくことで作られます。 また、マスターノードでないものも、括弧で囲むことによってマスターになることができます。 例えば、上の最初の例では、最初の [IP] のみがマスターノードですが、ふたつめの例では、[IP] と [PP] がそれぞれマスターノードです。
次のような方法で、マスターノードと他のノードの様々な関係を指定することができます。 順行・逆行の完全な対があるため、マスターノードの選択はかなり柔軟に行われます:
A << B A は B を支配する/A は B の先祖である A >> B A は B によって支配される/A は B の子孫である A < B A は B の直接の先祖(親)である A > B A は B の直接の子孫(子)である A .. B A は B に先行する A ,, B A は B に後行する A . B A は B の直前に置かれる A , B A は B の直後に置かれる A $ B A は B の姉妹である A $.. B A は B の姉妹であり、かつ、B に先行する A $,, B A は B の姉妹であり、かつ、B に後行する A $. B A は B の姉妹であり、かつ、B の直前に置かれる A $, B A は B の姉妹であり、かつ、B の直後に置かれる A == B A と B は同じノードである A <<, B B は A の左端の子孫である A <<- B B は A の右端の子孫である A >>, B A は B の左端の子孫である A >>- B B は A の左端の子孫である A <1 B B は A の最初の子である A >1 B A は B の最初の子である A <-1 B B は A の最後の子である A >-1 B A は B の最後の子である A <, B B は A の最初の子である (synonymous with A <1 B) A >, B A は B の最初の子である (synonymous with A >1 B) A <- B B は A の最後の子である (also synonymous with A <-1 B) A >- B A は B の最後の子である (also synonymous with A >-1 B) A <: B B は A の唯一の子である A >: B A は B の唯一の子である A <<: B 切れ目のない unary branch (length > 0) を通して、A は B を支配している A >>: B 切れ目のない unary branch (length > 0) を通して、A は B を支配されている
以下に、上記の関係のいくつかを図示します。
C << __ (C は __ の先祖である)
__ >> C (__ は C の子孫である)
E >> __ (E は __ の子孫である)
__ << E (__ は E の先祖である)
C > __ (C は __ の親である)
__ < C (__ は C の子である)
I .. __ (I は __ に先行する)
__ ,, I (__ は I に後行する)
I ,, __ (I は __ に後行する)
__ .. I (__ は I に先行する)
I . __ (I は __ の直前に置かれる)
__ , I (__ は I の直後に置かれる)
I , __ (I は __ の直後に置かれる)
__ . I (__ は I の直前に置かれる)
F $ __ (F は __ の姉妹である)
__ $ F (__ は F の姉妹である)
E $.. __ (E は __ の姉妹であり、かつ、__ に先行する)
__ $,, E (__ は E の姉妹であり、あつ、E に後行する)
E $. __ (E は __ の姉妹であり、かつ __ の直前に置かれる)
__ $, E (__ は E の姉妹であり、かつ、E の直後に置かれる)
感嘆符(!)は否定を表す。 つまり、A !.. B は、A に B が後続しない場合を表す。
TGrep-lite は、検索パターンの最も左側の要素の一致を返す。次のパターンは、IP の親である IP を親とする [PP] と一致する。
テキストボックスに TGrep-lite、XPath のいずれかを使ったクエリを入力して検索を行うことができます。
TGrep-lite を使った検索については、[TGrep-lite について] ボタンをクリックしてください。
XPath を使った検索については、[XPath について] ボタンをクリックしてください。
[Submit] ボタンをクリックすると、コーパス内の用例を検索します。