This blog post has the code and details, of the take home project that I did for a company as part of their interview process, this primarily uses the CHEMDNER data to create a named recognition model using spaCy

The CHEMDNER corpus of chemicals and drugs and its annotation principles

  • Krallinger, M. et al. The CHEMDNER corpus of chemicals and drugs and its annotation principles. J Cheminform, 2014
This code should be directly runnable in colab, so just check and change the paths where I save and get data from my google drive, to run on your colab instance.

Prepare data

Get data and make create directories to organise information.

!wget --no-check-certificate https://biocreative.bioinformatics.udel.edu/media/store/files/2014/chemdner_corpus.tar.gz
!mkdir /content/data
!tar -xvf /content/drive/MyDrive/chemdNER\ data/data.tar.gz -C /content/data

chemdner_corpus/
chemdner_corpus/BioC.dtd
chemdner_corpus/cdi_ann_test_13-09-13.txt
chemdner_corpus/cem_ann_test_13-09-13.txt
chemdner_corpus/chemdner_abs_test_pmid_label.txt
chemdner_corpus/chemdner_chemical_disciplines.txt
chemdner_corpus/chemdner.key
chemdner_corpus/development.abstracts.txt
chemdner_corpus/development.annotations.txt
chemdner_corpus/development.bioc.xml
chemdner_corpus/evaluation.abstracts.txt
chemdner_corpus/evaluation.annotations.txt
chemdner_corpus/evaluation.bioc.xml
chemdner_corpus/evaluation.predictions.txt
chemdner_corpus/plain2bioc.py
chemdner_corpus/Readme.txt
chemdner_corpus/silver.abstracts.txt
chemdner_corpus/silver.predictions.txt
chemdner_corpus/training.abstracts.txt
chemdner_corpus/training.annotations.txt
chemdner_corpus/training.bioc.xml
chemdner_corpus/evaluation.predictions.bioc.xml

Install required libraries

Look at the libraries currently installed.

!pip list | grep spacy
spacy                         2.2.4          
!pip install https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.3.0/en_core_sci_lg-0.3.0.tar.gz

Since we are training data with medical text a model with similar vectors will be extremely useful, using the scispacy model vectors.

!pip list| grep en-core-sci-lg
en-core-sci-lg                0.3.0          

Import annotations

import pandas as pd
from pathlib import Path

annot_path = Path('/content/data/chemdner_corpus')
export_path = Path('/content/data/spacy_annotation_data')
export_path.mkdir(exist_ok=True)
train_annot = pd.read_csv(annot_path/'training.annotations.txt', sep='\t', names=['PMID', 'Text Type', 'Start', 'End', 'Entity Text', 'Entity'])
train_annot.head()
PMID Text Type Start End Entity Text Entity
0 21826085 A 946 957 haloperidol TRIVIAL
1 22080034 A 190 199 aflatoxin FAMILY
2 22080034 A 594 603 aflatoxin FAMILY
3 22080034 A 718 727 aflatoxin FAMILY
4 22080034 A 1072 1081 aflatoxin FAMILY

Since the training text can be in the title or in the abstract, we should be careful on what text we are giving in an annotation.

Let's check in the annotation for one value

start, end = train_annot.loc[train_annot['PMID'] == 21826085, ['Start', 'End']].values.tolist()[0]
start, end # start, end indices for haloperidol
(946, 957)
train_text = pd.read_csv(annot_path/'training.abstracts.txt', sep='\t', names=['PMID', 'Title', 'Abstract'])
train_text.head()
PMID Title Abstract
0 21826085 DPP6 as a candidate gene for neuroleptic-induc... We implemented a two-step approach to detect p...
1 22080034 Nanosilver effects on growth parameters in exp... Aflatoxicosis is a cause of economic losses in...
2 22080035 The influence of the intensity of smoking and ... The aim of this study was to investigate the e...
3 22080037 Mercury induces the expression of cyclooxygena... Nuclear factor-κB (NF-κB) is a transcription f...
4 22258629 Toxic effects of chromium on tannery workers a... Chromium is widely used in the leather industr...
train_annot['Text Type'].value_counts()
A    26425
T     3053
Name: Text Type, dtype: int64
train_text.loc[train_text['PMID'] == 21826085, 'Abstract'].item()[start:end]
'haloperidol'

We can see that the annotation data will seperate for the Title and Abstract pieces of the text.

Make raw text files for pretraining

import srsly
dev_text = pd.read_csv(annot_path/'development.abstracts.txt', sep='\t', names=['PMID', 'Title', 'Abstract'])
eval_text = pd.read_csv(annot_path/'evaluation.abstracts.txt', sep='\t', names=['PMID', 'Title', 'Abstract'])
texts_path = export_path/'texts'
texts_path.mkdir(exist_ok=True)

def make_jsonl(df:pd.DataFrame):
    jsonl_txts = []
    for data in df.itertuples(index=False):
        jsonl_txts.append({'text':data.Title+'\n'+data.Abstract})
    return jsonl_txts

train_txts = make_jsonl(train_text)
dev_txts = make_jsonl(dev_text)
eval_txts = make_jsonl(eval_text)

all_txts = train_txts + eval_txts + dev_txts
srsly.write_jsonl(str(texts_path/'pretrain_txts.jsonl'), train_txts[:1500])

Make json file for training

# set pmid as the index
train_annot.set_index('PMID', drop=True, inplace=True)
train_text.set_index('PMID', drop=True, inplace=True)
train_data = train_text.join(train_annot)
train_data.head()
Title Abstract Text Type Start End Entity Text Entity
PMID
21826085 DPP6 as a candidate gene for neuroleptic-induc... We implemented a two-step approach to detect p... A 946.0 957.0 haloperidol TRIVIAL
22080034 Nanosilver effects on growth parameters in exp... Aflatoxicosis is a cause of economic losses in... A 190.0 199.0 aflatoxin FAMILY
22080034 Nanosilver effects on growth parameters in exp... Aflatoxicosis is a cause of economic losses in... A 594.0 603.0 aflatoxin FAMILY
22080034 Nanosilver effects on growth parameters in exp... Aflatoxicosis is a cause of economic losses in... A 718.0 727.0 aflatoxin FAMILY
22080034 Nanosilver effects on growth parameters in exp... Aflatoxicosis is a cause of economic losses in... A 1072.0 1081.0 aflatoxin FAMILY

Let's check the number of annotations for each label.

train_data['Entity'].value_counts().plot(kind='bar', title='Number of annotations per label')
<matplotlib.axes._subplots.AxesSubplot at 0x7fcc6f26c630>

We have eight entities and the entity named TRIVIAL has the most number of annotations

Now we can start generating the annotation from the dataframe, to accomodate the training format that we want we can split the data frame to Title and Abstract annotations, so that we can run the same logic easily, (ie) grouping the texts and getting all the annotations corresponding to that text in one shot.

