Need help with negspacy?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

157 Stars 16 Forks MIT License 84 Commits 4 Opened issues


spaCy pipeline object for negating concepts in text

Services available


Need anything else?

Contributors list

spaCy 3.0 support coming soon

negspacy: negation for spaCy

Build Status Built with spaCy pypi Version DOI Code style: black

spaCy pipeline object for negating concepts in text. Based on the NegEx algorithm.

NegEx - A Simple Algorithm for Identifying Negated Findings and Diseases in Discharge Summaries Chapman, Bridewell, Hanbury, Cooper, Buchanan

Installation and usage

Install the library.

pip install negspacy

Import library and spaCy.

import spacy
from negspacy.negation import Negex

Load spacy language model. Add negspacy pipeline object. Filtering on entity types is optional.

nlp = spacy.load("en_core_web_sm")
negex = Negex(nlp, ent_types=["PERSON","ORG"])
nlp.add_pipe(negex, last=True)

View negations. ```python doc = nlp("She does not like Steve Jobs but likes Apple products.")

for e in doc.ents: print(e.text, e._.negex) ```

Steve Jobs True
Apple False

Consider pairing with scispacy to find UMLS concepts in text and process negations.

NegEx Patterns

  • psuedo_negations - phrases that are false triggers, ambiguous negations, or double negatives
  • preceding_negations - negation phrases that precede an entity
  • following_negations - negation phrases that follow an entity
  • termination - phrases that cut a sentence in parts, for purposes of negation detection (.e.g., "but")


Designate termset to use,

is used by default.

negex = Negex(nlp, language = "en_clinical")
  • en
    = phrases for general english language text
  • en_clinical
    DEFAULT = adds phrases specific to clinical domain to general english
  • en_clinical_sensitive
    = adds additional phrases to help rule out historical and possibly irrelevant entities

Additional Functionality

Change patterns or view patterns in use

Replace all patterns with your own set

nlp = spacy.load("en_core_web_sm")
negex = Negex(nlp, termination=["but", "however", "nevertheless", "except"])

Add and remove individual patterns on the fly

    pseudo_negations=["my favorite pattern"],
    termination=["these are", "great patterns"],
    preceding_negations=["more patterns"],
    following_negations=["even more patterns"],
    pseudo_negations=["my favorite pattern"],
    termination=["these are", "great patterns"],
Note: A list is required when adding any amount of patterns but only required when removing multiple patterns.

View patterns in use

patterns_dict = negex.get_patterns

Negations in noun chunks

Depending on the Named Entity Recognition model you are using, you may have negations "chunked together" with nouns. For example when using scispacy: ```python nlp = spacy.load("encoresci_sm") doc = nlp("There is no headache.") for e in doc.ents: print(e.text)

no headache

This would cause the Negex algorithm to miss the preceding negation. To account for this, you can add a ```chunk_prefix```:

```python nlp = spacy.load("en_core_sci_sm") negex = Negex(nlp, language = "en_clinical", chunk_prefix = ["no"]) nlp.add_pipe(negex) doc = nlp("There is no headache.") for e in doc.ents: print(e.text, e._.negex)

no headache True




  • Jeno Pizarro



Other libraries

This library is featured in the spaCy Universe. Check it out for other useful libraries and inspiration.

If you're looking for a spaCy pipeline object to extract values that correspond to a named entity (e.g., birth dates, account numbers, or laboratory results) take a look at extractacy.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.