* Fix code for bag-of-words feature extraction
The _ml.py module had a redundant copy of a function to extract unigram
bag-of-words features, except one had a bug that set values to 0.
Another function allowed extraction of bigram features. Replace all three
with a new function that supports arbitrary ngram sizes and also allows
control of which attribute is used (e.g. ORTH, LOWER, etc).
* Support 'bow' architecture for TextCategorizer
This allows efficient ngram bag-of-words models, which are better when
the classifier needs to run quickly, especially when the texts are long.
Pass architecture="bow" to use it. The extra arguments ngram_size and
attr are also available, e.g. ngram_size=2 means unigram and bigram
features will be extracted.
* Fix size limits in train_textcat example
* Explain architectures better in docs
* Update call to `mkdir()` to create the parents
- Update the call to `output_dir.mkdir()` to also create the parents if needed
* don't automatically create parents but fail fast if cannot create directory
* add signed contributors agreement for retnuh
Currently the TextCategorizer defaults to a fairly complicated model, designed partly around the active learning requirements of Prodigy. The model's a bit slow, and not very GPU-friendly.
This patch implements a straightforward CNN model that still performs pretty well. The replacement model also makes it easy to use the LMAO pretraining, since most of the parameters are in the CNN.
The replacement model has a flag to specify whether labels are mutually exclusive, which defaults to True. This has been a common problem with the text classifier. We'll also now be able to support adding labels to pretrained models again.
Resolves#2934, #2756, #1798, #1748.
* Integrate Python kernel via Binder
* Add live model test for languages with examples
* Update docs and code examples
* Adjust margin (if not bootstrapped)
* Add binder version to global config
* Update terminal and executable code mixins
* Pass attributes through infobox and section
* Hide v-cloak
* Fix example
* Take out model comparison for now
* Add meta text for compat
* Remove chart.js dependency
* Tidy up and simplify JS and port big components over to Vue
* Remove chartjs example
* Add Twitter icon
* Add purple stylesheet option
* Add utility for hand cursor (special cases only)
* Add transition classes
* Add small option for section
* Add thumb object for small round thumbnail images
* Allow unset code block language via "none" value
(workaround to still allow unset language to default to DEFAULT_SYNTAX)
* Pass through attributes
* Add syntax highlighting definitions for Julia, R and Docker
* Add website icon
* Remove user survey from navigation
* Don't hide GitHub icon on small screens
* Make top navigation scrollable on small screens
* Remove old resources page and references to it
* Add Universe
* Add helper functions for better page URL and title
* Update site description
* Increment versions
* Update preview images
* Update mentions of resources
* Fix image
* Fix social images
* Fix problem with cover sizing and floats
* Add divider and move badges into heading
* Add docstrings
* Reference converting section
* Add section on converting word vectors
* Move converting section to custom section and fix formatting
* Remove old fastText example
* Move extensions content to own section
Keep weird ID to not break permalinks for now (we don't want to rewrite URLs if not absolutely necessary)
* Use better component example and add factories section
* Add note on larger model
* Use better example for non-vector
* Remove similarity in context section
Only works via small models with tensors so has always been kind of confusing
* Add note on init-model command
* Fix lightning tour examples and make excutable if possible
* Add spacy train CLI section to train
* Fix formatting and add video
* Fix formatting
* Fix textcat example description (resolves#2246)
* Add dummy file to try resolve conflict
* Delete dummy file
* Tidy up [ci skip]
* Ensure sufficient height of loading container
* Add loading animation to universe
* Update Thebelab build and use better startup message
* Fix asset versioning
* Fix typo [ci skip]
* Add note on project idea label
The TextCategorizer class is supposed to support multi-label
text classification, and allow training data to contain missing
values.
For this to work, the gradient of the loss should be 0 when labels
are missing. Instead, there was no way to actually denote "missing"
in the GoldParse class, and so the TextCategorizer class treated
the label set within gold.cats as complete.
To fix this, we change GoldParse.cats to be a dict instead of a list.
The GoldParse.cats dict should map to floats, with 1. denoting
'present' and 0. denoting 'absent'. Gradients are zeroed for categories
absent from the gold.cats dict. A nice bonus is that you can also set
values between 0 and 1 for partial membership. You can also set numeric
values, if you're using a text classification model that uses an
appropriate loss function.
Unfortunately this is a breaking change; although the functionality
was only recently introduced and hasn't been properly documented
yet. I've updated the example script accordingly.