<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Datamining |</title><link>https://gbnegrinicv.netlify.app/tags/datamining/</link><atom:link href="https://gbnegrinicv.netlify.app/tags/datamining/index.xml" rel="self" type="application/rss+xml"/><description>Datamining</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 15 Apr 2021 00:00:00 +0000</lastBuildDate><image><url>https://gbnegrinicv.netlify.app/media/icon.svg</url><title>Datamining</title><link>https://gbnegrinicv.netlify.app/tags/datamining/</link></image><item><title>Biomedical text natural language processing (BioNLP) using scispaCy</title><link>https://gbnegrinicv.netlify.app/blog/biomedical-text-nlp-scispacy-named-entity-recognition-medical-records/</link><pubDate>Thu, 15 Apr 2021 00:00:00 +0000</pubDate><guid>https://gbnegrinicv.netlify.app/blog/biomedical-text-nlp-scispacy-named-entity-recognition-medical-records/</guid><description>&lt;p&gt;&lt;em&gt;How to identify diseases, drugs, and dosages from medical record transcriptions&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Biomedical text mining and natural language processing (BioNLP) is an interesting research domain that deals with processing data from journals, medical records, and other biomedical documents. Considering the availability of biomedical literature, there has been an increasing interest in extracting information, relationships, and insights from text data. However, the unstructured organization and the domain complexity of biomedical documents make these tasks hard. Fortunately, some cool NLP Python packages can help us with that!&lt;/p&gt;
&lt;p&gt;
is a Python package containing
models for processing biomedical, scientific or clinical text. spaCy&amp;rsquo;s most mindblowing features are neural network models for tagging, parsing, named entity recognition (NER), text classification, and more. Add scispaCy models on top of it and we can do all that in the biomedical domain!&lt;/p&gt;
&lt;p&gt;Here we are going to see how to use scispaCy &lt;strong&gt;NER models to identify drug and disease names mentioned in a medical transcription dataset&lt;/strong&gt;. Moreover, we are going to &lt;strong&gt;combine NER and rule-based matching to extract the drug names and dosages&lt;/strong&gt; reported in each transcription.&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;Table of Contents&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#requirements"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dataset"&gt;Dataset&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#named-entity-recognition"&gt;Named entity recognition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#rule-based-matching"&gt;Rule-based matching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusions"&gt;Conclusions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#references"&gt;References&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python 3&lt;/li&gt;
&lt;li&gt;pandas&lt;/li&gt;
&lt;li&gt;spacy&amp;gt;=3.0&lt;/li&gt;
&lt;li&gt;scispacy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can simply &lt;code&gt;pip install&lt;/code&gt; all of them.&lt;/p&gt;
&lt;p&gt;We also need to download and install the NER model from scispaCy. To install the &lt;code&gt;en_ner_bc5cdr_md&lt;/code&gt; model use the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.4.0/en_ner_bc5cdr_md-0.4.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For updated versions or other models, please check
.&lt;/p&gt;
&lt;h2 id="dataset"&gt;Dataset&lt;/h2&gt;
&lt;p&gt;Unstructured medical data, like medical transcriptions, are pretty hard to find. Here we are using a
scraped from the
by Tara Boyle and made available at Kaggle.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;med_transcript&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mtsamples.csv&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index_col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;med_transcript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;med_transcript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;class 'pandas.core.frame.DataFrame'&amp;gt;
Int64Index: 4999 entries, 0 to 4998
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 description 4999 non-null object
1 medical_specialty 4999 non-null object
2 sample_name 4999 non-null object
3 transcription 4966 non-null object
4 keywords 3931 non-null object
dtypes: object(5)
memory usage: 234.3+ KB
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;style scoped&gt;
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
&lt;pre&gt;&lt;code&gt;.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/style&gt;&lt;/p&gt;
&lt;table border="1" class="dataframe"&gt;
&lt;thead&gt;
&lt;tr style="text-align: right;"&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;th&gt;medical_specialty&lt;/th&gt;
&lt;th&gt;sample_name&lt;/th&gt;
&lt;th&gt;transcription&lt;/th&gt;
&lt;th&gt;keywords&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;td&gt;A 23-year-old white female presents with comp...&lt;/td&gt;
&lt;td&gt;Allergy / Immunology&lt;/td&gt;
&lt;td&gt;Allergic Rhinitis&lt;/td&gt;
&lt;td&gt;SUBJECTIVE:, This 23-year-old white female pr...&lt;/td&gt;
&lt;td&gt;allergy / immunology, allergic rhinitis, aller...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;td&gt;Consult for laparoscopic gastric bypass.&lt;/td&gt;
&lt;td&gt;Bariatrics&lt;/td&gt;
&lt;td&gt;Laparoscopic Gastric Bypass Consult - 2&lt;/td&gt;
&lt;td&gt;PAST MEDICAL HISTORY:, He has difficulty climb...&lt;/td&gt;
&lt;td&gt;bariatrics, laparoscopic gastric bypass, weigh...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;td&gt;Consult for laparoscopic gastric bypass.&lt;/td&gt;
&lt;td&gt;Bariatrics&lt;/td&gt;
&lt;td&gt;Laparoscopic Gastric Bypass Consult - 1&lt;/td&gt;
&lt;td&gt;HISTORY OF PRESENT ILLNESS: , I have seen ABC ...&lt;/td&gt;
&lt;td&gt;bariatrics, laparoscopic gastric bypass, heart...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;td&gt;2-D M-Mode. Doppler.&lt;/td&gt;
&lt;td&gt;Cardiovascular / Pulmonary&lt;/td&gt;
&lt;td&gt;2-D Echocardiogram - 1&lt;/td&gt;
&lt;td&gt;2-D M-MODE: , ,1. Left atrial enlargement wit...&lt;/td&gt;
&lt;td&gt;cardiovascular / pulmonary, 2-d m-mode, dopple...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;td&gt;2-D Echocardiogram&lt;/td&gt;
&lt;td&gt;Cardiovascular / Pulmonary&lt;/td&gt;
&lt;td&gt;2-D Echocardiogram - 2&lt;/td&gt;
&lt;td&gt;1. The left ventricular cavity size and wall ...&lt;/td&gt;
&lt;td&gt;cardiovascular / pulmonary, 2-d, doppler, echo...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;The dataset has almost 5000 records, but let&amp;rsquo;s work with a small random subsample so it doesn&amp;rsquo;t take too long to process. We also have to drop any rows whose transcriptions are missing.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;med_transcript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;transcription&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;inplace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;med_transcript_small&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;med_transcript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;med_transcript_small&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;med_transcript_small&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;class 'pandas.core.frame.DataFrame'&amp;gt;
Int64Index: 100 entries, 3162 to 3581
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 description 100 non-null object
1 medical_specialty 100 non-null object
2 sample_name 100 non-null object
3 transcription 100 non-null object
4 keywords 78 non-null object
dtypes: object(5)
memory usage: 4.7+ KB
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;style scoped&gt;
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
&lt;pre&gt;&lt;code&gt;.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/style&gt;&lt;/p&gt;
&lt;table border="1" class="dataframe"&gt;
&lt;thead&gt;
&lt;tr style="text-align: right;"&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;th&gt;medical_specialty&lt;/th&gt;
&lt;th&gt;sample_name&lt;/th&gt;
&lt;th&gt;transcription&lt;/th&gt;
&lt;th&gt;keywords&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;3162&lt;/th&gt;
&lt;td&gt;Markedly elevated PT INR despite stopping Cou...&lt;/td&gt;
&lt;td&gt;Hematology - Oncology&lt;/td&gt;
&lt;td&gt;Hematology Consult - 1&lt;/td&gt;
&lt;td&gt;HISTORY OF PRESENT ILLNESS:, The patient is w...&lt;/td&gt;
&lt;td&gt;NaN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;1981&lt;/th&gt;
&lt;td&gt;Intercostal block from fourth to tenth interc...&lt;/td&gt;
&lt;td&gt;Pain Management&lt;/td&gt;
&lt;td&gt;Intercostal block - 1&lt;/td&gt;
&lt;td&gt;PREPROCEDURE DIAGNOSIS:, Chest pain secondary...&lt;/td&gt;
&lt;td&gt;pain management, xylocaine, marcaine, intercos...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;1361&lt;/th&gt;
&lt;td&gt;The patient is a 65-year-old female who under...&lt;/td&gt;
&lt;td&gt;SOAP / Chart / Progress Notes&lt;/td&gt;
&lt;td&gt;Lobectomy - Followup&lt;/td&gt;
&lt;td&gt;HISTORY OF PRESENT ILLNESS: , The patient is a...&lt;/td&gt;
&lt;td&gt;soap / chart / progress notes, non-small cell ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;3008&lt;/th&gt;
&lt;td&gt;Construction of right upper arm hemodialysis ...&lt;/td&gt;
&lt;td&gt;Nephrology&lt;/td&gt;
&lt;td&gt;Hemodialysis Fistula Construction&lt;/td&gt;
&lt;td&gt;PREOPERATIVE DIAGNOSIS: , End-stage renal dise...&lt;/td&gt;
&lt;td&gt;nephrology, end-stage renal disease, av dialys...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;4943&lt;/th&gt;
&lt;td&gt;Bronchoscopy with brush biopsies. Persistent...&lt;/td&gt;
&lt;td&gt;Cardiovascular / Pulmonary&lt;/td&gt;
&lt;td&gt;Bronchoscopy - 8&lt;/td&gt;
&lt;td&gt;PREOPERATIVE DIAGNOSIS: , Persistent pneumonia...&lt;/td&gt;
&lt;td&gt;cardiovascular / pulmonary, persistent pneumon...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Let&amp;rsquo;s take one transcription to see how we can work with NER:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sample_transcription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;med_transcript_small&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;transcription&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample_transcription&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# prints just the first 1000 characters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;HISTORY OF PRESENT ILLNESS:, The patient is well known to me for a history of iron-deficiency anemia due to chronic blood loss from colitis. We corrected her hematocrit last year with intravenous (IV) iron. Ultimately, she had a total proctocolectomy done on 03/14/2007 to treat her colitis. Her course has been very complicated since then with needing multiple surgeries for removal of hematoma. This is partly because she was on anticoagulation for a right arm deep venous thrombosis (DVT) she had early this year, complicated by septic phlebitis.,Chart was reviewed, and I will not reiterate her complex history.,I am asked to see the patient again because of concerns for coagulopathy.,She had surgery again last month to evacuate a pelvic hematoma, and was found to have vancomycin resistant enterococcus, for which she is on multiple antibiotics and followed by infectious disease now.,She is on total parenteral nutrition (TPN) as well.,LABORATORY DATA:, Labs today showed a white blood
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, we can see a lot of entities in this transcription. There are drug, disease, and exam names for example.
The text was scraped from a web page and we can identify the different sections from the medical record like &amp;ldquo;HISTORY OF PRESENT ILLNESS&amp;rdquo; and &amp;ldquo;LABORATORY DATA&amp;rdquo;, but this varies from record to record.&lt;/p&gt;
&lt;h2 id="named-entity-recognition"&gt;Named entity recognition&lt;/h2&gt;
&lt;p&gt;Named entity recognition (NER) is a subtask of natural language processing used to identify and classify named entities mentioned in unstructured text into pre-defined categories. &lt;code&gt;scispaCy&lt;/code&gt; has different models to identify different entity types and you can check them
.&lt;/p&gt;
&lt;p&gt;We are going to use the NER model trained on the BC5CDR corpus (&lt;code&gt;en_ner_bc5cdr_md&lt;/code&gt;). This corpus consists of 1500 PubMed articles with 4409 annotated chemicals, 5818 diseases, and 3116 chemical-disease interactions. Don&amp;rsquo;t forget to
the model.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;scispacy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;spacy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nlp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spacy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;en_ner_bc5cdr_md&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;spacy.load&lt;/code&gt; will return a &lt;code&gt;Language&lt;/code&gt; object containing all components and data needed to process text. This object is usually called &lt;code&gt;nlp&lt;/code&gt; in the documentation and tutorials. Calling the &lt;code&gt;nlp&lt;/code&gt; object on a string of text will return a processed &lt;code&gt;Doc&lt;/code&gt; object with the text split into words and annotated.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get all identified entities and print their text, start position, end position, and type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nlp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample_transcription&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;TEXT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;START&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;END&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ENTITY TYPE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ent&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;TEXT START END ENTITY TYPE
iron-deficiency anemia 79 101 DISEASE
chronic blood loss 109 127 DISEASE
colitis 133 140 DISEASE
iron 203 207 CHEMICAL
...
vancomycin 781 791 CHEMICAL
infectious disease 873 891 DISEASE
improved.,PT 1348 1360 CHEMICAL
vitamin K 1503 1512 CHEMICAL
uric acid 1830 1839 CHEMICAL
bilirubin 1853 1862 CHEMICAL
Creatinine 1911 1921 CHEMICAL
...
Compazine 2474 2483 CHEMICAL
Zofran 2487 2493 CHEMICAL
epistaxis 2629 2638 DISEASE
bleeding 3057 3065 DISEASE
edema.,CARDIAC 3109 3123 CHEMICAL
adenopathy 3156 3166 DISEASE
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can see the model correctly identified and label diseases such as &lt;em&gt;iron-deficiency anemia&lt;/em&gt;, &lt;em&gt;chronic blood loss&lt;/em&gt;, and many more. Lots of drugs were also identified, like &lt;em&gt;vancomycin&lt;/em&gt;, &lt;em&gt;Compazine&lt;/em&gt;, &lt;em&gt;Zofran&lt;/em&gt;. The model can also identify common laboratory tested molecules such as &lt;em&gt;creatinine&lt;/em&gt;, &lt;em&gt;iron&lt;/em&gt;, &lt;em&gt;bilirubin&lt;/em&gt;, &lt;em&gt;uric acid&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Not everything is perfect though. See how some tokens are weirdly classified as chemicals, possibly due to punctuation marks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;improved.,PT 1348 1360 CHEMICAL&lt;/li&gt;
&lt;li&gt;edema.,CARDIAC 3109 3123 CHEMICAL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Punctuation marks are usually removed in NLP preprocessing steps, but we can&amp;rsquo;t remove all of them here, otherwise, we may miss chemical names and would screw up quantities like drug dosage. However, we can solve this problem by removing the &amp;ldquo;&lt;strong&gt;.,&lt;/strong&gt;&amp;rdquo; marks that appear to separate some sections of the transcription. It is important to know your data and your data&amp;rsquo;s domain to have a better comprehension of your results.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;med_transcript_small&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;transcription&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;med_transcript_small&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;transcription&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;(\.,)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;. &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can also check the entities using the &lt;code&gt;displacy&lt;/code&gt; visualizer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;spacy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;displacy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;displacy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# here I am printing just the first 100 tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span class="tex2jax_ignore"&gt;&lt;div class="entities" style="line-height: 2.5; direction: ltr"&gt;HISTORY OF PRESENT ILLNESS:, The patient is well known to me for a history of
&lt;mark class="entity" style="background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"&gt;
iron-deficiency anemia
&lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem"&gt;DISEASE&lt;/span&gt;
&lt;/mark&gt;
due to
&lt;mark class="entity" style="background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"&gt;
chronic blood loss
&lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem"&gt;DISEASE&lt;/span&gt;
&lt;/mark&gt;
from
&lt;mark class="entity" style="background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"&gt;
colitis
&lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem"&gt;DISEASE&lt;/span&gt;
&lt;/mark&gt;
. We corrected her hematocrit last year with intravenous (IV)
&lt;mark class="entity" style="background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"&gt;
iron
&lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem"&gt;CHEMICAL&lt;/span&gt;
&lt;/mark&gt;
. Ultimately, she had a total proctocolectomy done on 03/14/2007 to treat her
&lt;mark class="entity" style="background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"&gt;
colitis
&lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem"&gt;DISEASE&lt;/span&gt;
&lt;/mark&gt;
. Her course has been very complicated since then with needing multiple surgeries for removal of
&lt;mark class="entity" style="background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"&gt;
hematoma
&lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem"&gt;DISEASE&lt;/span&gt;
&lt;/mark&gt;
. This is partly because she was on anticoagulation for a right arm deep
&lt;mark class="entity" style="background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"&gt;
venous thrombosis
&lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem"&gt;DISEASE&lt;/span&gt;
&lt;/mark&gt;
(
&lt;mark class="entity" style="background: #ddd; padding: 0.45em 0.6em; margin: 0 0.25em; line-height: 1; border-radius: 0.35em;"&gt;
DVT
&lt;span style="font-size: 0.8em; font-weight: bold; line-height: 1; border-radius: 0.35em; vertical-align: middle; margin-left: 0.5rem"&gt;DISEASE&lt;/span&gt;
&lt;/mark&gt;
) she had early this year&lt;/div&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id="rule-based-matching"&gt;Rule-based matching&lt;/h2&gt;
&lt;p&gt;Rule-based matching is similar to regular expressions, but spaCy’s rule-based matcher engines and components give you access to the tokens within the document and their relationships. We can combine this with the NER models to identify some pattern that includes our entities.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s extract from the text the drug names and their reported dosages. This could be of real use to identify possible medication errors by checking if the dosages are in accordance with standards and guidelines.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;spacy.matcher&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Matcher&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ENT_TYPE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CHEMICAL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LIKE_NUM&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;IS_ASCII&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;matcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Matcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vocab&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;matcher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;DRUG_DOSE&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The code above creates a pattern to identify a sequence of three tokens:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A token whose entity type is CHEMICAL (drug name)&lt;/li&gt;
&lt;li&gt;A token that resembles a number (dosage)&lt;/li&gt;
&lt;li&gt;A token that consists of ASCII characters (units, like mg or mL)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then we initialize the Matcher with a vocabulary. The matcher must always share the same vocab with the documents it will operate on, so we use the &lt;code&gt;nlp&lt;/code&gt; object vocab. We then add this pattern to the matcher and give it an ID.&lt;/p&gt;
&lt;p&gt;Now we can loop through all transcriptions and extract the text matching this pattern:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;transcription&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;med_transcript_small&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;transcription&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nlp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transcription&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;matches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;matcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;match_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;string_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nlp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vocab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;match_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# get string representation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# the matched span&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;DRUG_DOSE 137 140 Xylocaine 20 mL
DRUG_DOSE 141 144 Marcaine 0.25%
DRUG_DOSE 208 211 Aspirin 81 mg
DRUG_DOSE 216 219 Spiriva 10 mcg
DRUG_DOSE 399 402 nifedipine 10 mg
DRUG_DOSE 226 229 aspirin one tablet
DRUG_DOSE 245 248 Warfarin 2.5 mg
DRUG_DOSE 67 70 Topamax 100 mg
...
DRUG_DOSE 193 196 Metamucil one pack
DRUG_DOSE 207 210 Nexium 40 mg
DRUG_DOSE 1133 1136 Naprosyn one p.o
DRUG_DOSE 290 293 Lidocaine 1%
DRUG_DOSE 37 40 Altrua 60,
...
DRUG_DOSE 74 77 Lidocaine 1.5%
DRUG_DOSE 209 212 Dilantin 300 mg
DRUG_DOSE 217 220 Haloperidol 1 mg
DRUG_DOSE 225 228 Dexamethasone 4 mg
DRUG_DOSE 234 237 Docusate 100 mg
DRUG_DOSE 250 253 Ibuprofen 600 mg
DRUG_DOSE 258 261 Zantac 150 mg
...
DRUG_DOSE 204 207 epinephrine 7 ml
DRUG_DOSE 214 217 Percocet 5,
DRUG_DOSE 55 58 . 4.
DRUG_DOSE 146 149 . 4.
DRUG_DOSE 2409 2412 Naprosyn 375 mg
DRUG_DOSE 141 144 Wellbutrin 300 mg
DRUG_DOSE 146 149 Xanax 0.25 mg
DRUG_DOSE 158 161 omeprazole 20 mg
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nice, we did it!&lt;/p&gt;
&lt;p&gt;We successfully extracted drugs and dosages, including different kinds of units like &lt;em&gt;mg, mL, %, packs&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="conclusions"&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;Here we learned how to use some features of scispaCy and spaCy like NER and rule-base matching. We used one NER model, but there lots of others and you should totally check them out. For instance, the &lt;code&gt;en_ner_bionlp13cg_md&lt;/code&gt; model can identify anatomical parts, tissues, cell types, and more. Imagine what else you could do with that!&lt;/p&gt;
&lt;p&gt;We also didn&amp;rsquo;t focus too much on preprocessing steps, but they are fundamental to get better results. Don&amp;rsquo;t forget to explore your data and adapt the preprocessing steps to the NLP tasks you want to do.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Neumann, M., King, D., Beltagy, I., &amp;amp; Ammar, W. (2019).
. arXiv preprint arXiv:1902.07669.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Honnibal, M., Montani, I., Van Landeghem, S., Boyd, A. (2020).
.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Automated miRDB custom target search</title><link>https://gbnegrinicv.netlify.app/projects/mirdb-search/</link><pubDate>Sat, 03 Oct 2020 00:00:00 +0000</pubDate><guid>https://gbnegrinicv.netlify.app/projects/mirdb-search/</guid><description>&lt;p&gt;Command-line tool to automate the search for microRNA targets in the miRDB base and extract the number of binding sites&lt;/p&gt;</description></item><item><title>PMdataX - PubMed data eXtraction</title><link>https://gbnegrinicv.netlify.app/projects/pmdatax/</link><pubDate>Sat, 03 Oct 2020 00:00:00 +0000</pubDate><guid>https://gbnegrinicv.netlify.app/projects/pmdatax/</guid><description>&lt;p&gt;A command-line tool to fetch data from articles available on PubMed&lt;/p&gt;</description></item><item><title>Word2Vec on ASD papers</title><link>https://gbnegrinicv.netlify.app/projects/word2vec-asd/</link><pubDate>Sat, 03 Oct 2020 00:00:00 +0000</pubDate><guid>https://gbnegrinicv.netlify.app/projects/word2vec-asd/</guid><description>&lt;p&gt;Word2Vec word embedding analysis on Autism Spectrum Disorder (ASD) articles abstracts available on PubMed&lt;/p&gt;</description></item></channel></rss>