def main(sentenceId, jsonFile, tokens, ww, wTags, depParse, inAMR, alignment, completed): amr = inAMR cop_preds = set() for deps in depParse: if deps is None: continue for dep in deps: i, r, h = dep["dep_idx"], dep["rel"], dep["gov_idx"] if completed[1][(h,i)]: continue if r=='cop': cop_preds.add(h) completed[1][(h,i)] = True for deps in depParse: if deps is None: continue for dep in deps: i, r, h = dep["dep_idx"], dep["rel"], dep["gov_idx"] if (h in cop_preds and r.endswith('subj')) or r=='appos': x = amrget(amr, alignment, h, depParse, wTags, completed) y = amrget(amr, alignment, i, depParse, wTags, completed) # asserting non-completion here might be bad if r=='appos': completed[1][(h,i)] = True if '-FALLBACK' in amr.get_concept(str(x)) and '-FALLBACK' not in amr.get_concept(str(y)): x, y = y, x if x!=y: newtriple = (str(x), '-COREF' if r=='appos' else 'domain', str(y)) amr = new_amr_from_old(amr, new_triples=[newtriple]) return depParse, amr, alignment, completed
def main(sentenceId, jsonFile, tokens, ww, wTags, depParse, inAMR, alignment, completed): amr = inAMR for deps in depParse: if deps is None: continue for dep in deps: i, r, h = dep["dep_idx"], dep["rel"], dep["gov_idx"] if completed[1][(h,i)]: continue if r in ['nn','poss'] or r.startswith('prep_'): x = amrget(amr, alignment, h, depParse, wTags, completed) y = amrget(amr, alignment, i, depParse, wTags, completed) # modifier variable if r=='nn': # attach as :mod-NN newtriple = (str(x), 'mod-NN', str(y)) elif r=='poss': newtriple = (str(x), 'poss', str(y)) else: # attach with :prep-X relation assert r.startswith('prep_') newtriple = (str(x), r.replace('_','-'), str(y)) amr = new_amr_from_old(amr, new_triples=[newtriple]) completed[1][(h,i)] = True ''' # simplify adverbs to adjectives based on lexicon for v in amr.node_to_concepts.keys(): amr.node_to_concepts[v] = simplify_adv(amr.node_to_concepts[v]) ''' return depParse, amr, alignment, completed
def main(sentenceId, jsonFile, tokens, ww, wTags, depParse, inAMR, alignment, completed): amr = inAMR nConjOps = {} # maps conjunction concept variable to its current number of :opX relations for deps in depParse: if deps is None: continue for dep in deps: if completed[1][(dep["gov_idx"],dep["dep_idx"])]: continue i, r, c = dep['dep_idx'], dep["rel"], dep["gov_idx"] if r=='conj': x = amrget(amr, alignment, c, depParse, wTags, completed) y = amrget(amr, alignment, i, depParse, wTags, completed) newtriple = (str(x), 'op'+str(nConjOps.setdefault(x,0)+1), str(y)) nConjOps[x] += 1 amr = new_amr_from_old(amr, new_triples=[newtriple]) completed[1][(c,i)] = True return depParse, amr, alignment, completed
def main(sentenceId, jsonFile, tokens, ww, wTags, depParse, inAMR, alignment, completed): amr = inAMR triples = set() # to add to the AMR props = pipeline.loadNProp(jsonFile) predheads = {} # map head index to nominal predicate variable (not reflected in the alignment) # add all predicates first, so the roleset properly goes into the AMR for prop in props: baseform, roleset = prop["baseform"], prop["frame"] if not config.fullNombank and not verbalize.nompred2verbpred(roleset): continue # TODO: maybe add just the pred stem & non-core args that map to AMR role names? preds = {tuple(arg) for arg in prop["args"] if arg[0]=='rel'} assert len(preds)==1 pred = next(iter(preds)) assert pred[2]==pred[3] # multiword predicates? ph = pred[2] # predicate head #px = alignment[:ph] # instead of aligning noun predicate to noun in the sentence, introduce the noun predicate separately (so the plain noun concept can be its argument) px = predheads.get(ph) predconcept = pipeline.token2concept(roleset.replace('.','-n-')) if not (px or px==0): px = new_concept(predconcept, amr) # no alignment here - instead use 'predheads' #print('###','newconcept',px,'/',predconcept) px0 = alignment[:ph] if not (px0 or px0==0): px0 = new_concept_from_token(amr, alignment, ph, depParse, wTags) triples.add((str(px0), '-PRED', str(px))) #if len(prop["args"])==1 or (prop["args"][0][0] in ['Support','rel'] and prop["args"][1][0] in ['Support','rel']): # triples.add((str(px), '-DUMMY', '')) predheads[ph] = px else: # predicate already a concept in the AMR (e.g. inserted by the 'nouns' module) amr.node_to_concepts[str(px)] = predconcept # change the name of the concept completed[0][ph] = True # now handle arguments for prop in props: baseform, roleset = prop["baseform"], prop["frame"] pred = [arg for arg in prop["args"] if arg[0]=='rel'][0] ph = pred[2] # predicate head #px = alignment[:ph] if ph not in predheads: continue px = predheads[ph] for rel,treenode,i,j,yieldS in prop["args"]: if i is None or j is None: continue # TODO: special PropBank cases that need further work if rel in ['rel', 'Support']: continue assert rel[:3]=='ARG' h = choose_head(range(i,j+1), depParse) if h is None: continue # TODO: improve coverage of complex spans # handle general proposition arguments if str(alignment[:h]) in amr.node_to_concepts: rel, amr.node_to_concepts[str(alignment[:h])] = common_arg(rel, amr.get_concept(str(alignment[:h]))) else: drels = [dep["rel"] for dep in depParse[h]] rel = common_arg(rel, drels=drels) if isinstance(rel,tuple): rel, val = rel assert isinstance(val,Atom) triples.add((str(px), rel, val)) else: x = amrget(amr, alignment, h, depParse, wTags) triples.add((str(px), rel, str(x))) #print('###',px,rel,x) completed[0][h] = True # if SRL argument link corresponds to a dependency edge, mark that edge as complete if (ph,h) in completed[1]: completed[1][(ph,h)] = True #print('completed ',(ph,h)) if (h,ph) in completed[1]: # also for reverse direction completed[1][(h,ph)] = True #print('completed ',(ph,h)) #print(triples) amr = new_amr_from_old(amr, new_triples=list(triples)) return depParse, amr, alignment, completed