30 november 2022

  1. SPOD
    • Adjectiefgroepen
      • PaQu
        • Resultaten ontbreken (getest met Alpino Treebank, Lassy Klein, Eindhoven)
          • grammaticale functie, bijwoordelijke bepaling (bepaling bij werkwoord, adjectief, …)
          • grammaticale functie, predicatief complement
          • rekening houden met relatie over index
            • zie beneden
        • PaQu in Docker
      • AlpinoGraph
        • Expressie met nachfeld: interne structuur, ADJ COMPL
        • Testen met:
          • Alpino Treebank
          • Lassy Klein
          • Automatisch verwerkt corpus → Eindhoven
        • AlpinoGraph in Docker
    • Tellingen bij invoer van corpus in PaQu
      • Ook voor Methode = geëxpandeerde indexnodes
      • Ook voor expressies die uit meerdere delen bestaan, gescheiden door +|+
    • Macro: nachfeld
      • PaQu
        • parent:: vervangen door ancestor::, maar er mag geen ssub op het pad vanaf die ancestor zitten.
          • zie beneden
      • AlpinoGraph
        • Definitie in Cypher
        • Implementatie als hulpattribuut
  2. Alpino
    • Programma om diverse hulpattributen aan een xml-bestand toe te voegen, zoals vorfeld, nachfeld, …
  3. Torch

Adjectiefgroepen

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?


ajbepngrammaticale 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"))]

ajbepvagrammaticale 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:

ajpredmgrammaticale functie, bepaling van gesteldheid etc.

//node[(@cat="ap" or @pt="adj") and ((@rel="predm") or (@rel="cnj" and ../@rel="predm"))]

ajpredcgrammaticale 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
          )
]

Nachfeld

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:

  1. https://urd2.let.rug.nl/~kleiweg/alpinograph/bin/tree?c=alpinotreebank&s=cdb10&i=9,15
  2. https://urd2.let.rug.nl/~kleiweg/alpinograph/bin/tree?c=alpinotreebank&s=cdb10&i=17,21
  3. https://urd2.let.rug.nl/~kleiweg/alpinograph/bin/tree?c=alpinotreebank&s=cdb10&i=30,35

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.

alpino alpinograph nachfeld paqu spod