11from indra .statements import *
2+ from indra .statements .io import stmt_from_json
23from indra .ontology .standardize import standardize_agent_name
34
45import re
@@ -14,92 +15,39 @@ def __init__(self, data, grounder=None):
1415 self .grounder = grounder if grounder else default_grounder_wrapper
1516 self .extract_statements ()
1617
17- def get_agent (self , agent_info , context = None ):
18- name = agent_info ['text' ]
19- db_refs = self .grounder (name , context )
20- db_refs ['TEXT' ] = name
21- agent = Agent (name , db_refs = db_refs )
22- standardize_agent_name (agent , standardize_refs = True )
23- return agent
2418
2519 def extract_statement (self , entry ):
26- stmt_type = entry ['stmt_pred' ]['label' ]
27- roles = entry ['role_pred' ]['roles' ]
28- text = entry ['original_text' ]
29-
30- agents_by_role = {}
31- raw_texts = {}
32- coords = {}
33- for agent_info in roles :
34- role = agent_info ['role' ]
35- agents_by_role [role ] = self .get_agent (agent_info , text )
36- raw_texts [role ] = agent_info ['text' ]
37- coords [role ] = ([agent_info ['start' ], agent_info ['end' ]])
38-
39- evidence = Evidence (
40- source_api = self .source_api ,
41- text = text ,
42- )
43-
44- stmt_class = get_statement_by_name (stmt_type )
45- if issubclass (stmt_class , Complex ):
46- if len (agents_by_role ) < 2 :
47- raise ValueError ("Expected at least two roles: 'members'" ,
48- f" but got { agents_by_role .keys ()} " )
49- for role , _ in agents_by_role .items ():
50- if not re .match (r'members\.\d+' , role ):
51- raise ValueError (f"Unexpected role '{ role } ' for members" )
52-
53- members = [agent for role , agent in agents_by_role .items ()]
54- raw_texts = [raw_text for role , raw_text in raw_texts .items ()]
55- coords = [coord for role , coord in coords .items ()]
56- annotations = {
57- 'agents' : {
58- 'raw_text' : raw_texts ,
59- 'coords' : coords
60- }
61- }
62- evidence .annotations = annotations
63- stmt = Complex (members , evidence = [evidence ])
64- return stmt
65- elif issubclass (stmt_class , (RegulateAmount , RegulateActivity )):
66- if agents_by_role .keys () != {'subj' , 'obj' } or len (agents_by_role ) != 2 :
67- raise ValueError ("Expected exactly two roles: 'subj' and 'obj'" ,
68- f" but got { agents_by_role .keys ()} " )
69-
70- subj = agents_by_role .get ('subj' )
71- obj = agents_by_role .get ('obj' )
72- raw_texts = [raw_texts .get ('subj' ), raw_texts .get ('obj' )]
73- coords = [coords .get ('subj' ), coords .get ('obj' )]
74- annotations = {
75- 'agents' : {
76- 'raw_text' : raw_texts ,
77- 'coords' : coords
78- }
79- }
80- evidence .annotations = annotations
81- stmt = stmt_class (subj , obj , evidence = [evidence ])
82- return stmt
83- elif issubclass (stmt_class , Modification ):
84- if agents_by_role .keys () != {'enz' , 'sub' } or len (agents_by_role ) != 2 :
85- raise ValueError ("Expected exactly two roles: 'enz' and 'sub'" ,
86- f" but got { agents_by_role .keys ()} " )
87-
88- enz = agents_by_role .get ('enz' )
89- sub = agents_by_role .get ('sub' )
90- raw_texts = [raw_texts .get ('enz' ), raw_texts .get ('sub' )]
91- coords = [coords .get ('enz' ), coords .get ('sub' )]
92- annotations = {
93- 'agents' : {
94- 'raw_text' : raw_texts ,
95- 'coords' : coords
96- }
97- }
98- evidence .annotations = annotations
99- stmt = stmt_class (enz , sub , evidence = [evidence ])
20+ """Extract a statement from JSON using INDRA's built-in functionality."""
21+ try :
22+ # Use INDRA's built-in statement_from_json functionality
23+ stmt = stmt_from_json (entry )
24+
25+ # Apply grounding to agents if grounder is available
26+ if self .grounder :
27+ text = entry ['evidence' ][0 ]['text' ] if entry .get ('evidence' ) else ""
28+ self ._apply_grounding (stmt , text )
29+
10030 return stmt
101- else :
102- assert False , "Unsupported statement type: %s" % stmt_class
31+
32+ except Exception as e :
33+ logger .warning (f"Error creating statement from JSON: { e } " )
34+ raise
35+
36+ def _apply_grounding (self , stmt , context_text ):
37+ """Apply grounding to all agents in a statement."""
38+ # Get all agents from the statement
39+ agents = stmt .agent_list ()
40+
41+ for agent in agents :
42+ if agent and agent .name :
43+ # Apply grounding
44+ grounding_result = self .grounder (agent .name , context_text )
45+ if grounding_result :
46+ # Update db_refs with grounding results
47+ agent .db_refs .update (grounding_result )
48+
49+ # Standardize the agent name
50+ standardize_agent_name (agent , standardize_refs = True )
10351
10452 def extract_statements (self ):
10553 self .statements = []
0 commit comments