udapi / udapi-python

Python framework for processing Universal Dependencies data
GNU General Public License v3.0
57 stars 31 forks source link

Corefud.MergeSameSpan may give rise to orphaned Bridge or SplitAnte #102

Closed dan-zeman closed 2 years ago

dan-zeman commented 2 years ago

When we remove a mention that is a singleton, the given cluster/entity id will disappear from the output file. This is a problem if the entity is the target of a bridging relation, or it is a part of a split antecedent of another entity. What is the proper way of finding all such relations and either removing them, or redirecting them to another cluster?

Example: cat in.conllu | udapy -s read.OldCorefUD corefud.MergeSameSpan > out.conllu

# sent_id = ln95045-097-p2s3
# text = Zaujala je zejména kosmetika k denní péči o pleť dětí i dospělých, která byla vyrobena výhradně z přírodních materiálů, a podobně vyráběné čisticí a prací prostředky, které nedráždí citlivou pleť alergiků.
# orig_file_sentence ln95045_097#5
1   Zaujala zaujmout    VERB    VpQW----R-AAP-- Aspect=Perf|Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act    0   root    0:root  LGloss=(upoutat_pozornost)
2   je  on  PRON    PEXP4--3------- Case=Acc|Number=Plur|Person=3|PrepCase=Npr|PronType=Prs 1   obj 1:obj   LId=on-1|ClusterId=ln95045097c7|MentionMisc=gstype:spec|MentionSpan=2|MentionText=je
3   zejména zejména PART    TT------------- _   4   advmod:emph 4:advmod:emph   LId=zejména-2
4   kosmetika   kosmetika   NOUN    NNFS1-----A---- Case=Nom|Gender=Fem|Number=Sing|Polarity=Pos    1   nsubj   1:nsubj LGloss=(věda)|ClusterId=ln95045097c10|MentionSpan=4-34|MentionText=kosmetika k denní péči o pleť dětí i dospělých, která byla vyrobena výhradně z přírodních materiálů, a podobně vyráběné čisticí a prací prostředky, které nedráždí citlivou pleť alergiků
5   k   k   ADP RR--3---------- AdpType=Prep|Case=Dat   7   case    7:case  LId=k-1
6   denní   denní   ADJ AAFS3----1A---- Case=Dat|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos 7   amod    7:amod  _
7   péči    péče    NOUN    NNFS3-----A---- Case=Dat|Gender=Fem|Number=Sing|Polarity=Pos    4   nmod    4:nmod:k:dat    _
8   o   o   ADP RR--4---------- AdpType=Prep|Case=Acc   9   case    9:case  LId=o-1
9   pleť    pleť    NOUN    NNFS4-----A---- Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos    7   nmod    7:nmod:o:acc    _
10  dětí    dítě    NOUN    NNFP2-----A---- Case=Gen|Gender=Fem|Number=Plur|Polarity=Pos    9   nmod    9:nmod:gen  LId=dítě-2
11  i   i   CCONJ   J^------------- _   12  cc  12:cc   LId=i-1
12  dospělých   dospělý NOUN    NNMP2-----A---- Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos  10  conj    9:nmod:gen|10:conj  SpaceAfter=No|LId=dospělý-2
13  ,   ,   PUNCT   Z:------------- _   16  punct   16:punct    _
14  která   který   DET P4FS1---------- Case=Nom|Gender=Fem|Number=Sing|PronType=Int,Rel    16  nsubj:pass  16:nsubj:pass   ClusterId=ln95045097c10|MentionSpan=14|MentionText=která
15  byla    být AUX VpQW----R-AAI-- Aspect=Imp|Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Tense=Past|VerbForm=Part|Voice=Act 16  aux:pass    16:aux:pass _
16  vyrobena    vyrobený    ADJ VsQW----X-APP-- Aspect=Perf|Gender=Fem,Neut|Number=Plur,Sing|Polarity=Pos|Variant=Short|VerbForm=Part|Voice=Pass    4   amod    4:amod  LDeriv=vyrobit
17  výhradně    výhradně    ADV Dg-------1A---- Degree=Pos|Polarity=Pos 16  advmod  16:advmod   LDeriv=výhradný
18  z   z   ADP RR--2---------- AdpType=Prep|Case=Gen   20  case    20:case LId=z-1
19  přírodních  přírodní    ADJ AAIP2----1A---- Animacy=Inan|Case=Gen|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos   20  amod    20:amod _
20  materiálů   materiál    NOUN    NNIP2-----A---- Animacy=Inan|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos  16  obl:arg 16:obl:arg:z:gen    SpaceAfter=No
21  ,   ,   PUNCT   Z:------------- _   16  punct   16:punct    _
22  a   a   CCONJ   J^------------- _   28  cc  28:cc   LId=a-1|ClusterId=ln95045097c13|MentionSpan=4-34|MentionText=kosmetika k denní péči o pleť dětí i dospělých, která byla vyrobena výhradně z přírodních materiálů, a podobně vyráběné čisticí a prací prostředky, které nedráždí citlivou pleť alergiků
23  podobně podobně ADV Dg-------1A---- Degree=Pos|Polarity=Pos 24  advmod  24:advmod   LDeriv=podobný
24  vyráběné    vyráběný    ADJ AAIP1----1A---- Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos   28  amod    28:amod LDeriv=vyrábět
25  čisticí čisticí ADJ AAIP1----1A---- Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos   28  amod    28:amod _
26  a   a   CCONJ   J^------------- _   27  cc  27:cc   LId=a-1|ClusterId=ln95045097c11|MentionSpan=23-34|MentionText=podobně vyráběné čisticí a prací prostředky, které nedráždí citlivou pleť alergiků
27  prací   prací   ADJ AAIP1----1A---- Animacy=Inan|Case=Nom|Degree=Pos|Gender=Masc|Number=Plur|Polarity=Pos   25  conj    25:conj|28:amod _
28  prostředky  prostředek  NOUN    NNIP1-----A---- Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos  4   conj    1:nsubj|4:conj|31:nsubj SpaceAfter=No|LGloss=(střed,způsob,_nástroj)
29  ,   ,   PUNCT   Z:------------- _   31  punct   31:punct    _
30  které   který   DET P4IP1---------- Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Int,Rel  31  nsubj   28:ref  ClusterId=ln95045097c11|MentionSpan=30|MentionText=které
31  nedráždí    dráždit VERB    VB-P---3P-NAI-- Aspect=Imp|Mood=Ind|Number=Plur|Person=3|Polarity=Neg|Tense=Pres|VerbForm=Fin|Voice=Act 28  acl:relcl   28:acl:relcl    _
32  citlivou    citlivý ADJ AAFS4----1A---- Case=Acc|Degree=Pos|Gender=Fem|Number=Sing|Polarity=Pos 33  amod    33:amod _
33  pleť    pleť    NOUN    NNFS4-----A---- Case=Acc|Gender=Fem|Number=Sing|Polarity=Pos    31  obj 31:obj  _
34  alergiků    alergik NOUN    NNMP2-----A---- Animacy=Anim|Case=Gen|Gender=Masc|Number=Plur|Polarity=Pos  33  nmod    33:nmod:gen SpaceAfter=No|ClusterId=ln95045097c2|MentionMisc=gstype:gen|MentionSpan=34|MentionText=alergiků
35  .   .   PUNCT   Z:------------- _   1   punct   1:punct _

