dkpro-cassis icon indicating copy to clipboard operation
dkpro-cassis copied to clipboard

Relation creation between two entities

Open bschembri-UoM opened this issue 1 year ago • 2 comments

Do you have any guidelines how to create a relation between two entities. The entities all ready exist in the cas I am creating some relations between existing named entities based on some logic. Have tried the bellow but I am not able to make it work;

` Relation = typesystem.get_type('webanno.custom.Relation') NamedEntity = typesystem.get_type('de.tudarmstadt.ukp.dkpro.core.api.ner.type.NamedEntity')

for i in range(1, maxSent + 1):
    # Let's find RESTCHAIN (subject) sells (object) PROD (predicate) in each sentence
    df_subj = entities.df_entities.query("SentRef == @i & NamedEntity == 'RESTCHAIN'")
    if (df_subj.shape[0]) > 0:
        df_pred = entities.df_entities.query("SentRef == @i & NamedEntity == 'PROD'")
        if df_pred.shape[0] > 0:
            for index_subj, row_subj in df_subj.iterrows():
                for index_pred, row_pred in df_pred.iterrows():
                    namedentity = NamedEntity().get(str(row_pred['id']))
                    relation = Relation(begin=str(row_pred['Begin']), end=str(row_pred['End']), Dependent=namedentity,
                                        Governor=str(row_subj['id']), Feature="sells")
                    cas.add(relation)

                    print(f"{row_subj['EntityText']} at {row_subj['Begin']}, {row_subj['End']} "
                          f"sells "
                          f"{row_pred['EntityText']} at {row_pred['Begin']}, {row_pred['End']}")

cas.to_xmi(config.xmi_path)

`

bschembri-UoM avatar Jun 19 '23 07:06 bschembri-UoM

I managed to create the relations between entities. I am not sure if there is a better way to do this however this is what I did;

df_ent = pd.DataFrame()
for ent in cas.select('de.tudarmstadt.ukp.dkpro.core.api.ner.type.NamedEntity'):
    print(ent)
    df_row = pd.DataFrame([{'id': ent.xmiID, 'ent': ent}])
    df_ent = pd.concat([df_ent, df_row])

Relation = typesystem.get_type('webanno.custom.Relation')
NamedEntity = typesystem.get_type('de.tudarmstadt.ukp.dkpro.core.api.ner.type.NamedEntity')

for i in range(1, maxSent + 1):
    # Let's find RESTCHAIN (subject) sells (object) PROD (predicate) in each sentence
    df_subj = entities.df_entities.query("SentRef == @i & NamedEntity == 'RESTCHAIN'")
    if (df_subj.shape[0]) > 0:
        df_pred = entities.df_entities.query("SentRef == @i & NamedEntity == 'PROD'")
        if df_pred.shape[0] > 0:
            for index_subj, row_subj in df_subj.iterrows():
                for index_pred, row_pred in df_pred.iterrows():
                    dependententity = df_ent.loc[df_ent['id'] == row_pred['id']].ent.item()
                    governorententity = df_ent.loc[df_ent['id'] == row_subj['id']].ent.item()
                    relation = Relation(begin=dependententity['begin'], end=dependententity['end'], Dependent=dependententity,
                                        Governor=governorententity, Feature="sells")
                    cas.add(relation)

                    print(f"{row_subj['EntityText']} at {row_subj['Begin']}, {row_subj['End']} "
                          f"sells "
                          f"{row_pred['EntityText']} at {row_pred['Begin']}, {row_pred['End']}")

cas.to_xmi(config.xmi_path)`

bschembri-UoM avatar Jun 19 '23 10:06 bschembri-UoM

relation = Relation(begin=dependententity['begin'], end=dependententity['end'], Dependent=dependententity,
                                        Governor=governorententity, Feature="sells")

Looks good to me.

The rest of the code basically depends on the data you are processing, so I don't have any comments on that.

reckart avatar Jun 19 '23 17:06 reckart