jsonl error handling

I generated some jsonl for test the NER (following the quick step). I initially had some issues due to the crawler inserting some non URF characters. However, once I got past that, it loaded, and threw the errors below. From a usability point, I don’t think the web server should start if the loaded data is somehow incorrect. Secondly, based on the error messages I have no idea what’s wrong with my jsonl…

(    myenv) REs-MacBook-Pro:~ redevries$ prodigy ner.teach new_personeel_headlines nl_core_news_sm personeel_headlines.jsonl --label PERNEEL
    /Users/redevries/.virtualenvs/myenv/lib/python3.6/site-packages/toolz/itertoolz.py:368: RuntimeWarning: Mean of empty slice.
      return next(iter(seq))
    /Users/redevries/.virtualenvs/myenv/lib/python3.6/site-packages/numpy/core/_methods.py:80: RuntimeWarning: invalid value encountered in double_scalars
      ret = ret.dtype.type(ret / rcount)
    /Users/redevries/.virtualenvs/myenv/lib/python3.6/site-packages/toolz/itertoolz.py:368: RuntimeWarning: Degrees of freedom <= 0 for slice
      return next(iter(seq))
    /Users/redevries/.virtualenvs/myenv/lib/python3.6/site-packages/numpy/core/_methods.py:105: RuntimeWarning: invalid value encountered in true_divide
      arrmean, rcount, out=arrmean, casting='unsafe', subok=False)
    /Users/redevries/.virtualenvs/myenv/lib/python3.6/site-packages/numpy/core/_methods.py:127: RuntimeWarning: invalid value encountered in double_scalars
      ret = ret.dtype.type(ret / rcount)

      ✨  Starting the web server at http://localhost:8080 ...
      Open the app in your browser and start annotating!

Thanks – and I definitely agree! In this case, I guess Prodigy keeps going because the messages you’re seeing are only warnings, not exceptions, which would terminate the process. I just looked into details on that warning and one explanation would be that somewhere in the process, a number ends up being NaN, or something like that.

Could you post an example from your data? I don’t think the problem is related to invalid JSONL formatting, because this would eventually raise an exception, or skip the affected example. Also, what happens when you load the web app? Do you see annotation tasks, or does it show “No tasks available”?

Btw, the good news is, we’ve been working on the error handling for the next release. We’ve also implemented logging functionality, which lets you run Prodigy with PRODIGY_LOGGING=basic or PRODIGY_LOGGING=verbose. This will log the most important events across all components and modules, and the “verbose” mode will also dump the full examples, REST API requests and responses etc. So if Prodigy fails, you’ll be able to see where exactly it happened, and potentially also what lead to it.

is what I get…