abstract_annots = train_data.loc[train_data['Text Type'] == 'A', :]
title_annots = train_data.loc[train_data['Text Type'] == 'T', :]
import en_core_sci_lg
from spacy.tokens import Span
from spacy.gold import docs_to_json
import json
# load the pretrained model and other utility functions
# to generate the training data
mod = en_core_sci_lg.load()
# since we are going to fill this manually
# for annotation, disabling some pipeline 
# modules may speedup the process
mod.disable_pipes(['ner'])
[('ner', <spacy.pipeline.pipes.EntityRecognizer at 0x7f8f0be55408>)]
def extract_spacy_docs(annot_df:pd.DataFrame, ext_from:str) -> list:
    # Extracting the doc objects from a pretrained model
    # so that the tokenization matches for this domain of 
    # text that we have

    annot_docs = []
    # Same texts have multiple annotations so group and take 
    # one by one
    for _, annot_data in annot_df.groupby(ext_from):
        # Text for annotation
        txt = annot_data.iloc[0][ext_from]
        doc = mod(txt)
        ent_spans = []
        text_ranges = []
        for annot in annot_data.itertuples():
            start = int(annot.Start)
            end = int(annot.End)
            # Validating overlapping entity annotations
            if start not in text_ranges and end not in text_ranges:
                # Make spans with our annotations
                span = doc.char_span(int(annot.Start), int(annot.End), label=annot.Entity)

                # It may be None for invalid annotations(wrt spaCy)
                if span is not None:
                    ent_spans.append(span)
                    text_ranges.extend(list(range(start, end+1,)))

            # Just for info
            else:
                print(txt, txt[start:end])

        doc.ents = ent_spans
        annot_docs.append(doc)
    return annot_docs
abstract_annots = extract_spacy_docs(abstract_annots, 'Abstract')
title_annots = extract_spacy_docs(title_annots, 'Title')

train_annot_docs = abstract_annots + title_annots

train_json = docs_to_json(train_annot_docs)
spacy_annot_path = export_path/'annots'
spacy_annot_path.mkdir(exist_ok=True)

srsly.write_json(spacy_annot_path/'train_data.json', [train_json])

We must do the same for the development and evaluation data

Make json file for evaluation and development

Let's make a function out of the process we did for the training data, for the evaluation and development data.

dev_annots = pd.read_csv(annot_path/'development.annotations.txt', sep='\t',
                         names=['PMID', 'Text Type', 'Start', 'End', 'Entity Text', 'Entity'])

eval_annots = pd.read_csv(annot_path/'evaluation.annotations.txt', sep='\t',
                         names=['PMID', 'Text Type', 'Start', 'End', 'Entity Text', 'Entity'])
def prepare_df_for_spacy_annots(df1: pd.DataFrame, df2: pd.DataFrame) -> 'Abstract and Title dataframes':
    # Emulates the processing we did for training data
    df1.set_index('PMID', drop=True, inplace=True)
    df2.set_index('PMID', drop=True, inplace=True)

    df = df1.join(df2)
    abstract_annots = df.loc[df['Text Type'] == 'A', :]
    title_annots = df.loc[df['Text Type'] == 'T', :]

    return abstract_annots, title_annots


def prepare_spacy_json_from_df(df1: pd.DataFrame, df2: pd.DataFrame):
    # transform the docs to spacy json    
    abstract_annots, title_annots = prepare_df_for_spacy_annots(df1, df2)
    
    abstract_docs = extract_spacy_docs(abstract_annots, 'Abstract')
    title_docs = extract_spacy_docs(title_annots, 'Title')

    annot_docs = abstract_docs + title_docs

    spacy_json = docs_to_json(train_annot_docs)
    return spacy_json
dev_json = prepare_spacy_json_from_df(dev_text, dev_annots)
eval_json = prepare_spacy_json_from_df(eval_text, eval_annots)

srsly.write_json(spacy_annot_path/'eval_data.json', [eval_json])
srsly.write_json(spacy_annot_path/'dev_data.json', [dev_json])

We now have all the files required to make the model, let's start by pretraining the model with spacy cli

Pretrain spacy with texts

We have imported scispacy's model vectors(en_core_sci_lg) to give us a headstart

!python -m spacy pretrain /content/data/spacy_annotation_data/texts/pretrain_txts.jsonl /usr/local/lib/python3.6/dist-packages/en_core_sci_lg/en_core_sci_lg-0.3.0 /content/data/pretrained_model -i 50 -se 10 -s 0 -bs 64

Debug the training data for spacy NER model

Let's see if the data is proper for training using spacy's debug-data command

%%bash
python -m spacy debug-data en\
    /content/drive/MyDrive/chemdNER\ data/annot_data/train_data.json \
    /content/drive/MyDrive/chemdNER\ data/annot_data/dev_data.json \
    -p 'ner' \
    -b /usr/local/lib/python3.6/dist-packages/en_core_sci_lg/en_core_sci_lg-0.3.0

=========================== Data format validation ===========================
✔ Corpus is loadable

=============================== Training stats ===============================
Training pipeline: ner
Starting with base model
'/usr/local/lib/python3.6/dist-packages/en_core_sci_lg/en_core_sci_lg-0.3.0'
4884 training docs
4884 evaluation docs
⚠ 4884 training examples also in evaluation data

============================== Vocab & Vectors ==============================
ℹ 647737 total words in the data (47733 unique)
ℹ 600000 vectors (667864 unique keys, 200 dimensions)
⚠ 21625 words in training data without vectors (0.03%)

========================== Named Entity Recognition ==========================
ℹ 8 new labels, 0 existing labels
0 missing values (tokens with '-' label)
⚠ 3 entity span(s) with punctuation
⚠ Low number of examples for new label 'NO CLASS' (40)
✔ Examples without occurrences available for all labels
✔ No entities consisting of or starting/ending with whitespace
Entity spans consisting of or starting/ending with punctuation can not be
trained with a noise level > 0.

================================== Summary ==================================
✔ 3 checks passed
⚠ 4 warnings

We have low annotations for NO CLASS but since we do not have more data, we have to work with what we've got.

We only had 4884 pieces of text from the dataset, and it seems to be used in all the places (train, dev, eval), but the annotation in each will differ.

!python -m spacy link /usr/local/lib/python3.6/dist-packages/en_core_sci_lg/en_core_sci_lg-0.3.0 en_core_sci_lg

Train model

I tried to train with the pretrained model which we made using raw text but it was not working and it seems most of the tutorials use it only text classification problems.

But anyway I start with the vectors of scispacy's pretrained en_core_sci_lg model for a headstart.

%%bash

python -m spacy train \
    en \
    /content/data/NER\ model \
    /content/drive/MyDrive/chemdNER\ data/annot_data/train_data.json \
    /content/drive/MyDrive/chemdNER\ data/annot_data/dev_data.json \
    -v /usr/local/lib/python3.6/dist-packages/en_core_sci_lg/en_core_sci_lg-0.3.0 \
    -p "ner" \
    -n 30 \
    -g 0 \
    -V 0.1 \
    -cW 3 -cd 4 -cw 4 -cP 3
Training pipeline: ['ner']
Using GPU: 0
Starting with blank model 'en'
Loading vector from model
'/usr/local/lib/python3.6/dist-packages/en_core_sci_lg/en_core_sci_lg-0.3.0'
Counting training words (limit=0)

