Exemple #1
0
 def test_limit_scope3(self):
     """Test that two modifiers of the same type limit the scope of the first modifier."""
     doc = nlp("no evidence of CHF, neg for pneumonia")
     rule = ConTextRule("no evidence of", "DEFINITE_NEGATED_EXISTENCE",
                        "FORWARD")
     rule2 = ConTextRule("neg for", "DEFINITE_NEGATED_EXISTENCE", "FORWARD")
     modifier = ConTextModifier(rule, 0, 3, doc)
     modifier2 = ConTextModifier(rule2, 5, 7, doc)
     assert modifier.limit_scope(modifier2)
Exemple #2
0
    def test_overlapping_target(self):
        """Test that a modifier will not modify a target if it is
        in the same span as the modifier.
        """
        doc = nlp("Pt presents for r/o of pneumonia.")
        rule = ConTextRule("r/o", "UNCERTAIN", direction="BIDIRECTIONAL")
        modifier = ConTextModifier(rule, 3, 4, doc)
        target = Span(doc, 3, 4, "TEST")

        assert modifier.modifies(target) is False
Exemple #3
0
    def test_terminate_limit_scope_backward(self):
        """Test that a 'TERMINATE' modifier will limit the scope of a 'BACKWARD' modifier.
        """
        doc = nlp("Pt has chf but pneumonia is ruled out")
        rule = ConTextRule("is ruled out", "NEGATED_EXISTENCE", "BACKWARD")
        modifier = ConTextModifier(rule, 6, 8, doc)

        rule2 = ConTextRule("but", "TERMINATE", "TERMINATE")
        modifier2 = ConTextModifier(rule2, 3, 4, doc)
        assert modifier.limit_scope(modifier2)
Exemple #4
0
    def test_on_modifies_false(self):
        def on_modifies(target, modifier, span_between):
            return False

        rule = ConTextRule("no evidence of",
                           "NEGATED_EXISTENCE",
                           on_modifies=on_modifies)
        doc = nlp("There is no evidence of pneumonia or chf.")
        doc.ents = (doc[5:6], doc[7:8])
        modifier = ConTextModifier(rule, 2, 5, doc)

        assert modifier.modifies(doc.ents[0]) is False
    def test_on_modifies_true(self):
        def on_modifies(target, modifier, span_between):
            return True

        rule = ConTextRule("no evidence of",
                           "NEGATED_EXISTENCE",
                           on_modifies=on_modifies)
        doc = nlp("There is no evidence of pneumonia or chf.")
        doc.ents = (Span(doc, 5, 6, "CONDITION"), Span(doc, 6, 8, "CONDITION"))
        mod = ConTextModifier(rule, 2, 5, doc)

        assert mod.modifies(doc.ents[0]) is True
Exemple #6
0
 def test_terminate_limit_scope_custom2(self):
     """Test that a modifier will be explicitly terminated by a modifier with a category
     in terminated_by."""
     doc = nlp("flu is negative, pneumonia is positive.")
     rule = ConTextRule("negative",
                        "NEGATED_EXISTENCE",
                        direction="BACKWARD")
     rule2 = ConTextRule("positive",
                         "POSITIVE_EXISTENCE",
                         direction="BACKWARD",
                         terminated_by={"NEGATED_EXISTENCE"})
     modifier = ConTextModifier(rule, 2, 3, doc)
     modifier2 = ConTextModifier(rule2, 6, 7, doc)
     assert modifier2.limit_scope(modifier)
Exemple #7
0
 def test_terminate_limit_scope_custom(self):
     """Test that a modifier will be explicitly terminated by a modifier with a category
     in terminated_by."""
     doc = nlp("negative for flu, positive for pneumonia.")
     rule = ConTextRule("negative for",
                        "NEGATED_EXISTENCE",
                        direction="FORWARD",
                        terminated_by={"POSITIVE_EXISTENCE"})
     rule2 = ConTextRule("positive for",
                         "POSITIVE_EXISTENCE",
                         direction="FORWARD")
     modifier = ConTextModifier(rule, 0, 2, doc)
     modifier2 = ConTextModifier(rule2, 4, 6, doc)
     assert modifier.limit_scope(modifier2)
