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