Itn  NER Loss   NER P   NER R   NER F   Token %  CPU WPS  GPU WPS
---  ---------  ------  ------  ------  -------  -------  -------
  1  48369.133  38.580  23.141  28.929   91.214    79243    91040
  2  37874.029  41.895  28.937  34.231   91.214    79243    93572
  3  35916.519  45.435  33.101  38.300   91.214    79243    88774
  4  34941.559  48.925  37.233  42.286   91.214    79243    90150
  5  33485.552  52.235  40.570  45.669   91.214    79243    88586
  6  32591.528  56.412  44.786  49.931   91.214    79243    85016
  7  31565.729  59.580  48.290  53.344   91.214    79243    87689
  8  30361.623  63.674  53.106  57.912   91.214    79243    83318
  9  29941.032  66.154  56.482  60.937   91.214    79243    82007
 10  28910.156  68.003  58.950  63.154   91.214    79243    81201
 11  28704.946  69.475  60.998  64.961   91.214    79243    84349
 12  27963.309  70.596  62.859  66.503   91.214    79243    84314
 13  27236.334  71.279  64.103  67.501   91.214    79243    85654
 14  27401.528  72.042  65.215  68.458   91.214    79243    85735
 15  26876.413  72.860  65.895  69.203   91.214    79243    86002
 16  26792.615  73.405  66.611  69.843   91.214    79243    83849
 17  26456.828  74.399  67.623  70.849   91.214    79243    86532
 18  25825.262  74.959  68.207  71.424   91.214    79243    85455
 19  25672.156  75.481  68.839  72.007   91.214    79243    84888
 20  25490.234  75.762  69.159  72.310   91.214    79243    84073
 21  24909.075  76.367  69.799  72.935   91.214    79243    86211
 22  24919.627  76.807  70.315  73.418   91.214    79243    85168
 23  24733.465  77.390  70.775  73.935   91.214    79243    87323
 24  24437.002  77.744  71.139  74.295   91.214    79243    83429
 25  24302.424  78.324  71.547  74.782   91.214    79243    88724
 26  24329.596  78.659  71.951  75.156   91.214    79243    84788
 27  24270.859  79.210  72.179  75.531   91.214    79243    86826
 28  23739.026  79.464  72.519  75.833   91.214    79243    85965
 29  23988.403  79.575  72.563  75.908   91.214    79243    83390
 30  23883.377  79.800  72.583  76.021   91.214    79243    82936
✔ Saved model to output directory
/content/data/NER model/model-final
✔ Created best model
/content/data/NER model/model-best
                              

I did not try to tune the hyper parameters and relied on the defaults from the lib, but it has given decent results

Evaluate model with test data

Let's evaluate with the evaluation data that we generated earlier

%%bash
python -m spacy evaluate \
    /content/data/NER\ model/model-best \
    /content/drive/MyDrive/chemdNER\ data/annot_data/eval_data.json \
    -g 0 -dp /content/data/eval\ results -R

================================== Results ==================================

Time      8.66 s
Words     688898
Words/s   79533 
TOK       91.21 
POS       0.03  
UAS       3.88  
LAS       0.00  
NER P     79.80 
NER R     72.58 
NER F     76.02 
Textcat   0.00  

✔ Generated 25 parses as HTML
/content/data/eval results
/usr/local/lib/python3.6/dist-packages/spacy/displacy/__init__.py:189: UserWarning: [W006] No entities to visualize found in Doc object. If this is surprising to you, make sure the Doc was processed using a model that supports named entity recognition, and check the `doc.ents` property manually if necessary.
  warnings.warn(Warnings.W006)

The results of some text are persisted and can be viewed in the archive.

Misc

Here I tried to write code for simple annotation format, mostly for archival, can be skipped, if need be

def extract_annot_data(annot_df: pd.DataFrame, ext_from: str) -> list:
    # groups text and generates the list of entities and
    # their spans in the text
    train_data = []
    for _, annot_data in annot_df.groupby(ext_from):
        ttext = annot_data.iloc[0][ext_from]
        entity_list = []
        # print(ttext)
        text_ranges = []

        for annot in annot_data.itertuples():
            start = int(annot.Start)
            end = int(annot.End)
            if start not in text_ranges and end not in text_ranges:
                text_ranges.extend(list(range(start, end+1,)))
                entity_list.append((annot.Start, annot.End, annot.Entity))

        train_data.append((ttext, {'entities':entity_list}))

    return train_data
abst_annots = extract_annot_data(abstract_annots, 'Abstract')
title_annots = extract_annot_data(title_annots, 'Title')
abst_annots[0]
('(-)-Carvone is a monoterpene ketone found in spearmint (Mentha spicata var. crispa) essential oil that is widely used as an odor and flavor additive. An intestinal antispasmodic effect was recently reported for (-)-carvone, and it has been shown to be more potent than its (+)-antipode. The mechanism of (-)-carvone action in the intestines has not been investigated. To gain a better understanding of the (-)-carvone antispasmodic effect, we investigated its pharmacological effects in the guinea pig ileum. Terminal portions of the ileum were mounted for isotonic contraction recordings. The effect of (-)-carvone was compared with that of the classical calcium channel blocker (CCB) verapamil. In isolated ileal smooth muscle, (-)-carvone did not produce direct contractile or relaxation responses and did not modify electrically elicited contractions or low K(+)-evoked contractions. The submaximal contractions induced by histamine (p<0.001), BaCl2 (p<0.05), and carbachol (p<0.01) were significantly reduced by (-)-carvone. The contractile response elicited by high concentrations of carbachol was reduced but not abolished by (-)-carvone. No additive action was detected with co-incubation of (-)-carvone and verapamil on carbachol-induced contraction. (-)-Carvone reduced the contraction induced by high K(+) and was almost 100 times more potent than verapamil. Thus, (-)-carvone showed a typical and potent CCB-like action. Many effects described for both (-)-carvone and spearmint oil can be explained as a CCB-like mode of action.',
 {'entities': [(1090.0, 1099.0, 'TRIVIAL'),
   (1133.0, 1144.0, 'TRIVIAL'),
   (1200.0, 1211.0, 'TRIVIAL'),
   (1216.0, 1225.0, 'TRIVIAL'),
   (1229.0, 1238.0, 'TRIVIAL'),
   (1359.0, 1368.0, 'TRIVIAL'),
   (1312.0, 1316.0, 'FORMULA'),
   (968.0, 977.0, 'TRIVIAL'),
   (1376.0, 1387.0, 'TRIVIAL'),
   (1465.0, 1476.0, 'TRIVIAL'),
   (1260.0, 1271.0, 'TRIVIAL'),
   (948.0, 953.0, 'FORMULA'),
   (1017.0, 1028.0, 'TRIVIAL'),
   (862.0, 866.0, 'FORMULA'),
   (927.0, 936.0, 'TRIVIAL'),
   (0.0, 11.0, 'TRIVIAL'),
   (17.0, 35.0, 'FAMILY'),
   (211.0, 222.0, 'TRIVIAL'),
   (304.0, 315.0, 'TRIVIAL'),
   (604.0, 615.0, 'TRIVIAL'),
   (656.0, 663.0, 'SYSTEMATIC'),
   (686.0, 695.0, 'TRIVIAL'),
   (730.0, 741.0, 'TRIVIAL'),
   (406.0, 417.0, 'TRIVIAL')]})