Exemple #8
0
    def test_on_modifies_arg_types(self):
        def check_arg_types(target, modifier, span_between):
            for arg in (target, modifier, span_between):
                if not isinstance(arg, spacy.tokens.Span):
                    return False
            return True

        rule = ConTextRule("no evidence of",
                           "NEGATED_EXISTENCE",
                           on_modifies=check_arg_types)
        doc = nlp("There is no evidence of pneumonia or chf.")
        doc.ents = (doc[5:6], doc[7:8])
        modifier = ConTextModifier(rule, 2, 5, doc)

        assert modifier.modifies(doc.ents[0]) is True
Exemple #9
0
    def test_max_scope_none(self):
        """Test that if max_scope is not None it will reduce the range
        of text which is modified.
        """
        doc = self.create_num_target_examples()
        assert len(doc.ents) == 3
        rule = ConTextRule("vs",
                           category="UNCERTAIN",
                           direction="BIDIRECTIONAL",
                           max_scope=None)
        modifier = ConTextModifier(rule, 5, 6, doc)

        for target in doc.ents:
            if modifier.modifies(target):
                modifier.modify(target)
        assert modifier.num_targets == 3
Exemple #10
0
 def create_objects(self):
     doc = nlp(
         "family history of breast cancer but no diabetes. She has afib.")
     rule = ConTextRule("family history of",
                        "FAMILY_HISTORY",
                        direction="FORWARD")
     modifier = ConTextModifier(rule, 0, 3, doc)
     return doc, rule, modifier
Exemple #11
0
    def test_on_modifies_arg_values(self):
        def check_arg_types(target, modifier, span_between):
            if target.lower_ != "chf":
                return False
            if modifier.lower_ != "no evidence of":
                return False
            if span_between.lower_ != "pneumonia or":
                return False
            return True

        rule = ConTextRule("no evidence of",
                           "NEGATED_EXISTENCE",
                           on_modifies=check_arg_types)
        doc = nlp("There is no evidence of pneumonia or chf.")
        doc.ents = (doc[5:6], doc[7:8])
        modifier = ConTextModifier(rule, 2, 5, doc)

        assert modifier.modifies(doc.ents[1]) is True
Exemple #12
0
 def test_set_scope_context_window_no_sentences(self):
     """Test that setting the scope succeeds if sentence boundaries haven't been set but _use_context_window is True."""
     doc = nlp.tokenizer(
         "family history of breast cancer but no diabetes. She has afib.")
     rule = ConTextRule("family history of",
                        "FAMILY_HISTORY",
                        direction="FORWARD",
                        max_scope=2)
     modifier = ConTextModifier(rule, 0, 3, doc, _use_context_window=True)
     assert modifier.scope == doc[3:5]
Exemple #13
0
    def context_graph(self):
        doc = nlp.tokenizer("There is no evidence of pneumonia but there is chf.")
        doc[0].is_sent_start = True
        for token in doc[1:]:
            token.is_sent_start = False
        item_data1 = ConTextRule(
            "no evidence of", "DEFINITE_NEGATED_EXISTENCE", "forward"
        )
        tag_object1 = ConTextModifier(item_data1, 2, 5, doc)

        item_data2 = ConTextRule("evidence of", "DEFINITE_EXISTENCE", "forward")
        tag_object2 = ConTextModifier(item_data2, 3, 5, doc)

        item_data3 = ConTextRule("but", "TERMINATE", "TERMINATE")
        tag_object3 = ConTextModifier(item_data3, 6, 7, doc)

        graph = ConTextGraph()
        graph.modifiers = [tag_object1, tag_object2, tag_object3]
        return doc, graph
Exemple #14
0
 def test_set_scope_fails_no_sentences(self):
     """Test that setting the scope fails if sentence boundaries haven't been set."""
     doc = nlp.tokenizer(
         "family history of breast cancer but no diabetes. She has afib.")
     rule = ConTextRule("family history of",
                        "FAMILY_HISTORY",
                        direction="FORWARD")
     with pytest.raises(ValueError) as exception_info:
         # This should fail because doc.sents are None
         ConTextModifier(rule, 0, 3, doc)
     exception_info.match(
         "ConText failed because sentence boundaries have not been set")