# sent_id = ln95045-097-p2s4
# text = Některé takové výrobky jsou k dostání v lékárnách.
# orig_file_sentence ln95045_097#6
1   Některé některý DET PZIP1---------- Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Ind  3   det 3:det   _
2   takové  takový  DET PDIP1---------- Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|PronType=Dem  3   det 3:det   _
3   výrobky výrobek NOUN    NNIP1-----A---- Animacy=Inan|Case=Nom|Gender=Masc|Number=Plur|Polarity=Pos  4   nsubj   4:nsubj ClusterId=ln95045097c12|Bridging=ln95045097c13:anaf|MentionSpan=1-3|MentionText=Některé takové výrobky
4   jsou    být VERB    VB-P---3P-AAI-- Aspect=Imp|Mood=Ind|Number=Plur|Person=3|Polarity=Pos|Tense=Pres|VerbForm=Fin|Voice=Act 0   root    0:root  _
5   k   k   ADP RR--3---------- AdpType=Prep|Case=Dat   6   case    6:case  LId=k-1
6   dostání dostání NOUN    NNNS3-----A---- Case=Dat|Gender=Neut|Number=Sing|Polarity=Pos   4   obl 4:obl:k:dat LDeriv=dostat
7   v   v   ADP RR--6---------- AdpType=Prep|Case=Loc   8   case    8:case  LId=v-1
8   lékárnách   lékárna NOUN    NNFP6-----A---- Case=Loc|Gender=Fem|Number=Plur|Polarity=Pos    4   obl 4:obl:v:loc SpaceAfter=No
9   .   .   PUNCT   Z:------------- _   4   punct   4:punct _