A sample text from the corpus

ttext
'(-)-Carvone is a monoterpene ketone found in spearmint (Mentha spicata var. crispa) essential oil that is widely used as an odor and flavor additive. An intestinal antispasmodic effect was recently reported for (-)-carvone, and it has been shown to be more potent than its (+)-antipode. The mechanism of (-)-carvone action in the intestines has not been investigated. To gain a better understanding of the (-)-carvone antispasmodic effect, we investigated its pharmacological effects in the guinea pig ileum. Terminal portions of the ileum were mounted for isotonic contraction recordings. The effect of (-)-carvone was compared with that of the classical calcium channel blocker (CCB) verapamil. In isolated ileal smooth muscle, (-)-carvone did not produce direct contractile or relaxation responses and did not modify electrically elicited contractions or low K(+)-evoked contractions. The submaximal contractions induced by histamine (p<0.001), BaCl2 (p<0.05), and carbachol (p<0.01) were significantly reduced by (-)-carvone. The contractile response elicited by high concentrations of carbachol was reduced but not abolished by (-)-carvone. No additive action was detected with co-incubation of (-)-carvone and verapamil on carbachol-induced contraction. (-)-Carvone reduced the contraction induced by high K(+) and was almost 100 times more potent than verapamil. Thus, (-)-carvone showed a typical and potent CCB-like action. Many effects described for both (-)-carvone and spearmint oil can be explained as a CCB-like mode of action.'
from spacy.gold import docs_to_json, GoldParse

A sample of the spacy json format for training models

docs_to_json([mod(ttext)])

