+|+ajbepva — grammaticale functie, bijwoordelijke bepaling (bepaling bij werkwoord, adjectief, …)
Oude 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
)
]
Nieuwe versie:
???
Voorstel nieuwe versie:
PQ_self_vorfeld = """
( ( ( %PQ_precedes_head_of_smain%
and
not(parent::node[%PQ_precedes_head_of_smain%])
)
or
( %PQ_precedes_head_of_whq%
and
not(parent::node[%PQ_precedes_head_of_whq%])
)
)
and
(@cat or @pt)
) """
PQ_vorfeld = """
( %PQ_self_vorfeld%
or
//node[%PQ_self_vorfeld%]/%PQ_i% = %PQ_i%
) """
Getest met //node[%PQ_vorfeld%] op Alpino Treebank.
Oude versie: 2 minuten, 7221 hits
Nieuwe versie: 76 minuten, 9514 hits
Zie nieuwe hits
Dit is de meest juiste versie. Het gebruik van ancestor-or-self is
een bug die in sommige gevallen het effect van de werkelijke bug
ongedaan maakt.
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%]
)
) """
Dit is een typisch geval waar AlpinoGraph het goed doet en Xpath niet. Met corpus Alpino Treebank:
//sentence[@sentid='cdb10'] +|+ //node[%X_nachfeld%]
Dit is de juiste oplossing.
Dit is de oplossing met XPath.
Het gaat al fout bij de hulpfunctie:
//sentence[@sentid='cdb10'] +|+ //node[%X_nachfeld_t%]
Dat geeft deze kandidaten.
Hierbij zitten vier fouten, de terminal nodes met de woorden waarin, wat, hoe, en nog een wat, met id: 16, 23, 29 en 36. (Dat dit toevallig allemaal terminal nodes zijn doet er niet toe.)
AlpinoGraph geeft dezelfde nodes, behalve deze vier.
match (vp{sentid:'cdb10'})
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.id
Het gaat fout met XPath omdat ancestor geen rekening houdt met paden
die onderbroken zijn door index-nodes. Daar lijkt geen eenvoudige
oplossing voor in XPath. Misschien wel met
quantifiers in XPath 2?