In the first sentence, nodes 4 and 22 both define a mention with the span 4-34, but node 4 says it is cluster c10, while node 22 says it is c13. (The ultimate cause is a missing is_member() in the second conjunct in the original t-tree. The second conjunct is then considered a shared modifier of the coordination, hence it is included in the span of the first conjunct.)

The block corefud.MergeSameSpan sees that the two mentions have identical spans and decides to remove the mention belonging to c13. Unfortunately, c13 is a singleton whose only reason for existence is that it is the target of a bridging relation from the next sentence. If we remove the mention without taking care of bridging, Udapi will crash when we try to write the file:

2022-02-15 22:01:46,335 [   INFO] execute -  ---- ROUND ----
2022-02-15 22:01:46,335 [   INFO] execute - Executing block read.OldCorefUD
2022-02-15 22:01:46,340 [   INFO] execute - Executing block corefud.MergeSameSpan
2022-02-15 22:01:46,341 [WARNING] process_tree - Merging same-span mentions that belong to different entities: 'ln95045097c10' vs. 'ln95045097c13'.
2022-02-15 22:01:46,341 [   INFO] execute - Executing block write.Conllu
Traceback (most recent call last):
  File "/home/zeman/nastroje/udapi-python/bin/udapy", line 114, in <module>
    runner.execute()
  File "/home/zeman/nastroje/udapi-python/udapi/core/run.py", line 159, in execute
    block.apply_on_document(document)
  File "/home/zeman/nastroje/udapi-python/udapi/core/block.py", line 51, in apply_on_document
    self.before_process_document(document)
  File "/home/zeman/nastroje/udapi-python/udapi/block/write/conllu.py", line 148, in before_process_document
    super().before_process_document(document)
  File "/home/zeman/nastroje/udapi-python/udapi/core/basewriter.py", line 49, in before_process_document
    udapi.core.coref.store_coref_to_misc(document)
  File "/home/zeman/nastroje/udapi-python/udapi/core/coref.py", line 835, in store_coref_to_misc
    str_bridge = str(mention._bridging)
  File "/home/zeman/nastroje/udapi-python/udapi/core/coref.py", line 456, in __str__
    return ','.join(f'{l.target.eid_or_grp}<{self.src_mention.cluster.eid_or_grp}{":" + l.relation if l.relation not in (None, "_", "") else ""}' for l in sorted(self._data))
  File "/home/zeman/nastroje/udapi-python/udapi/core/coref.py", line 456, in <genexpr>
    return ','.join(f'{l.target.eid_or_grp}<{self.src_mention.cluster.eid_or_grp}{":" + l.relation if l.relation not in (None, "_", "") else ""}' for l in sorted(self._data))
  File "/home/zeman/nastroje/udapi-python/udapi/core/coref.py", line 291, in eid_or_grp
    root = self._mentions[0].head.root
IndexError: list index out of range