{'id': 0,
 'paragraphs': [{'cats': [],
   'raw': '(-)-Carvone is a monoterpene ketone found in spearmint (Mentha spicata var. crispa) essential oil that is widely used as an odor and flavor additive. An intestinal antispasmodic effect was recently reported for (-)-carvone, and it has been shown to be more potent than its (+)-antipode. The mechanism of (-)-carvone action in the intestines has not been investigated. To gain a better understanding of the (-)-carvone antispasmodic effect, we investigated its pharmacological effects in the guinea pig ileum. Terminal portions of the ileum were mounted for isotonic contraction recordings. The effect of (-)-carvone was compared with that of the classical calcium channel blocker (CCB) verapamil. In isolated ileal smooth muscle, (-)-carvone did not produce direct contractile or relaxation responses and did not modify electrically elicited contractions or low K(+)-evoked contractions. The submaximal contractions induced by histamine (p<0.001), BaCl2 (p<0.05), and carbachol (p<0.01) were significantly reduced by (-)-carvone. The contractile response elicited by high concentrations of carbachol was reduced but not abolished by (-)-carvone. No additive action was detected with co-incubation of (-)-carvone and verapamil on carbachol-induced contraction. (-)-Carvone reduced the contraction induced by high K(+) and was almost 100 times more potent than verapamil. Thus, (-)-carvone showed a typical and potent CCB-like action. Many effects described for both (-)-carvone and spearmint oil can be explained as a CCB-like mode of action.',
   'sentences': [{'brackets': [],
     'tokens': [{'dep': 'nsubj',
       'head': 4,
       'id': 0,
       'ner': 'O',
       'orth': '(-)-Carvone',
       'tag': 'NN'},
      {'dep': 'cop',
       'head': 3,
       'id': 1,
       'ner': 'O',
       'orth': 'is',
       'tag': 'VBZ'},
      {'dep': 'det', 'head': 2, 'id': 2, 'ner': 'O', 'orth': 'a', 'tag': 'DT'},
      {'dep': 'compound',
       'head': 1,
       'id': 3,
       'ner': 'O',
       'orth': 'monoterpene',
       'tag': 'NN'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 4,
       'ner': 'O',
       'orth': 'ketone',
       'tag': 'NN'},
      {'dep': 'acl',
       'head': -1,
       'id': 5,
       'ner': 'O',
       'orth': 'found',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 1,
       'id': 6,
       'ner': 'O',
       'orth': 'in',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 7,
       'ner': 'O',
       'orth': 'spearmint',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': 3,
       'id': 8,
       'ner': 'O',
       'orth': '(',
       'tag': '-LRB-'},
      {'dep': 'compound',
       'head': 2,
       'id': 9,
       'ner': 'O',
       'orth': 'Mentha',
       'tag': 'FW'},
      {'dep': 'compound',
       'head': 1,
       'id': 10,
       'ner': 'O',
       'orth': 'spicata',
       'tag': 'FW'},
      {'dep': 'dep',
       'head': -4,
       'id': 11,
       'ner': 'O',
       'orth': 'var',
       'tag': 'FW'},
      {'dep': 'punct',
       'head': -8,
       'id': 12,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'ROOT',
       'head': 0,
       'id': 13,
       'ner': 'O',
       'orth': 'crispa',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -1,
       'id': 14,
       'ner': 'O',
       'orth': ')',
       'tag': '-RRB-'},
      {'dep': 'amod',
       'head': 1,
       'id': 15,
       'ner': 'O',
       'orth': 'essential',
       'tag': 'JJ'},
      {'dep': 'appos',
       'head': -3,
       'id': 16,
       'ner': 'O',
       'orth': 'oil',
       'tag': 'NN'},
      {'dep': 'nsubjpass',
       'head': 3,
       'id': 17,
       'ner': 'O',
       'orth': 'that',
       'tag': 'WDT'},
      {'dep': 'auxpass',
       'head': 2,
       'id': 18,
       'ner': 'O',
       'orth': 'is',
       'tag': 'VBZ'},
      {'dep': 'advmod',
       'head': 1,
       'id': 19,
       'ner': 'O',
       'orth': 'widely',
       'tag': 'RB'},
      {'dep': 'acl:relcl',
       'head': -4,
       'id': 20,
       'ner': 'O',
       'orth': 'used',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 5,
       'id': 21,
       'ner': 'O',
       'orth': 'as',
       'tag': 'IN'},
      {'dep': 'det',
       'head': 4,
       'id': 22,
       'ner': 'O',
       'orth': 'an',
       'tag': 'DT'},
      {'dep': 'compound',
       'head': 3,
       'id': 23,
       'ner': 'O',
       'orth': 'odor',
       'tag': 'NN'},
      {'dep': 'cc',
       'head': -1,
       'id': 24,
       'ner': 'O',
       'orth': 'and',
       'tag': 'CC'},
      {'dep': 'conj',
       'head': -2,
       'id': 25,
       'ner': 'O',
       'orth': 'flavor',
       'tag': 'NN'},
      {'dep': 'nmod',
       'head': -6,
       'id': 26,
       'ner': 'O',
       'orth': 'additive',
       'tag': 'JJ'},
      {'dep': 'punct',
       'head': -14,
       'id': 27,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'det',
       'head': 3,
       'id': 28,
       'ner': 'O',
       'orth': 'An',
       'tag': 'DT'},
      {'dep': 'amod',
       'head': 2,
       'id': 29,
       'ner': 'O',
       'orth': 'intestinal',
       'tag': 'JJ'},
      {'dep': 'amod',
       'head': 1,
       'id': 30,
       'ner': 'O',
       'orth': 'antispasmodic',
       'tag': 'JJ'},
      {'dep': 'nsubjpass',
       'head': 3,
       'id': 31,
       'ner': 'O',
       'orth': 'effect',
       'tag': 'NN'},
      {'dep': 'auxpass',
       'head': 2,
       'id': 32,
       'ner': 'O',
       'orth': 'was',
       'tag': 'VBD'},
      {'dep': 'advmod',
       'head': 1,
       'id': 33,
       'ner': 'O',
       'orth': 'recently',
       'tag': 'RB'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 34,
       'ner': 'O',
       'orth': 'reported',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 1,
       'id': 35,
       'ner': 'O',
       'orth': 'for',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 36,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -3,
       'id': 37,
       'ner': 'O',
       'orth': ',',
       'tag': ','},
      {'dep': 'cc',
       'head': -4,
       'id': 38,
       'ner': 'O',
       'orth': 'and',
       'tag': 'CC'},
      {'dep': 'nsubjpass',
       'head': 3,
       'id': 39,
       'ner': 'O',
       'orth': 'it',
       'tag': 'PRP'},
      {'dep': 'aux',
       'head': 2,
       'id': 40,
       'ner': 'O',
       'orth': 'has',
       'tag': 'VBZ'},
      {'dep': 'auxpass',
       'head': 1,
       'id': 41,
       'ner': 'O',
       'orth': 'been',
       'tag': 'VBN'},
      {'dep': 'conj',
       'head': -8,
       'id': 42,
       'ner': 'O',
       'orth': 'shown',
       'tag': 'VBN'},
      {'dep': 'mark',
       'head': 3,
       'id': 43,
       'ner': 'O',
       'orth': 'to',
       'tag': 'TO'},
      {'dep': 'cop',
       'head': 2,
       'id': 44,
       'ner': 'O',
       'orth': 'be',
       'tag': 'VB'},
      {'dep': 'advmod',
       'head': 1,
       'id': 45,
       'ner': 'O',
       'orth': 'more',
       'tag': 'RBR'},
      {'dep': 'xcomp',
       'head': -4,
       'id': 46,
       'ner': 'O',
       'orth': 'potent',
       'tag': 'JJ'},
      {'dep': 'case',
       'head': 2,
       'id': 47,
       'ner': 'O',
       'orth': 'than',
       'tag': 'IN'},
      {'dep': 'nmod:poss',
       'head': 1,
       'id': 48,
       'ner': 'O',
       'orth': 'its',
       'tag': 'PRP$'},
      {'dep': 'nmod',
       'head': -3,
       'id': 49,
       'ner': 'O',
       'orth': '(+)-antipode',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -16,
       'id': 50,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'det',
       'head': 1,
       'id': 51,
       'ner': 'O',
       'orth': 'The',
       'tag': 'DT'},
      {'dep': 'nsubjpass',
       'head': 10,
       'id': 52,
       'ner': 'O',
       'orth': 'mechanism',
       'tag': 'NN'},
      {'dep': 'case',
       'head': 2,
       'id': 53,
       'ner': 'O',
       'orth': 'of',
       'tag': 'IN'},
      {'dep': 'compound',
       'head': 1,
       'id': 54,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'nmod',
       'head': -3,
       'id': 55,
       'ner': 'O',
       'orth': 'action',
       'tag': 'NN'},
      {'dep': 'case',
       'head': 2,
       'id': 56,
       'ner': 'O',
       'orth': 'in',
       'tag': 'IN'},
      {'dep': 'det',
       'head': 1,
       'id': 57,
       'ner': 'O',
       'orth': 'the',
       'tag': 'DT'},
      {'dep': 'nmod',
       'head': -3,
       'id': 58,
       'ner': 'O',
       'orth': 'intestines',
       'tag': 'NNS'},
      {'dep': 'aux',
       'head': 3,
       'id': 59,
       'ner': 'O',
       'orth': 'has',
       'tag': 'VBZ'},
      {'dep': 'neg',
       'head': 2,
       'id': 60,
       'ner': 'O',
       'orth': 'not',
       'tag': 'RB'},
      {'dep': 'auxpass',
       'head': 1,
       'id': 61,
       'ner': 'O',
       'orth': 'been',
       'tag': 'VBN'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 62,
       'ner': 'O',
       'orth': 'investigated',
       'tag': 'VBN'},
      {'dep': 'punct',
       'head': -1,
       'id': 63,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'mark',
       'head': 1,
       'id': 64,
       'ner': 'O',
       'orth': 'To',
       'tag': 'TO'},
      {'dep': 'advcl',
       'head': 11,
       'id': 65,
       'ner': 'O',
       'orth': 'gain',
       'tag': 'VB'},
      {'dep': 'det',
       'head': 2,
       'id': 66,
       'ner': 'O',
       'orth': 'a',
       'tag': 'DT'},
      {'dep': 'amod',
       'head': 1,
       'id': 67,
       'ner': 'O',
       'orth': 'better',
       'tag': 'JJR'},
      {'dep': 'dobj',
       'head': -3,
       'id': 68,
       'ner': 'O',
       'orth': 'understanding',
       'tag': 'NN'},
      {'dep': 'case',
       'head': 4,
       'id': 69,
       'ner': 'O',
       'orth': 'of',
       'tag': 'IN'},
      {'dep': 'det',
       'head': 3,
       'id': 70,
       'ner': 'O',
       'orth': 'the',
       'tag': 'DT'},
      {'dep': 'compound',
       'head': 2,
       'id': 71,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'compound',
       'head': 1,
       'id': 72,
       'ner': 'O',
       'orth': 'antispasmodic',
       'tag': 'JJ'},
      {'dep': 'nmod',
       'head': -5,
       'id': 73,
       'ner': 'O',
       'orth': 'effect',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': 2,
       'id': 74,
       'ner': 'O',
       'orth': ',',
       'tag': ','},
      {'dep': 'nsubj',
       'head': 1,
       'id': 75,
       'ner': 'O',
       'orth': 'we',
       'tag': 'PRP'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 76,
       'ner': 'O',
       'orth': 'investigated',
       'tag': 'VBD'},
      {'dep': 'nmod:poss',
       'head': 2,
       'id': 77,
       'ner': 'O',
       'orth': 'its',
       'tag': 'PRP$'},
      {'dep': 'amod',
       'head': 1,
       'id': 78,
       'ner': 'O',
       'orth': 'pharmacological',
       'tag': 'JJ'},
      {'dep': 'dobj',
       'head': -3,
       'id': 79,
       'ner': 'O',
       'orth': 'effects',
       'tag': 'NNS'},
      {'dep': 'case',
       'head': 4,
       'id': 80,
       'ner': 'O',
       'orth': 'in',
       'tag': 'IN'},
      {'dep': 'det',
       'head': 3,
       'id': 81,
       'ner': 'O',
       'orth': 'the',
       'tag': 'DT'},
      {'dep': 'compound',
       'head': 2,
       'id': 82,
       'ner': 'O',
       'orth': 'guinea',
       'tag': 'NN'},
      {'dep': 'compound',
       'head': 1,
       'id': 83,
       'ner': 'O',
       'orth': 'pig',
       'tag': 'NN'},
      {'dep': 'nmod',
       'head': -5,
       'id': 84,
       'ner': 'O',
       'orth': 'ileum',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -9,
       'id': 85,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'amod',
       'head': 1,
       'id': 86,
       'ner': 'O',
       'orth': 'Terminal',
       'tag': 'JJ'},
      {'dep': 'nsubjpass',
       'head': 5,
       'id': 87,
       'ner': 'O',
       'orth': 'portions',
       'tag': 'NNS'},
      {'dep': 'case',
       'head': 2,
       'id': 88,
       'ner': 'O',
       'orth': 'of',
       'tag': 'IN'},
      {'dep': 'det',
       'head': 1,
       'id': 89,
       'ner': 'O',
       'orth': 'the',
       'tag': 'DT'},
      {'dep': 'nmod',
       'head': -3,
       'id': 90,
       'ner': 'O',
       'orth': 'ileum',
       'tag': 'NN'},
      {'dep': 'auxpass',
       'head': 1,
       'id': 91,
       'ner': 'O',
       'orth': 'were',
       'tag': 'VBD'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 92,
       'ner': 'O',
       'orth': 'mounted',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 3,
       'id': 93,
       'ner': 'O',
       'orth': 'for',
       'tag': 'IN'},
      {'dep': 'amod',
       'head': 2,
       'id': 94,
       'ner': 'O',
       'orth': 'isotonic',
       'tag': 'JJ'},
      {'dep': 'compound',
       'head': 1,
       'id': 95,
       'ner': 'O',
       'orth': 'contraction',
       'tag': 'NN'},
      {'dep': 'nmod',
       'head': -4,
       'id': 96,
       'ner': 'O',
       'orth': 'recordings',
       'tag': 'NNS'},
      {'dep': 'punct',
       'head': -5,
       'id': 97,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'det',
       'head': 1,
       'id': 98,
       'ner': 'O',
       'orth': 'The',
       'tag': 'DT'},
      {'dep': 'nsubjpass',
       'head': 4,
       'id': 99,
       'ner': 'O',
       'orth': 'effect',
       'tag': 'NN'},
      {'dep': 'case',
       'head': 1,
       'id': 100,
       'ner': 'O',
       'orth': 'of',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 101,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'auxpass',
       'head': 1,
       'id': 102,
       'ner': 'O',
       'orth': 'was',
       'tag': 'VBD'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 103,
       'ner': 'O',
       'orth': 'compared',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 1,
       'id': 104,
       'ner': 'O',
       'orth': 'with',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 105,
       'ner': 'O',
       'orth': 'that',
       'tag': 'DT'},
      {'dep': 'case',
       'head': 9,
       'id': 106,
       'ner': 'O',
       'orth': 'of',
       'tag': 'IN'},
      {'dep': 'det',
       'head': 8,
       'id': 107,
       'ner': 'O',
       'orth': 'the',
       'tag': 'DT'},
      {'dep': 'amod',
       'head': 7,
       'id': 108,
       'ner': 'O',
       'orth': 'classical',
       'tag': 'JJ'},
      {'dep': 'compound',
       'head': 2,
       'id': 109,
       'ner': 'O',
       'orth': 'calcium',
       'tag': 'NN'},
      {'dep': 'compound',
       'head': 1,
       'id': 110,
       'ner': 'O',
       'orth': 'channel',
       'tag': 'NN'},
      {'dep': 'compound',
       'head': 4,
       'id': 111,
       'ner': 'O',
       'orth': 'blocker',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': 1,
       'id': 112,
       'ner': 'O',
       'orth': '(',
       'tag': '-LRB-'},
      {'dep': 'appos',
       'head': -2,
       'id': 113,
       'ner': 'O',
       'orth': 'CCB',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -1,
       'id': 114,
       'ner': 'O',
       'orth': ')',
       'tag': '-RRB-'},
      {'dep': 'nmod',
       'head': -10,
       'id': 115,
       'ner': 'O',
       'orth': 'verapamil',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -13,
       'id': 116,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'case',
       'head': 4,
       'id': 117,
       'ner': 'O',
       'orth': 'In',
       'tag': 'IN'},
      {'dep': 'amod',
       'head': 3,
       'id': 118,
       'ner': 'O',
       'orth': 'isolated',
       'tag': 'VBN'},
      {'dep': 'amod',
       'head': 2,
       'id': 119,
       'ner': 'O',
       'orth': 'ileal',
       'tag': 'JJ'},
      {'dep': 'amod',
       'head': 1,
       'id': 120,
       'ner': 'O',
       'orth': 'smooth',
       'tag': 'JJ'},
      {'dep': 'nmod',
       'head': 5,
       'id': 121,
       'ner': 'O',
       'orth': 'muscle',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': 4,
       'id': 122,
       'ner': 'O',
       'orth': ',',
       'tag': ','},
      {'dep': 'nsubj',
       'head': 3,
       'id': 123,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'aux',
       'head': 2,
       'id': 124,
       'ner': 'O',
       'orth': 'did',
       'tag': 'VBD'},
      {'dep': 'neg',
       'head': 1,
       'id': 125,
       'ner': 'O',
       'orth': 'not',
       'tag': 'RB'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 126,
       'ner': 'O',
       'orth': 'produce',
       'tag': 'VB'},
      {'dep': 'amod',
       'head': 1,
       'id': 127,
       'ner': 'O',
       'orth': 'direct',
       'tag': 'JJ'},
      {'dep': 'dobj',
       'head': -2,
       'id': 128,
       'ner': 'O',
       'orth': 'contractile',
       'tag': 'NN'},
      {'dep': 'cc',
       'head': -1,
       'id': 129,
       'ner': 'O',
       'orth': 'or',
       'tag': 'CC'},
      {'dep': 'conj',
       'head': -2,
       'id': 130,
       'ner': 'O',
       'orth': 'relaxation',
       'tag': 'NN'},
      {'dep': 'dep',
       'head': -3,
       'id': 131,
       'ner': 'O',
       'orth': 'responses',
       'tag': 'NNS'},
      {'dep': 'cc',
       'head': -6,
       'id': 132,
       'ner': 'O',
       'orth': 'and',
       'tag': 'CC'},
      {'dep': 'aux',
       'head': 2,
       'id': 133,
       'ner': 'O',
       'orth': 'did',
       'tag': 'VBD'},
      {'dep': 'neg',
       'head': 1,
       'id': 134,
       'ner': 'O',
       'orth': 'not',
       'tag': 'RB'},
      {'dep': 'conj',
       'head': -9,
       'id': 135,
       'ner': 'O',
       'orth': 'modify',
       'tag': 'VB'},
      {'dep': 'advmod',
       'head': 1,
       'id': 136,
       'ner': 'O',
       'orth': 'electrically',
       'tag': 'RB'},
      {'dep': 'amod',
       'head': 1,
       'id': 137,
       'ner': 'O',
       'orth': 'elicited',
       'tag': 'VBN'},
      {'dep': 'dobj',
       'head': -3,
       'id': 138,
       'ner': 'O',
       'orth': 'contractions',
       'tag': 'NNS'},
      {'dep': 'cc',
       'head': -1,
       'id': 139,
       'ner': 'O',
       'orth': 'or',
       'tag': 'CC'},
      {'dep': 'amod',
       'head': 2,
       'id': 140,
       'ner': 'O',
       'orth': 'low',
       'tag': 'JJ'},
      {'dep': 'compound',
       'head': 1,
       'id': 141,
       'ner': 'O',
       'orth': 'K(+)-evoked',
       'tag': 'JJ'},
      {'dep': 'conj',
       'head': -4,
       'id': 142,
       'ner': 'O',
       'orth': 'contractions',
       'tag': 'NNS'},
      {'dep': 'punct',
       'head': -17,
       'id': 143,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'det',
       'head': 2,
       'id': 144,
       'ner': 'O',
       'orth': 'The',
       'tag': 'DT'},
      {'dep': 'amod',
       'head': 1,
       'id': 145,
       'ner': 'O',
       'orth': 'submaximal',
       'tag': 'JJ'},
      {'dep': 'nsubjpass',
       'head': 20,
       'id': 146,
       'ner': 'O',
       'orth': 'contractions',
       'tag': 'NNS'},
      {'dep': 'acl',
       'head': -1,
       'id': 147,
       'ner': 'O',
       'orth': 'induced',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 1,
       'id': 148,
       'ner': 'O',
       'orth': 'by',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 149,
       'ner': 'O',
       'orth': 'histamine',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': 1,
       'id': 150,
       'ner': 'O',
       'orth': '(',
       'tag': '-LRB-'},
      {'dep': 'appos',
       'head': -2,
       'id': 151,
       'ner': 'O',
       'orth': 'p<0.001',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -1,
       'id': 152,
       'ner': 'O',
       'orth': ')',
       'tag': '-RRB-'},
      {'dep': 'punct',
       'head': -4,
       'id': 153,
       'ner': 'O',
       'orth': ',',
       'tag': ','},
      {'dep': 'conj',
       'head': -5,
       'id': 154,
       'ner': 'O',
       'orth': 'BaCl2',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': 1,
       'id': 155,
       'ner': 'O',
       'orth': '(',
       'tag': '-LRB-'},
      {'dep': 'appos',
       'head': -2,
       'id': 156,
       'ner': 'O',
       'orth': 'p<0.05',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -1,
       'id': 157,
       'ner': 'O',
       'orth': ')',
       'tag': '-RRB-'},
      {'dep': 'punct',
       'head': -9,
       'id': 158,
       'ner': 'O',
       'orth': ',',
       'tag': ','},
      {'dep': 'cc',
       'head': -10,
       'id': 159,
       'ner': 'O',
       'orth': 'and',
       'tag': 'CC'},
      {'dep': 'conj',
       'head': -11,
       'id': 160,
       'ner': 'O',
       'orth': 'carbachol',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': 1,
       'id': 161,
       'ner': 'O',
       'orth': '(',
       'tag': '-LRB-'},
      {'dep': 'appos',
       'head': -2,
       'id': 162,
       'ner': 'O',
       'orth': 'p<0.01',
       'tag': 'JJ'},
      {'dep': 'punct',
       'head': -1,
       'id': 163,
       'ner': 'O',
       'orth': ')',
       'tag': '-RRB-'},
      {'dep': 'auxpass',
       'head': 2,
       'id': 164,
       'ner': 'O',
       'orth': 'were',
       'tag': 'VBD'},
      {'dep': 'advmod',
       'head': 1,
       'id': 165,
       'ner': 'O',
       'orth': 'significantly',
       'tag': 'RB'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 166,
       'ner': 'O',
       'orth': 'reduced',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 1,
       'id': 167,
       'ner': 'O',
       'orth': 'by',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 168,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -3,
       'id': 169,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'det',
       'head': 2,
       'id': 170,
       'ner': 'O',
       'orth': 'The',
       'tag': 'DT'},
      {'dep': 'amod',
       'head': 1,
       'id': 171,
       'ner': 'O',
       'orth': 'contractile',
       'tag': 'JJ'},
      {'dep': 'nsubjpass',
       'head': 8,
       'id': 172,
       'ner': 'O',
       'orth': 'response',
       'tag': 'NN'},
      {'dep': 'acl',
       'head': -1,
       'id': 173,
       'ner': 'O',
       'orth': 'elicited',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 2,
       'id': 174,
       'ner': 'O',
       'orth': 'by',
       'tag': 'IN'},
      {'dep': 'amod',
       'head': 1,
       'id': 175,
       'ner': 'O',
       'orth': 'high',
       'tag': 'JJ'},
      {'dep': 'nmod',
       'head': -3,
       'id': 176,
       'ner': 'O',
       'orth': 'concentrations',
       'tag': 'NNS'},
      {'dep': 'case',
       'head': 1,
       'id': 177,
       'ner': 'O',
       'orth': 'of',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 178,
       'ner': 'O',
       'orth': 'carbachol',
       'tag': 'NN'},
      {'dep': 'auxpass',
       'head': 1,
       'id': 179,
       'ner': 'O',
       'orth': 'was',
       'tag': 'VBD'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 180,
       'ner': 'O',
       'orth': 'reduced',
       'tag': 'VBN'},
      {'dep': 'cc',
       'head': -1,
       'id': 181,
       'ner': 'O',
       'orth': 'but',
       'tag': 'CC'},
      {'dep': 'neg',
       'head': 1,
       'id': 182,
       'ner': 'O',
       'orth': 'not',
       'tag': 'RB'},
      {'dep': 'conj',
       'head': -3,
       'id': 183,
       'ner': 'O',
       'orth': 'abolished',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 1,
       'id': 184,
       'ner': 'O',
       'orth': 'by',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 185,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -6,
       'id': 186,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'neg',
       'head': 2,
       'id': 187,
       'ner': 'O',
       'orth': 'No',
       'tag': 'DT'},
      {'dep': 'amod',
       'head': 1,
       'id': 188,
       'ner': 'O',
       'orth': 'additive',
       'tag': 'JJ'},
      {'dep': 'nsubjpass',
       'head': 2,
       'id': 189,
       'ner': 'O',
       'orth': 'action',
       'tag': 'NN'},
      {'dep': 'auxpass',
       'head': 1,
       'id': 190,
       'ner': 'O',
       'orth': 'was',
       'tag': 'VBD'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 191,
       'ner': 'O',
       'orth': 'detected',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 1,
       'id': 192,
       'ner': 'O',
       'orth': 'with',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 193,
       'ner': 'O',
       'orth': 'co-incubation',
       'tag': 'NN'},
      {'dep': 'case',
       'head': 1,
       'id': 194,
       'ner': 'O',
       'orth': 'of',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 195,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'cc',
       'head': -1,
       'id': 196,
       'ner': 'O',
       'orth': 'and',
       'tag': 'CC'},
      {'dep': 'conj',
       'head': -2,
       'id': 197,
       'ner': 'O',
       'orth': 'verapamil',
       'tag': 'NN'},
      {'dep': 'case',
       'head': 2,
       'id': 198,
       'ner': 'O',
       'orth': 'on',
       'tag': 'IN'},
      {'dep': 'amod',
       'head': 1,
       'id': 199,
       'ner': 'O',
       'orth': 'carbachol-induced',
       'tag': 'JJ'},
      {'dep': 'nmod',
       'head': -7,
       'id': 200,
       'ner': 'O',
       'orth': 'contraction',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -10,
       'id': 201,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'nsubj',
       'head': 1,
       'id': 202,
       'ner': 'O',
       'orth': '(-)-Carvone',
       'tag': 'NN'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 203,
       'ner': 'O',
       'orth': 'reduced',
       'tag': 'VBD'},
      {'dep': 'det',
       'head': 1,
       'id': 204,
       'ner': 'O',
       'orth': 'the',
       'tag': 'DT'},
      {'dep': 'dobj',
       'head': -2,
       'id': 205,
       'ner': 'O',
       'orth': 'contraction',
       'tag': 'NN'},
      {'dep': 'acl',
       'head': -1,
       'id': 206,
       'ner': 'O',
       'orth': 'induced',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 2,
       'id': 207,
       'ner': 'O',
       'orth': 'by',
       'tag': 'IN'},
      {'dep': 'amod',
       'head': 1,
       'id': 208,
       'ner': 'O',
       'orth': 'high',
       'tag': 'JJ'},
      {'dep': 'nmod',
       'head': -3,
       'id': 209,
       'ner': 'O',
       'orth': 'K(+',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -7,
       'id': 210,
       'ner': 'O',
       'orth': ')',
       'tag': '-RRB-'},
      {'dep': 'cc',
       'head': -8,
       'id': 211,
       'ner': 'O',
       'orth': 'and',
       'tag': 'CC'},
      {'dep': 'cop',
       'head': 5,
       'id': 212,
       'ner': 'O',
       'orth': 'was',
       'tag': 'VBD'},
      {'dep': 'advmod',
       'head': 1,
       'id': 213,
       'ner': 'O',
       'orth': 'almost',
       'tag': 'RB'},
      {'dep': 'nummod',
       'head': 1,
       'id': 214,
       'ner': 'O',
       'orth': '100',
       'tag': 'CD'},
      {'dep': 'nmod:npmod',
       'head': 1,
       'id': 215,
       'ner': 'O',
       'orth': 'times',
       'tag': 'NNS'},
      {'dep': 'advmod',
       'head': 1,
       'id': 216,
       'ner': 'O',
       'orth': 'more',
       'tag': 'RBR'},
      {'dep': 'conj',
       'head': -14,
       'id': 217,
       'ner': 'O',
       'orth': 'potent',
       'tag': 'JJ'},
      {'dep': 'case',
       'head': 1,
       'id': 218,
       'ner': 'O',
       'orth': 'than',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 219,
       'ner': 'O',
       'orth': 'verapamil',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -17,
       'id': 220,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'advmod',
       'head': 3,
       'id': 221,
       'ner': 'O',
       'orth': 'Thus',
       'tag': 'RB'},
      {'dep': 'punct',
       'head': 2,
       'id': 222,
       'ner': 'O',
       'orth': ',',
       'tag': ','},
      {'dep': 'nsubj',
       'head': 1,
       'id': 223,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 224,
       'ner': 'O',
       'orth': 'showed',
       'tag': 'VBD'},
      {'dep': 'det',
       'head': 5,
       'id': 225,
       'ner': 'O',
       'orth': 'a',
       'tag': 'DT'},
      {'dep': 'amod',
       'head': 4,
       'id': 226,
       'ner': 'O',
       'orth': 'typical',
       'tag': 'JJ'},
      {'dep': 'cc',
       'head': -1,
       'id': 227,
       'ner': 'O',
       'orth': 'and',
       'tag': 'CC'},
      {'dep': 'conj',
       'head': -2,
       'id': 228,
       'ner': 'O',
       'orth': 'potent',
       'tag': 'JJ'},
      {'dep': 'amod',
       'head': 1,
       'id': 229,
       'ner': 'O',
       'orth': 'CCB-like',
       'tag': 'JJ'},
      {'dep': 'dobj',
       'head': -6,
       'id': 230,
       'ner': 'O',
       'orth': 'action',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -7,
       'id': 231,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]},
    {'brackets': [],
     'tokens': [{'dep': 'amod',
       'head': 1,
       'id': 232,
       'ner': 'O',
       'orth': 'Many',
       'tag': 'JJ'},
      {'dep': 'nsubjpass',
       'head': 10,
       'id': 233,
       'ner': 'O',
       'orth': 'effects',
       'tag': 'NNS'},
      {'dep': 'acl',
       'head': -1,
       'id': 234,
       'ner': 'O',
       'orth': 'described',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 5,
       'id': 235,
       'ner': 'O',
       'orth': 'for',
       'tag': 'IN'},
      {'dep': 'cc:preconj',
       'head': 1,
       'id': 236,
       'ner': 'O',
       'orth': 'both',
       'tag': 'CC'},
      {'dep': 'compound',
       'head': 3,
       'id': 237,
       'ner': 'O',
       'orth': '(-)-carvone',
       'tag': 'NN'},
      {'dep': 'cc',
       'head': -1,
       'id': 238,
       'ner': 'O',
       'orth': 'and',
       'tag': 'CC'},
      {'dep': 'conj',
       'head': -2,
       'id': 239,
       'ner': 'O',
       'orth': 'spearmint',
       'tag': 'NN'},
      {'dep': 'nmod',
       'head': -6,
       'id': 240,
       'ner': 'O',
       'orth': 'oil',
       'tag': 'NN'},
      {'dep': 'aux',
       'head': 2,
       'id': 241,
       'ner': 'O',
       'orth': 'can',
       'tag': 'MD'},
      {'dep': 'auxpass',
       'head': 1,
       'id': 242,
       'ner': 'O',
       'orth': 'be',
       'tag': 'VB'},
      {'dep': 'ROOT',
       'head': 0,
       'id': 243,
       'ner': 'O',
       'orth': 'explained',
       'tag': 'VBN'},
      {'dep': 'case',
       'head': 3,
       'id': 244,
       'ner': 'O',
       'orth': 'as',
       'tag': 'IN'},
      {'dep': 'det',
       'head': 2,
       'id': 245,
       'ner': 'O',
       'orth': 'a',
       'tag': 'DT'},
      {'dep': 'amod',
       'head': 1,
       'id': 246,
       'ner': 'O',
       'orth': 'CCB-like',
       'tag': 'JJ'},
      {'dep': 'nmod',
       'head': -4,
       'id': 247,
       'ner': 'O',
       'orth': 'mode',
       'tag': 'NN'},
      {'dep': 'case',
       'head': 1,
       'id': 248,
       'ner': 'O',
       'orth': 'of',
       'tag': 'IN'},
      {'dep': 'nmod',
       'head': -2,
       'id': 249,
       'ner': 'O',
       'orth': 'action',
       'tag': 'NN'},
      {'dep': 'punct',
       'head': -7,
       'id': 250,
       'ner': 'O',
       'orth': '.',
       'tag': '.'}]}]}]}