{"text": "Anneke Groenenberg treedt per 1 december aan als nieuwe directeur-bestuurder van Zorggroep Liante. Zij volgt interim-bestuurder Aukje van Kalsbeek op die de Friese woon- zorgorganisatie sinds 1 oktober 2016 leidde.", "meta": {"source":"Skipr"}} 
{"text": "Per 1 januari treedt Leo Kusters aan als nieuwe directeur van Automotivenl. Hij volgt Benno Hüsken op, die er dan op een paar maanden na vier jaar op heeft zitten en onder wiens leiding de sectororganisatie van de Nederlandse automotive-industrie is gegroeid van 125 naar 175 leden. Kusters was van 2011 tot 2015 al bestuurder bij Automotivenl en van 2015 tot voor kort managing director urbanisatie bij TNO.", "meta": {"source":"Mechatronica & Machinebouw"}} 
{"text": "Liberty Specialty Markets breidt per 1 december a.s. zijn team aan specialisten verder uit met Jelmer Andela (ex Chubb) als Senior Underwriter Cyber en Saskia Altink als underwriter Beroepsaansprakelijkheid. Volgens Country Manager Benelux Rob Groenen zullen  de komende maanden nog meer benoemingen bekend worden gemaakt.", "meta": {"source":"Risk & Business"}} 
{"text": "General Electric (GE) en Siemens, twee van de grootste industriële conglomeraten ter wereld, kondigden afgelopen week herstructureringen aan. Onder het aandeel GE viel vervolgens de bodem weg. De conglomeraten hebben hetzelfde probleem: de groei is te laag. GE heeft sinds begin deze maand een nieuwe topman. Deze presenteerde afgelopen week  zijn visie voor het bedrijf. Daarbij kregen beleggers meteen een halvering van het dividend voor de kiezen. De reactie was niet mals.", "meta": {"source":"Vereniging van Effectenbezitters"}} 
{"text": "Het Groene Hart Ziekenhuis in Gouda heeft drs. Marlies Telgenkamp benoemd als lid van de raad van bestuur. Zij begint met haar werkzaamheden op 15 januari 2018.Met de benoeming van Telgenkamp (1967) naast bestuursvoorzitter Godfried Barnasconi, is de raad van bestuur van het ziekenhuis compleet.De raad van toezicht is ingenomen met de komst van Telgenkamp.", "meta": {"source":"Boardroom Zorg"}} 
{"text": "Een nieuwe samenstelling, gezamenlijke fruitpromotie en een nieuwe voorzitter. Het Comité Fruit binnen GroentenFruit Huis heeft een veranderingsproces ingezet. GroentenFruitHuis werkt met diverse Comités die het bestuur adviseren en zelfstandig activiteiten kunnen uitvoeren in het belang van een specifieke productgroep. Begin dit jaar heeft Rijnconsult  een onderzoek uitgevoerd naar de huidige en mogelijke toekomstige taken van het Comité Fruit.", "meta": {"source":"AGF-HANDEL"}} 
{"text": "Simulatiespecialist Altair heeft Theo Verbruggen benoemd tot sales director voor de Benelux. In die functie wordt hij verantwoordelijk voor de marktstrategie, alle verkoopactiviteiten en expansie van Altair's klantenkring in de Benelux. Achtergrond Verbruggen was voorheen director global sales bij Simpleware, een leverancier van software voor het genereren van modellen en visualisaties gebaseerd op 3D-CT en MRI-scans.", "meta": {"source":"Engineers Online"}} 
{"text": "Per 1 januari treedt Leo Kusters aan als nieuwe directeur van Automotivenl. Hij volgt Benno Hüsken op, die er dan op een paar maanden na vier jaar op heeft zitten en onder wiens leiding de sectororganisatie van de Nederlandse automotive-industrie is gegroeid van 125 naar 175 leden. Kusters was van 2011 tot 2015 al bestuurder bij Automotivenl en van 2015 tot voor kort managing director urbanisatie bij TNO.", "meta": {"source":"Bits & Chips"}} 
{"text": "Per 1 januari is Eduard Pieter Oud benoemd als zakelijk directeur bij het Modern Contemporary (MOCO) Museum in Amsterdam waarbij hij wordt toegevoegd aan de huidige directie bestaande uit eigenaren en initiatiefnemers Kim en Lionel Logchies. Expositie Moco Museum Oud maakte eerder bekend Amsterdam Marketing, waar hij eveneens werkzaam was als zakelijk directeur, na 10 jaar te verlaten. Hij zal zich vooral bezig houden met de operatie, marketing en sales bij Moco Museum.", "meta": {"source":"Verkeersbureaus"}} 
{"text": "Het Leuvense technologiebedrijf Option gaat zijn uitstaande schulden omzetten aandelen. Het heeft daarover een principeakkoord met de grootste aandeelhouders, zo maakte het maandag bekend. Option krijgt ook een nieuwe CEO en een nieuwe naam. De specialist in het 'internet der dingen' gaf maandag duidelijkheid over de eerder aangekondigde schuldherschikking.", "meta": {"source":"Dutch IT Channel"}}
1 Like

Any idea what I did wrong here?

Ah, so sorry – you edited your post, right? I think I missed that.

Your tasks definitely look correct, so here are the possible explanations I can think of:

  1. In your example above, you’re annotating the label PERNEEL – can you check that the label is definitely added to the model? When you use the --label argument, Prodigy will get spaCy’s predictions and filter out all examples that include entities with that label. But if your model doesn’t predict that label, there won’t be any tasks for you to annotate (see my comment here for a more detailed explanation of this). This is something we’re fixing btw – in the next version, Prodigy will raise an error if a label is not in the model.

  2. How many examples does your personeel_headlines.jsonl set include? By default, ner.teach will resort the stream and only ask you about the examples it’s most unsure about, e.g. the ones with the predictions close to 50/50 (and potentially skip examples with very high/low scores). This will adjust as you annotate – but if there are only very few examples, and they all end up with a very low or very high score, there might not be enough examples for a full batch.

  3. The fact that the error occurs in itertoolz and next(iter(seq)) looks like there might be an empty batch somewhere. What happens if you set "batch_size": 1 in your prodigy.json?

As I said, this will be easier to debug in the future with proper logging, but in the meantime, you could edit the teach() recipe in prodigy.recipes.ner and add a few print statements to see where it’s failing.