+|+parent:: vervangen door ancestor::, maar er mag geen ssub op het pad vanaf die ancestor zitten.
Alles getest met corpora Alpino Treebank, Lassy Klein, Eindhoven.
De query voor interne structuur, ADJ COMPL ontbreekt nog in AlpinoGraph vanwege problemen met nachfeld.
In het corpus LassyKlein krijg ik met XPath één resultaat dat ik niet krijg in AlpinoGraph, voor de query interne structuur, COMPL ADJ
Hoort deze erbij, of niet?
ajbepn — grammaticale functie, bijvoegelijke bepaling (bepaling bij zelfstandig naamwoord)
Ongewijzigd:
//node[(@cat="ap" or @pt="adj") and ((@rel="mod" and ../@cat="np") or (@rel="cnj" and ../@rel="mod" and ../../@cat="np"))]
ajbepva — grammaticale functie, bijwoordelijke bepaling (bepaling bij werkwoord, adjectief, …)
Eerste nieuwe versie, nog niet goed:
//node[
(@cat="ap" or @pt="adj")
and (
(@rel="mod" and not(../@cat="np"))
or
(@rel="cnj" and ../@rel="mod" and not(../../@cat="np"))
or
//node[
(@rel="mod" and not(../@cat="np"))
or
(@rel="cnj" and ../@rel="mod" and not(../../@cat="np"))
]/@index=@index
)
]
Tweede versie:
//node[
(@cat="ap" or @pt="adj")
and (
(@rel="mod" and not(../@cat="np"))
or
(@rel="cnj" and (../@rel="mod" or ../@index=//node[@rel="mod"]/@index) and not(../../@cat="np"))
or
//node[
(@rel="mod" and not(../@cat="np"))
or
(@rel="cnj" and (../@rel="mod" or ../@index=//node[@rel="mod"]/@index) and not(../../@cat="np"))
]/@index=@index
)
]
Deze tweede versie werkt goed met de drie geteste corpora. Maar dat
met ../../@cat="np" zou ook nog gefixt moeten worden voor het geval
het over een indexnode heen gaat.
Ongewijzigd:
ajpredm — grammaticale functie, bepaling van gesteldheid etc.
//node[(@cat="ap" or @pt="adj") and ((@rel="predm") or (@rel="cnj" and ../@rel="predm"))]
ajpredc — grammaticale functie, predicatief complement
Eerste nieuwe versie, nog niet correct:
//node[
(@cat="ap" or @pt="adj")
and
(
@rel="predc"
or
(@rel="cnj" and ../@rel="predc")
or
//node[
@rel="predc"
or
(@rel="cnj" and ../@rel="predc")
]/@index=@index
)
]
Deze twee worden niet gevonden door bovenstaande expressie.
Dit probleem doet zich ook voor met ajbepva, maar niet bij Alpino Treebank.
En met ajbepva is de situatie nog ingewikkelder omdat niet
alleen naar ../ wordt gekeken, maar ook naar ../../ .
Nieuwe zeer trage versie die wel de juiste resultaten geeft:
//node[
(@cat="ap" or @pt="adj")
and
(
@rel="predc"
or
(@rel="cnj" and (../@rel="predc" or ../@index=//node[@rel="predc"]/@index))
or
//node[
@rel="predc"
or
(@rel="cnj" and (../@rel="predc" or ../@index=//node[@rel="predc"]/@index))
]/@index=@index
)
]
Alles met corpus Alpino Treebank.
Query:
//sentence[@sentid='cdb1044'] +|+ //node[%PQ_nachfeld%]
In de boom zie je dat er zes hits zijn. Nummer die van 1 (linksboven) tot 6 (rechtsonder).
Nummer 1 is een juiste hit. Deze node voldoet aan
%PQ_follows_head_of_vp% vanwege de bovenste ppart.
Nummers 2 t/m 5 voldoen aan ook aan %PQ_follows_head_of_vp% vanwege
diezelfde ppart, maar omdat ze allemaal onder nummer 1 vallen moeten
ze uitgesloten worden.
Nummer 6 voldoet als enige aan
%PQ_follows_head_of_vp% vanwege de onderste ppart en is dus
een juiste hit.
De oplossing die we hadden bedacht — er mag geen hogere match zijn voor
nachfeld, tenzij er een ssub tussen zit — die werkt niet, want dan zou je
nog steeds nummers 2 t/m 5 krijgen.
Het probleem zit in het gebruik van %PQ_follows_head_of_vp%. Dit
moet beperkt worden tot de vp die het dichtst boven de betreffende
node ligt.
Hieronder iets dat lijkt te werken.
X_nachfeld_t = """
(
not(@cat=("inf","ppart") or @rel=("hd","svp"))
and
(
(
ancestor::node[%PQ_vp%]
except
ancestor::node[%PQ_vp%]/ancestor::node[%PQ_vp%]
)/node[@rel="hd"]/%PQ_b% < %PQ_begin_of_head%
or
(
ancestor::node[%PQ_vp%]
except
ancestor::node[%PQ_vp%]/ancestor::node[%PQ_vp%]
)/node[@rel="hd"]/%PQ_b% < %PQ_b% and not(node[%PQ_headrel%])
)
) """
X_nachfeld = """
(
%X_nachfeld_t%
and
not(
ancestor::node[%X_nachfeld_t%]
except
ancestor::node[%PQ_vp%]/ancestor::node[%X_nachfeld_t%]
)
) """
Deze query zou nu het juiste resultaat moeten geven:
//sentence[@sentid='cdb1044'] +|+ //node[%X_nachfeld%]
Maar hier krijg ik maar één resultaat, terwijl het er volgens mij drie zouden moeten zijn:
//sentence[@sentid='cdb10'] +|+ //node[%X_nachfeld%]
Een kleine aanpassing:
X_nachfeld_t = """
(
not(@cat=("inf","ppart") or @rel=("hd","svp"))
and
(
(
ancestor::node[%PQ_vp%]
except
ancestor-or-self::node[%PQ_vp%]/ancestor::node[%PQ_vp%]
)/node[@rel="hd"]/%PQ_b% < %PQ_begin_of_head%
or
(
ancestor::node[%PQ_vp%]
except
ancestor-or-self::node[%PQ_vp%]/ancestor::node[%PQ_vp%]
)/node[@rel="hd"]/%PQ_b% < %PQ_b% and not(node[%PQ_headrel%])
)
) """
X_nachfeld = """
(
%X_nachfeld_t%
and
not(
ancestor::node[%X_nachfeld_t%]
except
ancestor-or-self::node[%PQ_vp%]/ancestor::node[%X_nachfeld_t%]
)
) """
Nu krijg ik er wel drie.
Inmiddels ben ik bezig met een implementatie in AlpinoGraph. Daar krijg ik ook drie resultaten. Elk resultaat met zowel VP als nachfeld gemarkeerd:
Een eerste versie in AlpinoGraph. Dit lijkt te werken.
match ()-[r:rel]->()
where r.rel in ['hd','cmp','mwp','crd','rhd','whd','nucl','dp']
set r._head_rel = true;
select sentid, id
from (
match (vp)
where vp.cat in ['inf','ti','ssub','oti','ppart']
match (n1)<-[:rel{rel:'hd'}]-(vp)-[:rel*0..]->()-[r:rel]->(n)
where not r.rel in ['hd','svp']
and not n.cat in ['inf','ppart']
optional match (n)-[:rel{_head_rel:true}]->(n2)
with n, n1, n2, vp
where n2 is not null and n1.begin < n2.begin
or n2 is null and n1.begin < n.begin
return n.sentid as sentid, n.id as id, vp.id as vpid
except
match (vp)
where vp.cat in ['inf','ti','ssub','oti','ppart']
match (vp)-[:rel*1..]->(vp2)-[:rel*1..]->(n)
where vp2.cat in ['inf','ti','ssub','oti','ppart']
return n.sentid as sentid, n.id as id, vp.id as vpid
except
match (vp)
where vp.cat in ['inf','ti','ssub','oti','ppart']
match (n1)<-[:rel{rel:'hd'}]-(vp)-[:rel*0..]->()-[r:rel]->(n)
where not r.rel in ['hd','svp']
and not n.cat in ['inf','ppart']
optional match (n)-[:rel{_head_rel:true}]->(n2)
with n, n1, n2, vp
where n2 is not null and n1.begin < n2.begin
or n2 is null and n1.begin < n.begin
match (n)-[:rel*1..]->(nn)
return nn.sentid as sentid, nn.id as id, vp.id as vpid
) as foo
Ik krijg veel verschillen tussen XPath en AlpinoGraph. Zie hier.