You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ctakes.apache.org by se...@apache.org on 2023/02/07 01:34:33 UTC
[ctakes] branch main updated: API improvements, better interface with cnlpt negation.
This is an automated email from the ASF dual-hosted git repository.
seanfinan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ctakes.git
The following commit(s) were added to refs/heads/main by this push:
new 07e653f API improvements, better interface with cnlpt negation.
07e653f is described below
commit 07e653f76ba625ef82625c39f35f5be7c59b5fab
Author: Sean Finan <se...@childrens.harvard.edu>
AuthorDate: Mon Feb 6 20:34:21 2023 -0500
API improvements, better interface with cnlpt negation.
---
...FileRunAggregate.xml => PiperFileAggregate.xml} | 0
.../src/ctakes_cnlpt/ae/negation_delegator.py | 50 +++++++---------------
.../src/ctakes_pbj/component/pbj_receiver.py | 2 +-
.../src/ctakes_pbj/pbj_tools/helper_functions.py | 24 ++++++++++-
4 files changed, 40 insertions(+), 36 deletions(-)
diff --git a/ctakes-core/desc/analysis_engine/PiperFileRunAggregate.xml b/ctakes-core/desc/analysis_engine/PiperFileAggregate.xml
similarity index 100%
rename from ctakes-core/desc/analysis_engine/PiperFileRunAggregate.xml
rename to ctakes-core/desc/analysis_engine/PiperFileAggregate.xml
diff --git a/ctakes-examples/src/user/resources/org/apache/ctakes/examples/ctakes_cnlpt_py/src/ctakes_cnlpt/ae/negation_delegator.py b/ctakes-examples/src/user/resources/org/apache/ctakes/examples/ctakes_cnlpt_py/src/ctakes_cnlpt/ae/negation_delegator.py
index bed2486..44ecf4e 100644
--- a/ctakes-examples/src/user/resources/org/apache/ctakes/examples/ctakes_cnlpt_py/src/ctakes_cnlpt/ae/negation_delegator.py
+++ b/ctakes-examples/src/user/resources/org/apache/ctakes/examples/ctakes_cnlpt_py/src/ctakes_cnlpt/ae/negation_delegator.py
@@ -13,52 +13,34 @@ class NegationDelegator(cas_annotator.CasAnnotator):
# Initializes the cNLPT, which loads its Negation model.
def initialize(self):
- print("Initializing cnlp-transformers negation " + str(time.time()) + " ...")
+ print(time.ctime((time.time())) + " Initializing cnlp-transformers negation ...")
asyncio.run(self.init_caller())
- print("Done " + str(time.time()))
+ print(time.ctime((time.time())) + " Done.")
# Processes the document to get Negation on Events from cNLPT.
def process(self, cas):
+ print(time.ctime((time.time())) + " Processing cnlp-transformers negation ...")
+ sentences = cas.select(ctakes_types.Sentence)
event_mentions = cas.select(ctakes_types.EventMention)
- offsets = create_offset(event_mentions)
+ sentence_events = get_covered_list(sentences, event_mentions)
- print("Calling cnlp-transformers negation " + str(time.time()) + " ...")
- asyncio.run(self.negation_caller(cas, event_mentions, offsets))
- print("Done " + str(time.time()))
-
- # def process2(self, cas):
- # sentences = cas.select(ctakes_types.Sentence)
- # event_mentions = cas.select(ctakes_types.EventMention)
- # print("Calling cnlp-transformers negation " + str(time.time()) + " ...")
- # asyncio.run(self.negation_caller2(cas, sentences, event_mentions))
- # print("Done " + str(time.time()))
+ i = 0
+ while i < len(sentences):
+ if len(sentence_events[i]) > 0:
+ offsets = get_windowed_offsets(sentence_events[i], sentences[i].begin)
+ asyncio.run(self.negation_caller(cas, sentences[i].get_covered_text(), sentence_events[i], offsets))
+ i += 1
+ print(time.ctime((time.time())) + " Done.")
async def init_caller(self):
await negation_rest.startup_event()
- async def negation_caller(self, cas, event_mentions, offsets):
- text = cas.sofa_string
- eDoc = EntityDocument(doc_text=text, entities=offsets)
-
- #async with sem:
- negation_output = await negation_rest.process(eDoc)
+ async def negation_caller(self, cas, text, event_mentions, offsets):
+ e_doc = EntityDocument(doc_text=text, entities=offsets)
+ # async with sem:
+ negation_output = await negation_rest.process(e_doc)
i = 0
for e in event_mentions:
# -1 represents that it had happened, 1 represents that it is negated
e.polarity = negation_output.statuses[i] * -1
i += 1
-
-
- # async def negation_caller2(self, cas, sentences, event_mentions):
- # for sentence in sentences:
- # text = sentence.get_covered_text()
- #
- # eDoc = EntityDocument(doc_text=text, entities=offsets)
- #
- # #async with sem:
- # negation_output = await negation_rest.process(eDoc)
- # i = 0
- # for e in event_mentions:
- # # -1 represents that it had happened, 1 represents that it is negated
- # e.polarity = negation_output.statuses[i] * -1
- # i += 1
diff --git a/ctakes-pbj/src/user/resources/org/apache/ctakes/pbj/ctakes_pbj_py/src/ctakes_pbj/component/pbj_receiver.py b/ctakes-pbj/src/user/resources/org/apache/ctakes/pbj/ctakes_pbj_py/src/ctakes_pbj/component/pbj_receiver.py
index 3a53f44..835318d 100644
--- a/ctakes-pbj/src/user/resources/org/apache/ctakes/pbj/ctakes_pbj_py/src/ctakes_pbj/component/pbj_receiver.py
+++ b/ctakes-pbj/src/user/resources/org/apache/ctakes/pbj/ctakes_pbj_py/src/ctakes_pbj/component/pbj_receiver.py
@@ -58,8 +58,8 @@ class PBJReceiver(stomp.ConnectionListener):
def stop_receiver(self):
self.conn.disconnect()
- self.pipeline.collection_process_complete()
exit_event.set()
+ self.pipeline.collection_process_complete()
def on_message(self, frame):
# Here we want a check for some trigger like "PBJ_SHUT_DOWN", and then call __stop.
diff --git a/ctakes-pbj/src/user/resources/org/apache/ctakes/pbj/ctakes_pbj_py/src/ctakes_pbj/pbj_tools/helper_functions.py b/ctakes-pbj/src/user/resources/org/apache/ctakes/pbj/ctakes_pbj_py/src/ctakes_pbj/pbj_tools/helper_functions.py
index 37d0ffe..9b0cb0c 100644
--- a/ctakes-pbj/src/user/resources/org/apache/ctakes/pbj/ctakes_pbj_py/src/ctakes_pbj/pbj_tools/helper_functions.py
+++ b/ctakes-pbj/src/user/resources/org/apache/ctakes/pbj/ctakes_pbj_py/src/ctakes_pbj/pbj_tools/helper_functions.py
@@ -4,13 +4,20 @@ from ctakes_pbj.pbj_tools import create_type
from ctakes_pbj.type_system import ctakes_types
-def create_offset(annotations):
+def get_offsets(annotations):
offsets = []
for a in annotations:
offsets.append([a.begin, a.end])
return offsets
+def get_windowed_offsets(annotations, window_offset):
+ offsets = []
+ for a in annotations:
+ offsets.append([a.begin-window_offset, a.end-window_offset])
+ return offsets
+
+
def get_event_mention(cas, e_mentions, e_m_begins, begin, end):
i = 0
for b in e_m_begins:
@@ -21,3 +28,18 @@ def get_event_mention(cas, e_mentions, e_m_begins, begin, end):
event_men_type = cas.typesystem.get_type(ctakes_types.Procedure)
return create_type.add_type(cas, event_men_type, begin, end)
+
+def get_covered_list(to_cover_with, to_cover):
+ cover_max = len(to_cover)
+ covered_list = []
+ i = 0
+ for covering in to_cover_with:
+ covered = []
+ while i < cover_max:
+ if to_cover[i].begin >= covering.begin and to_cover[i].end <= covering.end:
+ covered.append(to_cover[i])
+ i += 1
+ else:
+ break
+ covered_list.append(covered)
+ return covered_list