Exemple #15
0
    def test_no_limit_scope_same_category_different_allowed_types(self):
        """Test that a two ConTextModifiers of the same type but with different
         allowed types does not limits the scope of the modifier object.
         """
        doc = nlp("no history of travel to Puerto Rico, neg for pneumonia")

        rule = ConTextRule(
            "no history of",
            "DEFINITE_NEGATED_EXISTENCE",
            "FORWARD",
            allowed_types={"TRAVEL"},
        )
        rule2 = ConTextRule(
            "neg for",
            "DEFINITE_NEGATED_EXISTENCE",
            "FORWARD",
            allowed_types={"CONDITION"},
        )
        modifier = ConTextModifier(rule, 0, 3, doc)
        modifier2 = ConTextModifier(rule2, 8, 10, doc)
        assert not modifier.limit_scope(modifier2)
Exemple #16
0
    def test_not_remove_modifiers_overlap_target(self):
        """Test that a modifier which overlaps with a target is not pruned but does not modify itself."""
        doc = nlp("The patient has heart failure.")
        doc.ents = (Span(doc, 3, 5, "CONDITION"), )
        context_item = ConTextRule("failure", "MODIFIER")
        tag_object = ConTextModifier(context_item, 4, 5, doc)
        graph = ConTextGraph(remove_overlapping_modifiers=False)

        graph.modifiers = [tag_object]
        graph.targets = doc.ents
        graph.apply_modifiers()

        assert overlap_target_modifiers(tag_object.span, doc.ents[0])
        assert len(graph.modifiers) == 1
Exemple #17
0
 def test_no_types(self):
     """Test that not specifying allowed_types or excluded_types will modify all targets."""
     doc = self.create_target_type_examples()
     rule = ConTextRule(
         "no history of travel to",
         category="DEFINITE_NEGATED_EXISTENCE",
         direction="FORWARD",
     )
     modifier = ConTextModifier(rule, 0, 5, doc)
     modifier.set_scope()
     travel, condition = doc.ents  # "puerto rico", "pneumonia"
     assert modifier.modifies(travel) is True
     assert modifier.modifies(condition) is True
Exemple #18
0
    def test_max_targets_none(self):
        """Check that if max_targets is None it will not reduce the targets
        to the two closest ents.
        """
        doc = self.create_num_target_examples()
        assert len(doc.ents) == 3
        rule = ConTextRule("vs",
                           category="UNCERTAIN",
                           direction="BIDIRECTIONAL",
                           max_targets=None)
        # Set "vs" to be the modifier
        modifier = ConTextModifier(rule, 5, 6, doc)
        for target in doc.ents:
            modifier.modify(target)
        assert modifier.num_targets == 3

        modifier.reduce_targets()
        assert modifier.num_targets == 3
Exemple #19
0
    def test_max_targets_less_than_targets(self):
        """Check that if max_targets is not None it will reduce the targets
        to the two closest ents.
        """
        doc = self.create_num_target_examples()
        assert len(doc.ents) == 3
        rule = ConTextRule("vs",
                           category="UNCERTAIN",
                           direction="BIDIRECTIONAL",
                           max_targets=2)
        # Set "vs" to be the modifier
        modifier = ConTextModifier(rule, 5, 6, doc)
        for target in doc.ents:
            modifier.modify(target)
        assert modifier.num_targets == 3

        modifier.reduce_targets()
        assert modifier.num_targets == 2
        for target in modifier._targets:
            assert target.lower_ in ("pneumonia", "copd")
Exemple #20
0
 def test_limit_scope2(self):
     doc, rule, modifier = self.create_objects()
     rule2 = ConTextRule("but", "TERMINATE", "TERMINATE")
     modifier2 = ConTextModifier(rule2, 2, 4, doc)
     assert not modifier2.limit_scope(modifier)
Exemple #21
0
 def test_limit_scope(self):
     """Test that a 'TERMINATE' ConTextModifier limits the scope of the modifier object"""
     doc, rule, modifier = self.create_objects()
     rule2 = ConTextRule("but", "TERMINATE", "TERMINATE")
     modifier2 = ConTextModifier(rule2, 2, 4, doc)
     assert modifier.limit_scope(modifier2)