Training spaCy – NameError

Question:

I need to train a spaCy model to improve the accuracy to identify products. I’m struggling with training my spacy model. I have the following code:

TRAIN_DATA = [('..., {'entities': [(36,55,'PRODUCT')]})]
nlp = spacy.load("en_core_web_lg")
ner = nlp.get_pipe("ner")

optimizer = nlp.create_optimizer()
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != "ner"]

with nlp.disable_pipes(*other_pipes): # only train NER
    for itn in range(50):
        random.shuffle(TRAIN_DATA)
        losses = {}
        for text, annotations in TRAIN_DATA:
            doc = nlp.make_doc(text)
            example = Example.from_dict(doc, annotations)
            nlp.update([example], drop=0.25, sgd=optimizer, losses=losses)

but it’s failing due to:

NameError                                 Traceback (most recent call last)
<ipython-input-4-903f2be7114f> in <module>
     15         for text, annotations in TRAIN_DATA:
     16             doc = nlp.make_doc(text)
---> 17             example = Example.from_dict(doc, annotations)
     18             nlp.update([example], drop=0.25, sgd=optimizer, losses=losses)
     19 print(losses)

NameError: name 'Example' is not defined

How do I need to define Example?

Asked By: Malte

||

Answers:

It’s hot here…
thanks for the hint I missed importing:
from spacy.training import Example

when moving the code from Jupyter to Visual Studio Code for the deployment

Answered By: Malte
# 4] Format of the training examples
# training data

TRAIN_DATA = [
              ("Walmart is a leading e-commerce company", {"entities": [(0, 7, "ORG")]}),
              ("I reached Chennai yesterday.", {"entities": [(19, 28, "GPE")]}),
              ("I recently ordered a book from Amazon", {"entities": [(24,32, "ORG")]}),
              ("I was driving a BMW", {"entities": [(16,19, "PRODUCT")]}),
              ("I ordered this from ShopClues", {"entities": [(20,29, "ORG")]}),
              ("Fridge can be ordered in Amazon ", {"entities": [(0,6, "PRODUCT")]}),
              ("I bought a new Washer", {"entities": [(16,22, "PRODUCT")]}),
              ("I bought a old table", {"entities": [(16,21, "PRODUCT")]}),
              ("I bought a fancy dress", {"entities": [(18,23, "PRODUCT")]}),
              ("I rented a camera", {"entities": [(12,18, "PRODUCT")]}),
              ("I rented a tent for our trip", {"entities": [(12,16, "PRODUCT")]}),
              ("I rented a screwdriver from our neighbour", {"entities": [(12,22, "PRODUCT")]}),
              ("I repaired my computer", {"entities": [(15,23, "PRODUCT")]}),
              ("I got my clock fixed", {"entities": [(16,21, "PRODUCT")]}),
              ("I got my truck fixed", {"entities": [(16,21, "PRODUCT")]}),
              ("Flipkart started it's journey from zero", {"entities": [(0,8, "ORG")]}),
              ("I recently ordered from Max", {"entities": [(24,27, "ORG")]}),
              ("Flipkart is recognized as leader in market",{"entities": [(0,8, "ORG")]}),
              ("I recently ordered from Swiggy", {"entities": [(24,29, "ORG")]})
              ]

# Adding labels to the `ner`

for _, annotations in TRAIN_DATA:
  for ent in annotations.get("entities"):
    ner.add_label(ent[2])

    # =======================># 5] Training the NER model
    # Disable pipeline components you dont need to change
    pipe_exceptions = ["ner", "trf_wordpiecer", "trf_tok2vec"]
    unaffected_pipes = [pipe for pipe in nlp.pipe_names if pipe not in pipe_exceptions]
    
    # Import requirements
    import random
    from spacy.util import minibatch, compounding
    from pathlib import Path
    
    # TRAINING THE MODEL
    #from spacy.training import Example
    #with nlp.disable_pipes(*unaffected_pipes):
    
    
    # =======================
    nlp = spacy.blank('en')
    if 'ner' not in nlp.pipe_names:
        ner = nlp.create_pipe('ner')
        nlp.add_pipe('ner', last=True)
    else:
        ner = nlp.get_pipe('ner')
    
    for _, annotations in TRAIN_DATA:
        for label in annotations['entities']:
            ner.add_label(label[2])
    
    # TRAINING THE MODEL
    from spacy.training import Example        
            
    other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
    with nlp.disable_pipes(*other_pipes):
        optimizer = nlp.begin_training()
        for epoch in range(30):
            random.shuffle(TRAIN_DATA)
            losses = {}
            print(f'Epoch {epoch+1} of {30}:')
            for text, annotations in TRAIN_DATA:
                doc = nlp.make_doc(text)
                example = Example.from_dict(doc, annotations)
                nlp.update([example], drop=0.2, sgd=optimizer, losses=losses) #SGD
            print(losses) #Print losses after each epoch
Answered By: robvdw
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.