From dc5be7d2f35ca34fccbfb9e33ecf9dd7160899c5 Mon Sep 17 00:00:00 2001 From: mollerhoj Date: Mon, 3 Jul 2017 15:40:58 +0200 Subject: [PATCH 001/649] Cleanup list of Danish stopwords --- spacy/lang/da/stop_words.py | 43 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/spacy/lang/da/stop_words.py b/spacy/lang/da/stop_words.py index ac2195f10..ba448f8f3 100644 --- a/spacy/lang/da/stop_words.py +++ b/spacy/lang/da/stop_words.py @@ -1,47 +1,46 @@ # encoding: utf8 from __future__ import unicode_literals - -# Source: https://github.com/stopwords-iso/stopwords-da +# Source: Handpicked by Jens Dahl Møllerhøj. STOP_WORDS = set(""" -ad af aldrig alle alt anden andet andre at +af aldrig alene alle allerede alligevel alt altid anden andet andre at -bare begge blev blive bliver +bag begge blandt blev blive bliver burde bør -da de dem den denne der deres det dette dig din dine disse dit dog du +da de dem den denne dens der derefter deres derfor derfra deri dermed derpå derved det dette dig din dine disse dog du -efter ej eller en end ene eneste enhver er et +efter egen eller ellers en end endnu ene eneste enhver ens enten er et -far fem fik fire flere fleste for fordi forrige fra få får før +flere flest fleste for foran fordi forrige fra få før først -god godt +gennem gjorde gjort god gør gøre gørende -ham han hans har havde have hej helt hende hendes her hos hun hvad hvem hver -hvilken hvis hvor hvordan hvorfor hvornår +ham han hans har havde have hel heller hen hende hendes henover her herefter heri hermed herpå hun hvad hvem hver hvilke hvilken hvilkes hvis hvor hvordan hvorefter hvorfor hvorfra hvorhen hvori hvorimod hvornår hvorved -i ikke ind ingen intet +i igen igennem ikke imellem imens imod ind indtil ingen intet -ja jeg jer jeres jo +jeg jer jeres jo -kan kom komme kommer kun kunne +kan kom kommer kun kunne -lad lav lidt lige lille +lad langs lav lave lavet lidt lige ligesom lille længere -man mand mange med meget men mens mere mig min mine mit mod må +man mange med meget mellem men mens mere mest mig min mindre mindst mine mit må måske -ned nej ni nogen noget nogle nu ny nyt når nær næste næsten +ned nemlig nogen nogensinde noget nogle nok nu ny nyt nær næste næsten -og også okay om op os otte over +og også om omkring op os over overalt på -se seks selv ser ses sig sige sin sine sit skal skulle som stor store syv så -sådan +samme sammen selv selvom senere ses siden sig sige skal skulle som stadig synes syntes så sådan således -tag tage thi ti til to tre +temmelig tidligere til tilbage tit -ud under +ud uden udover under undtagen -var ved vi vil ville vor vores være været +var ved vi via vil ville vore vores vær være været + +øvrigt """.split()) From 23025d3b05572a840ec91301092f8bee68cb1753 Mon Sep 17 00:00:00 2001 From: mollerhoj Date: Mon, 3 Jul 2017 15:41:59 +0200 Subject: [PATCH 002/649] Clean up a couple of strange English stopwords --- spacy/lang/en/stop_words.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/en/stop_words.py b/spacy/lang/en/stop_words.py index 640940fea..394731ff1 100644 --- a/spacy/lang/en/stop_words.py +++ b/spacy/lang/en/stop_words.py @@ -16,7 +16,7 @@ call can cannot ca could did do does doing done down due during -each eight either eleven else elsewhere empty enough etc even ever every +each eight either eleven else elsewhere empty enough even ever every everyone everything everywhere except few fifteen fifty first five for former formerly forty four from front full @@ -27,7 +27,7 @@ get give go had has have he hence her here hereafter hereby herein hereupon hers herself him himself his how however hundred -i if in inc indeed into is it its itself +i if in indeed into is it its itself keep From e8400776012931e414599905b8d2923fe78ab458 Mon Sep 17 00:00:00 2001 From: mollerhoj Date: Mon, 3 Jul 2017 15:43:06 +0200 Subject: [PATCH 003/649] Add some basic tests for Danish --- spacy/tests/conftest.py | 3 +++ spacy/tests/lang/da/__init__.py | 0 spacy/tests/lang/da/test_exceptions.py | 15 ++++++++++++++ spacy/tests/lang/da/test_text.py | 27 ++++++++++++++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 spacy/tests/lang/da/__init__.py create mode 100644 spacy/tests/lang/da/test_exceptions.py create mode 100644 spacy/tests/lang/da/test_text.py diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index 200f9ff4f..b6232970a 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -105,6 +105,9 @@ def he_tokenizer(): def nb_tokenizer(): return util.get_lang_class('nb').Defaults.create_tokenizer() +@pytest.fixture +def da_tokenizer(): + return util.get_lang_class('da').Defaults.create_tokenizer() @pytest.fixture def stringstore(): diff --git a/spacy/tests/lang/da/__init__.py b/spacy/tests/lang/da/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/da/test_exceptions.py b/spacy/tests/lang/da/test_exceptions.py new file mode 100644 index 000000000..d89fafd2c --- /dev/null +++ b/spacy/tests/lang/da/test_exceptions.py @@ -0,0 +1,15 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import pytest + +@pytest.mark.parametrize('text', ["ca.", "m.a.o.", "Jan.", "Dec."]) +def test_da_tokenizer_handles_abbr(da_tokenizer, text): + tokens = da_tokenizer(text) + assert len(tokens) == 1 + +def test_da_tokenizer_handles_exc_in_text(da_tokenizer): + text = "Det er bl.a. ikke meningen" + tokens = da_tokenizer(text) + assert len(tokens) == 5 + assert tokens[2].text == "bl.a." diff --git a/spacy/tests/lang/da/test_text.py b/spacy/tests/lang/da/test_text.py new file mode 100644 index 000000000..fa6a935f6 --- /dev/null +++ b/spacy/tests/lang/da/test_text.py @@ -0,0 +1,27 @@ +# coding: utf-8 +"""Test that longer and mixed texts are tokenized correctly.""" + + +from __future__ import unicode_literals + +import pytest + +def test_da_tokenizer_handles_long_text(da_tokenizer): + text = """Der var så dejligt ude på landet. Det var sommer, kornet stod gult, havren grøn, +høet var rejst i stakke nede i de grønne enge, og der gik storken på sine lange, +røde ben og snakkede ægyptisk, for det sprog havde han lært af sin moder. + +Rundt om ager og eng var der store skove, og midt i skovene dybe søer; jo, der var rigtignok dejligt derude på landet!""" + tokens = da_tokenizer(text) + assert len(tokens) == 84 + +@pytest.mark.parametrize('text,match', [ + ('10', True), ('1', True), ('10.000', True), ('10.00', True), + ('999,0', True), ('en', True), ('treoghalvfemsindstyvende', True), ('hundrede', True), + ('hund', False), (',', False), ('1/2', True)]) +def test_lex_attrs_like_number(da_tokenizer, text, match): + tokens = da_tokenizer(text) + assert len(tokens) == 1 + print(tokens[0]) + assert tokens[0].like_num == match + From e8f40ceed8d259df3102dc68bbb13cdb34d704f1 Mon Sep 17 00:00:00 2001 From: mollerhoj Date: Mon, 3 Jul 2017 15:44:17 +0200 Subject: [PATCH 004/649] Add short names of months to tokenizer_exceptions --- spacy/lang/da/tokenizer_exceptions.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/spacy/lang/da/tokenizer_exceptions.py b/spacy/lang/da/tokenizer_exceptions.py index fbfbbad86..6bf9ab669 100644 --- a/spacy/lang/da/tokenizer_exceptions.py +++ b/spacy/lang/da/tokenizer_exceptions.py @@ -1,11 +1,27 @@ # encoding: utf8 from __future__ import unicode_literals -from ...symbols import ORTH, LEMMA +from ...symbols import ORTH, LEMMA, NORM _exc = {} +for exc_data in [ + {ORTH: "Kbh.", LEMMA: "København", NORM: "København"}, + + {ORTH: "Jan.", LEMMA: "januar", NORM: "januar"}, + {ORTH: "Feb.", LEMMA: "februar", NORM: "februar"}, + {ORTH: "Mar.", LEMMA: "marts", NORM: "marts"}, + {ORTH: "Apr.", LEMMA: "april", NORM: "april"}, + {ORTH: "Maj.", LEMMA: "maj", NORM: "maj"}, + {ORTH: "Jun.", LEMMA: "juni", NORM: "juni"}, + {ORTH: "Jul.", LEMMA: "juli", NORM: "juli"}, + {ORTH: "Aug.", LEMMA: "august", NORM: "august"}, + {ORTH: "Sep.", LEMMA: "september", NORM: "september"}, + {ORTH: "Okt.", LEMMA: "oktober", NORM: "oktober"}, + {ORTH: "Nov.", LEMMA: "november", NORM: "november"}, + {ORTH: "Dec.", LEMMA: "december", NORM: "december"}]: + _exc[exc_data[ORTH]] = [dict(exc_data)] for orth in [ "A/S", "beg.", "bl.a.", "ca.", "d.s.s.", "dvs.", "f.eks.", "fr.", "hhv.", From 3b2cb107a37804b89792b1993088e59a78d26323 Mon Sep 17 00:00:00 2001 From: mollerhoj Date: Mon, 3 Jul 2017 15:45:31 +0200 Subject: [PATCH 005/649] Add like_num functionality to Danish --- spacy/lang/da/__init__.py | 2 ++ spacy/lang/da/lex_attrs.py | 52 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 spacy/lang/da/lex_attrs.py diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py index 99babdc2c..1dc4d4820 100644 --- a/spacy/lang/da/__init__.py +++ b/spacy/lang/da/__init__.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .stop_words import STOP_WORDS +from .lex_attrs import LEX_ATTRS from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS @@ -13,6 +14,7 @@ from ...util import update_exc, add_lookups class DanishDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters.update(LEX_ATTRS) lex_attr_getters[LANG] = lambda text: 'da' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) diff --git a/spacy/lang/da/lex_attrs.py b/spacy/lang/da/lex_attrs.py new file mode 100644 index 000000000..8152ad259 --- /dev/null +++ b/spacy/lang/da/lex_attrs.py @@ -0,0 +1,52 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...attrs import LIKE_NUM + +# Source http://fjern-uv.dk/tal.php + +_num_words = """nul +en et to tre fire fem seks syv otte ni ti +elleve tolv tretten fjorten femten seksten sytten atten nitten tyve +enogtyve toogtyve treogtyve fireogtyve femogtyve seksogtyve syvogtyve otteogtyve niogtyve tredive +enogtredive toogtredive treogtredive fireogtredive femogtredive seksogtredive syvogtredive otteogtredive niogtredive fyrre +enogfyrre toogfyrre treogfyrre fireogfyrre femgogfyrre seksogfyrre syvogfyrre otteogfyrre niogfyrre halvtreds +enoghalvtreds tooghalvtreds treoghalvtreds fireoghalvtreds femoghalvtreds seksoghalvtreds syvoghalvtreds otteoghalvtreds nioghalvtreds tres +enogtres toogtres treogtres fireogtres femogtres seksogtres syvogtres otteogtres niogtres halvfjerds +enoghalvfjerds tooghalvfjerds treoghalvfjerds fireoghalvfjerds femoghalvfjerds seksoghalvfjerds syvoghalvfjerds otteoghalvfjerds nioghalvfjerds firs +enogfirs toogfirs treogfirs fireogfirs femogfirs seksogfirs syvogfirs otteogfirs niogfirs halvfems +enoghalvfems tooghalvfems treoghalvfems fireoghalvfems femoghalvfems seksoghalvfems syvoghalvfems otteoghalvfems nioghalvfems hundrede +million milliard billion billiard trillion trilliard +""".split() + +# source http://www.duda.dk/video/dansk/grammatik/talord/talord.html + +_ordinal_words = """nulte +første anden tredje fjerde femte sjette syvende ottende niende tiende +elfte tolvte trettende fjortende femtende sekstende syttende attende nittende tyvende +enogtyvende toogtyvende treogtyvende fireogtyvende femogtyvende seksogtyvende syvogtyvende otteogtyvende niogtyvende tredivte enogtredivte toogtredivte treogtredivte fireogtredivte femogtredivte seksogtredivte syvogtredivte otteogtredivte niogtredivte fyrretyvende +enogfyrretyvende toogfyrretyvende treogfyrretyvende fireogfyrretyvende femogfyrretyvende seksogfyrretyvende syvogfyrretyvende otteogfyrretyvende niogfyrretyvende halvtredsindstyvende enoghalvtredsindstyvende +tooghalvtredsindstyvende treoghalvtredsindstyvende fireoghalvtredsindstyvende femoghalvtredsindstyvende seksoghalvtredsindstyvende syvoghalvtredsindstyvende otteoghalvtredsindstyvende nioghalvtredsindstyvende +tresindstyvende enogtresindstyvende toogtresindstyvende treogtresindstyvende fireogtresindstyvende femogtresindstyvende seksogtresindstyvende syvogtresindstyvende otteogtresindstyvende niogtresindstyvende halvfjerdsindstyvende +enoghalvfjerdsindstyvende tooghalvfjerdsindstyvende treoghalvfjerdsindstyvende fireoghalvfjerdsindstyvende femoghalvfjerdsindstyvende seksoghalvfjerdsindstyvende syvoghalvfjerdsindstyvende otteoghalvfjerdsindstyvende nioghalvfjerdsindstyvende firsindstyvende +enogfirsindstyvende toogfirsindstyvende treogfirsindstyvende fireogfirsindstyvende femogfirsindstyvende seksogfirsindstyvende syvogfirsindstyvende otteogfirsindstyvende niogfirsindstyvende halvfemsindstyvende +enoghalvfemsindstyvende tooghalvfemsindstyvende treoghalvfemsindstyvende fireoghalvfemsindstyvende femoghalvfemsindstyvende seksoghalvfemsindstyvende syvoghalvfemsindstyvende otteoghalvfemsindstyvende nioghalvfemsindstyvende +""".split() + +def like_num(text): + text = text.replace(',', '').replace('.', '') + if text.isdigit(): + return True + if text.count('/') == 1: + num, denom = text.split('/') + if num.isdigit() and denom.isdigit(): + return True + if text in _num_words: + return True + if text in _ordinal_words: + return True + return False + +LEX_ATTRS = { + LIKE_NUM: like_num +} From 64c732918a39907860d4107b9d25281152b32fe1 Mon Sep 17 00:00:00 2001 From: mollerhoj Date: Mon, 3 Jul 2017 15:49:09 +0200 Subject: [PATCH 006/649] Add Morph_rules. (TODO: Not working?) --- spacy/lang/da/__init__.py | 2 ++ spacy/lang/da/morph_rules.py | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 spacy/lang/da/morph_rules.py diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py index 1dc4d4820..d83ad8048 100644 --- a/spacy/lang/da/__init__.py +++ b/spacy/lang/da/__init__.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .stop_words import STOP_WORDS from .lex_attrs import LEX_ATTRS +from .morph_rules import MORPH_RULES from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS @@ -19,6 +20,7 @@ class DanishDefaults(Language.Defaults): lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) + #morph_rules = dict(MORPH_RULES) stop_words = set(STOP_WORDS) diff --git a/spacy/lang/da/morph_rules.py b/spacy/lang/da/morph_rules.py new file mode 100644 index 000000000..b365bf871 --- /dev/null +++ b/spacy/lang/da/morph_rules.py @@ -0,0 +1,41 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...symbols import LEMMA +from ...deprecated import PRON_LEMMA + +MORPH_RULES = { + "PRON": { + "jeg": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Sing", "Case": "Nom"}, + "mig": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Sing", "Case": "Acc"}, + "du": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Two"}, + "han": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Masc", "Case": "Nom"}, + "ham": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Masc", "Case": "Acc"}, + "hun": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Fem", "Case": "Nom"}, + "hende": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Fem", "Case": "Acc"}, + "den": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Neut"}, + "det": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Neut"}, + "vi": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Plur", "Case": "Nom"}, + "os": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Plur", "Case": "Acc"}, + "de": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Plur", "Case": "Nom"}, + "dem": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Plur", "Case": "Acc"}, + + "min": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Sing", "Poss": "Yes", "Reflex": "Yes"}, + "din": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Two", "Number": "Sing", "Poss": "Yes", "Reflex": "Yes"}, + "hans": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Masc", "Poss": "Yes", "Reflex": "Yes"}, + "hendes": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Fem", "Poss": "Yes", "Reflex": "Yes"}, + "dens": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Neut", "Poss": "Yes", "Reflex": "Yes"}, + "dets": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Sing", "Gender": "Neut", "Poss": "Yes", "Reflex": "Yes"}, + "vores": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "One", "Number": "Plur", "Poss": "Yes", "Reflex": "Yes"}, + "deres": {LEMMA: PRON_LEMMA, "PronType": "Prs", "Person": "Three", "Number": "Plur", "Poss": "Yes", "Reflex": "Yes"}, + }, + + "VERB": { + "er": {LEMMA: "være", "VerbForm": "Fin", "Tense": "Pres"}, + "var": {LEMMA: "være", "VerbForm": "Fin", "Tense": "Past"} + } +} + +for tag, rules in MORPH_RULES.items(): + for key, attrs in dict(rules).items(): + rules[key.title()] = attrs From 85144835dab55336e07f5c806f3cd54911fea9e2 Mon Sep 17 00:00:00 2001 From: mollerhoj Date: Mon, 3 Jul 2017 15:51:58 +0200 Subject: [PATCH 007/649] Add Tag_map for Danish --- spacy/lang/da/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py index d83ad8048..5f6cb867b 100644 --- a/spacy/lang/da/__init__.py +++ b/spacy/lang/da/__init__.py @@ -5,6 +5,7 @@ from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .stop_words import STOP_WORDS from .lex_attrs import LEX_ATTRS from .morph_rules import MORPH_RULES +from ..tag_map import TAG_MAP from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS @@ -21,6 +22,7 @@ class DanishDefaults(Language.Defaults): tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) #morph_rules = dict(MORPH_RULES) + tag_map = dict(TAG_MAP) stop_words = set(STOP_WORDS) From e920885676c6e7019fdd2891b2173aa630d54c6b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 2 Sep 2017 12:46:01 -0500 Subject: [PATCH 008/649] Fix pickle during train --- spacy/cli/train.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index ddec2c069..b2c87d2b5 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -80,6 +80,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, n_train_words = corpus.count_train() optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) + nlp._optimizer = None print("Itn.\tLoss\tUAS\tNER P.\tNER R.\tNER F.\tTag %\tToken %") try: From b8e81daccfd0ccf1388a7538ffcd9e6489e8d9ec Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Thu, 14 Sep 2017 12:49:59 +0200 Subject: [PATCH 009/649] Fix typo (closes #1312) --- website/docs/usage/customizing-tokenizer.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/usage/customizing-tokenizer.jade b/website/docs/usage/customizing-tokenizer.jade index 7e0b4b479..0bc81771d 100644 --- a/website/docs/usage/customizing-tokenizer.jade +++ b/website/docs/usage/customizing-tokenizer.jade @@ -282,7 +282,7 @@ p def __call__(self, text): words = text.split(' ') # All tokens 'own' a subsequent space character in this tokenizer - spaces = [True] * len(word) + spaces = [True] * len(words) return Doc(self.vocab, words=words, spaces=spaces) p From ba23d63c35bf9187f093804f93af4fd345cfa1e3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 13:37:41 +0200 Subject: [PATCH 010/649] Fix minibatch function, for fixed batch size --- spacy/gold.pyx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spacy/gold.pyx b/spacy/gold.pyx index f00d04109..fc8d6622b 100644 --- a/spacy/gold.pyx +++ b/spacy/gold.pyx @@ -7,6 +7,7 @@ import re import ujson import random import cytoolz +import itertools from .syntax import nonproj from .util import ensure_path @@ -146,9 +147,13 @@ def minibatch(items, size=8): '''Iterate over batches of items. `size` may be an iterator, so that batch-size can vary on each step. ''' + if isinstance(size, int): + size_ = itertools.repeat(8) + else: + size_ = size items = iter(items) while True: - batch_size = next(size) #if hasattr(size, '__next__') else size + batch_size = next(size_) batch = list(cytoolz.take(int(batch_size), items)) if len(batch) == 0: break From 9cb2aef5877b342ef44cd77386328ee91039088e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 13:38:28 +0200 Subject: [PATCH 011/649] Remove print statement --- spacy/lemmatizer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py index 3a04a471d..312c8db72 100644 --- a/spacy/lemmatizer.py +++ b/spacy/lemmatizer.py @@ -25,7 +25,6 @@ class Lemmatizer(object): elif univ_pos == PUNCT: univ_pos = 'punct' # See Issue #435 for example of where this logic is requied. - print("Check base form", string) if self.is_base_form(univ_pos, morphology): return set([string.lower()]) lemmas = lemmatize(string, self.index.get(univ_pos, {}), From 683d81bb49096867f5ad8d3dde23217ea54d6790 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:15:59 +0200 Subject: [PATCH 012/649] Update example for adding entity type --- examples/training/train_new_entity_type.py | 87 ++++++++++------------ 1 file changed, 40 insertions(+), 47 deletions(-) diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py index 4eae11c75..ab69285a6 100644 --- a/examples/training/train_new_entity_type.py +++ b/examples/training/train_new_entity_type.py @@ -25,7 +25,7 @@ For more details, see the documentation: * Saving and loading models: https://spacy.io/docs/usage/saving-loading Developed for: spaCy 1.7.6 -Last tested for: spaCy 1.7.6 +Last updated for: spaCy 2.0.0a13 """ from __future__ import unicode_literals, print_function @@ -34,55 +34,41 @@ from pathlib import Path import random import spacy -from spacy.gold import GoldParse -from spacy.tagger import Tagger +from spacy.gold import GoldParse, minibatch +from spacy.pipeline import NeuralEntityRecognizer +from spacy.pipeline import TokenVectorEncoder +def get_gold_parses(tokenizer, train_data): + '''Shuffle and create GoldParse objects''' + random.shuffle(train_data) + for raw_text, entity_offsets in train_data: + doc = tokenizer(raw_text) + gold = GoldParse(doc, entities=entity_offsets) + yield doc, gold + + def train_ner(nlp, train_data, output_dir): - # Add new words to vocab - for raw_text, _ in train_data: - doc = nlp.make_doc(raw_text) - for word in doc: - _ = nlp.vocab[word.orth] random.seed(0) - # You may need to change the learning rate. It's generally difficult to - # guess what rate you should set, especially when you have limited data. - nlp.entity.model.learn_rate = 0.001 - for itn in range(1000): - random.shuffle(train_data) - loss = 0. - for raw_text, entity_offsets in train_data: - gold = GoldParse(doc, entities=entity_offsets) - # By default, the GoldParse class assumes that the entities - # described by offset are complete, and all other words should - # have the tag 'O'. You can tell it to make no assumptions - # about the tag of a word by giving it the tag '-'. - # However, this allows a trivial solution to the current - # learning problem: if words are either 'any tag' or 'ANIMAL', - # the model can learn that all words can be tagged 'ANIMAL'. - #for i in range(len(gold.ner)): - #if not gold.ner[i].endswith('ANIMAL'): - # gold.ner[i] = '-' - doc = nlp.make_doc(raw_text) - nlp.tagger(doc) - # As of 1.9, spaCy's parser now lets you supply a dropout probability - # This might help the model generalize better from only a few - # examples. - loss += nlp.entity.update(doc, gold, drop=0.9) - if loss == 0: - break - # This step averages the model's weights. This may or may not be good for - # your situation --- it's empirical. - nlp.end_training() - if output_dir: - if not output_dir.exists(): - output_dir.mkdir() - nlp.save_to_directory(output_dir) + optimizer = nlp.begin_training(lambda: []) + nlp.meta['name'] = 'en_ent_animal' + for itn in range(50): + losses = {} + for batch in minibatch(get_gold_parses(nlp.make_doc, train_data), size=3): + docs, golds = zip(*batch) + nlp.update(docs, golds, losses=losses, sgd=optimizer, update_shared=True, + drop=0.35) + print(losses) + if not output_dir: + return + elif not output_dir.exists(): + output_dir.mkdir() + nlp.to_disk(output_dir) def main(model_name, output_directory=None): - print("Loading initial model", model_name) - nlp = spacy.load(model_name) + print("Creating initial model", model_name) + nlp = spacy.blank(model_name) if output_directory is not None: output_directory = Path(output_directory) @@ -91,6 +77,11 @@ def main(model_name, output_directory=None): "Horses are too tall and they pretend to care about your feelings", [(0, 6, 'ANIMAL')], ), + ( + "Do they bite?", + [], + ), + ( "horses are too tall and they pretend to care about your feelings", [(0, 6, 'ANIMAL')] @@ -109,18 +100,20 @@ def main(model_name, output_directory=None): ) ] - nlp.entity.add_label('ANIMAL') + nlp.pipeline.append(TokenVectorEncoder(nlp.vocab)) + nlp.pipeline.append(NeuralEntityRecognizer(nlp.vocab)) + nlp.pipeline[-1].add_label('ANIMAL') train_ner(nlp, train_data, output_directory) # Test that the entity is recognized - doc = nlp('Do you like horses?') + text = 'Do you like horses?' print("Ents in 'Do you like horses?':") + doc = nlp(text) for ent in doc.ents: print(ent.label_, ent.text) if output_directory: print("Loading from", output_directory) - nlp2 = spacy.load('en', path=output_directory) - nlp2.entity.add_label('ANIMAL') + nlp2 = spacy.load(output_directory) doc2 = nlp2('Do you like horses?') for ent in doc2.ents: print(ent.label_, ent.text) From daf869ab3b02a6e3ab36fe6b2bf5e4c7c0a72049 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:16:41 +0200 Subject: [PATCH 013/649] Fix add_action for NER, so labelled 'O' actions aren't added --- spacy/syntax/ner.pyx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 2f5cd4e48..11b429aa2 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -220,6 +220,31 @@ cdef class BiluoPushDown(TransitionSystem): raise Exception(move) return t + def add_action(self, int action, label_name): + cdef attr_t label_id + if not isinstance(label_name, (int, long)): + label_id = self.strings.add(label_name) + else: + label_id = label_name + if action == OUT and label_id != 0: + return + if action == MISSING or action == ISNT: + return + # Check we're not creating a move we already have, so that this is + # idempotent + for trans in self.c[:self.n_moves]: + if trans.move == action and trans.label == label_id: + return 0 + if self.n_moves >= self._size: + self._size *= 2 + self.c = self.mem.realloc(self.c, self._size * sizeof(self.c[0])) + self.c[self.n_moves] = self.init_transition(self.n_moves, action, label_id) + assert self.c[self.n_moves].label == label_id + self.n_moves += 1 + return 1 + + + cdef int initialize_state(self, StateC* st) nogil: # This is especially necessary when we use limited training data. for i in range(st.length): From c6395b057a6cd65fe931f5b9b8aece35e94f16d7 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:18:02 +0200 Subject: [PATCH 014/649] Improve parser feature extraction, for missing values --- spacy/syntax/_state.pxd | 13 +++++++++---- spacy/syntax/nn_parser.pyx | 16 +++++++++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 3da9e5d4c..9a08691de 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -101,9 +101,10 @@ cdef cppclass StateC: elif n == 6: if this.B(0) >= 0: ids[0] = this.B(0) + ids[1] = this.B(0)-1 else: ids[0] = -1 - ids[1] = this.B(0) + ids[1] = -1 ids[2] = this.B(1) ids[3] = this.E(0) if ids[3] >= 1: @@ -118,8 +119,12 @@ cdef cppclass StateC: # TODO error =/ pass for i in range(n): + # Token vectors should be padded, so that there's a vector for + # missing values at the start. if ids[i] >= 0: - ids[i] += this.offset + ids[i] += this.offset + 1 + else: + ids[i] = 0 int S(int i) nogil const: if i >= this._s_i: @@ -162,9 +167,9 @@ cdef cppclass StateC: int E(int i) nogil const: if this._e_i <= 0 or this._e_i >= this.length: - return 0 + return -1 if i < 0 or i >= this._e_i: - return 0 + return -1 return this._ents[this._e_i - (i+1)].start int L(int i, int idx) nogil const: diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 552ea4f8f..ad6ed280e 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -394,7 +394,7 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - + tokvecs = self._pad_tokvecs(tokvecs) nr_state = len(docs) nr_class = self.moves.n_moves nr_dim = tokvecs.shape[1] @@ -454,6 +454,7 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + tokvecs = self._pad_tokvecs(tokvecs) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -534,6 +535,8 @@ cdef class Parser: tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) tokvecs = self.model[0].ops.flatten(tokvecs) + tokvecs = self._pad_tokvecs(tokvecs) + cuda_stream = get_cuda_stream() states, golds, max_steps = self._init_gold_batch(docs, golds) @@ -583,6 +586,7 @@ cdef class Parser: break self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) + d_tokvecs = self._unpad_tokvecs(d_tokvecs) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) if USE_FINE_TUNE: d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) @@ -639,10 +643,20 @@ cdef class Parser: d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) + d_tokvecs = self._unpad_tokvecs(d_tokvecs) if USE_FINE_TUNE: d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs + def _pad_tokvecs(self, tokvecs): + # Add a vector for missing values at the start of tokvecs + xp = get_array_module(tokvecs) + pad = xp.zeros((1, tokvecs.shape[1]), dtype=tokvecs.dtype) + return xp.vstack((pad, tokvecs)) + + def _unpad_tokvecs(self, d_tokvecs): + return d_tokvecs[1:] + def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long doc will get multiple states. Let's say we have a doc of length 2*N, From 70da88a3a74e17b0c15fd9224c025a5c556625aa Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:18:30 +0200 Subject: [PATCH 015/649] Update comment on Language.begin_training --- spacy/language.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 66b42ff94..e6a5304dd 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -347,15 +347,9 @@ class Language(object): """Allocate models, pre-process training data and acquire a trainer and optimizer. Used as a contextmanager. - gold_tuples (iterable): Gold-standard training data. + get_gold_tuples (function): Function returning gold data **cfg: Config parameters. - YIELDS (tuple): A trainer and an optimizer. - - EXAMPLE: - >>> with nlp.begin_training(gold, use_gpu=True) as (trainer, optimizer): - >>> for epoch in trainer.epochs(gold): - >>> for docs, golds in epoch: - >>> state = nlp.update(docs, golds, sgd=optimizer) + returns: An optimizer """ if self.parser: self.pipeline.append(NeuralLabeller(self.vocab)) From d1518027a980f57d6ee88d6d99e161267ab9ad25 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:18:46 +0200 Subject: [PATCH 016/649] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index d566fbb1f..40444ffd1 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a13' +__version__ = '2.0.0a14' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 664c5af745786312725917cd9a44418777868350 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:59:25 +0200 Subject: [PATCH 017/649] Revert padding in parser --- spacy/syntax/_state.pxd | 6 ++---- spacy/syntax/nn_parser.pyx | 6 ------ 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 9a08691de..4fb16881a 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -119,12 +119,10 @@ cdef cppclass StateC: # TODO error =/ pass for i in range(n): - # Token vectors should be padded, so that there's a vector for - # missing values at the start. if ids[i] >= 0: - ids[i] += this.offset + 1 + ids[i] += this.offset else: - ids[i] = 0 + ids[i] = -1 int S(int i) nogil const: if i >= this._s_i: diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index ad6ed280e..3ea17f2fe 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -394,7 +394,6 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - tokvecs = self._pad_tokvecs(tokvecs) nr_state = len(docs) nr_class = self.moves.n_moves nr_dim = tokvecs.shape[1] @@ -454,7 +453,6 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - tokvecs = self._pad_tokvecs(tokvecs) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -527,7 +525,6 @@ cdef class Parser: if losses is not None and self.name not in losses: losses[self.name] = 0. docs, tokvec_lists = docs_tokvecs - tokvecs = self.model[0].ops.flatten(tokvec_lists) if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] @@ -535,7 +532,6 @@ cdef class Parser: tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) tokvecs = self.model[0].ops.flatten(tokvecs) - tokvecs = self._pad_tokvecs(tokvecs) cuda_stream = get_cuda_stream() @@ -586,7 +582,6 @@ cdef class Parser: break self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) - d_tokvecs = self._unpad_tokvecs(d_tokvecs) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) if USE_FINE_TUNE: d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) @@ -643,7 +638,6 @@ cdef class Parser: d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) - d_tokvecs = self._unpad_tokvecs(d_tokvecs) if USE_FINE_TUNE: d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs From 8c503487af306e4ca1fc93372c28cecebede95ca Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:59:45 +0200 Subject: [PATCH 018/649] Fix lookup of missing NER actions --- spacy/syntax/ner.pyx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 11b429aa2..1a174aba8 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -161,8 +161,7 @@ cdef class BiluoPushDown(TransitionSystem): cdef Transition lookup_transition(self, object name) except *: cdef attr_t label if name == '-' or name == None: - move_str = 'M' - label = 0 + return Transition(clas=0, move=MISSING, label=0, score=0) elif name == '!O': return Transition(clas=0, move=ISNT, label=0, score=0) elif '-' in name: From 18347ab69ceb4d57a87269bd141b300081b82983 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 19:07:35 +0200 Subject: [PATCH 019/649] Implement AddHistory layer wrapper --- spacy/_ml.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index 003541f4b..d3c82897f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -78,6 +78,37 @@ def add_tuples(X, drop=0.): return (vals1+vals2, length), add_tuples_bwd +def AddHistory(layer, decay=0.0001): + ops = layer.ops + nonlocals = [] + if layer.nI: + average_inputs = ops.allocate((layer.nO, layer.nI-layer.nO)) + nonlocals = [] + def history_fwd(X, drop=0.): + if not nonlocals: + nonlocals.append(ops.allocate((layer.nO, X.shape[1]))) + model.history = nonlocals[0] + average_inputs = nonlocals[0] + hist = ops.xp.tensordot(X, average_inputs, axes=[[1], [1]]) + X_hist = ops.xp.hstack((X, hist)) + Y, bp_Y = layer.begin_update(X_hist, drop=drop) + for i in range(Y.shape[0]): + amax = Y[i].argmax() + average_inputs[amax] *= 1-decay + average_inputs[amax] += decay * X[i] + def history_bwd(dY, sgd=None): + dX_hist = bp_Y(dY, sgd=sgd) + dX = dX_hist[:, :X.shape[1]] + return dX + return Y, history_bwd + model = wrap(history_fwd, layer) + if layer.nI: + model.history = average_inputs + else: + model.history = None + return model + + def _zero_init(model): def _zero_init_impl(self, X, y): self.W.fill(0) From bd3da3d6fb8626613e7ee76931ea6ae67786011e Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Thu, 14 Sep 2017 19:23:13 +0200 Subject: [PATCH 020/649] Port over change from #1323 and tidy up --- spacy/lang/zh/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/zh/__init__.py b/spacy/lang/zh/__init__.py index 3f68336f8..46ad3946f 100644 --- a/spacy/lang/zh/__init__.py +++ b/spacy/lang/zh/__init__.py @@ -14,8 +14,8 @@ class Chinese(Language): except ImportError: raise ImportError("The Chinese tokenizer requires the Jieba library: " "https://github.com/fxsjy/jieba") - words = list(jieba.cut(text, cut_all=True)) - words=[x for x in words if x] + words = list(jieba.cut(text, cut_all=False)) + words = [x for x in words if x] return Doc(self.vocab, words=words, spaces=[False]*len(words)) From d84607f6bb7fa561d65734b1d2d15770c5de05b9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 20:34:40 +0200 Subject: [PATCH 021/649] Vectorize update in AddHistory --- spacy/_ml.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index d3c82897f..1f3d50cbd 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -81,31 +81,28 @@ def add_tuples(X, drop=0.): def AddHistory(layer, decay=0.0001): ops = layer.ops nonlocals = [] - if layer.nI: - average_inputs = ops.allocate((layer.nO, layer.nI-layer.nO)) - nonlocals = [] def history_fwd(X, drop=0.): if not nonlocals: - nonlocals.append(ops.allocate((layer.nO, X.shape[1]))) + if hasattr(layer, 'nO'): + nO = layer.nO + else: + nO = layer._layers[-1].nO + nonlocals.append(ops.allocate((nO, X.shape[1]))) model.history = nonlocals[0] average_inputs = nonlocals[0] hist = ops.xp.tensordot(X, average_inputs, axes=[[1], [1]]) X_hist = ops.xp.hstack((X, hist)) Y, bp_Y = layer.begin_update(X_hist, drop=drop) - for i in range(Y.shape[0]): - amax = Y[i].argmax() - average_inputs[amax] *= 1-decay - average_inputs[amax] += decay * X[i] + amax = Y.argmax(axis=1) + average_inputs *= 1-decay + ops.scatter_add(average_inputs, amax, X * decay) def history_bwd(dY, sgd=None): dX_hist = bp_Y(dY, sgd=sgd) dX = dX_hist[:, :X.shape[1]] - return dX + return ops.xp.ascontiguousarray(dX) return Y, history_bwd model = wrap(history_fwd, layer) - if layer.nI: - model.history = average_inputs - else: - model.history = None + model.history = None return model From 027a5d8b75c74fe2ae27d21ecb1d4ca36ec23cb3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 10:36:46 +0200 Subject: [PATCH 022/649] Update train_ner_standalone example --- examples/training/train_ner_standalone.py | 192 +++++++++------------- 1 file changed, 80 insertions(+), 112 deletions(-) diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py index 9591d1b71..6cca56c69 100644 --- a/examples/training/train_ner_standalone.py +++ b/examples/training/train_ner_standalone.py @@ -13,24 +13,27 @@ Input data: https://www.lt.informatik.tu-darmstadt.de/fileadmin/user_upload/Group_LangTech/data/GermEval2014_complete_data.zip Developed for: spaCy 1.7.1 -Last tested for: spaCy 1.7.1 +Last tested for: spaCy 2.0.0a13 ''' from __future__ import unicode_literals, print_function import plac from pathlib import Path import random import json +from thinc.neural.optimizers import Adam +from thinc.neural.ops import NumpyOps +import tqdm -import spacy.orth as orth_funcs from spacy.vocab import Vocab -from spacy.pipeline import BeamEntityRecognizer -from spacy.pipeline import EntityRecognizer +from spacy.pipeline import TokenVectorEncoder, NeuralEntityRecognizer from spacy.tokenizer import Tokenizer from spacy.tokens import Doc from spacy.attrs import * from spacy.gold import GoldParse -from spacy.gold import _iob_to_biluo as iob_to_biluo +from spacy.gold import iob_to_biluo +from spacy.gold import minibatch from spacy.scorer import Scorer +import spacy.util try: unicode @@ -38,95 +41,40 @@ except NameError: unicode = str +spacy.util.set_env_log(True) + + def init_vocab(): return Vocab( lex_attr_getters={ LOWER: lambda string: string.lower(), - SHAPE: orth_funcs.word_shape, + NORM: lambda string: string.lower(), PREFIX: lambda string: string[0], SUFFIX: lambda string: string[-3:], - CLUSTER: lambda string: 0, - IS_ALPHA: orth_funcs.is_alpha, - IS_ASCII: orth_funcs.is_ascii, - IS_DIGIT: lambda string: string.isdigit(), - IS_LOWER: orth_funcs.is_lower, - IS_PUNCT: orth_funcs.is_punct, - IS_SPACE: lambda string: string.isspace(), - IS_TITLE: orth_funcs.is_title, - IS_UPPER: orth_funcs.is_upper, - IS_STOP: lambda string: False, - IS_OOV: lambda string: True }) -def save_vocab(vocab, path): - path = Path(path) - if not path.exists(): - path.mkdir() - elif not path.is_dir(): - raise IOError("Can't save vocab to %s\nNot a directory" % path) - with (path / 'strings.json').open('w') as file_: - vocab.strings.dump(file_) - vocab.dump((path / 'lexemes.bin').as_posix()) - - -def load_vocab(path): - path = Path(path) - if not path.exists(): - raise IOError("Cannot load vocab from %s\nDoes not exist" % path) - if not path.is_dir(): - raise IOError("Cannot load vocab from %s\nNot a directory" % path) - return Vocab.load(path) - - -def init_ner_model(vocab, features=None): - if features is None: - features = tuple(EntityRecognizer.feature_templates) - return EntityRecognizer(vocab, features=features) - - -def save_ner_model(model, path): - path = Path(path) - if not path.exists(): - path.mkdir() - if not path.is_dir(): - raise IOError("Can't save model to %s\nNot a directory" % path) - model.model.dump((path / 'model').as_posix()) - with (path / 'config.json').open('w') as file_: - data = json.dumps(model.cfg) - if not isinstance(data, unicode): - data = data.decode('utf8') - file_.write(data) - - -def load_ner_model(vocab, path): - return EntityRecognizer.load(path, vocab) - - class Pipeline(object): - @classmethod - def load(cls, path): - path = Path(path) - if not path.exists(): - raise IOError("Cannot load pipeline from %s\nDoes not exist" % path) - if not path.is_dir(): - raise IOError("Cannot load pipeline from %s\nNot a directory" % path) - vocab = load_vocab(path) - tokenizer = Tokenizer(vocab, {}, None, None, None) - ner_model = load_ner_model(vocab, path / 'ner') - return cls(vocab, tokenizer, ner_model) - - def __init__(self, vocab=None, tokenizer=None, entity=None): + def __init__(self, vocab=None, tokenizer=None, tensorizer=None, entity=None): if vocab is None: vocab = init_vocab() if tokenizer is None: tokenizer = Tokenizer(vocab, {}, None, None, None) + if tensorizer is None: + tensorizer = TokenVectorEncoder(vocab) if entity is None: - entity = init_ner_model(self.vocab) + entity = NeuralEntityRecognizer(vocab) self.vocab = vocab self.tokenizer = tokenizer + self.tensorizer = tensorizer self.entity = entity - self.pipeline = [self.entity] + self.pipeline = [tensorizer, self.entity] + + def begin_training(self): + for model in self.pipeline: + model.begin_training([]) + optimizer = Adam(NumpyOps(), 0.001) + return optimizer def __call__(self, input_): doc = self.make_doc(input_) @@ -147,14 +95,18 @@ class Pipeline(object): gold = GoldParse(doc, entities=annotations) return gold - def update(self, input_, annot): - doc = self.make_doc(input_) - gold = self.make_gold(input_, annot) - for ner in gold.ner: - if ner not in (None, '-', 'O'): - action, label = ner.split('-', 1) - self.entity.add_label(label) - return self.entity.update(doc, gold) + def update(self, inputs, annots, sgd, losses=None, drop=0.): + if losses is None: + losses = {} + docs = [self.make_doc(input_) for input_ in inputs] + golds = [self.make_gold(input_, annot) for input_, annot in + zip(inputs, annots)] + + tensors, bp_tensors = self.tensorizer.update(docs, golds, drop=drop) + d_tensors = self.entity.update((docs, tensors), golds, drop=drop, + sgd=sgd, losses=losses) + bp_tensors(d_tensors, sgd=sgd) + return losses def evaluate(self, examples): scorer = Scorer() @@ -164,34 +116,38 @@ class Pipeline(object): scorer.score(doc, gold) return scorer.scores - def average_weights(self): - self.entity.model.end_training() - - def save(self, path): + def to_disk(self, path): path = Path(path) if not path.exists(): path.mkdir() elif not path.is_dir(): raise IOError("Can't save pipeline to %s\nNot a directory" % path) - save_vocab(self.vocab, path / 'vocab') - save_ner_model(self.entity, path / 'ner') + self.vocab.to_disk(path / 'vocab') + self.tensorizer.to_disk(path / 'tensorizer') + self.entity.to_disk(path / 'ner') + + def from_disk(self, path): + path = Path(path) + if not path.exists(): + raise IOError("Cannot load pipeline from %s\nDoes not exist" % path) + if not path.is_dir(): + raise IOError("Cannot load pipeline from %s\nNot a directory" % path) + self.vocab = self.vocab.from_disk(path / 'vocab') + self.tensorizer = self.tensorizer.from_disk(path / 'tensorizer') + self.entity = self.entity.from_disk(path / 'ner') -def train(nlp, train_examples, dev_examples, ctx, nr_epoch=5): - next_epoch = train_examples +def train(nlp, train_examples, dev_examples, nr_epoch=5): + sgd = nlp.begin_training() print("Iter", "Loss", "P", "R", "F") for i in range(nr_epoch): - this_epoch = next_epoch - next_epoch = [] - loss = 0 - for input_, annot in this_epoch: - loss += nlp.update(input_, annot) - if (i+1) < nr_epoch: - next_epoch.append((input_, annot)) - random.shuffle(next_epoch) + random.shuffle(train_examples) + losses = {} + for batch in minibatch(tqdm.tqdm(train_examples, leave=False), size=8): + inputs, annots = zip(*batch) + nlp.update(list(inputs), list(annots), sgd, losses=losses) scores = nlp.evaluate(dev_examples) - report_scores(i, loss, scores) - nlp.average_weights() + report_scores(i, losses['ner'], scores) scores = nlp.evaluate(dev_examples) report_scores(channels, i+1, loss, scores) @@ -208,7 +164,8 @@ def read_examples(path): with path.open() as file_: sents = file_.read().strip().split('\n\n') for sent in sents: - if not sent.strip(): + sent = sent.strip() + if not sent: continue tokens = sent.split('\n') while tokens and tokens[0].startswith('#'): @@ -217,28 +174,39 @@ def read_examples(path): iob = [] for token in tokens: if token.strip(): - pieces = token.split() + pieces = token.split('\t') words.append(pieces[1]) iob.append(pieces[2]) yield words, iob_to_biluo(iob) +def get_labels(examples): + labels = set() + for words, tags in examples: + for tag in tags: + if '-' in tag: + labels.add(tag.split('-')[1]) + return sorted(labels) + + @plac.annotations( model_dir=("Path to save the model", "positional", None, Path), train_loc=("Path to your training data", "positional", None, Path), dev_loc=("Path to your development data", "positional", None, Path), ) -def main(model_dir=Path('/home/matt/repos/spaCy/spacy/data/de-1.0.0'), - train_loc=None, dev_loc=None, nr_epoch=30): - - train_examples = read_examples(train_loc) +def main(model_dir, train_loc, dev_loc, nr_epoch=30): + print(model_dir, train_loc, dev_loc) + train_examples = list(read_examples(train_loc)) dev_examples = read_examples(dev_loc) - nlp = Pipeline.load(model_dir) + nlp = Pipeline() + for label in get_labels(train_examples): + nlp.entity.add_label(label) + print("Add label", label) - train(nlp, train_examples, list(dev_examples), ctx, nr_epoch) + train(nlp, train_examples, list(dev_examples), nr_epoch) - nlp.save(model_dir) + nlp.to_disk(model_dir) if __name__ == '__main__': - main() + plac.call(main) From 8b481e04658443013e132988dc77740b4aa6a167 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 10:38:08 +0200 Subject: [PATCH 023/649] Remove redundant brackets --- spacy/syntax/nn_parser.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 3ea17f2fe..e2dc35966 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -262,8 +262,8 @@ cdef class Parser: upper.is_noop = True else: upper = chain( - clone(Maxout(hidden_width), (depth-1)), - zero_init(Affine(nr_class, drop_factor=0.0)) + clone(Maxout(hidden_width), depth-1), + zero_init(Affine(nr_class, hidden_width, drop_factor=0.0)) ) upper.is_noop = False # TODO: This is an unfortunate hack atm! From 2f08489694f0ad74f03ccf566814628c57a1976c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 10:41:40 +0200 Subject: [PATCH 024/649] Remove AddHistory layer -- didnt work as planned --- spacy/_ml.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 1f3d50cbd..003541f4b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -78,34 +78,6 @@ def add_tuples(X, drop=0.): return (vals1+vals2, length), add_tuples_bwd -def AddHistory(layer, decay=0.0001): - ops = layer.ops - nonlocals = [] - def history_fwd(X, drop=0.): - if not nonlocals: - if hasattr(layer, 'nO'): - nO = layer.nO - else: - nO = layer._layers[-1].nO - nonlocals.append(ops.allocate((nO, X.shape[1]))) - model.history = nonlocals[0] - average_inputs = nonlocals[0] - hist = ops.xp.tensordot(X, average_inputs, axes=[[1], [1]]) - X_hist = ops.xp.hstack((X, hist)) - Y, bp_Y = layer.begin_update(X_hist, drop=drop) - amax = Y.argmax(axis=1) - average_inputs *= 1-decay - ops.scatter_add(average_inputs, amax, X * decay) - def history_bwd(dY, sgd=None): - dX_hist = bp_Y(dY, sgd=sgd) - dX = dX_hist[:, :X.shape[1]] - return ops.xp.ascontiguousarray(dX) - return Y, history_bwd - model = wrap(history_fwd, layer) - model.history = None - return model - - def _zero_init(model): def _zero_init_impl(self, X, y): self.W.fill(0) From 86367ab092d75af98bfb68bc3b6c499d28d0067f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 12:41:59 +0200 Subject: [PATCH 025/649] Start work on appveyor, for Windows build --- .appveyor.yml | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index 4dd7b0a31..d63512fcf 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1 +1,53 @@ +environment: + + matrix: + + # For Python versions available on Appveyor, see + # http://www.appveyor.com/docs/installed-software#python + # The list here is complete (excluding Python 2.6, which + # isn't covered by this document) at the time of writing. + + - PYTHON: "C:\\Python27" + #- PYTHON: "C:\\Python33" + #- PYTHON: "C:\\Python34" + #- PYTHON: "C:\\Python35" + #- PYTHON: "C:\\Python27-x64" + #- PYTHON: "C:\\Python33-x64" + #- DISTUTILS_USE_SDK: "1" + #- PYTHON: "C:\\Python34-x64" + #- DISTUTILS_USE_SDK: "1" + #- PYTHON: "C:\\Python35-x64" + #- PYTHON: "C:\\Python36-x64" + +install: + # We need wheel installed to build wheels + - "%PYTHON%\\python.exe -m pip install wheel" + - "%PYTHON%\\python.exe -m pip install -e ." + build: off + +test_script: + # Put your test command here. + # If you don't need to build C extensions on 64-bit Python 3.3 or 3.4, + # you can remove "build.cmd" from the front of the command, as it's + # only needed to support those cases. + # Note that you must use the environment variable %PYTHON% to refer to + # the interpreter you're using - Appveyor does not do anything special + # to put the Python version you want to use on PATH. + - "%PYTHON%\\python.exe -m pytest spacy/" + +after_test: + # This step builds your wheels. + # Again, you only need build.cmd if you're building C extensions for + # 64-bit Python 3.3/3.4. And you need to use %PYTHON% to get the correct + # interpreter + - "%PYTHON%\\python.exe setup.py bdist_wheel" + +artifacts: + # bdist_wheel puts your built wheel in the dist directory + - path: dist\* + +#on_success: +# You can use this step to upload your artifacts to a public website. +# See Appveyor's documentation for more details. Or you can simply +# access your wheels from the Appveyor "artifacts" tab for your build. From 1f840a9211347ec5d3f7dc64eccf74e254aa414c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 12:49:02 +0200 Subject: [PATCH 026/649] Appveyor --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index d63512fcf..1fc3c920f 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -17,7 +17,7 @@ environment: #- PYTHON: "C:\\Python34-x64" #- DISTUTILS_USE_SDK: "1" #- PYTHON: "C:\\Python35-x64" - #- PYTHON: "C:\\Python36-x64" + - PYTHON: "C:\\Python36-x64" install: # We need wheel installed to build wheels From 25ec8935adfc50f25109b411dd59980c2f065c52 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 12:53:07 +0200 Subject: [PATCH 027/649] Appveyor --- .appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.appveyor.yml b/.appveyor.yml index 1fc3c920f..f2d166754 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -22,6 +22,7 @@ environment: install: # We need wheel installed to build wheels - "%PYTHON%\\python.exe -m pip install wheel" + - "%PYTHON%\\python.exe -m pip install cython" - "%PYTHON%\\python.exe -m pip install -e ." build: off From 02273eeca8290e5fb7906871c76a9e6db1c6f943 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 12:55:33 +0200 Subject: [PATCH 028/649] Appveyor --- .appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.appveyor.yml b/.appveyor.yml index f2d166754..a379cdd31 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -23,6 +23,7 @@ install: # We need wheel installed to build wheels - "%PYTHON%\\python.exe -m pip install wheel" - "%PYTHON%\\python.exe -m pip install cython" + - "%PYTHON%\\python.exe -m pip install -r requirements.txt" - "%PYTHON%\\python.exe -m pip install -e ." build: off From 07cdbd121910c7984f7f597234b0cf986af9c2d2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 22:47:53 +0200 Subject: [PATCH 029/649] Require thinc 6.8.1, for Windows --- requirements.txt | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index aae0f9388..54c888a11 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ -cython<0.24 +cython>=0.24 pathlib numpy>=1.7 cymem>=1.30,<1.32 preshed>=1.0.0,<2.0.0 -thinc>=6.8.0,<6.9.0 +thinc>=6.8.1,<6.9.0 murmurhash>=0.28,<0.29 plac<1.0.0,>=0.9.6 six diff --git a/setup.py b/setup.py index 6a22f4076..535dddd0d 100755 --- a/setup.py +++ b/setup.py @@ -195,7 +195,7 @@ def setup_package(): 'murmurhash>=0.28,<0.29', 'cymem>=1.30,<1.32', 'preshed>=1.0.0,<2.0.0', - 'thinc>=6.8.0,<6.9.0', + 'thinc>=6.8.1,<6.9.0', 'plac<1.0.0,>=0.9.6', 'pip>=9.0.0,<10.0.0', 'six', From 2432308f3ef136e5e90d7be39ea795d3c6e61510 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 23:55:19 +0200 Subject: [PATCH 030/649] Build in separate step for appveyor --- .appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.appveyor.yml b/.appveyor.yml index a379cdd31..8dbdd2868 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -24,6 +24,7 @@ install: - "%PYTHON%\\python.exe -m pip install wheel" - "%PYTHON%\\python.exe -m pip install cython" - "%PYTHON%\\python.exe -m pip install -r requirements.txt" + - "%PYTHON%\\python.exe -m python setup.py build_ext --inplace" - "%PYTHON%\\python.exe -m pip install -e ." build: off From 1ffc9a7fbfdd7ef620b025a770c4ba07305ce81d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 23:59:36 +0200 Subject: [PATCH 031/649] Fix appveyor --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 8dbdd2868..12399a5a1 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -24,7 +24,7 @@ install: - "%PYTHON%\\python.exe -m pip install wheel" - "%PYTHON%\\python.exe -m pip install cython" - "%PYTHON%\\python.exe -m pip install -r requirements.txt" - - "%PYTHON%\\python.exe -m python setup.py build_ext --inplace" + - "%PYTHON%\\python.exe setup.py build_ext --inplace" - "%PYTHON%\\python.exe -m pip install -e ." build: off From f730d07e4e7ab3d4cba3d16537b7ca7a5a098307 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 00:25:18 +0200 Subject: [PATCH 032/649] Fix prange error for Windows --- spacy/syntax/nn_parser.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index e2dc35966..ea484f1c2 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -419,7 +419,7 @@ cdef class Parser: cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): if not has_hidden: - for i in cython.parallel.prange( + for i in range( next_step.size(), num_threads=6, nogil=True): self._parse_step(next_step[i], feat_weights, nr_class, nr_feat, nr_piece) From 3fa5b40b5cace40a5b8fde8112354abce6488b77 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 11:21:35 +0200 Subject: [PATCH 033/649] Add test for hash consistency --- spacy/tests/stringstore/test_stringstore.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spacy/tests/stringstore/test_stringstore.py b/spacy/tests/stringstore/test_stringstore.py index 65b994606..602ebcee6 100644 --- a/spacy/tests/stringstore/test_stringstore.py +++ b/spacy/tests/stringstore/test_stringstore.py @@ -6,6 +6,16 @@ from ...strings import StringStore import pytest +def test_string_hash(stringstore): + '''Test that string hashing is stable across platforms''' + ss = stringstore + assert ss.add('apple') == 8566208034543834098 + heart = '\U0001f499' + print(heart) + h = ss.add(heart) + assert h == 11841826740069053588L + + def test_stringstore_from_api_docs(stringstore): apple_hash = stringstore.add('apple') assert apple_hash == 8566208034543834098 From 8a829eb98c41194a08f48fd1a9bec496ec673c98 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 11:49:31 +0200 Subject: [PATCH 034/649] Fix travis.sh --- travis.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/travis.sh b/travis.sh index 4b7d8017c..eed6a96f2 100755 --- a/travis.sh +++ b/travis.sh @@ -17,6 +17,7 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt + python setup.py build_ext --inplace pip install -e . fi From 11f2a05ede85b547b0b33d5642db6e3eaa1fba07 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:20:04 +0200 Subject: [PATCH 035/649] Fix code explosion from long enum in Python 3, Cython 0.24+ --- spacy/symbols.pxd | 2 +- spacy/symbols.pyx | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/spacy/symbols.pxd b/spacy/symbols.pxd index 0b713cb21..e981de6ae 100644 --- a/spacy/symbols.pxd +++ b/spacy/symbols.pxd @@ -1,4 +1,4 @@ -cpdef enum symbol_t: +cdef enum symbol_t: NIL IS_ALPHA IS_ASCII diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx index 9f4009579..dd0e38cad 100644 --- a/spacy/symbols.pyx +++ b/spacy/symbols.pyx @@ -1,4 +1,6 @@ # coding: utf8 +#cython: optimize.unpack_method_calls=False + from __future__ import unicode_literals IDS = { @@ -458,4 +460,11 @@ IDS = { "xcomp": xcomp } -NAMES = [it[0] for it in sorted(IDS.items(), key=lambda it: it[1])] +def sort_nums(x): + return x[1] + +NAMES = [it[0] for it in sorted(IDS.items(), key=sort_nums)] +# Unfortunate hack here, to work around problem with long cpdef enum +# (which is generating an enormous amount of C++ in Cython 0.24+) +# We keep the enum cdef, and just make sure the names are available to Python +locals().update(IDS) From 8c945310fb16912a23ef8311cd4cd00aeb3798e2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 16:21:13 +0200 Subject: [PATCH 036/649] Excuse emoji failure on narrow unicode builds --- spacy/tests/tokenizer/test_exceptions.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spacy/tests/tokenizer/test_exceptions.py b/spacy/tests/tokenizer/test_exceptions.py index 57281b998..132f27433 100644 --- a/spacy/tests/tokenizer/test_exceptions.py +++ b/spacy/tests/tokenizer/test_exceptions.py @@ -1,6 +1,7 @@ # coding: utf-8 from __future__ import unicode_literals +import sys import pytest @@ -37,9 +38,10 @@ def test_tokenizer_excludes_false_pos_emoticons(tokenizer, text, length): tokens = tokenizer(text) assert len(tokens) == length - @pytest.mark.parametrize('text,length', [('can you still dunk?🍕🍔😵LOL', 8), ('i💙you', 3), ('🤘🤘yay!', 4)]) def test_tokenizer_handles_emoji(tokenizer, text, length): - tokens = tokenizer(text) - assert len(tokens) == length + # These break on narrow unicode builds, e.g. Windows + if sys.maxunicode >= 1114111: + tokens = tokenizer(text) + assert len(tokens) == length From ebf8942564246729c79a299d597f13e8bd1215b2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 16:22:38 +0200 Subject: [PATCH 037/649] Fix test for Python3 --- spacy/tests/stringstore/test_stringstore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tests/stringstore/test_stringstore.py b/spacy/tests/stringstore/test_stringstore.py index 602ebcee6..3f2992a6f 100644 --- a/spacy/tests/stringstore/test_stringstore.py +++ b/spacy/tests/stringstore/test_stringstore.py @@ -13,7 +13,7 @@ def test_string_hash(stringstore): heart = '\U0001f499' print(heart) h = ss.add(heart) - assert h == 11841826740069053588L + assert h == 11841826740069053588 def test_stringstore_from_api_docs(stringstore): From e0a2aa92891af890738b6290cd622cc87fe652ac Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:45:09 -0500 Subject: [PATCH 038/649] Support having word vectors data on GPU --- spacy/vectors.pyx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 0eec5a00a..b912be80b 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -6,6 +6,8 @@ import msgpack import msgpack_numpy msgpack_numpy.patch() cimport numpy as np +from thinc.neural.util import get_array_module +from thinc.neural._classes.model import Model from .typedefs cimport attr_t from .strings cimport StringStore @@ -31,7 +33,7 @@ cdef class Vectors: self.i = 0 self.data = data self.key2row = {} - self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') + self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') def __reduce__(self): return (Vectors, (self.strings, self.data)) @@ -118,9 +120,14 @@ cdef class Vectors: self.data def to_disk(self, path, **exclude): + xp = get_array_module(self.data) + if xp is numpy: + save_array = lambda arr, file_: xp.save(file_, arr, allow_pickle=False) + else: + save_array = lambda arr, file_: xp.save(file_, arr) serializers = OrderedDict(( - ('vectors', lambda p: numpy.save(p.open('wb'), self.data, allow_pickle=False)), - ('keys', lambda p: numpy.save(p.open('wb'), self.keys, allow_pickle=False)), + ('vectors', lambda p: save_array(self.data, p.open('wb'))), + ('keys', lambda p: xp.save(p.open('wb'), self.keys)) )) return util.to_disk(path, serializers, exclude) @@ -133,8 +140,9 @@ cdef class Vectors: self.key2row[key] = i def load_vectors(path): + xp = Model.ops.xp if path.exists(): - self.data = numpy.load(path) + self.data = xp.load(path) serializers = OrderedDict(( ('keys', load_keys), From 2a93404da683193683003cdd597e29496b21e31e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:45:37 -0500 Subject: [PATCH 039/649] Support optional pre-trained vectors in tensorizer model --- spacy/_ml.py | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 003541f4b..14341c407 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -21,7 +21,7 @@ from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel -from thinc.api import uniqued, wrap, flatten_add_lengths +from thinc.api import uniqued, wrap, flatten_add_lengths, noop from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER @@ -226,7 +226,7 @@ def drop_layer(layer, factor=2.): return model -def Tok2Vec(width, embed_size, preprocess=None): +def Tok2Vec(width, embed_size, preprocess=True, pretrained_dims=0): cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') @@ -234,18 +234,30 @@ def Tok2Vec(width, embed_size, preprocess=None): suffix = HashEmbed(width, embed_size//2, column=cols.index(SUFFIX), name='embed_suffix') shape = HashEmbed(width, embed_size//2, column=cols.index(SHAPE), name='embed_shape') - embed = (norm | prefix | suffix | shape ) >> LN(Maxout(width, width*4, pieces=3)) - tok2vec = ( - with_flatten( - asarray(Model.ops, dtype='uint64') - >> uniqued(embed, column=5) - >> Residual( - (ExtractWindow(nW=1) >> LN(Maxout(width, width*3))) - ) ** 4, pad=4 + trained_vectors = ( + FeatureExtracter(cols) + >> with_flatten( + uniqued( + (norm | prefix | suffix | shape) + >> LN(Maxout(width, width*4, pieces=3)), column=5) ) ) - if preprocess not in (False, None): - tok2vec = preprocess >> tok2vec + if pretrained_dims: + embed = concatenate_lists(trained_vectors, SpacyVectors) + else: + embed = trained_vectors + convolution = Residual(ExtractWindow(nW=1) >> LN(Maxout(width, width*3, pieces=3))) + + tok2vec = ( + embed + >> with_flatten( + Affine(width, width+pretrained_dims) + >> convolution + >> convolution + >> convolution + >> convolution, + pad=1) + ) # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width tok2vec.embed = embed @@ -457,10 +469,11 @@ def getitem(i): def build_tagger_model(nr_class, token_vector_width, **cfg): embed_size = util.env_opt('embed_size', 7500) + pretrained_dims = cfg.get('pretrained_dims', 0) with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples - private_tok2vec = Tok2Vec(token_vector_width, embed_size, preprocess=doc2feats()) - + private_tok2vec = Tok2Vec(token_vector_width, embed_size, + pretrained_dims=pretrained_dims) model = ( fine_tune(private_tok2vec) >> with_flatten( From 84e637e2e67c3b1b4509c94c08e00687b5881b8f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:46:02 -0500 Subject: [PATCH 040/649] Pass option for pretrained vectors in pipeline --- spacy/pipeline.pyx | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 7e00a443d..4643b759a 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -41,7 +41,7 @@ from .syntax import nonproj from .compat import json_dumps from .attrs import ID, LOWER, PREFIX, SUFFIX, SHAPE, TAG, DEP, POS -from ._ml import rebatch, Tok2Vec, flatten, get_col, doc2feats +from ._ml import rebatch, Tok2Vec, flatten from ._ml import build_text_classifier, build_tagger_model from .parts_of_speech import X @@ -137,6 +137,7 @@ class BaseThincComponent(object): def from_bytes(self, bytes_data, **exclude): def load_model(b): if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(**self.cfg) self.model.from_bytes(b) @@ -159,6 +160,7 @@ class BaseThincComponent(object): def from_disk(self, path, **exclude): def load_model(p): if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(**self.cfg) self.model.from_bytes(p.open('rb').read()) @@ -193,7 +195,7 @@ class TokenVectorEncoder(BaseThincComponent): """ width = util.env_opt('token_vector_width', width) embed_size = util.env_opt('embed_size', embed_size) - return Tok2Vec(width, embed_size, preprocess=None) + return Tok2Vec(width, embed_size, **cfg) def __init__(self, vocab, model=True, **cfg): """Construct a new statistical model. Weights are not allocated on @@ -210,7 +212,6 @@ class TokenVectorEncoder(BaseThincComponent): >>> tok2vec.model = tok2vec.Model(128, 5000) """ self.vocab = vocab - self.doc2feats = doc2feats() self.model = model self.cfg = dict(cfg) @@ -245,8 +246,7 @@ class TokenVectorEncoder(BaseThincComponent): docs (iterable): A sequence of `Doc` objects. RETURNS (object): Vector representations for each token in the documents. """ - feats = self.doc2feats(docs) - tokvecs = self.model(feats) + tokvecs = self.model(docs) return tokvecs def set_annotations(self, docs, tokvecses): @@ -270,8 +270,7 @@ class TokenVectorEncoder(BaseThincComponent): """ if isinstance(docs, Doc): docs = [docs] - feats = self.doc2feats(docs) - tokvecs, bp_tokvecs = self.model.begin_update(feats, drop=drop) + tokvecs, bp_tokvecs = self.model.begin_update(docs, drop=drop) return tokvecs, bp_tokvecs def get_loss(self, docs, golds, scores): @@ -285,9 +284,8 @@ class TokenVectorEncoder(BaseThincComponent): gold_tuples (iterable): Gold-standard training data. pipeline (list): The pipeline the model is part of. """ - self.doc2feats = doc2feats() if self.model is True: - self.model = self.Model() + self.model = self.Model(**self.cfg) class NeuralTagger(BaseThincComponent): @@ -394,12 +392,14 @@ class NeuralTagger(BaseThincComponent): exc=vocab.morphology.exc) token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width) + self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, + pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width): - return build_tagger_model(n_tags, token_vector_width) - + def Model(cls, n_tags, token_vector_width, pretrained_dims=0): + return build_tagger_model(n_tags, token_vector_width, + pretrained_dims) + def use_params(self, params): with self.model.use_params(params): yield @@ -419,7 +419,8 @@ class NeuralTagger(BaseThincComponent): if self.model is True: token_vector_width = util.env_opt('token_vector_width', self.cfg.get('token_vector_width', 128)) - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width) + self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, + pretrained_dims=self.vocab.vectors_length) self.model.from_bytes(b) def load_tag_map(b): @@ -428,7 +429,7 @@ class NeuralTagger(BaseThincComponent): self.vocab.strings, tag_map=tag_map, lemmatizer=self.vocab.morphology.lemmatizer, exc=self.vocab.morphology.exc) - + deserialize = OrderedDict(( ('vocab', lambda b: self.vocab.from_bytes(b)), ('tag_map', load_tag_map), @@ -454,7 +455,8 @@ class NeuralTagger(BaseThincComponent): if self.model is True: token_vector_width = util.env_opt('token_vector_width', self.cfg.get('token_vector_width', 128)) - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width) + self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, + pretrained_dims=self.vocab.vectors_length) self.model.from_bytes(p.open('rb').read()) def load_tag_map(p): @@ -503,12 +505,14 @@ class NeuralLabeller(NeuralTagger): self.labels[dep] = len(self.labels) token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(len(self.labels), token_vector_width) + self.model = self.Model(len(self.labels), token_vector_width, + pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width): - return build_tagger_model(n_tags, token_vector_width) - + def Model(cls, n_tags, token_vector_width, pretrained_dims=0): + return build_tagger_model(n_tags, token_vector_width, + pretrained_dims) + def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) cdef int idx = 0 @@ -653,6 +657,7 @@ class TextCategorizer(BaseThincComponent): else: token_vector_width = 64 if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(len(self.labels), token_vector_width, **self.cfg) From e37a50a436643c201a7ecb088325c9b94593fabd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:46:36 -0500 Subject: [PATCH 041/649] Pass documents to tensorizer, not 'features' --- spacy/language.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 66b42ff94..538d12221 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -304,13 +304,12 @@ class Language(object): self._optimizer = Adam(Model.ops, 0.001) sgd = self._optimizer tok2vec = self.pipeline[0] - feats = tok2vec.doc2feats(docs) grads = {} def get_grads(W, dW, key=None): grads[key] = (W, dW) pipes = list(self.pipeline[1:]) random.shuffle(pipes) - tokvecses, bp_tokvecses = tok2vec.model.begin_update(feats, drop=drop) + tokvecses, bp_tokvecses = tok2vec.model.begin_update(docs, drop=drop) all_d_tokvecses = [tok2vec.model.ops.allocate(tv.shape) for tv in tokvecses] for proc in pipes: if not hasattr(proc, 'update'): From 8665a77f482a9c607a79cc285949c6cc049bf5f0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:46:57 -0500 Subject: [PATCH 042/649] Fix feature error in NER --- spacy/syntax/_state.pxd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 3da9e5d4c..c4be8cff2 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -101,9 +101,10 @@ cdef cppclass StateC: elif n == 6: if this.B(0) >= 0: ids[0] = this.B(0) + ids[1] = this.B(0)-1 else: ids[0] = -1 - ids[1] = this.B(0) + ids[1] = -1 ids[2] = this.B(1) ids[3] = this.E(0) if ids[3] >= 1: From 5ff2491f245c95e8003b84aeeef379cb8ef5676d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:47:21 -0500 Subject: [PATCH 043/649] Pass option for pre-trained vectors in parser --- spacy/syntax/nn_parser.pyx | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 1c4107c06..04cf20d12 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -245,7 +245,7 @@ cdef class Parser: parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) embed_size = util.env_opt('embed_size', 4000) tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, - preprocess=doc2feats())) + pretrained_dims=cfg.get('pretrained_dims'))) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -391,9 +391,10 @@ cdef class Parser: if isinstance(tokvecses, np.ndarray): tokvecses = [tokvecses] - tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + else: + tokvecs = self.model[0].ops.flatten(tokvecses) nr_state = len(docs) nr_class = self.moves.n_moves @@ -451,9 +452,10 @@ cdef class Parser: cdef Doc doc cdef int nr_class = self.moves.n_moves cdef StateClass stcls, output - tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + else: + tokvecs = self.model[0].ops.flatten(tokvecses) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -533,6 +535,8 @@ cdef class Parser: if USE_FINE_TUNE: my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) tokvecs = self.model[0].ops.flatten(my_tokvecs) + else: + tokvecs = self.model[0].ops.flatten(docs_tokvecs[1]) cuda_stream = get_cuda_stream() @@ -603,11 +607,11 @@ cdef class Parser: docs, tokvecs = docs_tokvecs lengths = [len(d) for d in docs] assert min(lengths) >= 1 - tokvecs = self.model[0].ops.flatten(tokvecs) if USE_FINE_TUNE: my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) tokvecs += self.model[0].ops.flatten(my_tokvecs) - + else: + tokvecs = self.model[0].ops.flatten(tokvecs) states = self.moves.init_batch(docs) for gold in golds: self.moves.preprocess_gold(gold) @@ -775,6 +779,7 @@ cdef class Parser: for label in labels: self.moves.add_action(action, label) if self.model is True: + cfg['pretrained_dims'] = self.vocab.vectors_length self.model, cfg = self.Model(self.moves.n_moves, **cfg) self.cfg.update(cfg) @@ -856,9 +861,11 @@ cdef class Parser: msg = util.from_bytes(bytes_data, deserializers, exclude) if 'model' not in exclude: if self.model is True: - self.model, cfg = self.Model(self.moves.n_moves) + self.model, cfg = self.Model(self.moves.n_moves, + pretrained_dims=self.vocab.vectors_length) else: cfg = {} + cfg['pretrained_dims'] = self.vocab.vectors_length if 'tok2vec_model' in msg: self.model[0].from_bytes(msg['tok2vec_model']) if 'lower_model' in msg: From 68f66aebf81eeebef3750a5c881795effb58d7d7 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 16 Sep 2017 20:27:59 +0200 Subject: [PATCH 044/649] Use pkg_resources instead of pip for is_package (resolves #1293) --- requirements.txt | 1 - setup.py | 1 - spacy/util.py | 6 +++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index 54c888a11..6298b1982 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,6 @@ requests>=2.13.0,<3.0.0 regex==2017.4.5 ftfy>=4.4.2,<5.0.0 pytest>=3.0.6,<4.0.0 -pip>=9.0.0,<10.0.0 mock>=2.0.0,<3.0.0 msgpack-python msgpack-numpy diff --git a/setup.py b/setup.py index 535dddd0d..0b0d2cc81 100755 --- a/setup.py +++ b/setup.py @@ -197,7 +197,6 @@ def setup_package(): 'preshed>=1.0.0,<2.0.0', 'thinc>=6.8.1,<6.9.0', 'plac<1.0.0,>=0.9.6', - 'pip>=9.0.0,<10.0.0', 'six', 'pathlib', 'ujson>=1.35', diff --git a/spacy/util.py b/spacy/util.py index 95fcb493d..a55eed2f8 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals, print_function import os import ujson -import pip +import pkg_resources import importlib import regex as re from pathlib import Path @@ -180,9 +180,9 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ - packages = pip.get_installed_distributions() + packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.project_name.replace('-', '_') == name: + if package.replace('-', '_') == name: return True return False From ece30c28a88e55f29a22fbe5f93a9988cec44836 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 16 Sep 2017 20:40:15 +0200 Subject: [PATCH 045/649] Don't split hyphenated words in German This way, the tokenizer matches the tokenization in German treebanks --- spacy/lang/de/__init__.py | 2 ++ spacy/lang/de/punctuation.py | 20 ++++++++++++++++ .../tests/lang/de/test_prefix_suffix_infix.py | 24 +++++++++---------- spacy/tests/lang/de/test_text.py | 14 +++++------ 4 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 spacy/lang/de/punctuation.py diff --git a/spacy/lang/de/__init__.py b/spacy/lang/de/__init__.py index b8a7580a0..1c64541e6 100644 --- a/spacy/lang/de/__init__.py +++ b/spacy/lang/de/__init__.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .norm_exceptions import NORM_EXCEPTIONS +from .punctuation import TOKENIZER_INFIXES from .tag_map import TAG_MAP from .stop_words import STOP_WORDS from .lemmatizer import LOOKUP @@ -23,6 +24,7 @@ class GermanDefaults(Language.Defaults): NORM_EXCEPTIONS, BASE_NORMS) tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) + infixes = tuple(TOKENIZER_INFIXES) tag_map = dict(TAG_MAP) stop_words = set(STOP_WORDS) syntax_iterators = dict(SYNTAX_ITERATORS) diff --git a/spacy/lang/de/punctuation.py b/spacy/lang/de/punctuation.py new file mode 100644 index 000000000..7024ed118 --- /dev/null +++ b/spacy/lang/de/punctuation.py @@ -0,0 +1,20 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ..char_classes import LIST_ELLIPSES, LIST_ICONS +from ..char_classes import QUOTES, ALPHA, ALPHA_LOWER, ALPHA_UPPER + + +_quotes = QUOTES.replace("'", '') + +_infixes = (LIST_ELLIPSES + LIST_ICONS + + [r'(?<=[{}])\.(?=[{}])'.format(ALPHA_LOWER, ALPHA_UPPER), + r'(?<=[{a}])[,!?](?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}"])[:<>=](?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}]),(?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}])([{q}\)\]\(\[])(?=[\{a}])'.format(a=ALPHA, q=_quotes), + r'(?<=[{a}])--(?=[{a}])'.format(a=ALPHA), + r'(?<=[0-9])-(?=[0-9])']) + + +TOKENIZER_INFIXES = _infixes diff --git a/spacy/tests/lang/de/test_prefix_suffix_infix.py b/spacy/tests/lang/de/test_prefix_suffix_infix.py index dcf4f4ef0..bdc68037e 100644 --- a/spacy/tests/lang/de/test_prefix_suffix_infix.py +++ b/spacy/tests/lang/de/test_prefix_suffix_infix.py @@ -67,12 +67,6 @@ def test_tokenizer_splits_uneven_wrap_interact(de_tokenizer, text): assert len(tokens) == 4 -@pytest.mark.parametrize('text', ["blau-rot"]) -def test_tokenizer_splits_hyphens(de_tokenizer, text): - tokens = de_tokenizer(text) - assert len(tokens) == 3 - - @pytest.mark.parametrize('text', ["0.1-13.5", "0.0-0.1", "103.27-300"]) def test_tokenizer_splits_numeric_range(de_tokenizer, text): tokens = de_tokenizer(text) @@ -100,17 +94,21 @@ def test_tokenizer_splits_ellipsis_infix(de_tokenizer, text): assert len(tokens) == 3 +@pytest.mark.parametrize('text', ['Islam-Konferenz', 'Ost-West-Konflikt']) +def test_tokenizer_keeps_hyphens(de_tokenizer, text): + tokens = de_tokenizer(text) + assert len(tokens) == 1 + + def test_tokenizer_splits_double_hyphen_infix(de_tokenizer): tokens = de_tokenizer("Viele Regeln--wie die Bindestrich-Regeln--sind kompliziert.") - assert len(tokens) == 12 + assert len(tokens) == 10 assert tokens[0].text == "Viele" assert tokens[1].text == "Regeln" assert tokens[2].text == "--" assert tokens[3].text == "wie" assert tokens[4].text == "die" - assert tokens[5].text == "Bindestrich" - assert tokens[6].text == "-" - assert tokens[7].text == "Regeln" - assert tokens[8].text == "--" - assert tokens[9].text == "sind" - assert tokens[10].text == "kompliziert" + assert tokens[5].text == "Bindestrich-Regeln" + assert tokens[6].text == "--" + assert tokens[7].text == "sind" + assert tokens[8].text == "kompliziert" diff --git a/spacy/tests/lang/de/test_text.py b/spacy/tests/lang/de/test_text.py index 84fa6f2a5..34180b982 100644 --- a/spacy/tests/lang/de/test_text.py +++ b/spacy/tests/lang/de/test_text.py @@ -25,15 +25,15 @@ Umfang kläglich dünnen Beine flimmerten ihm hilflos vor den Augen. assert len(tokens) == 109 -@pytest.mark.parametrize('text,length', [ - ("Donaudampfschifffahrtsgesellschaftskapitänsanwärterposten", 1), - ("Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz", 1), - ("Kraftfahrzeug-Haftpflichtversicherung", 3), - ("Vakuum-Mittelfrequenz-Induktionsofen", 5) +@pytest.mark.parametrize('text', [ + "Donaudampfschifffahrtsgesellschaftskapitänsanwärterposten", + "Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz", + "Kraftfahrzeug-Haftpflichtversicherung", + "Vakuum-Mittelfrequenz-Induktionsofen" ]) -def test_tokenizer_handles_long_words(de_tokenizer, text, length): +def test_tokenizer_handles_long_words(de_tokenizer, text): tokens = de_tokenizer(text) - assert len(tokens) == length + assert len(tokens) == 1 @pytest.mark.parametrize('text,length', [ From c003c561c34daa216f3a96176bc3e739cff4439a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 05:46:03 -0500 Subject: [PATCH 046/649] Revert NER action loading change, for model compatibility --- spacy/syntax/ner.pyx | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 1a174aba8..d8c748099 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -219,28 +219,28 @@ cdef class BiluoPushDown(TransitionSystem): raise Exception(move) return t - def add_action(self, int action, label_name): - cdef attr_t label_id - if not isinstance(label_name, (int, long)): - label_id = self.strings.add(label_name) - else: - label_id = label_name - if action == OUT and label_id != 0: - return - if action == MISSING or action == ISNT: - return - # Check we're not creating a move we already have, so that this is - # idempotent - for trans in self.c[:self.n_moves]: - if trans.move == action and trans.label == label_id: - return 0 - if self.n_moves >= self._size: - self._size *= 2 - self.c = self.mem.realloc(self.c, self._size * sizeof(self.c[0])) - self.c[self.n_moves] = self.init_transition(self.n_moves, action, label_id) - assert self.c[self.n_moves].label == label_id - self.n_moves += 1 - return 1 + #def add_action(self, int action, label_name): + # cdef attr_t label_id + # if not isinstance(label_name, (int, long)): + # label_id = self.strings.add(label_name) + # else: + # label_id = label_name + # if action == OUT and label_id != 0: + # return + # if action == MISSING or action == ISNT: + # return + # # Check we're not creating a move we already have, so that this is + # # idempotent + # for trans in self.c[:self.n_moves]: + # if trans.move == action and trans.label == label_id: + # return 0 + # if self.n_moves >= self._size: + # self._size *= 2 + # self.c = self.mem.realloc(self.c, self._size * sizeof(self.c[0])) + # self.c[self.n_moves] = self.init_transition(self.n_moves, action, label_id) + # assert self.c[self.n_moves].label == label_id + # self.n_moves += 1 + # return 1 From 8f913a74ca4eaa2e36354530bfe8e822b1697777 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 05:46:36 -0500 Subject: [PATCH 047/649] Fix defaults and args to build_tagger_model --- spacy/_ml.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 14341c407..2f6a36942 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -467,9 +467,8 @@ def getitem(i): return X[i], None return layerize(getitem_fwd) -def build_tagger_model(nr_class, token_vector_width, **cfg): - embed_size = util.env_opt('embed_size', 7500) - pretrained_dims = cfg.get('pretrained_dims', 0) +def build_tagger_model(nr_class, token_vector_width, pretrained_dims=0, **cfg): + embed_size = util.env_opt('embed_size', 4000) with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples private_tok2vec = Tok2Vec(token_vector_width, embed_size, From 31c2e91c35ae4299f53b2ca411cd6686cc86748c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 05:46:55 -0500 Subject: [PATCH 048/649] Fix wiring of pre-trained vectors in parser loading --- spacy/syntax/nn_parser.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index bf873f0e2..cf18b6e96 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -825,6 +825,7 @@ cdef class Parser: if 'model' not in exclude: path = util.ensure_path(path) if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model, cfg = self.Model(**self.cfg) else: cfg = {} From 2b0efc77ae3bd4ab97353b4f55be7ae36e8523ad Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 05:47:34 -0500 Subject: [PATCH 049/649] Fix wiring of pre-trained vectors in parser loading --- spacy/syntax/nn_parser.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index cf18b6e96..532a69b36 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -871,6 +871,7 @@ cdef class Parser: if self.model is True: self.model, cfg = self.Model(self.moves.n_moves, pretrained_dims=self.vocab.vectors_length) + cfg['pretrained_dims'] = self.vocab.vectors_length else: cfg = {} cfg['pretrained_dims'] = self.vocab.vectors_length From 16122f566ea18eb87880e51f6a119d9f28401fdc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 12:28:53 -0500 Subject: [PATCH 050/649] Fix cpdef enum in attrs.pyx --- spacy/attrs.pxd | 2 +- spacy/attrs.pyx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/attrs.pxd b/spacy/attrs.pxd index a8ee9cac0..74397fa64 100644 --- a/spacy/attrs.pxd +++ b/spacy/attrs.pxd @@ -1,5 +1,5 @@ # Reserve 64 values for flag features -cpdef enum attr_id_t: +cdef enum attr_id_t: NULL_ATTR IS_ALPHA IS_ASCII diff --git a/spacy/attrs.pyx b/spacy/attrs.pyx index ba95e1e72..8efd9e189 100644 --- a/spacy/attrs.pyx +++ b/spacy/attrs.pyx @@ -94,6 +94,7 @@ IDS = { # ATTR IDs, in order of the symbol NAMES = [key for key, value in sorted(IDS.items(), key=lambda item: item[1])] +locals().update(IDS) def intify_attrs(stringy_attrs, strings_map=None, _do_deprecated=False): From 4f38a67a89168309642525ba56f71d692900f577 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 12:29:14 -0500 Subject: [PATCH 051/649] Make width default to 0 in vectors.pyx --- spacy/vectors.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index b912be80b..346421153 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -23,7 +23,7 @@ cdef class Vectors: cdef public object keys cdef public int i - def __init__(self, strings, data_or_width): + def __init__(self, strings, data_or_width=0): self.strings = StringStore() if isinstance(data_or_width, int): self.data = data = numpy.zeros((len(strings), data_or_width), From 039d609362138bd26d6c53f087a48c0888d9c887 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 12:29:39 -0500 Subject: [PATCH 052/649] Remove hard-coded default vectors width --- spacy/vocab.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index bf7fb6903..b4a244287 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -65,7 +65,7 @@ cdef class Vocab: self.strings.add(name) self.lex_attr_getters = lex_attr_getters self.morphology = Morphology(self.strings, tag_map, lemmatizer) - self.vectors = Vectors(self.strings, 300) + self.vectors = Vectors(self.strings) property lang: def __get__(self): @@ -336,7 +336,7 @@ cdef class Vocab: return None else: return self.vectors.to_bytes(exclude='strings.json') - + getters = OrderedDict(( ('strings', lambda: self.strings.to_bytes()), ('lexemes', lambda: self.lexemes_to_bytes()), From 8f42f8d305787cb74bf7d85ef16c9cd40b948895 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 12:30:16 -0500 Subject: [PATCH 053/649] Remove unused 'preprocess' argument in Tok2Vec' --- spacy/_ml.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 2f6a36942..2b9a98fd2 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -226,7 +226,7 @@ def drop_layer(layer, factor=2.): return model -def Tok2Vec(width, embed_size, preprocess=True, pretrained_dims=0): +def Tok2Vec(width, embed_size, pretrained_dims=0): cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') @@ -242,7 +242,7 @@ def Tok2Vec(width, embed_size, preprocess=True, pretrained_dims=0): >> LN(Maxout(width, width*4, pieces=3)), column=5) ) ) - if pretrained_dims: + if pretrained_dims >= 1: embed = concatenate_lists(trained_vectors, SpacyVectors) else: embed = trained_vectors From c013e5996f3aec8fe6813f1af4386637c29114ec Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 13:13:20 -0500 Subject: [PATCH 054/649] Fix parser test --- spacy/tests/parser/test_neural_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 30a6367c8..29350b30a 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -26,7 +26,7 @@ def arc_eager(vocab): @pytest.fixture def tok2vec(): - return Tok2Vec(8, 100, preprocess=doc2feats()) + return Tok2Vec(8, 100) @pytest.fixture From 2148ae605b193ca1ff9859a5fc717989b6613034 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 17:36:04 -0500 Subject: [PATCH 055/649] Dont use iterated convolutions --- spacy/_ml.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 2b9a98fd2..ce818c8e1 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -252,11 +252,8 @@ def Tok2Vec(width, embed_size, pretrained_dims=0): embed >> with_flatten( Affine(width, width+pretrained_dims) - >> convolution - >> convolution - >> convolution - >> convolution, - pad=1) + >> convolution ** 4, + pad=4) ) # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width From 2480f8f521ea22b74ff90aed0853e9c0e2543b1b Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 18 Sep 2017 15:31:57 +0200 Subject: [PATCH 056/649] Add missing return in Doc.from_disk() (closes #1330) --- spacy/tokens/doc.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx index 3b1f38b68..fcb5a16fa 100644 --- a/spacy/tokens/doc.pyx +++ b/spacy/tokens/doc.pyx @@ -660,7 +660,7 @@ cdef class Doc: """ with path.open('rb') as file_: bytes_data = file_.read() - self.from_bytes(bytes_data, **exclude) + return self.from_bytes(bytes_data, **exclude) def to_bytes(self, **exclude): """Serialize, i.e. export the document contents to a binary string. From 7b3f391f80a8c30b815cd202f5340933280120d5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 11:35:59 -0500 Subject: [PATCH 057/649] Try dropping the Affine layer, conditionally --- spacy/_ml.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index ce818c8e1..dde78af8a 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -251,7 +251,8 @@ def Tok2Vec(width, embed_size, pretrained_dims=0): tok2vec = ( embed >> with_flatten( - Affine(width, width+pretrained_dims) + (Affine(width, width+pretrained_dims) + if pretrained_dims else noop()) >> convolution ** 4, pad=4) ) From 3fa76c17d19b49162652976207e030e484888f02 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 15:00:05 -0500 Subject: [PATCH 058/649] Refactor Tok2Vec --- spacy/_ml.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index dde78af8a..d79d6e39b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -242,20 +242,24 @@ def Tok2Vec(width, embed_size, pretrained_dims=0): >> LN(Maxout(width, width*4, pieces=3)), column=5) ) ) - if pretrained_dims >= 1: - embed = concatenate_lists(trained_vectors, SpacyVectors) - else: - embed = trained_vectors convolution = Residual(ExtractWindow(nW=1) >> LN(Maxout(width, width*3, pieces=3))) - tok2vec = ( - embed - >> with_flatten( - (Affine(width, width+pretrained_dims) - if pretrained_dims else noop()) - >> convolution ** 4, - pad=4) - ) + if pretrained_dims >= 1: + embed = concatenate_lists(trained_vectors, SpacyVectors) + tok2vec = ( + embed + >> with_flatten( + Affine(width, width+pretrained_dims) + >> convolution ** 4, + pad=4) + ) + else: + embed = trained_vectors + tok2vec = ( + embed + >> with_flatten(convolution ** 4, pad=4) + ) + # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width tok2vec.embed = embed From c858927271b8e28e587c067e53b3d3b66c2e1559 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 18:04:16 -0500 Subject: [PATCH 059/649] Copy vectors to GPU on begin training --- spacy/language.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spacy/language.py b/spacy/language.py index 2a5558824..25648ed42 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -364,6 +364,9 @@ class Language(object): device.use() Model.ops = CupyOps() Model.Ops = CupyOps + if self.vocab.vectors.data.shape[1] >= 1: + self.vocab.vectors.data = Model.ops.asarray( + self.vocab.vectors.data) else: device = None for proc in self.pipeline: From a0c4b33d0354fa841c93293de248bf6cf294e80d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 18:04:47 -0500 Subject: [PATCH 060/649] Support resuming a model during spacy train --- spacy/cli/train.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 7ad94ce9c..8a3446cfe 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -53,7 +53,6 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, if dev_path and not dev_path.exists(): prints(dev_path, title="Development data not found", exits=1) - lang_class = util.get_lang_class(lang) pipeline = ['token_vectors', 'tags', 'dependencies', 'entities'] if no_tagger and 'tags' in pipeline: pipeline.remove('tags') @@ -71,22 +70,22 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, util.env_opt('batch_to', 64), util.env_opt('batch_compound', 1.001)) - if resume: - prints(output_path / 'model9.pickle', title="Resuming training") - nlp = dill.load((output_path / 'model9.pickle').open('rb')) - else: + if not resume: + lang_class = util.get_lang_class(lang) nlp = lang_class(pipeline=pipeline) + else: + print("Load resume") + nlp = _resume_model(lang, pipeline) + lang_class = nlp.__class__ + corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() - optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) nlp._optimizer = None print("Itn.\tLoss\tUAS\tNER P.\tNER R.\tNER F.\tTag %\tToken %") try: for i in range(n_iter): - if resume: - i += 20 with tqdm.tqdm(total=n_train_words, leave=False) as pbar: train_docs = corpus.train_docs(nlp, projectivize=True, noise_level=0.0, gold_preproc=gold_preproc, max_length=0) @@ -120,6 +119,17 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, dill.dump(nlp, file_, -1) +def _resume_model(lang, pipeline): + nlp = util.load_model(lang) + pipes = {getattr(pipe, 'name', None) for pipe in nlp.pipeline} + for name in pipeline: + if name not in pipes: + factory = nlp.Defaults.factories[name] + nlp.pipeline.extend(factory(nlp)) + nlp.meta['pipeline'] = pipeline + return nlp + + def _render_parses(i, to_render): to_render[0].user_data['title'] = "Batch %d" % i with Path('/tmp/entities.html').open('w') as file_: From 40837b275d9ed028bbdbe10ecaeb7af5d395f8eb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 18:05:38 -0500 Subject: [PATCH 061/649] Fix tensorizer with pretrained vectors --- spacy/pipeline.pyx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 4643b759a..824b6932d 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -285,7 +285,9 @@ class TokenVectorEncoder(BaseThincComponent): pipeline (list): The pipeline the model is part of. """ if self.model is True: - self.model = self.Model(**self.cfg) + self.model = self.Model( + pretrained_dims=self.vocab.vectors_length, + **self.cfg) class NeuralTagger(BaseThincComponent): From 2489dcaccf6fe4551a05804d982408d2899ce70f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 19 Sep 2017 23:42:12 +0200 Subject: [PATCH 062/649] Fix serialization of parser --- spacy/syntax/nn_parser.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 532a69b36..52e677390 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -307,6 +307,8 @@ cdef class Parser: cfg['beam_width'] = util.env_opt('beam_width', 1) if 'beam_density' not in cfg: cfg['beam_density'] = util.env_opt('beam_density', 0.0) + if 'pretrained_dims' not in cfg: + cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): From b36a38f63dda5e229212e8c10521e7f21fe418fd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 19 Sep 2017 23:42:27 +0200 Subject: [PATCH 063/649] Fix serialization of pretrained_dims property --- spacy/pipeline.pyx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 824b6932d..29670c155 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -214,6 +214,7 @@ class TokenVectorEncoder(BaseThincComponent): self.vocab = vocab self.model = model self.cfg = dict(cfg) + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] def __call__(self, doc): """Add context-sensitive vectors to a `Doc`, e.g. from a CNN or LSTM @@ -458,7 +459,7 @@ class NeuralTagger(BaseThincComponent): token_vector_width = util.env_opt('token_vector_width', self.cfg.get('token_vector_width', 128)) self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, - pretrained_dims=self.vocab.vectors_length) + **self.cfg) self.model.from_bytes(p.open('rb').read()) def load_tag_map(p): @@ -470,10 +471,10 @@ class NeuralTagger(BaseThincComponent): exc=self.vocab.morphology.exc) deserialize = OrderedDict(( + ('cfg', lambda p: self.cfg.update(_load_cfg(p))), ('vocab', lambda p: self.vocab.from_disk(p)), ('tag_map', load_tag_map), ('model', load_model), - ('cfg', lambda p: self.cfg.update(_load_cfg(p))) )) util.from_disk(path, deserialize, exclude) return self From 78301b2d29fe0c37fb05d98b3cf141cc3d6b060a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 00:19:34 +0200 Subject: [PATCH 064/649] Avoid comparison to None in Tok2Vec --- spacy/_ml.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index d79d6e39b..eaf72b44f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -227,6 +227,8 @@ def drop_layer(layer, factor=2.): def Tok2Vec(width, embed_size, pretrained_dims=0): + if pretrained_dims is None: + pretrained_dims = 0 cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') From 828cc91545458613dff701e804eaec442423e739 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 21:54:31 +0200 Subject: [PATCH 065/649] Fix PhraseMatcher for spaCy 2 --- spacy/matcher.pyx | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index c75d23957..d321218b8 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -426,7 +426,7 @@ cdef class PhraseMatcher: self._phrase_key = self.mem.alloc(max_length, sizeof(attr_t)) self.max_length = max_length self.vocab = vocab - self.matcher = Matcher(self.vocab, {}) + self.matcher = Matcher(self.vocab) self.phrase_ids = PreshMap() for phrase in phrases: if len(phrase) < max_length: @@ -435,7 +435,7 @@ cdef class PhraseMatcher: abstract_patterns = [] for length in range(1, max_length): abstract_patterns.append([{tag: True} for tag in get_bilou(length)]) - self.matcher.add('Candidate', 'MWE', {}, abstract_patterns, acceptor=self.accept_match) + self.matcher.add('Candidate', None, *abstract_patterns) def add(self, Doc tokens): cdef int length = tokens.length @@ -454,22 +454,19 @@ cdef class PhraseMatcher: self.phrase_ids[key] = True def __call__(self, Doc doc): - matches = [] - for ent_id, label, start, end in self.matcher(doc): - cand = doc[start : end] - start = cand[0].idx - end = cand[-1].idx + len(cand[-1]) - matches.append((start, end, cand.root.tag_, cand.text, 'MWE')) - for match in matches: - doc.merge(*match) - return matches + matches = self.matcher(doc) + accepted = [] + for ent_id, start, end in matches: + if self.accept_match(doc, ent_id, start, end): + accepted.append((ent_id, start, end)) + return accepted def pipe(self, stream, batch_size=1000, n_threads=2): for doc in stream: self(doc) yield doc - def accept_match(self, Doc doc, attr_t ent_id, attr_t label, int start, int end): + def accept_match(self, Doc doc, attr_t ent_id, int start, int end): assert (end - start) < self.max_length cdef int i, j for i in range(self.max_length): @@ -478,6 +475,6 @@ cdef class PhraseMatcher: self._phrase_key[i] = doc.c[j].lex.orth cdef hash_t key = hash64(self._phrase_key, self.max_length * sizeof(attr_t), 0) if self.phrase_ids.get(key): - return (ent_id, label, start, end) + return True else: return False From 43ad250dd5c4a9731acf648a40b8218fc677df81 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 21:54:49 +0200 Subject: [PATCH 066/649] Update matcher tests --- spacy/tests/test_matcher.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py index 388aab03e..651707019 100644 --- a/spacy/tests/test_matcher.py +++ b/spacy/tests/test_matcher.py @@ -34,7 +34,6 @@ def test_matcher_from_api_docs(en_vocab): assert len(patterns[0]) -@pytest.mark.xfail def test_matcher_from_usage_docs(en_vocab): text = "Wow 😀 This is really cool! 😂 😂" doc = get_doc(en_vocab, words=text.split(' ')) @@ -46,7 +45,8 @@ def test_matcher_from_usage_docs(en_vocab): if doc.vocab.strings[match_id] == 'HAPPY': doc.sentiment += 0.1 span = doc[start : end] - token = span.merge(norm='happy emoji') + token = span.merge() + token.vocab[token.text].norm_ = 'happy emoji' matcher = Matcher(en_vocab) matcher.add('HAPPY', label_sentiment, *pos_patterns) @@ -98,7 +98,6 @@ def test_matcher_match_multi(matcher): (doc.vocab.strings['Java'], 5, 6)] -@pytest.mark.xfail def test_matcher_phrase_matcher(en_vocab): words = ["Google", "Now"] doc = get_doc(en_vocab, words) From cc408fc1898b7693a3130483e51119e9d78d0693 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 22:20:35 +0200 Subject: [PATCH 067/649] Make PhraseMatcher API like Matcher API --- spacy/matcher.pyx | 72 ++++++++++++++++++++++--------------- spacy/tests/test_matcher.py | 3 +- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index d321218b8..ba3559966 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -421,52 +421,67 @@ cdef class PhraseMatcher: cdef int max_length cdef attr_t* _phrase_key - def __init__(self, Vocab vocab, phrases, max_length=10): + cdef public object _callbacks + + def __init__(self, Vocab vocab, max_length=10): self.mem = Pool() self._phrase_key = self.mem.alloc(max_length, sizeof(attr_t)) self.max_length = max_length self.vocab = vocab self.matcher = Matcher(self.vocab) self.phrase_ids = PreshMap() - for phrase in phrases: - if len(phrase) < max_length: - self.add(phrase) - abstract_patterns = [] for length in range(1, max_length): abstract_patterns.append([{tag: True} for tag in get_bilou(length)]) self.matcher.add('Candidate', None, *abstract_patterns) + self._callbacks = {} - def add(self, Doc tokens): - cdef int length = tokens.length - assert length < self.max_length - tags = get_bilou(length) - assert len(tags) == length, length + def add(self, key, on_match, *docs): + cdef Doc doc + for doc in docs: + if len(doc) >= self.max_length: + msg = ( + "Pattern length (%d) >= phrase_matcher.max_length (%d). " + "Length can be set on initialization, up to 10." + ) + raise ValueError(msg % (len(doc), self.max_length)) + cdef hash_t ent_id = self.matcher._normalize_key(key) + self._callbacks[ent_id] = on_match + cdef int length cdef int i - for i in range(self.max_length): - self._phrase_key[i] = 0 - for i, tag in enumerate(tags): - lexeme = self.vocab[tokens.c[i].lex.orth] - lexeme.set_flag(tag, True) - self._phrase_key[i] = lexeme.orth - cdef hash_t key = hash64(self._phrase_key, self.max_length * sizeof(attr_t), 0) - self.phrase_ids[key] = True + cdef hash_t phrase_hash + for doc in docs: + length = doc.length + tags = get_bilou(length) + for i in range(self.max_length): + self._phrase_key[i] = 0 + for i, tag in enumerate(tags): + lexeme = self.vocab[doc.c[i].lex.orth] + lexeme.set_flag(tag, True) + self._phrase_key[i] = lexeme.orth + phrase_hash = hash64(self._phrase_key, + self.max_length * sizeof(attr_t), 0) + self.phrase_ids[phrase_hash] = ent_id def __call__(self, Doc doc): - matches = self.matcher(doc) - accepted = [] - for ent_id, start, end in matches: - if self.accept_match(doc, ent_id, start, end): - accepted.append((ent_id, start, end)) - return accepted + matches = [] + for _, start, end in self.matcher(doc): + ent_id = self.accept_match(doc, start, end) + if ent_id is not None: + matches.append((ent_id, start, end)) + for i, (ent_id, start, end) in enumerate(matches): + on_match = self._callbacks.get(ent_id) + if on_match is not None: + on_match(self, doc, i, matches) + return matches def pipe(self, stream, batch_size=1000, n_threads=2): for doc in stream: self(doc) yield doc - def accept_match(self, Doc doc, attr_t ent_id, int start, int end): + def accept_match(self, Doc doc, int start, int end): assert (end - start) < self.max_length cdef int i, j for i in range(self.max_length): @@ -474,7 +489,8 @@ cdef class PhraseMatcher: for i, j in enumerate(range(start, end)): self._phrase_key[i] = doc.c[j].lex.orth cdef hash_t key = hash64(self._phrase_key, self.max_length * sizeof(attr_t), 0) - if self.phrase_ids.get(key): - return True + ent_id = self.phrase_ids.get(key) + if ent_id == 0: + return None else: - return False + return ent_id diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py index 651707019..1b9f92519 100644 --- a/spacy/tests/test_matcher.py +++ b/spacy/tests/test_matcher.py @@ -101,7 +101,8 @@ def test_matcher_match_multi(matcher): def test_matcher_phrase_matcher(en_vocab): words = ["Google", "Now"] doc = get_doc(en_vocab, words) - matcher = PhraseMatcher(en_vocab, [doc]) + matcher = PhraseMatcher(en_vocab) + matcher.add('COMPANY', None, doc) words = ["I", "like", "Google", "Now", "best"] doc = get_doc(en_vocab, words) assert len(matcher(doc)) == 1 From 0c93c73e496f9c57da523393e33a6f88aa3eac25 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 22:26:40 +0200 Subject: [PATCH 068/649] Add __reduce__ method for PhraseMatcher --- spacy/matcher.pyx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index ba3559966..ef4044d21 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -422,6 +422,7 @@ cdef class PhraseMatcher: cdef attr_t* _phrase_key cdef public object _callbacks + cdef public object _patterns def __init__(self, Vocab vocab, max_length=10): self.mem = Pool() @@ -436,6 +437,9 @@ cdef class PhraseMatcher: self.matcher.add('Candidate', None, *abstract_patterns) self._callbacks = {} + def __reduce__(self): + return (self.__class__, (self.vocab,), None, None) + def add(self, key, on_match, *docs): cdef Doc doc for doc in docs: From 01858e9b5972a8c1dec86f88eef3f17fea63cdc6 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 22:51:41 +0200 Subject: [PATCH 069/649] Fix PhraseMatcher example --- examples/multi_word_matches.py | 74 +++++++++++++++++----------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/examples/multi_word_matches.py b/examples/multi_word_matches.py index 73f48bf42..ca9b0cc92 100644 --- a/examples/multi_word_matches.py +++ b/examples/multi_word_matches.py @@ -20,72 +20,72 @@ The algorithm is O(n) at run-time for document of length n because we're only ev matching over the tag patterns. So no matter how many phrases we're looking for, our pattern set stays very small (exact size depends on the maximum length we're looking for, as the query language currently has no quantifiers) + +The example expects a .bz2 file from the Reddit corpus, and a patterns file, +formatted in jsonl as a sequence of entries like this: + +{"text":"Anchorage"} +{"text":"Angola"} +{"text":"Ann Arbor"} +{"text":"Annapolis"} +{"text":"Appalachia"} +{"text":"Argentina"} """ from __future__ import print_function, unicode_literals, division -from ast import literal_eval from bz2 import BZ2File import time import math import codecs import plac +import ujson -from preshed.maps import PreshMap -from preshed.counter import PreshCounter -from spacy.strings import hash_string -from spacy.en import English from spacy.matcher import PhraseMatcher +import spacy def read_gazetteer(tokenizer, loc, n=-1): for i, line in enumerate(open(loc)): - phrase = literal_eval('u' + line.strip()) - if ' (' in phrase and phrase.endswith(')'): - phrase = phrase.split(' (', 1)[0] - if i >= n: - break - phrase = tokenizer(phrase) - if all((t.is_lower and t.prob >= -10) for t in phrase): - continue + data = ujson.loads(line.strip()) + phrase = tokenizer(data['text']) + for w in phrase: + _ = tokenizer.vocab[w.text] if len(phrase) >= 2: yield phrase -def read_text(bz2_loc): +def read_text(bz2_loc, n=10000): with BZ2File(bz2_loc) as file_: - for line in file_: - yield line.decode('utf8') + for i, line in enumerate(file_): + data = ujson.loads(line) + yield data['body'] + if i >= n: + break def get_matches(tokenizer, phrases, texts, max_length=6): - matcher = PhraseMatcher(tokenizer.vocab, phrases, max_length=max_length) - print("Match") + matcher = PhraseMatcher(tokenizer.vocab, max_length=max_length) + matcher.add('Phrase', None, *phrases) for text in texts: doc = tokenizer(text) + for w in doc: + _ = doc.vocab[w.text] matches = matcher(doc) - for mwe in doc.ents: - yield mwe + for ent_id, start, end in matches: + yield (ent_id, doc[start:end].text) -def main(patterns_loc, text_loc, counts_loc, n=10000000): - nlp = English(parser=False, tagger=False, entity=False) - print("Make matcher") - phrases = read_gazetteer(nlp.tokenizer, patterns_loc, n=n) - counts = PreshCounter() +def main(patterns_loc, text_loc, n=10000): + nlp = spacy.blank('en') + nlp.vocab.lex_attr_getters = {} + phrases = read_gazetteer(nlp.tokenizer, patterns_loc) + count = 0 t1 = time.time() - for mwe in get_matches(nlp.tokenizer, phrases, read_text(text_loc)): - counts.inc(hash_string(mwe.text), 1) + for ent_id, text in get_matches(nlp.tokenizer, phrases, read_text(text_loc, n=n)): + count += 1 t2 = time.time() - print("10m tokens in %d s" % (t2 - t1)) - - with codecs.open(counts_loc, 'w', 'utf8') as file_: - for phrase in read_gazetteer(nlp.tokenizer, patterns_loc, n=n): - text = phrase.string - key = hash_string(text) - count = counts[key] - if count != 0: - file_.write('%d\t%s\n' % (count, text)) - + print("%d docs in %.3f s. %d matches" % (n, (t2 - t1), count)) + if __name__ == '__main__': if False: From f92ab03dc87711ca03cd4a29a886bc1c827b0934 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 22:51:58 +0200 Subject: [PATCH 070/649] Rename phrase matcher example --- examples/{multi_word_matches.py => phrase_matcher.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{multi_word_matches.py => phrase_matcher.py} (100%) diff --git a/examples/multi_word_matches.py b/examples/phrase_matcher.py similarity index 100% rename from examples/multi_word_matches.py rename to examples/phrase_matcher.py From 842e21de9f54c3e37e43f698c75a246d69d4551c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 23:55:30 +0200 Subject: [PATCH 071/649] Fix int type error for Python 2 --- spacy/matcher.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index ef4044d21..5106161a0 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -466,7 +466,7 @@ cdef class PhraseMatcher: self._phrase_key[i] = lexeme.orth phrase_hash = hash64(self._phrase_key, self.max_length * sizeof(attr_t), 0) - self.phrase_ids[phrase_hash] = ent_id + self.phrase_ids.set(phrase_hash, ent_id) def __call__(self, Doc doc): matches = [] From f5144f04be1e5b6d7bb937611f1303ec39054f99 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:14:41 -0500 Subject: [PATCH 072/649] Add argument for CNN maxout pieces --- spacy/_ml.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index eaf72b44f..004d9ca73 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -226,9 +226,9 @@ def drop_layer(layer, factor=2.): return model -def Tok2Vec(width, embed_size, pretrained_dims=0): - if pretrained_dims is None: - pretrained_dims = 0 +def Tok2Vec(width, embed_size, pretrained_dims=0, **kwargs): + assert pretrained_dims is not None + cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 3) cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') @@ -244,7 +244,10 @@ def Tok2Vec(width, embed_size, pretrained_dims=0): >> LN(Maxout(width, width*4, pieces=3)), column=5) ) ) - convolution = Residual(ExtractWindow(nW=1) >> LN(Maxout(width, width*3, pieces=3))) + convolution = Residual( + ExtractWindow(nW=1) + >> LN(Maxout(width, width*3, pieces=cnn_maxout_pieces)) + ) if pretrained_dims >= 1: embed = concatenate_lists(trained_vectors, SpacyVectors) From b832f89ff8cd7c959c6645ad71aed1f9c65617b2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:15:20 -0500 Subject: [PATCH 073/649] Add resume_training function --- spacy/language.py | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 25648ed42..9d1538a18 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -342,7 +342,28 @@ class Language(object): for doc, gold in docs_golds: yield doc, gold - def begin_training(self, get_gold_tuples, **cfg): + def resume_training(self, **cfg): + if cfg.get('device', -1) >= 0: + device = util.use_gpu(cfg['device']) + if self.vocab.vectors.data.shape[1] >= 1: + self.vocab.vectors.data = Model.ops.asarray( + self.vocab.vectors.data) + else: + device = None + learn_rate = util.env_opt('learn_rate', 0.001) + beta1 = util.env_opt('optimizer_B1', 0.9) + beta2 = util.env_opt('optimizer_B2', 0.999) + eps = util.env_opt('optimizer_eps', 1e-08) + L2 = util.env_opt('L2_penalty', 1e-6) + max_grad_norm = util.env_opt('grad_norm_clip', 1.) + self._optimizer = Adam(Model.ops, learn_rate, L2=L2, beta1=beta1, + beta2=beta2, eps=eps) + self._optimizer.max_grad_norm = max_grad_norm + self._optimizer.device = device + return self._optimizer + + + def begin_training(self, get_gold_tuples=None, **cfg): """Allocate models, pre-process training data and acquire a trainer and optimizer. Used as a contextmanager. @@ -353,17 +374,14 @@ class Language(object): if self.parser: self.pipeline.append(NeuralLabeller(self.vocab)) # Populate vocab - for _, annots_brackets in get_gold_tuples(): - for annots, _ in annots_brackets: - for word in annots[1]: - _ = self.vocab[word] + if get_gold_tuples is not None: + for _, annots_brackets in get_gold_tuples(): + for annots, _ in annots_brackets: + for word in annots[1]: + _ = self.vocab[word] contexts = [] if cfg.get('device', -1) >= 0: - import cupy.cuda.device - device = cupy.cuda.device.Device(cfg['device']) - device.use() - Model.ops = CupyOps() - Model.Ops = CupyOps + device = util.use_gpu(cfg['device']) if self.vocab.vectors.data.shape[1] >= 1: self.vocab.vectors.data = Model.ops.asarray( self.vocab.vectors.data) From 24e85c20484336cfe386bd97e8c3e2e097a315a3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:15:49 -0500 Subject: [PATCH 074/649] Pass values for CNN maxout pieces option --- spacy/pipeline.pyx | 8 +++++--- spacy/syntax/nn_parser.pyx | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 29670c155..dcc06cdf7 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -215,6 +215,7 @@ class TokenVectorEncoder(BaseThincComponent): self.model = model self.cfg = dict(cfg) self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] + self.cfg.setdefault('cnn_maxout_pieces', 2) def __call__(self, doc): """Add context-sensitive vectors to a `Doc`, e.g. from a CNN or LSTM @@ -286,9 +287,7 @@ class TokenVectorEncoder(BaseThincComponent): pipeline (list): The pipeline the model is part of. """ if self.model is True: - self.model = self.Model( - pretrained_dims=self.vocab.vectors_length, - **self.cfg) + self.model = self.Model(**self.cfg) class NeuralTagger(BaseThincComponent): @@ -297,6 +296,7 @@ class NeuralTagger(BaseThincComponent): self.vocab = vocab self.model = model self.cfg = dict(cfg) + self.cfg.setdefault('cnn_maxout_pieces', 2) def __call__(self, doc): tags = self.predict(([doc], [doc.tensor])) @@ -442,6 +442,7 @@ class NeuralTagger(BaseThincComponent): return self def to_disk(self, path, **exclude): + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] serialize = OrderedDict(( ('vocab', lambda p: self.vocab.to_disk(p)), ('tag_map', lambda p: p.open('wb').write(msgpack.dumps( @@ -486,6 +487,7 @@ class NeuralLabeller(NeuralTagger): self.vocab = vocab self.model = model self.cfg = dict(cfg) + self.cfg.setdefault('cnn_maxout_pieces', 2) @property def labels(self): diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 52e677390..ad0e35428 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -309,6 +309,7 @@ cdef class Parser: cfg['beam_density'] = util.env_opt('beam_density', 0.0) if 'pretrained_dims' not in cfg: cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] + cfg.setdefault('cnn_maxout_pieces', 2) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): From ffda38356a1d51c1bced19c1c1bfdced3756c891 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:16:35 -0500 Subject: [PATCH 075/649] Add util function to enable GPU --- spacy/util.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spacy/util.py b/spacy/util.py index a55eed2f8..429d9bae5 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -14,6 +14,7 @@ import numpy import io import dill from collections import OrderedDict +from thinc.neural._classes.model import Model import msgpack import msgpack_numpy @@ -557,3 +558,14 @@ def minify_html(html): RETURNS (unicode): "Minified" HTML. """ return html.strip().replace(' ', '').replace('\n', '') + + +def use_gpu(gpu_id): + import cupy.cuda.device + from thinc.neural.ops import CupyOps + device = cupy.cuda.device.Device(gpu_id) + device.use() + Model.ops = CupyOps() + Model.Ops = CupyOps + return device + From 1d73dec8b12a84dcf3d3c7949fe257b1cc0d011f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:17:10 -0500 Subject: [PATCH 076/649] Refactor train script --- spacy/cli/train.py | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 8a3446cfe..f80e285c0 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -8,6 +8,7 @@ import cytoolz from pathlib import Path import dill import tqdm +from thinc.neural._classes.model import Model from thinc.neural.optimizers import linear_decay from timeit import default_timer as timer @@ -69,18 +70,20 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, batch_sizes = util.compounding(util.env_opt('batch_from', 1), util.env_opt('batch_to', 64), util.env_opt('batch_compound', 1.001)) + corpus = GoldCorpus(train_path, dev_path, limit=n_sents) + n_train_words = corpus.count_train() if not resume: lang_class = util.get_lang_class(lang) nlp = lang_class(pipeline=pipeline) + optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) else: print("Load resume") - nlp = _resume_model(lang, pipeline) + util.use_gpu(use_gpu) + nlp = _resume_model(lang, pipeline, corpus) + optimizer = nlp.resume_training(device=use_gpu) lang_class = nlp.__class__ - corpus = GoldCorpus(train_path, dev_path, limit=n_sents) - n_train_words = corpus.count_train() - optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) nlp._optimizer = None print("Itn.\tLoss\tUAS\tNER P.\tNER R.\tNER F.\tTag %\tToken %") @@ -101,11 +104,11 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, util.set_env_log(False) epoch_model_path = output_path / ('model%d' % i) nlp.to_disk(epoch_model_path) - nlp_loaded = lang_class(pipeline=pipeline) - nlp_loaded = nlp_loaded.from_disk(epoch_model_path) - scorer = nlp_loaded.evaluate( + #nlp_loaded = lang_class(pipeline=pipeline) + #nlp_loaded = nlp_loaded.from_disk(epoch_model_path) + scorer = nlp.evaluate( corpus.dev_docs( - nlp_loaded, + nlp, gold_preproc=gold_preproc)) acc_loc =(output_path / ('model%d' % i) / 'accuracy.json') with acc_loc.open('w') as file_: @@ -114,19 +117,30 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, print_progress(i, losses, scorer.scores) finally: print("Saving model...") - with (output_path / 'model-final.pickle').open('wb') as file_: - with nlp.use_params(optimizer.averages): - dill.dump(nlp, file_, -1) + try: + with (output_path / 'model-final.pickle').open('wb') as file_: + with nlp.use_params(optimizer.averages): + dill.dump(nlp, file_, -1) + except: + pass -def _resume_model(lang, pipeline): +def _resume_model(lang, pipeline, corpus): nlp = util.load_model(lang) pipes = {getattr(pipe, 'name', None) for pipe in nlp.pipeline} for name in pipeline: if name not in pipes: factory = nlp.Defaults.factories[name] - nlp.pipeline.extend(factory(nlp)) + for pipe in factory(nlp): + if hasattr(pipe, 'begin_training'): + pipe.begin_training(corpus.train_tuples, + pipeline=nlp.pipeline) + nlp.pipeline.append(pipe) nlp.meta['pipeline'] = pipeline + if nlp.vocab.vectors.data.shape[1] >= 1: + nlp.vocab.vectors.data = Model.ops.asarray( + nlp.vocab.vectors.data) + return nlp From 20193371f5deb85137b892158465344a6af7fbcb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 21 Sep 2017 14:59:48 +0200 Subject: [PATCH 077/649] Don't share CNN, to reduce complexities --- spacy/_ml.py | 20 ++--- spacy/about.py | 3 +- spacy/cli/train.py | 2 +- spacy/language.py | 21 +---- spacy/pipeline.pyx | 42 +++------ spacy/syntax/_beam_utils.pyx | 4 +- spacy/syntax/nn_parser.pyx | 106 ++++++++--------------- spacy/tests/parser/test_neural_parser.py | 21 ++--- 8 files changed, 69 insertions(+), 150 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 004d9ca73..37bf6335b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -226,8 +226,8 @@ def drop_layer(layer, factor=2.): return model -def Tok2Vec(width, embed_size, pretrained_dims=0, **kwargs): - assert pretrained_dims is not None +def Tok2Vec(width, embed_size, **kwargs): + pretrained_dims = kwargs.get('pretrained_dims', 0) cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 3) cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): @@ -474,20 +474,18 @@ def getitem(i): return X[i], None return layerize(getitem_fwd) + def build_tagger_model(nr_class, token_vector_width, pretrained_dims=0, **cfg): embed_size = util.env_opt('embed_size', 4000) with Model.define_operators({'>>': chain, '+': add}): - # Input: (doc, tensor) tuples - private_tok2vec = Tok2Vec(token_vector_width, embed_size, - pretrained_dims=pretrained_dims) - model = ( - fine_tune(private_tok2vec) - >> with_flatten( - Maxout(token_vector_width, token_vector_width) - >> Softmax(nr_class, token_vector_width) - ) + tok2vec = Tok2Vec(token_vector_width, embed_size, + pretrained_dims=pretrained_dims) + model = with_flatten( + tok2vec + >> Softmax(nr_class, token_vector_width) ) model.nI = None + model.tok2vec = tok2vec return model diff --git a/spacy/about.py b/spacy/about.py index 40444ffd1..0ae019946 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,12 +3,13 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a14' +__version__ = '2.0.0a15' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' __email__ = 'contact@explosion.ai' __license__ = 'MIT' +__release__ = False __docs_models__ = 'https://spacy.io/docs/usage/models' __download_url__ = 'https://github.com/explosion/spacy-models/releases/download' diff --git a/spacy/cli/train.py b/spacy/cli/train.py index f80e285c0..c87aabb01 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -55,7 +55,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, prints(dev_path, title="Development data not found", exits=1) - pipeline = ['token_vectors', 'tags', 'dependencies', 'entities'] + pipeline = ['tags', 'dependencies', 'entities'] if no_tagger and 'tags' in pipeline: pipeline.remove('tags') if no_parser and 'dependencies' in pipeline: pipeline.remove('dependencies') if no_entities and 'entities' in pipeline: pipeline.remove('entities') diff --git a/spacy/language.py b/spacy/language.py index 9d1538a18..a6ab0453f 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -303,31 +303,17 @@ class Language(object): if self._optimizer is None: self._optimizer = Adam(Model.ops, 0.001) sgd = self._optimizer - tok2vec = self.pipeline[0] grads = {} def get_grads(W, dW, key=None): grads[key] = (W, dW) - pipes = list(self.pipeline[1:]) + pipes = list(self.pipeline) random.shuffle(pipes) - tokvecses, bp_tokvecses = tok2vec.model.begin_update(docs, drop=drop) - all_d_tokvecses = [tok2vec.model.ops.allocate(tv.shape) for tv in tokvecses] for proc in pipes: if not hasattr(proc, 'update'): continue - d_tokvecses = proc.update((docs, tokvecses), golds, - drop=drop, sgd=get_grads, losses=losses) - if update_shared and d_tokvecses is not None: - for i, d_tv in enumerate(d_tokvecses): - all_d_tokvecses[i] += d_tv - if update_shared and bp_tokvecses is not None: - bp_tokvecses(all_d_tokvecses, sgd=sgd) + proc.update(docs, golds, drop=drop, sgd=get_grads, losses=losses) for key, (W, dW) in grads.items(): sgd(W, dW, key=key) - # Clear the tensor variable, to free GPU memory. - # If we don't do this, the memory leak gets pretty - # bad, because we may be holding part of a batch. - for doc in docs: - doc.tensor = None def preprocess_gold(self, docs_golds): """Can be called before training to pre-process gold data. By default, @@ -371,8 +357,6 @@ class Language(object): **cfg: Config parameters. returns: An optimizer """ - if self.parser: - self.pipeline.append(NeuralLabeller(self.vocab)) # Populate vocab if get_gold_tuples is not None: for _, annots_brackets in get_gold_tuples(): @@ -418,7 +402,6 @@ class Language(object): assert len(docs) == len(golds) for doc, gold in zip(docs, golds): scorer.score(doc, gold) - doc.tensor = None return scorer @contextmanager diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index dcc06cdf7..8ad62d696 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -299,27 +299,25 @@ class NeuralTagger(BaseThincComponent): self.cfg.setdefault('cnn_maxout_pieces', 2) def __call__(self, doc): - tags = self.predict(([doc], [doc.tensor])) + tags = self.predict([doc]) self.set_annotations([doc], tags) return doc def pipe(self, stream, batch_size=128, n_threads=-1): for docs in cytoolz.partition_all(batch_size, stream): docs = list(docs) - tokvecs = [d.tensor for d in docs] - tag_ids = self.predict((docs, tokvecs)) + tag_ids = self.predict(docs) self.set_annotations(docs, tag_ids) yield from docs - def predict(self, docs_tokvecs): - scores = self.model(docs_tokvecs) + def predict(self, docs): + scores = self.model(docs) scores = self.model.ops.flatten(scores) guesses = scores.argmax(axis=1) if not isinstance(guesses, numpy.ndarray): guesses = guesses.get() - tokvecs = docs_tokvecs[1] guesses = self.model.ops.unflatten(guesses, - [tv.shape[0] for tv in tokvecs]) + [len(d) for d in docs]) return guesses def set_annotations(self, docs, batch_tag_ids): @@ -339,20 +337,15 @@ class NeuralTagger(BaseThincComponent): idx += 1 doc.is_tagged = True - def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + def update(self, docs, golds, drop=0., sgd=None, losses=None): if losses is not None and self.name not in losses: losses[self.name] = 0. - docs, tokvecs = docs_tokvecs - if self.model.nI is None: - self.model.nI = tokvecs[0].shape[1] - tag_scores, bp_tag_scores = self.model.begin_update(docs_tokvecs, drop=drop) + tag_scores, bp_tag_scores = self.model.begin_update(docs, drop=drop) loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) - d_tokvecs = bp_tag_scores(d_tag_scores, sgd=sgd) if losses is not None: losses[self.name] += loss - return d_tokvecs def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) @@ -399,9 +392,9 @@ class NeuralTagger(BaseThincComponent): pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width, pretrained_dims=0): + def Model(cls, n_tags, token_vector_width, pretrained_dims=0, **cfg): return build_tagger_model(n_tags, token_vector_width, - pretrained_dims) + pretrained_dims, **cfg) def use_params(self, params): with self.model.use_params(params): @@ -573,15 +566,10 @@ class SimilarityHook(BaseThincComponent): yield self(doc) def predict(self, doc1, doc2): - return self.model.predict([(doc1.tensor, doc2.tensor)]) + return self.model.predict([(doc1, doc2)]) - def update(self, doc1_tensor1_doc2_tensor2, golds, sgd=None, drop=0.): - doc1s, tensor1s, doc2s, tensor2s = doc1_tensor1_doc2_tensor2 - sims, bp_sims = self.model.begin_update(zip(tensor1s, tensor2s), - drop=drop) - d_tensor1s, d_tensor2s = bp_sims(golds, sgd=sgd) - - return d_tensor1s, d_tensor2s + def update(self, doc1_doc2, golds, sgd=None, drop=0.): + sims, bp_sims = self.model.begin_update(doc1_doc2, drop=drop) def begin_training(self, _=tuple(), pipeline=None): """ @@ -636,15 +624,13 @@ class TextCategorizer(BaseThincComponent): for j, label in enumerate(self.labels): doc.cats[label] = float(scores[i, j]) - def update(self, docs_tensors, golds, state=None, drop=0., sgd=None, losses=None): - docs, tensors = docs_tensors + def update(self, docs, golds, state=None, drop=0., sgd=None, losses=None): scores, bp_scores = self.model.begin_update(docs, drop=drop) loss, d_scores = self.get_loss(docs, golds, scores) - d_tensors = bp_scores(d_scores, sgd=sgd) + bp_scores(d_scores, sgd=sgd) if losses is not None: losses.setdefault(self.name, 0.0) losses[self.name] += loss - return d_tensors def get_loss(self, docs, golds, scores): truths = numpy.zeros((len(golds), len(self.labels)), dtype='f') diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 4d90fe23b..a26900f6b 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -147,10 +147,10 @@ def get_token_ids(states, int n_tokens): nr_update = 0 def update_beam(TransitionSystem moves, int nr_feature, int max_steps, - states, tokvecs, golds, + states, golds, state2vec, vec2scores, int width, float density, - sgd=None, losses=None, drop=0.): + losses=None, drop=0.): global nr_update cdef MaxViolation violn nr_update += 1 diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index ad0e35428..77f99624a 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -48,7 +48,7 @@ from .. import util from ..util import get_async, get_cuda_stream from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune -from .._ml import Residual, drop_layer +from .._ml import Residual, drop_layer, flatten from ..compat import json_dumps from . import _parse_features @@ -244,8 +244,9 @@ cdef class Parser: hidden_width = util.env_opt('hidden_width', hidden_width) parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) embed_size = util.env_opt('embed_size', 4000) - tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, - pretrained_dims=cfg.get('pretrained_dims'))) + tok2vec = Tok2Vec(token_vector_width, embed_size, + pretrained_dims=cfg.get('pretrained_dims', 0)) + tok2vec = chain(tok2vec, flatten) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -277,7 +278,7 @@ cdef class Parser: 'hidden_width': hidden_width, 'maxout_pieces': parser_maxout_pieces } - return (tensors, lower, upper), cfg + return (tok2vec, lower, upper), cfg def __init__(self, Vocab vocab, moves=True, model=True, **cfg): """ @@ -309,7 +310,6 @@ cdef class Parser: cfg['beam_density'] = util.env_opt('beam_density', 0.0) if 'pretrained_dims' not in cfg: cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] - cfg.setdefault('cnn_maxout_pieces', 2) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): @@ -335,11 +335,11 @@ cdef class Parser: beam_density = self.cfg.get('beam_density', 0.0) cdef Beam beam if beam_width == 1: - states = self.parse_batch([doc], [doc.tensor]) + states = self.parse_batch([doc]) self.set_annotations([doc], states) return doc else: - beam = self.beam_parse([doc], [doc.tensor], + beam = self.beam_parse([doc], beam_width=beam_width, beam_density=beam_density)[0] output = self.moves.get_beam_annot(beam) state = beam.at(0) @@ -368,11 +368,10 @@ cdef class Parser: cdef Beam beam for docs in cytoolz.partition_all(batch_size, docs): docs = list(docs) - tokvecs = [doc.tensor for doc in docs] if beam_width == 1: - parse_states = self.parse_batch(docs, tokvecs) + parse_states = self.parse_batch(docs) else: - beams = self.beam_parse(docs, tokvecs, + beams = self.beam_parse(docs, beam_width=beam_width, beam_density=beam_density) parse_states = [] for beam in beams: @@ -380,7 +379,7 @@ cdef class Parser: self.set_annotations(docs, parse_states) yield from docs - def parse_batch(self, docs, tokvecses): + def parse_batch(self, docs): cdef: precompute_hiddens state2vec StateClass state @@ -391,21 +390,15 @@ cdef class Parser: int nr_class, nr_feat, nr_piece, nr_dim, nr_state if isinstance(docs, Doc): docs = [docs] - if isinstance(tokvecses, np.ndarray): - tokvecses = [tokvecses] - if USE_FINE_TUNE: - tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - else: - tokvecs = self.model[0].ops.flatten(tokvecses) + cuda_stream = get_cuda_stream() + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, + 0.0) + nr_state = len(docs) nr_class = self.moves.n_moves nr_dim = tokvecs.shape[1] nr_feat = self.nr_feature - - cuda_stream = get_cuda_stream() - state2vec, vec2scores = self.get_batch_model(nr_state, tokvecs, - cuda_stream, 0.0) nr_piece = state2vec.nP states = self.moves.init_batch(docs) @@ -448,19 +441,15 @@ cdef class Parser: next_step.push_back(st) return states - def beam_parse(self, docs, tokvecses, int beam_width=3, float beam_density=0.001): + def beam_parse(self, docs, int beam_width=3, float beam_density=0.001): cdef Beam beam cdef np.ndarray scores cdef Doc doc cdef int nr_class = self.moves.n_moves cdef StateClass stcls, output - if USE_FINE_TUNE: - tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - else: - tokvecs = self.model[0].ops.flatten(tokvecses) cuda_stream = get_cuda_stream() - state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, - cuda_stream, 0.0) + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, + 0.0) beams = [] cdef int offset = 0 cdef int j = 0 @@ -520,30 +509,24 @@ cdef class Parser: free(scores) free(token_ids) - def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + def update(self, docs, golds, drop=0., sgd=None, losses=None): if not any(self.moves.has_gold(gold) for gold in golds): return None if self.cfg.get('beam_width', 1) >= 2 and numpy.random.random() >= 0.5: - return self.update_beam(docs_tokvecs, golds, + return self.update_beam(docs, golds, self.cfg['beam_width'], self.cfg['beam_density'], drop=drop, sgd=sgd, losses=losses) if losses is not None and self.name not in losses: losses[self.name] = 0. - docs, tokvec_lists = docs_tokvecs if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] - if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs = self.model[0].ops.flatten(my_tokvecs) - else: - tokvecs = self.model[0].ops.flatten(docs_tokvecs[1]) cuda_stream = get_cuda_stream() states, golds, max_steps = self._init_gold_batch(docs, golds) - state2vec, vec2scores = self.get_batch_model(len(states), tokvecs, cuda_stream, - 0.0) + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, + 0.0) todo = [(s, g) for (s, g) in zip(states, golds) if not s.is_final() and g is not None] if not todo: @@ -587,13 +570,9 @@ cdef class Parser: if n_steps >= max_steps: break self._make_updates(d_tokvecs, - backprops, sgd, cuda_stream) - d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) - if USE_FINE_TUNE: - d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) - return d_tokvecs + bp_tokvecs, backprops, sgd, cuda_stream) - def update_beam(self, docs_tokvecs, golds, width=None, density=None, + def update_beam(self, docs, golds, width=None, density=None, drop=0., sgd=None, losses=None): if not any(self.moves.has_gold(gold) for gold in golds): return None @@ -605,26 +584,20 @@ cdef class Parser: density = self.cfg.get('beam_density', 0.0) if losses is not None and self.name not in losses: losses[self.name] = 0. - docs, tokvecs = docs_tokvecs lengths = [len(d) for d in docs] assert min(lengths) >= 1 - if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs = self.model[0].ops.flatten(my_tokvecs) - else: - tokvecs = self.model[0].ops.flatten(tokvecs) states = self.moves.init_batch(docs) for gold in golds: self.moves.preprocess_gold(gold) cuda_stream = get_cuda_stream() - state2vec, vec2scores = self.get_batch_model(len(states), tokvecs, cuda_stream, 0.0) + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, 0.0) states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, - states, tokvecs, golds, + states, golds, state2vec, vec2scores, width, density, - sgd=sgd, drop=drop, losses=losses) + drop=drop, losses=losses) backprop_lower = [] cdef float batch_size = len(docs) for i, d_scores in enumerate(states_d_scores): @@ -642,20 +615,7 @@ cdef class Parser: else: backprop_lower.append((ids, d_vector, bp_vectors)) d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) - self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) - d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) - if USE_FINE_TUNE: - d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) - return d_tokvecs - - def _pad_tokvecs(self, tokvecs): - # Add a vector for missing values at the start of tokvecs - xp = get_array_module(tokvecs) - pad = xp.zeros((1, tokvecs.shape[1]), dtype=tokvecs.dtype) - return xp.vstack((pad, tokvecs)) - - def _unpad_tokvecs(self, d_tokvecs): - return d_tokvecs[1:] + self._make_updates(d_tokvecs, bp_tokvecs, backprop_lower, sgd, cuda_stream) def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long @@ -693,7 +653,7 @@ cdef class Parser: max_moves = max(max_moves, len(oracle_actions)) return states, golds, max_moves - def _make_updates(self, d_tokvecs, backprops, sgd, cuda_stream=None): + def _make_updates(self, d_tokvecs, bp_tokvecs, backprops, sgd, cuda_stream=None): # Tells CUDA to block, so our async copies complete. if cuda_stream is not None: cuda_stream.synchronize() @@ -704,6 +664,7 @@ cdef class Parser: d_state_features *= mask.reshape(ids.shape + (1,)) self.model[0].ops.scatter_add(d_tokvecs, ids * mask, d_state_features) + bp_tokvecs(d_tokvecs, sgd=sgd) @property def move_names(self): @@ -713,11 +674,12 @@ cdef class Parser: names.append(name) return names - def get_batch_model(self, batch_size, tokvecs, stream, dropout): - _, lower, upper = self.model - state2vec = precompute_hiddens(batch_size, tokvecs, + def get_batch_model(self, docs, stream, dropout): + tok2vec, lower, upper = self.model + tokvecs, bp_tokvecs = tok2vec.begin_update(docs, drop=dropout) + state2vec = precompute_hiddens(len(docs), tokvecs, lower, stream, drop=dropout) - return state2vec, upper + return (tokvecs, bp_tokvecs), state2vec, upper nr_feature = 8 diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 29350b30a..8747b01ba 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -61,33 +61,22 @@ def test_predict_doc(parser, tok2vec, model, doc): parser(doc) -def test_update_doc(parser, tok2vec, model, doc, gold): +def test_update_doc(parser, model, doc, gold): parser.model = model - tokvecs, bp_tokvecs = tok2vec.begin_update([doc]) - d_tokvecs = parser.update(([doc], tokvecs), [gold]) - assert d_tokvecs[0].shape == tokvecs[0].shape def optimize(weights, gradient, key=None): weights -= 0.001 * gradient - bp_tokvecs(d_tokvecs, sgd=optimize) - assert d_tokvecs[0].sum() == 0. + parser.update([doc], [gold], sgd=optimize) -def test_predict_doc_beam(parser, tok2vec, model, doc): - doc.tensor = tok2vec([doc])[0] +def test_predict_doc_beam(parser, model, doc): parser.model = model parser(doc, beam_width=32, beam_density=0.001) - for word in doc: - print(word.text, word.head, word.dep_) -def test_update_doc_beam(parser, tok2vec, model, doc, gold): +def test_update_doc_beam(parser, model, doc, gold): parser.model = model - tokvecs, bp_tokvecs = tok2vec.begin_update([doc]) - d_tokvecs = parser.update_beam(([doc], tokvecs), [gold]) - assert d_tokvecs[0].shape == tokvecs[0].shape def optimize(weights, gradient, key=None): weights -= 0.001 * gradient - bp_tokvecs(d_tokvecs, sgd=optimize) - assert d_tokvecs[0].sum() == 0. + parser.update_beam([doc], [gold], sgd=optimize) From 0a9016cadeb93b33deb711764177127c5f187a09 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 21 Sep 2017 13:06:45 -0500 Subject: [PATCH 078/649] Fix serialization during training --- spacy/cli/train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index f80e285c0..801706614 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -104,8 +104,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, util.set_env_log(False) epoch_model_path = output_path / ('model%d' % i) nlp.to_disk(epoch_model_path) - #nlp_loaded = lang_class(pipeline=pipeline) - #nlp_loaded = nlp_loaded.from_disk(epoch_model_path) + nlp_loaded = lang_class(pipeline=pipeline) + nlp_loaded = nlp_loaded.from_disk(epoch_model_path) scorer = nlp.evaluate( corpus.dev_docs( nlp, From 40a4873b70ec6f70f64f961fcb2573d9e2c12817 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 21 Sep 2017 13:07:26 -0500 Subject: [PATCH 079/649] Fix serialization of model options --- spacy/_ml.py | 7 ++++++- spacy/pipeline.pyx | 23 ++++++++--------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 004d9ca73..c139623c1 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -474,8 +474,13 @@ def getitem(i): return X[i], None return layerize(getitem_fwd) -def build_tagger_model(nr_class, token_vector_width, pretrained_dims=0, **cfg): +def build_tagger_model(nr_class, **cfg): embed_size = util.env_opt('embed_size', 4000) + if 'token_vector_width' in cfg: + token_vector_width = cfg['token_vector_width'] + else: + token_vector_width = util.env_opt('token_vector_width', 128) + pretrained_dims = cfg.get('pretrained_dims', 0) with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples private_tok2vec = Tok2Vec(token_vector_width, embed_size, diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index dcc06cdf7..3d302a782 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -297,6 +297,7 @@ class NeuralTagger(BaseThincComponent): self.model = model self.cfg = dict(cfg) self.cfg.setdefault('cnn_maxout_pieces', 2) + self.cfg.setdefault('pretrained_dims', self.vocab.vectors.data.shape[1]) def __call__(self, doc): tags = self.predict(([doc], [doc.tensor])) @@ -393,15 +394,12 @@ class NeuralTagger(BaseThincComponent): vocab.morphology = Morphology(vocab.strings, new_tag_map, vocab.morphology.lemmatizer, exc=vocab.morphology.exc) - token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, - pretrained_dims=self.vocab.vectors_length) + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) @classmethod - def Model(cls, n_tags, token_vector_width, pretrained_dims=0): - return build_tagger_model(n_tags, token_vector_width, - pretrained_dims) + def Model(cls, n_tags, **cfg): + return build_tagger_model(n_tags, **cfg) def use_params(self, params): with self.model.use_params(params): @@ -422,8 +420,7 @@ class NeuralTagger(BaseThincComponent): if self.model is True: token_vector_width = util.env_opt('token_vector_width', self.cfg.get('token_vector_width', 128)) - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, - pretrained_dims=self.vocab.vectors_length) + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) self.model.from_bytes(b) def load_tag_map(b): @@ -457,10 +454,7 @@ class NeuralTagger(BaseThincComponent): def from_disk(self, path, **exclude): def load_model(p): if self.model is True: - token_vector_width = util.env_opt('token_vector_width', - self.cfg.get('token_vector_width', 128)) - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, - **self.cfg) + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) self.model.from_bytes(p.open('rb').read()) def load_tag_map(p): @@ -514,9 +508,8 @@ class NeuralLabeller(NeuralTagger): pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width, pretrained_dims=0): - return build_tagger_model(n_tags, token_vector_width, - pretrained_dims) + def Model(cls, n_tags, **cfg): + return build_tagger_model(n_tags, **cfg) def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) From a18659630788e40eb7aa3c729160b6fb4da07a09 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 09:37:03 -0500 Subject: [PATCH 080/649] Add 'reapply' combinator, for iterated CNN --- spacy/_ml.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index c139623c1..91640c14a 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -271,6 +271,28 @@ def Tok2Vec(width, embed_size, pretrained_dims=0, **kwargs): return tok2vec +def reapply(layer, n_times): + def reapply_fwd(X, drop=0.): + backprops = [] + for i in range(n_times): + Y, backprop = layer.begin_update(X, drop=drop) + X = Y + backprops.append(backprop) + def reapply_bwd(dY, sgd=None): + dX = None + for backprop in reversed(backprops): + dY = backprop(dY, sgd=sgd) + if dX is None: + dX = dY + else: + dX += dY + return dX + return Y, reapply_bwd + return wrap(reapply_fwd, layer) + + + + def asarray(ops, dtype): def forward(X, drop=0.): return ops.asarray(X, dtype=dtype), None From d9124f1aa3cdc6ff13ccda708fbafe9012adcd92 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 09:38:22 -0500 Subject: [PATCH 081/649] Add link_vectors_to_models function --- spacy/_ml.py | 2 ++ spacy/pipeline.pyx | 11 +++++++++-- spacy/syntax/nn_parser.pyx | 7 ++++--- spacy/vocab.pyx | 4 ++++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 91640c14a..65ffb42a6 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -4,6 +4,7 @@ from thinc.neural import Model, Maxout, Softmax, Affine from thinc.neural._classes.hash_embed import HashEmbed from thinc.neural.ops import NumpyOps, CupyOps from thinc.neural.util import get_array_module +import thinc.extra.load_nlp import random import cytoolz @@ -31,6 +32,7 @@ from . import util import numpy import io +VECTORS_KEY = 'spacy_pretrained_vectors' @layerize def _flatten_add_lengths(seqs, pad=0, drop=0.): diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 3d302a782..a7ff90174 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -43,6 +43,7 @@ from .compat import json_dumps from .attrs import ID, LOWER, PREFIX, SUFFIX, SHAPE, TAG, DEP, POS from ._ml import rebatch, Tok2Vec, flatten from ._ml import build_text_classifier, build_tagger_model +from ._ml import link_vectors_to_models from .parts_of_speech import X @@ -121,6 +122,7 @@ class BaseThincComponent(object): token_vector_width = pipeline[0].model.nO if self.model is True: self.model = self.Model(1, token_vector_width) + link_vectors_to_models(self.vocab) def use_params(self, params): with self.model.use_params(params): @@ -215,7 +217,7 @@ class TokenVectorEncoder(BaseThincComponent): self.model = model self.cfg = dict(cfg) self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] - self.cfg.setdefault('cnn_maxout_pieces', 2) + self.cfg.setdefault('cnn_maxout_pieces', 3) def __call__(self, doc): """Add context-sensitive vectors to a `Doc`, e.g. from a CNN or LSTM @@ -288,6 +290,7 @@ class TokenVectorEncoder(BaseThincComponent): """ if self.model is True: self.model = self.Model(**self.cfg) + link_vectors_to_models(self.vocab) class NeuralTagger(BaseThincComponent): @@ -396,6 +399,7 @@ class NeuralTagger(BaseThincComponent): exc=vocab.morphology.exc) if self.model is True: self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) + link_vectors_to_models(self.vocab) @classmethod def Model(cls, n_tags, **cfg): @@ -504,8 +508,9 @@ class NeuralLabeller(NeuralTagger): self.labels[dep] = len(self.labels) token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(len(self.labels), token_vector_width, + self.model = self.Model(len(self.labels), token_vector_width=token_vector_width, pretrained_dims=self.vocab.vectors_length) + link_vectors_to_models(self.vocab) @classmethod def Model(cls, n_tags, **cfg): @@ -585,6 +590,7 @@ class SimilarityHook(BaseThincComponent): """ if self.model is True: self.model = self.Model(pipeline[0].model.nO) + link_vectors_to_models(self.vocab) class TextCategorizer(BaseThincComponent): @@ -658,6 +664,7 @@ class TextCategorizer(BaseThincComponent): self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(len(self.labels), token_vector_width, **self.cfg) + link_vectors_to_models(self.vocab) cdef class EntityRecognizer(LinearParser): diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index ad0e35428..010b3771e 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -49,6 +49,7 @@ from ..util import get_async, get_cuda_stream from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune from .._ml import Residual, drop_layer +from .._ml import link_vectors_to_models from ..compat import json_dumps from . import _parse_features @@ -309,7 +310,7 @@ cdef class Parser: cfg['beam_density'] = util.env_opt('beam_density', 0.0) if 'pretrained_dims' not in cfg: cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] - cfg.setdefault('cnn_maxout_pieces', 2) + cfg.setdefault('cnn_maxout_pieces', 3) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): @@ -791,6 +792,7 @@ cdef class Parser: if self.model is True: cfg['pretrained_dims'] = self.vocab.vectors_length self.model, cfg = self.Model(self.moves.n_moves, **cfg) + link_vectors_to_models(self.vocab) self.cfg.update(cfg) def preprocess_gold(self, docs_golds): @@ -872,8 +874,7 @@ cdef class Parser: msg = util.from_bytes(bytes_data, deserializers, exclude) if 'model' not in exclude: if self.model is True: - self.model, cfg = self.Model(self.moves.n_moves, - pretrained_dims=self.vocab.vectors_length) + self.model, cfg = self.Model(**self.cfg) cfg['pretrained_dims'] = self.vocab.vectors_length else: cfg = {} diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index b4a244287..01e074617 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -27,6 +27,7 @@ from .vectors import Vectors from . import util from . import attrs from . import symbols +from ._ml import link_vectors_to_models cdef class Vocab: @@ -323,6 +324,7 @@ cdef class Vocab: self.lexemes_from_bytes(file_.read()) if self.vectors is not None: self.vectors.from_disk(path, exclude='strings.json') + link_vectors_to_models(self) return self def to_bytes(self, **exclude): @@ -362,6 +364,7 @@ cdef class Vocab: ('vectors', lambda b: serialize_vectors(b)) )) util.from_bytes(bytes_data, setters, exclude) + link_vectors_to_models(self) return self def lexemes_to_bytes(self): @@ -436,6 +439,7 @@ def unpickle_vocab(sstore, morphology, data_dir, vocab.lex_attr_getters = lex_attr_getters vocab.lexemes_from_bytes(lexemes_data) vocab.length = length + link_vectors_to_models(vocab) return vocab From 980fb6e85482d0325897775be86ef4343f880941 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 09:38:36 -0500 Subject: [PATCH 082/649] Refactor Tok2Vec --- spacy/_ml.py | 59 +++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 65ffb42a6..34f66233d 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -227,45 +227,52 @@ def drop_layer(layer, factor=2.): model.predict = layer return model +def link_vectors_to_models(vocab): + vectors = vocab.vectors + ops = Model.ops + for word in vocab: + if word.orth in vectors.key2row: + word.rank = vectors.key2row[word.orth] + else: + word.rank = 0 + data = ops.asarray(vectors.data) + # Set an entry here, so that vectors are accessed by StaticVectors + # (unideal, I know) + thinc.extra.load_nlp.VECTORS[(ops.device, VECTORS_KEY)] = data -def Tok2Vec(width, embed_size, pretrained_dims=0, **kwargs): - assert pretrained_dims is not None + +def Tok2Vec(width, embed_size, **kwargs): + pretrained_dims = kwargs.get('pretrained_dims', 0) cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 3) cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] - with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): + with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add, + '*': reapply}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') prefix = HashEmbed(width, embed_size//2, column=cols.index(PREFIX), name='embed_prefix') suffix = HashEmbed(width, embed_size//2, column=cols.index(SUFFIX), name='embed_suffix') shape = HashEmbed(width, embed_size//2, column=cols.index(SHAPE), name='embed_shape') + if pretrained_dims is not None and pretrained_dims >= 1: + glove = StaticVectors(VECTORS_KEY, width, column=cols.index(ID)) + + embed = uniqued( + (glove | norm | prefix | suffix | shape) + >> LN(Maxout(width, width*5, pieces=3)), column=5) + else: + embed = uniqued( + (norm | prefix | suffix | shape) + >> LN(Maxout(width, width*4, pieces=3)), column=5) + - trained_vectors = ( - FeatureExtracter(cols) - >> with_flatten( - uniqued( - (norm | prefix | suffix | shape) - >> LN(Maxout(width, width*4, pieces=3)), column=5) - ) - ) convolution = Residual( ExtractWindow(nW=1) >> LN(Maxout(width, width*3, pieces=cnn_maxout_pieces)) ) - if pretrained_dims >= 1: - embed = concatenate_lists(trained_vectors, SpacyVectors) - tok2vec = ( - embed - >> with_flatten( - Affine(width, width+pretrained_dims) - >> convolution ** 4, - pad=4) - ) - else: - embed = trained_vectors - tok2vec = ( - embed - >> with_flatten(convolution ** 4, pad=4) - ) + tok2vec = ( + FeatureExtracter(cols) + >> with_flatten( + embed >> (convolution * 4), pad=4) + ) # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width From 05596159bfb8e50e4ecbf0f5841aa709a9a71f5d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 15:33:27 -0500 Subject: [PATCH 083/649] Fix serialization when pre-trained vectors --- spacy/pipeline.pyx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index a7ff90174..f5b2db55a 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -145,8 +145,8 @@ class BaseThincComponent(object): deserialize = OrderedDict(( ('cfg', lambda b: self.cfg.update(ujson.loads(b))), - ('model', load_model), ('vocab', lambda b: self.vocab.from_bytes(b)) + ('model', load_model), )) util.from_bytes(bytes_data, deserialize, exclude) return self @@ -154,8 +154,8 @@ class BaseThincComponent(object): def to_disk(self, path, **exclude): serialize = OrderedDict(( ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))), + ('vocab', lambda p: self.vocab.to_disk(p)), ('model', lambda p: p.open('wb').write(self.model.to_bytes())), - ('vocab', lambda p: self.vocab.to_disk(p)) )) util.to_disk(path, serialize, exclude) @@ -168,8 +168,8 @@ class BaseThincComponent(object): deserialize = OrderedDict(( ('cfg', lambda p: self.cfg.update(_load_cfg(p))), - ('model', load_model), ('vocab', lambda p: self.vocab.from_disk(p)), + ('model', load_model), )) util.from_disk(path, deserialize, exclude) return self @@ -289,6 +289,7 @@ class TokenVectorEncoder(BaseThincComponent): pipeline (list): The pipeline the model is part of. """ if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(**self.cfg) link_vectors_to_models(self.vocab) @@ -398,6 +399,7 @@ class NeuralTagger(BaseThincComponent): vocab.morphology.lemmatizer, exc=vocab.morphology.exc) if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) link_vectors_to_models(self.vocab) @@ -486,6 +488,7 @@ class NeuralLabeller(NeuralTagger): self.model = model self.cfg = dict(cfg) self.cfg.setdefault('cnn_maxout_pieces', 2) + self.cfg.setdefault('pretrained_dims', self.vocab.vectors.data.shape[1]) @property def labels(self): @@ -508,8 +511,8 @@ class NeuralLabeller(NeuralTagger): self.labels[dep] = len(self.labels) token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(len(self.labels), token_vector_width=token_vector_width, - pretrained_dims=self.vocab.vectors_length) + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] + self.model = self.Model(len(self.labels), **self.cfg) link_vectors_to_models(self.vocab) @classmethod From a2357cce3fdf38382fcce783b13132f4d473ddfd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 02:57:31 +0200 Subject: [PATCH 084/649] Set random seed in train script --- spacy/cli/train.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index c87aabb01..3551c4f2c 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -11,6 +11,8 @@ import tqdm from thinc.neural._classes.model import Model from thinc.neural.optimizers import linear_decay from timeit import default_timer as timer +import random +import numpy.random from ..tokens.doc import Doc from ..scorer import Scorer @@ -21,6 +23,9 @@ from .. import util from .. import displacy from ..compat import json_dumps +random.seed(0) +numpy.random.seed(0) + @plac.annotations( lang=("model language", "positional", None, str), From 386c1a5bd886f43bfc9b6ce2482deb948b6b0ccc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 02:58:06 +0200 Subject: [PATCH 085/649] Fix tagger training --- spacy/pipeline.pyx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 8ad62d696..5ab70f2dd 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -343,6 +343,7 @@ class NeuralTagger(BaseThincComponent): tag_scores, bp_tag_scores = self.model.begin_update(docs, drop=drop) loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) + bp_tag_scores(d_tag_scores, sgd=sgd) if losses is not None: losses[self.name] += loss @@ -386,15 +387,13 @@ class NeuralTagger(BaseThincComponent): vocab.morphology = Morphology(vocab.strings, new_tag_map, vocab.morphology.lemmatizer, exc=vocab.morphology.exc) - token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, + self.model = self.Model(self.vocab.morphology.n_tags, pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width, pretrained_dims=0, **cfg): - return build_tagger_model(n_tags, token_vector_width, - pretrained_dims, **cfg) + def Model(cls, n_tags, **cfg): + return build_tagger_model(n_tags, **cfg) def use_params(self, params): with self.model.use_params(params): From 4bd6a12b1f6c70b4ebdcc06f65e5846ba942b5c4 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 02:58:54 +0200 Subject: [PATCH 086/649] Fix Tok2Vec --- spacy/_ml.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 37bf6335b..74757f502 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -475,14 +475,16 @@ def getitem(i): return layerize(getitem_fwd) -def build_tagger_model(nr_class, token_vector_width, pretrained_dims=0, **cfg): +def build_tagger_model(nr_class, pretrained_dims=0, **cfg): embed_size = util.env_opt('embed_size', 4000) + if 'token_vector_width' not in cfg: + token_vector_width = util.env_opt('token_vector_width', 128) with Model.define_operators({'>>': chain, '+': add}): tok2vec = Tok2Vec(token_vector_width, embed_size, pretrained_dims=pretrained_dims) - model = with_flatten( + model = ( tok2vec - >> Softmax(nr_class, token_vector_width) + >> with_flatten(Softmax(nr_class, token_vector_width)) ) model.nI = None model.tok2vec = tok2vec From 0795857dcbb1f224e7ac3f45208ba1520730a82a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 02:59:18 +0200 Subject: [PATCH 087/649] Fix beam parsing --- spacy/syntax/nn_parser.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 77f99624a..a56ed35a8 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -370,6 +370,7 @@ cdef class Parser: docs = list(docs) if beam_width == 1: parse_states = self.parse_batch(docs) + beams = [] else: beams = self.beam_parse(docs, beam_width=beam_width, beam_density=beam_density) From e93d43a43a03ed207a7d9efe5817adb0afb0ef82 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 20:00:40 -0500 Subject: [PATCH 088/649] Fix training with preset vectors --- spacy/cli/train.py | 45 ++++++++++----------------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 801706614..96233406d 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -30,14 +30,14 @@ from ..compat import json_dumps n_iter=("number of iterations", "option", "n", int), n_sents=("number of sentences", "option", "ns", int), use_gpu=("Use GPU", "option", "g", int), - resume=("Whether to resume training", "flag", "R", bool), + vectors=("Model to load vectors from", "option", "v"), no_tagger=("Don't train tagger", "flag", "T", bool), no_parser=("Don't train parser", "flag", "P", bool), no_entities=("Don't train NER", "flag", "N", bool), gold_preproc=("Use gold preprocessing", "flag", "G", bool), ) def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, - use_gpu=-1, resume=False, no_tagger=False, no_parser=False, no_entities=False, + use_gpu=-1, vectors=None, no_tagger=False, no_parser=False, no_entities=False, gold_preproc=False): """ Train a model. Expects data in spaCy's JSON format. @@ -73,25 +73,20 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() - if not resume: - lang_class = util.get_lang_class(lang) - nlp = lang_class(pipeline=pipeline) - optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) - else: - print("Load resume") - util.use_gpu(use_gpu) - nlp = _resume_model(lang, pipeline, corpus) - optimizer = nlp.resume_training(device=use_gpu) - lang_class = nlp.__class__ - + lang_class = util.get_lang_class(lang) + nlp = lang_class(pipeline=pipeline) + if vectors: + util.load_model(vectors, vocab=nlp.vocab) + optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) nlp._optimizer = None print("Itn.\tLoss\tUAS\tNER P.\tNER R.\tNER F.\tTag %\tToken %") try: + train_docs = corpus.train_docs(nlp, projectivize=True, noise_level=0.0, + gold_preproc=gold_preproc, max_length=0) + train_docs = list(train_docs) for i in range(n_iter): with tqdm.tqdm(total=n_train_words, leave=False) as pbar: - train_docs = corpus.train_docs(nlp, projectivize=True, noise_level=0.0, - gold_preproc=gold_preproc, max_length=0) losses = {} for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) @@ -124,26 +119,6 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, except: pass - -def _resume_model(lang, pipeline, corpus): - nlp = util.load_model(lang) - pipes = {getattr(pipe, 'name', None) for pipe in nlp.pipeline} - for name in pipeline: - if name not in pipes: - factory = nlp.Defaults.factories[name] - for pipe in factory(nlp): - if hasattr(pipe, 'begin_training'): - pipe.begin_training(corpus.train_tuples, - pipeline=nlp.pipeline) - nlp.pipeline.append(pipe) - nlp.meta['pipeline'] = pipeline - if nlp.vocab.vectors.data.shape[1] >= 1: - nlp.vocab.vectors.data = Model.ops.asarray( - nlp.vocab.vectors.data) - - return nlp - - def _render_parses(i, to_render): to_render[0].user_data['title'] = "Batch %d" % i with Path('/tmp/entities.html').open('w') as file_: From 7dc61b3f439c436ae4ca69ae0d9a2d14dda65723 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 20:00:50 -0500 Subject: [PATCH 089/649] Whitespace --- spacy/language.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/language.py b/spacy/language.py index 9d1538a18..130d7989d 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -362,7 +362,6 @@ class Language(object): self._optimizer.device = device return self._optimizer - def begin_training(self, get_gold_tuples=None, **cfg): """Allocate models, pre-process training data and acquire a trainer and optimizer. Used as a contextmanager. From 5a7fd0fd3683fb5949f11e81109853020113ca1e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 20:11:52 -0500 Subject: [PATCH 090/649] Fix vector linkage --- spacy/language.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/language.py b/spacy/language.py index d63d4d163..edf0a4b5c 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -34,6 +34,7 @@ from .lang.tag_map import TAG_MAP from .lang.lex_attrs import LEX_ATTRS from . import util from .scorer import Scorer +from ._ml import link_vectors_to_models class BaseDefaults(object): @@ -370,6 +371,7 @@ class Language(object): self.vocab.vectors.data) else: device = None + link_vectors_to_models(self.vocab) for proc in self.pipeline: if hasattr(proc, 'begin_training'): context = proc.begin_training(get_gold_tuples(), From 63bd87508d12ca3a55d6ab05834cf8e69cc5e21e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 04:39:17 -0500 Subject: [PATCH 091/649] Don't use iterated convolutions --- spacy/_ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 7cdf9c68b..3bb76c268 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -270,7 +270,7 @@ def Tok2Vec(width, embed_size, **kwargs): tok2vec = ( FeatureExtracter(cols) >> with_flatten( - embed >> (convolution * 4), pad=4) + embed >> (convolution ** 4), pad=4) ) # Work around thinc API limitations :(. TODO: Revise in Thinc 7 From dc3a623d0008c1362a2f26369f777b5ceef8958b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 24 Sep 2017 05:00:37 -0500 Subject: [PATCH 092/649] Remove unused update_shared argument --- spacy/cli/train.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 777121616..055cccab0 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -96,8 +96,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) nlp.update(docs, golds, sgd=optimizer, - drop=next(dropout_rates), losses=losses, - update_shared=True) + drop=next(dropout_rates), losses=losses) pbar.update(sum(len(doc) for doc in docs)) with nlp.use_params(optimizer.averages): From 204b58c86491fa9f3cbddadf026c9a49e57b521a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 24 Sep 2017 05:01:03 -0500 Subject: [PATCH 093/649] Fix evaluation during training --- spacy/cli/train.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 055cccab0..d9c345b97 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -105,10 +105,10 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, nlp.to_disk(epoch_model_path) nlp_loaded = lang_class(pipeline=pipeline) nlp_loaded = nlp_loaded.from_disk(epoch_model_path) - scorer = nlp.evaluate( - corpus.dev_docs( - nlp, - gold_preproc=gold_preproc)) + scorer = nlp_loaded.evaluate( + list(corpus.dev_docs( + nlp_loaded, + gold_preproc=gold_preproc))) acc_loc =(output_path / ('model%d' % i) / 'accuracy.json') with acc_loc.open('w') as file_: file_.write(json_dumps(scorer.scores)) From 72bbcc0871568fc6944a45e1aa4907735c743453 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 24 Sep 2017 05:01:31 -0500 Subject: [PATCH 094/649] Handle lemmatization for unknown string IDs --- spacy/morphology.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx index 13a0ed8e3..5ee11c151 100644 --- a/spacy/morphology.pyx +++ b/spacy/morphology.pyx @@ -146,6 +146,8 @@ cdef class Morphology: self.add_special_case(tag_str, form_str, attrs) def lemmatize(self, const univ_pos_t univ_pos, attr_t orth, morphology): + if orth not in self.strings: + return orth cdef unicode py_string = self.strings[orth] if self.lemmatizer is None: return self.strings.add(py_string.lower()) From 8716ffe57d71cd0cd8d1e34b0417006e588ae478 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 24 Sep 2017 05:01:45 -0500 Subject: [PATCH 095/649] Serialize vocab last --- spacy/language.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/language.py b/spacy/language.py index edf0a4b5c..502430368 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -491,7 +491,6 @@ class Language(object): """ path = util.ensure_path(path) serializers = OrderedDict(( - ('vocab', lambda p: self.vocab.to_disk(p)), ('tokenizer', lambda p: self.tokenizer.to_disk(p, vocab=False)), ('meta.json', lambda p: p.open('w').write(json_dumps(self.meta))) )) @@ -503,6 +502,7 @@ class Language(object): if not hasattr(proc, 'to_disk'): continue serializers[proc.name] = lambda p, proc=proc: proc.to_disk(p, vocab=False) + serializers['vocab'] = lambda p: self.vocab.to_disk(p) util.to_disk(path, serializers, {p: False for p in disable}) def from_disk(self, path, disable=tuple()): From 39f390dba7e4a5e7ac224b27731e8c463cb92f7d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 25 Sep 2017 16:20:49 +0200 Subject: [PATCH 096/649] Add docstrings for Pipe API --- spacy/pipeline.pyx | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index dcc06cdf7..fef925d85 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -88,17 +88,30 @@ class BaseThincComponent(object): @classmethod def Model(cls, *shape, **kwargs): + '''Initialize a model for the pipe.''' raise NotImplementedError def __init__(self, vocab, model=True, **cfg): + '''Create a new pipe instance.''' raise NotImplementedError def __call__(self, doc): + '''Apply the pipe to one document. The document is + modified in-place, and returned. + + Both __call__ and pipe should delegate to the `predict()` + and `set_annotations()` methods. + ''' scores = self.predict([doc]) self.set_annotations([doc], scores) return doc def pipe(self, stream, batch_size=128, n_threads=-1): + '''Apply the pipe to a stream of documents. + + Both __call__ and pipe should delegate to the `predict()` + and `set_annotations()` methods. + ''' for docs in cytoolz.partition_all(batch_size, stream): docs = list(docs) scores = self.predict(docs) @@ -106,27 +119,42 @@ class BaseThincComponent(object): yield from docs def predict(self, docs): + '''Apply the pipeline's model to a batch of docs, without + modifying them. + ''' raise NotImplementedError def set_annotations(self, docs, scores): + '''Modify a batch of documents, using pre-computed scores.''' raise NotImplementedError - def update(self, docs_tensors, golds, state=None, drop=0., sgd=None, losses=None): + def update(self, docs, golds, drop=0., sgd=None, losses=None): + '''Learn from a batch of documents and gold-standard information, + updating the pipe's model. + + Delegates to predict() and get_loss(). + ''' raise NotImplementedError def get_loss(self, docs, golds, scores): + '''Find the loss and gradient of loss for the batch of + documents and their predicted scores.''' raise NotImplementedError def begin_training(self, gold_tuples=tuple(), pipeline=None): - token_vector_width = pipeline[0].model.nO + '''Initialize the pipe for training, using data exampes if available. + If no model has been initialized yet, the model is added.''' if self.model is True: - self.model = self.Model(1, token_vector_width) + self.model = self.Model(**self.cfg) def use_params(self, params): + '''Modify the pipe's model, to use the given parameter values. + ''' with self.model.use_params(params): yield def to_bytes(self, **exclude): + '''Serialize the pipe to a bytestring.''' serialize = OrderedDict(( ('cfg', lambda: json_dumps(self.cfg)), ('model', lambda: self.model.to_bytes()), @@ -135,6 +163,7 @@ class BaseThincComponent(object): return util.to_bytes(serialize, exclude) def from_bytes(self, bytes_data, **exclude): + '''Load the pipe from a bytestring.''' def load_model(b): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors_length @@ -150,6 +179,7 @@ class BaseThincComponent(object): return self def to_disk(self, path, **exclude): + '''Serialize the pipe to disk.''' serialize = OrderedDict(( ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))), ('model', lambda p: p.open('wb').write(self.model.to_bytes())), @@ -158,6 +188,7 @@ class BaseThincComponent(object): util.to_disk(path, serialize, exclude) def from_disk(self, path, **exclude): + '''Load the pipe from disk.''' def load_model(p): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors_length From d2d35b63b770c74f80e560fbb2efc5491064608c Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 25 Sep 2017 18:37:13 +0200 Subject: [PATCH 097/649] Fix formatting --- spacy/pipeline.pyx | 50 +++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index f660f88a6..90ff1ad88 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -48,7 +48,7 @@ from .parts_of_speech import X class SentenceSegmenter(object): - '''A simple spaCy hook, to allow custom sentence boundary detection logic + """A simple spaCy hook, to allow custom sentence boundary detection logic (that doesn't require the dependency parse). To change the sentence boundary detection strategy, pass a generator @@ -57,7 +57,7 @@ class SentenceSegmenter(object): Sentence detection strategies should be generators that take `Doc` objects and yield `Span` objects for each sentence. - ''' + """ name = 'sbd' def __init__(self, vocab, strategy=None): @@ -89,30 +89,30 @@ class BaseThincComponent(object): @classmethod def Model(cls, *shape, **kwargs): - '''Initialize a model for the pipe.''' + """Initialize a model for the pipe.""" raise NotImplementedError def __init__(self, vocab, model=True, **cfg): - '''Create a new pipe instance.''' + """Create a new pipe instance.""" raise NotImplementedError def __call__(self, doc): - '''Apply the pipe to one document. The document is + """Apply the pipe to one document. The document is modified in-place, and returned. - + Both __call__ and pipe should delegate to the `predict()` and `set_annotations()` methods. - ''' + """ scores = self.predict([doc]) self.set_annotations([doc], scores) return doc def pipe(self, stream, batch_size=128, n_threads=-1): - '''Apply the pipe to a stream of documents. + """Apply the pipe to a stream of documents. Both __call__ and pipe should delegate to the `predict()` and `set_annotations()` methods. - ''' + """ for docs in cytoolz.partition_all(batch_size, stream): docs = list(docs) scores = self.predict(docs) @@ -120,43 +120,43 @@ class BaseThincComponent(object): yield from docs def predict(self, docs): - '''Apply the pipeline's model to a batch of docs, without + """Apply the pipeline's model to a batch of docs, without modifying them. - ''' + """ raise NotImplementedError def set_annotations(self, docs, scores): - '''Modify a batch of documents, using pre-computed scores.''' + """Modify a batch of documents, using pre-computed scores.""" raise NotImplementedError def update(self, docs, golds, drop=0., sgd=None, losses=None): - '''Learn from a batch of documents and gold-standard information, + """Learn from a batch of documents and gold-standard information, updating the pipe's model. Delegates to predict() and get_loss(). - ''' + """ raise NotImplementedError def get_loss(self, docs, golds, scores): - '''Find the loss and gradient of loss for the batch of - documents and their predicted scores.''' + """Find the loss and gradient of loss for the batch of + documents and their predicted scores.""" raise NotImplementedError def begin_training(self, gold_tuples=tuple(), pipeline=None): - '''Initialize the pipe for training, using data exampes if available. - If no model has been initialized yet, the model is added.''' + """Initialize the pipe for training, using data exampes if available. + If no model has been initialized yet, the model is added.""" if self.model is True: self.model = self.Model(**self.cfg) link_vectors_to_models(self.vocab) def use_params(self, params): - '''Modify the pipe's model, to use the given parameter values. - ''' + """Modify the pipe's model, to use the given parameter values. + """ with self.model.use_params(params): yield def to_bytes(self, **exclude): - '''Serialize the pipe to a bytestring.''' + """Serialize the pipe to a bytestring.""" serialize = OrderedDict(( ('cfg', lambda: json_dumps(self.cfg)), ('model', lambda: self.model.to_bytes()), @@ -165,7 +165,7 @@ class BaseThincComponent(object): return util.to_bytes(serialize, exclude) def from_bytes(self, bytes_data, **exclude): - '''Load the pipe from a bytestring.''' + """Load the pipe from a bytestring.""" def load_model(b): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors_length @@ -181,7 +181,7 @@ class BaseThincComponent(object): return self def to_disk(self, path, **exclude): - '''Serialize the pipe to disk.''' + """Serialize the pipe to disk.""" serialize = OrderedDict(( ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))), ('vocab', lambda p: self.vocab.to_disk(p)), @@ -190,7 +190,7 @@ class BaseThincComponent(object): util.to_disk(path, serialize, exclude) def from_disk(self, path, **exclude): - '''Load the pipe from disk.''' + """Load the pipe from disk.""" def load_model(p): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors_length @@ -596,7 +596,7 @@ class SimilarityHook(BaseThincComponent): return Siamese(Pooling(max_pool, mean_pool), CauchySimilarity(length)) def __call__(self, doc): - '''Install similarity hook''' + """Install similarity hook""" doc.user_hooks['similarity'] = self.predict return doc From edf7e4881debb5244e445225a98117f9263d9b0d Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 25 Sep 2017 19:00:47 +0200 Subject: [PATCH 098/649] Add meta.json option to cli.train and add relevant properties Add accuracy scores to meta.json instead of accuracy.json and replace all relevant properties like lang, pipeline, spacy_version in existing meta.json. If not present, also add name and version placeholders to make it packagable. --- spacy/cli/train.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 96233406d..d71523a9c 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -18,6 +18,7 @@ from ..gold import GoldParse, merge_sents from ..gold import GoldCorpus, minibatch from ..util import prints from .. import util +from .. import about from .. import displacy from ..compat import json_dumps @@ -35,10 +36,11 @@ from ..compat import json_dumps no_parser=("Don't train parser", "flag", "P", bool), no_entities=("Don't train NER", "flag", "N", bool), gold_preproc=("Use gold preprocessing", "flag", "G", bool), + meta_path=("Optional path to meta.json. All relevant properties will be overwritten.", "option", "m", Path) ) def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, use_gpu=-1, vectors=None, no_tagger=False, no_parser=False, no_entities=False, - gold_preproc=False): + gold_preproc=False, meta_path=None): """ Train a model. Expects data in spaCy's JSON format. """ @@ -47,13 +49,19 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, output_path = util.ensure_path(output_dir) train_path = util.ensure_path(train_data) dev_path = util.ensure_path(dev_data) + meta_path = util.ensure_path(meta_path) if not output_path.exists(): output_path.mkdir() if not train_path.exists(): prints(train_path, title="Training data not found", exits=1) if dev_path and not dev_path.exists(): prints(dev_path, title="Development data not found", exits=1) - + if meta_path is not None and not meta_path.exists(): + prints(meta_path, title="meta.json not found", exits=1) + meta = util.read_json(meta_path) if meta_path else {} + if not isinstance(meta, dict): + prints("Expected dict but got: {}".format(type(meta)), + title="Not a valid meta.json format", exits=1) pipeline = ['token_vectors', 'tags', 'dependencies', 'entities'] if no_tagger and 'tags' in pipeline: pipeline.remove('tags') @@ -105,9 +113,16 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, corpus.dev_docs( nlp, gold_preproc=gold_preproc)) - acc_loc =(output_path / ('model%d' % i) / 'accuracy.json') - with acc_loc.open('w') as file_: - file_.write(json_dumps(scorer.scores)) + meta_loc = output_path / ('model%d' % i) / 'meta.json' + meta['accuracy'] = scorer.scores + meta['lang'] = nlp.lang + meta['pipeline'] = pipeline + meta['spacy_version'] = '>=%s' % about.__version__ + meta.setdefault('name', 'model%d' % i) + meta.setdefault('version', '0.0.0') + + with meta_loc.open('w') as file_: + file_.write(json_dumps(meta)) util.set_env_log(True) print_progress(i, losses, scorer.scores) finally: From 4ae9ea76845ad141f12d5bfa82ed5975830322ca Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 05:41:35 -0500 Subject: [PATCH 099/649] Remove unused argument in Language --- spacy/language.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 502430368..701b5c140 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -279,8 +279,7 @@ class Language(object): def make_doc(self, text): return self.tokenizer(text) - def update(self, docs, golds, drop=0., sgd=None, losses=None, - update_shared=False): + def update(self, docs, golds, drop=0., sgd=None, losses=None): """Update the models in the pipeline. docs (iterable): A batch of `Doc` objects. From bf917225ab123f354ead66f9685558cd52129fff Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 05:42:52 -0500 Subject: [PATCH 100/649] Allow multi-task objectives during training --- spacy/pipeline.pyx | 109 ++++++++++++++++++++++++++++--------- spacy/syntax/nn_parser.pxd | 1 + spacy/syntax/nn_parser.pyx | 16 +++++- 3 files changed, 99 insertions(+), 27 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index b91ddcc9d..17e9a15de 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -291,7 +291,7 @@ class TokenVectorEncoder(BaseThincComponent): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(**self.cfg) - link_vectors_to_models(self.vocab) + link_vectors_to_models(self.vocab) class NeuralTagger(BaseThincComponent): @@ -395,7 +395,7 @@ class NeuralTagger(BaseThincComponent): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) - link_vectors_to_models(self.vocab) + link_vectors_to_models(self.vocab) @classmethod def Model(cls, n_tags, **cfg): @@ -477,9 +477,25 @@ class NeuralTagger(BaseThincComponent): class NeuralLabeller(NeuralTagger): name = 'nn_labeller' - def __init__(self, vocab, model=True, **cfg): + def __init__(self, vocab, model=True, target='dep_tag_offset', **cfg): self.vocab = vocab self.model = model + if target == 'dep': + self.make_label = self.make_dep + elif target == 'tag': + self.make_label = self.make_tag + elif target == 'ent': + self.make_label = self.make_ent + elif target == 'dep_tag_offset': + self.make_label = self.make_dep_tag_offset + elif target == 'ent_tag': + self.make_label = self.make_ent_tag + elif hasattr(target, '__call__'): + self.make_label = target + else: + raise ValueError( + "NeuralLabeller target should be function or one of " + "['dep', 'tag', 'ent', 'dep_tag_offset', 'ent_tag']") self.cfg = dict(cfg) self.cfg.setdefault('cnn_maxout_pieces', 2) self.cfg.setdefault('pretrained_dims', self.vocab.vectors.data.shape[1]) @@ -495,43 +511,78 @@ class NeuralLabeller(NeuralTagger): def set_annotations(self, docs, dep_ids): pass - def begin_training(self, gold_tuples=tuple(), pipeline=None): + def begin_training(self, gold_tuples=tuple(), pipeline=None, tok2vec=None): gold_tuples = nonproj.preprocess_training_data(gold_tuples) for raw_text, annots_brackets in gold_tuples: for annots, brackets in annots_brackets: ids, words, tags, heads, deps, ents = annots - for dep in deps: - if dep not in self.labels: - self.labels[dep] = len(self.labels) - token_vector_width = pipeline[0].model.nO + for i in range(len(ids)): + label = self.make_label(i, words, tags, heads, deps, ents) + if label is not None and label not in self.labels: + self.labels[label] = len(self.labels) + print(len(self.labels)) if self.model is True: - self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] - self.model = self.Model(len(self.labels), **self.cfg) - link_vectors_to_models(self.vocab) + self.model = chain( + tok2vec, + Softmax(len(self.labels), 128) + ) + link_vectors_to_models(self.vocab) @classmethod - def Model(cls, n_tags, **cfg): - return build_tagger_model(n_tags, **cfg) + def Model(cls, n_tags, tok2vec=None, **cfg): + return build_tagger_model(n_tags, tok2vec=tok2vec, **cfg) def get_loss(self, docs, golds, scores): - scores = self.model.ops.flatten(scores) cdef int idx = 0 correct = numpy.zeros((scores.shape[0],), dtype='i') guesses = scores.argmax(axis=1) for gold in golds: - for tag in gold.labels: - if tag is None or tag not in self.labels: + for i in range(len(gold.labels)): + label = self.make_label(i, gold.words, gold.tags, gold.heads, + gold.labels, gold.ents) + if label is None or label not in self.labels: correct[idx] = guesses[idx] else: - correct[idx] = self.labels[tag] + correct[idx] = self.labels[label] idx += 1 correct = self.model.ops.xp.array(correct, dtype='i') d_scores = scores - to_categorical(correct, nb_classes=scores.shape[1]) d_scores /= d_scores.shape[0] loss = (d_scores**2).sum() - d_scores = self.model.ops.unflatten(d_scores, [len(d) for d in docs]) return float(loss), d_scores + @staticmethod + def make_dep(i, words, tags, heads, deps, ents): + if deps[i] is None or heads[i] is None: + return None + return deps[i] + + @staticmethod + def make_tag(i, words, tags, heads, deps, ents): + return tags[i] + + @staticmethod + def make_ent(i, words, tags, heads, deps, ents): + if ents is None: + return None + return ents[i] + + @staticmethod + def make_dep_tag_offset(i, words, tags, heads, deps, ents): + if deps[i] is None or heads[i] is None: + return None + offset = heads[i] - i + offset = min(offset, 2) + offset = max(offset, -2) + return '%s-%s:%d' % (deps[i], tags[i], offset) + + @staticmethod + def make_ent_tag(i, words, tags, heads, deps, ents): + if ents is None or ents[i] is None: + return None + else: + return '%s-%s' % (tags[i], ents[i]) + class SimilarityHook(BaseThincComponent): """ @@ -695,6 +746,14 @@ cdef class NeuralDependencyParser(NeuralParser): name = 'parser' TransitionSystem = ArcEager + def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): + for target in ['dep']: + labeller = NeuralLabeller(self.vocab, target=target) + tok2vec = self.model[0] + labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec) + pipeline.append(labeller) + self._multitasks.append(labeller) + def __reduce__(self): return (NeuralDependencyParser, (self.vocab, self.moves, self.model), None, None) @@ -705,13 +764,13 @@ cdef class NeuralEntityRecognizer(NeuralParser): nr_feature = 6 - def predict_confidences(self, docs): - tensors = [d.tensor for d in docs] - samples = [] - for i in range(10): - states = self.parse_batch(docs, tensors, drop=0.3) - for state in states: - samples.append(self._get_entities(state)) + def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): + for target in []: + labeller = NeuralLabeller(self.vocab, target=target) + tok2vec = self.model[0] + labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec) + pipeline.append(labeller) + self._multitasks.append(labeller) def __reduce__(self): return (NeuralEntityRecognizer, (self.vocab, self.moves, self.model), None, None) diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd index 524718965..b0b7693b7 100644 --- a/spacy/syntax/nn_parser.pxd +++ b/spacy/syntax/nn_parser.pxd @@ -13,6 +13,7 @@ cdef class Parser: cdef public object model cdef readonly TransitionSystem moves cdef readonly object cfg + cdef public object _multitasks cdef void _parse_step(self, StateC* state, const float* feat_weights, diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 9d9eda882..988c092af 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -318,6 +318,7 @@ cdef class Parser: for label in labels: self.moves.add_action(action, label) self.model = model + self._multitasks = [] def __reduce__(self): return (Parser, (self.vocab, self.moves, self.model), None, None) @@ -419,7 +420,7 @@ cdef class Parser: cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): if not has_hidden: - for i in range( + for i in cython.parallel.prange( next_step.size(), num_threads=6, nogil=True): self._parse_step(next_step[i], feat_weights, nr_class, nr_feat, nr_piece) @@ -745,7 +746,7 @@ cdef class Parser: # order, or the model goes out of synch self.cfg.setdefault('extra_labels', []).append(label) - def begin_training(self, gold_tuples, **cfg): + def begin_training(self, gold_tuples, pipeline=None, **cfg): if 'model' in cfg: self.model = cfg['model'] gold_tuples = nonproj.preprocess_training_data(gold_tuples) @@ -756,9 +757,20 @@ cdef class Parser: if self.model is True: cfg['pretrained_dims'] = self.vocab.vectors_length self.model, cfg = self.Model(self.moves.n_moves, **cfg) + self.init_multitask_objectives(gold_tuples, pipeline, **cfg) link_vectors_to_models(self.vocab) self.cfg.update(cfg) + def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): + '''Setup models for secondary objectives, to benefit from multi-task + learning. This method is intended to be overridden by subclasses. + + For instance, the dependency parser can benefit from sharing + an input representation with a label prediction model. These auxiliary + models are discarded after training. + ''' + pass + def preprocess_gold(self, docs_golds): for doc, gold in docs_golds: yield doc, gold From 02c65155ababfc16d67714fefbe58723cb595f5f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 12:50:31 +0200 Subject: [PATCH 101/649] Try to fix crazy travis error --- travis.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/travis.sh b/travis.sh index eed6a96f2..78599665c 100755 --- a/travis.sh +++ b/travis.sh @@ -17,6 +17,7 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt + python setup.py clean --all python setup.py build_ext --inplace pip install -e . fi From e34e70673f163e30a549e44fc9a85cf3673f74c9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 05:51:52 -0500 Subject: [PATCH 102/649] Allow tagger models to be built with pre-defined tok2vec layer --- spacy/_ml.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 3bb76c268..2e95aa55b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -512,8 +512,11 @@ def build_tagger_model(nr_class, **cfg): token_vector_width = util.env_opt('token_vector_width', 128) pretrained_dims = cfg.get('pretrained_dims', 0) with Model.define_operators({'>>': chain, '+': add}): - tok2vec = Tok2Vec(token_vector_width, embed_size, - pretrained_dims=pretrained_dims) + if 'tok2vec' in cfg: + tok2vec = cfg['tok2vec'] + else: + tok2vec = Tok2Vec(token_vector_width, embed_size, + pretrained_dims=pretrained_dims) model = ( tok2vec >> with_flatten(Softmax(nr_class, token_vector_width)) From 50ad50f96acdd110cdbd4662ca9878dc33e74cea Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Tue, 26 Sep 2017 13:11:17 +0200 Subject: [PATCH 103/649] Update matcher.pyx --- spacy/matcher.pyx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index 5106161a0..84414c255 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -436,6 +436,9 @@ cdef class PhraseMatcher: abstract_patterns.append([{tag: True} for tag in get_bilou(length)]) self.matcher.add('Candidate', None, *abstract_patterns) self._callbacks = {} + + def __len__(self): + raise NotImplementedError def __reduce__(self): return (self.__class__, (self.vocab,), None, None) From 7123139b2bce61f21bcab3f10f179ec235d9ae67 Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Tue, 26 Sep 2017 13:13:27 +0200 Subject: [PATCH 104/649] Add __contains__ to PhraseMatcher --- spacy/matcher.pyx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index 84414c255..9d7e66835 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -439,6 +439,9 @@ cdef class PhraseMatcher: def __len__(self): raise NotImplementedError + + def __contains__(self): + raise NotImplementedError def __reduce__(self): return (self.__class__, (self.vocab,), None, None) From 5056743ad52f27f58c067abbf21f34e154d60fbd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:44:56 -0500 Subject: [PATCH 105/649] Fix parser serialization --- spacy/syntax/nn_parser.pyx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 988c092af..a77352212 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -7,6 +7,7 @@ from __future__ import unicode_literals, print_function from collections import Counter, OrderedDict import ujson +import json import contextlib from libc.math cimport exp @@ -829,7 +830,7 @@ cdef class Parser: ('upper_model', lambda: self.model[2].to_bytes()), ('vocab', lambda: self.vocab.to_bytes()), ('moves', lambda: self.moves.to_bytes(strings=False)), - ('cfg', lambda: ujson.dumps(self.cfg)) + ('cfg', lambda: json.dumps(self.cfg, indent=2, sort_keys=True)) )) if 'model' in exclude: exclude['tok2vec_model'] = True @@ -842,7 +843,7 @@ cdef class Parser: deserializers = OrderedDict(( ('vocab', lambda b: self.vocab.from_bytes(b)), ('moves', lambda b: self.moves.from_bytes(b, strings=False)), - ('cfg', lambda b: self.cfg.update(ujson.loads(b))), + ('cfg', lambda b: self.cfg.update(json.loads(b))), ('tok2vec_model', lambda b: None), ('lower_model', lambda b: None), ('upper_model', lambda b: None) From 18a27c7579059617518bd87091e1fbd6a073a543 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:45:14 -0500 Subject: [PATCH 106/649] Fix typo in tensorizer serialization --- spacy/pipeline.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 17e9a15de..cd6fc3da6 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -145,7 +145,7 @@ class BaseThincComponent(object): deserialize = OrderedDict(( ('cfg', lambda b: self.cfg.update(ujson.loads(b))), - ('vocab', lambda b: self.vocab.from_bytes(b)) + ('vocab', lambda b: self.vocab.from_bytes(b)), ('model', load_model), )) util.from_bytes(bytes_data, deserialize, exclude) From 5aaef3e7b8b44f3af347aaed269380727823c380 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:45:47 -0500 Subject: [PATCH 107/649] Dont link vectors in vocab deserialize --- spacy/vocab.pyx | 2 -- 1 file changed, 2 deletions(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 01e074617..0a420849c 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -324,7 +324,6 @@ cdef class Vocab: self.lexemes_from_bytes(file_.read()) if self.vectors is not None: self.vectors.from_disk(path, exclude='strings.json') - link_vectors_to_models(self) return self def to_bytes(self, **exclude): @@ -364,7 +363,6 @@ cdef class Vocab: ('vectors', lambda b: serialize_vectors(b)) )) util.from_bytes(bytes_data, setters, exclude) - link_vectors_to_models(self) return self def lexemes_to_bytes(self): From 74f08e1ad5468ec5cf6545ad0719b736357016d1 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:45:56 -0500 Subject: [PATCH 108/649] Update test --- spacy/tests/serialize/test_serialize_tagger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tests/serialize/test_serialize_tagger.py b/spacy/tests/serialize/test_serialize_tagger.py index 3154687c3..475be1cef 100644 --- a/spacy/tests/serialize/test_serialize_tagger.py +++ b/spacy/tests/serialize/test_serialize_tagger.py @@ -11,7 +11,7 @@ import pytest def taggers(en_vocab): tagger1 = Tagger(en_vocab) tagger2 = Tagger(en_vocab) - tagger1.model = tagger1.Model(8, 8) + tagger1.model = tagger1.Model(8) tagger2.model = tagger1.model return (tagger1, tagger2) From 0196ff85da65e118501688eeee96120740655c0b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:54:21 -0500 Subject: [PATCH 109/649] Try to fix travis --- travis.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/travis.sh b/travis.sh index eed6a96f2..1940955b4 100755 --- a/travis.sh +++ b/travis.sh @@ -17,6 +17,7 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt + export PYTHONPATH=`pwd` python setup.py build_ext --inplace pip install -e . fi From a181987061d1e1042a21f162cc951219a1e5d485 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:55:15 -0500 Subject: [PATCH 110/649] Try to fix appveyor --- .appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 12399a5a1..a379cdd31 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -24,7 +24,6 @@ install: - "%PYTHON%\\python.exe -m pip install wheel" - "%PYTHON%\\python.exe -m pip install cython" - "%PYTHON%\\python.exe -m pip install -r requirements.txt" - - "%PYTHON%\\python.exe setup.py build_ext --inplace" - "%PYTHON%\\python.exe -m pip install -e ." build: off From ddee15cee957956394677b0dbcfa8ec48a76e6e4 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 14:00:25 +0200 Subject: [PATCH 111/649] Try to fix travis --- travis.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/travis.sh b/travis.sh index 78599665c..d1a1b6b29 100755 --- a/travis.sh +++ b/travis.sh @@ -18,7 +18,6 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt python setup.py clean --all - python setup.py build_ext --inplace pip install -e . fi From 8c390e23a2ca8c0b24dece18d2faafcbe8066778 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 14:14:46 +0200 Subject: [PATCH 112/649] Require older Cython --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6298b1982..5d515f7a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -cython>=0.24 +cython>=0.24,<0.27.0 pathlib numpy>=1.7 cymem>=1.30,<1.32 From 9bfd585a11e67e0bc3683de491357044ef66b8f0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 07:28:50 -0500 Subject: [PATCH 113/649] Fix parameter name in .pxd file --- spacy/tokens/doc.pxd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tokens/doc.pxd b/spacy/tokens/doc.pxd index d0c83e0f8..ad2b9876d 100644 --- a/spacy/tokens/doc.pxd +++ b/spacy/tokens/doc.pxd @@ -54,7 +54,7 @@ cdef class Doc: cdef public object noun_chunks_iterator - cdef int push_back(self, LexemeOrToken lex_or_tok, bint trailing_space) except -1 + cdef int push_back(self, LexemeOrToken lex_or_tok, bint has_space) except -1 cpdef np.ndarray to_array(self, object features) From ca28590ddd0f1922d14290170c4c7ff8adcadab2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 08:13:52 -0500 Subject: [PATCH 114/649] Use dep and ent multi-task objectives for parser' --- spacy/pipeline.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index cd6fc3da6..294440494 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -747,7 +747,7 @@ cdef class NeuralDependencyParser(NeuralParser): TransitionSystem = ArcEager def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): - for target in ['dep']: + for target in ['dep', 'ent']: labeller = NeuralLabeller(self.vocab, target=target) tok2vec = self.model[0] labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec) From 698fc0d016c3fde05234ef7125ac56343bd343c9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 08:31:37 -0500 Subject: [PATCH 115/649] Remove merge artefact --- spacy/cli/train.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 2ed66b1a6..6178ecb3b 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -130,7 +130,6 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, with meta_loc.open('w') as file_: file_.write(json_dumps(meta)) ->>>>>>> origin/develop util.set_env_log(True) print_progress(i, losses, scorer.scores) finally: From 19c7c09bf735c74274cbf6d75a3ca89b248d3865 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 08:35:53 -0500 Subject: [PATCH 116/649] Fix PhraseMatcher.__contains__ --- spacy/matcher.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index 9d7e66835..3bc6f859c 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -436,11 +436,11 @@ cdef class PhraseMatcher: abstract_patterns.append([{tag: True} for tag in get_bilou(length)]) self.matcher.add('Candidate', None, *abstract_patterns) self._callbacks = {} - + def __len__(self): raise NotImplementedError - - def __contains__(self): + + def __contains__(self, key): raise NotImplementedError def __reduce__(self): From 3274b46a0d3255975178f669c7b5c83f57be48fb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 09:05:53 -0500 Subject: [PATCH 117/649] Try to fix compile error on Windows --- spacy/syntax/nn_parser.pyx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index a77352212..99099cad8 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -419,21 +419,23 @@ cdef class Parser: c_token_ids = token_ids.data c_is_valid = is_valid.data cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) + cdef int nr_step while not next_step.empty(): + nr_step = next_step.size() if not has_hidden: - for i in cython.parallel.prange( - next_step.size(), num_threads=6, nogil=True): + for i in cython.parallel.prange(nr_step, num_threads=6, + nogil=True): self._parse_step(next_step[i], feat_weights, nr_class, nr_feat, nr_piece) else: - for i in range(next_step.size()): + for i in range(nr_step): st = next_step[i] st.set_context_tokens(&c_token_ids[i*nr_feat], nr_feat) self.moves.set_valid(&c_is_valid[i*nr_class], st) vectors = state2vec(token_ids[:next_step.size()]) scores = vec2scores(vectors) c_scores = scores.data - for i in range(next_step.size()): + for i in range(nr_step): st = next_step[i] guess = arg_max_if_valid( &c_scores[i*nr_class], &c_is_valid[i*nr_class], nr_class) From 10d291f129efe94115ccb679e3c52cf9a0292a19 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:11:41 +0200 Subject: [PATCH 118/649] Port over change from #1351 --- spacy/lang/char_classes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index 0698cfd43..46e422df2 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -29,7 +29,7 @@ _units = ('km km² km³ m m² m³ dm dm² dm³ cm cm² cm³ mm mm² mm³ ha µm 'kg g mg µg t lb oz m/s km/h kmh mph hPa Pa mbar mb MB kb KB gb GB tb ' 'TB T G M K %') _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$' -_punct = r'… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' +_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' _quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‚ , „ » «' _hyphens = '- – — -- ---' _other_symbols = r'[\p{So}]' From 5cba67146cc17f8075dc4010927a220c5353500e Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 21:36:27 +0700 Subject: [PATCH 119/649] add thai in spacy2 --- spacy/lang/th/__init__.py | 36 ++++++++++++ spacy/lang/th/stop_words.py | 62 ++++++++++++++++++++ spacy/lang/th/tag_map.py | 81 +++++++++++++++++++++++++++ spacy/lang/th/tokenizer_exceptions.py | 80 ++++++++++++++++++++++++++ spacy/tests/conftest.py | 6 +- spacy/tests/lang/th/__init__.py | 0 spacy/tests/lang/th/test_tokenizer.py | 13 +++++ 7 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 spacy/lang/th/__init__.py create mode 100644 spacy/lang/th/stop_words.py create mode 100644 spacy/lang/th/tag_map.py create mode 100644 spacy/lang/th/tokenizer_exceptions.py create mode 100644 spacy/tests/lang/th/__init__.py create mode 100644 spacy/tests/lang/th/test_tokenizer.py diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py new file mode 100644 index 000000000..4b52cfa25 --- /dev/null +++ b/spacy/lang/th/__init__.py @@ -0,0 +1,36 @@ +# coding: utf8 +from __future__ import unicode_literals + +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS +from .tag_map import TAG_MAP +from .stop_words import STOP_WORDS + +from ..tokenizer_exceptions import BASE_EXCEPTIONS +from ..tokens import Doc +from ..norm_exceptions import BASE_NORMS +from ...language import Language +from ...attrs import LANG, NORM +from ...util import update_exc, add_lookups + + +class ThaiDefaults(Language.Defaults): + lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters[LANG] = lambda text: 'th' + tokenizer_exceptions = TOKENIZER_EXCEPTIONS + tag_map = dict(TAG_MAP) + stop_words = set(STOP_WORDS) + + +class Thai(Language): + lang = 'th' + Defaults = ThaiDefaults + def make_doc(self, text): + try: + from pythainlp.tokenize import word_tokenize + except ImportError: + raise ImportError("The Thai tokenizer requires the PyThaiNLP library: " + "https://github.com/wannaphongcom/pythainlp/") + words = [x for x in list(word_tokenize(text,"newmm"))] + return Doc(self.vocab, words=words, spaces=[False]*len(words)) + +__all__ = ['Thai'] diff --git a/spacy/lang/th/stop_words.py b/spacy/lang/th/stop_words.py new file mode 100644 index 000000000..e13dec984 --- /dev/null +++ b/spacy/lang/th/stop_words.py @@ -0,0 +1,62 @@ +# encoding: utf8 +from __future__ import unicode_literals + +# data from https://github.com/wannaphongcom/pythainlp/blob/dev/pythainlp/corpus/stopwords-th.txt +# stop words as whitespace-separated list +STOP_WORDS = set(""" +นี้ นํา นั้น นัก นอกจาก ทุก ที่สุด ที่ ทําให้ ทํา ทาง ทั้งนี้ ดัง ซึ่ง ช่วง จาก จัด จะ คือ ความ ครั้ง คง ขึ้น ของ +ขอ รับ ระหว่าง รวม ยัง มี มาก มา พร้อม พบ ผ่าน ผล บาง น่า เปิดเผย เปิด เนื่องจาก เดียวกัน เดียว เช่น เฉพาะ เข้า ถ้า +ถูก ถึง ต้อง ต่างๆ ต่าง ต่อ ตาม ตั้งแต่ ตั้ง ด้าน ด้วย อีก อาจ ออก อย่าง อะไร อยู่ อยาก หาก หลาย หลังจาก แต่ เอง เห็น +เลย เริ่ม เรา เมื่อ เพื่อ เพราะ เป็นการ เป็น หลัง หรือ หนึ่ง ส่วน ส่ง สุด สําหรับ ว่า ลง ร่วม ราย ขณะ ก่อน ก็ การ กับ กัน +กว่า กล่าว จึง ไว้ ไป ได้ ให้ ใน โดย แห่ง แล้ว และ แรก แบบ ๆ ทั้ง วัน เขา เคย ไม่ อยาก เกิน เกินๆ เกี่ยวกัน เกี่ยวกับ +เกี่ยวข้อง เกี่ยวเนื่อง เกี่ยวๆ เกือบ เกือบจะ เกือบๆ แก แก่ แก้ไข ใกล้ ใกล้ๆ ไกล ไกลๆ ขณะเดียวกัน ขณะใด ขณะใดๆ ขณะที่ ขณะนั้น ขณะนี้ ขณะหนึ่ง ขวาง +ขวางๆ ขั้น ใคร ใคร่ ใคร่จะ ใครๆ ง่าย ง่ายๆ ไง จง จด จน จนกระทั่ง จนกว่า จนขณะนี้ จนตลอด จนถึง จนทั่ว จนบัดนี้ จนเมื่อ จนแม้ จนแม้น +จรด จรดกับ จริง จริงจัง จริงๆ จริงๆจังๆ จวน จวนจะ จวนเจียน จวบ ซึ่งก็ ซึ่งก็คือ ซึ่งกัน ซึ่งกันและกัน ซึ่งได้แก่ ซึ่งๆ ณ ด้วย ด้วยกัน ด้วยเช่นกัน ด้วยที่ ด้วยประการฉะนี้ +ด้วยเพราะ ด้วยว่า ด้วยเหตุที่ ด้วยเหตุนั้น ด้วยเหตุนี้ ด้วยเหตุเพราะ ด้วยเหตุว่า ด้วยเหมือนกัน ดั่ง ดังกล่าว ดังกับ ดั่งกับ ดังกับว่า ดั่งกับว่า ดังเก่า +ดั่งเก่า ดังเคย ใดๆ ได้ ได้แก่ ได้แต่ ได้ที่ ได้มา ได้รับ ตน ตนเอง ตนฯ ตรง ตรงๆ ตลอด ตลอดกาล ตลอดกาลนาน ตลอดจน ตลอดถึง ตลอดทั้ง +ตลอดทั่ว ตลอดทั่วถึง ตลอดทั่วทั้ง ตลอดปี ตลอดไป ตลอดมา ตลอดระยะเวลา ตลอดวัน ตลอดเวลา ตลอดศก ต่อ ต่อกัน ถึงแก่ ถึงจะ ถึงบัดนั้น ถึงบัดนี้ +ถึงเมื่อ ถึงเมื่อใด ถึงเมื่อไร ถึงแม้ ถึงแม้จะ ถึงแม้ว่า ถึงอย่างไร ถือ ถือว่า ถูกต้อง ถูกๆ เถอะ เถิด ทรง ทว่า ทั้งคน ทั้งตัว ทั้งที ทั้งที่ ทั้งนั้น ทั้งนั้นด้วย ทั้งนั้นเพราะ +นอก นอกจากที่ นอกจากนั้น นอกจากนี้ นอกจากว่า นอกนั้น นอกเหนือ นอกเหนือจาก น้อย น้อยกว่า น้อยๆ นะ น่ะ นักๆ นั่น นั่นไง นั่นเป็น นั่นแหละ +นั่นเอง นั้นๆ นับ นับจากนั้น นับจากนี้ นับตั้งแต่ นับแต่ นับแต่ที่ นับแต่นั้น เป็นต้น เป็นต้นไป เป็นต้นมา เป็นแต่ เป็นแต่เพียง เป็นที เป็นที่ เป็นที่สุด เป็นเพราะ +เป็นเพราะว่า เป็นเพียง เป็นเพียงว่า เป็นเพื่อ เป็นอัน เป็นอันมาก เป็นอันว่า เป็นอันๆ เป็นอาทิ เป็นๆ เปลี่ยน เปลี่ยนแปลง เปิด เปิดเผย ไป่ ผ่าน ผ่านๆ +ผิด ผิดๆ ผู้ เพียงเพื่อ เพียงไร เพียงไหน เพื่อที่ เพื่อที่จะ เพื่อว่า เพื่อให้ ภาค ภาคฯ ภาย ภายใต้ ภายนอก ภายใน ภายภาค ภายภาคหน้า ภายหน้า ภายหลัง +มอง มองว่า มัก มักจะ มัน มันๆ มั้ย มั้ยนะ มั้ยนั่น มั้ยเนี่ย มั้ยล่ะ ยืนนาน ยืนยง ยืนยัน ยืนยาว เยอะ เยอะแยะ เยอะๆ แยะ แยะๆ รวด รวดเร็ว ร่วม รวมกัน ร่วมกัน +รวมด้วย ร่วมด้วย รวมถึง รวมทั้ง ร่วมมือ รวมๆ ระยะ ระยะๆ ระหว่าง รับรอง รึ รึว่า รือ รือว่า สิ้นกาลนาน สืบเนื่อง สุดๆ สู่ สูง สูงกว่า สูงส่ง สูงสุด สูงๆ เสมือนกับ +เสมือนว่า เสร็จ เสร็จกัน เสร็จแล้ว เสร็จสมบูรณ์ เสร็จสิ้น เสีย เสียก่อน เสียจน เสียจนกระทั่ง เสียจนถึง เสียด้วย เสียนั่น เสียนั่นเอง เสียนี่ เสียนี่กระไร เสียยิ่ง +เสียยิ่งนัก เสียแล้ว ใหญ่ๆ ให้ดี ให้แด่ ให้ไป ใหม่ ให้มา ใหม่ๆ ไหน ไหนๆ อดีต อนึ่ง อย่าง อย่างเช่น อย่างดี อย่างเดียว อย่างใด อย่างที่ อย่างน้อย อย่างนั้น +อย่างนี้ อย่างโน้น ก็คือ ก็แค่ ก็จะ ก็ดี ก็ได้ ก็ต่อเมื่อ ก็ตาม ก็ตามแต่ ก็ตามที ก็แล้วแต่ กระทั่ง กระทำ กระนั้น กระผม กลับ กล่าวคือ กลุ่ม กลุ่มก้อน +กลุ่มๆ กว้าง กว้างขวาง กว้างๆ ก่อนหน้า ก่อนหน้านี้ ก่อนๆ กันดีกว่า กันดีไหม กันเถอะ กันนะ กันและกัน กันไหม กันเอง กำลัง กำลังจะ กำหนด กู เก็บ +เกิด เกี่ยวข้อง แก่ แก้ไข ใกล้ ใกล้ๆ ข้า ข้าง ข้างเคียง ข้างต้น ข้างบน ข้างล่าง ข้างๆ ขาด ข้าพเจ้า ข้าฯ เข้าใจ เขียน คงจะ คงอยู่ ครบ ครบครัน ครบถ้วน +ครั้งกระนั้น ครั้งก่อน ครั้งครา ครั้งคราว ครั้งใด ครั้งที่ ครั้งนั้น ครั้งนี้ ครั้งละ ครั้งหนึ่ง ครั้งหลัง ครั้งหลังสุด ครั้งไหน ครั้งๆ ครัน ครับ ครา คราใด คราที่ ครานั้น ครานี้ คราหนึ่ง +คราไหน คราว คราวก่อน คราวใด คราวที่ คราวนั้น คราวนี้ คราวโน้น คราวละ คราวหน้า คราวหนึ่ง คราวหลัง คราวไหน คราวๆ คล้าย คล้ายกัน คล้ายกันกับ +คล้ายกับ คล้ายกับว่า คล้ายว่า ควร ค่อน ค่อนข้าง ค่อนข้างจะ ค่อยไปทาง ค่อนมาทาง ค่อย ค่อยๆ คะ ค่ะ คำ คิด คิดว่า คุณ คุณๆ +เคยๆ แค่ แค่จะ แค่นั้น แค่นี้ แค่เพียง แค่ว่า แค่ไหน ใคร่ ใคร่จะ ง่าย ง่ายๆ จนกว่า จนแม้ จนแม้น จังๆ จวบกับ จวบจน จ้ะ จ๊ะ จะได้ จัง จัดการ จัดงาน จัดแจง +จัดตั้ง จัดทำ จัดหา จัดให้ จับ จ้า จ๋า จากนั้น จากนี้ จากนี้ไป จำ จำเป็น จำพวก จึงจะ จึงเป็น จู่ๆ ฉะนั้น ฉะนี้ ฉัน เฉกเช่น เฉย เฉยๆ ไฉน ช่วงก่อน +ช่วงต่อไป ช่วงถัดไป ช่วงท้าย ช่วงที่ ช่วงนั้น ช่วงนี้ ช่วงระหว่าง ช่วงแรก ช่วงหน้า ช่วงหลัง ช่วงๆ ช่วย ช้า ช้านาน ชาว ช้าๆ เช่นก่อน เช่นกัน เช่นเคย +เช่นดัง เช่นดังก่อน เช่นดังเก่า เช่นดังที่ เช่นดังว่า เช่นเดียวกัน เช่นเดียวกับ เช่นใด เช่นที่ เช่นที่เคย เช่นที่ว่า เช่นนั้น เช่นนั้นเอง เช่นนี้ เช่นเมื่อ เช่นไร เชื่อ +เชื่อถือ เชื่อมั่น เชื่อว่า ใช่ ใช่ไหม ใช้ ซะ ซะก่อน ซะจน ซะจนกระทั่ง ซะจนถึง ซึ่งได้แก่ ด้วยกัน ด้วยเช่นกัน ด้วยที่ ด้วยเพราะ ด้วยว่า ด้วยเหตุที่ ด้วยเหตุนั้น +ด้วยเหตุนี้ ด้วยเหตุเพราะ ด้วยเหตุว่า ด้วยเหมือนกัน ดังกล่าว ดังกับว่า ดั่งกับว่า ดังเก่า ดั่งเก่า ดั่งเคย ต่างก็ ต่างหาก ตามด้วย ตามแต่ ตามที่ +ตามๆ เต็มไปด้วย เต็มไปหมด เต็มๆ แต่ก็ แต่ก่อน แต่จะ แต่เดิม แต่ต้อง แต่ถ้า แต่ทว่า แต่ที่ แต่นั้น แต่เพียง แต่เมื่อ แต่ไร แต่ละ แต่ว่า แต่ไหน แต่อย่างใด โต +โตๆ ใต้ ถ้าจะ ถ้าหาก ถึงแก่ ถึงแม้ ถึงแม้จะ ถึงแม้ว่า ถึงอย่างไร ถือว่า ถูกต้อง ทว่า ทั้งนั้นด้วย ทั้งปวง ทั้งเป็น ทั้งมวล ทั้งสิ้น ทั้งหมด ทั้งหลาย ทั้งๆ ทัน +ทันใดนั้น ทันที ทันทีทันใด ทั่ว ทำไม ทำไร ทำให้ ทำๆ ที ที่จริง ที่ซึ่ง ทีเดียว ทีใด ที่ใด ที่ได้ ทีเถอะ ที่แท้ ที่แท้จริง ที่นั้น ที่นี้ ทีไร ทีละ ที่ละ +ที่แล้ว ที่ว่า ที่แห่งนั้น ที่ไหน ทีๆ ที่ๆ ทุกคน ทุกครั้ง ทุกครา ทุกคราว ทุกชิ้น ทุกตัว ทุกทาง ทุกที ทุกที่ ทุกเมื่อ ทุกวัน ทุกวันนี้ ทุกสิ่ง ทุกหน ทุกแห่ง ทุกอย่าง +ทุกอัน ทุกๆ เท่า เท่ากัน เท่ากับ เท่าใด เท่าที่ เท่านั้น เท่านี้ เท่าไร เท่าไหร่ แท้ แท้จริง เธอ นอกจากว่า น้อย น้อยกว่า น้อยๆ น่ะ นั้นไว นับแต่นี้ นาง +นางสาว น่าจะ นาน นานๆ นาย นำ นำพา นำมา นิด นิดหน่อย นิดๆ นี่ นี่ไง นี่นา นี่แน่ะ นี่แหละ นี้แหล่ นี่เอง นี้เอง นู่น นู้น เน้น เนี่ย +เนี่ยเอง ในช่วง ในที่ ในเมื่อ ในระหว่าง บน บอก บอกแล้ว บอกว่า บ่อย บ่อยกว่า บ่อยครั้ง บ่อยๆ บัดดล บัดเดี๋ยวนี้ บัดนั้น บัดนี้ บ้าง บางกว่า +บางขณะ บางครั้ง บางครา บางคราว บางที บางที่ บางแห่ง บางๆ ปฏิบัติ ประกอบ ประการ ประการฉะนี้ ประการใด ประการหนึ่ง ประมาณ ประสบ ปรับ +ปรากฏ ปรากฏว่า ปัจจุบัน ปิด เป็นด้วย เป็นดัง เป็นต้น เป็นแต่ เป็นเพื่อ เป็นอัน เป็นอันมาก เป็นอาทิ ผ่านๆ ผู้ ผู้ใด เผื่อ เผื่อจะ เผื่อที่ เผื่อว่า ฝ่าย +ฝ่ายใด พบว่า พยายาม พร้อมกัน พร้อมกับ พร้อมด้วย พร้อมทั้ง พร้อมที่ พร้อมเพียง พวก พวกกัน พวกกู พวกแก พวกเขา พวกคุณ พวกฉัน พวกท่าน +พวกที่ พวกเธอ พวกนั้น พวกนี้ พวกนู้น พวกโน้น พวกมัน พวกมึง พอ พอกัน พอควร พอจะ พอดี พอตัว พอที พอที่ พอเพียง พอแล้ว พอสม พอสมควร +พอเหมาะ พอๆ พา พึง พึ่ง พื้นๆ พูด เพราะฉะนั้น เพราะว่า เพิ่ง เพิ่งจะ เพิ่ม เพิ่มเติม เพียง เพียงแค่ เพียงใด เพียงแต่ เพียงพอ เพียงเพราะ +เพื่อว่า เพื่อให้ ภายใต้ มองว่า มั๊ย มากกว่า มากมาย มิ มิฉะนั้น มิใช่ มิได้ มีแต่ มึง มุ่ง มุ่งเน้น มุ่งหมาย เมื่อก่อน เมื่อครั้ง เมื่อครั้งก่อน +เมื่อคราวก่อน เมื่อคราวที่ เมื่อคราว เมื่อคืน เมื่อเช้า เมื่อใด เมื่อนั้น เมื่อนี้ เมื่อเย็น เมื่อไร เมื่อวันวาน เมื่อวาน เมื่อไหร่ แม้ แม้กระทั่ง แม้แต่ แม้นว่า แม้ว่า +ไม่ค่อย ไม่ค่อยจะ ไม่ค่อยเป็น ไม่ใช่ ไม่เป็นไร ไม่ว่า ยก ยกให้ ยอม ยอมรับ ย่อม ย่อย ยังคง ยังงั้น ยังงี้ ยังโง้น ยังไง ยังจะ ยังแต่ ยาก +ยาว ยาวนาน ยิ่ง ยิ่งกว่า ยิ่งขึ้น ยิ่งขึ้นไป ยิ่งจน ยิ่งจะ ยิ่งนัก ยิ่งเมื่อ ยิ่งแล้ว ยิ่งใหญ่ ร่วมกัน รวมด้วย ร่วมด้วย รือว่า เร็ว เร็วๆ เราๆ เรียก เรียบ เรื่อย +เรื่อยๆ ไร ล้วน ล้วนจน ล้วนแต่ ละ ล่าสุด เล็ก เล็กน้อย เล็กๆ เล่าว่า แล้วกัน แล้วแต่ แล้วเสร็จ วันใด วันนั้น วันนี้ วันไหน สบาย สมัย สมัยก่อน +สมัยนั้น สมัยนี้ สมัยโน้น ส่วนเกิน ส่วนด้อย ส่วนดี ส่วนใด ส่วนที่ ส่วนน้อย ส่วนนั้น ส่วนมาก ส่วนใหญ่ สั้น สั้นๆ สามารถ สำคัญ สิ่ง +สิ่งใด สิ่งนั้น สิ่งนี้ สิ่งไหน สิ้น เสร็จแล้ว เสียด้วย เสียแล้ว แสดง แสดงว่า หน หนอ หนอย หน่อย หมด หมดกัน หมดสิ้น หรือไง หรือเปล่า หรือไม่ หรือยัง +หรือไร หากแม้ หากแม้น หากแม้นว่า หากว่า หาความ หาใช่ หารือ เหตุ เหตุผล เหตุนั้น เหตุนี้ เหตุไร เห็นแก่ เห็นควร เห็นจะ เห็นว่า เหลือ เหลือเกิน เหล่า +เหล่านั้น เหล่านี้ แห่งใด แห่งนั้น แห่งนี้ แห่งโน้น แห่งไหน แหละ ให้แก่ ใหญ่ ใหญ่โต อย่างเช่น อย่างดี อย่างเดียว อย่างใด อย่างที่ อย่างน้อย อย่างนั้น อย่างนี้ +อย่างโน้น อย่างมาก อย่างยิ่ง อย่างไร อย่างไรก็ อย่างไรก็ได้ อย่างไรเสีย อย่างละ อย่างหนึ่ง อย่างไหน อย่างๆ อัน อันจะ อันใด อันได้แก่ อันที่ +อันที่จริง อันที่จะ อันเนื่องมาจาก อันละ อันไหน อันๆ อาจจะ อาจเป็น อาจเป็นด้วย อื่น อื่นๆ เอ็ง เอา ฯ ฯล ฯลฯ +""".split()) \ No newline at end of file diff --git a/spacy/lang/th/tag_map.py b/spacy/lang/th/tag_map.py new file mode 100644 index 000000000..e225f7289 --- /dev/null +++ b/spacy/lang/th/tag_map.py @@ -0,0 +1,81 @@ +# encoding: utf8 +# data from Korakot Chaovavanich (https://www.facebook.com/photo.php?fbid=390564854695031&set=p.390564854695031&type=3&permPage=1&ifg=1) +from __future__ import unicode_literals + +from ..symbols import * + +TAG_MAP = { + #NOUN + "NOUN": {POS: NOUN}, + "NCMN": {POS: NOUN}, + "NTTL": {POS: NOUN}, + "CNIT": {POS: NOUN}, + "CLTV": {POS: NOUN}, + "CMTR": {POS: NOUN}, + "CFQC": {POS: NOUN}, + "CVBL": {POS: NOUN}, + #PRON + "PRON": {POS: PRON}, + "NPRP": {POS: PRON}, + # ADJ + "ADJ": {POS: ADJ}, + "NONM": {POS: ADJ}, + "VATT": {POS: ADJ}, + "DONM": {POS: ADJ}, + # ADV + "ADV": {POS: ADV}, + "ADVN": {POS: ADV}, + "ADVI": {POS: ADV}, + "ADVP": {POS: ADV}, + "ADVS": {POS: ADV}, + # INT + "INT": {POS: INTJ}, + # PRON + "PROPN": {POS: PROPN}, + "PPRS": {POS: PROPN}, + "PDMN": {POS: PROPN}, + "PNTR": {POS: PROPN}, + # DET + "DET": {POS: DET}, + "DDAN": {POS: DET}, + "DDAC": {POS: DET}, + "DDBQ": {POS: DET}, + "DDAQ": {POS: DET}, + "DIAC": {POS: DET}, + "DIBQ": {POS: DET}, + "DIAQ": {POS: DET}, + "DCNM": {POS: DET}, + # NUM + "NUM": {POS: NUM}, + "NCNM": {POS: NUM}, + "NLBL": {POS: NUM}, + "DCNM": {POS: NUM}, + # AUX + "AUX": {POS: AUX}, + "XVBM": {POS: AUX}, + "XVAM": {POS: AUX}, + "XVMM": {POS: AUX}, + "XVBB": {POS: AUX}, + "XVAE": {POS: AUX}, + # ADP + "ADP": {POS: ADP}, + "RPRE": {POS: ADP}, + # CCONJ + "CCONJ": {POS: CCONJ}, + "JCRG": {POS: CCONJ}, + # SCONJ + "SCONJ": {POS: SCONJ}, + "PREL": {POS: SCONJ}, + "JSBR": {POS: SCONJ}, + "JCMP": {POS: SCONJ}, + # PART + "PART": {POS: PART}, + "FIXN": {POS: PART}, + "FIXV": {POS: PART}, + "EAFF": {POS: PART}, + "AITT": {POS: PART}, + "NEG": {POS: PART}, + # PUNCT + "PUNCT": {POS: PUNCT}, + "PUNC": {POS: PUNCT} +} \ No newline at end of file diff --git a/spacy/lang/th/tokenizer_exceptions.py b/spacy/lang/th/tokenizer_exceptions.py new file mode 100644 index 000000000..7e3967aed --- /dev/null +++ b/spacy/lang/th/tokenizer_exceptions.py @@ -0,0 +1,80 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from ..symbols import * +from ..language_data import PRON_LEMMA + + +TOKENIZER_EXCEPTIONS = { + "ม.ค.": [ + {ORTH: "ม.ค.", LEMMA: "มกราคม"} + ], + "ก.พ.": [ + {ORTH: "ก.พ.", LEMMA: "กุมภาพันธ์"} + ], + "มี.ค.": [ + {ORTH: "มี.ค.", LEMMA: "มีนาคม"} + ], + "เม.ย.": [ + {ORTH: "เม.ย.", LEMMA: "เมษายน"} + ], + "พ.ค.": [ + {ORTH: "พ.ค.", LEMMA: "พฤษภาคม"} + ], + "มิ.ย.": [ + {ORTH: "มิ.ย.", LEMMA: "มิถุนายน"} + ], + "ก.ค.": [ + {ORTH: "ก.ค.", LEMMA: "กรกฎาคม"} + ], + "ส.ค.": [ + {ORTH: "ส.ค.", LEMMA: "สิงหาคม"} + ], + "ก.ย.": [ + {ORTH: "ก.ย.", LEMMA: "กันยายน"} + ], + "ต.ค.": [ + {ORTH: "ต.ค.", LEMMA: "ตุลาคม"} + ], + "พ.ย.": [ + {ORTH: "พ.ย.", LEMMA: "พฤศจิกายน"} + ], + "ธ.ค.": [ + {ORTH: "ธ.ค.", LEMMA: "ธันวาคม"} + ] +} + + +# exceptions mapped to a single token containing only ORTH property +# example: {"string": [{ORTH: "string"}]} +# converted using strings_to_exc() util +''' +ORTH_ONLY = [ + "a.", + "b.", + "c.", + "d.", + "e.", + "f.", + "g.", + "h.", + "i.", + "j.", + "k.", + "l.", + "m.", + "n.", + "o.", + "p.", + "q.", + "r.", + "s.", + "t.", + "u.", + "v.", + "w.", + "x.", + "y.", + "z." +] +''' \ No newline at end of file diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index f5d65803a..70c78ab9f 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -12,7 +12,7 @@ from .. import util _languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'id', - 'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'xx'] + 'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'th','xx'] _models = {'en': ['en_core_web_sm'], 'de': ['de_core_news_md'], 'fr': ['fr_depvec_web_lg'], @@ -108,6 +108,10 @@ def he_tokenizer(): def nb_tokenizer(): return util.get_lang_class('nb').Defaults.create_tokenizer() +@pytest.fixture +def th_tokenizer(): + return util.get_lang_class('th').Defaults.create_tokenizer() + @pytest.fixture def stringstore(): diff --git a/spacy/tests/lang/th/__init__.py b/spacy/tests/lang/th/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/th/test_tokenizer.py b/spacy/tests/lang/th/test_tokenizer.py new file mode 100644 index 000000000..f5925da1e --- /dev/null +++ b/spacy/tests/lang/th/test_tokenizer.py @@ -0,0 +1,13 @@ +# coding: utf8 +from __future__ import unicode_literals + +import pytest + +TOKENIZER_TESTS = [ + ("คุณรักผมไหม", ['คุณ', 'รัก', 'ผม', 'ไหม']) +] + +@pytest.mark.parametrize('text,expected_tokens', TOKENIZER_TESTS) +def test_thai_tokenizer(th_tokenizer, text, expected_tokens): + tokens = [token.text for token in th_tokenizer(text)] + assert tokens == expected_tokens From 5ee10379db2d567755b48e8cf4881bb2049181b2 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:38:08 +0200 Subject: [PATCH 120/649] Port over changes from #1340 --- spacy/lang/char_classes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index 46e422df2..b10481411 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -29,9 +29,9 @@ _units = ('km km² km³ m m² m³ dm dm² dm³ cm cm² cm³ mm mm² mm³ ha µm 'kg g mg µg t lb oz m/s km/h kmh mph hPa Pa mbar mb MB kb KB gb GB tb ' 'TB T G M K %') _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$' -_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' +_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* & 。 ? ! , 、 ; : ~ ·' _quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‚ , „ » «' -_hyphens = '- – — -- ---' +_hyphens = '- – — -- --- —— ~' _other_symbols = r'[\p{So}]' UNITS = merge_chars(_units) From adda08fe14479e465668bcf39dcedd238a4be20e Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:39:15 +0200 Subject: [PATCH 121/649] Implement like_num getter for Dutch (via #1177) --- spacy/lang/nl/__init__.py | 2 ++ spacy/lang/nl/lex_attrs.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 spacy/lang/nl/lex_attrs.py diff --git a/spacy/lang/nl/__init__.py b/spacy/lang/nl/__init__.py index 7b948f295..98df8d487 100644 --- a/spacy/lang/nl/__init__.py +++ b/spacy/lang/nl/__init__.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from .stop_words import STOP_WORDS +from .lex_attrs import LEX_ATTRS from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS @@ -12,6 +13,7 @@ from ...util import update_exc, add_lookups class DutchDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters.update(LEX_ATTRS) lex_attr_getters[LANG] = lambda text: 'nl' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) diff --git a/spacy/lang/nl/lex_attrs.py b/spacy/lang/nl/lex_attrs.py new file mode 100644 index 000000000..4a9c0bdc3 --- /dev/null +++ b/spacy/lang/nl/lex_attrs.py @@ -0,0 +1,36 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...attrs import LIKE_NUM + + +_num_words = set(""" +nul een één twee drie vier vijf zes zeven acht negen tien elf twaalf dertien +veertien twintig dertig veertig vijftig zestig zeventig tachtig negentig honderd +duizend miljoen miljard biljoen biljard triljoen triljard +""".split()) + +_ordinal_words = set(""" +eerste tweede derde vierde vijfde zesde zevende achtste negende tiende elfde +twaalfde dertiende veertiende twintigste dertigste veertigste vijftigste +zestigste zeventigste tachtigste negentigste honderdste duizendste miljoenste +miljardste biljoenste biljardste triljoenste triljardste +""".split()) + + +def like_num(text): + text = text.replace(',', '').replace('.', '') + if text.isdigit(): + return True + if text.count('/') == 1: + num, denom = text.split('/') + if num.isdigit() and denom.isdigit(): + return True + if text in _num_words: + return True + return False + + +LEX_ATTRS = { + LIKE_NUM: like_num +} From 15479b3baea8d0f5cb58bf7d22321646ac4513bc Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:43:28 +0200 Subject: [PATCH 122/649] Add comment to like_num re: future work --- spacy/lang/nl/lex_attrs.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spacy/lang/nl/lex_attrs.py b/spacy/lang/nl/lex_attrs.py index 4a9c0bdc3..08b1df3be 100644 --- a/spacy/lang/nl/lex_attrs.py +++ b/spacy/lang/nl/lex_attrs.py @@ -19,6 +19,10 @@ miljardste biljoenste biljardste triljoenste triljardste def like_num(text): + # This only does the most basic check for whether a token is a digit + # or matches one of the number words. In order to handle numbers like + # "drieëntwintig", more work is required. + # See this discussion: https://github.com/explosion/spaCy/pull/1177 text = text.replace(',', '').replace('.', '') if text.isdigit(): return True From bb5c6314029cc598b667542579fad347044422e9 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:47:45 +0200 Subject: [PATCH 123/649] Implement like_num getter for French (via #1161) --- spacy/lang/fr/__init__.py | 2 ++ spacy/lang/fr/lex_attrs.py | 41 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 spacy/lang/fr/lex_attrs.py diff --git a/spacy/lang/fr/__init__.py b/spacy/lang/fr/__init__.py index a243b6268..06dcf2d45 100644 --- a/spacy/lang/fr/__init__.py +++ b/spacy/lang/fr/__init__.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS, TOKEN_MATCH from .punctuation import TOKENIZER_SUFFIXES, TOKENIZER_INFIXES from .stop_words import STOP_WORDS +from .lex_attrs import LEX_ATTRS from .lemmatizer import LOOKUP from .syntax_iterators import SYNTAX_ITERATORS @@ -17,6 +18,7 @@ from ...util import update_exc, add_lookups class FrenchDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters.update(LEX_ATTRS) lex_attr_getters[LANG] = lambda text: 'fr' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) diff --git a/spacy/lang/fr/lex_attrs.py b/spacy/lang/fr/lex_attrs.py new file mode 100644 index 000000000..41c509dff --- /dev/null +++ b/spacy/lang/fr/lex_attrs.py @@ -0,0 +1,41 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...attrs import LIKE_NUM + + +_num_words = set(""" +zero un deux trois quatre cinq six sept huit neuf dix +onze douze treize quatorze quinze seize dix-sept dix-huit dix-neuf +vingt trente quanrante cinquante soixante septante quatre-vingt huitante nonante +cent mille mil million milliard billion quadrillion quintillion +sextillion septillion octillion nonillion decillion +""".split()) + +_ordinal_words = set(""" +premier deuxième second troisième quatrième cinquième sixième septième huitième neuvième dixième +onzième douzième treizième quatorzième quinzième seizième dix-septième dix-huitième dix-neufième +vingtième trentième quanrantième cinquantième soixantième septantième quatre-vingtième huitantième nonantième +centième millième millionnième milliardième billionnième quadrillionnième quintillionnième +sextillionnième septillionnième octillionnième nonillionnième decillionnième +""".split()) + + +def like_num(text): + # Might require more work? + # See this discussion: https://github.com/explosion/spaCy/pull/1161 + text = text.replace(',', '').replace('.', '') + if text.isdigit(): + return True + if text.count('/') == 1: + num, denom = text.split('/') + if num.isdigit() and denom.isdigit(): + return True + if text in _num_words: + return True + return False + + +LEX_ATTRS = { + LIKE_NUM: like_num +} From a2bf4cc7bff9508a6bbc3d97aeffaf815f50b662 Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 21:49:43 +0700 Subject: [PATCH 124/649] fix newline in file --- spacy/lang/th/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py index 4b52cfa25..368fb9ae5 100644 --- a/spacy/lang/th/__init__.py +++ b/spacy/lang/th/__init__.py @@ -12,7 +12,6 @@ from ...language import Language from ...attrs import LANG, NORM from ...util import update_exc, add_lookups - class ThaiDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'th' From 665cdab58d7d0308054646c11bbe5c7d8eb54964 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:51:52 +0200 Subject: [PATCH 125/649] Port over change from #1126 --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 5d515f7a1..225d1fb31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,3 +16,4 @@ pytest>=3.0.6,<4.0.0 mock>=2.0.0,<3.0.0 msgpack-python msgpack-numpy +html5lib==1.0b8 From b49cc8153a1672ad5bdc275e71e9ef15d633956f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 10:00:18 -0500 Subject: [PATCH 126/649] Require correct thinc --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 225d1fb31..7fa5d72d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ pathlib numpy>=1.7 cymem>=1.30,<1.32 preshed>=1.0.0,<2.0.0 -thinc>=6.8.1,<6.9.0 +thinc>=6.8.2,<6.9.0 murmurhash>=0.28,<0.29 plac<1.0.0,>=0.9.6 six diff --git a/setup.py b/setup.py index 0b0d2cc81..8943d7a2e 100755 --- a/setup.py +++ b/setup.py @@ -195,7 +195,7 @@ def setup_package(): 'murmurhash>=0.28,<0.29', 'cymem>=1.30,<1.32', 'preshed>=1.0.0,<2.0.0', - 'thinc>=6.8.1,<6.9.0', + 'thinc>=6.8.2,<6.9.0', 'plac<1.0.0,>=0.9.6', 'six', 'pathlib', From 2ea27d07f474332486db0a047999870f40ba37a4 Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 22:14:47 +0700 Subject: [PATCH 127/649] fix tokenizer_exceptions in thai --- spacy/lang/th/tokenizer_exceptions.py | 39 +-------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/spacy/lang/th/tokenizer_exceptions.py b/spacy/lang/th/tokenizer_exceptions.py index 7e3967aed..c31595893 100644 --- a/spacy/lang/th/tokenizer_exceptions.py +++ b/spacy/lang/th/tokenizer_exceptions.py @@ -1,9 +1,7 @@ # encoding: utf8 from __future__ import unicode_literals -from ..symbols import * -from ..language_data import PRON_LEMMA - +from ...symbols import * TOKENIZER_EXCEPTIONS = { "ม.ค.": [ @@ -43,38 +41,3 @@ TOKENIZER_EXCEPTIONS = { {ORTH: "ธ.ค.", LEMMA: "ธันวาคม"} ] } - - -# exceptions mapped to a single token containing only ORTH property -# example: {"string": [{ORTH: "string"}]} -# converted using strings_to_exc() util -''' -ORTH_ONLY = [ - "a.", - "b.", - "c.", - "d.", - "e.", - "f.", - "g.", - "h.", - "i.", - "j.", - "k.", - "l.", - "m.", - "n.", - "o.", - "p.", - "q.", - "r.", - "s.", - "t.", - "u.", - "v.", - "w.", - "x.", - "y.", - "z." -] -''' \ No newline at end of file From a63f790b8c45f14254d665029f2e5fbcf431a533 Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 22:28:57 +0700 Subject: [PATCH 128/649] fix thai tag_map --- spacy/lang/th/tag_map.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/th/tag_map.py b/spacy/lang/th/tag_map.py index e225f7289..40e5ac44c 100644 --- a/spacy/lang/th/tag_map.py +++ b/spacy/lang/th/tag_map.py @@ -2,7 +2,7 @@ # data from Korakot Chaovavanich (https://www.facebook.com/photo.php?fbid=390564854695031&set=p.390564854695031&type=3&permPage=1&ifg=1) from __future__ import unicode_literals -from ..symbols import * +from ...symbols import * TAG_MAP = { #NOUN @@ -78,4 +78,4 @@ TAG_MAP = { # PUNCT "PUNCT": {POS: PUNCT}, "PUNC": {POS: PUNCT} -} \ No newline at end of file +} From 7fdfb78141a90d1f27ebd50406d0ba3591a1253f Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 17:34:52 +0200 Subject: [PATCH 129/649] Add version option to cli.train --- spacy/cli/train.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 6178ecb3b..5e13037fd 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -41,11 +41,12 @@ numpy.random.seed(0) no_parser=("Don't train parser", "flag", "P", bool), no_entities=("Don't train NER", "flag", "N", bool), gold_preproc=("Use gold preprocessing", "flag", "G", bool), + version=("Model version", "option", "v", str), meta_path=("Optional path to meta.json. All relevant properties will be overwritten.", "option", "m", Path) ) def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, use_gpu=-1, vectors=None, no_tagger=False, no_parser=False, no_entities=False, - gold_preproc=False, meta_path=None): + gold_preproc=False, version="0.0.0", meta_path=None): """ Train a model. Expects data in spaCy's JSON format. """ @@ -126,7 +127,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, meta['pipeline'] = pipeline meta['spacy_version'] = '>=%s' % about.__version__ meta.setdefault('name', 'model%d' % i) - meta.setdefault('version', '0.0.0') + meta.setdefault('version', version) with meta_loc.open('w') as file_: file_.write(json_dumps(meta)) From 3d5046c499d6e61492820293865c6b7af0e26fd0 Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 22:41:20 +0700 Subject: [PATCH 130/649] fix import in th --- spacy/lang/th/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py index 368fb9ae5..b6bdb658f 100644 --- a/spacy/lang/th/__init__.py +++ b/spacy/lang/th/__init__.py @@ -6,7 +6,7 @@ from .tag_map import TAG_MAP from .stop_words import STOP_WORDS from ..tokenizer_exceptions import BASE_EXCEPTIONS -from ..tokens import Doc +from ...tokens import Doc from ..norm_exceptions import BASE_NORMS from ...language import Language from ...attrs import LANG, NORM From 1ff62eaee7ad2be5aa5a0a2e95bd00945b2b732b Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 17:59:34 +0200 Subject: [PATCH 131/649] Fix option shortcut to avoid conflict --- spacy/cli/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 5e13037fd..4ce86d31e 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -41,7 +41,7 @@ numpy.random.seed(0) no_parser=("Don't train parser", "flag", "P", bool), no_entities=("Don't train NER", "flag", "N", bool), gold_preproc=("Use gold preprocessing", "flag", "G", bool), - version=("Model version", "option", "v", str), + version=("Model version", "option", "V", str), meta_path=("Optional path to meta.json. All relevant properties will be overwritten.", "option", "m", Path) ) def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, From 7b5263ffa44a4d20d983b117257e72a89dd1f6ff Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 23:54:15 +0700 Subject: [PATCH 132/649] fix thai test --- spacy/tests/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index 70c78ab9f..b33a7c008 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -110,6 +110,7 @@ def nb_tokenizer(): @pytest.fixture def th_tokenizer(): + pythainlp = pytest.importorskip("pythainlp") return util.get_lang_class('th').Defaults.create_tokenizer() From b5dd7e7cc4f10f179e3ad1a0a60c498585e8d86a Mon Sep 17 00:00:00 2001 From: Reza Gharibi Date: Wed, 27 Sep 2017 03:55:28 +0330 Subject: [PATCH 133/649] Fix typo --- website/docs/usage/_spacy-101/_vocab.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/usage/_spacy-101/_vocab.jade b/website/docs/usage/_spacy-101/_vocab.jade index cff0b106e..3063262d5 100644 --- a/website/docs/usage/_spacy-101/_vocab.jade +++ b/website/docs/usage/_spacy-101/_vocab.jade @@ -112,4 +112,4 @@ p | only works if you actually #[em know] that the document contains that | word. To prevent this problem, spaCy will also export the #[code Vocab] | when you save a #[code Doc] or #[code nlp] object. This will give you - | the object and its encoded annotations, plus they "key" to decode it. + | the object and its encoded annotations, plus the "key" to decode it. From fa1844b132684daf0119383548f0513f94d9dda2 Mon Sep 17 00:00:00 2001 From: Reza Gharibi Date: Wed, 27 Sep 2017 03:55:54 +0330 Subject: [PATCH 134/649] Fix typo --- website/docs/usage/_spacy-101/_language-data.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/usage/_spacy-101/_language-data.jade b/website/docs/usage/_spacy-101/_language-data.jade index aaca10ebb..1f75b47e8 100644 --- a/website/docs/usage/_spacy-101/_language-data.jade +++ b/website/docs/usage/_spacy-101/_language-data.jade @@ -22,7 +22,7 @@ p +aside-code. from spacy.lang.en import English - from spacy.lang.en import German + from spacy.lang.de import German nlp_en = English() # includes English data nlp_de = German() # includes German data From 0461b8215816dc30fa87cb16af7dc03334b2857d Mon Sep 17 00:00:00 2001 From: Reza Gharibi Date: Wed, 27 Sep 2017 03:56:20 +0330 Subject: [PATCH 135/649] Fix typos --- website/docs/usage/spacy-101.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/usage/spacy-101.jade b/website/docs/usage/spacy-101.jade index a54e5cf66..ac3e808b3 100644 --- a/website/docs/usage/spacy-101.jade +++ b/website/docs/usage/spacy-101.jade @@ -65,7 +65,7 @@ p | not designed specifically for chat bots, and only provides the | underlying text processing capabilities. +item #[strong spaCy is not research software]. - | It's is built on the latest research, but it's designed to get + | It's built on the latest research, but it's designed to get | things done. This leads to fairly different design decisions than | #[+a("https://github./nltk/nltk") NLTK] | or #[+a("https://stanfordnlp.github.io/CoreNLP/") CoreNLP], which were @@ -87,7 +87,7 @@ p +aside | If one of spaCy's functionalities #[strong needs a model], it means that - | you need to have one our the available + | you need to have one of the available | #[+a("/docs/usage/models") statistical models] installed. Models are used | to #[strong predict] linguistic annotations – for example, if a word is | a verb or a noun. From 983201a83a2b69174d693cd850be90e80c914168 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 11:43:58 -0500 Subject: [PATCH 136/649] Fix hard-coded vector width --- spacy/pipeline.pyx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 717a1bd3f..f7e05ece7 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -553,9 +553,10 @@ class NeuralLabeller(NeuralTagger): self.labels[label] = len(self.labels) print(len(self.labels)) if self.model is True: + token_vector_width = util.env_opt('token_vector_width') self.model = chain( tok2vec, - Softmax(len(self.labels), 128) + Softmax(len(self.labels), token_vector_width) ) link_vectors_to_models(self.vocab) From 66c388ee01a10218ebba7a174ccf20481c34f0d2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 11:44:16 -0500 Subject: [PATCH 137/649] Remove unhelpful multitask objectives --- spacy/pipeline.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index f7e05ece7..1a12107b7 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -779,7 +779,7 @@ cdef class NeuralDependencyParser(NeuralParser): TransitionSystem = ArcEager def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): - for target in ['dep', 'ent']: + for target in []: labeller = NeuralLabeller(self.vocab, target=target) tok2vec = self.model[0] labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec) From 1a37a2c0a0b41b5b719a6d62b11d85c0c139baed Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 11:48:07 -0500 Subject: [PATCH 138/649] Update training defaults --- spacy/_ml.py | 2 +- spacy/syntax/nn_parser.pyx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 2e95aa55b..22a501f0f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -505,7 +505,7 @@ def getitem(i): return layerize(getitem_fwd) def build_tagger_model(nr_class, **cfg): - embed_size = util.env_opt('embed_size', 4000) + embed_size = util.env_opt('embed_size', 1000) if 'token_vector_width' in cfg: token_vector_width = cfg['token_vector_width'] else: diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 99099cad8..830aac551 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -240,12 +240,12 @@ cdef class Parser: Base class of the DependencyParser and EntityRecognizer. """ @classmethod - def Model(cls, nr_class, token_vector_width=128, hidden_width=300, depth=1, **cfg): + def Model(cls, nr_class, token_vector_width=128, hidden_width=200, depth=1, **cfg): depth = util.env_opt('parser_hidden_depth', depth) token_vector_width = util.env_opt('token_vector_width', token_vector_width) hidden_width = util.env_opt('hidden_width', hidden_width) parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) - embed_size = util.env_opt('embed_size', 4000) + embed_size = util.env_opt('embed_size', 1000) tok2vec = Tok2Vec(token_vector_width, embed_size, pretrained_dims=cfg.get('pretrained_dims', 0)) tok2vec = chain(tok2vec, flatten) From dcb86bdc4363a115974a4d0748a2d899094a14eb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 11:48:19 -0500 Subject: [PATCH 139/649] Default batch size to 32 --- spacy/cli/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 4ce86d31e..53426febe 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -82,7 +82,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, util.env_opt('dropout_to', 0.2), util.env_opt('dropout_decay', 0.0)) batch_sizes = util.compounding(util.env_opt('batch_from', 1), - util.env_opt('batch_to', 64), + util.env_opt('batch_to', 32), util.env_opt('batch_compound', 1.001)) corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() From 542ebfa49864b5a46af1eed22f535747061f4bc5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 18:54:37 -0500 Subject: [PATCH 140/649] Improve defaults --- spacy/cli/train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 53426febe..dfa755b8e 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -44,7 +44,7 @@ numpy.random.seed(0) version=("Model version", "option", "V", str), meta_path=("Optional path to meta.json. All relevant properties will be overwritten.", "option", "m", Path) ) -def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, +def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0, use_gpu=-1, vectors=None, no_tagger=False, no_parser=False, no_entities=False, gold_preproc=False, version="0.0.0", meta_path=None): """ @@ -82,7 +82,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, util.env_opt('dropout_to', 0.2), util.env_opt('dropout_decay', 0.0)) batch_sizes = util.compounding(util.env_opt('batch_from', 1), - util.env_opt('batch_to', 32), + util.env_opt('batch_to', 16), util.env_opt('batch_compound', 1.001)) corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() From ac8481a7b086880225229e6d69d8a3335accd3ba Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 28 Sep 2017 08:05:31 -0500 Subject: [PATCH 141/649] Print NER loss --- spacy/cli/train.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index dfa755b8e..d973effb6 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -94,7 +94,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0, optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) nlp._optimizer = None - print("Itn.\tLoss\tUAS\tNER P.\tNER R.\tNER F.\tTag %\tToken %") + print("Itn.\tP.Loss\tN.Loss\tUAS\tNER P.\tNER R.\tNER F.\tTag %\tToken %") try: train_docs = corpus.train_docs(nlp, projectivize=True, noise_level=0.0, gold_preproc=gold_preproc, max_length=0) @@ -158,12 +158,14 @@ def print_progress(itn, losses, dev_scores, wps=0.0): 'ents_p', 'ents_r', 'ents_f', 'wps']: scores[col] = 0.0 scores['dep_loss'] = losses.get('parser', 0.0) + scores['ner_loss'] = losses.get('ner', 0.0) scores['tag_loss'] = losses.get('tagger', 0.0) scores.update(dev_scores) scores['wps'] = wps tpl = '\t'.join(( '{:d}', '{dep_loss:.3f}', + '{ner_loss:.3f}', '{uas:.3f}', '{ents_p:.3f}', '{ents_r:.3f}', From f6330d69e65b779368827a3d99128ab10880f0d2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 28 Sep 2017 08:07:41 -0500 Subject: [PATCH 142/649] Default embed size to 7000 --- spacy/_ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 22a501f0f..62fc7543f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -505,7 +505,7 @@ def getitem(i): return layerize(getitem_fwd) def build_tagger_model(nr_class, **cfg): - embed_size = util.env_opt('embed_size', 1000) + embed_size = util.env_opt('embed_size', 7000) if 'token_vector_width' in cfg: token_vector_width = cfg['token_vector_width'] else: From 158e177cae44f72382ea83162b6830cf8189abea Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 28 Sep 2017 08:25:23 -0500 Subject: [PATCH 143/649] Fix default embed size --- spacy/syntax/nn_parser.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 830aac551..7b45db0d8 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -245,7 +245,7 @@ cdef class Parser: token_vector_width = util.env_opt('token_vector_width', token_vector_width) hidden_width = util.env_opt('hidden_width', hidden_width) parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) - embed_size = util.env_opt('embed_size', 1000) + embed_size = util.env_opt('embed_size', 7000) tok2vec = Tok2Vec(token_vector_width, embed_size, pretrained_dims=cfg.get('pretrained_dims', 0)) tok2vec = chain(tok2vec, flatten) From cdb2d83e168b8602bcaa98b1a8f2842908eaad49 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 28 Sep 2017 18:47:13 -0500 Subject: [PATCH 144/649] Pass dropout in parser --- spacy/syntax/nn_parser.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 7b45db0d8..1efdc4474 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -533,7 +533,7 @@ cdef class Parser: states, golds, max_steps = self._init_gold_batch(docs, golds) (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, - 0.0) + drop) todo = [(s, g) for (s, g) in zip(states, golds) if not s.is_final() and g is not None] if not todo: @@ -598,7 +598,7 @@ cdef class Parser: self.moves.preprocess_gold(gold) cuda_stream = get_cuda_stream() - (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, 0.0) + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, drop) states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, states, golds, @@ -685,7 +685,7 @@ cdef class Parser: tok2vec, lower, upper = self.model tokvecs, bp_tokvecs = tok2vec.begin_update(docs, drop=dropout) state2vec = precompute_hiddens(len(docs), tokvecs, - lower, stream, drop=dropout) + lower, stream, drop=0.0) return (tokvecs, bp_tokvecs), state2vec, upper nr_feature = 8 From 7d77dc490fb2f8cf5232690f3775e77cdadc59ee Mon Sep 17 00:00:00 2001 From: ines Date: Fri, 29 Sep 2017 20:52:28 +0200 Subject: [PATCH 145/649] Always compare lowercase package names Otherwise, is_package will return False if model name contains uppercase characters. See this issue: https://support.prodi.gy/t/saving-a-trained-ner-model-as-a-loadable-modu le/46/6 --- spacy/util.py | 4 +- website/usage/spacy-101.jade | 300 +++++++++++++++++++++++++++++++++++ 2 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 website/usage/spacy-101.jade diff --git a/spacy/util.py b/spacy/util.py index 429d9bae5..911970831 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -181,9 +181,10 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ + name = name.lower() # compare package name against lowercase name packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.replace('-', '_') == name: + if package.lower().replace('-', '_') == name: return True return False @@ -194,6 +195,7 @@ def get_package_path(name): name (unicode): Package name. RETURNS (Path): Path to installed package. """ + name = name.lower() # use lowercase version to be safe # Here we're importing the module just to find it. This is worryingly # indirect, but it's otherwise very difficult to find the package. pkg = importlib.import_module(name) diff --git a/website/usage/spacy-101.jade b/website/usage/spacy-101.jade new file mode 100644 index 000000000..a57137674 --- /dev/null +++ b/website/usage/spacy-101.jade @@ -0,0 +1,300 @@ +//- 💫 DOCS > USAGE > SPACY 101 + +include ../_includes/_mixins + +p + | Whether you're new to spaCy, or just want to brush up on some + | NLP basics and implementation details – this page should have you covered. + | Each section will explain one of spaCy's features in simple terms and + | with examples or illustrations. Some sections will also reappear across + | the usage guides as a quick introduction. + ++aside("Help us improve the docs") + | Did you spot a mistake or come across explanations that + | are unclear? We always appreciate improvement + | #[+a(gh("spaCy") + "/issues") suggestions] or + | #[+a(gh("spaCy") + "/pulls") pull requests]. You can find a "Suggest + | edits" link at the bottom of each page that points you to the source. + ++h(2, "whats-spacy") What's spaCy? + ++grid.o-no-block + +grid-col("half") + p + | spaCy is a #[strong free, open-source library] for advanced + | #[strong Natural Language Processing] (NLP) in Python. + + p + | If you're working with a lot of text, you'll eventually want to + | know more about it. For example, what's it about? What do the + | words mean in context? Who is doing what to whom? What companies + | and products are mentioned? Which texts are similar to each other? + + p + | spaCy is designed specifically for #[strong production use] and + | helps you build applications that process and "understand" + | large volumes of text. It can be used to build + | #[strong information extraction] or + | #[strong natural language understanding] systems, or to + | pre-process text for #[strong deep learning]. + + +table-of-contents + +item #[+a("#features") Features] + +item #[+a("#annotations") Linguistic annotations] + +item #[+a("#annotations-token") Tokenization] + +item #[+a("#annotations-pos-deps") POS tags and dependencies] + +item #[+a("#annotations-ner") Named entities] + +item #[+a("#vectors-similarity") Word vectors and similarity] + +item #[+a("#pipelines") Pipelines] + +item #[+a("#vocab") Vocab, hashes and lexemes] + +item #[+a("#serialization") Serialization] + +item #[+a("#training") Training] + +item #[+a("#language-data") Language data] + +item #[+a("#lightning-tour") Lightning tour] + +item #[+a("#architecture") Architecture] + +item #[+a("#community") Community & FAQ] + ++h(3, "what-spacy-isnt") What spaCy isn't + ++list + +item #[strong spaCy is not a platform or "an API"]. + | Unlike a platform, spaCy does not provide a software as a service, or + | a web application. It's an open-source library designed to help you + | build NLP applications, not a consumable service. + +item #[strong spaCy is not an out-of-the-box chat bot engine]. + | While spaCy can be used to power conversational applications, it's + | not designed specifically for chat bots, and only provides the + | underlying text processing capabilities. + +item #[strong spaCy is not research software]. + | It's built on the latest research, but it's designed to get + | things done. This leads to fairly different design decisions than + | #[+a("https://github./nltk/nltk") NLTK] + | or #[+a("https://stanfordnlp.github.io/CoreNLP/") CoreNLP], which were + | created as platforms for teaching and research. The main difference + | is that spaCy is integrated and opinionated. spaCy tries to avoid asking + | the user to choose between multiple algorithms that deliver equivalent + | functionality. Keeping the menu small lets spaCy deliver generally better + | performance and developer experience. + +item #[strong spaCy is not a company]. + | It's an open-source library. Our company publishing spaCy and other + | software is called #[+a(COMPANY_URL, true) Explosion AI]. + ++section("features") + +h(2, "features") Features + + p + | In the documentation, you'll come across mentions of spaCy's + | features and capabilities. Some of them refer to linguistic concepts, + | while others are related to more general machine learning + | functionality. + + +aside + | If one of spaCy's functionalities #[strong needs a model], it means + | that you need to have one of the available + | #[+a("/models") statistical models] installed. Models are used + | to #[strong predict] linguistic annotations – for example, if a word + | is a verb or a noun. + + +table(["Name", "Description", "Needs model"]) + +row + +cell #[strong Tokenization] + +cell Segmenting text into words, punctuations marks etc. + +cell #[+procon("con")] + + +row + +cell #[strong Part-of-speech] (POS) #[strong Tagging] + +cell Assigning word types to tokens, like verb or noun. + +cell #[+procon("pro")] + + +row + +cell #[strong Dependency Parsing] + +cell + | Assigning syntactic dependency labels, describing the + | relations between individual tokens, like subject or object. + +cell #[+procon("pro")] + + +row + +cell #[strong Lemmatization] + +cell + | Assigning the base forms of words. For example, the lemma of + | "was" is "be", and the lemma of "rats" is "rat". + +cell #[+procon("pro")] + + +row + +cell #[strong Sentence Boundary Detection] (SBD) + +cell Finding and segmenting individual sentences. + +cell #[+procon("pro")] + + +row + +cell #[strong Named Entity Recongition] (NER) + +cell + | Labelling named "real-world" objects, like persons, companies + | or locations. + +cell #[+procon("pro")] + + +row + +cell #[strong Similarity] + +cell + | Comparing words, text spans and documents and how similar + | they are to each other. + +cell #[+procon("pro")] + + +row + +cell #[strong Text Classification] + +cell + | Assigning categories or labels to a whole document, or parts + | of a document. + +cell #[+procon("pro")] + + +row + +cell #[strong Rule-based Matching] + +cell + | Finding sequences of tokens based on their texts and + | linguistic annotations, similar to regular expressions. + +cell #[+procon("con")] + + +row + +cell #[strong Training] + +cell Updating and improving a statistical model's predictions. + +cell #[+procon("neutral")] + + +row + +cell #[strong Serialization] + +cell Saving objects to files or byte strings. + +cell #[+procon("neutral")] + + +h(2, "annotations") Linguistic annotations + + p + | spaCy provides a variety of linguistic annotations to give you + | #[strong insights into a text's grammatical structure]. This + | includes the word types, like the parts of speech, and how the words + | are related to each other. For example, if you're analysing text, it + | makes a huge difference whether a noun is the subject of a sentence, + | or the object – or whether "google" is used as a verb, or refers to + | the website or company in a specific context. + + p + | Once you've downloaded and installed a #[+a("/usage/models") model], + | you can load it via #[+api("spacy#load") #[code spacy.load()]]. This will + | return a #[code Language] object contaning all components and data needed + | to process text. We usually call it #[code nlp]. Calling the #[code nlp] + | object on a string of text will return a processed #[code Doc]: + + +code. + import spacy + + nlp = spacy.load('en') + doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion') + + p + | Even though a #[code Doc] is processed – e.g. split into individual words + | and annotated – it still holds #[strong all information of the original text], + | like whitespace characters. You can always get the offset of a token into the + | original string, or reconstruct the original by joining the tokens and their + | trailing whitespace. This way, you'll never lose any information + | when processing text with spaCy. + + +h(3, "annotations-token") Tokenization + + include _spacy-101/_tokenization + + +infobox + | To learn more about how spaCy's tokenization rules work in detail, + | how to #[strong customise and replace] the default tokenizer and how to + | #[strong add language-specific data], see the usage guides on + | #[+a("/usage/adding-languages") adding languages] and + | #[+a("/usage/linguistic-features#tokenization") customising the tokenizer]. + + +h(3, "annotations-pos-deps") Part-of-speech tags and dependencies + +tag-model("dependency parse") + + include _spacy-101/_pos-deps + + +infobox + | To learn more about #[strong part-of-speech tagging] and rule-based + | morphology, and how to #[strong navigate and use the parse tree] + | effectively, see the usage guides on + | #[+a("/usage/linguistic-features#pos-tagging") part-of-speech tagging] and + | #[+a("/usage/linguistic-features#dependency-parse") using the dependency parse]. + + +h(3, "annotations-ner") Named Entities + +tag-model("named entities") + + include _spacy-101/_named-entities + + +infobox + | To learn more about entity recognition in spaCy, how to + | #[strong add your own entities] to a document and how to + | #[strong train and update] the entity predictions of a model, see the + | usage guides on + | #[+a("/usage/linguistic-features#named-entities") named entity recognition] and + | #[+a("/usage/training#ner") training the named entity recognizer]. + + +h(2, "vectors-similarity") Word vectors and similarity + +tag-model("vectors") + + include _spacy-101/_similarity + + include _spacy-101/_word-vectors + + +infobox + | To learn more about word vectors, how to #[strong customise them] and + | how to load #[strong your own vectors] into spaCy, see the usage + | guide on + | #[+a("/usage/word-vectors-similarities") using word vectors and semantic similarities]. + + +h(2, "pipelines") Pipelines + + include _spacy-101/_pipelines + + +infobox + | To learn more about #[strong how processing pipelines work] in detail, + | how to enable and disable their components, and how to + | #[strong create your own], see the usage guide on + | #[+a("/usage/processing-pipelines") language processing pipelines]. + + +h(2, "vocab") Vocab, hashes and lexemes + + include _spacy-101/_vocab + + +h(2, "serialization") Serialization + + include _spacy-101/_serialization + + +infobox + | To learn more about how to #[strong save and load your own models], + | see the usage guide on + | #[+a("/usage/training#saving-loading") saving and loading]. + + +h(2, "training") Training + + include _spacy-101/_training + + +infobox + | To learn more about #[strong training and updating] models, how to create + | training data and how to improve spaCy's named entity recognition models, + | see the usage guides on #[+a("/usage/training") training]. + + +h(2, "language-data") Language data + + include _spacy-101/_language-data + + +infobox + | To learn more about the individual components of the language data and + | how to #[strong add a new language] to spaCy in preparation for training + | a language model, see the usage guide on + | #[+a("/usage/adding-languages") adding languages]. + + ++section("lightning-tour") + +h(2, "lightning-tour") Lightning tour + include _spacy-101/_lightning-tour + ++section("architecture") + +h(2, "architecture") Architecture + include _spacy-101/_architecture + ++section("community-faq") + +h(2, "community") Community & FAQ + include _spacy-101/_community-faq From fd1a9225d80a667bfd88c5d21bdaeaf156003cf2 Mon Sep 17 00:00:00 2001 From: ines Date: Fri, 29 Sep 2017 20:52:56 +0200 Subject: [PATCH 146/649] Handle conversion of pipeline components correctly Allow both comma and comma + whitespace as separators --- spacy/cli/package.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spacy/cli/package.py b/spacy/cli/package.py index 7019819a7..5ffc493c3 100644 --- a/spacy/cli/package.py +++ b/spacy/cli/package.py @@ -105,8 +105,11 @@ def generate_pipeline(): "parser, ner. For more information, see the docs on processing pipelines.", title="Enter your model's pipeline components") pipeline = util.get_raw_input("Pipeline components", True) - replace = {'True': True, 'False': False} - return replace[pipeline] if pipeline in replace else pipeline.split(', ') + subs = {'True': True, 'False': False} + if pipeline in subs: + return subs[pipeline] + else: + return [p.strip() for p in pipeline.split(',')] def validate_meta(meta, keys): From 153c2589d40a7dd127864b0e68efe20182d0941e Mon Sep 17 00:00:00 2001 From: ines Date: Fri, 29 Sep 2017 20:53:36 +0200 Subject: [PATCH 147/649] Revert "Always compare lowercase package names" This reverts commit 7d77dc490fb2f8cf5232690f3775e77cdadc59ee. --- spacy/util.py | 4 +- website/usage/spacy-101.jade | 300 ----------------------------------- 2 files changed, 1 insertion(+), 303 deletions(-) delete mode 100644 website/usage/spacy-101.jade diff --git a/spacy/util.py b/spacy/util.py index 911970831..429d9bae5 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -181,10 +181,9 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ - name = name.lower() # compare package name against lowercase name packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.lower().replace('-', '_') == name: + if package.replace('-', '_') == name: return True return False @@ -195,7 +194,6 @@ def get_package_path(name): name (unicode): Package name. RETURNS (Path): Path to installed package. """ - name = name.lower() # use lowercase version to be safe # Here we're importing the module just to find it. This is worryingly # indirect, but it's otherwise very difficult to find the package. pkg = importlib.import_module(name) diff --git a/website/usage/spacy-101.jade b/website/usage/spacy-101.jade deleted file mode 100644 index a57137674..000000000 --- a/website/usage/spacy-101.jade +++ /dev/null @@ -1,300 +0,0 @@ -//- 💫 DOCS > USAGE > SPACY 101 - -include ../_includes/_mixins - -p - | Whether you're new to spaCy, or just want to brush up on some - | NLP basics and implementation details – this page should have you covered. - | Each section will explain one of spaCy's features in simple terms and - | with examples or illustrations. Some sections will also reappear across - | the usage guides as a quick introduction. - -+aside("Help us improve the docs") - | Did you spot a mistake or come across explanations that - | are unclear? We always appreciate improvement - | #[+a(gh("spaCy") + "/issues") suggestions] or - | #[+a(gh("spaCy") + "/pulls") pull requests]. You can find a "Suggest - | edits" link at the bottom of each page that points you to the source. - -+h(2, "whats-spacy") What's spaCy? - -+grid.o-no-block - +grid-col("half") - p - | spaCy is a #[strong free, open-source library] for advanced - | #[strong Natural Language Processing] (NLP) in Python. - - p - | If you're working with a lot of text, you'll eventually want to - | know more about it. For example, what's it about? What do the - | words mean in context? Who is doing what to whom? What companies - | and products are mentioned? Which texts are similar to each other? - - p - | spaCy is designed specifically for #[strong production use] and - | helps you build applications that process and "understand" - | large volumes of text. It can be used to build - | #[strong information extraction] or - | #[strong natural language understanding] systems, or to - | pre-process text for #[strong deep learning]. - - +table-of-contents - +item #[+a("#features") Features] - +item #[+a("#annotations") Linguistic annotations] - +item #[+a("#annotations-token") Tokenization] - +item #[+a("#annotations-pos-deps") POS tags and dependencies] - +item #[+a("#annotations-ner") Named entities] - +item #[+a("#vectors-similarity") Word vectors and similarity] - +item #[+a("#pipelines") Pipelines] - +item #[+a("#vocab") Vocab, hashes and lexemes] - +item #[+a("#serialization") Serialization] - +item #[+a("#training") Training] - +item #[+a("#language-data") Language data] - +item #[+a("#lightning-tour") Lightning tour] - +item #[+a("#architecture") Architecture] - +item #[+a("#community") Community & FAQ] - -+h(3, "what-spacy-isnt") What spaCy isn't - -+list - +item #[strong spaCy is not a platform or "an API"]. - | Unlike a platform, spaCy does not provide a software as a service, or - | a web application. It's an open-source library designed to help you - | build NLP applications, not a consumable service. - +item #[strong spaCy is not an out-of-the-box chat bot engine]. - | While spaCy can be used to power conversational applications, it's - | not designed specifically for chat bots, and only provides the - | underlying text processing capabilities. - +item #[strong spaCy is not research software]. - | It's built on the latest research, but it's designed to get - | things done. This leads to fairly different design decisions than - | #[+a("https://github./nltk/nltk") NLTK] - | or #[+a("https://stanfordnlp.github.io/CoreNLP/") CoreNLP], which were - | created as platforms for teaching and research. The main difference - | is that spaCy is integrated and opinionated. spaCy tries to avoid asking - | the user to choose between multiple algorithms that deliver equivalent - | functionality. Keeping the menu small lets spaCy deliver generally better - | performance and developer experience. - +item #[strong spaCy is not a company]. - | It's an open-source library. Our company publishing spaCy and other - | software is called #[+a(COMPANY_URL, true) Explosion AI]. - -+section("features") - +h(2, "features") Features - - p - | In the documentation, you'll come across mentions of spaCy's - | features and capabilities. Some of them refer to linguistic concepts, - | while others are related to more general machine learning - | functionality. - - +aside - | If one of spaCy's functionalities #[strong needs a model], it means - | that you need to have one of the available - | #[+a("/models") statistical models] installed. Models are used - | to #[strong predict] linguistic annotations – for example, if a word - | is a verb or a noun. - - +table(["Name", "Description", "Needs model"]) - +row - +cell #[strong Tokenization] - +cell Segmenting text into words, punctuations marks etc. - +cell #[+procon("con")] - - +row - +cell #[strong Part-of-speech] (POS) #[strong Tagging] - +cell Assigning word types to tokens, like verb or noun. - +cell #[+procon("pro")] - - +row - +cell #[strong Dependency Parsing] - +cell - | Assigning syntactic dependency labels, describing the - | relations between individual tokens, like subject or object. - +cell #[+procon("pro")] - - +row - +cell #[strong Lemmatization] - +cell - | Assigning the base forms of words. For example, the lemma of - | "was" is "be", and the lemma of "rats" is "rat". - +cell #[+procon("pro")] - - +row - +cell #[strong Sentence Boundary Detection] (SBD) - +cell Finding and segmenting individual sentences. - +cell #[+procon("pro")] - - +row - +cell #[strong Named Entity Recongition] (NER) - +cell - | Labelling named "real-world" objects, like persons, companies - | or locations. - +cell #[+procon("pro")] - - +row - +cell #[strong Similarity] - +cell - | Comparing words, text spans and documents and how similar - | they are to each other. - +cell #[+procon("pro")] - - +row - +cell #[strong Text Classification] - +cell - | Assigning categories or labels to a whole document, or parts - | of a document. - +cell #[+procon("pro")] - - +row - +cell #[strong Rule-based Matching] - +cell - | Finding sequences of tokens based on their texts and - | linguistic annotations, similar to regular expressions. - +cell #[+procon("con")] - - +row - +cell #[strong Training] - +cell Updating and improving a statistical model's predictions. - +cell #[+procon("neutral")] - - +row - +cell #[strong Serialization] - +cell Saving objects to files or byte strings. - +cell #[+procon("neutral")] - - +h(2, "annotations") Linguistic annotations - - p - | spaCy provides a variety of linguistic annotations to give you - | #[strong insights into a text's grammatical structure]. This - | includes the word types, like the parts of speech, and how the words - | are related to each other. For example, if you're analysing text, it - | makes a huge difference whether a noun is the subject of a sentence, - | or the object – or whether "google" is used as a verb, or refers to - | the website or company in a specific context. - - p - | Once you've downloaded and installed a #[+a("/usage/models") model], - | you can load it via #[+api("spacy#load") #[code spacy.load()]]. This will - | return a #[code Language] object contaning all components and data needed - | to process text. We usually call it #[code nlp]. Calling the #[code nlp] - | object on a string of text will return a processed #[code Doc]: - - +code. - import spacy - - nlp = spacy.load('en') - doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion') - - p - | Even though a #[code Doc] is processed – e.g. split into individual words - | and annotated – it still holds #[strong all information of the original text], - | like whitespace characters. You can always get the offset of a token into the - | original string, or reconstruct the original by joining the tokens and their - | trailing whitespace. This way, you'll never lose any information - | when processing text with spaCy. - - +h(3, "annotations-token") Tokenization - - include _spacy-101/_tokenization - - +infobox - | To learn more about how spaCy's tokenization rules work in detail, - | how to #[strong customise and replace] the default tokenizer and how to - | #[strong add language-specific data], see the usage guides on - | #[+a("/usage/adding-languages") adding languages] and - | #[+a("/usage/linguistic-features#tokenization") customising the tokenizer]. - - +h(3, "annotations-pos-deps") Part-of-speech tags and dependencies - +tag-model("dependency parse") - - include _spacy-101/_pos-deps - - +infobox - | To learn more about #[strong part-of-speech tagging] and rule-based - | morphology, and how to #[strong navigate and use the parse tree] - | effectively, see the usage guides on - | #[+a("/usage/linguistic-features#pos-tagging") part-of-speech tagging] and - | #[+a("/usage/linguistic-features#dependency-parse") using the dependency parse]. - - +h(3, "annotations-ner") Named Entities - +tag-model("named entities") - - include _spacy-101/_named-entities - - +infobox - | To learn more about entity recognition in spaCy, how to - | #[strong add your own entities] to a document and how to - | #[strong train and update] the entity predictions of a model, see the - | usage guides on - | #[+a("/usage/linguistic-features#named-entities") named entity recognition] and - | #[+a("/usage/training#ner") training the named entity recognizer]. - - +h(2, "vectors-similarity") Word vectors and similarity - +tag-model("vectors") - - include _spacy-101/_similarity - - include _spacy-101/_word-vectors - - +infobox - | To learn more about word vectors, how to #[strong customise them] and - | how to load #[strong your own vectors] into spaCy, see the usage - | guide on - | #[+a("/usage/word-vectors-similarities") using word vectors and semantic similarities]. - - +h(2, "pipelines") Pipelines - - include _spacy-101/_pipelines - - +infobox - | To learn more about #[strong how processing pipelines work] in detail, - | how to enable and disable their components, and how to - | #[strong create your own], see the usage guide on - | #[+a("/usage/processing-pipelines") language processing pipelines]. - - +h(2, "vocab") Vocab, hashes and lexemes - - include _spacy-101/_vocab - - +h(2, "serialization") Serialization - - include _spacy-101/_serialization - - +infobox - | To learn more about how to #[strong save and load your own models], - | see the usage guide on - | #[+a("/usage/training#saving-loading") saving and loading]. - - +h(2, "training") Training - - include _spacy-101/_training - - +infobox - | To learn more about #[strong training and updating] models, how to create - | training data and how to improve spaCy's named entity recognition models, - | see the usage guides on #[+a("/usage/training") training]. - - +h(2, "language-data") Language data - - include _spacy-101/_language-data - - +infobox - | To learn more about the individual components of the language data and - | how to #[strong add a new language] to spaCy in preparation for training - | a language model, see the usage guide on - | #[+a("/usage/adding-languages") adding languages]. - - -+section("lightning-tour") - +h(2, "lightning-tour") Lightning tour - include _spacy-101/_lightning-tour - -+section("architecture") - +h(2, "architecture") Architecture - include _spacy-101/_architecture - -+section("community-faq") - +h(2, "community") Community & FAQ - include _spacy-101/_community-faq From 8dbe49ecb8cfe2edd932a10d418e4be5466700ba Mon Sep 17 00:00:00 2001 From: ines Date: Fri, 29 Sep 2017 20:55:17 +0200 Subject: [PATCH 148/649] Always compare lowercase package names Otherwise, is_package will return False if model name contains uppercase characters. See this issue: https://support.prodi.gy/t/saving-a-trained-ner-model-as-a-loadable-modu le/46/6 --- spacy/util.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/util.py b/spacy/util.py index 429d9bae5..911970831 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -181,9 +181,10 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ + name = name.lower() # compare package name against lowercase name packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.replace('-', '_') == name: + if package.lower().replace('-', '_') == name: return True return False @@ -194,6 +195,7 @@ def get_package_path(name): name (unicode): Package name. RETURNS (Path): Path to installed package. """ + name = name.lower() # use lowercase version to be safe # Here we're importing the module just to find it. This is worryingly # indirect, but it's otherwise very difficult to find the package. pkg = importlib.import_module(name) From 69c7c642c2c3a9c51d0b7c1c1e5e67848f9b7953 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 14:04:32 -0500 Subject: [PATCH 149/649] Add spacy evaluate --- spacy/__main__.py | 3 +- spacy/cli/__init__.py | 1 + spacy/cli/evaluate.py | 93 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 spacy/cli/evaluate.py diff --git a/spacy/__main__.py b/spacy/__main__.py index d02242d68..0ec96e4a1 100644 --- a/spacy/__main__.py +++ b/spacy/__main__.py @@ -7,7 +7,7 @@ if __name__ == '__main__': import plac import sys from spacy.cli import download, link, info, package, train, convert, model - from spacy.cli import profile + from spacy.cli import profile, evaluate from spacy.util import prints commands = { @@ -15,6 +15,7 @@ if __name__ == '__main__': 'link': link, 'info': info, 'train': train, + 'evaluate': evaluate, 'convert': convert, 'package': package, 'model': model, diff --git a/spacy/cli/__init__.py b/spacy/cli/__init__.py index e58c94642..ebe185f24 100644 --- a/spacy/cli/__init__.py +++ b/spacy/cli/__init__.py @@ -4,5 +4,6 @@ from .link import link from .package import package from .profile import profile from .train import train +from .evaluate import evaluate from .convert import convert from .model import model diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py new file mode 100644 index 000000000..209660529 --- /dev/null +++ b/spacy/cli/evaluate.py @@ -0,0 +1,93 @@ +# coding: utf8 +from __future__ import unicode_literals, division, print_function + +import plac +import json +from collections import defaultdict +import cytoolz +from pathlib import Path +import dill +import tqdm +from thinc.neural._classes.model import Model +from thinc.neural.optimizers import linear_decay +from timeit import default_timer as timer +import random +import numpy.random + +from ..tokens.doc import Doc +from ..scorer import Scorer +from ..gold import GoldParse, merge_sents +from ..gold import GoldCorpus, minibatch +from ..util import prints +from .. import util +from .. import about +from .. import displacy +from ..compat import json_dumps + +random.seed(0) +numpy.random.seed(0) + + +@plac.annotations( + model=("Model name or path", "positional", None, str), + data_path=("Location of JSON-formatted evaluation data", "positional", None, str), + gold_preproc=("Use gold preprocessing", "flag", "G", bool), +) +def evaluate(cmd, model, data_path, gold_preproc=False): + """ + Train a model. Expects data in spaCy's JSON format. + """ + util.set_env_log(True) + data_path = util.ensure_path(data_path) + if not data_path.exists(): + prints(data_path, title="Evaluation data not found", exits=1) + corpus = GoldCorpus(data_path, data_path) + nlp = util.load_model(model) + scorer = nlp.evaluate(list(corpus.dev_docs(nlp, gold_preproc=gold_preproc))) + print_results(scorer) + + +def _render_parses(i, to_render): + to_render[0].user_data['title'] = "Batch %d" % i + with Path('/tmp/entities.html').open('w') as file_: + html = displacy.render(to_render[:5], style='ent', page=True) + file_.write(html) + with Path('/tmp/parses.html').open('w') as file_: + html = displacy.render(to_render[:5], style='dep', page=True) + file_.write(html) + + +def print_progress(itn, losses, dev_scores, wps=0.0): + scores = {} + for col in ['dep_loss', 'tag_loss', 'uas', 'tags_acc', 'token_acc', + 'ents_p', 'ents_r', 'ents_f', 'wps']: + scores[col] = 0.0 + scores['dep_loss'] = losses.get('parser', 0.0) + scores['ner_loss'] = losses.get('ner', 0.0) + scores['tag_loss'] = losses.get('tagger', 0.0) + scores.update(dev_scores) + scores['wps'] = wps + tpl = '\t'.join(( + '{:d}', + '{dep_loss:.3f}', + '{ner_loss:.3f}', + '{uas:.3f}', + '{ents_p:.3f}', + '{ents_r:.3f}', + '{ents_f:.3f}', + '{tags_acc:.3f}', + '{token_acc:.3f}', + '{wps:.1f}')) + print(tpl.format(itn, **scores)) + + +def print_results(scorer): + results = { + 'TOK': '%.2f' % scorer.token_acc, + 'POS': '%.2f' % scorer.tags_acc, + 'UAS': '%.2f' % scorer.uas, + 'LAS': '%.2f' % scorer.las, + 'NER P': '%.2f' % scorer.ents_p, + 'NER R': '%.2f' % scorer.ents_r, + 'NER F': '%.2f' % scorer.ents_f} + util.print_table(results, title="Results") From 2cf0f4622fb5efc57c622b5d37c771e8042bed3d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 14:05:32 -0500 Subject: [PATCH 150/649] Fix loading of models with pre-trained vectors --- spacy/vocab.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 0a420849c..21c2a1165 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -324,6 +324,7 @@ cdef class Vocab: self.lexemes_from_bytes(file_.read()) if self.vectors is not None: self.vectors.from_disk(path, exclude='strings.json') + link_vectors_to_models(self) return self def to_bytes(self, **exclude): From b776f48e58586ee27d27cf8a1a8e316b8c73c42c Mon Sep 17 00:00:00 2001 From: ines Date: Sun, 1 Oct 2017 21:58:45 +0200 Subject: [PATCH 151/649] Fix typo --- spacy/vocab.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 21c2a1165..a5f8bf6ad 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -262,7 +262,7 @@ cdef class Vocab: Words can be looked up by string or int ID. RETURNS: - A word vector. Size and shape determed by the + A word vector. Size and shape determined by the vocab.vectors instance. Usually, a numpy ndarray of shape (300,) and dtype float32. From 97c409b6021c131f66ef4f90ff7ec47f99bea2f2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 22:10:33 +0200 Subject: [PATCH 152/649] Add docstrings for spacy.vectors --- spacy/vectors.pyx | 55 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 346421153..dcb31da83 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -16,7 +16,16 @@ from .compat import basestring_ cdef class Vectors: - '''Store, save and load word vectors.''' + '''Store, save and load word vectors. + + Vectors data is kept in the vectors.data attribute, which should be an + instance of numpy.ndarray (for CPU vectors) + or cupy.ndarray (for GPU vectors). + + vectors.key2row is a dictionary mapping word hashes to rows + in the vectors.data table. The array `vectors.keys` keeps + the keys in order, such that keys[vectors.key2row[key]] == key. + ''' cdef public object data cdef readonly StringStore strings cdef public object key2row @@ -24,7 +33,36 @@ cdef class Vectors: cdef public int i def __init__(self, strings, data_or_width=0): - self.strings = StringStore() + '''Create a new vector store. + + To keep the vector table empty, pass data_or_width=0: + + >>> empty_vectors = Vectors(StringStore()) + + To create the vector table, and add vectors one-by-one: + + >>> my_vector_data = { + ... 'dog': numpy.random.uniform(-1, 1, (300,)), + ... 'cat': numpy.random.uniform(-1, 1, (300,)), + ... 'orange': numpy.random.uniform(-1, 1, (300,)), + ... } + >>> strings = StringStore() + >>> for word in my_vector_data.keys(): + ... strings.add(word) + >>> vectors = Vectors(strings, 300) + >>> for word in strings: + ... vectors[word] = preset_vectors[word] + + To set the vector values directly on initialization: + + >>> my_vector_table = numpy.zeros((3, 300), dtype='f') + >>> strings = StringStore() + >>> for key in my_vectors.keys(): + ... strings.add(key) + >>> for i, word in enumerate(strings): + ... my_vectors_table[i] = my_vectors[word] + >>> vectors = Vectors(strings, my_vector_table) + ''' if isinstance(data_or_width, int): self.data = data = numpy.zeros((len(strings), data_or_width), dtype='f') @@ -39,6 +77,11 @@ cdef class Vectors: return (Vectors, (self.strings, self.data)) def __getitem__(self, key): + '''Get a vector by key. If key is a string, it is hashed + to an integer ID using the vectors.strings table. + + If the integer key is not found in the table, a KeyError is raised. + ''' if isinstance(key, basestring): key = self.strings[key] i = self.key2row[key] @@ -48,23 +91,30 @@ cdef class Vectors: return self.data[i] def __setitem__(self, key, vector): + '''Set a vector for the given key. If key is a string, it is hashed + to an integer ID using the vectors.strings table. + ''' if isinstance(key, basestring): key = self.strings.add(key) i = self.key2row[key] self.data[i] = vector def __iter__(self): + '''Yield vectors from the table.''' yield from self.data def __len__(self): + '''Return the number of vectors that have been assigned.''' return self.i def __contains__(self, key): + '''Check whether a key has a vector entry in the table.''' if isinstance(key, basestring_): key = self.strings[key] return key in self.key2row def add(self, key, vector=None): + '''Add a key to the table, optionally setting a vector value as well.''' if isinstance(key, basestring_): key = self.strings.add(key) if key not in self.key2row: @@ -82,6 +132,7 @@ cdef class Vectors: return i def items(self): + '''Iterate over (string key, vector) pairs, in order.''' for i, string in enumerate(self.strings): yield string, self.data[i] From 38286b6f07ec829c956e4c2a881ba526d135b5ff Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 23:40:02 +0200 Subject: [PATCH 153/649] Add example loadig Fast Text vectors --- examples/chainer_sentiment.py | 322 ---------------------------------- examples/vectors_fast_text.py | 30 ++++ 2 files changed, 30 insertions(+), 322 deletions(-) delete mode 100644 examples/chainer_sentiment.py create mode 100644 examples/vectors_fast_text.py diff --git a/examples/chainer_sentiment.py b/examples/chainer_sentiment.py deleted file mode 100644 index 747ef508a..000000000 --- a/examples/chainer_sentiment.py +++ /dev/null @@ -1,322 +0,0 @@ -'''WIP --- Doesn't work well yet''' -import plac -import random -import six - -import cProfile -import pstats - -import pathlib -import cPickle as pickle -from itertools import izip - -import spacy - -import cytoolz -import cupy as xp -import cupy.cuda -import chainer.cuda - -import chainer.links as L -import chainer.functions as F -from chainer import Chain, Variable, report -import chainer.training -import chainer.optimizers -from chainer.training import extensions -from chainer.iterators import SerialIterator -from chainer.datasets import TupleDataset - - -class SentimentAnalyser(object): - @classmethod - def load(cls, path, nlp, max_length=100): - raise NotImplementedError - #with (path / 'config.json').open() as file_: - # model = model_from_json(file_.read()) - #with (path / 'model').open('rb') as file_: - # lstm_weights = pickle.load(file_) - #embeddings = get_embeddings(nlp.vocab) - #model.set_weights([embeddings] + lstm_weights) - #return cls(model, max_length=max_length) - - def __init__(self, model, max_length=100): - self._model = model - self.max_length = max_length - - def __call__(self, doc): - X = get_features([doc], self.max_length) - y = self._model.predict(X) - self.set_sentiment(doc, y) - - def pipe(self, docs, batch_size=1000, n_threads=2): - for minibatch in cytoolz.partition_all(batch_size, docs): - minibatch = list(minibatch) - sentences = [] - for doc in minibatch: - sentences.extend(doc.sents) - Xs = get_features(sentences, self.max_length) - ys = self._model.predict(Xs) - for sent, label in zip(sentences, ys): - sent.doc.sentiment += label - 0.5 - for doc in minibatch: - yield doc - - def set_sentiment(self, doc, y): - doc.sentiment = float(y[0]) - # Sentiment has a native slot for a single float. - # For arbitrary data storage, there's: - # doc.user_data['my_data'] = y - - -class Classifier(Chain): - def __init__(self, predictor): - super(Classifier, self).__init__(predictor=predictor) - - def __call__(self, x, t): - y = self.predictor(x) - loss = F.softmax_cross_entropy(y, t) - accuracy = F.accuracy(y, t) - report({'loss': loss, 'accuracy': accuracy}, self) - return loss - - -class SentimentModel(Chain): - def __init__(self, nlp, shape, **settings): - Chain.__init__(self, - embed=_Embed(shape['nr_vector'], shape['nr_dim'], shape['nr_hidden'], - set_vectors=lambda arr: set_vectors(arr, nlp.vocab)), - encode=_Encode(shape['nr_hidden'], shape['nr_hidden']), - attend=_Attend(shape['nr_hidden'], shape['nr_hidden']), - predict=_Predict(shape['nr_hidden'], shape['nr_class'])) - self.to_gpu(0) - - def __call__(self, sentence): - return self.predict( - self.attend( - self.encode( - self.embed(sentence)))) - - -class _Embed(Chain): - def __init__(self, nr_vector, nr_dim, nr_out, set_vectors=None): - Chain.__init__(self, - embed=L.EmbedID(nr_vector, nr_dim, initialW=set_vectors), - project=L.Linear(None, nr_out, nobias=True)) - self.embed.W.volatile = False - - def __call__(self, sentence): - return [self.project(self.embed(ts)) for ts in F.transpose(sentence)] - - -class _Encode(Chain): - def __init__(self, nr_in, nr_out): - Chain.__init__(self, - fwd=L.LSTM(nr_in, nr_out), - bwd=L.LSTM(nr_in, nr_out), - mix=L.Bilinear(nr_out, nr_out, nr_out)) - - def __call__(self, sentence): - self.fwd.reset_state() - fwds = map(self.fwd, sentence) - self.bwd.reset_state() - bwds = reversed(map(self.bwd, reversed(sentence))) - return [F.elu(self.mix(f, b)) for f, b in zip(fwds, bwds)] - - -class _Attend(Chain): - def __init__(self, nr_in, nr_out): - Chain.__init__(self) - - def __call__(self, sentence): - sent = sum(sentence) - return sent - - -class _Predict(Chain): - def __init__(self, nr_in, nr_out): - Chain.__init__(self, - l1=L.Linear(nr_in, nr_in), - l2=L.Linear(nr_in, nr_out)) - - def __call__(self, vector): - vector = self.l1(vector) - vector = F.elu(vector) - vector = self.l2(vector) - return vector - - -class SentenceDataset(TupleDataset): - def __init__(self, nlp, texts, labels, max_length): - self.max_length = max_length - sents, labels = self._get_labelled_sentences( - nlp.pipe(texts, batch_size=5000, n_threads=3), - labels) - TupleDataset.__init__(self, - get_features(sents, max_length), - labels) - - def __getitem__(self, index): - batches = [dataset[index] for dataset in self._datasets] - if isinstance(index, slice): - length = len(batches[0]) - returns = [tuple([batch[i] for batch in batches]) - for i in six.moves.range(length)] - return returns - else: - return tuple(batches) - - def _get_labelled_sentences(self, docs, doc_labels): - labels = [] - sentences = [] - for doc, y in izip(docs, doc_labels): - for sent in doc.sents: - sentences.append(sent) - labels.append(y) - return sentences, xp.asarray(labels, dtype='i') - - -class DocDataset(TupleDataset): - def __init__(self, nlp, texts, labels): - self.max_length = max_length - DatasetMixin.__init__(self, - get_features( - nlp.pipe(texts, batch_size=5000, n_threads=3), self.max_length), - labels) - -def read_data(data_dir, limit=0): - examples = [] - for subdir, label in (('pos', 1), ('neg', 0)): - for filename in (data_dir / subdir).iterdir(): - with filename.open() as file_: - text = file_.read() - examples.append((text, label)) - random.shuffle(examples) - if limit >= 1: - examples = examples[:limit] - return zip(*examples) # Unzips into two lists - - -def get_features(docs, max_length): - docs = list(docs) - Xs = xp.zeros((len(docs), max_length), dtype='i') - for i, doc in enumerate(docs): - j = 0 - for token in doc: - if token.has_vector and not token.is_punct and not token.is_space: - Xs[i, j] = token.norm - j += 1 - if j >= max_length: - break - return Xs - - -def set_vectors(vectors, vocab): - for lex in vocab: - if lex.has_vector and (lex.rank+1) < vectors.shape[0]: - lex.norm = lex.rank+1 - vectors[lex.rank + 1] = lex.vector - else: - lex.norm = 0 - return vectors - - -def train(train_texts, train_labels, dev_texts, dev_labels, - lstm_shape, lstm_settings, lstm_optimizer, batch_size=100, nb_epoch=5, - by_sentence=True): - nlp = spacy.load('en', entity=False) - if 'nr_vector' not in lstm_shape: - lstm_shape['nr_vector'] = max(lex.rank+1 for lex in nlp.vocab if lex.has_vector) - if 'nr_dim' not in lstm_shape: - lstm_shape['nr_dim'] = nlp.vocab.vectors_length - print("Make model") - model = Classifier(SentimentModel(nlp, lstm_shape, **lstm_settings)) - print("Parsing texts...") - if by_sentence: - train_data = SentenceDataset(nlp, train_texts, train_labels, lstm_shape['max_length']) - dev_data = SentenceDataset(nlp, dev_texts, dev_labels, lstm_shape['max_length']) - else: - train_data = DocDataset(nlp, train_texts, train_labels) - dev_data = DocDataset(nlp, dev_texts, dev_labels) - train_iter = SerialIterator(train_data, batch_size=batch_size, - shuffle=True, repeat=True) - dev_iter = SerialIterator(dev_data, batch_size=batch_size, - shuffle=False, repeat=False) - optimizer = chainer.optimizers.Adam() - optimizer.setup(model) - updater = chainer.training.StandardUpdater(train_iter, optimizer, device=0) - trainer = chainer.training.Trainer(updater, (1, 'epoch'), out='result') - - trainer.extend(extensions.Evaluator(dev_iter, model, device=0)) - trainer.extend(extensions.LogReport()) - trainer.extend(extensions.PrintReport([ - 'epoch', 'main/accuracy', 'validation/main/accuracy'])) - trainer.extend(extensions.ProgressBar()) - - trainer.run() - - -def evaluate(model_dir, texts, labels, max_length=100): - def create_pipeline(nlp): - ''' - This could be a lambda, but named functions are easier to read in Python. - ''' - return [nlp.tagger, nlp.parser, SentimentAnalyser.load(model_dir, nlp, - max_length=max_length)] - - nlp = spacy.load('en') - nlp.pipeline = create_pipeline(nlp) - - correct = 0 - i = 0 - for doc in nlp.pipe(texts, batch_size=1000, n_threads=4): - correct += bool(doc.sentiment >= 0.5) == bool(labels[i]) - i += 1 - return float(correct) / i - - -@plac.annotations( - train_dir=("Location of training file or directory"), - dev_dir=("Location of development file or directory"), - model_dir=("Location of output model directory",), - is_runtime=("Demonstrate run-time usage", "flag", "r", bool), - nr_hidden=("Number of hidden units", "option", "H", int), - max_length=("Maximum sentence length", "option", "L", int), - dropout=("Dropout", "option", "d", float), - learn_rate=("Learn rate", "option", "e", float), - nb_epoch=("Number of training epochs", "option", "i", int), - batch_size=("Size of minibatches for training LSTM", "option", "b", int), - nr_examples=("Limit to N examples", "option", "n", int) -) -def main(model_dir, train_dir, dev_dir, - is_runtime=False, - nr_hidden=64, max_length=100, # Shape - dropout=0.5, learn_rate=0.001, # General NN config - nb_epoch=5, batch_size=32, nr_examples=-1): # Training params - model_dir = pathlib.Path(model_dir) - train_dir = pathlib.Path(train_dir) - dev_dir = pathlib.Path(dev_dir) - if is_runtime: - dev_texts, dev_labels = read_data(dev_dir) - acc = evaluate(model_dir, dev_texts, dev_labels, max_length=max_length) - print(acc) - else: - print("Read data") - train_texts, train_labels = read_data(train_dir, limit=nr_examples) - dev_texts, dev_labels = read_data(dev_dir, limit=nr_examples) - print("Using GPU 0") - #chainer.cuda.get_device(0).use() - train_labels = xp.asarray(train_labels, dtype='i') - dev_labels = xp.asarray(dev_labels, dtype='i') - lstm = train(train_texts, train_labels, dev_texts, dev_labels, - {'nr_hidden': nr_hidden, 'max_length': max_length, 'nr_class': 2, - 'nr_vector': 5000}, - {'dropout': 0.5, 'lr': learn_rate}, - {}, - nb_epoch=nb_epoch, batch_size=batch_size) - - -if __name__ == '__main__': - #cProfile.runctx("plac.call(main)", globals(), locals(), "Profile.prof") - #s = pstats.Stats("Profile.prof") - #s.strip_dirs().sort_stats("time").print_stats() - plac.call(main) diff --git a/examples/vectors_fast_text.py b/examples/vectors_fast_text.py new file mode 100644 index 000000000..9aa9fda56 --- /dev/null +++ b/examples/vectors_fast_text.py @@ -0,0 +1,30 @@ +'''Load vectors for a language trained using FastText + +https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md +''' +from __future__ import unicode_literals +import plac +import numpy + +import spacy.language + + +def main(vectors_loc): + nlp = spacy.language.Language() + + with open(vectors_loc, 'rb') as file_: + header = file_.readline() + nr_row, nr_dim = header.split() + nlp.vocab.clear_vectors(int(nr_dim)) + for line in file_: + line = line.decode('utf8') + pieces = line.split() + word = pieces[0] + vector = numpy.asarray([float(v) for v in pieces[1:]], dtype='f') + nlp.vocab.set_vector(word, vector) + doc = nlp(u'class colspan') + print(doc[0].similarity(doc[1])) + + +if __name__ == '__main__': + plac.call(main) From b2a8b9be77506d5bb5c03885d44893a85044b6a6 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 17:00:34 -0500 Subject: [PATCH 154/649] Fix inconsistency of Vectors class API --- spacy/vectors.pyx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 346421153..da0489bbf 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -24,7 +24,12 @@ cdef class Vectors: cdef public int i def __init__(self, strings, data_or_width=0): - self.strings = StringStore() + if isinstance(strings, StringStore): + self.strings = strings + else: + self.strings = StringStore() + for string in strings: + self.strings.add(string) if isinstance(data_or_width, int): self.data = data = numpy.zeros((len(strings), data_or_width), dtype='f') @@ -82,7 +87,8 @@ cdef class Vectors: return i def items(self): - for i, string in enumerate(self.strings): + for i, key in enumerate(self.keys): + string = self.strings[key] yield string, self.data[i] @property From 4896ce33200352248b48590510e47bbe1b5b8e41 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 00:09:14 +0200 Subject: [PATCH 155/649] Remove misleading comment --- spacy/cli/convert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py index fef6753e6..89615bbe8 100644 --- a/spacy/cli/convert.py +++ b/spacy/cli/convert.py @@ -14,7 +14,7 @@ from ..util import prints CONVERTERS = { '.conllu': conllu2json, '.conll': conllu2json, - '.iob': iob2json + '.iob': iob2json, } From 31681d20e038fb0b318a9479856da473b0e0e926 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 16:50:26 +0200 Subject: [PATCH 156/649] Fix concatenation in iob2json converter --- spacy/cli/converters/iob2json.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/spacy/cli/converters/iob2json.py b/spacy/cli/converters/iob2json.py index 4849345e9..4d456fa57 100644 --- a/spacy/cli/converters/iob2json.py +++ b/spacy/cli/converters/iob2json.py @@ -1,5 +1,6 @@ # coding: utf8 from __future__ import unicode_literals +from cytoolz import partition_all, concat from ...compat import json_dumps, path2str from ...util import prints @@ -10,22 +11,24 @@ def iob2json(input_path, output_path, n_sents=10, *a, **k): """ Convert IOB files into JSON format for use with train cli. """ - # TODO: This isn't complete yet -- need to map from IOB to - # BILUO with input_path.open('r', encoding='utf8') as file_: - docs = read_iob(file_) + if n_sents: + lines = [' '.join(para) for para in partition_all(n_sents, file_)] + else: + lines = file_ + sentences = read_iob(lines) output_filename = input_path.parts[-1].replace(".iob", ".json") output_file = output_path / output_filename with output_file.open('w', encoding='utf-8') as f: - f.write(json_dumps(docs)) - prints("Created %d documents" % len(docs), + f.write(json_dumps(sentences)) + prints("Created %d documents" % len(sentences), title="Generated output file %s" % path2str(output_file)) -def read_iob(file_): +def read_iob(raw_sents): sentences = [] - for line in file_: + for line in raw_sents: if not line.strip(): continue tokens = [t.split('|') for t in line.split()] From f942903429b33b920c18ed7f9c4fe4715733d55f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 17:02:10 +0200 Subject: [PATCH 157/649] Improve sentence merging in iob2json --- spacy/cli/converters/iob2json.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/spacy/cli/converters/iob2json.py b/spacy/cli/converters/iob2json.py index 4d456fa57..74bc22ada 100644 --- a/spacy/cli/converters/iob2json.py +++ b/spacy/cli/converters/iob2json.py @@ -12,17 +12,13 @@ def iob2json(input_path, output_path, n_sents=10, *a, **k): Convert IOB files into JSON format for use with train cli. """ with input_path.open('r', encoding='utf8') as file_: - if n_sents: - lines = [' '.join(para) for para in partition_all(n_sents, file_)] - else: - lines = file_ - sentences = read_iob(lines) - + sentences = read_iob(file_) + docs = merge_sentences(sentences, n_sents) output_filename = input_path.parts[-1].replace(".iob", ".json") output_file = output_path / output_filename with output_file.open('w', encoding='utf-8') as f: - f.write(json_dumps(sentences)) - prints("Created %d documents" % len(sentences), + f.write(json_dumps(docs)) + prints("Created %d documents" % len(docs), title="Generated output file %s" % path2str(output_file)) @@ -46,3 +42,15 @@ def read_iob(raw_sents): paragraphs = [{'sentences': [sent]} for sent in sentences] docs = [{'id': 0, 'paragraphs': [para]} for para in paragraphs] return docs + +def merge_sentences(docs, n_sents): + counter = 0 + merged = [] + for group in partition_all(n_sents, docs): + group = list(group) + first = group.pop(0) + to_extend = first['paragraphs'][0]['sentences'] + for sent in group[1:]: + to_extend.extend(sent['paragraphs'][0]['sentences']) + merged.append(first) + return merged From c617d288d8fb9636f9dd077f8393c9e1d2d8626a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 17:20:19 +0200 Subject: [PATCH 158/649] Update pipeline component names in spaCy train --- spacy/cli/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index d973effb6..2096bf0a1 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -69,7 +69,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0, prints("Expected dict but got: {}".format(type(meta)), title="Not a valid meta.json format", exits=1) - pipeline = ['tags', 'dependencies', 'entities'] + pipeline = ['tagger', 'parser', 'ner'] if no_tagger and 'tags' in pipeline: pipeline.remove('tags') if no_parser and 'dependencies' in pipeline: pipeline.remove('dependencies') if no_entities and 'entities' in pipeline: pipeline.remove('entities') From 8902df44de0a4b6fb4b4d23a3e3cb1d4088db492 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 21:07:23 +0200 Subject: [PATCH 159/649] Fix component disabling during training --- spacy/cli/train.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 2096bf0a1..651fafb05 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -70,9 +70,9 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0, title="Not a valid meta.json format", exits=1) pipeline = ['tagger', 'parser', 'ner'] - if no_tagger and 'tags' in pipeline: pipeline.remove('tags') - if no_parser and 'dependencies' in pipeline: pipeline.remove('dependencies') - if no_entities and 'entities' in pipeline: pipeline.remove('entities') + if no_tagger and 'tagger' in pipeline: pipeline.remove('tagger') + if no_parser and 'parser' in pipeline: pipeline.remove('parser') + if no_entities and 'ner' in pipeline: pipeline.remove('ner') # Take dropout and batch size as generators of values -- dropout # starts high and decays sharply, to force the optimizer to explore. From 6aa6a5bc25eeebf1ffea4ee97f7e26d3f09c357a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 12:43:09 +0200 Subject: [PATCH 160/649] Add a layer type for history features --- spacy/_ml.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index 62fc7543f..38f220cc1 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -21,6 +21,7 @@ from thinc.neural._classes.affine import _set_dimensions_if_needed from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention +from thinc.neural._classes.embed import Embed from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths, noop @@ -212,6 +213,27 @@ class PrecomputableMaxouts(Model): return Yfp, backward +def HistoryFeatures(nr_class, hist_size=8, nr_dim=8): + '''Wrap a model, adding features representing action history.''' + embed = Embed(nr_dim, nr_dim, nr_class) + ops = embed.ops + def add_history_fwd(vectors_hists, drop=0.): + vectors, hist_ids = vectors_hists + flat_hists, bp_hists = embed.begin_update(hist_ids.flatten(), drop=drop) + hists = flat_hists.reshape((hist_ids.shape[0], + hist_ids.shape[1] * flat_hists.shape[1])) + outputs = ops.xp.hstack((vectors, hists)) + + def add_history_bwd(d_outputs, sgd=None): + d_vectors = d_outputs[:, :vectors.shape[1]] + d_hists = d_outputs[:, vectors.shape[1]:] + bp_hists(d_hists.reshape((d_hists.shape[0]*hist_size, + int(d_hists.shape[1]/hist_size))), sgd=sgd) + return embed.ops.xp.ascontiguousarray(d_vectors) + return outputs, add_history_bwd + return wrap(add_history_fwd, embed) + + def drop_layer(layer, factor=2.): def drop_layer_fwd(X, drop=0.): if drop <= 0.: From ee41e4fea7609119655a6ad73ead2df4b754c552 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 12:43:48 +0200 Subject: [PATCH 161/649] Support history features in stateclass --- spacy/syntax/_state.pxd | 30 ++++++++++++++++++++++++++++-- spacy/syntax/stateclass.pyx | 8 ++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 4fb16881a..f4fa49286 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -1,4 +1,4 @@ -from libc.string cimport memcpy, memset +from libc.string cimport memcpy, memset, memmove from libc.stdlib cimport malloc, calloc, free from libc.stdint cimport uint32_t, uint64_t @@ -15,6 +15,23 @@ from ..typedefs cimport attr_t cdef inline bint is_space_token(const TokenC* token) nogil: return Lexeme.c_check_flag(token.lex, IS_SPACE) +cdef struct RingBufferC: + int[8] data + int i + int default + +cdef inline int ring_push(RingBufferC* ring, int value) nogil: + ring.data[ring.i] = value + ring.i += 1 + if ring.i >= 8: + ring.i = 0 + +cdef inline int ring_get(RingBufferC* ring, int i) nogil: + if i >= ring.i: + return ring.default + else: + return ring.data[ring.i-i] + cdef cppclass StateC: int* _stack @@ -23,6 +40,7 @@ cdef cppclass StateC: TokenC* _sent Entity* _ents TokenC _empty_token + RingBufferC _hist int length int offset int _s_i @@ -37,6 +55,7 @@ cdef cppclass StateC: this.shifted = calloc(length + (PADDING * 2), sizeof(bint)) this._sent = calloc(length + (PADDING * 2), sizeof(TokenC)) this._ents = calloc(length + (PADDING * 2), sizeof(Entity)) + memset(&this._hist, 0, sizeof(this._hist)) this.offset = 0 cdef int i for i in range(length + (PADDING * 2)): @@ -271,7 +290,14 @@ cdef cppclass StateC: sig[8] = this.B_(0)[0] sig[9] = this.E_(0)[0] sig[10] = this.E_(1)[0] - return hash64(sig, sizeof(sig), this._s_i) + return hash64(sig, sizeof(sig), this._s_i) \ + + hash64(&this._hist, sizeof(RingBufferC), 1) + + void push_hist(int act) nogil: + ring_push(&this._hist, act) + + int get_hist(int i) nogil: + return ring_get(&this._hist, i) void push() nogil: if this.B(0) != -1: diff --git a/spacy/syntax/stateclass.pyx b/spacy/syntax/stateclass.pyx index 228a3ff91..9c179820c 100644 --- a/spacy/syntax/stateclass.pyx +++ b/spacy/syntax/stateclass.pyx @@ -4,6 +4,7 @@ from __future__ import unicode_literals from libc.string cimport memcpy, memset from libc.stdint cimport uint32_t, uint64_t +import numpy from ..vocab cimport EMPTY_LEXEME from ..structs cimport Entity @@ -38,6 +39,13 @@ cdef class StateClass: def token_vector_lenth(self): return self.doc.tensor.shape[1] + @property + def history(self): + hist = numpy.ndarray((8,), dtype='i') + for i in range(8): + hist[i] = self.c.get_hist(i+1) + return hist + def is_final(self): return self.c.is_final() From b50a359e1140e968e115f09ced042fc6a02fac22 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 12:44:01 +0200 Subject: [PATCH 162/649] Add support for history features in parsing models --- spacy/syntax/nn_parser.pyx | 51 +++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 1efdc4474..2277e568e 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -51,6 +51,7 @@ from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune from .._ml import Residual, drop_layer, flatten from .._ml import link_vectors_to_models +from .._ml import HistoryFeatures from ..compat import json_dumps from . import _parse_features @@ -68,7 +69,7 @@ from ..gold cimport GoldParse from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils -USE_FINE_TUNE = True +USE_HISTORY = True def get_templates(*args, **kwargs): return [] @@ -261,18 +262,35 @@ cdef class Parser: with Model.use_device('cpu'): if depth == 0: - upper = chain() - upper.is_noop = True - else: + hist_size = 8 + nr_dim = 8 + if USE_HISTORY: + upper = chain( + HistoryFeatures(nr_class=nr_class, hist_size=hist_size, + nr_dim=nr_dim), + zero_init(Affine(nr_class, nr_class+hist_size*nr_dim, + drop_factor=0.0))) + upper.is_noop = False + else: + upper = chain() + upper.is_noop = True + elif USE_HISTORY: upper = chain( - clone(Maxout(hidden_width), depth-1), + HistoryFeatures(nr_class=nr_class, hist_size=8, nr_dim=8), + Maxout(hidden_width, hidden_width+8*8), zero_init(Affine(nr_class, hidden_width, drop_factor=0.0)) ) upper.is_noop = False + else: + upper = chain( + Maxout(hidden_width, hidden_width), + zero_init(Affine(nr_class, hidden_width, drop_factor=0.0)) + ) + upper.is_noop = False + # TODO: This is an unfortunate hack atm! # Used to set input dimensions in network. lower.begin_training(lower.ops.allocate((500, token_vector_width))) - upper.begin_training(upper.ops.allocate((500, hidden_width))) cfg = { 'nr_class': nr_class, 'depth': depth, @@ -428,12 +446,18 @@ cdef class Parser: self._parse_step(next_step[i], feat_weights, nr_class, nr_feat, nr_piece) else: + hists = [] for i in range(nr_step): st = next_step[i] st.set_context_tokens(&c_token_ids[i*nr_feat], nr_feat) self.moves.set_valid(&c_is_valid[i*nr_class], st) + hists.append([st.get_hist(j+1) for j in range(8)]) + hists = numpy.asarray(hists) vectors = state2vec(token_ids[:next_step.size()]) - scores = vec2scores(vectors) + if USE_HISTORY: + scores = vec2scores((vectors, hists)) + else: + scores = vec2scores(vectors) c_scores = scores.data for i in range(nr_step): st = next_step[i] @@ -441,6 +465,7 @@ cdef class Parser: &c_scores[i*nr_class], &c_is_valid[i*nr_class], nr_class) action = self.moves.c[guess] action.do(st, action.label) + st.push_hist(guess) this_step, next_step = next_step, this_step next_step.clear() for st in this_step: @@ -551,7 +576,11 @@ cdef class Parser: if drop != 0: mask = vec2scores.ops.get_dropout_mask(vector.shape, drop) vector *= mask - scores, bp_scores = vec2scores.begin_update(vector, drop=drop) + hists = numpy.asarray([st.history for st in states], dtype='i') + if USE_HISTORY: + scores, bp_scores = vec2scores.begin_update((vector, hists), drop=drop) + else: + scores, bp_scores = vec2scores.begin_update(vector, drop=drop) d_scores = self.get_batch_loss(states, golds, scores) d_scores /= len(docs) @@ -570,7 +599,8 @@ cdef class Parser: else: backprops.append((token_ids, d_vector, bp_vector)) self.transition_batch(states, scores) - todo = [st for st in todo if not st[0].is_final()] + todo = [(st, gold) for (st, gold) in todo + if not st.is_final()] if losses is not None: losses[self.name] += (d_scores**2).sum() n_steps += 1 @@ -706,12 +736,15 @@ cdef class Parser: cdef StateClass state cdef int[500] is_valid # TODO: Unhack cdef float* c_scores = &scores[0, 0] + hists = [] for state in states: self.moves.set_valid(is_valid, state.c) guess = arg_max_if_valid(c_scores, is_valid, scores.shape[1]) action = self.moves.c[guess] action.do(state.c, action.label) c_scores += scores.shape[1] + hists.append(guess) + return hists def get_batch_loss(self, states, golds, float[:, ::1] scores): cdef StateClass state From b770f4e1082b1da83597bb723a0e1986befdd069 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 13:26:55 +0200 Subject: [PATCH 163/649] Fix embed class in history features --- spacy/_ml.py | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 38f220cc1..3b6e4da10 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -21,7 +21,6 @@ from thinc.neural._classes.affine import _set_dimensions_if_needed from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention -from thinc.neural._classes.embed import Embed from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths, noop @@ -212,23 +211,60 @@ class PrecomputableMaxouts(Model): return dXf return Yfp, backward +# Thinc's Embed class is a bit broken atm, so drop this here. +from thinc import describe +from thinc.neural._classes.embed import _uniform_init + +@describe.attributes( + nV=describe.Dimension("Number of vectors"), + nO=describe.Dimension("Size of output"), + vectors=describe.Weights("Embedding table", + lambda obj: (obj.nV, obj.nO), + _uniform_init(-0.1, 0.1) + ), + d_vectors=describe.Gradient("vectors") +) +class Embed(Model): + name = 'embed' + + def __init__(self, nO, nV=None, **kwargs): + Model.__init__(self, **kwargs) + self.column = kwargs.get('column', 0) + self.nO = nO + self.nV = nV + + def predict(self, ids): + if ids.ndim == 2: + ids = ids[:, self.column] + return self._embed(ids) + + def begin_update(self, ids, drop=0.): + if ids.ndim == 2: + ids = ids[:, self.column] + vectors = self.vectors[ids] + def backprop_embed(d_vectors, sgd=None): + n_vectors = d_vectors.shape[0] + self.ops.scatter_add(self.d_vectors, ids, d_vectors) + if sgd is not None: + sgd(self._mem.weights, self._mem.gradient, key=self.id) + return None + return vectors, backprop_embed + def HistoryFeatures(nr_class, hist_size=8, nr_dim=8): '''Wrap a model, adding features representing action history.''' - embed = Embed(nr_dim, nr_dim, nr_class) + embed_tables = [Embed(nr_dim, nr_class, column=i) for i in range(hist_size)] + embed = concatenate(*embed_tables) ops = embed.ops def add_history_fwd(vectors_hists, drop=0.): vectors, hist_ids = vectors_hists - flat_hists, bp_hists = embed.begin_update(hist_ids.flatten(), drop=drop) - hists = flat_hists.reshape((hist_ids.shape[0], - hist_ids.shape[1] * flat_hists.shape[1])) - outputs = ops.xp.hstack((vectors, hists)) + hist_feats, bp_hists = embed.begin_update(hist_ids) + outputs = ops.xp.hstack((vectors, hist_feats)) def add_history_bwd(d_outputs, sgd=None): d_vectors = d_outputs[:, :vectors.shape[1]] d_hists = d_outputs[:, vectors.shape[1]:] - bp_hists(d_hists.reshape((d_hists.shape[0]*hist_size, - int(d_hists.shape[1]/hist_size))), sgd=sgd) + bp_hists(d_hists, sgd=sgd) return embed.ops.xp.ascontiguousarray(d_vectors) return outputs, add_history_bwd return wrap(add_history_fwd, embed) From 278a4c17c642b366b71dccc7cec202dc22cfcb93 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 13:27:10 +0200 Subject: [PATCH 164/649] Fix history features --- spacy/syntax/nn_parser.pyx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 2277e568e..4a874e834 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -70,6 +70,8 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_HISTORY = True +HIST_SIZE = 2 +HIST_DIMS = 16 def get_templates(*args, **kwargs): return [] @@ -262,13 +264,11 @@ cdef class Parser: with Model.use_device('cpu'): if depth == 0: - hist_size = 8 - nr_dim = 8 if USE_HISTORY: upper = chain( - HistoryFeatures(nr_class=nr_class, hist_size=hist_size, - nr_dim=nr_dim), - zero_init(Affine(nr_class, nr_class+hist_size*nr_dim, + HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE, + nr_dim=HIST_DIMS), + zero_init(Affine(nr_class, nr_class+HIST_SIZE*HIST_DIMS, drop_factor=0.0))) upper.is_noop = False else: @@ -736,15 +736,13 @@ cdef class Parser: cdef StateClass state cdef int[500] is_valid # TODO: Unhack cdef float* c_scores = &scores[0, 0] - hists = [] for state in states: self.moves.set_valid(is_valid, state.c) guess = arg_max_if_valid(c_scores, is_valid, scores.shape[1]) action = self.moves.c[guess] action.do(state.c, action.label) c_scores += scores.shape[1] - hists.append(guess) - return hists + state.c.push_hist(guess) def get_batch_loss(self, states, golds, float[:, ::1] scores): cdef StateClass state From dc3c79194763d28e5d9e34918c22a05585d151cc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 13:41:23 +0200 Subject: [PATCH 165/649] Fix history size option --- spacy/syntax/nn_parser.pyx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 4a874e834..87099aa4f 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -70,8 +70,8 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_HISTORY = True -HIST_SIZE = 2 -HIST_DIMS = 16 +HIST_SIZE = 8 # Max 8 +HIST_DIMS = 8 def get_templates(*args, **kwargs): return [] @@ -276,8 +276,8 @@ cdef class Parser: upper.is_noop = True elif USE_HISTORY: upper = chain( - HistoryFeatures(nr_class=nr_class, hist_size=8, nr_dim=8), - Maxout(hidden_width, hidden_width+8*8), + HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE, nr_dim=HIST_DIMS), + Maxout(hidden_width, hidden_width+HIST_SIZE*HIST_DIMS), zero_init(Affine(nr_class, hidden_width, drop_factor=0.0)) ) upper.is_noop = False From 3e1b971b16d8c0a11b1f6215513046f4b8c01304 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 3 Oct 2017 14:14:52 +0200 Subject: [PATCH 166/649] Update CSS --- website/assets/css/_base/_animations.sass | 7 + website/assets/css/_base/_fonts.sass | 44 ++---- website/assets/css/_base/_grid.sass | 10 +- website/assets/css/_base/_layout.sass | 4 + website/assets/css/_base/_objects.sass | 79 +++++++++- website/assets/css/_base/_reset.sass | 7 +- website/assets/css/_base/_utilities.sass | 149 ++++++++++++++---- website/assets/css/_components/_asides.sass | 6 +- website/assets/css/_components/_buttons.sass | 41 ++++- website/assets/css/_components/_chat.sass | 27 ++-- website/assets/css/_components/_code.sass | 29 ++-- website/assets/css/_components/_landing.sass | 39 ++++- website/assets/css/_components/_lists.sass | 5 +- website/assets/css/_components/_misc.sass | 5 +- .../assets/css/_components/_navigation.sass | 26 +-- website/assets/css/_components/_progress.sass | 24 +++ .../assets/css/_components/_quickstart.sass | 10 +- website/assets/css/_components/_sidebar.sass | 65 +++++++- website/assets/css/_components/_tables.sass | 3 +- website/assets/css/_components/_tooltips.sass | 18 ++- website/assets/css/_mixins.sass | 17 +- website/assets/css/_variables.sass | 25 +-- website/assets/css/style.sass | 1 + website/assets/css/style_red.sass | 4 - 24 files changed, 496 insertions(+), 149 deletions(-) create mode 100644 website/assets/css/_components/_progress.sass delete mode 100644 website/assets/css/style_red.sass diff --git a/website/assets/css/_base/_animations.sass b/website/assets/css/_base/_animations.sass index 376ac5c2f..5c82a4fcc 100644 --- a/website/assets/css/_base/_animations.sass +++ b/website/assets/css/_base/_animations.sass @@ -19,3 +19,10 @@ to transform: translate3d(0, 0, 0) + + +//- Element rotates + +@keyframes rotate + to + transform: rotate(360deg) diff --git a/website/assets/css/_base/_fonts.sass b/website/assets/css/_base/_fonts.sass index be113798c..c1af115a7 100644 --- a/website/assets/css/_base/_fonts.sass +++ b/website/assets/css/_base/_fonts.sass @@ -1,41 +1,27 @@ //- 💫 CSS > BASE > FONTS -// Source Sans Pro +// HK Grotesk @font-face - font-family: "Source Sans Pro" + font-family: "HK Grotesk" font-style: normal - font-weight: 400 - src: url("/assets/fonts/sourcesanspro-regular.eot") - src: url("/assets/fonts/sourcesanspro-regular.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcesanspro-regular.woff2") format("woff2"), url("/assets/fonts/sourcesanspro-regular.woff") format("woff"), url("/assets/fonts/sourcesanspro-regular.ttf") format("truetype"), url("/assets/fonts/sourcesanspro-regular.svg#source_sans_proregular") format("svg") + font-weight: 500 + src: url("/assets/fonts/hkgrotesk-semibold.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-semibold.woff") format("woff") @font-face - font-family: "Source Sans Pro" + font-family: "HK Grotesk" font-style: italic - font-weight: 400 - src: url("/assets/fonts/sourcesanspro-italic.eot") - src: url("/assets/fonts/sourcesanspro-italic.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcesanspro-italic.woff2") format("woff2"), url("/assets/fonts/sourcesanspro-italic.woff") format("woff"), url("/assets/fonts/sourcesanspro-italic.ttf") format("truetype"), url("/assets/fonts/sourcesanspro-italic.svg#source_sans_proitalic") format("svg") + font-weight: 500 + src: url("/assets/fonts/hkgrotesk-semibolditalic.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-semibolditalic.woff") format("woff") @font-face - font-family: "Source Sans Pro" - font-style: normal - font-weight: 700 - src: url("/assets/fonts/sourcesanspro-bold.eot") - src: url("/assets/fonts/sourcesanspro-bold.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcesanspro-bold.woff2") format("woff2"), url("/assets/fonts/sourcesanspro-bold.woff") format("woff"), url("/assets/fonts/sourcesanspro-bold.ttf") format("truetype"), url("/assets/fonts/sourcesanspro-bold.svg#source_sans_probold") format("svg") - -@font-face - font-family: "Source Sans Pro" - font-style: italic - font-weight: 700 - src: url("/assets/fonts/sourcesanspro-bolditalic.eot") - src: url("/assets/fonts/sourcesanspro-bolditalic.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcesanspro-bolditalic.woff2") format("woff2"), url("/assets/fonts/sourcesanspro-bolditalic.woff") format("woff"), url("/assets/fonts/sourcesanspro-bolditalic.ttf") format("truetype"), url("/assets/fonts/sourcesanspro-bolditalic.svg#source_sans_probold_italic") format("svg") - - -// Source Code Pro - -@font-face - font-family: "Source Code Pro" + font-family: "HK Grotesk" font-style: normal font-weight: 600 - src: url("/assets/fonts/sourcecodepro-semibold.eot") - src: url("/assets/fonts/sourcecodepro-semibold.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcecodepro-semibold.woff") format("woff"), url("/assets/fonts/sourcecodepro-semibold.ttf") format("truetype"), url("/assets/fonts/sourcecodepro-semibold.svg#sourcecodepro_semibold") format("svg") + src: url("/assets/fonts/hkgrotesk-bold.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-bold.woff") format("woff") + +@font-face + font-family: "HK Grotesk" + font-style: italic + font-weight: 600 + src: url("/assets/fonts/hkgrotesk-bolditalic.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-bolditalic.woff") format("woff") diff --git a/website/assets/css/_base/_grid.sass b/website/assets/css/_base/_grid.sass index 3feda696d..536c657db 100644 --- a/website/assets/css/_base/_grid.sass +++ b/website/assets/css/_base/_grid.sass @@ -15,6 +15,15 @@ align-items: center justify-content: center + &.o-grid--vcenter + align-items: center + + &.o-grid--space + justify-content: space-between + + &.o-grid--nowrap + flex-wrap: nowrap + //- Grid column @@ -22,7 +31,6 @@ $grid-gutter: 2rem margin-top: $grid-gutter - overflow: hidden @include breakpoint(min, lg) display: flex diff --git a/website/assets/css/_base/_layout.sass b/website/assets/css/_base/_layout.sass index 8828651c6..1b725fdbf 100644 --- a/website/assets/css/_base/_layout.sass +++ b/website/assets/css/_base/_layout.sass @@ -12,6 +12,7 @@ body animation: fadeIn 0.25s ease background: $color-back color: $color-front + //scroll-behavior: smooth //- Paragraphs @@ -19,6 +20,9 @@ body p @extend .o-block, .u-text +p:empty + margin-bottom: 0 + //- Links diff --git a/website/assets/css/_base/_objects.sass b/website/assets/css/_base/_objects.sass index 635e9cde3..8494ee36a 100644 --- a/website/assets/css/_base/_objects.sass +++ b/website/assets/css/_base/_objects.sass @@ -43,12 +43,25 @@ position: relative padding: 2.5rem 0 overflow: auto + background: $color-subtle-light + + .o-main & + border-top-left-radius: $border-radius //- Blocks +.o-section + width: 100% + max-width: 100% + + &:not(:last-child) + margin-bottom: 7rem + padding-bottom: 4rem + border-bottom: 1px dotted $color-subtle + .o-block - margin-bottom: 3rem + margin-bottom: 4rem .o-block-small margin-bottom: 2rem @@ -58,17 +71,18 @@ .o-card background: $color-back - border-radius: 2px - border: 1px solid $color-subtle - padding: 3rem 2.5% - + border-radius: $border-radius + box-shadow: $box-shadow //- Box .o-box - background: $color-theme-light + background: $color-subtle-light padding: 2rem - border-left: 4px solid $color-theme + border-radius: $border-radius + +.o-box__logos + padding-bottom: 1rem //- Icons @@ -77,7 +91,14 @@ vertical-align: middle &.o-icon--inline - margin: 0 0.5rem 0 0.25rem + margin: 0 0.5rem 0 0.1rem + +.o-emoji + margin-right: 0.75rem + vertical-align: text-bottom + +.o-badge + border-radius: 1em //- SVG @@ -102,3 +123,45 @@ fill: currentColor vertical-align: middle margin: 0 0.5rem + + +//- Embeds + +.o-chart + max-width: 100% + +.cp_embed_iframe + border: 1px solid $color-subtle + border-radius: $border-radius + + +//- Form fields + +.o-field + background: $color-back + padding: 0 0.25em + border-radius: 2em + border: 1px solid $color-subtle + margin-bottom: 0.25rem + +.o-field__input, +.o-field__button + padding: 0 0.35em + +.o-field__input + width: 100% + +.o-field__select + background: transparent + color: $color-dark + height: 1.4em + border: none + text-align-last: center + +.o-empty:empty:before + @include size(1em) + border-radius: 50% + content: "" + display: inline-block + background: $color-red + vertical-align: middle diff --git a/website/assets/css/_base/_reset.sass b/website/assets/css/_base/_reset.sass index 1d9d9ffbe..0ff1432d0 100644 --- a/website/assets/css/_base/_reset.sass +++ b/website/assets/css/_base/_reset.sass @@ -1,6 +1,6 @@ //- 💫 CSS > BASE > RESET -* +*, *:before, *:after box-sizing: border-box padding: 0 margin: 0 @@ -94,7 +94,10 @@ ul, ol input, button appearance: none + background: transparent button - background: transparent cursor: pointer + +progress + appearance: none diff --git a/website/assets/css/_base/_utilities.sass b/website/assets/css/_base/_utilities.sass index 46c3e84d9..e2ba552b7 100644 --- a/website/assets/css/_base/_utilities.sass +++ b/website/assets/css/_base/_utilities.sass @@ -2,38 +2,53 @@ //- Text +.u-text, +.u-text-small, +.u-text-tiny + font-family: $font-primary + .u-text - font: 1.5rem/#{1.55} $font-primary + font-size: 1.35rem + line-height: 1.5 .u-text-small - font: 1.4rem/#{1.375} $font-primary + font-size: 1.3rem + line-height: 1.375 .u-text-tiny - font: 1.1rem/#{1.375} $font-primary - + font-size: 1.1rem + line-height: 1.375 //- Labels & Tags .u-text-label - font: normal 600 1.4rem/#{1.5} $font-code + font: normal 600 1.4rem/#{1.5} $font-secondary text-transform: uppercase + &.u-text-label--light, &.u-text-label--dark display: inline-block + border-radius: 1em + padding: 0 1rem 0.15rem + + &.u-text-label--dark background: $color-dark box-shadow: inset 1px 1px 1px rgba($color-front, 0.25) color: $color-back - padding: 0 0.75rem margin: 1.5rem 0 0 2rem - border-radius: 2px + + &.u-text-label--light + background: $color-back + color: $color-theme + margin-bottom: 1rem .u-text-tag display: inline-block - font: 600 1.1rem/#{1} $font-code + font: 600 1.1rem/#{1} $font-secondary background: $color-theme color: $color-back - padding: 0.15em 0.25em - border-radius: 2px + padding: 0.15em 0.5em 0.35em + border-radius: 1em text-transform: uppercase vertical-align: middle @@ -45,7 +60,7 @@ //- Headings .u-heading - margin-bottom: 2rem + margin-bottom: 1em @include breakpoint(max, md) word-wrap: break-word @@ -53,12 +68,29 @@ &:not(:first-child) padding-top: 3.5rem + &.u-heading--title:after + content: "" + display: block + width: 10% + min-width: 6rem + height: 6px + background: $color-theme + margin-top: 3rem + .u-heading-0 - font: normal bold 7rem/#{1} $font-primary + font: normal 600 7rem/#{1} $font-secondary + + @include breakpoint(max, sm) + font-size: 6rem + @each $level, $size in $headings .u-heading-#{$level} - font: normal bold #{$size}rem/#{1.25} $font-primary + font: normal 500 #{$size}rem/#{1.1} $font-secondary + +.u-heading__teaser + margin-top: 2rem + font-weight: normal //- Links @@ -66,31 +98,59 @@ .u-link color: $color-theme border-bottom: 1px solid + transition: color 0.2s ease + + &:hover + color: $color-theme-dark + +.u-hide-link.u-hide-link + border: none + color: inherit + + &:hover + color: inherit .u-permalink position: relative + &:before + content: "\00b6" + font-size: 0.9em + font-weight: normal + color: $color-subtle + @include position(absolute, top, left, 0.15em, -2.85rem) + opacity: 0 + transition: opacity 0.2s ease + + &:hover:before + opacity: 1 + + &:active:before + color: $color-theme + &:target display: inline-block - padding-top: $nav-height * 1.25 - & + * - margin-top: $nav-height * 1.25 + &:before + bottom: 0.15em + top: initial -.u-permalink__icon - @include position(absolute, bottom, left, 0.35em, -2.75rem) - @include size(1.5rem) - color: $color-subtle - .u-permalink:hover & - color: $color-subtle-dark +[id]:target + padding-top: $nav-height * 1.25 - .u-permalink:active & - color: $color-theme //- Layout +.u-float-left + float: left + margin-right: 1rem + +.u-float-right + float: right + margin-left: 1rem + .u-text-center text-align: center @@ -104,14 +164,20 @@ padding: 0.5em 0.75em .u-padding-medium - padding: 2.5rem + padding: 1.8rem .u-inline-block display: inline-block +.u-flex-full + flex: 1 + .u-nowrap white-space: nowrap +.u-wrap + white-space: pre-wrap + .u-break.u-break word-wrap: break-word white-space: initial @@ -123,13 +189,10 @@ border: 1px solid $color-subtle border-radius: 2px -.u-border-bottom - border: 1px solid $color-subtle - .u-border-dotted - border-top: 1px dotted $color-subtle + border-bottom: 1px dotted $color-subtle -@each $name, $color in (theme: $color-theme, subtle: $color-subtle-dark, light: $color-back, red: $color-red, green: $color-green, yellow: $color-yellow) +@each $name, $color in (theme: $color-theme, dark: $color-dark, subtle: $color-subtle-dark, light: $color-back, red: $color-red, green: $color-green, yellow: $color-yellow) .u-color-#{$name} color: $color @@ -145,6 +208,32 @@ background: $pattern +//- Loaders + +.u-loading, +[data-loading] + $spinner-size: 75px + $spinner-bar: 8px + + position: relative + + & > * + opacity: 0.35 + + &:before + @include position(absolute, top, left, 0, 0) + @include size($spinner-size) + right: 0 + bottom: 0 + margin: auto + content: "" + border: $spinner-bar solid $color-subtle + border-right: $spinner-bar solid $color-theme + border-radius: 50% + animation: rotate 1s linear infinite + z-index: 10 + + //- Hidden elements .u-hidden diff --git a/website/assets/css/_components/_asides.sass b/website/assets/css/_components/_asides.sass index d5b5c64e3..c59590c29 100644 --- a/website/assets/css/_components/_asides.sass +++ b/website/assets/css/_components/_asides.sass @@ -10,6 +10,8 @@ .c-aside__content background: $color-front + border-top-left-radius: $border-radius + border-bottom-left-radius: $border-radius z-index: 10 @include breakpoint(min, md) @@ -21,12 +23,12 @@ &:after $triangle-size: 2rem - @include position(absolute, bottom, left, -$triangle-size / 2, 0) + @include position(absolute, bottom, left, -$triangle-size / 2, $border-radius / 2) @include size(0) border-color: transparent border-style: solid border-top-color: $color-dark - border-width: $triangle-size / 2 0 0 $triangle-size + border-width: $triangle-size / 2 0 0 calc(#{$triangle-size} - #{$border-radius / 2}) content: "" @include breakpoint(max, sm) diff --git a/website/assets/css/_components/_buttons.sass b/website/assets/css/_components/_buttons.sass index f753e15bf..d3ff4b037 100644 --- a/website/assets/css/_components/_buttons.sass +++ b/website/assets/css/_components/_buttons.sass @@ -3,23 +3,50 @@ .c-button display: inline-block font-weight: bold - padding: 0.75em 1em + padding: 0.8em 1.1em 1em margin-bottom: 1px - border: 2px solid - border-radius: 2px + border: 2px solid $color-theme + border-radius: 2em text-align: center - transition: background 0.25s ease + transition: background-color, color 0.25s ease + + &:hover + border-color: $color-theme-dark + + &.c-button--small + font-size: 1.1rem + padding: 0.65rem 1.1rem 0.825rem &.c-button--primary background: $color-theme color: $color-back - border-color: $color-theme &:hover background: $color-theme-dark - border-color: $color-theme-dark &.c-button--secondary background: $color-back color: $color-theme - border-color: $color-theme + + &:hover + color: $color-theme-dark + + &.c-button--secondary-light + background: transparent + color: $color-back + border-color: $color-back + +.c-icon-button + @include size(35px) + background: $color-subtle-light + color: $color-subtle-dark + border-radius: 50% + padding: 0.5rem + transition: color 0.2s ease + + &:hover + color: $color-theme + + &.c-icon-button--right + float: right + margin-left: 3rem diff --git a/website/assets/css/_components/_chat.sass b/website/assets/css/_components/_chat.sass index 2a1e5cc3d..659f80364 100644 --- a/website/assets/css/_components/_chat.sass +++ b/website/assets/css/_components/_chat.sass @@ -24,9 +24,9 @@ transform: translateX(110%) &:before - @include position(absolute, top, left, 1rem, 2rem) + @include position(absolute, top, left, 1.25rem, 2rem) content: attr(data-title) - font: bold 1.4rem $font-code + font: bold 1.4rem $font-secondary text-transform: uppercase color: $color-back @@ -88,13 +88,18 @@ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTguOTg0IDYuNDIybC01LjU3OCA1LjU3OCA1LjU3OCA1LjU3OC0xLjQwNiAxLjQwNi01LjU3OC01LjU3OC01LjU3OCA1LjU3OC0xLjQwNi0xLjQwNiA1LjU3OC01LjU3OC01LjU3OC01LjU3OCAxLjQwNi0xLjQwNiA1LjU3OCA1LjU3OCA1LjU3OC01LjU3OHoiPjwvcGF0aD48L3N2Zz4=) .c-chat__button - @include position(fixed, bottom, right, 0, 2rem) - padding: 1rem 1.5rem - background: $color-front + @include position(fixed, bottom, right, 1.5rem, 1.5rem) + z-index: 5 color: $color-back - border-top-left-radius: 4px - border-top-right-radius: 4px - z-index: 20 - border-color: $color-theme - border-style: solid - border-width: 1px 1px 0 1px + background: $color-front + border-radius: 1em + padding: 0.5rem 1.15rem 0.35rem + opacity: 0.7 + transition: opacity 0.2s ease + + &:hover + opacity: 1 + + +.gitter-open-chat-button + display: none diff --git a/website/assets/css/_components/_code.sass b/website/assets/css/_components/_code.sass index 036c5358f..f83e96d29 100644 --- a/website/assets/css/_components/_code.sass +++ b/website/assets/css/_components/_code.sass @@ -4,9 +4,9 @@ .c-code-block background: $color-front - color: $color-back + color: darken($color-back, 20) padding: 0.75em 0 - border-radius: 2px + border-radius: $border-radius overflow: auto width: 100% max-width: 100% @@ -16,6 +16,8 @@ &.c-code-block--has-icon padding: 0 display: flex + border-top-left-radius: 0 + border-bottom-left-radius: 0 .c-code-block__icon padding: 0 0 0 1rem @@ -43,17 +45,26 @@ opacity: 0.5 +//- Code + +code + -webkit-font-smoothing: subpixel-antialiased + -moz-osx-font-smoothing: auto + + //- Inline code +*:not(a):not(.c-code-block) > code + color: $color-dark + *:not(.c-code-block) > code - font: normal 600 0.8em/#{1} $font-code - background: darken($color-theme-light, 5) - box-shadow: 1px 1px 0 rgba($color-front, 0.05) - text-shadow: 1px 1px 0 rgba($color-back, 0.5) - color: $color-front - padding: 0.1em 0.5em + font-size: 90% + background-color: $color-subtle-light + padding: 0.2rem 0.4rem + border-radius: 0.25rem + font-family: $font-code + white-space: nowrap margin: 0 - border-radius: 1px box-decoration-break: clone white-space: nowrap diff --git a/website/assets/css/_components/_landing.sass b/website/assets/css/_components/_landing.sass index af1521d10..4c15e4a39 100644 --- a/website/assets/css/_components/_landing.sass +++ b/website/assets/css/_components/_landing.sass @@ -2,12 +2,11 @@ .c-landing background: $color-theme - padding-top: 5rem + padding-top: $nav-height * 1.5 width: 100% .c-landing__wrapper background: $pattern - padding-bottom: 6rem width: 100% .c-landing__content @@ -15,9 +14,45 @@ width: 100% min-height: 573px +.c-landing__headlines + position: relative + top: -1.5rem + left: 1rem + .c-landing__title color: $color-back text-align: center + margin-bottom: 0.75rem + +.c-landing__blocks + @include breakpoint(min, sm) + position: relative + top: -25rem + margin-bottom: -25rem + +.c-landing__card + padding: 3rem 2.5rem + +.c-landing__banner + background: $color-theme + +.c-landing__banner__content + @include breakpoint(min, md) + border: 4px solid + padding: 1rem 6.5rem 2rem 4rem + + +.c-landing__banner__text + font-weight: 500 + + strong + font-weight: 800 + + p + font-size: 1.5rem + + @include breakpoint(min, md) + padding-top: 7rem .c-landing__badge transform: rotate(7deg) diff --git a/website/assets/css/_components/_lists.sass b/website/assets/css/_components/_lists.sass index 48a5e92c8..2a933c95e 100644 --- a/website/assets/css/_components/_lists.sass +++ b/website/assets/css/_components/_lists.sass @@ -9,6 +9,8 @@ .c-list__item:before content: counter(li, #{$counter}) '.' + font-size: 1em + padding-right: 1rem //- List Item @@ -21,13 +23,14 @@ &:before content: '\25CF' display: inline-block - font-size: 1em + font-size: 0.6em font-weight: bold padding-right: 1.25rem margin-left: -3.75rem text-align: right width: 2.5rem counter-increment: li + box-sizing: content-box //- List icon diff --git a/website/assets/css/_components/_misc.sass b/website/assets/css/_components/_misc.sass index 3bd9bd6b6..8167c94b2 100644 --- a/website/assets/css/_components/_misc.sass +++ b/website/assets/css/_components/_misc.sass @@ -3,9 +3,8 @@ .x-terminal background: $color-subtle-light color: $color-front - padding: 4px - border: 1px dotted $color-subtle - border-radius: 5px + padding: $border-radius + border-radius: 1em width: 100% .x-terminal__icons diff --git a/website/assets/css/_components/_navigation.sass b/website/assets/css/_components/_navigation.sass index 5b7275f92..0e4af8267 100644 --- a/website/assets/css/_components/_navigation.sass +++ b/website/assets/css/_components/_navigation.sass @@ -1,22 +1,21 @@ //- 💫 CSS > COMPONENTS > NAVIGATION .c-nav - @include position(absolute, top, left, 0, 0) + @include position(fixed, top, left, 0, 0) @include size(100%, $nav-height) background: $color-back color: $color-theme align-items: center display: flex justify-content: space-between + flex-flow: row wrap padding: 0 2rem 0 1rem - z-index: 20 + z-index: 30 width: 100% - border-bottom: 1px solid $color-subtle + box-shadow: $box-shadow - &.c-nav--theme - background: $color-theme - color: $color-back - border-bottom: none + //@include breakpoint(min, md) + // position: fixed &.is-fixed animation: slideInDown 0.5s ease-in-out @@ -28,12 +27,21 @@ justify-content: flex-end flex-flow: row nowrap border-color: inherit + flex: 1 .c-nav__menu__item display: flex align-items: center height: 100% text-transform: uppercase + font-family: $font-secondary + font-size: 1.6rem + font-weight: bold + color: $color-theme - &:not(:last-child) - margin-right: 1em + &:not(:first-child) + margin-left: 2em + + &.is-active + color: $color-dark + pointer-events: none diff --git a/website/assets/css/_components/_progress.sass b/website/assets/css/_components/_progress.sass new file mode 100644 index 000000000..bbab0fddd --- /dev/null +++ b/website/assets/css/_components/_progress.sass @@ -0,0 +1,24 @@ +//- 💫 CSS > COMPONENTS > PROGRESS + +.c-progress + display: block + flex: 105% + width: 105% + height: 3px + color: $color-theme + background: transparent + border: none + position: absolute + bottom: 0 + left: -2.5% + + &::-webkit-progress-bar + background: $color-back + border-radius: none + + &::-webkit-progress-value + background: $color-theme + border-radius: none + + &::-moz-progress-bar + background: $color-theme diff --git a/website/assets/css/_components/_quickstart.sass b/website/assets/css/_components/_quickstart.sass index 1e7d0761a..6b02b3128 100644 --- a/website/assets/css/_components/_quickstart.sass +++ b/website/assets/css/_components/_quickstart.sass @@ -1,14 +1,17 @@ //- 💫 CSS > COMPONENTS > QUICKSTART .c-quickstart - border: 1px solid $color-subtle - border-radius: 2px + border-radius: $border-radius display: none background: $color-subtle-light &:not([style]) + .c-quickstart__info display: none + .c-code-block + border-top-left-radius: 0 + border-top-right-radius: 0 + .c-quickstart__content padding: 2rem 3rem @@ -72,7 +75,6 @@ flex: 100% .c-quickstart__legend - color: $color-subtle-dark margin-right: 2rem padding-top: 0.75rem flex: 1 1 35% @@ -95,4 +97,4 @@ padding: 1.5rem 0 .c-quickstart__code - font-size: 1.6rem + font-size: 1.4rem diff --git a/website/assets/css/_components/_sidebar.sass b/website/assets/css/_components/_sidebar.sass index d88588341..be3e34147 100644 --- a/website/assets/css/_components/_sidebar.sass +++ b/website/assets/css/_components/_sidebar.sass @@ -3,16 +3,15 @@ //- Sidebar container .c-sidebar - background: $color-subtle-light overflow-y: auto @include breakpoint(min, md) @include position(fixed, top, left, 0, 0) - @include size($sidebar-width, 100vh) + @include size($sidebar-width, calc(100vh - 3px)) + @include scroll-shadow($color-back, $color-front, $nav-height) flex: 0 0 $sidebar-width padding: calc(#{$nav-height} + 1.5rem) 0 0 z-index: 10 - border-right: 1px solid $color-subtle @include breakpoint(max, sm) flex: 100% @@ -27,7 +26,7 @@ .c-sidebar__section & > * - padding: 0 2rem + padding: 0 2rem 0.35rem @include breakpoint(max, sm) flex: 1 1 0 @@ -38,7 +37,59 @@ &:not(:last-child) border-right: 1px solid $color-subtle - .is-active +.c-sidebar__item + color: $color-theme + + &:hover + color: $color-theme-dark + + & > .is-active font-weight: bold - color: $color-theme - background: rgba($color-subtle, 0.4) + color: $color-dark + margin-top: 1rem + + +//- Sidebar subsections + +$crumb-bullet: 14px +$crumb-bar: 2px + +.c-sidebar__crumb + display: block + padding-top: 1rem + padding-left: 1rem + position: relative + +.c-sidebar__crumb__item + margin-bottom: $crumb-bullet / 2 + position: relative + padding-left: 2rem + color: $color-theme + font-size: 1.2rem + + &:hover + color: $color-theme-dark + + &:after + @include size($crumb-bullet) + @include position(absolute, top, left, $crumb-bullet / 4, 0) + content: "" + border-radius: 50% + background: $color-theme + z-index: 10 + + &:not(:last-child):before + @include size($crumb-bar, 100%) + @include position(absolute, top, left, $crumb-bullet, ($crumb-bullet - $crumb-bar) / 2) + content: "" + background: $color-subtle + + &:first-child:before + height: calc(100% + #{$crumb-bullet * 2}) + top: -$crumb-bullet / 2 + + &.is-active + color: $color-dark + + &:after + background: $color-dark diff --git a/website/assets/css/_components/_tables.sass b/website/assets/css/_components/_tables.sass index cbc861803..1878e2c5e 100644 --- a/website/assets/css/_components/_tables.sass +++ b/website/assets/css/_components/_tables.sass @@ -9,7 +9,7 @@ //- Table row .c-table__row - &:nth-child(odd) + &:nth-child(odd):not(.c-table__row--head) background: rgba($color-subtle-light, 0.35) &.c-table__row--foot @@ -38,7 +38,6 @@ .c-table__head-cell font-weight: bold color: $color-theme - background: $color-back padding: 1rem 0.5rem border-bottom: 2px solid $color-theme diff --git a/website/assets/css/_components/_tooltips.sass b/website/assets/css/_components/_tooltips.sass index e68f2875c..f9284dcdb 100644 --- a/website/assets/css/_components/_tooltips.sass +++ b/website/assets/css/_components/_tooltips.sass @@ -4,24 +4,34 @@ position: relative @include breakpoint(min, sm) + &[data-tooltip-style="code"]:before + -webkit-font-smoothing: subpixel-antialiased + -moz-osx-font-smoothing: auto + padding: 0.35em 0.85em 0.45em + font: normal 1rem/#{1.25} $font-code + white-space: nowrap + min-width: auto + &:before @include position(absolute, top, left, 125%, 50%) display: inline-block content: attr(data-tooltip) background: $color-front - border-radius: 2px + border-radius: $border-radius border: 1px solid rgba($color-subtle-dark, 0.5) color: $color-back - font: normal 1.3rem/#{1.25} $font-primary + font: normal 1.2rem/#{1.25} $font-primary text-transform: none + text-align: left opacity: 0 - padding: 0.5em 0.75em transform: translateX(-50%) translateY(-2px) transition: opacity 0.1s ease-out, transform 0.1s ease-out visibility: hidden - min-width: 200px max-width: 300px + min-width: 200px + padding: 0.75em 1em 1em z-index: 200 + white-space: pre-wrap &:hover:before opacity: 1 diff --git a/website/assets/css/_mixins.sass b/website/assets/css/_mixins.sass index e7e7a3432..641f6e148 100644 --- a/website/assets/css/_mixins.sass +++ b/website/assets/css/_mixins.sass @@ -42,8 +42,8 @@ // $scroll-shadow-side - side to cover shadow (left or right) // $scroll-shadow-background - original background color to match -@mixin scroll-shadow-base($scroll-shadow-color) - background: radial-gradient(left, ellipse, rgba(0,0,0, .2) 0%, rgba(0,0,0, 0) 75%) 0 center, radial-gradient(right, ellipse, rgba(0,0,0, .2) 0%, rgba(0,0,0, 0) 75%) 100% center +@mixin scroll-shadow-base($scroll-shadow-color, $scroll-shadow-intensity: 0.2) + background: radial-gradient(ellipse at 0 50%, rgba($scroll-shadow-color, $scroll-shadow-intensity) 0%, rgba(0,0,0,0) 75%) 0 center, radial-gradient(ellipse at 100% 50%, rgba($scroll-shadow-color, $scroll-shadow-intensity) 0%, transparent 75%) 100% center background-attachment: scroll, scroll background-repeat: no-repeat background-size: 10px 100%, 10px 100% @@ -58,3 +58,16 @@ background-image: linear-gradient(to #{$scroll-gradient-direction}, rgba($scroll-shadow-background, 1) 50%, rgba($scroll-shadow-background, 0) 100%) background-repeat: no-repeat background-size: 20px 100% + + +// Full vertical scroll shadows +// adapted from: https://codepen.io/laustdeleuran/pen/DBaAu + +@mixin scroll-shadow($background-color, $shadow-color, $shadow-offset: 0, $shadow-intensity: 0.4, $cover-size: 40px, $shadow-size: 15px) + background: linear-gradient($background-color 30%, rgba($background-color,0)) 0 $shadow-offset, linear-gradient(rgba($background-color,0), $background-color 70%) 0 100%, radial-gradient(50% 0, farthest-side, rgba($shadow-color,$shadow-intensity), rgba($shadow-color,0)) 0 $shadow-offset, radial-gradient(50% 100%,farthest-side, rgba($shadow-color,$shadow-intensity), rgba($shadow-color,0)) 0 100% + + background: linear-gradient($background-color 30%, rgba($background-color,0)) 0 $shadow-offset, linear-gradient(rgba($background-color,0), $background-color 70%) 0 100%, radial-gradient(farthest-side at 50% 0, rgba($shadow-color,$shadow-intensity), rgba($shadow-color,0)) -20px $shadow-offset, radial-gradient(farthest-side at 50% 100%, rgba($shadow-color, $shadow-intensity), rgba($shadow-color,0)) 0 100% + background-repeat: no-repeat + background-color: $background-color + background-size: 100% $cover-size, 100% $cover-size, 100% $shadow-size, 100% $shadow-size + background-attachment: local, local, scroll, scroll diff --git a/website/assets/css/_variables.sass b/website/assets/css/_variables.sass index 3ccf36f06..4fafbfca5 100644 --- a/website/assets/css/_variables.sass +++ b/website/assets/css/_variables.sass @@ -4,47 +4,48 @@ $type-base: 11px -$nav-height: 45px +$nav-height: 55px $content-width: 1250px -$sidebar-width: 200px -$aside-width: 30vw +$sidebar-width: 235px +$aside-width: 27.5vw $aside-padding: 25px +$border-radius: 6px $logo-width: 85px $logo-height: 27px $grid: ( quarter: 4, third: 3, half: 2, two-thirds: 1.5, three-quarters: 1.33 ) $breakpoints: ( sm: 768px, md: 992px, lg: 1200px ) -$headings: (1: 3, 2: 2.6, 3: 2, 4: 1.8, 5: 1.5) - +$headings: (1: 4.4, 2: 3.4, 3: 2.6, 4: 2.2, 5: 1.8) // Fonts -$font-primary: "Source Sans Pro", Tahoma, Geneva, sans-serif !default -$font-code: 'Source Code Pro', Consolas, 'Andale Mono', Menlo, Monaco, Courier, monospace !default - +$font-primary: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default +$font-secondary: "HK Grotesk" !default +$font-code: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default // Colors -$colors: ( blue: #09a3d5, red: #d9515d, green: #08c35e ) +$colors: ( blue: #09a3d5, green: #05b083 ) $color-back: #fff !default $color-front: #1a1e23 !default $color-dark: lighten($color-front, 20) !default $color-theme: map-get($colors, $theme) -$color-theme-dark: darken(map-get($colors, $theme), 5) +$color-theme-dark: darken(map-get($colors, $theme), 10) $color-theme-light: rgba($color-theme, 0.05) $color-subtle: #ddd !default $color-subtle-light: #f6f6f6 !default $color-subtle-dark: #949e9b !default -$color-red: #d9515d -$color-green: #3ec930 +$color-red: #ef476f +$color-green: #7ddf64 $color-yellow: #f4c025 $syntax-highlighting: ( comment: #949e9b, tag: #b084eb, number: #b084eb, selector: #ffb86c, operator: #ff2c6d, function: #35b3dc, keyword: #ff2c6d, regex: #f4c025 ) $pattern: $color-theme url("/assets/img/pattern_#{$theme}.jpg") center top repeat $pattern-overlay: transparent url("/assets/img/pattern_landing.jpg") center -138px no-repeat +$box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2) diff --git a/website/assets/css/style.sass b/website/assets/css/style.sass index eaf7cdf70..47cf3f1b5 100644 --- a/website/assets/css/style.sass +++ b/website/assets/css/style.sass @@ -30,6 +30,7 @@ $theme: blue !default @import _components/lists @import _components/misc @import _components/navigation +@import _components/progress @import _components/sidebar @import _components/tables @import _components/quickstart diff --git a/website/assets/css/style_red.sass b/website/assets/css/style_red.sass deleted file mode 100644 index 83fe330b9..000000000 --- a/website/assets/css/style_red.sass +++ /dev/null @@ -1,4 +0,0 @@ -//- 💫 STYLESHEET (RED) - -$theme: red -@import style From 7d01d7411b8e5ed8f8abd3c1ee9287147070057a Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 3 Oct 2017 14:15:36 +0200 Subject: [PATCH 167/649] Update web fonts --- website/assets/fonts/hkgrotesk-bold.woff | Bin 0 -> 31224 bytes website/assets/fonts/hkgrotesk-bold.woff2 | Bin 0 -> 24676 bytes .../assets/fonts/hkgrotesk-bolditalic.woff | Bin 0 -> 33256 bytes .../assets/fonts/hkgrotesk-bolditalic.woff2 | Bin 0 -> 26248 bytes website/assets/fonts/hkgrotesk-semibold.woff | Bin 0 -> 31812 bytes website/assets/fonts/hkgrotesk-semibold.woff2 | Bin 0 -> 25092 bytes .../fonts/hkgrotesk-semibolditalic.woff | Bin 0 -> 34196 bytes .../fonts/hkgrotesk-semibolditalic.woff2 | Bin 0 -> 26908 bytes .../assets/fonts/sourcecodepro-semibold.eot | Bin 24976 -> 0 bytes .../assets/fonts/sourcecodepro-semibold.svg | 244 ---- .../assets/fonts/sourcecodepro-semibold.ttf | Bin 55544 -> 0 bytes .../assets/fonts/sourcecodepro-semibold.woff | Bin 27952 -> 0 bytes website/assets/fonts/sourcesanspro-bold.eot | Bin 89026 -> 0 bytes website/assets/fonts/sourcesanspro-bold.svg | 1031 ---------------- website/assets/fonts/sourcesanspro-bold.ttf | Bin 88820 -> 0 bytes website/assets/fonts/sourcesanspro-bold.woff | Bin 33612 -> 0 bytes website/assets/fonts/sourcesanspro-bold.woff2 | Bin 26800 -> 0 bytes .../assets/fonts/sourcesanspro-bolditalic.eot | Bin 55994 -> 0 bytes .../assets/fonts/sourcesanspro-bolditalic.svg | 840 ------------- .../assets/fonts/sourcesanspro-bolditalic.ttf | Bin 55764 -> 0 bytes .../fonts/sourcesanspro-bolditalic.woff | Bin 28960 -> 0 bytes .../fonts/sourcesanspro-bolditalic.woff2 | Bin 22492 -> 0 bytes website/assets/fonts/sourcesanspro-italic.eot | Bin 56574 -> 0 bytes website/assets/fonts/sourcesanspro-italic.svg | 852 -------------- website/assets/fonts/sourcesanspro-italic.ttf | Bin 56360 -> 0 bytes .../assets/fonts/sourcesanspro-italic.woff | Bin 28844 -> 0 bytes .../assets/fonts/sourcesanspro-italic.woff2 | Bin 22488 -> 0 bytes .../assets/fonts/sourcesanspro-regular.eot | Bin 90326 -> 0 bytes .../assets/fonts/sourcesanspro-regular.svg | 1039 ----------------- .../assets/fonts/sourcesanspro-regular.ttf | Bin 90112 -> 0 bytes .../assets/fonts/sourcesanspro-regular.woff | Bin 34096 -> 0 bytes .../assets/fonts/sourcesanspro-regular.woff2 | Bin 27292 -> 0 bytes 32 files changed, 4006 deletions(-) create mode 100755 website/assets/fonts/hkgrotesk-bold.woff create mode 100755 website/assets/fonts/hkgrotesk-bold.woff2 create mode 100755 website/assets/fonts/hkgrotesk-bolditalic.woff create mode 100755 website/assets/fonts/hkgrotesk-bolditalic.woff2 create mode 100755 website/assets/fonts/hkgrotesk-semibold.woff create mode 100755 website/assets/fonts/hkgrotesk-semibold.woff2 create mode 100755 website/assets/fonts/hkgrotesk-semibolditalic.woff create mode 100755 website/assets/fonts/hkgrotesk-semibolditalic.woff2 delete mode 100644 website/assets/fonts/sourcecodepro-semibold.eot delete mode 100644 website/assets/fonts/sourcecodepro-semibold.svg delete mode 100644 website/assets/fonts/sourcecodepro-semibold.ttf delete mode 100644 website/assets/fonts/sourcecodepro-semibold.woff delete mode 100644 website/assets/fonts/sourcesanspro-bold.eot delete mode 100644 website/assets/fonts/sourcesanspro-bold.svg delete mode 100644 website/assets/fonts/sourcesanspro-bold.ttf delete mode 100644 website/assets/fonts/sourcesanspro-bold.woff delete mode 100644 website/assets/fonts/sourcesanspro-bold.woff2 delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.eot delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.svg delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.ttf delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.woff delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.woff2 delete mode 100644 website/assets/fonts/sourcesanspro-italic.eot delete mode 100644 website/assets/fonts/sourcesanspro-italic.svg delete mode 100644 website/assets/fonts/sourcesanspro-italic.ttf delete mode 100644 website/assets/fonts/sourcesanspro-italic.woff delete mode 100644 website/assets/fonts/sourcesanspro-italic.woff2 delete mode 100644 website/assets/fonts/sourcesanspro-regular.eot delete mode 100644 website/assets/fonts/sourcesanspro-regular.svg delete mode 100644 website/assets/fonts/sourcesanspro-regular.ttf delete mode 100644 website/assets/fonts/sourcesanspro-regular.woff delete mode 100644 website/assets/fonts/sourcesanspro-regular.woff2 diff --git a/website/assets/fonts/hkgrotesk-bold.woff b/website/assets/fonts/hkgrotesk-bold.woff new file mode 100755 index 0000000000000000000000000000000000000000..41e8651c329fa923448b4bda853de03f001883fc GIT binary patch literal 31224 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 z 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 literal 0 HcmV?d00001 diff --git a/website/assets/fonts/hkgrotesk-semibold.woff2 b/website/assets/fonts/hkgrotesk-semibold.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..6c52d924569beb719c42d85a05f4e0f9823571c4 GIT binary patch literal 25092 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%0D&cnZO7r_6 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcesanspro-bold.ttf b/website/assets/fonts/sourcesanspro-bold.ttf deleted file mode 100644 index 4619eef6bb3477233ad8f5f64ac818dcf6c459ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88820 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 S-L}|cikNiUXFnOj*#83LCq0e; diff --git a/website/assets/fonts/sourcesanspro-bold.woff b/website/assets/fonts/sourcesanspro-bold.woff deleted file mode 100644 index 3257aeddf27c40f6d920b23d272ab8d25e77c98d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33612 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 X!MKqdM6>~IswnaR00CF(yE*^>v(EHK diff --git a/website/assets/fonts/sourcesanspro-bold.woff2 b/website/assets/fonts/sourcesanspro-bold.woff2 deleted file mode 100644 index 42b02574f7ee2144c72afd74143073894ce064e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26800 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

V_Yi6u`q zh`YVLB|hAF_)GXjY@_Yflk^F*y)a!|YqD81UYahREQ*rNS6HrIVo?=Tx9JqdYg$m} jE}&o7JS_dk(%JWn71cuHQLnwMhW&8oGk~`Kcy0gy9YLk7 diff --git a/website/assets/fonts/sourcesanspro-bolditalic.eot b/website/assets/fonts/sourcesanspro-bolditalic.eot deleted file mode 100644 index da15809396149125a0cb79eb02852a281e7cfb3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55994 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

2^By#(L6k#h&l&~lKP$BuT< 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 i2VLutI17FU{+xaqgHy{Y{dAVw3NnB+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcesanspro-bolditalic.ttf b/website/assets/fonts/sourcesanspro-bolditalic.ttf deleted file mode 100644 index ae8b0816668b20b1cfd7b8a733540d85ac5ea446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55764 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 OfjA(|{^*x5P5n1?1pB)H diff --git a/website/assets/fonts/sourcesanspro-bolditalic.woff b/website/assets/fonts/sourcesanspro-bolditalic.woff deleted file mode 100644 index 3ac22abd8631f3d6052761e9f1d4a49a81363ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28960 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 diff --git a/website/assets/fonts/sourcesanspro-italic.eot b/website/assets/fonts/sourcesanspro-italic.eot deleted file mode 100644 index a5d050e7524b7604484109342898c38e44ce937e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56574 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 diff --git a/website/assets/fonts/sourcesanspro-italic.svg b/website/assets/fonts/sourcesanspro-italic.svg deleted file mode 100644 index bf0f85da9..000000000 --- a/website/assets/fonts/sourcesanspro-italic.svg +++ /dev/null @@ -1,852 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcesanspro-italic.ttf b/website/assets/fonts/sourcesanspro-italic.ttf deleted file mode 100644 index f17a128568ee036dd2faaba08b7409818c0876c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56360 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%0D% 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 diff --git a/website/assets/fonts/sourcesanspro-italic.woff b/website/assets/fonts/sourcesanspro-italic.woff deleted file mode 100644 index 32c1e1962b60de2c6d1974f41288042f9ed59953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28844 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 diff --git a/website/assets/fonts/sourcesanspro-italic.woff2 b/website/assets/fonts/sourcesanspro-italic.woff2 deleted file mode 100644 index c3d399f8c041bb4c69d24eddf2429461f1651365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22488 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 diff --git a/website/assets/fonts/sourcesanspro-regular.svg b/website/assets/fonts/sourcesanspro-regular.svg deleted file mode 100644 index 27d435ad9..000000000 --- a/website/assets/fonts/sourcesanspro-regular.svg +++ /dev/null @@ -1,1039 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcesanspro-regular.ttf b/website/assets/fonts/sourcesanspro-regular.ttf deleted file mode 100644 index 0bb5057904308ba09bfae7b1a6657dfff683625e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 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 diff --git a/website/assets/fonts/sourcesanspro-regular.woff b/website/assets/fonts/sourcesanspro-regular.woff deleted file mode 100644 index aa0503cac85f92c25d370305b4325626e8cd02d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34096 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

~S}J4)I@oZ+|Z< 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 diff --git a/website/assets/fonts/sourcesanspro-regular.woff2 b/website/assets/fonts/sourcesanspro-regular.woff2 deleted file mode 100644 index 06206e4836a9ea8f68abd17650034f1880dd96ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27292 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 H`W*lO$7q<~ From a8ff8423bb2ecc0b6da3536aeddcf261d80be00c Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 3 Oct 2017 14:17:41 +0200 Subject: [PATCH 168/649] Update image assets, icons and SVGs Move SVG sprite to Jade file and include in template. Only use SVG symbols for logos. --- website/_includes/_svg.jade | 157 ++++++++++++++++++ website/_layout.jade | 1 + .../assets/img/{docs => }/architecture.svg | 34 ++-- .../img/{docs => }/displacy_jupyter.jpg | Bin website/assets/img/graphics.svg | 84 ---------- website/assets/img/icons.svg | 43 ----- .../assets/img/{docs => }/language_data.svg | 31 ++-- website/assets/img/logo.svg | 2 +- website/assets/img/logos/chartbeat.png | Bin 2761 -> 0 bytes website/assets/img/logos/chattermill.png | Bin 6351 -> 0 bytes website/assets/img/logos/cytora.png | Bin 3028 -> 0 bytes website/assets/img/logos/duedil.png | Bin 4254 -> 0 bytes website/assets/img/logos/indico.png | Bin 1668 -> 0 bytes website/assets/img/logos/kip.png | Bin 1770 -> 0 bytes website/assets/img/logos/quora.png | Bin 4705 -> 0 bytes website/assets/img/logos/signaln.png | Bin 3321 -> 0 bytes website/assets/img/logos/socrata.png | Bin 5121 -> 0 bytes website/assets/img/logos/stitchfix.png | Bin 1993 -> 0 bytes website/assets/img/logos/synapsify.png | Bin 2532 -> 0 bytes website/assets/img/logos/turi.png | Bin 2915 -> 0 bytes website/assets/img/logos/wayblazer.png | Bin 2306 -> 0 bytes website/assets/img/logos/wonderflow.png | Bin 2626 -> 0 bytes website/assets/img/pattern_green.jpg | Bin 221731 -> 232481 bytes website/assets/img/{docs => }/pipeline.svg | 6 +- .../{showcase => resources}/displacy-ent.jpg | Bin .../img/{showcase => resources}/displacy.jpg | Bin website/assets/img/resources/neuralcoref.jpg | Bin 0 -> 31380 bytes .../img/{showcase => resources}/sense2vec.jpg | Bin website/assets/img/showcase/foxtype.jpg | Bin 27435 -> 0 bytes website/assets/img/showcase/indico.jpg | Bin 33559 -> 0 bytes website/assets/img/showcase/kip.jpg | Bin 28937 -> 0 bytes website/assets/img/showcase/laice.jpg | Bin 9263 -> 0 bytes website/assets/img/showcase/textanalysis.jpg | Bin 16789 -> 0 bytes website/assets/img/showcase/truthbot.jpg | Bin 24521 -> 0 bytes website/assets/img/social/preview_101.jpg | Bin 388748 -> 383381 bytes website/assets/img/social/preview_alpha.jpg | Bin 382786 -> 386720 bytes website/assets/img/social/preview_docs.jpg | Bin 258021 -> 0 bytes .../assets/img/{docs => }/tokenization.svg | 4 +- .../assets/img/{docs => }/training-loop.svg | 4 +- website/assets/img/{docs => }/training.svg | 4 +- .../img/{docs => }/vocab_stringstore.svg | 8 +- 41 files changed, 208 insertions(+), 170 deletions(-) create mode 100644 website/_includes/_svg.jade rename website/assets/img/{docs => }/architecture.svg (91%) rename website/assets/img/{docs => }/displacy_jupyter.jpg (100%) delete mode 100644 website/assets/img/graphics.svg delete mode 100644 website/assets/img/icons.svg rename website/assets/img/{docs => }/language_data.svg (88%) delete mode 100644 website/assets/img/logos/chartbeat.png delete mode 100644 website/assets/img/logos/chattermill.png delete mode 100644 website/assets/img/logos/cytora.png delete mode 100644 website/assets/img/logos/duedil.png delete mode 100644 website/assets/img/logos/indico.png delete mode 100644 website/assets/img/logos/kip.png delete mode 100644 website/assets/img/logos/quora.png delete mode 100644 website/assets/img/logos/signaln.png delete mode 100644 website/assets/img/logos/socrata.png delete mode 100644 website/assets/img/logos/stitchfix.png delete mode 100644 website/assets/img/logos/synapsify.png delete mode 100644 website/assets/img/logos/turi.png delete mode 100644 website/assets/img/logos/wayblazer.png delete mode 100644 website/assets/img/logos/wonderflow.png rename website/assets/img/{docs => }/pipeline.svg (92%) rename website/assets/img/{showcase => resources}/displacy-ent.jpg (100%) rename website/assets/img/{showcase => resources}/displacy.jpg (100%) create mode 100644 website/assets/img/resources/neuralcoref.jpg rename website/assets/img/{showcase => resources}/sense2vec.jpg (100%) delete mode 100644 website/assets/img/showcase/foxtype.jpg delete mode 100644 website/assets/img/showcase/indico.jpg delete mode 100644 website/assets/img/showcase/kip.jpg delete mode 100644 website/assets/img/showcase/laice.jpg delete mode 100644 website/assets/img/showcase/textanalysis.jpg delete mode 100644 website/assets/img/showcase/truthbot.jpg delete mode 100644 website/assets/img/social/preview_docs.jpg rename website/assets/img/{docs => }/tokenization.svg (98%) rename website/assets/img/{docs => }/training-loop.svg (95%) rename website/assets/img/{docs => }/training.svg (95%) rename website/assets/img/{docs => }/vocab_stringstore.svg (94%) diff --git a/website/_includes/_svg.jade b/website/_includes/_svg.jade new file mode 100644 index 000000000..f9d7a2b53 --- /dev/null +++ b/website/_includes/_svg.jade @@ -0,0 +1,157 @@ +//- 💫 INCLUDES > SVG + +svg(style="position: absolute; visibility: hidden; width: 0; height: 0;" width="0" height="0" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink") + defs + //- UI icons + + symbol#svg_github(viewBox="0 0 27 32") + path(d="M13.714 2.286q3.732 0 6.884 1.839t4.991 4.991 1.839 6.884q0 4.482-2.616 8.063t-6.759 4.955q-0.482 0.089-0.714-0.125t-0.232-0.536q0-0.054 0.009-1.366t0.009-2.402q0-1.732-0.929-2.536 1.018-0.107 1.83-0.321t1.679-0.696 1.446-1.188 0.946-1.875 0.366-2.688q0-2.125-1.411-3.679 0.661-1.625-0.143-3.643-0.5-0.161-1.446 0.196t-1.643 0.786l-0.679 0.429q-1.661-0.464-3.429-0.464t-3.429 0.464q-0.286-0.196-0.759-0.482t-1.491-0.688-1.518-0.241q-0.804 2.018-0.143 3.643-1.411 1.554-1.411 3.679 0 1.518 0.366 2.679t0.938 1.875 1.438 1.196 1.679 0.696 1.83 0.321q-0.696 0.643-0.875 1.839-0.375 0.179-0.804 0.268t-1.018 0.089-1.17-0.384-0.991-1.116q-0.339-0.571-0.866-0.929t-0.884-0.429l-0.357-0.054q-0.375 0-0.518 0.080t-0.089 0.205 0.161 0.25 0.232 0.214l0.125 0.089q0.393 0.179 0.777 0.679t0.563 0.911l0.179 0.411q0.232 0.679 0.786 1.098t1.196 0.536 1.241 0.125 0.991-0.063l0.411-0.071q0 0.679 0.009 1.58t0.009 0.973q0 0.321-0.232 0.536t-0.714 0.125q-4.143-1.375-6.759-4.955t-2.616-8.063q0-3.732 1.839-6.884t4.991-4.991 6.884-1.839zM5.196 21.982q0.054-0.125-0.125-0.214-0.179-0.054-0.232 0.036-0.054 0.125 0.125 0.214 0.161 0.107 0.232-0.036zM5.75 22.589q0.125-0.089-0.036-0.286-0.179-0.161-0.286-0.054-0.125 0.089 0.036 0.286 0.179 0.179 0.286 0.054zM6.286 23.393q0.161-0.125 0-0.339-0.143-0.232-0.304-0.107-0.161 0.089 0 0.321t0.304 0.125zM7.036 24.143q0.143-0.143-0.071-0.339-0.214-0.214-0.357-0.054-0.161 0.143 0.071 0.339 0.214 0.214 0.357 0.054zM8.054 24.589q0.054-0.196-0.232-0.286-0.268-0.071-0.339 0.125t0.232 0.268q0.268 0.107 0.339-0.107zM9.179 24.679q0-0.232-0.304-0.196-0.286 0-0.286 0.196 0 0.232 0.304 0.196 0.286 0 0.286-0.196zM10.214 24.5q-0.036-0.196-0.321-0.161-0.286 0.054-0.25 0.268t0.321 0.143 0.25-0.25z") + + symbol#svg_code(viewBox="0 0 20 20") + path(d="M5.719 14.75c-0.236 0-0.474-0.083-0.664-0.252l-5.060-4.498 5.341-4.748c0.412-0.365 1.044-0.33 1.411 0.083s0.33 1.045-0.083 1.412l-3.659 3.253 3.378 3.002c0.413 0.367 0.45 0.999 0.083 1.412-0.197 0.223-0.472 0.336-0.747 0.336zM14.664 14.748l5.341-4.748-5.060-4.498c-0.413-0.367-1.045-0.33-1.411 0.083s-0.33 1.045 0.083 1.412l3.378 3.003-3.659 3.252c-0.413 0.367-0.45 0.999-0.083 1.412 0.197 0.223 0.472 0.336 0.747 0.336 0.236 0 0.474-0.083 0.664-0.252zM9.986 16.165l2-12c0.091-0.545-0.277-1.060-0.822-1.151-0.547-0.092-1.061 0.277-1.15 0.822l-2 12c-0.091 0.545 0.277 1.060 0.822 1.151 0.056 0.009 0.11 0.013 0.165 0.013 0.48 0 0.904-0.347 0.985-0.835z") + + symbol#svg_arrow-right(viewBox="0 0 24 24") + path(d="M20.744 12.669c0 0 0 0 0 0 0.006-0.006 0.006-0.006 0.006-0.006s0 0 0 0 0.006-0.006 0.006-0.006c0 0 0.006-0.006 0.006-0.006s0 0 0 0 0.006-0.006 0.006-0.006c0 0 0 0 0 0 0.063-0.075 0.112-0.156 0.15-0.244 0 0 0 0 0-0.006 0 0 0-0.006 0-0.006s0-0.006 0-0.006c0 0 0 0 0 0 0.038-0.094 0.063-0.194 0.069-0.3 0 0 0 0 0 0s0-0.006 0-0.006c0 0 0-0.006 0-0.006s0-0.006 0-0.006c0 0 0-0.006 0-0.006s0 0 0-0.006c0-0.025 0-0.050 0-0.075 0 0 0 0 0-0.006 0 0 0-0.006 0-0.006s0-0.006 0-0.006c0 0 0-0.006 0-0.006s0-0.006 0-0.006c0 0 0 0 0 0-0.006-0.106-0.031-0.206-0.069-0.3 0 0 0 0 0-0.006 0 0 0 0 0-0.006 0 0 0-0.006-0.006-0.006 0 0 0 0 0 0-0.038-0.094-0.094-0.175-0.156-0.256 0 0 0 0 0 0s-0.006-0.006-0.006-0.006c0 0 0 0 0 0s-0.006-0.006-0.006-0.006-0.006-0.006-0.006-0.006 0 0 0-0.006c-0.012-0.012-0.025-0.025-0.037-0.037l-6-6c-0.387-0.387-1.025-0.387-1.413 0s-0.387 1.025 0 1.413l4.294 4.294h-13.581c-0.55 0-1 0.45-1 1s0.45 1 1 1h13.587l-4.294 4.294c-0.387 0.387-0.387 1.025 0 1.413 0.194 0.194 0.45 0.294 0.706 0.294s0.513-0.1 0.706-0.294l5.994-5.994c0.019-0.025 0.031-0.044 0.044-0.056z") + + symbol#svg_book(viewBox="0 0 20 20") + path(d="M15.5 11h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM15.5 7h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM10.5 15h-6c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h6c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM15.5 3h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5z") + + symbol#svg_circle(viewBox="0 0 18 18") + ellipse(rx="9" ry="9" cx="9" cy="9") + + symbol#svg_chat(viewBox="0 0 30 30") + path(d="M28.74 25.2c-1.73-.3-3.77-1.46-4.74-3.6 3.64-2.2 6-5.68 6-9.6 0-6.63-6.72-12-15-12S0 5.37 0 12s6.72 12 15 12c1.1 0 2.2-.1 3.23-.3 2.86 2 6.25 2.62 10.4 2.15.26-.02.37-.15.37-.32 0-.16-.1-.3-.26-.32zM23 14c0 .55-.45 1-1 1H8c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1zm0-4c0 .55-.45 1-1 1H8c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1z") + + symbol#svg_star(viewBox="0 0 24 24") + path(d="M12 17.25l-6.188 3.75 1.641-7.031-5.438-4.734 7.172-0.609 2.813-6.609 2.813 6.609 7.172 0.609-5.438 4.734 1.641 7.031z") + + symbol#svg_help(viewBox="0 0 24 24") + path(d="M12 6c2.203 0 3.984 1.781 3.984 3.984 0 2.484-3 2.766-3 5.016h-1.969c0-3.234 3-3 3-5.016 0-1.078-0.938-1.969-2.016-1.969s-2.016 0.891-2.016 1.969h-1.969c0-2.203 1.781-3.984 3.984-3.984zM12 20.016c4.406 0 8.016-3.609 8.016-8.016s-3.609-8.016-8.016-8.016-8.016 3.609-8.016 8.016 3.609 8.016 8.016 8.016zM12 2.016c5.531 0 9.984 4.453 9.984 9.984s-4.453 9.984-9.984 9.984-9.984-4.453-9.984-9.984 4.453-9.984 9.984-9.984zM11.016 18v-2.016h1.969v2.016h-1.969z") + + symbol#svg_reject(viewBox="0 0 24 24") + path(d="M18.984 6.422l-5.578 5.578 5.578 5.578-1.406 1.406-5.578-5.578-5.578 5.578-1.406-1.406 5.578-5.578-5.578-5.578 1.406-1.406 5.578 5.578 5.578-5.578z") + + symbol#svg_accept(viewBox="0 0 24 24") + path(d="M9 16.172l10.594-10.594 1.406 1.406-12 12-5.578-5.578 1.406-1.406z") + + symbol#svg_markdown(viewBox="0 0 32 32") + path(d="M29.692 6h-27.385c-1.272 0-2.308 1.035-2.308 2.308v15.385c0 1.273 1.035 2.308 2.308 2.308h27.385c1.273 0 2.308-1.035 2.308-2.308v-15.385c0-1.272-1.035-2.308-2.308-2.308zM18 21.996l-4 0.004v-6l-3 3.846-3-3.846v6h-4v-12h4l3 4 3-4 4-0.004v12zM23.972 22.996l-4.972-6.996h3v-6h4v6h3l-5.028 6.996z") + + symbol#svg_course(viewBox="0 0 20 20") + path(d="M3.302 12.238c0.464 1.879 1.054 2.701 3.022 3.562 1.969 0.86 2.904 1.8 3.676 1.8s1.648-0.822 3.616-1.684c1.969-0.861 1.443-1.123 1.907-3.002l-5.523 2.686-6.698-3.362zM19.511 7.336l-8.325-4.662c-0.652-0.365-1.72-0.365-2.372 0l-8.326 4.662c-0.652 0.365-0.652 0.963 0 1.328l8.325 4.662c0.652 0.365 1.72 0.365 2.372 0l5.382-3.014-5.836-1.367c-0.225 0.055-0.472 0.086-0.731 0.086-1.052 0-1.904-0.506-1.904-1.131 0-0.627 0.853-1.133 1.904-1.133 0.816 0 1.51 0.307 1.78 0.734l6.182 2.029 1.549-0.867c0.651-0.364 0.651-0.962 0-1.327zM16.967 16.17c-0.065 0.385 1.283 1.018 1.411-0.107 0.579-5.072-0.416-6.531-0.416-6.531l-1.395 0.781c0-0.001 1.183 1.125 0.4 5.857z") + + symbol#svg_jupyter(viewBox="245 20 270 270") + path(d="M379.3 231.3c-42.6 0-79.7-15.3-99-38 14.6 40.6 53.4 69.6 99 69.6 45.5 0 84.3-29 99-69.7-19.4 22.7-56.5 38-99 38M379.3 84c42.5 0 79.6 15.4 99 38-14.7-40.6-53.5-69.6-99-69.6-45.6 0-84.4 29-99 69.6 19.3-22.6 56.4-38 99-38") + path(d="M299.5 286c-9.2.3-17-6.8-17.3-16-.4-9 6.7-16.8 15.8-17.2 9.2-.4 17 6.7 17.3 15.8.4 9.2-6.7 17-15.8 17.3zM286.8 70.4c-5.7.2-10.6-4.2-10.8-10-.3-5.6 4.2-10.5 10-10.7 5.6-.2 10.4 4.2 10.6 10 .3 5.6-4 10.4-9.8 10.7zM451 58c-9 .5-16.4-6.4-16.8-15.3-.3-8.8 6.5-16.3 15.4-16.7 9-.4 16.4 6.5 16.7 15.4.4 8.8-6.5 16.3-15.3 16.7z" ) + + + //- Logos + + symbol#svg_spacy(viewBox="0 0 675 215") + path(fill="currentColor" d="M83.6 83.3C68.3 81.5 67.2 61 47.5 62.8c-9.5 0-18.4 4-18.4 12.7 0 13.2 20.3 14.4 32.5 17.7 20.9 6.3 41 10.7 41 33.3 0 28.8-22.6 38.8-52.4 38.8-24.9 0-50.2-8.9-50.2-31.8 0-6.4 6.1-11.3 12-11.3 7.5 0 10.1 3.2 12.7 8.4 5.8 10.2 12.3 15.6 28.3 15.6 10.2 0 20.6-3.9 20.6-12.7 0-12.6-12.8-15.3-26.1-18.4-23.5-6.6-43.6-10-46-36.1C-1 34.5 91.7 32.9 97 71.9c.1 7.1-6.5 11.4-13.4 11.4zm110.2-39c32.5 0 51 27.2 51 60.8 0 33.7-17.9 60.8-51 60.8-18.4 0-29.8-7.8-38.1-19.8v44.5c0 13.4-4.3 19.8-14.1 19.8-11.9 0-14.1-7.6-14.1-19.8V61.3c0-10.6 4.4-17 14.1-17 9.1 0 14.1 7.2 14.1 17v3.6c9.2-11.6 19.7-20.6 38.1-20.6zm-7.7 98.4c19.1 0 27.6-17.6 27.6-38.1 0-20.1-8.6-38.1-27.6-38.1-19.8 0-29 16.3-29 38.1 0 21.2 9.2 38.1 29 38.1zM266.9 76c0-23.4 26.9-31.7 52.9-31.7 36.6 0 51.7 10.7 51.7 46v34c0 8.1 5 24.1 5 29 0 7.4-6.8 12-14.1 12-8.1 0-14.1-9.5-18.4-16.3-11.9 9.5-24.5 16.3-43.8 16.3-21.3 0-38.1-12.6-38.1-33.3 0-18.4 13.2-28.9 29-32.5 0 .1 51-12 51-12.1 0-15.7-5.5-22.6-22-22.6-14.5 0-21.9 4-27.5 12.7-4.5 6.6-4 10.6-12.7 10.6-6.9-.1-13-4.9-13-12.1zm43.6 70.2c22.3 0 31.8-11.8 31.8-35.3v-5c-6 2-30.3 8-36.8 9.1-7 1.4-14.1 6.6-14.1 14.9.1 9.1 9.4 16.3 19.1 16.3zM474.5 0c31.5 0 65.7 18.8 65.7 48.8 0 7.7-5.8 14.1-13.4 14.1-10.3 0-11.8-5.5-16.3-13.4-7.6-13.9-16.5-23.3-36.1-23.3-30.2-.2-43.7 25.6-43.7 57.8 0 32.4 11.2 55.8 42.4 55.8 20.7 0 32.2-12 38.1-27.6 2.4-7.1 6.7-14.1 15.6-14.1 7 0 14.1 7.2 14.1 14.8 0 31.8-32.4 53.8-65.8 53.8-36.5 0-57.2-15.4-68.5-41-5.5-12.2-9.1-24.9-9.1-42.4-.1-49.2 28.6-83.3 77-83.3zm180.3 44.3c8 0 12.7 5.2 12.7 13.4 0 3.3-2.6 9.9-3.6 13.4L625.1 173c-8.6 22.1-15.1 37.4-44.5 37.4-14 0-26.1-1.2-26.1-13.4 0-7 5.3-10.6 12.7-10.6 1.4 0 3.6.7 5 .7 2.1 0 3.6.7 5 .7 14.7 0 16.8-15.1 22-25.5l-37.4-92.6c-2.1-5-3.6-8.4-3.6-11.3 0-8.2 6.4-14.1 14.8-14.1 9.5 0 13.3 7.5 15.6 15.6l24.7 73.5L638 65.5c3.9-10.5 4.2-21.2 16.8-21.2z" ) + + symbol#svg_explosion(viewBox="0 0 500 500") + path(fill="currentColor" d="M111.7 74.9L91.2 93.1l9.1 10.2 17.8-15.8 7.4 8.4-17.8 15.8 10.1 11.4 20.6-18.2 7.7 8.7-30.4 26.9-41.9-47.3 30.3-26.9 7.6 8.6zM190.8 59.6L219 84.3l-14.4 4.5-20.4-18.2-6.4 26.6-14.4 4.5 8.9-36.4-26.9-24.1 14.3-4.5L179 54.2l5.7-25.2 14.3-4.5-8.2 35.1zM250.1 21.2l27.1 3.4c6.1.8 10.8 3.1 14 7.2 3.2 4.1 4.5 9.2 3.7 15.5-.8 6.3-3.2 11-7.4 14.1-4.1 3.1-9.2 4.3-15.3 3.5L258 63.2l-2.8 22.3-13-1.6 7.9-62.7zm11.5 13l-2.2 17.5 12.6 1.6c5.1.6 9.1-2 9.8-7.6.7-5.6-2.5-9.2-7.6-9.9l-12.6-1.6zM329.1 95.4l23.8 13.8-5.8 10L312 98.8l31.8-54.6 11.3 6.6-26 44.6zM440.5 145c-1.3 8.4-5.9 15.4-13.9 21.1s-16.2 7.7-24.6 6.1c-8.4-1.6-15.3-6.3-20.8-14.1-5.5-7.9-7.6-16-6.4-24.4 1.3-8.5 6-15.5 14-21.1 8-5.6 16.2-7.7 24.5-6 8.4 1.6 15.4 6.3 20.9 14.2 5.5 7.6 7.6 15.7 6.3 24.2zM412 119c-5.1-.8-10.3.6-15.6 4.4-5.2 3.7-8.4 8.1-9.4 13.2-1 5.2.2 10.1 3.5 14.8 3.4 4.8 7.5 7.5 12.7 8.2 5.2.8 10.4-.7 15.6-4.4 5.3-3.7 8.4-8.1 9.4-13.2 1.1-5.1-.1-9.9-3.4-14.7-3.4-4.8-7.6-7.6-12.8-8.3zM471.5 237.9c-2.8 4.8-7.1 7.6-13 8.7l-2.6-13.1c5.3-.9 8.1-5 7.2-11-.9-5.8-4.3-8.8-8.9-8.2-2.3.3-3.7 1.4-4.5 3.3-.7 1.9-1.4 5.2-1.7 10.1-.8 7.5-2.2 13.1-4.3 16.9-2.1 3.9-5.7 6.2-10.9 7-6.3.9-11.3-.5-15.2-4.4-3.9-3.8-6.3-9-7.3-15.7-1.1-7.4-.2-13.7 2.6-18.8 2.8-5.1 7.4-8.2 13.7-9.2l2.6 13c-5.6 1.1-8.7 6.6-7.7 13.4 1 6.6 3.9 9.5 8.6 8.8 4.4-.7 5.7-4.5 6.7-14.1.3-3.5.7-6.2 1.1-8.4.4-2.2 1.2-4.4 2.2-6.8 2.1-4.7 6-7.2 11.8-8.1 5.4-.8 10.3.4 14.5 3.7 4.2 3.3 6.9 8.5 8 15.6.9 6.9-.1 12.6-2.9 17.3zM408.6 293.5l2.4-12.9 62 11.7-2.4 12.9-62-11.7zM419.6 396.9c-8.3 2-16.5.3-24.8-5-8.2-5.3-13.2-12.1-14.9-20.5-1.6-8.4.1-16.6 5.3-24.6 5.2-8.1 11.9-13.1 20.2-15.1 8.4-1.9 16.6-.3 24.9 5 8.2 5.3 13.2 12.1 14.8 20.5 1.7 8.4 0 16.6-5.2 24.7-5.2 8-12 13-20.3 15zm13.4-36.3c-1.2-5.1-4.5-9.3-9.9-12.8s-10.6-4.7-15.8-3.7-9.3 4-12.4 8.9-4.1 9.8-2.8 14.8c1.2 5.1 4.5 9.3 9.9 12.8 5.5 3.5 10.7 4.8 15.8 3.7 5.1-.9 9.2-3.8 12.3-8.7s4.1-9.9 2.9-15zM303.6 416.5l9.6-5.4 43.3 20.4-19.2-34 11.4-6.4 31 55-9.6 5.4-43.4-20.5 19.2 34.1-11.3 6.4-31-55zM238.2 468.8c-49 0-96.9-17.4-134.8-49-38.3-32-64-76.7-72.5-125.9-2-11.9-3.1-24-3.1-35.9 0-36.5 9.6-72.6 27.9-104.4 2.1-3.6 6.7-4.9 10.3-2.8 3.6 2.1 4.9 6.7 2.8 10.3-16.9 29.5-25.9 63.1-25.9 96.9 0 11.1 1 22.3 2.9 33.4 7.9 45.7 31.8 87.2 67.3 116.9 35.2 29.3 79.6 45.5 125.1 45.5 11.1 0 22.3-1 33.4-2.9 4.1-.7 8 2 8.7 6.1.7 4.1-2 8-6.1 8.7-11.9 2-24 3.1-36 3.1z") + + + //- Machine learning & NLP libraries + + symbol#svg_tensorflow(viewBox="0 0 31 33") + path(d="M17.3 5v5l8.7 5v-5zM0 10v5l4.3 2.5v-5zm13 2.5L8.7 15v15l4.3 2.5v-10l4.3 2.5v-5L13 17.5z" fill="#e55b2d") + path(d="M17.3 5l-13 7.5v5l8.7-5v5l4.3-2.5zm13 2.5L26 10v5l4.3-2.5zm-8.6 10L17.3 20v5l4.4-2.5zM17.3 25L13 22.5v10l4.3-2.5z" fill="#ed8e24") + path(d="M17.3 0L0 10l4.3 2.5 13-7.5 8.7 5 4.3-2.5zm0 15L13 17.5l4.3 2.5 4.4-2.5z" fill="#f8bf3c") + + symbol#svg_keras(viewBox="0 0 512 512") + path(fill="#D01317" d="M64 64h384v384H64z") + path(fill="#F6F6F6" d="M162 145v222l7 8h22.8l10.2-8.3V292l30-32 76 115h35l7.3-12.3-89.5-129.3 83.3-82.6L338 137h-35L202 239v-93.7l-8-8.3h-24.4") + + symbol#svg_pytorch(viewBox="0 0 200 41") + path(fill="#F05732" d="M102.7 12.2c-1.3-1-1.8 4-4.4 4-3 0-4-13-6.3-13-.7 0-.8-.5-8 21.2-2.8 9 4.5 15.8 12 15.8 4.5 0 12.2-3 12.2-12.6 0-7-3.5-14-5.5-15.4zm-7 23c-3.6 0-6.6-3-6.6-7 0-3.8 3-7 6.8-7s6.7 3.2 6.7 7c0 4-3 7-6.7 7z") + path(fill="#9E529F" d="M99.8 0C99.3 0 98 2.5 98 3.6c0 1.5 1 2 1.8 2s1.8-.5 1.8-2c0-1-1.4-3.6-1.8-3.6z") + path(fill="#333333" d="M0 39.5V15h11.5c5.3 0 8.3 3.5 8.3 7.8s-3 8-8.3 8H5.2v8.7H0zm14.4-16.7c0-2-1.6-3.3-3.7-3.3H5.2V26h5.5c2 0 3.7-1.2 3.7-3.2zM35.2 39.5v-10l-9.4-14.6h6l6 9.7L44 15h6l-9.5 14.4v10h-5.3zM63.3 39.5v-20H56V15h19.7v4.5h-7.2v20h-5.2zM131.4 39.5l-4.8-8.7h-3.8v8.7h-5.2V15H129c5 0 8.3 3.3 8.3 7.8 0 4.3-2.8 6.7-5.4 7.3l5.5 9.5h-6zm.5-16.7c0-2-1.7-3.3-3.8-3.3h-5.5V26h5.5c2 0 3.7-1 3.7-3.2zM145.6 27.2c0-7.6 5.7-12.7 13-12.7 5.5 0 8.6 3 10.4 6l-4.5 2.2c-1-2-3.2-3.6-5.8-3.6-4.5 0-7.7 3.5-7.7 8.2 0 4.6 3.2 8 7.7 8 2.5 0 4.7-1.5 5.8-3.5L169 34c-1.7 3-5 6-10.3 6-7.4 0-13-5.3-13-12.8zM194.5 39.5V29H183v10.5h-5.3V15h5.2v9.6h11.5V15h5.3v24.5h-5.3z") + + symbol#svg_scikitlearn(viewBox="0 0 278 150") + path(fill="#f89939" d="M212.7 127.1c33.9-33.9 39.5-83.17 12.6-110.1S149.1-4.3 115.24 29.57c-33.87 33.86-24.07 98.56-12.57 110.06 9.3 9.3 76.2 21.3 110.06-12.57z") + path(fill="#3499cd" d="M73.74 78.15C54.1 58.5 25.5 55.23 9.87 70.85c-15.62 15.63-12.35 44.23 7.3 63.87 19.65 19.65 57.2 13.97 63.86 7.3 5.4-5.4 12.37-44.22-7.3-63.87z") + path(fill="#010101" d="M141.53 118.8c-3.47 3.18-6.5 5.54-9.13 7.05-2.62 1.52-5.1 2.28-7.5 2.28-2.72 0-4.92-1.06-6.6-3.17-1.67-2.13-2.5-4.97-2.5-8.55 0-5.34 1.16-11.77 3.48-19.3 2.32-7.5 5.15-14.4 8.47-20.74l9.73-3.6c.3-.1.53-.16.7-.16.73 0 1.34.54 1.8 1.62.48 1.1.7 2.55.7 4.4 0 5.2-1.18 10.24-3.6 15.12-2.4 4.88-6.14 10.08-11.25 15.63-.2 2.65-.3 4.48-.3 5.47 0 2.23.4 3.98 1.22 5.3.82 1.3 1.9 1.94 3.26 1.94 1.4 0 2.86-.5 4.4-1.5 1.58-1 3.95-3.05 7.14-6.2v4.4zm-14.66-15c3.24-3.6 5.87-7.63 7.9-12.1 2-4.48 3-8.33 3-11.56 0-.94-.13-1.7-.4-2.27-.3-.58-.65-.87-1.08-.87-.96 0-2.34 2.35-4.14 7.06-1.8 4.7-3.57 11.3-5.3 19.75z M170.2 118.8c-3.26 3.18-6.17 5.54-8.75 7.05-2.58 1.52-5.42 2.28-8.54 2.28-3.45 0-6.25-1.1-8.4-3.33-2.12-2.22-3.2-5.14-3.2-8.77 0-5.4 1.9-10.3 5.65-14.7 3.75-4.37 7.92-6.56 12.5-6.56 2.36 0 4.26.62 5.7 1.84 1.42 1.25 2.14 2.86 2.14 4.85 0 5.3-5.63 9.57-16.86 12.87 1.02 4.98 3.68 7.48 8 7.48 1.7 0 3.3-.46 4.82-1.36 1.54-.9 3.85-2.92 6.94-6.04v4.4zm-20.08-7.1c6.53-1.84 9.8-5.23 9.8-10.2 0-2.44-.9-3.66-2.68-3.66-1.68 0-3.3 1.28-4.82 3.85-1.54 2.54-2.3 5.9-2.3 10z M211.1 118.8c-4.1 3.87-7.02 6.4-8.78 7.57-1.76 1.18-3.44 1.76-5.05 1.76-4.04 0-5.94-3.56-5.7-10.68-2.56 3.65-4.92 6.34-7.08 8.08-2.18 1.74-4.4 2.6-6.7 2.6-2.25 0-4.16-1.05-5.73-3.15-1.57-2.1-2.35-4.7-2.35-7.76 0-3.83 1.05-7.48 3.15-10.96 2.1-3.47 4.8-6.28 8.1-8.42 3.3-2.15 6.2-3.22 8.74-3.22 3.2 0 5.44 1.47 6.7 4.4l7.84-4.32h2.15l-3.4 11.22c-1.73 5.64-2.6 9.5-2.6 11.6 0 2.2.78 3.3 2.34 3.3 1 0 2.1-.53 3.3-1.6 1.2-1.05 2.87-2.67 5.04-4.84v4.4zm-28.04 2.1c2.55 0 4.95-2.18 7.22-6.53 2.26-4.36 3.4-8.38 3.4-12.05 0-1.43-.33-2.55-.97-3.35-.62-.8-1.5-1.2-2.55-1.2-2.55 0-4.97 2.16-7.25 6.5-2.3 4.34-3.44 8.34-3.44 12 0 1.37.34 2.5 1 3.34.7.88 1.55 1.3 2.6 1.3z M239.7 118.8c-6.4 6.27-11.35 9.4-14.82 9.4-1.56 0-2.87-.65-3.94-1.96-1.07-1.3-1.6-2.94-1.6-4.9 0-3.6 1.92-8.4 5.77-14.46-1.87.97-3.93 1.64-6.2 2.03-1.64 3.08-4.25 6.38-7.8 9.9h-.9v-3.45c2-2.07 3.8-4.3 5.4-6.66-2.17-.98-3.27-2.43-3.27-4.34 0-1.97.67-4.07 2-6.3 1.35-2.24 3.2-3.35 5.55-3.35 2 0 2.98 1.03 2.98 3.07 0 1.6-.57 3.9-1.72 6.9 4.24-.47 7.94-3.7 11.1-9.73l3.5-.16-3.57 9.8c-1.48 4.14-2.44 6.96-2.87 8.45-.45 1.5-.66 2.82-.66 3.97 0 1.06.25 1.92.74 2.55.5.65 1.17.96 2 .96.93 0 1.8-.3 2.66-.9.84-.65 2.73-2.37 5.67-5.2v4.4z M277.32 118.8c-5.9 6.22-10.96 9.33-15.17 9.33-1.7 0-3.1-.6-4.14-1.8-1.02-1.2-1.55-2.8-1.55-4.82 0-2.7 1.13-6.9 3.38-12.5 1.2-3.02 1.8-4.94 1.8-5.75 0-.82-.33-1.23-.96-1.23-.36 0-.83.2-1.42.55-.54.36-1.16.86-1.88 1.5-.63.58-1.35 1.3-2.14 2.14-.7.7-1.43 1.53-2.22 2.45l-2.14 2.5c-.94 1.14-1.53 2.35-1.76 3.63-.4 2.17-.65 4.16-.78 5.98-.08 1.35-.1 3.17-.1 5.47l-8.48 2c-.28-3.46-.42-6.02-.42-7.7 0-4.12.48-8 1.44-11.7.96-3.67 2.5-7.8 4.6-12.4l9.36-1.8c-1.97 5.3-3.26 9.45-3.87 12.5 4.2-4.7 7.5-7.92 9.97-9.72 2.46-1.8 4.64-2.7 6.56-2.7 1.3 0 2.38.5 3.25 1.48.87.98 1.3 2.22 1.3 3.7 0 2.44-1.1 6.47-3.3 12.1-1.5 3.85-2.26 6.35-2.26 7.5 0 1.54.63 2.3 1.9 2.3 1.85 0 4.88-2.46 9.05-7.38v4.4z") + text(x="153.33" y="81.95" fill="#fff" font-size="23.08" font-family="Helvetica") scikit + + symbol#svg_dynet(viewBox="0 0 400 170") + image(overflow="visible" width="402" height="169" xlink:href="data:image/png;base64,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") + + symbol#svg_chainer(viewBox="0 0 150 80") + image(overflow="visible" width="150" height="80" xlink:href="data:image/png;base64,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") + + symbol#svg_nltk(viewBox="0 0 93 28.5") + path(d="M1 .6H5l13.6 22V.6h3.5V28h-4L4.2 5.7v22H1V.6zM28.3.6H32v24h13.7v3.2H28.3V.6zM66.5.6v3.2h-9.2v24h-3.7v-24h-9.2V.6h22zM70 .6h3.5V14L87 .5h5.3l-11.6 11 12 16.3h-5L78 14l-4.4 4.2V28H70V.5z") + + symbol#svg_gensim(viewBox="0 0 100 100") + image(overflow="visible" width="100" height="100" xlink:href="data:image/png;base64,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") + + symbol#svg_allennlp(viewBox="0 0 124 22") + path(d="M19.3,0.4h3.8v16c0,0.6,0.1,1,0.4,1.3c0.3,0.3,0.6,0.5,1.1,0.5c0.2,0,0.5,0,0.8-0.1c0.3-0.1,0.5-0.2,0.8-0.3l0.5,2.9 c-0.5,0.2-1.1,0.4-1.8,0.6c-0.7,0.1-1.3,0.2-1.9,0.2c-1.2,0-2.1-0.3-2.8-1c-0.7-0.6-1-1.5-1-2.7V0.4z") + path(d="M27.6,0.4h3.8v16c0,0.6,0.1,1,0.4,1.3c0.3,0.3,0.6,0.5,1.1,0.5c0.2,0,0.5,0,0.8-0.1c0.3-0.1,0.5-0.2,0.8-0.3l0.5,2.9 c-0.5,0.2-1.1,0.4-1.8,0.6c-0.7,0.1-1.3,0.2-1.9,0.2c-1.2,0-2.1-0.3-2.8-1c-0.7-0.6-1-1.5-1-2.7V0.4z") + path(d="M42.9,21.6c-1.2,0-2.3-0.2-3.3-0.6c-1-0.4-1.8-1-2.5-1.7c-0.7-0.7-1.2-1.5-1.6-2.5c-0.4-0.9-0.6-1.9-0.6-2.9 c0-1.1,0.2-2.1,0.5-3c0.4-0.9,0.9-1.8,1.6-2.5c0.7-0.7,1.5-1.3,2.5-1.7c1-0.4,2.1-0.6,3.3-0.6c1.2,0,2.3,0.2,3.3,0.6 c1,0.4,1.8,1,2.5,1.7c0.7,0.7,1.2,1.5,1.5,2.5c0.4,0.9,0.5,1.9,0.5,2.9c0,0.2,0,0.5,0,0.7c0,0.2,0,0.4-0.1,0.6H39.1 c0.1,0.6,0.2,1.1,0.4,1.6c0.2,0.5,0.5,0.8,0.9,1.2c0.4,0.3,0.8,0.6,1.2,0.7c0.5,0.2,0.9,0.3,1.4,0.3c0.8,0,1.5-0.2,2.2-0.6 c0.7-0.4,1.1-0.9,1.4-1.5l3.3,0.9c-0.6,1.1-1.4,2.1-2.6,2.8C46,21.2,44.6,21.6,42.9,21.6z M46.8,12.5c-0.1-1.1-0.5-2-1.2-2.7 c-0.7-0.7-1.6-1-2.7-1c-0.5,0-1,0.1-1.4,0.3c-0.4,0.2-0.8,0.4-1.2,0.8c-0.3,0.3-0.6,0.7-0.8,1.2c-0.2,0.5-0.3,1-0.4,1.5H46.8z") + path(d="M66.3,21.3h-3.8v-8.4c0-1.2-0.2-2.1-0.6-2.6c-0.4-0.6-1-0.8-1.7-0.8c-0.4,0-0.8,0.1-1.2,0.2c-0.4,0.2-0.8,0.4-1.1,0.6 c-0.4,0.3-0.7,0.6-1,1c-0.3,0.4-0.5,0.8-0.6,1.3v8.7h-3.8v-15h3.5v2.8c0.6-1,1.4-1.7,2.4-2.2c1-0.5,2.2-0.8,3.5-0.8 c0.9,0,1.7,0.2,2.3,0.5c0.6,0.3,1,0.8,1.4,1.3c0.3,0.6,0.5,1.2,0.7,1.9c0.1,0.7,0.2,1.4,0.2,2.1V21.3z") + path(d="M72,2.9v18.4h-1V1h0.7l14.9,18.7V1h1v20.3h-1L72,2.9z") + path(d="M92.4,21.3V1h1v19.4h12.4v0.9H92.4z") + path(d="M109.9,21.3V1h8.3c0.8,0,1.6,0.2,2.3,0.5c0.7,0.4,1.3,0.8,1.8,1.4c0.5,0.6,0.9,1.2,1.2,2c0.3,0.7,0.4,1.5,0.4,2.3 c0,0.8-0.1,1.6-0.4,2.3c-0.3,0.8-0.7,1.4-1.2,2c-0.5,0.6-1.1,1-1.8,1.4c-0.7,0.4-1.4,0.5-2.3,0.5h-7.5v7.8H109.9z M110.9,12.5h7.5 c0.7,0,1.4-0.2,1.9-0.5c0.6-0.3,1.1-0.7,1.5-1.2c0.4-0.5,0.7-1.1,0.9-1.7c0.2-0.6,0.3-1.3,0.3-2c0-0.7-0.1-1.3-0.4-2 c-0.3-0.6-0.6-1.2-1-1.7c-0.4-0.5-0.9-0.9-1.5-1.2c-0.6-0.3-1.2-0.4-1.9-0.4h-7.3V12.5z") + path(d="M18.4,4.6c-1.7,0.9-3.3,2-4.9,3.1c0,0,0,0,0,0v0c0,0,0,0,0,0L11,0.4H7.3L0.2,20.8L0,21.5h4.1c0,0,0,0,0.1-0.1 c2-3.2,4.4-6.1,7-8.8l2.9,8.9h4.1L14.2,9.8c1.3-1.2,2.7-2.3,4.2-3.3V4.6z M6.8,13.2l2.3-7.1l1.3,3.9C9.2,11,8,12,6.8,13.2z") + + + //- spaCy users + + symbol#svg_airbnb(viewBox="0 0 320 100") + path(fill="#FF5A5F" d="M168.7 25.1c0 3.6-2.9 6.5-6.5 6.5s-6.5-2.9-6.5-6.5 2.8-6.5 6.5-6.5c3.7.1 6.5 3 6.5 6.5zm-26.8 13.1v1.6s-3.1-4-9.7-4c-10.9 0-19.4 8.3-19.4 19.8 0 11.4 8.4 19.8 19.4 19.8 6.7 0 9.7-4.1 9.7-4.1V73c0 .8.6 1.4 1.4 1.4h8.1V36.8h-8.1c-.8 0-1.4.7-1.4 1.4zm0 24.1c-1.5 2.2-4.5 4.1-8.1 4.1-6.4 0-11.3-4-11.3-10.8s4.9-10.8 11.3-10.8c3.5 0 6.7 2 8.1 4.1v13.4zm15.5-25.5h9.6v37.6h-9.6V36.8zm143.4-1c-6.6 0-9.7 4-9.7 4V18.7h-9.6v55.7h8.1c.8 0 1.4-.7 1.4-1.4v-1.7s3.1 4.1 9.7 4.1c10.9 0 19.4-8.4 19.4-19.8s-8.5-19.8-19.3-19.8zm-1.6 30.5c-3.7 0-6.6-1.9-8.1-4.1V48.8c1.5-2 4.7-4.1 8.1-4.1 6.4 0 11.3 4 11.3 10.8s-4.9 10.8-11.3 10.8zm-22.7-14.2v22.4h-9.6V53.2c0-6.2-2-8.7-7.4-8.7-2.9 0-5.9 1.5-7.8 3.7v26.2h-9.6V36.8h7.6c.8 0 1.4.7 1.4 1.4v1.6c2.8-2.9 6.5-4 10.2-4 4.2 0 7.7 1.2 10.5 3.6 3.4 2.8 4.7 6.4 4.7 12.7zm-57.7-16.3c-6.6 0-9.7 4-9.7 4V18.7h-9.6v55.7h8.1c.8 0 1.4-.7 1.4-1.4v-1.7s3.1 4.1 9.7 4.1c10.9 0 19.4-8.4 19.4-19.8.1-11.4-8.4-19.8-19.3-19.8zm-1.6 30.5c-3.7 0-6.6-1.9-8.1-4.1V48.8c1.5-2 4.7-4.1 8.1-4.1 6.4 0 11.3 4 11.3 10.8s-4.9 10.8-11.3 10.8zm-26-30.5c2.9 0 4.4.5 4.4.5v8.9s-8-2.7-13 3v26.3H173V36.8h8.1c.8 0 1.4.7 1.4 1.4v1.6c1.8-2.1 5.7-4 8.7-4zM91.5 71c-.5-1.2-1-2.5-1.5-3.6-.8-1.8-1.6-3.5-2.3-5.1l-.1-.1C80.7 47.2 73.3 32 65.5 17l-.3-.6c-.8-1.5-1.6-3.1-2.4-4.7-1-1.8-2-3.7-3.6-5.5C56 2.2 51.4 0 46.5 0c-5 0-9.5 2.2-12.8 6-1.5 1.8-2.6 3.7-3.6 5.5-.8 1.6-1.6 3.2-2.4 4.7l-.3.6C19.7 31.8 12.2 47 5.3 62l-.1.2c-.7 1.6-1.5 3.3-2.3 5.1-.5 1.1-1 2.3-1.5 3.6C.1 74.6-.3 78.1.2 81.7c1.1 7.5 6.1 13.8 13 16.6 2.6 1.1 5.3 1.6 8.1 1.6.8 0 1.8-.1 2.6-.2 3.3-.4 6.7-1.5 10-3.4 4.1-2.3 8-5.6 12.4-10.4 4.4 4.8 8.4 8.1 12.4 10.4 3.3 1.9 6.7 3 10 3.4.8.1 1.8.2 2.6.2 2.8 0 5.6-.5 8.1-1.6 7-2.8 11.9-9.2 13-16.6.8-3.5.4-7-.9-10.7zm-45.1 5.2C41 69.4 37.5 63 36.3 57.6c-.5-2.3-.6-4.3-.3-6.1.2-1.6.8-3 1.6-4.2 1.9-2.7 5.1-4.4 8.8-4.4 3.7 0 7 1.6 8.8 4.4.8 1.2 1.4 2.6 1.6 4.2.3 1.8.2 3.9-.3 6.1-1.2 5.3-4.7 11.7-10.1 18.6zm39.9 4.7c-.7 5.2-4.2 9.7-9.1 11.7-2.4 1-5 1.3-7.6 1-2.5-.3-5-1.1-7.6-2.6-3.6-2-7.2-5.1-11.4-9.7 6.6-8.1 10.6-15.5 12.1-22.1.7-3.1.8-5.9.5-8.5-.4-2.5-1.3-4.8-2.7-6.8-3.1-4.5-8.3-7.1-14.1-7.1s-11 2.7-14.1 7.1c-1.4 2-2.3 4.3-2.7 6.8-.4 2.6-.3 5.5.5 8.5 1.5 6.6 5.6 14.1 12.1 22.2-4.1 4.6-7.8 7.7-11.4 9.7-2.6 1.5-5.1 2.3-7.6 2.6-2.7.3-5.3-.1-7.6-1-4.9-2-8.4-6.5-9.1-11.7-.3-2.5-.1-5 .9-7.8.3-1 .8-2 1.3-3.2.7-1.6 1.5-3.3 2.3-5l.1-.2c6.9-14.9 14.3-30.1 22-44.9l.3-.6c.8-1.5 1.6-3.1 2.4-4.6.8-1.6 1.7-3.1 2.8-4.4 2.1-2.4 4.9-3.7 8-3.7 3.1 0 5.9 1.3 8 3.7 1.1 1.3 2 2.8 2.8 4.4.8 1.5 1.6 3.1 2.4 4.6l.3.6c7.6 14.9 15 30.1 21.9 45v.1c.8 1.6 1.5 3.4 2.3 5 .5 1.2 1 2.2 1.3 3.2.8 2.6 1.1 5.1.7 7.7z") + + symbol#svg_retriever(viewBox="0 0 150 33") + image(overflow="visible" width="150" height="33" xlink:href="data:image/png;base64,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") + + symbol#svg_quora(viewBox="0 0 201 56") + path(fill="#b92b27" d="M29 43.62c-1.93-3.77-4.18-7.6-8.57-7.6-.84 0-1.68.15-2.45.5l-1.5-2.98c1.83-1.56 4.77-2.8 8.54-2.8 5.87 0 8.88 2.83 11.27 6.44 1.42-3.08 2.1-7.24 2.1-12.4 0-12.88-4.04-19.5-13.45-19.5-9.27 0-13.28 6.62-13.28 19.5 0 12.82 4 19.36 13.28 19.36 1.47 0 2.8-.16 4.04-.52zm2.3 4.5c-2.05.54-4.2.85-6.35.85C12.6 48.96.5 39.1.5 24.76.5 10.32 12.6.48 24.96.48c12.56 0 24.53 9.77 24.53 24.3 0 8.1-3.77 14.67-9.26 18.9 1.78 2.67 3.6 4.43 6.14 4.43 2.77 0 3.9-2.14 4.08-3.82h3.6c.22 2.24-.9 11.53-11 11.53-6.1 0-9.33-3.53-11.76-7.68zm26.12-12.3V19.27c0-1.9-.7-2.73-2.86-2.73h-2.3v-4.4H67.3v23.5c0 3.95 2.15 5.7 5.4 5.7 2.7 0 5.37-1.2 6.8-3.9V19.26c0-1.9-.7-2.73-2.85-2.73h-2.45v-4.4h15.2v24.6c0 2.45.92 3.57 3.72 3.57h.5v4.54L80 47v-4.67h-.28c-2.63 3.2-6.34 5.38-11.62 5.38-5.95 0-10.7-3-10.7-11.87m56 7.48c5.36 0 7.4-4.66 7.5-14.04.1-9.2-2.14-13.63-7.5-13.63-4.68 0-7.62 4.45-7.62 13.63 0 9.38 2.9 14.04 7.62 14.04zm0 4.4c-9.7 0-18.43-7.4-18.43-18.44 0-10.84 8.52-18.04 18.42-18.04 10.32 0 18.6 7.34 18.6 18.04 0 11.04-8.28 18.45-18.6 18.45zm18.9-.7v-4.4h1.47c3.62 0 3.97-1.04 3.97-4.2V19.27c0-1.9-.98-2.72-3.2-2.72h-1.97v-4.4h13.82l.7 7.2h.27c1.53-5.18 5.66-7.9 9.52-7.9 3.2 0 5.7 1.8 5.7 5.5 0 2.55-1.25 5.28-4.7 5.28-3.1 0-3.7-2.1-6.26-2.1-2.3 0-4.06 2.17-4.06 5.36V38.4c0 3.16.77 4.2 4.34 4.2h2.02V47h-21.64m46-5.12c4.4 0 6.2-4.17 6.2-8.36v-5.6c-3.2 3.34-10.68 3.46-10.68 9.4 0 2.9 1.72 4.56 4.47 4.56zm6.42-.02c-1.82 3.5-5.55 5.85-10.76 5.85-6.06 0-9.97-3.2-9.97-8.87 0-11.4 15.87-8.36 20.53-15.9v-.83c0-5.8-2.28-6.7-4.8-6.7-7.06 0-3.84 7.6-10.34 7.6-3.14 0-4.35-1.9-4.35-4.02 0-4.3 5.13-7.76 14.75-7.76 9.1 0 14.7 2.52 14.7 11.58v14.47c0 2.24.82 3.45 2.77 3.45.84 0 1.54-.23 2.08-.6l1.16 2.83c-.94 1.47-3.48 4.06-8.3 4.06-4.2 0-6.83-1.95-7.18-5.14h-.28z") + + symbol#svg_stitchfix(viewBox="0 0 224.6 26.6") + path(fill="#2F3237" d="M9.7 11.7l-.3-.1c-4-1.1-5.9-1.9-5.9-5.1 0-2.7 1.6-4.2 4.3-4.2 0 0 5.7 0 7.3 4.7l.1.2H17V0h-1.8l-.7 2.6C12.8 1 10.6 0 8.1 0c-4.7 0-8 3-8 7.3 0 4.8 4 6.2 8.5 7.3 4.5 1.1 6.4 2 6.4 5.3 0 2.9-2.4 4.3-4.5 4.3-3.8 0-6.5-1.5-8.6-4.6l-.1-.2H0v7.2h1.8l.8-3.1c2.2 2.1 4.6 3.1 7.6 3.1 4.8 0 8.2-3.3 8.2-7.7 0-4.9-4-6-8.7-7.2 M22.1 5.5h1.7l.1-.5c.6-2.9.7-2.9 2.7-2.9h4.6v22.3h-2.5v2.1h8.7v-2.1H35V2.1h4.5c2.1 0 2.3 0 2.9 2.9l.1.5h1.7V0H22.1v5.5z M63.2 5.5h1.7L65 5c.6-2.9.7-2.9 2.7-2.9h4.6v22.3h-2.4v2.1h8.7v-2.1h-2.4V2.1h4.5c2.1 0 2.3 0 2.9 2.9l.1.5h1.7V0H63.2v5.5zM49.3 0v2.1h2.5v22.4h-2.5v2.1H58v-2.1h-2.4V2.1H58V0zM132.4 0v2.1h2.5V13h-12.4V2.1h2.4V0h-8.7v2.1h2.6v22.4h-2.5v2.1h8.7v-2.1h-2.5v-9.4h12.4v9.4h-2.5v2.1h8.7v-2.1h-2.4V2.1h2.4V0zM186.4 0v2.1h2.5v22.4h-2.5v2.1h8.7v-2.1h-2.4V2.1h2.4V0zM215.9 0v2.1h2l-5.6 8.1-5.4-8.1h2V0h-8.7v2.1h2.5l7.6 11.3-7.5 11.1h-2.7v2.1h8.7v-2.1H206l5.8-8.7 5.8 8.7h-2.2v2.1h8.7v-2.1h-2.4l-7.8-11.9 7.2-10.5h3.5V0z M161.4 2.1h2.6v22.3h-2.6v2.1h8.7v-2.1h-2.3V15h4c1.5 0 1.6.2 2.1 1.7l.1.2v.2h1.7v-6.6H174v.2c0 .2-.1.3-.2.4-.5 1.2-.7 1.8-2.1 1.8h-4V2.1h9.1c1.7 0 2.1.5 3.1 3v.2h2V0h-20.6l.1 2.1z M108.2 16.1c-.8 5.2-3.6 8.1-7.9 8.1-5.1 0-8.2-4.3-8.2-11.1 0-6.5 3.1-10.7 7.9-10.7 4.6 0 7 2.9 8.1 5.4l.1.2h1.8V0h-2l-.7 2.8C105.4.9 103 0 100.1 0c-6.8 0-12 5.7-12 13.3 0 3.9 1.2 7.2 3.3 9.6 2.1 2.4 5.1 3.6 8.4 3.6 6 0 9.8-3.7 10.6-10.4v-.3h-2.3v.3z") + + symbol#svg_chartbeat(viewBox="0 0 915.7 130.1") + path(fill="#51a4da" d="M157.8 8.6c-8.1 6.8-15.5 13-23 19.1-.8.7-2.2.7-3.4.7H23.3c-.8 0-1.6-.3-2.6-.4V8.6h137.1z") + path(fill="#b3e4fa" d="M0 33.9c2-.1 4.1-.3 6.1-.3H129c-8.7 7.2-16.2 13.5-23.8 19.6-.8.6-2.3.7-3.4.7H2.4c-.8 0-1.7-.3-2.5-.5.1-6.5.1-13 .1-19.5z") + path(fill="#5bc4bf" d="M36 79.2V59.4h63.2C91 66.3 83.6 72.5 76.1 78.7c-.5.4-1.3.5-1.9.5H36z") + path(fill="#657d8c" d="M613.3 49.4c6.5-3.8 12.5-8.7 19.3-10.9 19.6-6.4 39.7 2.9 48 21.8 6.8 15.4 6.3 31-1.3 46-12.1 24.2-47.3 28-66 8-.1 2-.3 3.6-.3 5.2.1 4.3-2 6.4-6.2 6.3-4.2 0-6.2-2.2-6.2-6.4V8.2c0-4.3 2-6.1 6.3-6.1 4.4 0 6.2 2.1 6.2 6.3.2 13.9.2 27.7.2 41zm-.2 30.1c0 2.6-.1 5.1 0 7.7.5 19.7 19.2 33.3 38.2 27.7 13.9-4.1 22.5-18.7 21-35.8-1.2-13.7-6.6-24.9-20.5-29.7-9.8-3.4-19.3-1.6-27.7 4.4-8.7 6.3-13.1 14.7-11 25.7z M561.7 39h27.7c.3 8.4-2.3 11.2-9.9 11.2-5.3 0-10.6 0-15.9.1-.3 0-.6.2-1.3.3-.2 1-.5 2.1-.5 3.2v45.6c0 1.5.1 3.1.2 4.6 1.2 10.6 8.8 15.1 18.7 10.8 3.5-1.5 7-4.1 9.7.8 1.8 3.2-.7 6.9-5.8 9.4-16.6 8-34.1-1.7-34.8-20-.7-16-.2-32.1-.3-48.2v-6.1c-7.6 0-14.6-.6-21.5.2-7.7.9-13.5 5.7-16.1 12.8-2.4 6.6-3.9 13.8-4.4 20.8-.7 11.4-.1 22.9-.2 34.3-.1 5.5-2.7 7.7-7.6 7-4.5-.6-5.2-3.8-5.2-7.5V72.2 45.5c0-4.3 1.1-7.4 6.2-7.5 5.1-.1 6.4 3 6.4 7.3 0 3.1 0 6.1.4 9.9 9-17.9 25.3-17 41.9-16.2 0-5.1.1-9.5 0-13.9s1.6-6.8 6.2-6.7c4.8 0 6.2 2.7 6.1 6.9-.1 4.3 0 8.6 0 13.7z M267.1 127.1c-36.6 0-61.2-28.5-57.6-66.8 4.8-50.7 52.1-62.9 83-48.9 6.3 2.8 11.5 8.2 16.6 13.1 2.6 2.5 3.4 6.6-.4 9.5-3.6 2.8-6.5 1.2-9.3-1.8-12.7-13.6-28.3-17.6-45.8-12.3-17.9 5.4-27 18.9-30.1 36.7-2.4 13.4-.5 26.3 6.5 38.1 14.1 23.7 48.5 28.7 67.2 9.7 2-2 3.8-4.4 5.3-6.9 1.8-2.9 4.4-4 6.9-2.3 1.9 1.3 4 4.7 3.5 6.4-1.1 3.8-3.2 7.6-5.9 10.5-10.8 11-24.7 15-39.9 15z M704.6 85.7c1.5 13.7 7.5 23.6 20 28 13 4.5 25.6 3.4 36.1-6.9 5.2-5.1 7.6-5.9 10.5-3.1 2.8 2.8 1.9 7-2.4 11.7-.6.6-1.2 1.2-1.9 1.8-15.4 11.7-32.5 13.2-49.8 6-16.7-6.9-24.3-20.9-24.9-38.5-.9-24 11.8-42.2 33-46.7 28.6-6.1 50.8 11.2 50.4 43-.1 4.4-2.9 4.8-6.2 4.8h-58.9c-1.9-.1-3.7-.1-5.9-.1zm1.2-11.4h55.9c-.1-15.3-11-26.2-26-26.3-15.6-.2-29.6 12.1-29.9 26.3zM842.8 73.1c1.4-14-5.1-22.5-18.2-24.3-11.1-1.5-20.7 1.6-28 10.3-2.5 2.9-4.9 5.1-8.6 2.4-3.7-2.8-2.7-6.3-.5-9.5 1.5-2.2 3.3-4.5 5.4-6.1 14.4-10.7 30.2-12.1 46.5-5.1 9.5 4.1 15.2 12.3 15.6 22.5.9 18.9.7 37.9.8 56.9 0 3.9-2.3 5.9-6.3 5.8-4-.1-6-2-5.8-6.1.1-1.8 0-3.7 0-6.5-1.6 1.3-2.4 1.9-3.2 2.6-12.4 11.4-26.8 13.7-42.4 8.8-9.1-2.9-14.5-9.4-15.5-19.1-1-9.9 2.6-17.8 11.3-22.9 10.8-6.3 22.9-7.7 35-8.7 4.5-.5 9.1-.7 13.9-1zm-.2 9.7c-9.8 1.2-19.4 2.1-28.9 3.6-3.8.6-7.5 2.2-10.9 4-5.9 3.1-8.4 8.4-7.4 14.4 1 6.2 5.3 9.5 11 10.7 17.7 3.9 40.5-6.1 36.2-32.7z M338.5 50.2c.7-1.1 1.3-2.4 2.2-3.3 10.5-10.7 23.3-12.4 36.9-8.2 13.3 4.1 20 14.6 20.9 27.7 1.2 18 .8 36.2.9 54.3 0 4-2.5 5.4-6.1 5.2-3.9-.1-5.8-2.1-5.8-6.2.1-13.7.1-27.3 0-41 0-3.2-.2-6.5-.7-9.7-1.9-11.5-8.4-18.5-18.2-20-12.1-1.8-23.5 3.1-28.1 13.2-2.1 4.7-3.2 10.1-3.4 15.3-.5 13.7-.1 27.3-.2 41 0 6-3.2 8.7-8.8 7.1-1.8-.5-3.2-2.9-4.5-4.6-.5-.7-.2-2-.2-3V9.9c0-6.2 1.2-7.5 6.3-7.6 5.3-.1 7.1 1.4 7.1 6.9.1 11.8 0 23.6 0 35.4 0 1.6.1 3.3.2 4.9.7.2 1.1.5 1.5.7z M469 73.1c1.3-13.6-5.3-22.3-17.9-24.2-11.3-1.7-21 1.4-28.5 10.2-2.5 2.9-5 5.1-8.6 2.4-3.7-2.8-2.7-6.4-.5-9.6 6.2-9.2 15.4-13.3 25.9-14.6 5.2-.7 10.6-.7 15.8.1 16.6 2.7 26.4 14.3 26.5 31.3.2 16.6.1 33.1 0 49.7 0 5.6-1.6 7.5-6 7.5-5 0-6.4-3.1-6.1-7.5.1-1.4 0-2.7 0-4.8-1.3 1-2.3 1.5-3 2.2-12.1 11.4-26.4 13.7-41.8 9.1-9.8-2.9-15.5-9.9-16.2-20.2-.9-10.1 3.4-17.8 12.4-22.7 10.6-5.7 22.3-7.1 34.1-8.1 4.6-.3 9.2-.5 13.9-.8zm0 9.9c-8.8.9-17.4 1.5-25.9 2.9-4.8.8-9.6 2.4-14 4.6-6.3 3.1-8.8 8.6-7.7 14.7.9 5.3 5.2 9.5 11.7 10.7 18.7 3.1 39.3-7.4 35.9-32.9z M63.9 127.4c-5.1-1.2-8.2-3.2-9.7-7.3-1.7-4.6-.3-8.3 3.2-11.5C68 98.9 78.6 89.2 89.1 79.5c24.2-22.1 48.4-44.3 72.7-66.4.5-.5.9-1.2 1.5-1.3 2-.6 4.1-1 6.1-1.5-.6 2.1-.5 4.7-1.8 6.1-31.8 35.3-63.8 70.4-95.8 105.5-2 2.3-5.2 3.7-7.9 5.5z M873.9 49.4h-8.8c-3.2 0-5.1-2-4.4-4.9.5-2 2.3-4.5 4.2-5.3 2.4-.9 5.3-.2 9-.2 0-4.6-.1-8.8 0-12.9.1-5.9 1.7-7.6 6.5-7.7 5.3-.1 6.1 3.3 6.1 7.4v12.9h27.8c-.2 8.1-2.7 10.6-9.7 10.7h-18.3v12.9l.3 35.9c0 1.5 0 3.1.2 4.6.9 12 8.5 16.6 19.5 11.6 3.3-1.5 6.6-3.2 8.8 1.1 2.1 4-.9 6.4-3.8 8.4-14.4 9.7-34.8 1-36.3-16.2-1.3-14.2-.8-28.7-1-43-.1-4.8-.1-9.6-.1-15.3z") + + symbol#svg_allenai(viewBox="0 0 610 103") + path(fill="#FFE266" d="M87.446 21.648c-.8 0-1.6-.014-2.397.01-.177.006-.42.11-.5.247-.062.104.047.363.152.497.63.803 1.292 1.58 1.917 2.388.115.15.21.452.135.574-.08.13-.38.194-.57.174-1.09-.113-2.173-.263-3.26-.395-.607-.074-.776.146-.548.71.447 1.11.9 2.218 1.35 3.327.09.222.218.49-.05.626-.15.078-.43.04-.593-.052-1.16-.65-2.303-1.333-3.458-1.993-.39-.222-.52-.504-.41-.955.3-1.227.998-2.204 1.893-3.046 1.4-1.317 2.212-2.923 2.533-4.812.756-4.46-2.55-8.847-6.994-9.385-4.702-.57-9.366 3.225-9.05 8.6.128 2.157.943 4.006 2.517 5.508.923.882 1.675 1.868 1.98 3.143.1.42.002.71-.38.93-1.166.67-2.32 1.36-3.495 2.018-.16.09-.398.043-.6.06-.014-.204-.096-.432-.03-.605.422-1.104.877-2.194 1.32-3.29.26-.648.097-.86-.586-.774-1.07.137-2.14.28-3.215.39-.187.02-.49-.062-.56-.19-.068-.13.04-.42.156-.573.607-.783 1.252-1.537 1.86-2.318.12-.155.24-.434.177-.57-.062-.136-.355-.228-.548-.23-1.54-.013-3.078 0-4.617.005-.255 0-.583.026-.59-.296-.006-.18.212-.436.397-.538 1.243-.684 2.508-1.326 3.753-2.007.177-.097.282-.33.42-.498-.18-.127-.342-.323-.54-.373-1.52-.377-3.048-.716-4.567-1.097-.185-.046-.327-.266-.49-.405.163-.14.306-.36.49-.402 1.698-.395 3.405-.752 5.105-1.142.188-.043.345-.224.517-.34-.12-.17-.2-.393-.36-.5-1.32-.874-2.654-1.726-3.983-2.584-.063-.04-.152-.064-.184-.12-.09-.167-.158-.345-.235-.518.174-.076.358-.234.518-.212 1.084.145 2.163.328 3.244.5.467.074.932.172 1.402.212.177.015.43-.053.528-.178.073-.093.003-.37-.087-.51-.944-1.484-1.906-2.958-2.863-4.435-.04-.062-.108-.12-.117-.186-.026-.2-.03-.4-.04-.602.2.002.444-.07.596.018 1.178.683 2.336 1.396 3.5 2.1.494.297.98.613 1.486.885.156.084.44.132.55.047.112-.088.146-.372.105-.545-.45-1.943-.92-3.88-1.392-5.82-.063-.26-.12-.51.176-.65.315-.15.455.108.598.31 1.164 1.642 2.32 3.29 3.494 4.92.12.17.354.26.535.387.12-.2.316-.39.347-.602.45-2.39 1.082-4.377 1.354-5.93.04-.268.08-.543.4-.555.36-.013.39.28.43.557.336 1.762 1.266 3.96 1.33 5.71.043.28.156.69.352.777.387.172.517-.284.694-.53 1.093-1.53 2.174-3.065 3.26-4.6.05-.07.087-.172.157-.21.174-.094.364-.16.547-.237.063.19.214.402.176.57-.366 1.614-.763 3.22-1.15 4.83-.087.36-.197.715-.247 1.08-.026.178 0 .455.11.535.116.083.398.037.548-.052 1.628-.964 3.245-1.95 4.865-2.928.228-.138.5-.353.69-.047.093.15.026.484-.086.66-.93 1.478-1.893 2.932-2.827 4.406-.12.19-.13.45-.19.676.245.045.498.16.73.126 1.448-.21 2.89-.454 4.336-.686.25-.04.522-.102.633.225.107.32-.144.45-.354.587-1.34.868-2.69 1.725-4.02 2.607-.168.11-.25.353-.373.533.174.11.334.28.523.322 1.628.37 3.26.717 4.893 1.073.115.025.25.024.34.088.13.095.323.245.313.355-.013.146-.17.348-.312.4-.372.133-.77.2-1.158.29-1.18.275-2.363.536-3.537.835-.21.053-.378.262-.566.4.146.163.262.383.445.482 1.206.66 2.426 1.292 3.64 1.935.066.035.154.054.192.108.115.164.21.342.313.514-.166.09-.33.252-.5.26-.797.026-1.597.01-2.396.01.002-.003.002-.008.002-.012z") + path(fill="url(#gradient_allenai1)" d="M71.603 33.652c-.09-.64-.137-1.244-.264-1.832-.712-3.286-1.683-6.49-3.134-9.532-.502-1.054-1.07-2.076-1.304-3.233-.475-2.357-.127-4.583 1.133-6.643 1.34-2.192 3.3-3.552 5.795-4.066 2.904-.598 5.526.072 7.798 2.007 1.602 1.365 2.556 3.113 2.95 5.163.406 2.103.066 4.105-.988 5.968-.82 1.452-1.652 2.897-2.143 4.503-.34 1.117-.653 2.24-.99 3.36-.034.11-.138.253-.236.28-2.556.677-4.873 1.887-7.142 3.203-.476.276-.963.537-1.475.822z") + path(fill="#3D3D3D" d="M610.03 87.8v2.818h-13.405v-17.93h13.277v2.817h-10.13v4.663h8.98v2.818h-8.98V87.8zM584.123 75.272c-3.404 0-5.912 2.818-5.912 6.328v.05c0 3.51 2.484 6.354 5.913 6.354 2.2 0 3.607-.87 5.14-2.307l2.024 2.05c-1.866 1.946-3.914 3.177-7.27 3.177-5.217.004-9.104-4.07-9.104-9.22v-.053c0-5.097 3.81-9.27 9.233-9.27 3.303 0 5.298 1.15 7.013 2.792l-2.022 2.327c-1.435-1.332-2.967-2.228-5.015-2.228zM566.425 90.618L556.55 77.86v12.758h-3.1v-17.93h2.919l9.6 12.4v-12.4h3.09v17.93zM547.68 87.8v2.818h-13.406v-17.93h13.28v2.817H537.42v4.663h8.98v2.818h-8.98V87.8zM520.52 83.345V80.6h7.627v7.535c-1.766 1.51-4.298 2.794-7.472 2.794-5.608 0-9.292-4-9.292-9.226v-.052c0-5.02 3.838-9.27 9.236-9.27 3.12 0 5.04.87 6.885 2.433l-1.996 2.382c-1.385-1.178-2.737-1.922-5.015-1.922-3.303 0-5.81 2.896-5.81 6.328v.05c0 3.688 2.434 6.406 6.094 6.406 1.685 0 3.22-.54 4.322-1.36v-3.355h-4.58zM502.203 72.687h3.146V90.62h-3.147zM484.148 90.618v-17.93h3.147v15.06h9.418v2.87zM466.272 90.618v-17.93h3.15v15.06h9.413v2.87zM460.495 87.8v2.818h-13.402v-17.93h13.274v2.817h-10.13v4.663h8.982v2.818h-8.984V87.8zM436.045 75.606v15.012h-3.17V75.606h-5.685v-2.92h14.533v2.92zM419.19 90.618l-9.874-12.758v12.758h-3.097v-17.93h2.915l9.595 12.4v-12.4h3.095v17.93zM396.25 72.687h3.145V90.62h-3.146zM368.475 90.618v-17.93h3.146v15.06h9.415v2.87zM355.488 72.56h-2.92l-7.878 18.06h3.225l1.842-4.33h8.47l1.814 4.33h3.327l-7.88-18.06zm-4.58 10.936l3.068-7.172 3.097 7.172h-6.166zM336.25 72.687h3.145V90.62h-3.144zM323.568 75.272c-3.4 0-5.91 2.818-5.91 6.328v.05c0 3.51 2.484 6.354 5.91 6.354 2.202 0 3.61-.87 5.143-2.307l2.024 2.05c-1.867 1.946-3.916 3.177-7.27 3.177-5.218.004-9.104-4.07-9.104-9.22v-.053c0-5.097 3.81-9.27 9.234-9.27 3.302 0 5.298 1.15 7.01 2.792l-2.02 2.327c-1.434-1.332-2.967-2.228-5.016-2.228zM305.18 72.687h3.143V90.62h-3.144zM289.323 75.557v4.89h9.032v2.87h-9.032v7.3h-3.146v-17.93h13.33v2.87zM276.203 72.687h3.146V90.62h-3.147zM264.98 75.606v15.012h-3.173V75.606h-5.682v-2.92h14.534v2.92zM247.33 83.83c2.483-.718 4.25-2.483 4.25-5.43v-.052c0-1.562-.537-2.896-1.485-3.868-1.148-1.128-2.916-1.794-5.168-1.794h-7.982v17.932h3.146v-6.25h3.94l4.403 6.25h3.734l-4.836-6.788zm-7.237-2.254v-6.02h4.58c2.328 0 3.71 1.05 3.71 2.97v.054c0 1.816-1.434 2.996-3.686 2.996h-4.604zM223.96 72.56h-2.92l-7.883 18.06h3.226l1.842-4.33h8.47l1.816 4.33h3.327l-7.878-18.06zm-4.583 10.936l3.068-7.172 3.098 7.172h-6.166zM199.913 79.702c-.742 0-.972-.485-.972-.947 0-.486.13-.616.13-.744 0-.178-.103-.253-.333-.253-1.202 0-3.326 2.74-3.684 3.945l-1.866 6.353h-1.994l2.966-10.09h-1.767l.102-.412h.948c1.306 0 2.354-.053 3.044-.562l-1.05 3.175.05.053c.694-1.254 2.508-3.074 4.12-3.074 1.126 0 1.636.616 1.636 1.28 0 .845-.69 1.278-1.33 1.278zM184.16 76.99c-3.785 0-6.65 3.69-6.65 6.89 0 2.486 1.33 4.484 4.145 4.484 3.07 0 6.422-3.098 6.422-7.25 0-2.588-2.126-4.124-3.916-4.124zm.025 9.428c-.23.36-1.02 1.538-2.608 1.538-1.46 0-2.226-1-2.226-2.23 0-1.205 1.383-5.635 1.92-6.558.563-.974 1.435-1.768 2.737-1.77 1.458 0 2.226.794 2.226 2.052 0 1.487-1.382 5.842-2.048 6.968zM179.1 71.816c-.743 0-1.23-.538-1.23-1.1 0-.69.41-.82.41-1.05 0-.21-.207-.21-.36-.21-1.535 0-2.915 3.947-3.25 5.18l-.793 2.92h2.688l-.076.41h-2.687c-1.51 5.226-2.662 10.144-3.814 12.474-1.74 3.536-2.765 4.228-4.375 4.228-.87 0-1.538-.77-1.538-1.485 0-.77.566-1.278 1.152-1.278.69 0 1.15.433 1.15 1.05 0 .742-.487.742-.487 1.05 0 .18.156.255.384.255.436 0 1.434-.385 2.124-2.51.897-2.767 2-9.017 3.305-13.782h-2.254l.105-.41h2.252c.742-2.92 1.968-5.204 3.352-6.64 1.253-1.278 2.33-1.866 3.453-1.866.92 0 1.712.64 1.712 1.588 0 .69-.56 1.176-1.226 1.176zM517.48 56.98v2.395h-16.987v-23.3h16.818v2.398h-14.19v7.955h12.698v2.398H503.12v8.154zM484.43 38.508v20.87h-2.66v-20.87h-7.81v-2.434h18.285v2.434zM456.373 59.742c-5.752 0-9.676-3.525-9.676-10.117v-13.55h2.628v13.384c0 5.024 2.69 7.854 7.11 7.854 4.293 0 7.02-2.594 7.02-7.69v-13.55h2.624v13.35c0 6.793-3.892 10.318-9.707 10.318zM431.003 38.508v20.87h-2.656v-20.87h-7.814v-2.434h18.28v2.434zM409.43 36.074h2.623v23.303h-2.624zM393.133 38.508v20.87h-2.656v-20.87h-7.814v-2.434h18.284v2.434zM368.566 46.467c5.185 1.132 7.578 3.027 7.578 6.588v.066c0 3.996-3.32 6.593-7.945 6.593-3.693-.002-6.716-1.232-9.508-3.732l1.63-1.93c2.427 2.196 4.753 3.3 7.98 3.3 3.123 0 5.185-1.67 5.185-3.963v-.068c0-2.163-1.163-3.396-6.052-4.427-5.352-1.164-7.81-2.896-7.81-6.723v-.065c0-3.662 3.224-6.358 7.646-6.358 3.39 0 5.82.967 8.18 2.862l-1.528 2.03c-2.162-1.765-4.324-2.53-6.718-2.53-3.024 0-4.954 1.665-4.954 3.762v.067c0 2.195 1.197 3.426 6.316 4.527zM348.22 59.377L333.19 40.27v19.107h-2.56V36.074h2.46l14.66 18.676V36.074h2.56v23.303zM317.865 36.074h2.626v23.303h-2.625zM292.33 59.377L277.306 40.27v19.107h-2.56V36.074h2.46l14.66 18.676V36.074h2.56v23.303zM266.13 56.98v2.395h-16.987v-23.3h16.822v2.398H251.77v7.955h12.7v2.398h-12.7v8.154zM225.24 59.377V36.074h2.625v20.874h13.1v2.43zM201.335 59.377V36.074h2.626v20.874h13.1v2.43zM182.815 35.908h-2.46l-10.604 23.47h2.693l2.76-6.16h12.664l2.726 6.16h2.828l-10.605-23.47zm-6.582 14.914l5.32-11.848 5.284 11.848h-10.604z") + path(fill="url(#gradient_allenai2)" d="M108.15 90.71l15.184-23.13c5.5-8.402 8.25-15.42 8.25-21.055 0-6.14-2.144-10.94-6.428-14.4-4-3.227-10.812-4.947-17.815-5.163v-.023c-.167 0-.335.008-.503.01-.16-.003-.322-.01-.483-.01l.003.022C86.763 27.352 66 39.38 48.067 53.756L39.15 28.02H25.99L0 103.018h14.627S25.14 88.742 40.887 73.58l9.625 29.437h14.626l-13.546-39.09c5.52-4.648 11.43-9.11 17.588-12.973v52.063h13.16V43.88c8.4-3.722 17.02-5.946 25.504-5.757 6.715 0 10.073 2.802 10.073 8.402 0 4.725-2.346 10.544-7.035 17.46l-23.484 34.57v3.846h48.59V90.71h-27.84zM23.33 76.395l9.237-28.252 4.81 14.715c-5.06 4.56-9.782 9.158-14.048 13.537z") + path(fill="#3181AF" d="M71.614 33.688c.03.13.08.244.14.35 2.87-1.623 5.767-3.1 8.676-4.432.037-.115.08-.228.113-.343.037-.13.072-.26.11-.39H70.58c.25.998.478 2.003.658 3.02.107.602.24 1.2.376 1.795z") + + + //- spaCy features + + symbol#svg_thoughtworks(viewBox="35 20 150 25") + path(fill="#001e2b" d="M175.1 28.47a2 2 0 1 1 2 2 2 2 0 0 1-2-2m3.46 0A1.47 1.47 0 1 0 177.1 30a1.45 1.45 0 0 0 1.46-1.53m-.48 1.1h-.52l-.48-.92h-.36v.92h-.46V27.4h1.05c.57 0 .84.16.84.67 0 .4-.2.56-.58.58zm-.77-1.24c.26 0 .42-.05.42-.32 0-.3-.3-.26-.5-.26h-.5v.6zM49.68 24.5h-4.6v14.74h-3.56V24.5h-4.6v-3h12.76v3M54.4 27.8a6.14 6.14 0 0 1 3.8-1.6c1.4 0 3.36.84 3.36 3.98v9.05h-3.38v-7.68c0-1.02.08-2.64-1.38-2.64a3.5 3.5 0 0 0-2.4 1.4v8.94h-3.37V21.5h3.37v6.3M62.95 32.85c0-3.4 1.87-6.65 5.6-6.65s5.62 3.26 5.62 6.65c0 3.38-1.9 6.66-5.6 6.66s-5.62-3.27-5.62-6.65m7.76 0c0-1.6-.32-4.17-2.14-4.17s-2.14 2.58-2.14 4.17.32 4.17 2.14 4.17 2.14-2.57 2.14-4.17M82.8 37.92a6.16 6.16 0 0 1-3.8 1.6c-1.4 0-3.35-.86-3.35-4v-9.05h3.37v7.68c0 1.03-.06 2.65 1.4 2.65a3.5 3.5 0 0 0 2.4-1.4v-8.93h3.37v12.77h-3.4v-1.32M91.7 35.04a.87.87 0 0 0-.96.8c0 1.66 8.85-1.23 8.85 3.76 0 1.9-1.3 3.9-6.35 3.9-4.4 0-5.9-1.55-5.9-3.2a2.2 2.2 0 0 1 1.4-1.95 2.03 2.03 0 0 1-1-1.62 2.9 2.9 0 0 1 1.65-2.55 4.8 4.8 0 0 1-1.6-3.5c0-2.84 2.4-4.48 5.15-4.48a6.13 6.13 0 0 1 3.15.9 3.13 3.13 0 0 1 2.3-1.06 4.97 4.97 0 0 1 .98.1v2.36a3 3 0 0 0-1.07-.27 1.86 1.86 0 0 0-.9.27 5.1 5.1 0 0 1 .68 2.17c0 2.82-2.37 4.46-5.13 4.46l-1.25-.1m-1.07 4.23a.88.88 0 0 0-.53.8c0 1.18 2.4 1.25 3.2 1.25.57 0 3.53-.06 3.53-1.08 0-.66-.45-.6-2.46-.7zm2.32-6.36c1.42 0 1.83-1.16 1.83-2.37 0-1.17-.55-2.15-1.83-2.15-1.4 0-1.84 1.2-1.84 2.4 0 1.16.55 2.12 1.85 2.12M104.2 27.8a6.14 6.14 0 0 1 3.82-1.6c1.4 0 3.35.84 3.35 3.98v9.05H108v-7.68c0-1.02.07-2.64-1.4-2.64a3.5 3.5 0 0 0-2.4 1.4v8.94h-3.36V21.5h3.37v6.3M117.5 26.47h2.63v2.8h-2.62v6.5c0 .62.2 1.25 1.28 1.25a2.4 2.4 0 0 0 1.35-.47v2.57a7.83 7.83 0 0 1-2.17.4c-2.1 0-3.83-1.2-3.83-3.98v-6.27h-1.57v-2.8h1.57v-3.2h3.38v3.2M134.17 39.24h-1.82l-3-14.5h-.06l-3.18 14.5h-1.82l-3.72-17.74h1.78l2.92 14.32h.05l3.2-14.32h1.74l3.04 14.32h.05l3.12-14.32h1.75l-4.05 17.74M137.46 32.94c0-4.7 2.23-6.65 5.03-6.65s5.03 1.93 5.03 6.64-2.24 6.66-5.04 6.66-5.04-1.94-5.04-6.66m8.3 0c0-2.14-.53-5.15-3.27-5.15s-3.26 3-3.26 5.14.52 5.16 3.25 5.16 3.26-3 3.26-5.16M150.7 29.36h.05c.7-1.5 1.6-2.9 3.48-2.9h.7v1.63c-2.34-.33-3.55 2.18-4.23 4v7.14h-1.78v-12.6h1.78v2.72M158.13 32.5l4.68-5.85h2l-3.48 4.3 4 8.3h-1.92l-3.22-6.85-2.05 2.53v4.3h-1.78V21.5h1.78v11M173.02 29.46a3.26 3.26 0 0 0-2.88-1.67c-1.16 0-2.25.58-2.25 1.86 0 3.08 6.62 1.73 6.62 5.97a3.84 3.84 0 0 1-4.12 3.97 5.17 5.17 0 0 1-4.7-2.64l1.4-.9a3.5 3.5 0 0 0 3.3 2.04 2.2 2.2 0 0 0 2.46-2.14c0-3.17-6.63-1.66-6.63-6.18a3.56 3.56 0 0 1 3.85-3.5 4.83 4.83 0 0 1 4.2 2.2l-1.26.98") + + symbol#svg_wapo(viewBox="0 0 268 206") + path(fill="#111" d="M118.13 17.98v25.04c3.4-1.83 5.76-5 6.9-8.6l.28.14c-.74 8.93-6.83 17.86-16.3 17.86-9.54 0-16.58-7.1-16.58-18.47 0-8.53 5.55-13.88 12.65-18.68-1-.27-2.1-.4-3.18-.4-4.88 0-7.72 3.3-7.72 6.7h-.4c-.08-.48-.08-.95-.08-1.43 0-6.02 3.2-13.33 10.9-13.33 4.94 0 8.73 4.54 14.48 4.54 2.3 0 5.15-1.08 6.3-3.58h.2c-.07 4.4-1.42 8.93-7.45 10.22zm3.66 25.64c-3.4 3.6-7.05 6.64-11.8 6.64-8.78 0-15.55-6.9-15.55-16.92 0-5.9 2.44-9.07 5.14-12.8h-.28c-1.7 1.7-6.16 5.96-6.16 13.2 0 11.1 6.97 17.94 16.1 17.94 6.37 0 10.7-4.4 12.66-8l-.13-.05zm2.7-32.81c-1.16 2.17-3.6 4.94-8.53 4.94-4.94 0-9.48-3.38-13.47-3.38-3.65 0-6.16 2.44-7.1 4.26l.06.14c1.3-1.3 3.25-2.57 6.43-2.57 5.27 0 8.65 3.24 14 3.24 5.7 0 8.26-3.73 8.73-6.57l-.14-.06zm-18.82 4.67c-3.45 3.6-6.63 7.52-6.63 15.16 0 4.2 1.42 8.53 4.6 11.24l1.96-1.02V22.7l-1.8.96-.35-.68 9.47-5.14c-2.57-.54-4.87-1.7-7.24-2.37zm11.7 2.64c-.47.08-.94.08-1.48.08-.95 0-1.83-.07-2.7-.27v19.77l-8.87 4.8c1.83 1.36 4.06 2.17 6.9 2.17 2.3 0 4.33-.48 6.16-1.3V18.12zm-9.74 3.46l-1.28.75v18.14l1.28-.67v-18.2zm38.9 2.58v23.4c0 6.5-5.74 10.9-12.17 12.2l-.13-.28c3.18-1.56 5-4.74 5-8.12V27.1l-3.65-3.3-1.43 1.55v18.88l2.03 1.83v.14l-5.48 5.95-6.3-5.75v-.27l2.44-2.57v-29.9L134.04 6l.13.07V24.2l5.9-6.36 6.15 5.55 1.15-1.23.54.48-1.35 1.5zm-18.93 22.12v-.13l1.43-1.42V12.5L127.6 14v30.03l-2.16 2.17v.13l5.28 4.74.95-1.08-4.06-3.74zm13.8-20.23l-4.4-3.8-.93 1.02 3.92 3.52v24.37c0 1.62-.35 3.3-.96 4.26l.07.07c1.7-1.22 2.3-3.05 2.3-5.42V26.03zm15.9 11.7v3.46l6.58 5.13 3.8-4.06.53.54-8.8 9.42-8.92-7.18-1.36 1.43-.54-.55 1.56-1.62V27.18l12.8-9.34 6.7 10.83-12.33 9.07zm-5 5.96V26.5l-1.42 1.02v16.85l8.4 6.83 1.08-1.14-8.05-6.37zm5.15-20.85l-.14.07V36.8l6.04-4.4-5.9-9.55zm1.76-1.35l-1.2.88 5.95 9.54 1.22-.88-5.96-9.54zM31.74 115.16l-9.4-8.13-7.18 8.13-9.75-8.4V93.5H3.53c-1.7 0-2.57 1.08-2.98 2.37h-.2C.2 95.33 0 94.37 0 93.3c0-1.76.47-6.36 5.4-6.36V75.3c0-2.24-2.63-3.12-2.63-6.1 0-3.85 3.66-7.64 10.36-10l.27.2c-2.44 1.4-3.72 2.77-3.72 5.68 0 4.46 4.33 3.3 4.33 10.35v2.7l7.93-8.32 8.32 8.2 7.85-8.2 7.58 7.46v25.04l-13.94 12.86zm-24.16-9.48V91.4h-3.8c-1.95 0-2.83 1.3-2.97 2.44l.08.07c.68-.74 1.35-1.14 2.9-1.14h2.38v13.67l8.93 7.7 1-1.2-8.52-7.25zm0-31.06c0-2.78-2.44-3.72-2.44-5.48 0-2.44.95-4.47 2.44-6.36l-.14-.07c-2.03 1.57-3.92 4.07-3.92 6.5 0 2.44 2.64 3.6 2.64 5.76v11.98h1.42V74.62zm14.28 6.77l-5.14-5.02-2.7 2.77v23.96l6.15 5.22 1.7-1.9V81.4zm2.16 24.15v-25.1l-5.75-5.7-1.08 1.1 5.4 5.2v25.24l9.14 7.9 1.08-1-8.8-7.65zM37.15 80.5l-4.26-4.05-2.45 2.5v24.1l6.64 5.8.05-.06V80.5zm2.17-.94l-4.94-4.8-1.02 1.08 4.54 4.33v28.3l1.42-1.37V79.56zM68.07 115.16l-6.43-5.82-5.75 5.8-7.05-6.2-.94 1-.53-.54 1.2-1.28V89.98l12.74-9.2 7.3 5.68 1.3-1.35.54.55-1.5 1.56v18.75l3.6 3.32 1.15-1.22.53.47-6.16 6.64zm-17.32-7.52V89.37l-1.42 1.02v17.92l6.5 5.82 1.08-1.08-6.15-5.42zm10.9-17.8l-5.56-4.33-.2.15v19.7l4.6 4 1.14-1.16V89.84zm2.16 18.4v-19.4l-5.74-4.68-1.36.95 5.7 4.48v19.35l5.67 5.14L69.1 113l-5.3-4.75zM87.77 93.1h6.97v14.47l-10.76 7.58c-1.42-1.62-3.45-2.77-5.95-2.77-2.03 0-3.66.68-5.82 2.5l-.34-.13 9.2-13.4h-5.68v-12.6l11.3-7.84c1.35 1.1 2.37 1.7 4.13 1.7 1.36 0 3.32-.27 4.8-1.48l.28.13-8.12 11.84zM80.2 110.4c-1.98 0-3.53.68-4.9 1.62v.14c1.1-.48 2.18-.6 3.2-.6 1.55 0 4 .74 5.6 2.63l1.57-1.14c-1.3-1.5-2.85-2.64-5.48-2.64zm7.22-11.37h-3.8l-7.9 11.44.06.12c1.97-1.42 3.86-2.37 6.16-2.37 2.03 0 4.13.95 5.42 2.57l.06-.06v-11.7zm-9.87 0v-10.9l-1.43 1.02v11.37h5.48l1.1-1.5h-5.16zM91.7 85.78c-1.43 1.02-2.24 1.56-4.6 1.56-1.37 0-3-.6-4.28-1.96l-.13.07v9.88h2.56l6.5-9.48-.07-.06zm-3.26-.6c-1.22 0-2.77-.6-3.8-1.97l-1.68 1.16c1.28 1.56 2.5 2.24 4.4 2.24 1.2 0 2.97-.34 4.8-1.9l.07-.2c-1.15.47-2.57.67-3.8.67zm1.15 11.64h-4.4l-1.02 1.42h4v13.13l1.4-1.02V96.82zm28.48-9.68v23.4c0 6.5-5.75 10.9-12.18 12.2l-.14-.27c3.18-1.56 5-4.74 5-8.13V90.13l-3.64-3.32-1.42 1.56v18.88l2.03 1.82v.14l-5.48 5.96-6.3-5.76v-.27l2.44-2.57v-29.9l7.16-7.66.14.07V87.2l5.9-6.36 6.14 5.55 1.15-1.22.53.47-1.35 1.5zm-18.95 22.13v-.14l1.42-1.42V75.5L99.13 77v30.03l-2.16 2.17v.14l5.27 4.73.95-1.08-4.07-3.73zm13.8-20.24l-4.4-3.8-.94 1.03 3.92 3.52v24.36c0 1.62-.34 3.32-.95 4.26l.07.07c1.7-1.22 2.3-3.05 2.3-5.4V89.02zm17.47 26.13l-5.82-5.35-1.36 1.43-.54-.54 1.56-1.7V89.44l-2.84-2.7-1.1 1.2-.53-.53 6.1-6.62 5.4 4.87 1.36-1.5.6.48-1.7 1.83v19.76l3.26 3.05 1.48-1.56.54.55-6.42 6.9zm-4-6.64V88.36l-3.52-3.25-.94 1.1 3.04 2.9v20.1l5.42 4.87 1-1.08-5-4.48zm2.03-28.28l-5.55-5.08 5.08-5.4 5.55 5.06-5.07 5.42zm-3.45-6.16l-1 1 4.4 4.14 1-1.15-4.4-4zM159 115.16l-5.88-5.35V90.06l-3.6-3.25-1.88 2.03v18.27l2.1 1.96v.27l-5.55 5.82-6.3-5.75v-.2l2.43-2.57V89.57l-3.18-2.9-1.3 1.4-.53-.53 6.16-6.7 6.16 5.5v1.34l6.43-6.84 6.02 5.42 1.34-1.42.6.54-1.6 1.7v19.34l3.03 2.85 1.5-1.63.53.54-6.5 6.97zm-17.86-5.9v-.13c0 .14 1.36-1.35 1.36-1.35V88.56l-3.86-3.52-.95 1 3.38 3.13v17.86l-2.1 2.17v.13l5.2 4.74 1.1-1.15-4.14-3.65zm14.15-.53V88.9l-4.2-3.8-1.1 1.16 3.87 3.45v19.7l5.07 4.74 1.08-1.15-4.73-4.27zm22.8 18.6c-2.24-2.43-3.8-3.45-5.9-3.45-2.23 0-4.8.9-7.44 2.3l-.2-.2 9.34-10.82-6.63-5.28-1.3 1.35-.53-.47 1.5-1.63V89.98l12.84-9.2 7.18 5.68 1.22-1.35.54.55-1.42 1.56v23.15c0 3.52 1.96 3.4 1.96 6.02 0 3.05-4.4 5.9-11.17 10.97zm-9-18.74V89.43l-1.43 1.02v18.74l6.7 5.4 1.02-1.2-6.3-4.8zm4.73 13.53c-2.23 0-4.26.68-6.16 1.96v.13c1.22-.48 2.57-1.1 4.88-1.1 2.1 0 3.85 1.16 5.6 3.2l1.37-1.1c-1.7-1.95-3.73-3.1-5.7-3.1zm8.26-6.5c-1.7-1.08-2.1-2.23-2.1-5.15v-1.22l-11.25 13 .07.07c2.17-1.3 4.13-2.24 7.3-2.24 2.72 0 4.54 1.08 6.64 2.84 1.3-1.1 2.17-2.17 2.17-3.86 0-1.35-1.15-2.37-2.84-3.45zM180 89.85l-5.63-4.4-.13.13v20.78l4.33 3.38 1.42-1.62V89.85zm4.12 24.83c-1.76-1.35-1.97-2.5-1.97-5.4V88.7l-5.68-4.6-1.3.87 5.56 4.4v20.84c0 2.92.14 3.74 1.96 4.95 1.62 1.08 2.9 2.23 2.9 3.8 0 .4-.06 1.07-.06 1.07l.06.07c.34-.35.75-.9.75-1.77 0-1.48-.75-2.5-2.23-3.65zm16.24.47l-6.23-4.87-1.3 1.43-.53-.54 1.5-1.62v-23.7h-3.93l-.14-.12 2.37-3.52h1.7v-4.53l7.16-7.65.14.13V82.2h5.4l.15.13-2.37 3.52h-3.18v20.5l3.72 2.85 1.42-1.56.54.55-6.42 6.95zm-4.4-38.64l-1.42 1.57v4.13h1.42v-5.7zm0 32.36v-23h-1.42v23.8l5.75 4.48 1-1.08-5.34-4.2zm32.96-21.05v18.96l-11.44 8.46-8.6-6.5-1 1.16-.56-.54 1.22-1.36V89.44l11.98-8.6 7.98 6.23 1.3-1.35.53.54-1.4 1.55v.02zm-18.2 19.5V88.84l-1.43 1.02v18.2l8.1 6.23 1.3-.95-8-6.02zm10.9-17.25l-5.7-4.47-.07.07v20.17l5.76 4.33v-20.1zm2.15-1.22l-6.3-4.87-1.28.95 6.15 4.74v21.05l1.42-1.1V88.84zm31 26.33l-5.9-5.35V90.06l-3.58-3.25-1.9 2.03v18.27l2.1 1.96v.27l-5.56 5.82-6.3-5.75v-.2l2.45-2.57V89.57l-3.2-2.9-1.28 1.4-.54-.53 6.16-6.7 6.15 5.5v1.34l6.42-6.84 6.03 5.42 1.35-1.42.6.54-1.62 1.7v19.34l3.05 2.85 1.5-1.63.53.54-6.5 6.97zm-17.87-5.9v-.13c0 .14 1.35-1.35 1.35-1.35V88.56l-3.85-3.52-.95 1 3.4 3.13v17.86l-2.1 2.17v.13l5.2 4.74 1.08-1.15-4.13-3.65zm14.14-.53V88.9l-4.2-3.8-1.07 1.16 3.85 3.45v19.7l5.08 4.74 1.08-1.15-4.74-4.27zM105.56 182.32c-1.9-2.03-2.57-2.7-4.8-3.32v13.27l-.14.06-2.7-2.44-7.86 7.24-.14-.07v-18.2c-2.36.54-4.87 1.76-7.3 4.2l-.14-.07c.47-5.22 3.04-9.07 7.44-10.56v-13.2H88.5c-1.96 0-3.05 1.02-4 2.85h-.2c-.2-.62-.33-1.57-.33-3.12 0-2.85 2.1-5.82 5.55-5.82h.4v-7.32l-2.77-2.5-1.36 1.35-.48-.48 6.83-7.24 6.36 5.82v6.16l1.5-1.63v-7.78h.74v7.1l9-9.67 7.65 6.97v29.44l-11.84 8.92zm-15.63-5.96c-2.78.54-4.74 2.24-6.02 4.47l.07.14c1.9-1.62 3.66-2.37 5.96-2.9v-1.7zm2.16-19.42h-3.73c-2.57 0-3.6 1.63-3.65 3.52l.06.07c.82-1.35 1.63-1.83 3.25-2.03h2.64v36.88l1.42-1.35v-37.1zm0-12.18l-3.4-3.1-1.07 1.14 3.04 2.7v7.65h1.42v-8.4zm7.9 3.86l-1.48 1.55v39.2l1.5 1.34v-42.08zm8.88-1.56l-4-3.65-4.12 4.48v23.82c3.52.34 5.95 1.35 8.05 3.65l.07-.07v-28.22zm-8.12 29.3v1.77c2.3.54 3.24 1.22 4.87 3.1l1.55-1.2c-1.62-2.04-3.24-3.26-6.42-3.67zm10.28-30.38l-4.6-4.27-1.1 1.16 4.28 3.93v31.46l1.42-1.08v-31.2zm29.98 9v18.95l-11.44 8.46-8.6-6.5-1 1.14-.55-.54 1.22-1.36V156.6l11.97-8.6 8 6.24 1.27-1.36.53.54-1.4 1.56zm-18.2 19.5v-18.5l-1.43 1.03v18.2l8.1 6.24 1.3-.94-8-6.03zm10.9-17.27l-5.7-4.46-.06.07V173l5.75 4.33v-20.1zm2.15-1.2l-6.3-4.88-1.27.95 6.15 4.74v21.05l1.42-1.08V156zm20.84 4.26h7v14.48l-10.77 7.58c-1.43-1.63-3.46-2.78-5.96-2.78-2.03 0-3.65.68-5.82 2.5l-.34-.13 9.22-13.38h-5.7v-12.6l11.3-7.85c1.37 1.1 2.38 1.7 4.14 1.7 1.35 0 3.3-.28 4.8-1.5l.28.14-8.13 11.86zm-7.56 17.32c-1.97 0-3.52.68-4.88 1.63v.15c1.1-.48 2.17-.6 3.18-.6 1.56 0 4 .73 5.62 2.63l1.56-1.15c-1.3-1.5-2.85-2.65-5.48-2.65zm7.24-11.37h-3.8l-7.9 11.45.05.14c1.97-1.44 3.86-2.38 6.16-2.38 2.02 0 4.12.94 5.4 2.57l.07-.08v-11.7zm-9.88 0v-10.88l-1.43 1v11.38h5.48l1.1-1.5h-5.15zm14.14-13.25c-1.42 1.02-2.23 1.56-4.6 1.56-1.36 0-2.98-.6-4.27-1.96l-.14.07v9.9h2.57l6.5-9.48-.06-.07zm-3.25-.6c-1.23 0-2.78-.62-3.8-1.97l-1.7 1.15c1.3 1.55 2.52 2.23 4.4 2.23 1.23 0 3-.34 4.8-1.9l.08-.2c-1.15.48-2.57.68-3.8.68zm1.14 11.63h-4.4l-1 1.42h3.98v13.13l1.42-1v-13.55zm16.38 18.34l-6.23-4.87-1.3 1.42-.54-.54 1.5-1.63v-23.68h-3.93l-.14-.14 2.36-3.52h1.7v-4.53l7.16-7.65.14.14v12.04h5.4l.15.14-2.36 3.52h-3.18v20.5l3.72 2.85 1.42-1.56.54.55-6.42 6.97zm-4.4-38.64l-1.42 1.55v4.13h1.42v-5.68zm0 32.35v-23h-1.42v23.8l5.75 4.47 1.02-1.08-5.35-4.2z") + + symbol#svg_venturebeat(viewBox="0 0 1743 222.2") + path(d="M208 0v44.4c-3.5 0-6.5.4-9.4-.1-4.1-.8-5.5.9-6.6 4.5-13.9 45-28 89.9-42 134.8-3.2 10.3-6.3 20.7-9.8 30.9-.5 1.4-2.5 3.3-3.8 3.3-22.5.2-45 .1-67.8.1-.5-1.4-1.1-2.7-1.6-4.1-17.4-55-34.8-110.1-52-165.1-1.2-3.7-2.7-5.1-6.7-4.5-2.6.5-5.5-.1-8.3-.2V0h94v44.3H74.9c10.5 41.1 20.9 81.7 31.3 122.3.3 0 .6.1 1 .1 11.2-40.6 22.4-81.3 33.8-122.5h-18.9V0H208z M356 58.3h63.2c.6 7.4 1.2 14.7 1.9 22.2 3.8-4.4 7-8.9 11-12.4 17.9-15.4 38.5-18.4 60.2-10.4 16.4 6.1 23.4 19.6 23.7 36.5.4 24.1.2 48.3.2 72.5v6.6l12.9.6v43.7h-70.8V212v-92.5c0-8.4-2.9-12.7-9.3-14.8-6.7-2.2-13.6 0-18.2 6-1.1 1.4-1.9 3.1-2.7 4.8-.5 1.2-1 2.6-1 3.8-.1 17.9 0 35.8 0 54.2h9.7v44.1H356v-43.9h12.3v-70.8h-12.2c-.1-15.2-.1-29.7-.1-44.6zM741.9 102.4h-10.8v-44c.8-.1 1.6-.3 2.4-.3h66.6v115.6H813v43.9h-65.5v-16.5c-2.9 3.1-4.9 5.4-7.2 7.5-15.9 14.1-43.9 17.9-62.9 8.3-14.5-7.3-21.7-19.7-22.3-35.4-.9-24.3-.7-48.6-1-72.9v-6.3h-12.7v-44H712v5.6c0 29.3-.1 58.6.1 88 0 4.1.7 8.3 2 12.2 2 5.9 7 8.9 13.2 8.7 6.1-.2 10.5-3.1 12.6-8.8.8-2.2 1.7-4.5 1.7-6.7.4-18.1.3-36.3.3-54.9z M345.7 149h-98.5c-.2 9.1.1 17.6 4.5 25.4 3.6 6.5 9.6 8.9 16.8 8.6 7.2-.3 12.9-3.3 15.9-10.1 1.3-3 2.1-6.2 3.3-9.6h54.6c-2.2 17.5-8.9 32.3-22.9 43.3-9.9 7.8-21.4 12-33.8 13.8-16.7 2.5-33.2 1.8-49.4-3.4-21.7-7-36.3-21.4-43-43-7.3-23.3-7.6-47 .1-70.3 9.4-28.7 30.1-44.2 59.5-48.6 13.2-2 26.3-1.1 39.1 2.4 29.9 8.1 45.9 28.7 50.8 58.4 1.8 10.6 2 21.5 3 33.1zm-96.9-30.8H287c.5-8.5-.7-16.1-8.2-20.9-6.8-4.3-14.3-4.7-21.2-.4-7.7 4.9-8.7 12.8-8.8 21.3zM1114 148.9h-98.2c-.2 9-.2 17.6 4.3 25.4 3.8 6.7 9.9 9.1 17.3 8.7 7.4-.4 13.1-3.8 15.9-10.9 1.1-2.8 1.8-5.7 2.8-8.8h54.7c-3.5 32.1-26 53.9-59.4 57.6-15.6 1.7-30.9 1-46-3.7-22.3-7-37.2-21.7-44-44-6.9-23-7.2-46.3.3-69.3 9.5-28.9 30.3-44.5 59.9-48.8 13.9-2 27.6-.9 41 3.1 27.5 8.3 43 27.6 48.1 55.2 2.1 11.4 2.2 23.1 3.3 35.5zm-96.4-30.8h38c.1-16-7.7-24.9-20.6-23.9-11.9.9-19.2 11-17.4 23.9z M535.6 58h18c0-10.6.4-20.9-.1-31.2-.3-5.4 1.5-7.4 6.8-8.5 15.2-3.1 30.2-6.7 46-10.3v50h25.6v44.7h-25c-.2 1.8-.4 3.3-.4 4.7v51.5c0 1.8.2 3.7.4 5.5 1.3 9.8 8.2 14.9 18 13.3 1.6-.3 3.2-.6 5.6-1v27.7c0 12.9 0 12.9-12.7 14.9-13.6 2.2-27.1 2.9-40.7-.3-19.1-4.6-27.8-15.5-27.9-35.3V103h-13.7c.1-15.3.1-29.8.1-45zM826.2 217.6v-43.9h12.7v-70.9h-12.6V58.3h62.1l1.9 25.3 2-4.4c5.1-12.9 14.4-20.7 28.3-22.2 6.7-.7 13.6-.1 20.3.3 1.2.1 3.4 2 3.4 3.1.2 15.8 0 31.6 0 47.5 0 .3-.3.6-.6 1.1-7.6 0-15.5-1-23.1.2-16.2 2.6-23.8 12-24.5 28.5-.2 5.8-.2 11.7-.3 17.5v18.2h18v44.3c-29.1-.1-58.1-.1-87.6-.1z") + path(fill="#ED1E25" d="M1237 .3c8.5 1.4 17.1 2.2 25.4 4.3 34.3 8.6 51.7 50.6 33.5 80.3-4.4 7.2-10.5 12.4-17.7 16.5-3.2 1.8-6.4 3.5-10.3 5.5 2 .8 3.4 1.6 4.9 2 23.7 6.9 34.2 24.4 35.9 47.6 2.4 31.9-17.7 55.7-49.6 59.6-9.9 1.2-19.9 1.9-29.9 1.9-31.7.2-63.3.1-95 .1h-5.8v-43.8h18.9V44.4H1128V.2c36.3.1 72.7.1 109 .1zm-32.3 128.8c0 14.9-.1 28.5.1 42.2 0 .9 2 2.7 3 2.7 8.3 0 16.7 0 24.9-.7 6.1-.5 11.7-2.8 15.1-8.4 8-13.2.4-31.6-14.7-34.2-9-1.6-18.4-1.1-28.4-1.6zm.2-40.5c8.7-.5 16.9-.2 24.8-1.6 9.6-1.7 16.2-11 16.3-21.2 0-10.2-5.9-19.7-14.7-21.3-8.5-1.5-17.4-1.4-26.4-2v46.1z M1743 103.3c-7.5-.1-15-.4-22.4-.2-1.1 0-3.2 1.9-3.2 3-.2 18.8-.6 37.7.1 56.5.4 12.3 7.9 17.4 20 15.2 1-.2 2-.2 3.2-.3.2 1.2.5 2.3.5 3.4 0 10.8 0 21.7.1 32.5 0 2.4-.3 4.2-3.1 4.7-16.5 2.7-32.9 5.1-49.6 1.2-18.7-4.4-27.7-14.3-28.1-33.4-.5-25.5-.2-51-.3-76.5V103h-6.4c-8.3-.1-7.3.9-7.4-7.6V58.5h18.4c0-10.1-.1-19.8 0-29.4.1-10.6-1.5-8.2 8.7-10.7 14.2-3.4 28.5-6.5 43.5-10v49.9h26v45z M1569.2 119.2c0-5.4.3-10-.1-14.6-.6-8.5-6.1-14.1-13.8-14.3-7.7-.2-14.1 5.5-15.3 13.7-.3 1.8-.3 3.6-.5 5.8h-53.3c-1.9-20.2 8.6-38.7 28.2-47.2 28.5-12.3 57.2-11.2 85.1 2.2 17.1 8.2 25.9 22.7 26.2 41.7.4 20.3.2 40.7.3 61v6.6h12.8v43.8h-66.2c-.5-5.4-1-11-1.6-17.4-1.5 1.7-2.5 2.7-3.4 3.8-17.3 21.3-50.3 21.2-67.2 11.3-13.4-7.9-19.2-20.5-20.1-35.4-2-32.6 15.1-53.7 48.1-58.7 11.6-1.8 23.5-1.6 35.3-2.3 1.6-.1 3.2 0 5.5 0zm.7 28.2c-5.4 0-9.7-.6-13.9.1-12.9 2.1-19.5 11.1-18.1 24.1 1.2 10.7 10.4 16.1 20.3 11.9 5.3-2.2 8.9-6.3 9.7-11.8 1.2-7.9 1.4-16 2-24.3z M1475.6 149.2h-98.5c0 9.7.1 18.9 5.6 27 4.2 6.2 10.6 7.7 17.6 7 6.8-.7 11.9-4.1 14.6-10.5 1.2-2.7 1.8-5.7 2.8-9h54.4c-2.2 17.5-8.9 32.5-23.3 43.3-17 12.8-36.8 15.8-57.3 14.4-8.4-.5-16.9-2-25-4.5-21.4-6.5-36-20.6-42.8-41.9-8-25-8.2-50.2 1.1-74.9 10.3-27.1 31.1-41 59.2-44.8 13.7-1.8 27.3-.7 40.5 3.4 28.2 8.7 43.2 28.8 47.9 57 2.1 10.8 2.3 21.8 3.2 33.5zm-58.1-30.5c.1-9-.9-17.2-9.5-21.8-7.3-3.9-14.9-4-21.6 1.2-6.6 5.1-7.8 12.5-7.3 20.6h38.4z") + + symbol#svg_microsoft(viewBox="0 0 609 130") + path(fill="#737373" d="M213.2 74.3l-3.6 10.2h-.3c-.6-2.3-1.7-5.8-3.5-10L186.5 26h-18.9v77.3h12.5V55.6c0-3 0-6.4-.1-10.6-.1-2.1-.3-3.7-.4-4.9h.3c.6 3 1.3 5.2 1.8 6.6l23.2 56.4h8.8l23-56.9c.5-1.3 1-3.9 1.5-6.1h.3c-.3 5.7-.5 10.8-.6 13.9v49h13.3V25.8H233l-19.8 48.5zm50.6-26.7h13V103h-13zm6.6-23.4c-2.2 0-4 .8-5.5 2.2-1.5 1.4-2.3 3.2-2.3 5.4 0 2.1.8 3.9 2.3 5.3 1.5 1.4 3.3 2.1 5.5 2.1s4.1-.8 5.5-2.1c1.5-1.4 2.3-3.2 2.3-5.3s-.8-3.9-2.3-5.4c-1.3-1.4-3.2-2.2-5.5-2.2m52.5 22.9c-2.4-.5-4.9-.8-7.3-.8-5.9 0-11.3 1.3-15.8 3.9-4.5 2.6-8.1 6.2-10.4 10.7-2.4 4.6-3.6 9.9-3.6 16 0 5.3 1.2 10 3.5 14.3 2.3 4.2 5.5 7.6 9.8 9.9 4.1 2.3 8.9 3.5 14.3 3.5 6.2 0 11.5-1.3 15.7-3.7l.1-.1v-12l-.5.4c-1.9 1.4-4.1 2.6-6.3 3.3-2.3.8-4.4 1.2-6.2 1.2-5.2 0-9.3-1.5-12.2-4.8-3-3.2-4.5-7.6-4.5-13.1 0-5.7 1.5-10.2 4.6-13.5 3.1-3.3 7.2-5 12.2-5 4.2 0 8.5 1.4 12.4 4.2l.5.4V49.2l-.1-.1c-1.7-.7-3.6-1.5-6.2-2m42.9-.4c-3.2 0-6.2 1-8.8 3.1-2.2 1.8-3.7 4.4-5 7.5h-.1v-9.7h-13V103h13V74.7c0-4.8 1-8.8 3.2-11.7 2.2-3 5-4.5 8.4-4.5 1.2 0 2.4.3 3.9.5 1.4.4 2.4.8 3.1 1.3l.5.4v-13l-.3-.1c-.9-.6-2.7-.9-4.9-.9m35.4-.3c-9.1 0-16.4 2.7-21.5 8-5.2 5.3-7.7 12.6-7.7 21.8 0 8.6 2.6 15.6 7.6 20.7 5 5 11.8 7.6 20.3 7.6 8.9 0 16-2.7 21.1-8.1 5.2-5.4 7.7-12.6 7.7-21.5 0-8.8-2.4-15.8-7.3-20.9-4.7-5.1-11.6-7.6-20.2-7.6M411.6 89c-2.4 3.1-6.2 4.6-10.9 4.6s-8.5-1.5-11.2-4.8c-2.7-3.1-4-7.6-4-13.3 0-5.9 1.4-10.4 4-13.6 2.7-3.2 6.4-4.8 11.1-4.8 4.6 0 8.2 1.5 10.8 4.6 2.6 3.1 4 7.6 4 13.5-.2 6-1.3 10.7-3.8 13.8m46.1-18.4c-4.1-1.7-6.7-3-7.9-4.1-1-1-1.5-2.4-1.5-4.2 0-1.5.6-3 2.1-4s3.2-1.5 5.7-1.5c2.2 0 4.5.4 6.7 1s4.2 1.5 5.8 2.7l.5.4V48.7l-.3-.1c-1.5-.6-3.5-1.2-5.9-1.7-2.4-.4-4.6-.6-6.4-.6-6.2 0-11.3 1.5-15.3 4.8-4 3.1-5.9 7.3-5.9 12.2 0 2.6.4 4.9 1.3 6.8.9 1.9 2.2 3.7 4 5.2 1.8 1.4 4.4 3 8 4.5 3 1.3 5.3 2.3 6.7 3.1 1.4.8 2.3 1.7 3 2.4.5.8.8 1.8.8 3.1 0 3.7-2.8 5.5-8.5 5.5-2.2 0-4.5-.4-7.2-1.3s-5.2-2.2-7.3-3.7l-.5-.4v12.7l.3.1c1.9.9 4.2 1.5 7 2.2 2.8.5 5.3.9 7.5.9 6.7 0 12.2-1.5 16.1-4.8 4-3.2 6.1-7.3 6.1-12.6 0-3.7-1-7-3.2-9.5-2.9-2.4-6.5-4.9-11.7-6.9m49.2-24.2c-9.1 0-16.4 2.7-21.5 8s-7.7 12.6-7.7 21.8c0 8.6 2.6 15.6 7.6 20.7 5 5 11.8 7.6 20.3 7.6 8.9 0 16-2.7 21.1-8.1 5.2-5.4 7.7-12.6 7.7-21.5 0-8.8-2.4-15.8-7.3-20.9-4.7-5.1-11.6-7.6-20.2-7.6M517.2 89c-2.4 3.1-6.2 4.6-10.9 4.6-4.8 0-8.5-1.5-11.2-4.8-2.7-3.1-4-7.6-4-13.3 0-5.9 1.4-10.4 4-13.6 2.7-3.2 6.4-4.8 11.1-4.8 4.5 0 8.2 1.5 10.8 4.6 2.6 3.1 4 7.6 4 13.5 0 6-1.3 10.7-3.8 13.8M603.9 58.3V47.6h-13.1V31.2l-.4.1L578 35l-.3.1v12.5h-19.6v-7c0-3.2.8-5.7 2.2-7.3s3.5-2.4 6.1-2.4c1.8 0 3.7.4 5.8 1.3l.5.3V21.2l-.3-.1c-1.8-.6-4.2-1-7.3-1-3.9 0-7.3.9-10.4 2.4-3.1 1.7-5.4 4-7.1 7.1-1.7 3-2.6 6.4-2.6 10.3v7.7h-9.1v10.6h9.1V103h13.1V58.3h19.6v28.5c0 11.7 5.5 17.6 16.5 17.6 1.8 0 3.7-.3 5.5-.6 1.9-.4 3.3-.9 4.1-1.3l.1-.1V91.7l-.5.4c-.8.5-1.5.9-2.7 1.2-1 .3-1.9.4-2.6.4-2.6 0-4.4-.6-5.7-2.1-1.2-1.4-1.8-3.7-1.8-7.1V58.3h13.3z") + path(fill="#F25022" d="M0 0h61.3v61.3H0z") + path(fill="#7FBA00" d="M67.7 0H129v61.3H67.7z") + path(fill="#00A4EF" d="M0 67.7h61.3V129H0z") + path(fill="#FFB900" d="M67.7 67.7H129V129H67.7z") + + + //- Filters etc. + defs + radialGradient#gradient_allenai1(cx="75.721" cy="20.894" r="11.05" gradientUnits="userSpaceOnUse") + stop(offset=".3" stop-color="#FDEA65") + stop(offset="1" stop-color="#FCB431") + radialGradient#gradient_allenai2(cx="75.4" cy="42.297" r="82.993" gradientUnits="userSpaceOnUse") + stop(offset="0" stop-color="#3FA9D0") + stop(offset="1" stop-color="#183A74") diff --git a/website/_layout.jade b/website/_layout.jade index 482af35fa..b198c8333 100644 --- a/website/_layout.jade +++ b/website/_layout.jade @@ -45,6 +45,7 @@ html(lang="en") link(href="/assets/css/style.css?v#{V_CSS}" rel="stylesheet") body + include _includes/_svg include _includes/_navigation if SECTION == "docs" diff --git a/website/assets/img/docs/architecture.svg b/website/assets/img/architecture.svg similarity index 91% rename from website/assets/img/docs/architecture.svg rename to website/assets/img/architecture.svg index c1d12d79b..911aaec60 100644 --- a/website/assets/img/docs/architecture.svg +++ b/website/assets/img/architecture.svg @@ -1,9 +1,13 @@ Language @@ -14,37 +18,37 @@ - nlp.vocab.morphology + nlp.vocab.morphology Vocab - nlp.vocab + nlp.vocab StringStore - nlp.vocab.strings + nlp.vocab.strings - nlp.tokenizer.vocab + nlp.tokenizer.vocab Tokenizer - nlp.make_doc() + nlp.make_doc() - nlp.pipeline + nlp.pipeline - nlp.pipeline[i].vocab + nlp.pipeline[i].vocab pt @@ -80,7 +84,7 @@ - doc.vocab + doc.vocab @@ -94,7 +98,7 @@ - token.doc + token.doc Token @@ -102,7 +106,7 @@ - lexeme.vocab + lexeme.vocab Lexeme @@ -112,7 +116,7 @@ - span.doc + span.doc Dependency Parser diff --git a/website/assets/img/docs/displacy_jupyter.jpg b/website/assets/img/displacy_jupyter.jpg similarity index 100% rename from website/assets/img/docs/displacy_jupyter.jpg rename to website/assets/img/displacy_jupyter.jpg diff --git a/website/assets/img/graphics.svg b/website/assets/img/graphics.svg deleted file mode 100644 index a449c3d04..000000000 --- a/website/assets/img/graphics.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - spaCy v2.0.0 alpha - - - - - - - - - - - spaCy user survey 2017 - - - - - - - - - - - - brain - - - - - - - computer - - - - - - - - - - eye - - - - - - - - - - - - - - bubble - - - - - - - - - - - - spacy - - - - - explosion - - - - - matt-signature - - - - diff --git a/website/assets/img/icons.svg b/website/assets/img/icons.svg deleted file mode 100644 index 104117cc0..000000000 --- a/website/assets/img/icons.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/img/docs/language_data.svg b/website/assets/img/language_data.svg similarity index 88% rename from website/assets/img/docs/language_data.svg rename to website/assets/img/language_data.svg index 31e1a1b29..e24bb7809 100644 --- a/website/assets/img/docs/language_data.svg +++ b/website/assets/img/language_data.svg @@ -1,13 +1,16 @@ - Tokenizer + Tokenizer @@ -33,50 +36,50 @@ - Language data + Language data - stop words + stop words - lexical attributes + lexical attributes - tokenizer exceptions + tokenizer exceptions - prefixes, suffixes, infixes + prefixes, suffixes, infixes - lemma data + lemma data - Lemmatizer + Lemmatizer - char classes + char classes Token - morph rules + morph rules - tag map + tag map Morphology diff --git a/website/assets/img/logo.svg b/website/assets/img/logo.svg index fc776fb82..89b61e132 100644 --- a/website/assets/img/logo.svg +++ b/website/assets/img/logo.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/website/assets/img/logos/chartbeat.png b/website/assets/img/logos/chartbeat.png deleted file mode 100644 index 40e644154c61af56595579b41ae5713d14ae1227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2761 zcmV;)3O4nLP)Q`p$u&lH}1@kL0mMYQYnB0k3t_!2KeTzCgZpr{0S0P1L8BmB;r_IZ1S-kMW&to0TSJ!eKY=73A`PEIEKdUo&#XX*qv*6Vr;ANI@)4wVvo;A4?RqMKG=%uCS4XI2Gya7}sDox0 zffGv z?s)-19P9r3!t`z*U>yCS4r}pSh!@px8tPEvF$?4coPuHzo(2Nr861UTyz4;n4BJ)k zZ$oy@%sYHnzaaZp-r+k3{B`Kgl?A4p?GK4+)Aa+ERcC9)^ilro0gwQ6g*rq-{4fG) zoWaYFQ6O*NDirIV2IBGAEc6)2oa1+M&pLMJ=ZjC@|8eRi{pFZFH@@z-`SNRnw_SZF zh+ZGG^~%?y_ul%|fA;Bfkm^lhzKd=VchST#2@-(cK^Z84e#MI;|qM| zB9NDm2Tjox?Gb_RApv+B#nA#?5oi6|{qZwIA`YF=8l~|e1h!Z3y7g?9LhunjGrq*9 z{|h8kW*xbsONeB}JuL?*8P&8>)n*+vGWP%DSOp1C0jO~buRsFl>X`Q{Y=nBS6mLSj z_!i5dUTp9(_>!QQ2{E!_9@3#m!+k@IblkTn_IU{80|=_(I@E(ydjYtcnb9J}!*BtRpfMmIP6Kn;7~Ds0ufEDJV5Pz#y?<6#GK4qsp-)Zsb~;kt`cKwDAVfjZpAVO)Y* z+CyM_35%hYG!M`51U`Y_d7Om0)Yb|Fm~AXQrJ8b9HR+6hlCj`Kx+dJvT}vA-`_JSWy!TAlf~y)n@5JqA zAf=+44UhP57>cVwxGDb(X;56n+o1}?GTFyIW;N942r)j!9jH+j;>AFyG1EgJhj9Ul z>Mk~-tK4tW0i1F1TD62a*t2I&q(P0wE|yN}@N0-s%!=%5hzIZC2-K+I<=ISecg$-E zPg?Xr;e`3!!jcyCKqnt!!x9(uFP^w?L7}ZFzkxu?)oC@~%o=L^9Fjr5fEwE&nGi^- z%bR?Ky|#ZH=Uv4Cyo^&&+{35#i|SCzj$Z79F3hQa@(B*>9+k zF9d@(C6fXv3~^x|)W{AoK1FVbOQWI2-#rAf8WN&FYCv3i2}htv$JY>i2Q@ZATzVBJ zp}2t8Ax3U|6Tnh@mzQTVJ)l4;tw{WFh13M~i9jl>PSSF_HWY+JHR$kuWYf+^B4W+V z0fdEU@TO)$Acye`#Dz9cqW~m8aZsbAhd|1QD3BWg>=8Rdjmi*2L5(sH!0%b<_mBWB zh2kt;^6+ft1r!K_|0izZD8Dx4Z27Hge*%eW)G=pd^RCy}bGSd@@ZYbY#;!~VWIDv9 z!hQ_k=aCbI5sB95h8V1c8YMgg@5mMiUqJ zD!)M~)I%(KpgWF1aRILcJCGl+4O_6rMjU&~Z(O;!{MI$^LZa)&{v)zwceUbZ0SU4% zkq*U8ydUB~#sv85DnekZh9q2vx)2WgMLmO;9-=^UL9GF|8X5#WA(ju&1v`-j_2C>| z_WLHC&w?VVUR-!Yo1S(Y{U9N70BYn3aUkOZ{B`AFhj9gJxrNpcl zWP=(DAlPKzQ3R-=by_$O3fl#2!ZO5TC{8}`Kv-5awg0jh2??RGP~$(3KpM#j;@dciRSe8D}Kq8xUZR?yh zjCqg{D*-hw<2^_Qyn**Z6i7j+aUUfhK6H3sfdJn@{7@chG>2dq)c7SNgE~QtP51)h z!?Fh!2w^xjQUI1iGD!l|m<7pz?NAg6VjyK97;bG=#f3@!2NKka!pe{UkEQ08zXc(XQqF1K_z}d1cX27m zfo$|MkYqpiA8AmWz)KLkgG*4{M;3@nucIDv!`|bpfVfcE%O?GGT!vynFavoGYoV6I zcmtBjdO__0?uTwrBOTudaRw<3!Ca{EXNV8upg{=4`M>5);(7Oh__dGR05#$u4qc$e zRy+%FVWRbZR3Ac(Z4e(m#U(F+I1hR@2Q3f}aa=+c$OAG3>aYfXf_U*;BtspV1bGiq z&fZUWo6hkX=0bxK2(aACY2SPJzz)PR$;%tQkC6g34&qga!}Hh*HFo0X5D(t5X53{E zVSHF-ph&fjGD~J4kg8DQESe$=aY%>aEeO^@u^028#vR0?396zQ z<{%AfT)<~uF7ggR9X6vU>Z2h#VF~VAzvmYaBMj=W6cGqVdBkEp)aZwaP+Wu^Z!M^C z8jVmCU7fqQV=Tm_zj-+3{hiCZfbFnP>B1m*1?R1w z=f(o42Y2u;1goGpfmhKP>cR$m8#v^+gAhODKp(8f z1>C|-oWnZ&+r>dfb_~Z3$KUA^HlQzlux6d}i1D(gj>TczLK-e%Dn9!^VOmdpjYi8= P00000NkvXXu0mjf$-)Gl diff --git a/website/assets/img/logos/chattermill.png b/website/assets/img/logos/chattermill.png deleted file mode 100644 index 6f98359d53b64fad4266ee6df60b80f26479e5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6351 zcmV;=7%=CFP)U03o83yT$v%`NeXDZ!zU zF>y(J$SWvnXl(B5$Mi$|8yg>=o|#!(R8LOLET~ilgVAI%x!rDYv;700L9f@BS60Wy zCuL>lw)Xa#y`8=N17Q)-scD%whP?bDAd+8LoO7iB_mGpDUr<=WA^4A}>1m)KZnl2_ zG~nb*%PQg$Qmzyh56{oaoo;1|yKjOIIe7(9F$rlImlBiH@DTBdsR>DGd?sqdB_v13 zCPc-=^M6WOW<^!?(9p2cNjcx7WQQyivun%Dc zUjp$Qm>8GhQRlF3OVHw9KQ*3D6F1w&&ncRkTm1t=rsn7QY}_9uJa$ ziz>a@<4#UVha7w(6rh=rG4Y5I4pC~>)H3a>$F#2;<7~trOM1EJ-q@PNCK|fCdxJv4 zGcV;hy}VJte(#*oeImIB%`*qgLD`afXl;v(j!XMmD8$4iB2Ekp4~w+vMZ>{p&C~m} z@1Bvc^{K!1&6Dc;wm4b_#Lc!b(O|JyT~1etqBJ%>IU*{qzPW`?+vRHE`GY`#35_ka z@0=C|qt4-oPe@5l%eWO3qGA)0QqreYDk(ZtwsD~F!eJmKqe}bw30#gjrogTF!R*25 z^4J_6t6g+$W-hmG9*;aq9*1)kEpSSmcE>tsfcB4~DUMH|8Kh=p5$~g-y99y`&n>jQ```%f@?r>i;SgqEo znyV_+Vs2gm?mbO5YD@xZqjav8>zd~d$#hb(>y|*#>7LXqk}Ti=qT>=#pV(i9LbMkO zI;&ZNLS!CL;F2HG}tTJkYDxNg56r9&rim$($)8Glc(LrZ{GKRb(j08`@N3bL%%| z4aUPU`p^8O+~H$C!+~g9Nh8C(j0SR7qL{O9+&!l;o=oEEY&;~4>E^*=WEl~|?lAU& z7U(|nH=Rp$&8Sx{SKbPs_1i(ii;zs=!0lIh3vOjXZ{M62Y3FEN@dZfqP5@Zg`^}(F=ay3L!zcbW1GW{LUK;4oR z45S9$3bj;~X0pnKY3u|gq#xr^*i1>yun`x$&3HCN^t+@H-S<_*{;VMIPG!{p&N=sC zOCCQvf^*dOe5rl!oLuNK9#2?esioya94g(bpaAkD-MXNt#O-$70@7~jjvw2jd1wbu zqI>_G@XAs3JzEz4_NnQsG;-)0zTpU$gVvGnsQ><%_Vwe!vj^Cp8!#M*TAtjT&6-!M zef7Bd?k_bD?%-6YqL6Af#?C#vgR7^O9q;L&4b%D_iWMJD{Xw>D-n>NaFA-g z-u|V$emmB zuSrG<&Q{;?Id~!i>QZ^_{gK?(A;G-KpGf&N-FyOkP7@vf} z$ZxGVH8-ZD+ju07p=Z+IT{sm9BsmzWC}T|qw6xd2BteI%56G~(y{g^Oa@|qaBWB~y_IpL>UCO9G6o)=rn`XA!#Kcmuu1|W}mVQfIk?1{PVX=|`f$eYJ@J40j zRe4qg)aWjL#D%=dQX6=)>u)0J%Pfk}_tXRlZ}527JZz?nhafWk`98JnZdEJ5mI;txXuY(+4Miw1FY zUThl{t2$iyb+*J3OF)+KaIA4}glMo%>vh55QA7=I5J}R^F3j4EgC@zT7ESm6zBuHr z(kQ6I-cF^6r?M}jNNN_R11Jz~F#N61P*|uK86BfCvJQ_+EoIQTU3*>kH|G>D9dUH{ zLdtkLNx)%jx#%%jzK&4l*Ww$PVa}ehm1B>_<5$Qje6({w1{xS^Y_^6Lx?F~%ahwOo zv(6!e#u~j#LW6ew{K8|h0u=Zf6OPGBl>OdlfZ;>;n9!iX9AC_! zo5QcjnOK5oQgrxCTwtWp6Tw}9q9w#8vi?%S2(Yl&i(c?u!w8w1w zo@g-a4CRt=CFn8x5esE`V0i-~M!$4>YMB_8FV^*%^@iTQe#{&(+VWr157(;3hYjjK z7Kh$f7X7>8ko@WX*rDcsy>j7yW}m9nPKizrTmw3S$-ibJk)a?mF)=waGka6M?*QzQ zEw?hWZQo08AOs{Yp+RR{z2XntP(3jmiD4k52j}sb5}={?`}+p+Nw^EL3PXpZVp6Sa zi2CoGVbkx6^w{jnzJZ@?rA=RlhS6Cc-@q-A?5s(Y94^ve&>+Xt?}-KyCqW`#H_Q(d zNX!_Nch7PbP{QbF9^Q%EM9i}six*p${P50}!vB+V?!k)K=)uOnDI@-0?s=%gQ#NNz#zUJ%x7^8#{$e5y5QP&94`G?=3cNQC$T zV<$imCKyvlI5?0})ldD6yTUCOGQ^RYr9ofN*uA*UpC0&i(M50oX?UzEaaUXM1LZM) zED5`}Eav{Qn19Rj^S@pv7e2lb4T&ik-nu2IKlc-FmqOBVlQ4PW2B&gX~?*3B{TRw&4y*LD#BV z4Fq*xG#rl8JRwm+kI}LQ4bv*nz-c*~uN6acpuL#cH8gdbpguX(YA&y+LVAJ>1_g(AG`5;V&!d$Ie^W%r6)Q1sQBW3eR16tW%mqwW1rbZK(oPoV@q9}($QA|q znumAr@T(2%F`5m>;vjV76h6LzA*S?72#^yzF6TwVqVDZ8Pytgw=8fFXzFg>{pHmTf ze1v3{c$uRL+$!BhMZ=9YIysq|c`561uKXSZ6PmRu7&6MMNTM+$d1o*yT?aaQ8O28` z}2pTa33bK`j)P zzKn~evx?VhK55VW_$qzI*g;C57mgonrsaz8vnnnH}G{GG@O;P5_l*=(6SHE zy?N3Ubjf*r5>Nt5nG>cmTmzalB zE%~#I3XUS|vOoGXOD>Q%5RTxLs$aZCbY8Mx(*QIDb?a7WKxopww+c4wE#BYj%!NiHq@^|aA|9|fJf4$=OYHbFmZEtF2(F56IQ)id5 zsv4CuIW1FGyMYK^fpY@2s+w!xP^8GO<&Gs~`u=Sw$_TDNfyCHW*(OJQYj!pL5JO_0 z&#~yWi+}!@aYr!r8qx+c)jY7>t8?!q45|P8G13#rz`E)?zi_kq|xgRt{^}SoUCH1{q*ie_5)26^Ih|7%? z5}n)z$I1xvX{=d7Fa=evwbc#eip4*Ch>bm~%c^##_N_CEfBJ|zj-0;I%pp1IKYv2i z4FPuv4a3u%kkMGZR9#YL@7|()`KW}3W$xC}+J@kGtCAJ{fa5|yaC>u`;Ih>(PTE|~ z_ZxElToQ(RVEb)R$o_VP(P2B&Q}wIz@O#T++@hzYwvhtF%HWEk;Bkxzi%s3##iiw_ z;9w#kC{)T?zo|Kgrb!5mrxMv1DMoPh3KUET#u;mQ9{3b*(2vcDie(KS0%1uhrOt$3 zHJ(bcRkkm46dVa9$JK{3H9524a10TL9bD6k;ti&Y8b}GocqA5Q%isCDF%CB7QnGlP4IauhPW=jYunk|C(`D%)S&8w>3`0< zaCd2x3Z^ouaIZx!eeF=oZ9CLOZe6cqqokIuUe3i&NZe z8x0M1yB(#7x>03y4RlY20-7=YpsllOa&~rndRlVG+11XhYV7?{OWsfO10E=s9K&ir z{J)%Y=LYK}03=8hM)%@T}4%(qUpwIo9|Qb zM>)tQSdGFuSI_{(3ki#A?dV(yz=;ZEO4c|J+6^phA;Sa#YtaxR36TXClV-fcep*f3 z(!OvQ3MQ|bU#)qA1DV4ke338EgCOXw+zaAHXq#`>lqkzW!(&+P9G{fRQid+?LP%G~ zFm%RxsS*k;=Wjj2>>VW$H=}_KZ$XyvA9;SqyDOFw9gP9u2yGjGK(f132l0i)1=L0| zZy3Iv^&p#VBcQ=*v#~ZhBs_`$(c3>DzoCI3gG;B(4<_W@dbM+RDI(WJgB&mZu8jCe zzJG%-?KD{|UTw>CAWHwSpAJtzfO!5Oxg2#eA7s$US`SIy*&uE6%{!8du!v}xFgogc zapUM^IC;Ul&PUE_S~OFCSA_pv8M!VR*ifYqt*bQSPK|zeWOT{AE{`~&5^K7wv4y5n zN$^UX0Rke?$6Ge@zP|1jYBFI-^t*+H4yQ4b)eto)H~n z!ViTs`(@C-sMQ8t3>)bl7BROXp9>0Y~*!Q$zADO(fV=X zc=rge0EGk=^0J@d(b1gTf}oIy@!p{!*Ag0jQ4n;vqjdEdt}cwROp*79**RlV9&iS7d1pY^!fAB!P4;p@56#OrFe*Zn|#0ytb z#m#n`qv4yIV7K`9U;C&b2R9JZU$^?FHeu$C+RPoT#b^7jDrN`8&35~={{(i3Uor3> RFlPV&002ovPDHLkV1hNAPmcfq diff --git a/website/assets/img/logos/cytora.png b/website/assets/img/logos/cytora.png deleted file mode 100644 index 24040dc4f0a790a0c979c1c0d9cec0fd6bce16c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3028 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 ATmS$7 diff --git a/website/assets/img/logos/indico.png b/website/assets/img/logos/indico.png deleted file mode 100644 index eb840a431120400ddbd083ffac23bd618d206568..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 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 M07*qoM6N<$f^*YhivR!s diff --git a/website/assets/img/logos/quora.png b/website/assets/img/logos/quora.png deleted file mode 100644 index 07c38144cb6d41052c9607a53a0218aa16ceefac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4705 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�IQvA^)|$T6C9-7XM3eELm_`*4rVcDc!7HkOyMSh^A@uKaz&mSvd?aM{I*X z>_o+kJh#%DMmxIZ;Pm>7L7l$aMb)V%1F(9CQU^dh=g~h4oAJ68(^xqhndaJ9M<)Ye zz_L00@<#zIaHIP?dnE?lCqi4_PQBtCdv+n}9jzEx0M)0#ra$mc1z|Ex;^utan7-Q5 zX`rRx$&)AM%bl}6b+)^}ur!jKy`40fmorN1gG4vTddCGUL6(fPyCKE2&DOB77EU)k z)J@CFOTzr>(B{P;y%P72q;(Pduz_U>veqwj*I|fkzuNfYK=p-0FU0uE1D02`v3^^4 z8(JeVHqycT-4Fr~;Pp3GW_+bL8Ju*XcT(096 zNJl(477fe}#Tr~*wkY%}@!AD}@j`?(x+0AvKWS4eaF9iaMTvsW!zsAe;p~v(h6;$s z0hnSu+tzIUSHh$l9O19aAs_7F5}_bnS}Z}*E zz2X*qbZe1Y!`eU9P+zxQjSjTOgm;tNKFQO5?Y2_&b|I1r!#zw5j{?}-n2=%3J8fMp z;yjk=CbPZQABl+21)NjAtefgtKjj=0kVL2h6zsAxLP3+0hJRQ@0?VPwUaO(r7n}*5 z{tW=|kgV%3iY2(o!AyL{H&Uij1e8Z-)StEqdF`3FArD89?kN}6Vv&o>;1<8JeLVOn zU1Zz2^6dbu4EKAq^Y;#tevm?R9$PP;=r-y?xdY?xx2_lYx#raL;#~Jx1EVwT>l$)H0@fR@J zi||_$Xex-|fP4)A9!SWTpPWO9d~z)Ev#9e!%bAx~ zr54g;nPY^!Xi;!e8~{ev;P8ACYw|!ppL#}sCzj7iG4Yy5BB z-nM-J-5E3ba1bM2)1EEIrWNaj2EhRZNDZL0KRuLg!esctKxt?XxHP1{t ztF}D(ER@eA8FSoCL1T}FP$4-c7M_BLdW|oj&#h3pFls}aQMG>eo00000NkvXXu0mjfNPP%) diff --git a/website/assets/img/logos/signaln.png b/website/assets/img/logos/signaln.png deleted file mode 100644 index 078f50380b224277d86648f969f2901625a4063f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3321 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 DMAKXH diff --git a/website/assets/img/logos/socrata.png b/website/assets/img/logos/socrata.png deleted file mode 100644 index 079872c4e2b57d98eb2e2cf541d08b74eb353287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5121 zcmV+c6#napP)6XvayRhYxn_*fDY9#J+v|cJ11w zW5@Pg|L*GN>$`mE(zB;dso%Y$je6a>cSny(`-EsVCBB3Ffza5=o;h=7(4c|VHrCm* zXG@gGjFLEU;-pEFBu>mjY^hqM^2@hxX&GI%Y(&eZ{;w{PFNbt@_= z>eHuBe^5*)gmQcl5fNTqgNhU>3{L6Nrmb4F%3pu|HGcf~1q&7|Uc6-9ym=!>jwn~I z%zyy{X#DZ;;i&xiqe_*E$dct{=gyxsp#BuU#}6OQm@%VqlEDO09QlO|351`XD)UHkm`Gexd@3yY#g z0|rEzn@6iu(bcM zPyX)saT@6D0h`Jc1q&8TojNrx?iZzkck|}Wo8OW`IYx{{iWDjQ{QQ0;gfdo-?%k6l zNm8X!rI=T*G_k}(j@#be-owMAYuCRPESP`d#0d@;?Ywd0#{T{L-!uL5=h0QGMwKot z%E!M^#fnAb$_1Uqj358$&K+GX6q%@2ttyr;Yu2o#OP78tj!!(TeL~_8<9&_S7+I?6 z%{<)Q1;QbN2PbTB0|=o|3k!=(nKBYc@E92x(XL%PM@J_-#@VxHM@B^{4yWF@G19_9 zR4}q|;fS0$pV`>N%$V^-ETsX90)OGcg|U37AY}Zn<4EF=z`($B=gwWYZ~@3E;KZhWiZ-}8`qyde{Ng|+}zy6 zWg9taR9x76KVG#uBqUgtirTz*@xrjNnYIJ2Jp9(XcTag7GGs9N*R*Mqy?ggaO=w8S z)~#C?Em|~h-rVIYRy=$Cn#xx_djcV}iRL|Xa#Al^^hGnxn=fD1tzVB==&kJWC$l)$sx>T-QId9&)IdbH{2`W^mkfWmmyc8A|CT-&Cd;R)#FE1}! zYwP?43eY!u_U!rd=f`%mY18I`2A+dEce*(^)bns3*ryMV|NQe0RL}UV7PAcpYVj7K z@6n?NCZ=G)0xTnY_8eALc`8<{fasq-eOlX$bMM@~eUrL%+qZ7rrgf`g#fxLJ{27o;_P0on2grjP2}f`3+&PRI%ScDA0E3 z&|ZQc-9k;ebm>_b<4aIPdHm>6%G9Z}ZJ;`YnA6UjDU)trzi+(C6o?et)Ek@{*3aO~ zLfkBkze5OB!p_Z_G?5p*d-kw*upd5rxIChKzJ7jV$Bo;$b7w$6z>R=_C&(;289O$r zY}vP4zQRm|xMt0o!~6I1d*{v_M0%J#L-OG$SrDR)8nM-8&62#Hqs zur)Gx&YZcJmtk3F_wGIH?Ce+!Tadwt{k}pd-DpScXeLdhtt=hF4HfV71;zb@Y zIYWjF88>bm0nHD@{pr)YbLVtx=FFMHagdM`jR8N@AFoI6K*^#ZhKUj<=KpMld2{E^ z<>TXX_wHRIR=r7+CIUP<=j!T;?a`fj!*Na1_m8d)>DaCQP6bMoO119W$<9 zzn)37Z&4}SwAa{$ZxGTF)&fZ6-P6-kyK(TNvB*=25+w++Fj0E;Y{iNdBqQNT`r4>e zvK>%)@Zf$##M38_A3HiY;LRa({rdHL`SJy?DC`~Olg&m%Miwkos8y?0a{fBP{b}*y z#hEi_GB>wiaC>_PsgH#aw-AX&d^T(JY3-_2NE||nq2_V*>eb%fUIz~BmkxSI8>2B! z;UU5NCJ*53>;%Jz)$Q1^15!*BZ)mHD`6M;NNdaWmtl8u@Kt6r?)X*1Lw`!GO0GXh3 zu<;jza^d_1BnAmZgwX?xuGB*t@DCCVBmf)~6!azTA`k*Ib0I6Za*EA3Zjm9yLK+fw zL3cA{%5?G4CB3&b@kqs;A#OHwXONF)&n{u@;wYm=jbven2%Civze4!*>62>Js-fwZ zFUQU|WBT+OD%HgC_?%liX*}IqD@FA>Nr%qi?jYs^8 z#EH!&O`4?an%=+Puu&s+0)Yb_W(Jo5oH#xNS=&X-r$a1v5xw*UJ3K+(P zrVkEj;l`oIXqP~Um-vWW8g7;NGGoV%tzNzQ{CV^E9UUD#dGh2bQ>O4kaWb;0gS@;B zXdvWp@n78C-O0c3ICA8uBuNsD7%^NCLMfbS&6*w%0P4lT!IN+uC$8Nd1$ob`Q6O}> zSFfH%d`@ViLWK%wTbi_K?QCsgYu>-d4xyI}i~1_`RfZ5Foeb>%U3f}?#>DlQIsLoe zp$#gOAvAgL%9SgzBcxxX-!89YgC`k+;FT~jfF#b?_=$iVA!)~ z50?DE!Grt`3lDGEvIQ9&8E4q=VM&rCMj(tk`jj0zw%4v*3xtSDan;Z^P+YQPiM(C7 za3LE8LKG3l%J`l!FzgK-0tO7ky?b|2ZZVK!#*8r$Li7(A-?VAtPtO+{h7{r`FfWkz z>C=ZFm;)q#;D+>3ZZs2%*yojaIq=!9&lc5r?ZjESukr`JrF-ObH4W5x`yB9ALq zuC%sRannS+EEW!scJJC{sNGm~1Yy|l;ej`9@Ob9rNz$jF_(a1$J-T&ElsM7+xpPgF zMH@d>Zoz1b;|_A1FCjSt;&7tnY()D06haON z0PtdrNFH8Z+qP|?eZY|LMz^r|!i5X*1NS>#5Nhprr%s)aLYkQw6eJ9{mK|Z^zCuXp z+_@9)h}nf3arrzwo0D|lF+4nM#E21N#*RHlxT;e~Lo8puoJf(x^rsIWs989F9)VQ9 zetk9B?a$6mPPmA>aIASWA?%}&fM9)`KBkNHh$}R7=nxDz5OQ7!rf~?7KOkffTn2(& z^5#GY_BeqD4jeEMLNX6Uixwr77#D%)HQynWZj&cZLXz+y#X;@Rp##1p32vE#z`)DfYvhRG z>(;Hic<};`(8;4mA=tr#2NS|SxPM<9?so0l5xR*p5^(J*f=nb7f*iyr|AODl;#eiT z`uE>|Yi#ov(L$6dH15%~tSef`y%l(qCE*Cr3I4xx`*sr{%$zw3`CCl8qKY6Es2$b_ z$w-$jZR^&pHf-3y!lI+2$N=MfJ-&ZmRij3x%$eg0VeH_C4sqQEc$^;1@GT(fkdP3r z_TH)0A3uD!edl($a^={aK7^-EokDH#Xk^`R8ekBLk)8X7;y!5I%iG)A$A>VHAHKf6 zpm^_FFb8F`xTZ}TOYl2o@+3AuPz4*u3qqF5>cIffCh(#LU1!78;F26VbjUb_*dbk8 z2$!N#Vhg8Do@}BmBuhXL&gG~ggf1>FjK=t!Gr;lzfE=0^I z86vW3)v7q$nJSQqK7{ykjT$x5+I%(-7n5s13Lt%L)_`l+wX0WirW-b_KYjX?WH{xN zxjqDSnUye^Y+mX#Y5bQh6&5ue!ocg-0RX^QB4nVcxkg5n8kRS7=+L-ekV>+5Y#tUB z{}Y{HCDf22t5c^=!XdnQGaNF25?CJBIEqY&#-J#e1LF|FVR{gTg@>72SRldhr#AIy zn5BXt;0b*QDV#ongIg~*y@bH{CPWBr+qMxmN3o!DgdE^UP8_k4(V#w7PYv8+`dyM# zPMbQF#fc#q;_EAwt}ZTAqE8Sk&R1Lz@|m5sFY&0>M-`<(t;xb93_>ED^WZ1)G=Khl z#Z$(aKugdhMF{aTfDo$CeI;+n_2kMG>$TBw@!~~_gL5|ydy}B~0YZ6)O4YAZo6gOf zHT5EvNnpa1xG?b;Qj(LcOa$>v--e?CXf9FPn~Q4y-> zsAy4N!*cxaVG9d$v=B+hg*mi;zczdn7^vhPK(Q~WNX{KAf*@L2S_q$O^yVguA(uft zPJu|3axnoycph3tQ4oms?Uh$jw{BfbFHWN(gm4=cfmC}-Pfxv9!2tnmAAdM`@?@Pl zbyOT2C1z?;tO^iPPMmx-_mX76&FS2^v&5;|Lhw+vYE||oBJA(KLN9r%RYY#7L>G0--aUKn0+%Y01d>FG5R$+`5YbVhIBo@WlXhzL8yTFp2;8DY3-$6c1Z`)pp*sV|)L;eaYNAJ2_))s;g?Cb|@dVihQ8fSn>nI z!yI_lgmiIHC44L2qrx_XfE+zHb`Xf9{$%GMf%fQ<3@~$1Ag>TWzF5Q*apy8&!gvk^ z!-HrWnjh_?y?XVM+&@Qyl)x^?(DdmukQ*mQN2We<a5}|q!B3_b5gpe@}+;YsFJGWW0rgWDap-3CsWblR!8(}0m?^T z5}~+olH)bf_tK?{-1zeWAmY!w^hJhn4afKj9t5Safx;1>eZ7c zPvXInJt9cTnk5tZP`F58zSYp`cZ5(xk> z^(4~Bqmm8B`@pHgscF=>QQzLZ316Tu(+^QOBu_y3Q_SKev+yLhp!{V3f-szm{|A4U j><@${s`j7qzgYeY`%TwY$U!fm00000NkvXXu0mjfUw88? diff --git a/website/assets/img/logos/stitchfix.png b/website/assets/img/logos/stitchfix.png deleted file mode 100644 index 0a97057c5d5644e35629444cd9f885cb39a1fe8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1993 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 b2u1i0nFd;5l$zqL00000NkvXXu0mjf1;XW3 diff --git a/website/assets/img/logos/synapsify.png b/website/assets/img/logos/synapsify.png deleted file mode 100644 index 3c65d9b320ff9f435027b332c46a42750879de1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 zcmVeLqoB}&6_s^0|RkFiA2Igft9f!M0D-iwYw;Eb93v^p@U6R7&>$)oowsYt<@}-`yzy2Ccg+kG}bLS?fCnO}q#l_Kcn>K9<3k#V5q*5tg5Uewz zu)4bX@ZrOJxwdWFwr<@TXKHN#yj{3(Aw*2e?b@}Aro8gXE6f;hH)+7knKNnD&p-dn zH*#@t5u$MF)TtP-XU`rcj9X<@k4NXqwI;bkrBd0eS1+vD`3_pNXwgaskQ)By2MY-a zp;<6Fx+IZUjAF!y5i}()FOQb;@bI{^ud09l0cf^t*%E>^lq&T=tH@l@UN|aQEIriL z)(#mmgvP|g#Qfioo;h=dUf|oH*ZKMR1qB88pFeQmd@`9#SJo3IOrRB^#CrSX=H}9? zcJ116V+-?WqXSo0*Je|Au0Xv#y6AFVrHK^w?%f+}e)7pD#l^+A=J|I6r#*P^AW0vL z!X9GQ+_`hn1mEBzUl&p!KXQBe`e(-7Q%|M=sNB$*jA zW-tS+UcFlHk^wg4oJcp{dh0E-!$P^dYuB!{?%A_vsgn#yw{G3&_T}W{@P2qivc`S- z^r2bK&d$xF&_7weA*|r@bGc?w=;h@lG7O(Ur@C_G3YycVO~do%&6}BN5TWqnk3VLn z0c6t|o_gvj-TwF9dyo3R`Q{t_a0Y=%mo8oK?xmMrV&(&vh-(!BBJz~u#*L#MxLiZm zh%1I$KWWk=u8Yl}@W*TAo5Bk1!}AJd8q+EK{`>DmhT-P5Z{Hrn_V3@1=9DQ@@Ql0v z`zbU_J?!l4NHXv{)DsX8Ks^sX{IHRT6moz1>8J4;dn1B4ZGcm!PQj~XWMnV_AeN&I zz#R1Q%{SkqCUIa$AuJW1Z{NP%w{Kq>>EPgCE`_h1D&8EDyFR4Q?P}g1MIqb-JQjvQ zWN6}U;h6|PtZpb4_@K13G@}%HdV12nL?ML>a42PEW#xB+j5Y@i<1tixe0)|`7Cq0J zHLIba!FW=ERVGfHXwwwn8^|ge;=q9e-0joD7hilK6rgtR-kp4EMMVV}0N{roe&7_s zf{9aDq^{c&RiYK+SZkpe%~ zLk~S9l4IaBFj>?C56`_R&osu49V<@Z>3sE?LzycNWX<25asQrdhl{x;Qb-pCx`H(E z#Qy-5LX#Vh>C>mf7x1}z_wIeeB#@3MXSb{hd8{=#{f$v|+Ae45;+5nrfM5ruEO z@doJ$EN7VxplvuC695n3QCRq63T)(}plwV5k3RY+2JGCq6VIko2;hoQR7_rE%a$!7 z6iTZa?EI2^Zxt!3YtgK2WV=%o_J<^tdWuu{(@#Hg%DJTLJH~-AYh%?*jT++4UKHBPwG3-=|(B^N|B9rk}UMiJSr(=2I$i6zvW0W zcP0YiK8`^`fbTRa87SH3pMOq9m=2FCh;KxAPube=;lmMm!pk!A0p+6uK+VJ`M3Mko zO8&qo;5P6-)$zoEY#oEKnuzDXMyMzXg{(X)G8#h%B+90`r7ZD@S81wsNu;;C!gFW3 zB`*rdTHv4c%lRB_O&vOG8`#ZaOohg%)tIroI z-#t?_%_(M?PvTR-=`Tg5zkNLC{S$dFMPw}WPO|k(TDm87j(_ee2d-Hu{5$c()$*Ax z@r(T>^LQR7jm+tYGx_0QW#%e zeV=>6EVty%`%;}Q1j~H!DEweaSDNL5u*m=awa7p+m uDwP5j%Y)Sy2B%hjcP6Jq-gG_4ivIwkGO|wx8B65=0000M%@(v diff --git a/website/assets/img/logos/turi.png b/website/assets/img/logos/turi.png deleted file mode 100644 index de70d08bd78778e7922c130e5ddf90322f886be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2915 zcmV-p3!Lui=aGQa44ToK%wV$XlkW|=X2$xapprE8*6kt!nHX|wFQsZxPk6Dgto%(w+)k`7Uw0Gc9@FMTo{WV5W^RKc@}ec60=*SRXWuw%2CE5?zPmj2`dH+1M{weL1G}tdKH6NhrwfLjS$@R={Co*18*l!8vT9r zWn&7tJLsVE{SvJ~TW4>y@8+oviCk1O$ex;1_fw`Dg{Tg4VLfZJthHu^w8jJFX7Kay zC?bU~)dkPMo#4qyz*xF za~S_jex_q0?u{_#{JPQk)h~ETQRkNm5Ap(| z!aD7@(|gR!PTKd#rzZMyx|#a^7Uqi)Y$ESD@MxI&r-M`a{J1qfq|Sdd)d$==VLH%i z_XPPYWfJ-^$T8a9(Vh<{REZ=HWzO;?&NSNudRHt7>y!y$H94r@^)SLxo5_ESRT)xu zmG1r(@C~?t+Yg7-d9)c}9X2bhn)Jd{MRp%j9SgN+1g6TKh46Xen`$SRK0k3^%G6l_ zVc{v2mx-2u=s9SM(0;-{)Lifo$O-vI2XHh$=@H0Y3M)l?Q}Du%fcv$$#v$ zx9_wK+vQ@NBX1n_h68>DAa!#{>%xWQOIf-$+JQXGh4p8XF}zLkG7MpX~lh6xVR_VqOhvdNeTw?!mSb%3)EJ~C0e<# zZcw>%Ss$N+z7tMd3i1V{!t(Yatbkcz;dpRc6c*nRailfH)7%WmBK2>iPN`}nZoxGL z_v-Wy&lL!+Dx;uZdl1$RlfwEh$Y{gDIu>=r{Q5CHs$dfzjz_DR3#K8G{_XXkEYgkH zWmo>5GE~&}As~1=t9Eah{>ea4T5z~M2M|*;PeISNCM?xn*i8}1`G~^-BCX#T=yQ^P?nt6JEibk7wT7io zl@~5E+P|%R$nf%X@_s-@n-XP?{}H3Yc$W)ntw~`m2O2nOi{9qkZo&$PRMm?n#DTux z7s5XzR;7IQTGsvwM}eW`AN3pxSvu!N(#OA~knRYWejdP*h?(rd2DzlO5n;RqG*D?$ zSVg@2X||L_>0cecorL9++$;6}$$@XH?cM?`Ll0ERG#Pu>e{qwruz9eiZ~hxcyFO;< z6|(hsqZ>=wcf9+P?Mg~&_8u-AZ7#0AH@61dGW^E#` zr`-z+OJA}okXr6=b6l8(=qG+hQNPA7MbN?ez44V<-t(17FLX89-pcM|daaXaJDlWf zt&^sh>GSFCcXp{3=U=Ln7HR1F{YHdQ3N&!lq%eLN5=R;e%vfjce7AdH1?(hOk;v&r zOP>P>uzM`0HugF78)oOf_3DME3~ z4k^FNV3};NE2NxHH+$_c*!(=6pTA7eDz=^rYk%~=w?%U?>wE(01yyAyZ?5h^nsgcV zrca#^wC7*)OO)@82Lj!PNcw{Y+Z(Im8DIVW`piXIMVd=#omg8@7YJ(ajYmCntWj~i z3^dNaz-(L|0J?)To;GEjb?*qOxHdQrrfZ`klKYXa0GC2uvkHXdscjGnk8Aw^bZLe{ zp8qqD#;)-)-B7QQCF2g3mz4=&8}HXa5PF@>=A8_SDxJC&iN9$BfA1+#$t{#;GtgOG z**Z`Swu9XbQFR@~I`REZcmF@&JWutU*X6yyuJQCTL@~?2-#weMrzN5Xy{HRHP#aWV|3S=#Ff&m2O*0%N~JIhl&18tUB zX4VwJJK*}3lnl?A-D1IFn`M?oYt<>V({`sf@wL?AA6DCGyseGf{{XPua;+=`2T1?` N002ovPDHLkV1oDbnB)Ke diff --git a/website/assets/img/logos/wayblazer.png b/website/assets/img/logos/wayblazer.png deleted file mode 100644 index 95a0098e409a25e545e0649e4a0af088e321733e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2306 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 diff --git a/website/assets/img/pattern_green.jpg b/website/assets/img/pattern_green.jpg index d2e3418220471c3caf719433280789ce31c76950..172495c38e389753575ab1716f413e643f03e81f 100644 GIT binary patch literal 232481 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

5m%Lpjko7|@ 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�cCb!l^(4rMD19*QMvCX&Va27_G^WgDWDj!j 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 z z9$5zhLnx!VQRHwSJ}{khYC{l4Fv(?U?9RPKo9XsN9+xw&^>mqx`DPoOu-fJ0Db9t3 z3K*mf{9PbM!PP%AL0PCrhmY|fnuC>qv#(9QG+;kjSSVuYDnMy3y0b)n`w?z$?J{nI(6?K^0aBIy!;nD9Rw9X{&_KQShjV66@HFy~nJW*dBnj#)CWFTOrQdI4(*&${ zyr8SH{HtvLUZ7kx_*^bPBD{C8sx<1yvagn>|4L-<8&SME=+a>q2}vOB610}y_wTu% z(Pch2i-*bg7IO{;v6|7u8-}m(8pdp#Z?SVz)gOQt{2JPtj=DQJ(|t@6l;Z{`C%5AX zx0~hYdiPoimKM*te(As{XawX|`6VHlAQ-unwbrbN<#-ziqsx&>qm>-9r4V8H<&sgD zx_;(wn@+>^9yBI-Qa6aE0RS+gCHZ;lsFf1w*yB!*NHL=;{%GKK0@C-if{r-$$(?UK z!h%r+q?4RrP^+FULb9eXr74~L6@K@(`Pa+2e8Qjq0eqFYa`7xSboIY`&^`A8VS@R$ zM$g@||o)9U#}FCTi8yPD0Iyg-8wZM%Y4hIY3_JvnZwjuQ-oEP2isf zazd5Qq$_c$gf78@sf1C(3~X(eC4!vCg%m{=tu zcjQr-1*`$j;I%nUYkB=&t>s)K;eGwF^2G;S_Qodzb#Sg?#YzS9y^Rr#9{IqP#Wn#*$6wI%1swe)VdP^sf#>Nmh6-jAiOM{w! za1rxDwVF1 z>2KTgQYK=w^iO9xMOXT_zsGCbckfCmn#qZ~yh?mIzE}O3Z87}aC1_1H$cC+JT(e=k zeKYiT7zNRmjkbr#rLPG-7hjA~h)?WYlWnl`qlEDzWMz-`j=}@XV|qRzP>CYcA(@YuA(b|$SpX;3@K;Lg3vmfL zCW!1UMT+nsy|@q+>q+eQ9)BLSmcZ6t#PcrXMP)HE;)M_*CJYlwgmJH}g}H^3c^$;< z;HGC1C3OCf)cyQZag7Y4(ifwSsubO1C>olY+P&-0N_(89ekf6x_469p=jZF3XfwxJ7t#r5S?B54xVg^Jwmo=dSvr!EKykL!!eiF-b zG4Y~MTjTQqvltR7j$D31Ir%SFk@vW{G^2JlXa4UmMh+UPC>TEH?~PXh9U{MUmyj-! zZmjDyAs|{)3hakmpn5P@zZD_=82Eyf;;DHpz|ImDtUa$x*5ddqaT?KihNu7td;-v# z8}M?R$k`*vcttRaRf(=8WPk=()qML)F0k+;?}-;D(j}Jd`qiuVBvp~_B2AV0nN77j$8avduvQw=AZ4g2~9 zhHLg5BIs3^kty%p&hEc57)B8N#plF}ZUw=a*gmP5NVK+>GIZ=dk~Dxb_qCs#apFYU z1;ACxnEg8@{;U_qDj8rhAcCwQJI@qvL2P;I$5rpAXYskP$8h^LJfcrS_`+dil1sn; zWpJ+CvAYt-?r-}_G%sl~H>k@pNijIX4P`z#2R5INkZO>9H=BD3TXyzCU=k{@08?{B z_v;IBu*9{L*qo=p6Ae^uBo0=8$t7epT-9d%58yab7DM7huYU5i1W;5Rg>d>^)SKE$!X?hyJTb+H${QudlKM!YDvO zD;c_vXdqOen-OcsQq<0Y(SY+@UxU_G(V+r&av>vi=rWeO4$Xb?XYY}QZ=?Sm*Vclp$C3F{n_V9`8 zDg+N&D&owr2XDT-SMdZGG(aWvq(^G;%7aDd-W@A_NMDce`fvq`>w-oEc=aO4g^&^l zJPD$*YIbNv@qb%MOavuFg5QyMz6s{TMXwqRlwgjP3K9O2dQ(x2=KzAy7k~6{Y}@Qs(nK_kmA{NujaQA7v_&EOmdXbTR0&lMl83;S@mu!oIQ}oLGuAuH=_f`BKlZ z{%+?CcU1zcJ4(@5BrO%1nm)hQvw2KHRTJqzyZL=ZGqB49B{_MS69K_1J+J(5SxI>rKQq zYDw#ce$KQcxBzpAO#9#%LQwZ3Q<$KJ%c1M)o^Ud6#;mp3+%WLav7l|wN=;X7AlD~4 zJq`Zj#b=xLw9Il?PoH_&Ck9XuB})o(T6QYIe*i`v@j#litgjIgO&Uq^J0At&Yd+#! ze8RehDASLs$4pmjQ^b44Che$ox+DqJgL+HmH*fts8Sn#$?(%dBq@(BKPuTZzTBpj5 zwP1866lDpxv-=zj$rOYVLnjCH{L{S2v3XPM-uJTkPfKFt#1cy;{1!al+5GM- zkvHkGD*LN^k#tUc*BV)LTr?pbjrEFW6EooXM=}T_8BvPAd->+f&Cz$7cU=QCYbRvG z6&J_Bl1rApro7o1uM{z1^nf-qWg&9mCld(z5q0xI;osTM$4T8}T*aJ+1PcEhQFJ14 zT!~b<%xAX-E0^7r8n)!uIj-eFEi=s2H&OGVa)f5RKKy^v&D+QxQ+CK3WMuX^9Oy zHt}?!id>bThRq$OOr{}{lJ3rVGGXII4GXl|smermjKKpQ@#&77zt(gVNUFlvpKjd% zPi8{??mX>{ZF133`lfCPHriRsJ)3VB%A};HF2Fho6sW}@Uji* zU1ZtaOZL2tD#!A2x!pHQFDBA!W?zR`O~YxiFT1q&^40`5pHoxuaRb?wjEIm5w+vEf8{ zc>+TP1ieR8VwMQrJ}f&n^!iHz4i3!?Prx2RU@gxSJhnBB zM}C3-0}%b>m4xE&A$S-*J$e;Hdp!Hf-9H-e>9DkgQpB7);x@*_*P}Z;=EmAg6*y3P zV8#An^A^KVtj$I#5kWC~j|&%IF4h!U2sT&+j#&w6KU-30RP(HUrFqspO zI?M&mxvII>2Q5T6!qGG4{{I2=y+7JHV8{aUlI>IRY(*-i)oH;}_Sqh_toj*xNoKB7 zOGt85SWmzuOpVi~uIE$E{fpab@oH;XM>o)Q{XCR~EvnDfaYILf(v_6$`EQda?TCEc ztUs`}QR!&YF^cf5yRAXjJ~V&V@&M`MKX7+S4!&>4ceh`0F2o4C>op{J?;ujzk1XJc zGZJVLay;@Q1(CR2^8R)BmFU*xgL|wimPf*YcP=P)*doByV*;xyjoKq63?EL(bYEfC zAdHD3rxkm@{gK8}RjiQhm-C@69G0!YR2e=n(Rx@;3={pD_H|_B>Zy<(9s+H+jK7N- z?*AJR(ka%9c48*wy;2;X?Tv+5`2J$Tyt(X$F{#Mu_Lo+02Au!*;!a`V9}!$eWSY_|v=9iLTdm9hUMXwbdoCG%R)V)FFrD!s1hNER*FK|$IlF* zW_zmvt~c1iUzw9DFKYiSFoHqZzto;e`TyWv(IST5-KTGEyh?=I4>QZQQ0q0;0xj`n z0J$K0vij9d^Q|j(>zA|SC}a#?HXOj*t8E|zt<%dUOqPlKlFb|<3#1Wn8D<=Qi|nqI zMi1(f>!Es9wQ_H_c8~Awz*>z2qbHWy+kf*|JUBR1`N#8i+M~!|npxNt5QEs}GQSSE zuxoiV?m@V4rpks%>&`$Twn<)sO^7Qrmq^2jwp>?tg_?yf2=(#UO|6l-WSVXm+h z5BMF&w_MjTS7e}T;!^A1sJusEb`W2QY{1Nl5Zmh)d5hr|@Bl8tk~z;MSA2F8;(lul zyVHFrfIdbnRj1Cgxh@^{TP#!;j6`H1r})0l5D^sdwUV84?7{@>p8KzX@&&Sov)b?t zJOzhEWh7q#{Gm3fw2u4<>Yy~xIQM(=#{U4QV(}AVX|YwD4#OBaDS$eY#)m*g!X|3X zpp45ni}*u36_v}ZP+ybILDWRKRj~XjuDL!tR{s0n=DJ;gDOm}f+Hm>|#{&M>?HG!s z51dQxC}dcOAyy|=LBdWWQoBANwS5_k>lv?F&{USF`DI0%ACX!*tX+!{nkP!N-bx(9 z>F5yW_cclzg901XlI0ARi**3|-;>~CD#RsM&CHsX?jBeL8|(p$Z5~|Yqwz(0KlLF! zjr(^AM*U0gn@)HUW6drCGfHQ(B5yg=F2ab@DI6%vm!Q zafs=qGEQ$(Zo)xVH0Z(g!wLw*er&88H1Tja=rZ;(moXkpa0}$vWbb;wmkW1&F1=+L zn2_>Udk;P{yGUqfU*3}C7I92`h>kTulVwCm{`a(hx^ugv-o^VRsm18rrQOZ-O{8;J z&)d;pZbfg+N|#p~H{3&yb2Ws7nA)pCVAN{QQlAy|yW3=OOZ>owKa8jh=eW-8Sx+r0 z0N2hQinm#J8OJ^={p0(#o~;hbS!rgJXj!y&?F#1aoFQzzcMCzHfZS`&XcvBM>ggp@_z)PJP^}) zF%yt>Vrc$%N@Nm>yzH6q$=LwlJN^{+`ol}r^;Mcby{xFy{{To^$CpSHtjby0=J&j5 zV3p40a=rr%M(z%TL7QLx$1i|RJjP7ZckHZs-3kN5nker>?p#cGrbR#k@u6)t#KXlD zD!@_ZZ}ITIsd(Blye*or$P5iHlj`=0j$6UX)?l}gOZR_ozw+5Wjlfwg@kU)0ll4 zU3esjk0P$bkvSQ=XEo`mq2$9c@KjLXu3KN0footZ1>gXJFJMbl_{)E9NF=OuvS7jK zjI7O1l_=Bw5?Zrlr#6ERI{3CuaJyCT(bp&S1&ku953Ksgso{6=vG@TS6SpWHhj)4% zVVAnD*q=01R54rla!O!%oobC^C!5yA(9}h7Y(Xu3b*)*PXq}2MqSzn$fMFHry^puI z^^_R&iP;>%+8)~fIN`)OO%i`9#Gt3Q7sGiv5#P%L>ncQVCLmzEU;OqYm7+=hpd0=c z_7otb3$(dbaqF8>8lO9=T}I+!No=%v?06cGi&0nb#{d!ncGX-rhnQkhWMztzql5Vu zQ**}8S6O)kdlzTA{O^2RK^*SpM<3puWkx6rgS#cBV)ewt^}1j}g$1w0pPUT%7C3Pv zm)tzd2WS=;!YIkAersDgpg@>io+x~K1b{c27Jxd%^Sc~y%sd{Uf`T8u|p{B0WfF|RscTm z0(Q6_-}zA7ceWic|KYA-Q|NvIg$=LEz#4|sNWZA;=z_mfaIsC5S@T&iXc?dS0)dY}c0QGR z6*)iO!j`;6jxv_-9sedis+ogGhWS!jw5<^+z2tF==s*z%H_NUUm@7G0x&-(z?mcCi zx1`C|D}*#{yMsnwgKT#|Rxs3;2bG)}+66ia)k_c|tYnB;rx3OV`*4KoBaRjaJZ<`S zxZP-`TPrUmQJUZ)eYG;xkSIy!%Duo8z}AuVWVL6dVFDIiMfWJ#=66Sur^eUd6^m8R zM|eo|K2JBmZqFeb7`SJneJN{1ydj6(5u^= zi!W-H>J`yMkbJ^HCM*v^EG}BD%Hvn09)`-U5k-SKliT0uI`6}{vxzs>4W{!TsOf-3EAMrk?w&ZP}FBkxa!gRIJqzxFxuj( zeW|qBJ16At|Y^DCr1Zp9K|`39%wk z&&L#^qH#Nfha*48dmp%rdTrlyTI6)$1AYg^i#~oE${QOpp=-TN=D+huIV6eF{#ke* zsjiGRr24mg;U5pWfF7t$snTJoUDg;t&X?-k0jX#iuS=6#Lv%RgPexZb1@L-C`+LAc zMVrYN6SBL1FFK>s`0uOi=2g!My97(3<=nY{OLQd?zrS}mw$LyHV)!Xkg~eUmQ;p=C z0DsF<#{ard0YpH^+^7&&=Vvq3cT2?JwWmG1j|@Jy_89DAhx+Q{@6AU~Jy((YG5h&~t8|Bja0 zgVzx8Qw~3wJVqG-h3$Z*L4dyfsgj|FtUZTQ4@hm&Iva)_Ob*c zuTCv>^{WOzHG|mgqbkFnKaN2#HT({(VcV>waH{)Q5(Wl6hwMxKJMfG=WY|)(%oJ3ht zr7cvnt`qiJTbqd7?%pI)k!Mwc)o z-(~W>R?c=6ux6!eYNidFSLH@?1SXXzwG@3|GLp7dzRNI|5JvNDa_(26_LAD3Ql209 zhqDpXihQk>rYC6qH4o4h58#ivCN%lCfLGcz|5*uKOC$gC zRsXF+hPkocch=>vHRDfE6?>s+VzKVHysQ>oo*k1O2*++Zdh64p*q+0)hHpQ_r3{Li zx1R*k=T0^R55&EsIL_bHwO*vF^{=R9)70Q3;-aDV7V1Pa)xUT$1OGUS&t_!>f;)lp(+vAake<6NkMYc2E*8`x&NBI`@Z~Mq)D{Qq384kn#K6%Vp zf7}!+v*1R(Rr~DDCClRUjqzH`2SOuA{khGWlBi|5h95Rk$0wj@vBj~I^q}}{WJtUl;hqmV|%M7Sw9j4YxNI5cpBqy;q_yqJp@k)eLGP=Iw!ivw{!ZST&9k#9hYVrV%;!%=HsC5p|x zk$4al?F`#nbnD3eO-U+Tn#Y~uYt?ta#9DDa|3d9u=y8O?&(veRPzK{SKjQyL0QNM& zvq+fU14N#yhB`sNX*9^aSk}Od2U_KNzPYH z$P@`X<8di2??J1sYEYcJMByL}*CSc3Js=>E5HXi94`*g#ppr<3Tzj%cJkxDBWQuHY zr^~y}SMlKXemB&t+EXq@Ya3VuDi!ChL1zFyz6F2Q-;esI16MR4z9;ItyI)nQl=(;E0 zExJ(%?F|Gg+HVpbWAV%0g0`v*^~&5$;{(TIf$G{orfgO66=#`+p5TBrS4I2UR-B;u zNUKMlRhg!o3R*H&Vtt|=az;!$)YxY#)81JB)L7M(kG$_j_iZDGp-48p+z+w3Vldve zaPvHF&FrV4QkNQ)I)P=Z&m`~TOrl|Ia%=V-12VIeoRkiFSW0DqoY8qx_|o%yz4fsy z0hL17NI)$jN`NI-+4Fw~0LJ`&;R;lx)%M-*#dn&3z5~(6aQxbS`%eNAdGSjz&xwdd z{*jHw>iI>a3e1gW8wlM_?e!ywb|8LT9?-Hzu2n#WMlZeq&o367anjxQUc{Eb=u@7T zdjj1GhHr_MhgTEW$t|N)1qz3tH}#fepo-GCP_8*!T`OX}jOEQSYZ;=<*|_dK{Efk_ zJX;h0P7Y-K6TPxAIyz}i2L}YxIgB<77i=(&5+>znqh1iB;7{nlA7(a5GPtqB?;4$_ zBvidq-_=p9{^f2jt#|x%@W#~aT!Zo>uY-Y!&$ti zlRgXLG>(lkJSxgH{F$7e!-8YCfYx-pH278$`Sw3KOe=@A+3)aJO)va<@$P^UZwK~W zDcwdnd#=P*rNlHI6XJQ8c1rO8qrthBEJ}OcKKR@`LI#AfH@1I(R3^P3?~$s>8V)Xw zx~wZHvV*N5qK!$J=)WIgzvDw79Hq+&LiZv}lcWnuxph2)C@jvYFFhHQ)#S`i0Nqpg zpEL(|L`h9En=~#_>~l$ZV(pvrYaJ)1H@sM`B147c_=(rqv1f9%6p1K9S?E7V z=C8z)>+aS`G3xM>Rgl@F7zSIexK8O5l^}hs!FodJ-(oP=6W;&3srZ%Ny7bZevp>{p zc<`o~6oV+6aH|iu6t@~WMChij4I*}G<#?Q5FepQZ*w{$rsYN*o@s5X`x9OEn3Z@YmR4rzA~S zWV&DSiC6gWmY5jB?0fnL%{#H_o!LrWLoa>F_eq!^(C+v{&5lHu+zhF|&^lzM&-+9c zwmHeDYaXWg=IG>F{V%@WI;hR)-}X*Ia0^bc;#w$BTtm>}ZUu_FyA#~Cv^WHp;#RD< zQydDE;!wOe1q$s=f9Ia_-h2OeXEO85WMCMQ{UqPL*IJ*2IZ9ISFiZ#pdrs`Kcdice zb_!8Bq%gbSxVO?2Uz(QR+A;GS=0Z6!P8CDvGG=O_k^V z8Ea^%!Y(&Fol&|3zi7RDeht@{->dIE6ZjJaN6N@O$GrYAF*7F^xQ4+L?WfC&I3&bZ zIhBA%djhKNKVVFKsyHMA-2w;iCq|n&V*xajWU)<&mIFYfVuM5~!n`|Wmfo{k9Zp6g z8pGfJCV^d4j_wgM#~`rZ^_OK|ozIwTpc1UqA)DRDY3ui}5mDu?TIt}Hu%R0g+VAkp~C%V*?gD2k&= z^VJL{+)tAqCCvk`M~{9h&$9o?#MA>sW!mBkqGchsjy`PP_B^hCpno%~UzfoRY+0B! z9)n;-P_GJ)n)hLq7=1epa68OC?9@TgoN*HN)`S~l$gD}|epvl7@M1mXXW8MwTXI<} z9NgaT>!|TnuLzrxH}UdXri@x~;}Nk<0ZRMCRH&G=ekJ0Y-Zh*mkl{P`9ZG6EAg~gG zx;WKo6H1`uPVag(_?vQx!d5xVpQ%tfh}sMm*Qk*6 zgM#vYMMf=>OG<@^?N%B=$g+36tJ-bw6y#)M_y&BWK1+Nkr2f3|4<-i2;`?l#$q(!f zQPxc!Bv&zX&^dkZ1p9#;lQC{2w8L^L*wjCGef-0uu=^^YftBx8qQPmHzDS39JaCR` z_fN!6ad~aUym!^kA-gWkIsob8oZ0Pb9hz5j z$+P(pY&94oTW2RB&USYCv+5H?C%wY!>RWWhwm8wlv2vcCFk;%AB|&52wKkQ&DHeMS zLXo9B>&HC5psTY33OE^iC}Z~LzW`lmVJaaptensGDuy>MhBKZIk0@GH4iT;U6_>_$ zN~eNod?wx4O$5^w(m?6t=)5la)C$jBf<8t{cppK81W^T?p zu)H)I57Bish6%A9c~Pi#SklFgbXwf>OR{xilWuNf%DbtNWo3?KtKyZDA9WPsy zk_@m&=L<_r4AwfIdWU|USwC*RT2FCD;EsoH(0DeUMo6te;Ih^j+>{jxK#PLIc^}O> z(quskX7s2sbTSFj2{GiJVBd(Ou3fJ!5gSL5Hf~THA43|bchdxYCwE-8o&}9$rQ(r% zKO7J>;8vbGR(3{A16Xin-avo$4?Yqg{5f}h%Cx2{m15Mc3cpxwwym_@Hd)ue7uV;t zx{WSKx0g^P_vP?WvG1}-c3N8GFngG1=Gjy8SgyPgj$+E`%~*pVIkRLdY) zKt++z7rMN)Mm5&UJd2kqipDcLq`y?_xgqY}2o(G6Z%^rpB<{;qU%#Y*Ejh;3(H2u#N`D5`_tR$}1Y~&PYC>4xw zY6!sf`E&jiZSYvXvU5O+{HzIT$*aFC?3#cMBVA{?D>f?g|RS$tdxe^OuZ+sd= zUt`i?fHJFoS z#{5W=c|6_SZveHZvZdaB>Lq0#49 zwId7>-|52sL?LL3_fEUSG${K0WK0}`%v=(|)zi*W+lS%4M(v$bHArD+M$zG)k+B1P z)xttz>`lCeg_cUL*12*UL;iF5P(;Ny6CFRe$NOtKR8?Gtrb5o4Z99zxZ%n;38$nzt zMGV@cU&01ms<0|jRDjG<#3j-NCb>C)fmULhj<*ZaiN=E}&32Cjjec&^1a+XiWAmaF z)w0>Rcp_iDFgiXr#3k14qVQ9(gkvyxx59oRZmwOdnWaZjoynV|<}cz`+UBk^;A7lQ zWnPF}lma~5pv1y*AgyYB?ijysef}*s-ggsmcx;0@?fdRm(T+PAwPNi;eMku-B1KB7 z1wG#<=0lvnB0KswPJhFxdjO3Nrh?S>EI?Q&V{9*|05_|I9tf7ganOT|F7w8i&VBxt z+f47uYfTa>q~L-SuZRru?41RBA1@L$AuXW2g>spV(d6E{$NCOQ@@9wO0fOQ5(>i>z zqf8nOLQPsw{m3W$BzWm!L%=Jz*w!}8@4x^+0WNCbNHAGu=Jo`)d~GwzO!eYc<&dpy z79F$0?R>#8o_a9h*8Iw1R1y6+hF~=DeJ;NRc)z)d>C3&7aWeD)WhCGHWoDT=2w zC=lI+J=5-Jbb&^k&b)YUghKff<#KtT^Mx3>9ZWf!f`;x%dRYI?`?sAj?cm`nr1mc& z@a^S_x&BLF?ScEA3RHJ8JWh1;4n(Ch15Pi=IQx(2_`g$!{}){qDN0^efW3*&2%XP?%nH)S!>=j_3b=YCK^rA z;STt1N*Z&d1$|addu`u4diUx8*`?~YzU~vnF=%Ofs7*W+dys|!hIFNn>k9o|=I#S0 zd;LrnDoQ8!mtlcU@BRgZQ;A4pfD~;Rf2GSU#nDpo;i7}{IHlh#4}YT6>)L3*r-M2m z8fZ02UR3zujcxTVOW&?19!I193yWyaNdZ*}sJ#-&jdG z$vYEOl~Wd-2YE(P(oxq+-Dct@v=EKSv!0kJV^@Lk+fycn>sV&~86c%!Lmho)nqK2s zUWJiYk7J>w389XVa~-0MH-CM@Tj<#iEcs?4LrpF|8dvPe90Ei764O~1l|<&&E^{2j6E6c1CFiX0-E<+nIFU?T7(WF zLwc3%da@`%Ll-8(qn+*;z%e*{1Q|zU4Gk$3jd>Rn5H}b1tvDW zX2-BLmJ*!Xvykl5CI&(#cGu~-bA1#w18OUTku0rk8n=`_Pv!$70nfDEzRaz6x#YX6 zjAc3MLJB_qDOZu#JfA638Q6yCNZnMgyP0{b6gSCmJ4Djo_cBoTX^#l z?Z7B1o2%U6i{JskYdB}9O0DzfC_d?L62!oRGvelmRa(V|Oe^J?22tLNP4P*jMX4!BM?}E|k%8Ba{Ij(B{ozO`v{B2;tud?X4U|v%nSr@lrXDV( zr-OTnEi>5&P;18;S{^*Z$s&3BL;7HbP{6zU((_7tmOCJSlNT$(=^y7xG zm{S!Ltn(rQJ3sCaW{6EnXwRU_N_rqyN%SZC@YbS4TyJC{2%4&l!Uo{ENyFDsphh-{ z5(4k?%MdL9hz{U8cQ|@73s5EV5qsuvif>q2fM@+v+--V)?N4LiDE|C0-gA5kqy!%G zMs51fcbIiOoZUOsGsql_0byupvL#fabv-H1*xUc(uq1>!!AN~TV9);Uzp(5KC;;zW z4!re-d+OpCEL;3%|CsH1Z`Lr)O?%g=GHSuJRWWWgujrcy4kf<)1t=|NY0C>vaL)ki zPRx3=-r3}bi@520C!8fIe;_4ti~8_^a&T7-kN;T}>auo@FM8>NpmW)NJr&arD=>%^ zN7+1A$Qf-|ov~?!{O~6gFlaWoA~qf*U}* zUA$iNEWN{`{17dwhte+c`@oW#v7?6ithyOx+U2leCD6iN{f(2KpIG`a1)YF~Gqet! z%d86$87ocL4)Hi9T8lg(S14Ygj@u4}#Cpl#6!4uZTl=zEA{n)dGf&ZXB`}W<%4v$; z(=lgjAESXPNexE6xRzhv)gh8;M2X5MX6BloVv9$HA0?O0CX%xV8{dU)g&Q0N5hV$o zX&ooe+6X`ke0iGt0QtGJcZs_J?b4K*WlsXr|HiA}SEggIbI41v%^1m#rd`8LJi z31tur)PbLI9(fQ=Ar}oJN>1K=5=Ek#$i=akZ-4glK{P~N6aD8TGx|S@z9^cB;Ur-eA1LI4cgs6?EdRo`Tdq# z8mBJ$T{u)$o6Wt_XBYn|s2IixCJ?rjvI;#zkCq}>AXU$O8XPx2AIDd>b`LqxwnU#j3w{L?9fxoikFum|WzA zV$S;K{;rk)C`?=5fp^%2-cL{oN~R_Ev!o~zExDz9m?4TFGPK|G3EO(Df<-QFZ(+yv zWhRooRnO|kbbF9rKSEZ$`|4}-w|ull6}2dGk)i{YPo5+5F{O@R6&q;G)6)1wrmzH~ zp{K;vALfvYS4m#Yw6?2wZH;{_y^Ou|liRsJz#M1|zYN^d!&RHHjI?rlBTc_b97}H7 z`~?v431JNFsq4f)9~`3~a7Kb*-5g9I?@#l#{FXl9c@Ke<%}Qk(RWI;$`#gW#sFNFz z?mCGo>p1yVa{%dp1dLQwEpFjfs3Z)G$cs}-Jn36pmyPjM44a^aO0*x|scbps2#=M<2UB1q;-Aq-1 zCLC^$@9bO#dw6_*_!-hgXSr@XJ95@z1#*dKdIKRm{CY8+63JK5Gjnp2#be zx%+x7d}uNB_V<*_2+rXmgpb8L5Dkion1_P}F9XzW@KEuPY4s%Pk5-xCs}ZiiS| znZQ#-ezDtDG7iWBx$vpibp)ul>d09KhK3 zuSpuOuEc2<^$}ix+Tl~#Mp_{YVs(6K`0cRSI*W2#rVE$X69Vn3XP0A{VNANWwRfo zu6dKfLW~F4?!jN>aZL|ze)ssVlK}bn3z+ETtC(S@WXpBSIsI^Wcycu=S!Qo0uOBTo zIO}Y0OSHIFYbRVn!n@}l4ij8jcpx=eGBQ%Ho8#NU#rfvy{VMWQsRXdn7t9Z^w z(g!az?gSm0Vfw_QCa^P;n(XY*MFDYYtOR`D8mx?@I1Io%==@=W+_&0;X=y2w+TV+t z&)p#>HhraP6lgV;68c$Osj@dlQ<*8mbsPV}$reyEC{WoxrKPnwH;GM!p7JXPs=&EO zmI95E7fXq4;)^po;pj|W3*{$7Rg-KI5b-2|Gup4t1l(!X!NqaEE6Y8S#zK8rzE!m$ zXdRr&Bk2G1{O4ak+n`ze33{V$Fu7Hy+iJ4hGr` zJ_{v8Tlf@?!7U*?-FyFtVQwt}9VFAqYy9BP?;ia^tp;XUKkO7R2g6ZoQd6T{QgMli`X;(?gRlU^6B#8eGUXtH13p0GaAe&=&Z*$=Jmm z;wX?;!i1}Wff~(!aV-|cUZjDD)ta69E=hu{y235Z3HdbfOUa*Y(sECg`P+4vlqT^^!JIA6*nW;QT zUKrlaip~M*j*HcwE^cpj#NATfU?kIsxf)~f`6SFwSHHr=#DYSD{(#AiD=)R=+ec`oC+nGE!e_)Ppf*K*ui~ z6RHa9w*y>H2(mZ{7YKNoY|(8d=F*M?k~RPxWVYs-$nipiFuMiSs~DWV0|x*RkU$CX zb#!t{sOq=n9cPYoJA9zjM!&AdW9Vw5(9(Df`FbCpPVN-%|FeDh?`_O~uKJAq1a5dg z6>()YFe>;kUx-KAJ-vNx^}#T2U#XWt(;nXO=_uHbEGCfM#BVw!&nS{{F>sdlUN(dr zyZuBqk{EU-?W=5&H^b&wr$cb?>*kG4b0e}pVay$SjlXl*o8jXop&X(DF-~&gPrVhW z8p*m_vF#;pE=>H>aZ~?T#Yn8yS(80;Y$|hnp+jB~&d@=zd3F%+`}t}TH0L{m9K38} zuFF4ofR9sJhfB{vg{>q&p_{iDntr| zzc5UtEBjc>8~Vq8*0ee4dFvMx4U&cIP;&qP9aaY+OZl^&n=rnweCEA34 z_DS!NV5!dJv;Q^fL98}&jOg@`8$>o9LC|b+VYQb|dr%T#0l0h@nxj_DCB-chs=xMe z{E3B*2L^#Uq4~CPhXG*kNiqVH&CLRdfk1i`71BH^vr%GPKHFNFB%`$tal+WY6iTk( zIbYz+#0rd_v%H>S0%VyEyE;1Gp7=^_BuA+`8Q{sLrm7o-zg~7j1bOH0({iPv(CvHB;U8$M7|Wq+%M?*%Vk76BjPuvcLsBWu+3e5)9;q=WVOB$;tj+scquV=QeG=WBHQH> zt!O6+`#eu~y70D1dEzjk*5$9j2-qR#=R}LG;vM>UU@2{Y8|s9cW&{b%qQr2d5b67< zG0oUytLLfL9nT_45h6xZSXFBrn_3;dcP7&Fo*zl-kg?Ez#TVZ0?>#pKmEHC`Dy8~) zg^{lP)R{DYMik|cwS8Z4V+C;vmjkY^3l9T8`WU*v?SRh$S<8kJ2|1|rsf6;3_pnE` zy42^P7Y~{B0E!Hg6K;%KH1O%ebNAm{C?1@WSqy)|9z)0;!B^+J<1vuXH=%op@~%LE z1NNY$XK!N%t2$&idNSX}-dyzJ(`SOZzV0Y%8E06#xP_=CYSB`oy|Mke@LNV+-pg}N zd7AsIyGg~@nGbgwfW6yytQP|O+ds<rdVVcy1%Qb7!hOf+M{@= z_vXs=LeU#W5#PC&BQpF|h^=ANnXh7EqFoF~B3dR~X&ah19pV$IWzpTyy7ILu({zup z6uYGQ<>5m$562U`7X`=!{wq;=Tz;mWuf3 zblT$O(`BMy8iu<5<^3O37i5tr6NMuXV&`%|8J2lYq!WtYLos=HTTE~FDZ*>p=cc!Z zo@hh-x7$*eA3|8eAt}>cNy=Y<<9yvoNH-m6xF??_VQ#J&7jxur*++v? zZ;u>qS7JkmbuPFrlNG=%j@T7q%%f+p42;#~{D;M~~Tx>?PCFvWlQ zx0&octX>lelx}WaL|EZ6@rSEWp~d~RbbV^-4xay65J-6DzZIbg_9n$wsIA9yNWqQN zW!CE{ig-EraA!QaS}YddZe)CuYA(uLLl!x4c6rDcotm0(+W*QJ%(Z#~c73UkOnFlnoh!gSCfmtp4O2SQ!GuFYHhbXD->fhDm+xofwxXI_YF%5Q(& zXrJ{751I9XM8a$J{ipnMTzKIDUx0(r`Rcl+*lN?s8Q@G*?T>DTkKwCr;r#Yr z_rJ#1sb*vd(^Gc6f(2J;{)`~0uwkh8kW#Yevp-C6WS!bYG2TTIVeMjY&(PDeOQ;0; zx$rtUp}6C-@3#LC#$_Yinq3%4s#|&V8K!;bhh`NO3G_BE#Fj77)yDMZA7-F^2a766 z>DaINQAD-fIoLI6l5zM?J51+*om-@6|Fr)-NVwPI(HQlyrH?r~khQX-*{{Id4FTYH z(^b-1TCyimK;C%&;V*EmJ@=(0MZ+dJGfP3YV2wznlM++3e8mw)4v;pJxad!A2>-5l z=$*L!?(h#6HISHAG#YsQj#)YLFCeiHHJ#_vaR^ofUEh~pWITyQ&R&jl3B*s7f+Z%z z$@HUF^myZ?L{vlUc)}1=rVesED(8u-;b+h8VtO*!{)r%7Mc4#l7IXbshHz10d}~*t zkzg4pUA{$Z1)fRAVvq8#+8Xj#Rd}C02r@(}8*hlx*WdL?%1r4g46)cT>k zZ=|^RU9uhA1~Ghu%OY93wW910EDRB9kV^<=Yh&8TxI69o>Dhn1rII4@`(kcLJA}&; z=rKllLju{lzQeCJBg1bcxSNTd^>up<>qA7#Zm)ADDLlHK&ah)`@W%ySD5PXhzFgSt zh1pA5iqm%ig%@#qY@uBWly+f}mz@gZ`5`vLEGhAPTeOLS9b^V|=;$8TCNJmyNkUwA zRXW4*+P2;=O<%HOF*~++I<5p9a~d6Ml!ZBgeujNtp)F;t-bUOvW21u*VeJ&AruF3O zDXcy$Uyygv{lAqE5m7RR*20EW?db+bBqR)JG-8nFG!F_&SSLsuCVdlMLIJoC)U(1n zP=zcacJDacF{?f!%h=zpX<7loY?n1QcMkq=5k_T$lMW!W50(n4w6UykjNUoWV^4r> z8X-ZV19skK(y_bXE)43r4Xa@Z*%)ZUEISJo_(~&7Q_mn5fhlU*;`jZqPPC-cPPFAKy3oIbiV^*XKvF8h-cLAiuq%EIk%n( zy!8xcbs^;+L=iSc5daESeyGxpV;BHVlbe4VwxpvQn$=R=Gtu>3&g5o z>G93&K=*g9ayJNn5!wL39YJtkPa$n#Wt}ICQox;!q^V><)-aOc93a2QANj~hTKs&MwP z=<7tWD;VE*R?%-Z|J{PdMp~6Z61S9guLZ#EC(8z01rv62Jx~qPa3rcT@SOAcGlN&M zZ7B*7)Pgkxk*~I9KX|=@9g{W3TS^&6)H!2%hJoeV12+~gR!{!|x&>3I=`%FTFos)2 z1{^%grQ!&y2s_>4q5g42BbJ;fdEekKIfCUd-t7gEhK))<;>RyHBKE0{gA#N|q}G2; zIZD8im>^R_;7s~O>5%?n0xe}J8Lq4jb_$RB?Wm^c{1+Y6I2}SfsXX=)OSfhJG~%_; z`F46q0J{f9NwQDLy4C<^EmzNCN}9YMaf9NkXq56-tyg}kS2L5F*qa}J4>#slj3%H0 zI$7iK+|Qr@y>%JyUtRyz-1Rn^AaY+D^JheGyZa~JG>sX#rRoSHQbRkGM9IGJ#{;+= zy>yTeZ(j+4X!z4SDk=mB591RgFge%nWsP9oPC3%quPe$c-7*DV(oHY(h-VZQ_0#p2 z^1fIk!1TwNkv6sTa@YApC+4GJ*YxB=-IbytQpuh_UNZ&jZ^dRxffNJ@4 z5^7$Q&o?P0nT4diXL9bM5`}$ zrINwNAplEZU;q*bB%->>J_YqcFn?u+Cc%aK#_A=Or?o48aUdL`?Y3KzNYCL5%?a9d zZ`^;hgq9mXPx3ipNlUiMZ8yLFep%?P?(Yc^rqHbQC>uwUZbB1`2ni$rFe5YphRj~L zI-UDVJJlElezg2>bU4xai#R_jiy}mRLxql$;>FgVc8Tgr0%E`$lF)q=EK*v@+RX#M z33T#7`EAHyEqeckCqEt!;FZA5xD1%l#GiOZ4YMHvL=WwXHLYz57=*)YNDwS3?uolR z%s*hkoya}de~R4p3XW-4Q5vlyq^&HPf=g;%1Jxz04F{u^t6G@&Qoa7q20PQtqWCd= zr}^@T%=EZdA-=##Dp5taQ3jCE!$7*%=J@TqFMM=mzj587UcY6q%B@w|@XW=Wb37xU7HSY!KKRZ-hX zbbW52T<{&4ytc~1OhHF4N%KmGWyyI#pu)$7MLy{_{IFk<5tumA-l<=@7o4ffc8b(B zX?P0H3<%TCd73oJQc-+!-foh+u~2CJ3~jrXxIl)|&Yk+0;=h6NyMKKRVG-P#UUwk{ zZOwnfc1{Uf-ea|~Fl)Q(P0nM4(KW48vttUJVX&~{-zO`=X?67 z&E0(rh3FUYviYe#ANLmZ%?bhdE;jFIqWb9DX_TJu!!YI;oVZ85Eyho*6p(gB`HQn%}@wJ<6 z2Gh>8_<+gDci^>dZ#ew&jBTGyGh79lo_1>Vhgmfw>*7!vr0>-oQBHnld7Q+8gPY96y(W6PiNr}shlo^^BDP6`m- zoO8bu0oLf_ucEy=lZ?MEn7p6f{(VPfZo=r4E4xbPof(F!lcpJ8_Gsn<0pw=$Sy(jf zeo`P`#U!+Swo+}`e1`8F>ZQq6mNnwUR4%jN%lcMK0M5<7B8qgjq1_fD7ZixlsV7DB zRofY%@n1k0j{l3?t{ig6b(RV753;GeNlW6WO@--ocn+X79e!gstJvjP2KQ z9o~VADDuB)tPy=<^KUV>{dslj#Y?>36ZECYKgU2Nm^-xNLkVcs_3uM{&4R&NZtX;M zPF`=P`ug2QAIePh#MoQ5V9Cx0UNzb80z@^&?KDLELj=6A(=Q^-7p;MS9oQA->}GF4 z$H?mt(U5E zLQ*$^f1bhE@U|V&mI2=smg7%?J*>86V)W99=6KY`-z$#J_kVYfxZ$_QO=N*znz0$7 z;bXb1xW&L<6BG)`>`~!OQTMZW^x1TY5cA;mIX$5!rPaC@*(IW)HC)}&xKnR(;Mg7d zjhY8VWr$HcZ%6(jC+f4Jw4MSakYnIiG7_XKFziu`_&iB*Ai}1HWyjF@dS3d+{e5%7AAmMk<0mGUx zd~f1zY73hD$g^3rfYoxl&Va2-U+M_84essQA!a1N%3|^9RV(R~iO^XAK^g+IT4faJ@b-hNT4SkJfdx2>w}Y;%woKhtAd!2mSVUyvXN){I7PoNolRjrE z(0;FsOZM5ckk&gsT-LDUZ;taHV#=+E#35qS-4g7CoNhre30u#4g~L|aiJ$!YgaXkgSVpjgmy-0wk+4Y#;RM+v)`&vvD>B~vE?mc65{oo4exX(DSs5haJMNY?QM)f?u;%f-Xo!^MOrf%>b8eO@%W zPd|dS21at9GuxK79TgZ`Sy_QdU@ff&Jk3kkBXU(|4#vChA?UK{mB^t|Kjou}1z-~u zg3Y{geY!f+U&35SyyD>=oXe4|AGtaYq|+2jM+^M^==*&=$ zrfBANME(kZUYyWVnJo`^!Fbh!Si^GU-?89bJ)n;E1VC0Q2y?}b5B|+)~ zbhdvBD0|GeQHV9WPGqJHBUBEvpLI14H!My@Sr!Y`C!CCqf>6HYy|BbdmXDXb6A9$&T$A5Y)-N8)_c5Swgxw=>gi(&OkUr;?mc3V` zX6Rv}z}okmbxxN0WnGAL>t~;Q*M)a+fW9cbgBo>!I{Vxr6Ol z=yz8BIPj9q{2Q@9r^~{9HT3ij!Z!&wAtSjOsJmViP`kQ`3_bxMzaW^2Y(O&WMujv* znG!94iiC=OeQGKG_m`>`fNRGy(^}n0GlEZMx^iLJX9+A>kiy-R>CPZ?3`kUJqmpb9 zn(_0dfw%kmq7_wTy-qqW#R3`SNt)_Xkx%DFw6(gvr|@$4D$AMaBO>p~t?Z z=YVsqo4g>&*S1Op7ojx{UKZ`_&*Alkh+4C;qFNuxC8%6H1TlRuunnQ&Fl8Oq^LWMt z!OKho}wCRaPY~K zO#ApK5{sBs)uh)-Wp2YOZ~!6~{bGCQynv1XjnW^-<1?N!`5H#aP8fbC%K$xQeP3BV z$*_=Fjebesy9d+y;2{cFuMzeYvjCyokngu`w1p$>?*}F!wYF{D#4%2Tj2G9W2A+eU zyf>|oZ0o+g0VRqSbLQXJy<6Ud>0u5r2A`VYu>^e4k+$EV3H&e#gjBlS+TKkj$xvBek^CC>Sli)|*!t7W4S6w(2g#$WlP4cEA z7&V6;&XROD)GvmSN@4ve^1Wr1yp^q2qF$)I zl3*d&VuvjXR{P~SrM=RED9UazdH9QVl1PYyY~<2Xa?5RUB}G<7vAP8O z^u&PMbDQ*$f(W&kjhrr_5ui2=7<35=n4(brCiH>uWaK|9<{xIm|5=Td&GY`Q=Ha5~i`Aj;~{Ph;qr z4CT$m#qRsrl$7~jQ}Wk~3PN$sqrJaX7&L7SVqvMr5U?ubqx3`+ak0Lb_1*VIxK4&U@3QkSMCcG{I8lSc{d*UfC!LTFx=LJ zT(F0&H@EAKMgTuDS>q<5rw+Tl$r1}HHzpmm(nby@c^DpW(`l2 zSE65kGt0)w>StH(!`MVUHZ-fhcJibz?4UnPk`T9n{pPC*FGVRCeC4-QS(=7kAeNVu z9}Twy9XW-f!CT4!kMQ)XiK%tJ*}l3k`QX@7ETRWtd~71;LWBOPKBDMm>k0KDFrUEB zrmjTep2vb(A?PeEAql0e*8@zxbB+aj@83e?L8jgql&jGb3Z6MfL@Mw-2eb2CI>%^9 zOi@}&55fRZ7(E_GHM$Xqa_%KG_H(-!2PhHn>N{UX`d}1fq{^L>9tujQN*khMPds~3;qa-)p8R$|HNT2JDW)3- zi3Q54fTMhzX7EKGLgdOxfPluMCwNJ@Y2o?Aw2a^TZW@ls`P?1rX(kDLsfD%6`DH0< z__l5PM-p1b#{ec}T>e$J@KOXyfA;Y0saOoHcHFO*0|S2n$+evmx~Xn(+L@i^hcB6> z01NK_Xu`B|+#j7wG~>+4QL?wOT&k_MKD@_D$3BkzN^Q&qKuzf+t;yC0I#Dhi zt-bwtqou-kyY#TtQ8{s1vw>zO$^Ya#R1rsr3arQctiM$OEY}D-SEvaczNYC#)0WGaRJs7Jd^>`t(x*SJL4+0+}8N%2UF#myJ+s?OjQ(Y}154D+=OLfTq& zF@O=_nm_X0z!dN`#D^9-uWCL}JxA$}I@~8&zu{hP_Sk8L^-r;{A&{2VPM>j|6CO6& z7?EO;-sMjEoY~(zsLBaakU@+6qI3#v1+;v(YXPigCg|A+CTsr;BP#3snIw|lXmG#u zFg?}t6$>9_S-d0KXjeC}da<{z%TGA_E$VZ)I+P(edlCky!fm#H!4dHau~kQ-{tb6< zm02+~eOdHUL~Wj&y;6>Cf{e)p?NyDTxlG(|8$l**OeRu^DCWGufmr%apIL0kzrR+m zhf5@RdZj198VPi_)K)hpMd=`-OjK>?A1v=Uk8#ZDNh!fb&|$YK>w#6WHs*{^Znkq` zIbFzCGV3p3vtMr;7hN>EnAcbF|ev$okP7vV<;s20E(MA1`t7R!piCcnl1 z5D=1dac5}Ord`wfIBxz;iumJD#-5x1As7{XUZfSJW|O_rP&U_Js>QfAF5~v-q#Nn5 z+d$MoHRxd8l7&hAa;<%g^ud1t#Yp!v2|qa?_mYS8I!nqirF_UV)84GWwA9zEP+L`A z4bQ|_H90M9f8fMz6@x|nQs!XBw~Tn^MM^yadKIthm4Zc3I_5nffIY?#^?M`-5y(%? z)Qgn=c?{Cw05aV;@>||{0@tiv6m1T&@m)xpr=9|w&MNzEnOTQ+AdEm2F8ry#?C2xu z2fg#JBy597sQ~eVOI^0IMkx2tb`M#2w^491LBTqcmmZe{6M8f`DK*CJA2g1r zcQ{_-nwloo@|YhJK*ltRoF33{$W8M;u&SNogjA^d)MhhfM=hC z^oxzh&S>8jc5$#MNNcC4W4AqF`BHy!#jv!mn?^S0X3c@jP0E17QG*UeFQZ4$L}|T4&HMntt_mbwCPr-?M_GGfq;?Hpk-i(jXMvI;ckCQzIKeuWwsGt3=`wO^n znQHSg?E3a6T$TUTRb75T^3v3F)8pjRMsjt%n@lTnZ?fRdT@TZZ#e0(VX!7&QW3J54 z3}!zP?N7_`N6uXrH8V8!Urk!(T;30q`M^qN$Ji7LAtw?4iS))6p;pbzXyGP^^foSu50jNb^!O8edeBXpL1rW zR$9>y7Nd4-CiQ8KKsYKMghmh^=5(_rp@|hafz?Y*NA~XJfsfUk8WDBo0@7FC&onos zm%)i?-VP>onw4?WyTMW5XpHJxOZi>=)cPqbRKl4ZV|6{wyr!3#PZPM)mszy*7T>IK zA$X^hffg+*-1;CZwq!suEhk;Cd)B2aDT(i3jK441DzrgJ znf@q70|kAbL>DAOs7ss@1(rafyHLZc&=X^WpwX>}S@;cb8rB3cikaci=j1fT|2%Lz zw|94_4adcY{_O?VPap{a0yT%SP9ZjOL<<4U4^9~w+YUB@yu_X@&D*3HEfM<7ZzY-j zfuBjCb&o96tQ#`O=r(nZ`ZchI5nfs&pnHH25Cjl5*8@0v5re@BITl~S9)-m-T$FwN zRxAtx(R8D%{skK1Ed`9gKDA_+1nau%V80j^WVVjutBC`fM?T5)!fR6uvaznt0J(?l z;InAnNJ#snKgP6iWG%Km8@mnp4Subr-<_e?J!*I7z3TP8%^Y3=VZ?iffeUV;yu8Kw zJHHqx(*$=ik~w9~eXDWhZYy3wyVEVEpya0HH(I?YRlKsqAhhju}pDwc9}$(gr$ zbJveu2Re|ey}D#aD5sR@vT3nTCSsuo(aJ z$4peP9EikSLrpFIyP(w0?u`KBVWdc*m84yD{+VqQ9{y{x+1TRQ5U$ z|Hgrm67dc6WuMCrP5Hd62m(;!}*Z1*^I&f9Cp5z zGmy)`b<7(DZOsG)$D{n5WC~)D7PRKNV164ajK$V^R;m}tl9eh7Q zjj)CGu=eG>#+A14DavACl!vLh#?KjWsLM-k`>1CB1&Xjz<1ejNHOw zUP4g`aj(ev%WeUpN`Rrtc&J`#yhOd4)SS(L4bMSrq$V+KN(CZM*446e-M>k;mohD?;!^l}1g;ViZtE)sM92 zoeY43HefbIpUd*Q~o*r zd|=K)C*j5P(*<%OQmGjiSy9?9AAYUx9FHo<7=9kGvOeQgg=11H28Dc=W$eSrg6>2W zhebv0)YLh;6Jvem{=qHDfp9@rn)q?!FHlt98{P7D+#=HaoL|-o$+60qEcVa{CJqjx z*^i1h!cn=TA(-Si?OlbK$S=HQP#_w;c*1aLOH5)NaNkWuD=~0I zZ-hWhjZi3Wew)IocUm^TGq|V&C(s_f>y@(tz^R-CJGVvPUk%X&TvT^YWS2{O;co{oxpi2Ltp|t#gTkm)#?= z6!`l%B_F7=cBF%_jS-kXf7@V)|0Jco`5rGW2xLQvgNWF@IWUMChDB!5i}ZF}bYL2N zTc)1f<1x;BGo1l`v&|=)%ea$HjOLs~b8KcY5MEGB9NRwr(Bfv%r@Z(!cgw*RcPHXC zb)lz`z&Z?~(QIu1--gSE3=<0BlcnVyqY^UJscvo8viMyM8mQWq#};_|w#)n2icweO z!F(j`z5^?-I3@Cj0vdiL)QS*i8mls0eY^es?1b67p>|?!bKSpX^)3*h|p`PXNEcg^zkKy%J-qTi z0t&D2B<_(D7@obJ%eA=k>>4`hG9OyIy}o0g;rrF|abuzORI-b=l=u~G%zf?4kCFGd zfjM_)rD6+9Q>ALnYtyEG^@9WnK!^y4$S8;?$cRWFBm@Ky0&pcjCZy-Ve?-I!W#FTe zlGcDR@@txdxn*79k}|<=Nq;Sa&=C+35U@eT(7{mwBZ(|sHp;0ArS&O^Qg z0~Dc5r~M!t>d{p8X2xG+{;OFn_vkPbECFt|0ku1;3x;(r2h>g6i;jUMa-4LR$Q6U! zl`?JPD03HGTnw~V=A9eW5w|f-l*ep~&drrTwQDe+N(Dn>P{P%oVAY4Ij{7TK4fFF1 zWJ2`$x&yB#r->0>40W3ezHe6LHzU97-Dbtn?9bkR-Q=E(*^FqzbR7#~{un`duwG#t z62Fv&GFqtP9k8=rGqOC32_qbWSg|RHo%Fx5J?UeDz>g{o{sOUCV-_cj4@AQ}zmmc^ zkzicxWp^yYTbC3@Qre*EeO*F<)8)GR&v(ci`=tW0!wd+IpeYe&!v!<)iF==am|yxj z?QT-MFl*#!A=kFE!Y0v=hn!@?>F;y zu!Znyfx(m_Ud6RDFo<1n)SmGwQz0Wh9lwfDYHXsCRfjErL;Sny%AJKKl~uJDJ3Tm6 zD5$Ay)RDo`P232$|Jp|Lw#=-KgL@(L-?y$b9c1phc0zPUPUmdodh~w=^;9;;B&5XBH ziIX1-nmtlUeB6Nf7l_j>wU*(za|FpJngJ381YN$C8DcdZ#;Zf!}m=8s-WMa*6r(x zoB2q(Lxyc)32{$GNvFTGZ2lxkQ@_wY(&p%a{7fWP*K*Ck=~P54v}QW1Nj63=jF^F( z<4eKULMA9!)Nwp9E`$=GRmzTY%+ck>mT)A~2wJ=65dxE6)dpoD+uPHY=)Iqz<<^)& z+x;=f5$E>;f$^rBx>s`#-zc0s9?b-9^5M2B@9h5LyOJbwV)cdPx-S!|s{o-uxem>b zFfUclwSW#Mb5^+8vWcHyfMH>rmMcn&BV2*ebrkRv}pPX{6+*mN9!`>E!)|N0l$eA-RW<%PC(W z!#$P!*fKfWDd`K8TFyxg24~~?v4JO@a}mdOPM5V;b0GEC^rUQKymjo74xrfqI#Tu` zB?>tlc&bd)>Fj>Rg>fi1i4GkG&E~BAqcfMj+fmB%X=*;iP?c}>tEy&v8{scENo*NOcQ%N3?Bazv)On%VCh z4{|7MVtu_|2w6xkARqCz7?z(+KA}i_MrYFP%xy7-wIkab6EV ztO9{;dy#yWhvvwWbSB7IYN`JMsd5cJ=1udQhGBO5{riTdBhB< z*oVxOn9@$3XQ=*Y|QngW; zL|Th_Ag5d2y}`EBUE^rzwS6ku=>i+xc8wP8m{D0^a^0^99aI?E%}e#`88E$Gr5(Ii zTUoe8YiE1n8y5MS8fSSnTG1p1Or;N%ct;(wNp)?{UjOsg|Lw2K+`U=!=Zg2GD~GQ( zmF0>ediRUxqt0Da3At-}cLWZWIngH%8Hq4In_x=x6-#U~)Aafv_@u4Dy}LuDxCjAK zVZwwGOw6LMz!RdVV@Lu;>!EFKjQal6>{6#|n<9<$1=w+BCoQ)f+OiY=b(Mp}YEU>vI|9+!2@-}9l_E;DeklE+&(VwjNlzVIU!>F@s*L;gR z_GeW(H$-3!Q7PWaoS8NK>(W%b9HKY{BB4??cekB0xBQAzvP7xQ8Vc7hLw!#G zNP@_Uo6pimx4=noxt=iWB=`o{UY}(ljJJX_ejkE+*lpX3in&Go4vkAG$<~odTI>Kj zszUpMP&&BYnJ9x|=zWEJrm`KFNrMsdV<98yP^)rk~s%z#h^lVV>3vt zxBf$LRrR`^fWyI_fN1i1kYj4Qs{K!jLMtmfOF{y$v-OC?DdvbodR5AGj7_mUs*AkZ zs&uQ@De=sQ#G0J;aF3%c_EP&xETz%tG2?wSOr<1~s3KarE3a`ShYEUV|9%Tp+^R;u zfyZ7;d}E$*8-p3q|-N{z>U1O1-g^_|&;lp%^5O}{O za;TlwHshCOtQ0dAHpvf8n@_`*No+Bk0Mh*d zeTyf>+*s0` zbs`zQ*RZ=~Q)BdvtzLO+rhd|(zMNZusfKt4Gt*aoDq`}882cpVaSdcb+@IO-g7`v} zBbcMH(DwgUR1quEK2|x}lE4u^`r@}3#%e?le)DnE&l;b%{wa{rK4I<52UMnqN4q2D zQePO2t)bI{k?q~QpK>2~aoDWtbE@p2V^+G=S9L}btq(AzMuEay`*6#fWjp|Te64&d0z5SWWlFgc$!F?CVYP#{!xU^FMACryCzsgpI1vw3!A6< zX=8MG2s1Bp-|7aUd)JTwOeTT&n1Hvg36KSL2zKzwqO~u>+?0n62Ux+Hg zJL{{9AyhmP&wG>jb3eW3ajq1kZ^X>gNHb+)+Dd8N&g3p_?xTCwIFd5h!VAnq&w-g} z(YHbGkb8F2YPqe^lXLR5~LEbY=TjvpTU-5>fQ5i0A6R?Roph(ds>;poa$b5 zTI2CfdopFTW%}j+(A23tkuv&DMv+u0T!r9cXTNNPC1ZN1UZ#bJYvM@k8%zqkx zoI$s5Fg@G8q{tVHkWuFoG*jJ2(}v-o5RiEJGm4aSynkUXO#c2Qud>^R64;^MaVe{& zX1+^J!C6v67D5Sqhfa5Tw$=wH;tDI zx8`b~s75X9YIs+xRhfKM{THkUFg^fliI!FmoqPspc^a2(pWN7a6bB`F*=r^7`yMw^ zxRX5@nPDWp(h(su;))LxZD&ZPgr;EyQQ!gcLZB>6I0#qw}CWLh2x!z zq9V#I*X@IBaX6#+6hH7#jE?MSjJaeL#U?EU7+Iv(7Kblz5IW{>_mQ_zygVDD2`Nys z(7VXcz?CzmhRX7?ECdPCg<5dCJ)$ev=*yw08HY|W7f0&}2-=0uuroSfYp@eL2G$TX z$?J&GD08O>*4KG8e-2R^<`6)`@3+Z=R*LC49oE&z9naqF@$MM?s+Z<`$LC2otMTHT zX3_}Tp;T8o-a^tSh&`18VO+GGP4}raaKvH{qhA&Bi_|fu!Z1eb3AYm-Ycn}s-b>bv zDve;uX8jb=OT)iF7jN;`?GXOX(b&tJ35;cYVxrxJk!^l%`Q>}`v!EE^*xjXjd|!>& zRLUUlC7KmxMb#0n&=`(_AG{$Ia<%S^~KD`C}yaIeA;GBc|3Rbu5Dt~6&q8%KoOi54z zU!LINCsxs*Wzhneee1c!HWC4%?1u8QF^a`jYGJS=Q=ha&q*Uem$%Xko_NFGL7ANsg zsV{i0M9o2RMHElz;-+$hrLQTCOI51SDO^Emm_k-84&KGEDl+Hs@F=%u(2;SWYe-9u z{22a%nYa;&yeiSR$w{XnJxxBNBfcGbe{OM|vC~vu@lZ9qB1|+Y@%*9Ty*}Kxuw94m z;Jo}sWtP`cE5_+7ji^?lJj6sjRkiIkdvro){nf;s@dRkDo$&MD)pZ&cH z>3fNokIkWqZ7J!=-dFUOzz);9_zHBPRZvo>p?A`nd+AL|2Rp%PBRK|o@^X9J?yQH7 zm5^o`gI;?5fsC(4daz!o89V{WSDULxuIAgGLtjWGPkrpWcaq}TO}Ep%hk|uJ%VMT> zK$`UvrxQAikG}bZ(H7@EcPjGMBHE%JfO0!17*pXnws|__h5X6 z7Qow~-d!IZ+7m$Jew8|{4P@sqSIcPNDj zB3@PrEy%l@-XQ4VMx1aqz)3jVc`VvpcFEIktitHVOO+DI86cE{7~yl__>eGrO?x88 z9{o38RLdslNhVA$JQbED6&~ifI9vpKECe?qXJC4R_Aw;(F4z=%jn6+cWhhaV1_0M& zkwpBa4*=3ti;I}JFZ!<3?+qM05I^|D@!)$e!c9ntP*O9_H-LILpp2H1U+JTR<=ZSH zHytLoHjZ>Ck|oJTx2q>FrR!Uz?~I0R$4IUZ-i}Z{K0EtWxsqa5Pp4QO{aqQ&3-VWQcy0p4G#oGy2L}<#owik^XS5V?o3g;5w|2m87z?2><#7PTGeWbq-8h zNg4TxDego{ZsLwFymdi>*?;CWImY)fST>_H*4U1kZ7eD!bHIGN?em#9xeioS7w z^RnAwKGl6ro8$50df~raIM6Y(Z#Kl{3sa>}S8NsoEBIUzc|e`P@A#onPlj-xso0)- zT_Mn|IL|7e#MkI`mB)XaOok{gewz_Pd}1zryV{a0JkpYYicOx7lGV|vyDd}dDcPh0 z6X4@dL$h5hkBi^5c3GOm1hOHLKV!?S1?k0kFYOK+*=hD=IgCBydnx)afOmZPHMJeb zya(5b^ZDvVm@5R05Bh`N=*Lmycj70lXBGM(F&<3ZN#8^Pj%9D{n7tH8S90z*Qt>zn zX8_3C{%%wYIU0nfB16^VTtazJ*zy$tn}Saxg(ysLMplZePz}G|XyvuaQARHUG$5N^ z+z+7tuFR9v@gEojjWmw93Qh${D`pE06(^nDKQux<2b&YAzMfc`aom(Z1LwiRt8^#j zMY@bEMO0<6f`5VV)Bv7O6)BI?MUL55hq2v7-cm^OIlK5yuP|0@Q)mkQU!cPp71I#~ z_@E*Vgk@x2^(9Z>V>d=e;&Tt1iL75d%Pg^V=aS>wV-z&y?D(GARiYu6{EuU^o=$qKs?iP)b$^_}=8Nbfg0xtn+q$fv(HKL4je zsMsRJ`-)Zlc1$nfhn{my!fps0N~WU?tAUi_kM11gaVtR5to1C!^DEUn&^bWZ#7q8A z_zRKdk;9=umX^2Y2CdGcKuLZYr7PgEminiF5%dIoecU@8=4Jx4{}d{tCT4-Xx=RlC zPYQ)X7G5bC^oJrZp;r{!%Ih}enlR38^R-toD0gzoM;*v8F8n35YVoUtAA>v@b80g! zEeSU+_-!DM()i?s4iaDk?Hk6poq&4*Gzo$G@ z+`o2m4AbvZWYRx0+0l=*A*mx$CF2x*4-7)=2MKH`UJ{L}1F8ge@P-`IEFHYr-7A!* zO+hh%JM5-bK4$d5o?0YH(a8*s&t>K54~{l&AgPG;rGAYhb@%0bHj!v3$k?spARkm-I|^Oqy?o452lLv6qj7lSvDc>(5NII6 z%NPbaZu-3wxL;L5rH{A6t7p0vb?NUn!rT!YZpf_ctzC`9euaB{{{_uYU`5h7@0^vQ zAn4J8V+vX8X|e5(E8D3xQkC%fX%twuUMlep_ZCwP&mC33Wiq_u`zzcz#Riw$I1`w^ z0r3i|Vq`E+!1V%YJIcP4!h3D1#Q{t53?{Fw04|$oFF)6SRqmpnSN(d>bxF z5w#Q_k~PWOUjd9RC(8Y=0HMXJWSnZKURz@8>7B_}Y0Jt)%>=G)t<~6ZJ7Z8zcbse@~*=8r(wO7AVrW9uUr!7 zoR8JX5HpEa+#n1Ek`yjR@;Kp6icJPHL#AL@FnAE&G!3zkh;t+RUOZG{i8{}bk)e0^ zGf`hl=d6M*t^p5Po^)O%gB3>U3UJesv+3(3jf+p+eK8kXEn)20goHt|b1*aR&82yH*m%Ppw;wF8%s??wP4 z7-cy6brER*h*12a*o)SSY#B#$pW+FR6oX{mNLAf9TgoyK0em`eP6^8V81c7JI;4pKYE>%rQ8WLz^QqemMV$5IDQQ+G(>E{n=dk zufA?)$wzgyw`*Z0{qJ-3ps#>31#leY9^tyXC;k-}XicA$$>UbMiYgA0mHb2~N($#A zci6>_vOmQ@mK>!l!mKU4U)bu|Dj{RIuP8byE(ERSOO(AWpWWr~idIarb2iF{{1Od@ z-4{dri8N)uarMc5S4y$~lR8Rj$M;gR$k2nf3yLTSswf8U(2n9!O>()+(*qX&0#$$z z--p@HD!#fa1yv~aK_w|`Xq6ibBB-oUFZC^P_KZp6+%QPfZsWKY_-4Ab2yq6a{I(L7 zQv}_!d=muZb`;xS6!+m%u4wxd%7pbl8NWu{G)sOpor4fLOr(F(e5J zj*6?P%$=#s9n>(f37D8}(6yF6B3Grp)?Ii)SOUQ)`UulU1d5V;%Orl(2V-bv4ti%Y7kmM)oO2p zb+^08g(4s+yiIvnN@!yQD~*5(D2b40Qj{j=hB~vK)X@kqy4?YbC$vpZNic9~&Hs%3 z3*v{M08CTA>u%uN7)wh*bMHQ@qV7fXRre!5Y8 zhIlG z(?E7`ph~e}lyF-NwP#o)R9x^?JFAlS`5JXG{h=&~mxW=&3^@(hguV6s{Z-ix$kNr5 zk0FGCDCYnwH%_O*TGIqAMRe@s4tLaVt$J)(R4>T7fI(LYCdtsjn&Lll=QO> z$9&@L_=2D*pV5-vguB&Gf#22Vd}{99Wbt-8^PSoBDqUrR-Bp^tp?U=s<>(L?I#|e? zOy&i-?PmOEo%2#QF&6We7Q+iSK7&2RidEA4wWl%Kqr~xX^)=86CzpMviBqrf?OMHn zh5wQ>{)edaFVT++M5iUINFM(IBt5+IER9Rl3 zEU%QIi_QKH2mmZlTm@KYf#@SO0(=bzTYN=uMy-=1^5TJ_Sy9y>SvDUD)nsh*Ui?_;V>UrgCRQ}X9^-WOkO5mm|oH8bYW3}lh z6WB}Zs2CQ;o1>sOy$J!b`W7@9M`HbSlrI@(l9jNnWGC;k6{TWYZ)lv>9B^Kq8#|XG zYu)k&kdUcqbxSr#W0e?3=*i4|BWMlj>OU|v@YS`WBvg2 zy3i9FUN^!>_Of>S0Bw7YQOzPALiY&Pr2o@Oy>JEq+E&g;`i9-pyV7JxZn`X~3mQ?# zODWUy(aH>VGVm7EYs2n&ofCef@@6Qm)o{J&J`X6xbJ}LkVgK1vM72WY#fGd1<^-VE z&|097!$awBF(X95AFjAZ1)Q_%PlrJ!!PplaGRYX$4r!C!OZguo?x;2 zgXEqgiIJeTdIPFN7obYq0q_k_B?9S<`Ch8aP(cyp|IU@7kDdo1Dj)?su(N=K$m=r| zKTD{qMBNLQP^BLoo#TK=*Mw;X6FtV5Pw8OYA*h2sfhvwQ&YwpK$u)0Ae&=5qO6tvd z$v3Yezw-b3nq?Wu$qM>MSDwWf&)FZz5hqmk;kQZPU9Av8WcEZoaU6+^)8TE@0mw;- zUu?In;*Aiz9!E0=27@hyP!s5@m$}CEz9iJ;Y44;pGL*c?T&9vSl_NI-$J7Ty%TnFh zUHbe@ky$`H9sI}7OS&J77apD3R7(l+h((%@LQ18g8C$qatX=K(ekWQFev*t8g>I3m zqa8qY$i!qs%Ajwr7)4^tZuvaEz;ibN>F;|yaU~D1w_+c$pWFG71^kr#=v6m!2Ppgu zg*%Ba3xig4n7@4`@p`O%NO7J1$Q_u;qrMYI-LMk?F8kxU-E*Om1ocC8O3Qx#3HPlU zztoS(`Ke!`ED9$W8bER_r@G=wyCX)|tlLQg8SnFNE&6^(seNWG4uebKFuFy`-9W*z zol$f*)u&VS^^410o31fbtEET0y^+)JX~_B6EjS?0sIX2&w0 z>1{7>vMeLBwqaqP|4S#F7>W;E9AP(6dKOj_)#jbGAu=|EYoOKAd47v7i{sPNdS%n58s+Qx<)Xma_xqBEFQDyb%K}vyDqKDUvF`2Yvt@cq=c^v;55swEtKl-l%0*P z#jz!P%KaCveo|VsGy(xf@mOLA@I-`gS!-xEcBwe_GLAza5B{P}(gtSi-wqrzEBX02 z`E+BGS<5%#%2@9?4l(?Bu*t$H=P6%w7~)(KI|!|4wYMdhOy3f?C=hYkQp|xLqgn|W zO zP~nKEs2thp*wRex9GJ2s9t3?X_r^xWx6f9u4enlRe~-91IFiLE1kq}_yfOO@?eqpa z;51U;kBDwNQhi-$5s*6d3 zrZ6rZ;9?M<P z?1;BDo--P8-?8>4LVtd!CEs&~v$yxqlLS|~mQDOvs}r^5PquF-Yk_UX^$&S}ETwzC zUBjKXc4V9pi7CWOP5r~#sXwi1+_M;R*4&Mi~Xdt zMZ`Ea0^r8Jvrp7l%)VODlmcH4U;ZuhqoOyW9)TkuEq@$%(Z4#thpp672_jOKg4Ph3 z{jcKiLRZR9U^`s+$32n7RWxhPj9SPGTz``cOW*+(u@j!sO+WW3X}+#wQOdb0ePDS0 zJP+CQe(@HKO4lokdy-%*_e!ybEO;@*X|4kh%t~}j*5$xeS+vRpqb;9qnh~L((bkBk zX|7*%IZbkHEzhb(xcoFAF}0--bdw6W}=$;IZh2(q|97C2)Pa z_`-Nw*dwK65$|wxMit|JA zR+fT}SFEGmcUvZIXsRl%Kgq5p*Art;3c|v(<6-KP2+Q7W$dnAEW(Dbe)TwVwAdn_0 zyWrr*xRWjVX&vJdmkQgI-26-lo6}BanoQ0`6J!>y?u>7Rp3*0*mEArq&fK(0h9YcJ zBrRpla;o2Kj`pd@P=+;zK^0Kd-x4a)8&x&YBAfI#0<1~E#TDQ~6YA1S*xtlzZj|r` z*JR>k>bhFI7vGq@KX8phFPwZ84O8s=AmJN+Dv*9-tx}zig9S%WJUe+|tzNV@AT|xB z*_d_Bpy+eTL7Ovv3iQ#??%x-Uf+07GICLlX|74V>`a*DZW`8wfy}mu$V4S^)qDy5M z`kKHUn(hPNXVy9>8AZuogO0+y zEq#Wv&Hod+1=p)+aI!Z(ow}txu|jGnhCp`6C2HLv*RbsZJMpIbkxefJ!u6rRyG zhQvKrsM7FP$isV`fcPMl(Ps|2T zoJ+)e0)=vkH60G*mQ3EHG#P7rR+PZT|54?liGa&6P6M%JO>U=`f26QKp{4MTB+=&t z*c;a<7cndh-xGxy@kXqFq`7&$*^A-OQ5ikqaHl9GJ&;0DnKPm}QBBj4g%I7m zc}#Ti+b=PL>qZY21;$MvVeb3>i2oZ7CUw@MA?2a`EugNqJ{TSfP0w4^`XHoLi{2}GMXsnQhWcL`lH6?+eU?m} zR7^ZaVz1fwWji%}1;t{v2JTXS*R{sgS7Td58Ysv1!^tBnH;_Z{CJkwfLTxn}_dYA9 zv4k3I@4O&cbTxW5D`>A(?o*`(A7wNo?s)h-CE^w75<^Jl$T*P@+Leam(+$EnM#(6) zo6U+HUh-6jinPN|he?~`+>(#&JcRI06CShYEcbjhDxQi)zb51Uo6?lu;fApRfhRas zFHJNsK@mJxx8|w?pb`MR5LF{)mCq*5AhH9*35UH|WjQ zy%+<()nd)4kuUL{T#}l3{Y%TCUVhARlKNhS(<)f8s~l$w>J2DdfLm6|7M=2R_q4|7 zUVAKew1sy~;FnSP-JWa$#khS6_foY{OZ#4?++*deG>d$T-{#!_{M&N1q~QU@hIW-) z_5{oU1@jgkOHlJUd;ev;R}!}MkX;N!#{B&>5eT6cT`TW}g_$9)nnioPJ37c$ZUlq_ zW#U3&1<4de^y@NzinmDb7RhjMBYKsHKi^0h_nMNL=w|`j^NPY>3K_V6fi6!J0;R;k zUdpNb_55Ls9jSf2t7#%S5brnv)#GYzRE1j2v?nnB$T@PILy0D0+WI?U{fRfaY8ThW zZ^|36$U35ZD$?k+?1%q&xYcsq<)oGJDEhsh;5wu=S-=#*nR-j#-`Grv+V!a+VsO5) zlY&Z7Op8FU*~{;M!m@#Zi~_$3Y~2x_5rMY|F>C$S27#V)9-nyy3pjUpzFHl9JHtQX zFjyVM&zSQ{u3|CMLKF*L2ToR8`{Q>Gz<*V)xt3|m%+Pa=L*#}%m7}keOy+vOM{Q;F z`U?ZuM8eoZyb_kfr!8li9<>ytc!F+WUzBNOi#b~1n5bHm8MEt)zhb>ppt^L@!jOCo$<;Gz}%ZAJAvc#D_g_Vs7Ye>7pBGqT%9(ZKcmSEHTG$2$Gwmm6RxlTCzb zasw0G8Aln4Rg1x92>IY6my!mU`0UD#A-CYR;<`-;PSgU<%Iuf#y|gdw%v6dH+?rj` zs>?Ths=B{1>yTR+Qvhboi5_H1g6cqzg!%-dtoM$TW!JEP6b)IleZ}|n88{KKgT$s% zANTtW#j^(R&5S>m-g$}G>0Mj;d>wM_Y(Tj&*$rDBeElbCNB!vDREX>D5~lpBW`-=N0a*28 zq!P}k&XLF#A@Pr%DwTtz zfz{}^rQ2Y+MQ*$PBu~;gCJ&Mo0O2+=?1r+4Zg2Olzr!5BnVkacxSE86hfZe986Ar3 zg^8dK|AMLiyf;_%;qU25g_I4Hz;+Sa_hmXFTx7n*(Hb(GGU!%qn5m4Ch_w~JEfDN@ zE3-FzroVh#+=Z3^A%bRKYjuy|EumZk=a|^ITW~>dQjnzp_|QWYm*6iB3>pKN!-yJA+B_#kJdEp!i>UVs^b(bnHDGL8#EHVceRZ*(~jG>JDW- zZ?kPDMGo`DBher{w9|!1tq=;JMq8{nD-};_Q=EcJbY!e4K7sKe8#XJru!FxXS^v7I za$}_l%&dna=GogbplRlH$mVAw)q$`OioOvCYm_3`#~yO;<+qduYb&z~CE$;eN7rO< zwlwHHdaDg#=?O=ydeWLq;Cu!jA4oX+TQiGieB%IE&mT&f@}MQ+Zx=dXME@_PHvzmD zZbzR` zKN3_&lWYt^SVk#-d&!D67u0M!`mMD3v<-7V4{BzSBlW} zqEC3u7h#2L7-q6Dd$~i=ciH&C-P4l&RD}CwqI1 zW4%=^8=_h?`{kHs=pxfGCc>qSPloH||i;#bv+yu>|I%D0Y%b7s`8a@|zC`U~$-2g`s2^ zZev-wsLd2-aZ>=Ppuh0=|&v3{ODNTo~nZ;lAQH80b&6mB)0$ z{aT&}zSL1t)4_J<}rCHX3Tq zLR9MxL7-I0nBQz$k2C(HLzlenSEi*#u5W3FI*tQFt*{MrSdj!TY8M7!?e|)yKn&8j zBh{88)blF6s6-oMn!=Nb*)l(%BnU6?=k%-xDk^Ki$tELbBon2Gc+lmR*T%z|BRqUSz~k%*nBNH2fGrxuzv+?qyfTwyY%`O zqVT5SNOJ-!(biNH9KI@i9kKT0N6(l!w4ZdgqY-I^EX$gz1zj{D?@Dug5_7qS*^=DR z6);Ner+dSP$88BpiGYUw#z}8$CwI z?Va*(P{hHpPiFAtx4q!MN{rQ=xRz;S>7W0JD?CDo>?>p61V=yq8*3C|OB%r&8MDmgVa$NW5NJQLUJ)yliwdyXpAfEk?+6ZIlf>FujLGD~D3~U^mX96*tCn#3$eg z88`j}hFh<9vZn0s`~tx<8CW)BW+!`@&m;wB)qS?r!Gcakij@NW^*;ev^W%w|4ztI4 zERVX@jT`J~S$lqcnn*p2({CEA;C(wJLuy-saH^_;H!#{!($T~BxJdwNsDkbNRWvc&-0nu^x6k=jCcFW$38P|*5lQE%MW>&(Adj{q8iF!;~txmSzu2 z1R$YW;hJkQx&mBB!fe3;n8q^NGu)x9@M+`D?<@8CwlZb zw<@nh$jM{J%7wY)pser+A+jEgg;}hM%T$X+kC2(||f_ zO0z1#Yw1<~?2=m#Z$_JQg|YFI!K^B8-#41Acl%t>eQUsvw!`#RnUN-{P|TwD#NSgJ znt=q8KFj}v&2Bb}7f?!>{)!aI&gyXw`0%UjN6A#3G+$M3y4O!fd>}Bv8U*0^I_zs{ zklQmGp2^RnbvUDnwfZ@lcKeU%H^Awo6fk3N34U#x{1g97CGB!$>%?%8lXMi?MYqLZ zqEDwkv&32&>@h3S0ltH#EO`a6j`nwO|FWfma*35PDwQk^AJV`jvd_&-Va$uv4w6Mi zDe8%Cn}S>JEUNgM#d#f5te&SJx%bggIR*SdDLf(({4oFb4<{TroKZTn1q?$}-mhC4 z1Z)O2W(vB(dqzQ+laYCvSrDf~!*5V)B=jv5!o8wo$^)MCJB z4Cy7a4UX8f#e|?N4=c9dRSy&9o52R2X6Vh;@4hHl4r2toAocq9x5YM}?UNLaq#m-b zr6j4{p;ZM}0FLr6&XX4X{HIwdHqJ355fD&!56UQ_Ll>Sf;au?q?~J&!0-NZ{vn;My z+W`O)->Dta0>`zMz-QxPnH5xRALbno;V%SffB0dp4SL<0SvMe!V;}LWFj_UI+)I`< zgiHtkFZR?L36xV)K>vPI+Oi~z(~)^P7yUzyzXbHebd1sLR}~2Ztl5;PX#%~L!u3~$ zYhe4=iz`&)4WIMzzko1yRn~PZQ{McKly_ zE7e7MapXDh;x~zZWdnf@rS^Ise#znSFpJ72!3AdQSz?(}BXroRTGR1H|9I<$O){wlna{9%VK z-i+JyD?n)iX~H7sQpS~52zzppQ7!xip%7+kcZMHE%BEvVuEE2$r>5S#X;ChAR#Plv z8=#GsVRYRLxmbBmIcHZ^Q|c~M?B>?8rjjHUw|C{R{Ou=2r`yl}(bV|8@nXRo?iBuy z^*Q8|1xJ!5?kgB-qE!FoI$5Y_RU$zarWxR*McF6TZr|~o7euXs^9IDt`1eowtR(u> z(082+CbzhW+8yq`WyVp&+IU6_)k&mYvT}xAOoxlNutQz`r9%P8QcOg@m{hDN)DGx) z^e=J&S|lM!;wgr6RsL_#I6~nZ?J6U>Hdm2!A`6>fGvg2zovJmfMV&aKeQ04^q{L_U zzp_UX3~i?T0^?Pm-Yf&WCC11}_6)<4gqwW!SdoTuAUMA}k}(>|FqP0x)TF5KIY9n7 zx%4OK@e6;l>!qRnKuT}p*E>y_i`eMBO!vJkM9>jALYEYZQ!6XeqlK+m)hGH4*S{s( zhd%l&kWF`DxjKZq)u!34dDMnFRyR3=5maS~T)OtenL*hEupwXsGr9)4eOv=kgwPGd0J@a?5&% z8E=&}`cX9A1AaP~q+Px9;1;1`k&Xj8vebb1JSyVBI=2|V(BEnM{!jvPJ#IE%xhtg1 zkskOIJy_eNaixpwI2*NmhYK9h3piZ5u(*q8_)yFj#P%pKxFZ* z4CPeKJEr?#P$}*n@iwGux;qJAm4k2`j((*HREleukLBCuXH{2~K2N6l@$TvoGTw#9 zA?0l~svWP`?9NT=7WhU6RQ%lzxJ3x@8~~-BY8jJFWp*3swX;R~I(9;TqV>&ZK~#!kA>8Lg z*qShmgI{2)`i}38x{30sKk08dG3|MOV*!WBtE>0jefy0>vepyuLg#F@3$9$*Ba zq;)6;bJ6?41IimJkczQy*6g0?qbp{0+-bm|)FJGB5-mn_$6cJ-x;;_|?rd#&KKBtV z$Nj5i0i#p&OxV_pTRlqNuRu3ZRH(~yM*pUgIfhbx#g7%6Z{epF1_|Ki6%Pw#o?G{D z(|)}%i{Rd;u8$Y+#>X%V9g?hO=nUM$dK2OZ=ExkVIVz-*rf@P!pN~qFLLjI!C`?Ip zIr_WTtaXf3;wrIv1+=TLY@QfwRVeNa&^@=^Kick5e77J+$M}>8-nfOj=F?66 zRJcqsM$PTh=Ml7!eW@UfmMYxo2TbRqCpCl6Jxp&)4vDKMn*Rsx`HcQ3z2AiTutHv8 z#Jjo1BHu_?@IR>2hq@w)9$AN$@V&#I%nDj<`M#}Qdp!J;DUWfdRe8Ai0Q4OBDUOu$ zQ8D3ym0+UJ3lI7mK;TBV$%0Qxeg{k$F5fS)Cio)058%RG@^c`JY71rkYYvkw2N}KD zItdUrd!|w;zm1LUg2rzSRp`rs$3y5ixjDfm{KPE7iCzG%Bm1%)+fw(Y=%;vvWV@d6LnMV`N57p-}Tf0_Dg3ym(2%q z1fbrpDynSOG2?#%YW)|_Hi;%kjG)|KOU5lI?#} zM!?I%Zxy=dS6l(HyG7jcxE+hhw`iB<0D7<{TyMdF7?n;?xLU$Plq4?)^`)t-5*ap0~Oc z0DwF`W8ZfJCiu1e=-N`L<(YhJ0bErWBlud>6!<&oNcYgdz>bD}lK%*?NUiIO`(n>X zt?MLhxFK5gM(i~ImkWPrtO`>CAooEDZ#ma7g5yNycZT{!_W&314^$9flZb~IxiOTO z8O)N$dm~k_C<)HcBR(A+ocYS*=afdqC?{P0PnzVf%FK*4enMQ8F-g@=R%*#Ec+L;@ zU5^l|-=L=t>Bqnr8tpULtkgHodqXT`|7Ts+lUaA?4_` z_`nDo{7bpFp-NXvGIHCBgg(;DRh1*Fs@sx+jo=xWQt}n@aaqMEmfZ<9%m;u|z!Xu=X!0!#L7w0iC>Kd%2~$#7m6wN>3Q5olCvCGgaV%$&x5uOO)s+b8 z5|Jd?zy*gR^4Zh0w5Yj*Q}LFiXZ2@32rh-;QZr0!NnBhVueWu{j%X5??!%0b*az%S zxQ~*7Qn#@4JG_rGB|y=V?8!`4L9~=9y$?^kAjOWhpHsml;f$)&+-jqY=X?5Hgj6E! zj5Hb;+4uHRdOQNK=M_WF%$op?%SP-KnM5<{;w%YdpJ8r3QPb>RyrTDte)GyQs6SA% zq#I4JAAr*qPH6W#|1?b4qY>rh=-KFDP+t%ux&#pYYUk@rKV@!W%cJ%m&5;*NMj3_v zqw*6ee;LylkqjqF&9Lp+qX35WpIUzo67klXqD%buqpwTxM9acCsa=1@+svjj&emy? zw3Pl@_&{Mh!a4!rX!gr!C{MsWQ}$=C!1u#F8F{#DBVE3S(+I!a*zgqp}6QWgiSagX4E=z zEDU!o;>`O~aevz><5aj2t4wd+{V{F%C#dIfe|q`i{au3;11Txft`TZ*hsbHEiKGd* zBwgI}2_V_?{!?7R8AZ@YX}r3{Ave&;UL7p$m>Z3bNzdbP0!#o$W$z^J_L=D6vh)X> zEA0V5wm6Yyr#0s?5Pii{Ezk#(>f0$IgVb%mW z9joV~^Y;KCbK2y?+*6n0u>6@Q(zhZ}jjlue9^82uvjCk2p$Me5H6Hi zhEc}2!b1Q3wGlzXlPleejSuA4GT2$SQReZ>V>(-BR-b7S)Nr^)6##_(>1#jLqL(JZ z7P0(jZ$7OrzWp-YH5zV#tr6y9WhhVIB_P~9bG*JfYpH4W#ommK>`7`sh>`PhX3I|0)aThU&kFVjK$GEtK< zF3DFVzN*l@PnRu2T@k&TUw~|pt-)m#AWQt`Mb1cC$GMvk|KN&CvhYv*G(z5YlAD_) z@{zX;N{yKDZN}3i(QxGiiop4i!`=k{zB_fg%`%;RlYxiZ|;HWRRLGlhx{AoZ~R7R-%wz~M~kOCbd#RE z@bF>f2f~Y}*Kyt$41ec&(sFMmwJ!(yiFeEcrJZvN5uaixRbsU*6eTd_t67b&NXEPC z>MhA8*H31sj-$jQjD*;VV5gvTY3y!bOXR;X(q4}G4D(^m%2o-nxMZKM%cfo9Ewstj zSUcM0TdKsUGHRYg2nDwNgKkq0&(ab)EHp1|2LC;Z%2L@%Z!toUmc;pH!7W#vTfHSOpwgQMF&&Bs6h3UzNn#T zL|Ne&CC?Lg$BTXV4#CX)*zVOUt=V*tPO9Jo?`Uv5o)yiErMMTZJxncoW)qV!V#Id& zB}&^nbgx|cV(p}St#OyDywHxY!}Qm-_(z7UijxBpQ~55j^QuYt<|e~sY%<WsO0 z;CX2zyCtibS4bZhI#3*FP?9F{Q#6X$XyK`y3|7LHa-qGx(k76nP=%T_CKHm!@P0Kq zp&NA3RyOGKf(tRD3xM9;fe*OiIyW_KP4f1zd?L^UG%^U4VzmBjtR3FlKh9@_16}> zqw_XK^;1e}O|1nFa=(1!wNnI8*27_>Ll3O#^8!oC&zGbf+vI)i^QbgL-)MLz6+ZpK zBGm3DVu-5tO_FB{AP)x%kD?4CorV`Rh#fbhqpSEwlruLjv(ebWEPl)EL8TKAJ_zRw zAZk&{pz09it|Lj-iey-s0ZK!-Q|SUF)qa8Y%HB#=2(t08ao%i>y|H4s^B+{zPmx9z z`cx=yd0b~&=7DN$f&3ws%9hj~`8VmAYBs?#jOP)lH~OaEg7woSRG-J)6ks&hDC780 zC=Y%Cz){&9rEtjrHzQ3Jqj%DUHc6>dt@j7qg0f^lJzg*^3?UDnQ>Y)B=Qsswx8@>@2i?V z676T30M2dsb2kRFvOD&T4(8xw_7B4L>W!s}u#8$0b#*9@+@Zt(-j9Z%^Px1nYB-;! zk{P_YotlXGlyHb761OX6iOVs-lk4ieQ#%j|U~`n|Z*LVVi`|h@=lCa{}9);vY)MTjH+6``9vb-~0x_QYU~g)Er|;cf@z7W zGs4SOoE)V*=b07X?)Xs3M9Dz&dHu2VPkM>XzFJPd8gH9%!uz}|2VPp*wf!Se%rHf6 zry-S*+VbEv+#R5{O}h({wjpw<_MU6wc8ETSvsY`wWpK8@t1-2e=+MMhi}+y4_VqXD z!7y+bUt^Cb%$>eG+p;Ox3$X)w^7YRg)g)zZ4Z7MC2ZVW1614*x}U0wGaMX zC3DUcKd|{3Od!v1@nURw27%ghqob6bP$m|}f$b?*>(u>HLK7UiY<(m{Hc5~x`jwX8 zi^;!Yb8*TcX&kFxPvkvWLHs$673P*``RHd?%}{O!nnVCmDsVQ`kr3$K*9@I?J2%ly#~SaT24!f#L(pSc{S zn<#oWIKSER*%L5_zkG{*4-Y%iSl-zh(5)ZTJpYDJR>XQvevn<^>Hy#_kJ37kj!${x zZGHfK8lFbggE2aT>qCB~sV&iDTy1s$&@PwUc!FPw1Necm*q;&fe{K1~g$!)%@7tvs zGwp4Cou801MkqsZc9$zdUa0$EW00tERSalNSkn#T=R8pN+dWm$9qIwBEDmSL#cCk> z(hk22W*g2Z({v4Fl!eiB`bSP&U(Rs3(`J%Pj3lI^vO+l{*b&UWW6S?1PA)KtN`2z+ zM!Jg08TkuLu$}TZGbkIJ4;vz4YE%O4%c9r;oY@Xwc)72T=%FR*!XeD;dskQ!S6Tmu z)EV}yA$oe)Io8&`ftn~oi;IXa>*Gi6$b%XH7I$qr_Q3pD)cB%n1o3xnH%r*>V zP^7j0#Qr27jr|`1!a08{6K3p$H(|geKjA7IBv7@{w>S9k5D0^gVFCzVcF;0AI}ftm zY-3t%d^_TtWP^;4j#}>w`%gr=Li;={D_;7>B3cbDK)#I?V`J%N!xY+|W$;dZa z_%sC2+wKL_*_qHEFkK;Z%~bNQ!2TIkR~zr zRwJel7&~fZQ>%1?FtEJ*OB7>eP}H@km#C@q)VP#z^~e6%9yMf*v;KJzG`Vo;nw1IH z4F#bDrGn`_jvHWSW*QOs0x_*;P*_=)h2Tv0C8o{z1@k3>sQOomm zAL?wG;zd<$np~#VewBrC2nCjAA;e7?e3!k?_-YPADKKH3@=8YNac62l%a~Vtm3PhD zbkp-;6%%UtG@jZWBjr{;9r;6mwb~2)hRnjb3PZ+! zVgB-*_-?!DEBiKLC_Y|QRz`-7in1W0sppj3zn^Slz(Ezl+Tg2csgzfMm39|%=x6+k zWbVE%NwN4s81m20JuFn)uq5;M6#{&cHFH+3*LC2HIBy1X{+Am1B+oNgj2$cV40UzS z8e>a;gNAy4aiaY)E+zt27B;k3H5uP(pekjOv654L6F-w&D4&#E**ib=nfZD4@XQg` zioV7;>P`M?csylbY&?djvdqG$#9Tn-!}ln_x!fJvigVHTro&mgU|T`K%$_AMiCUpl6! zg#vtDOlvjAe2Kq#S%1id71@y7(gv>{SWDNjbKo{{>a&x)bQ}Xh&EU?nfnl(2!wHjJ zZ5#f|!@$U*WHIOpSsl}n5T+J5FYEJMx32Z)1WSDA`j z3*1{p{u`QT?dr{rYMz~R1vMp7;3Tzo&*KW3`;$sie)$<+gMPzNn3N@n0h zWXGvv%c}Si`9u)sQFt?Wr(8nF#Uf?l^0icJ7@pQN%~Uh!krv;V4-b_Gt$ux9V?h;h zhwB~jrkEGlDk!wEKRmtyfy=Ck*JY&I=++Pf9yiUlIfXp6ObR_e z6pgO8lg;gFWD&JND~BC!tX*QUrAY3CZ?M17GYR0dIq^pP1~F-FG%tV^X+&_BSQa#? zjQ;g9wom%ld1T*~<;mO6#Oe9+4Kc8krW;`w84PZg0e#t(%7nTzwGL75DR%z z{{Uq{Vtl+VEls(A{6)3<+S0g&n* zc4bQ`%#nspsJ3gnU_cWOh&4Ld3n0*0Dmv}(YO|_&hAaQU<4yPWoQBQNFd5^4S5*>% zfg(Jbw;=@cYv4lz3Xc^NifR!i?nS2kgO}Jt*31Du3$#BywX`Om7sqFEG>qe^4H8Lg zIE7C~$N>+NBV$fR(5UW4r6s~B)Q!6sk}!%cQEfCG@!2u7VPVmyCPPYofKxz(yc}$! z32z@|Sm=K`_5cFm8w& zW#Bon!&7r%jd!*Nmc!pAP0agsjq>b-<=k!MM9s$)^9&&yMsK!PRLm*%Ahiyo9Z7)a z`*P`@PNRTWi#ya0XmH}bbH<#jhqN)MiYQC4iUUJHqDf#*ee!e?B@sKp!eAnG;1uv6 zyU#O`t!Z377r_o;IoBkY_|BIiDjtHDhpp=i$9wS((AhXLs1bYGTMqr^WF7S3;I2daR5zH)9)@Q)x$xtj_6)?@o8^1YTOK1G z_j@$-s*nxN(B((sw>bq(sKH=}Ls!kiCU!L)x~L+Ea=XF4VnxP2%%j$dH9I;zdBK|^B21l5fYnibpPTsSAb#C6wb&DX~hKmkwfk~%vAs1 zpgq724|Cb_!3I;!u7c3Kgk!2UpBei%reGDUG(nktB~`D4nU4iOX-Wl^Vqh;}iC1st znfrZDG2Q3v^&DmtS8G~(y!hjlLPV^7d=MnvOI?}e-YPZ_A5Jh7-P}s!1g_39I$JSB zy5*e#3NWn5-Qi0FX}Qo;1`~g_04{P{7Ly@u`cQbrc?x@AY+hoVZ~lz@Uc_gY$u4M? zc@F4x4K+0$`q+MP*7CeGytP_+Eh1K3FoFpF#{osg-m1SrlF3x2A#*hsKST1W!ZqEP zq1@ZJ+7D@2zrd!Dr5`xV+jb~m z@JZ}?YP8r!HZlfw(FY7Ur;BQwWjDv&J>0X)Gy8BP<%T1swbN*a5Z;F}ThTlNiAG3D z` ztQ}R|n-#n#v$ScJwTjq7iVR69@&n&eQ|a+VrciMh9BDOn(4GC=v8|d#rptIBjvb|b zxw;3Uha-opv8&G?9*PEig1K)RYeHmN}MBd~(hp%Z4LX48BZS%}^tclU%fG7(~} zbfqUTL0J>xy7*69;8H8R0EbLO@nNpmGi7LSXzJ#*)*XjGckzcewQrr?dx6t%8#%o; z9GbsSo>Puh9#|%JG+R9c{>qPh;(|}B`Fwazgng<( zc54pAz}AGmx<7Km3<$L=wFl-Cc2Ub0bEM(^-8N-f=q!Y3Jcck>sXgJUI>12nCu+Ej zHR|Zqy?{3$_t&YMP#L(Wak2vD7&eoyVQf~4NW#q*`iictw65puPUG}>SK)tX*6amw}y??Nj zUUZ14B{<{~88L>+t?pxuOSpE|TFKRP=uzk;G}YYwvRMMG@wN$p9@S{~5^zhm5em`Y zW(4Z?t)9p(F$#7go?$pv$o5qLZUaP-gGUjG_aEo=FFzKpw9kSUa25kU#gR+PG72|a z=xOnM@rD>k7+iKUo;e2cBfeOM3WE#GVdy&-{k-!pZnhD`mIS-y&Tv|?P##*-*VqT5 z+qLO3YH$5qn<=Qa_g8Rmto@J&kB-5LQ`!VT6_9C|e4a${uW=jN?s3E>U~ju+ADnpUIhB7aDBs zFOw<~cMHQuO!^nl!FRYEwP}O|aoVVT=&)yn z^vj2YB%}x@n;HCE@(!jJOeXF{;`_#A!kucsGYQ`KGWfO)d(NSnRsU3EmQyPWrQd$h z!qK=tvo9bFMO5R$?`OM004gqioqzvxbPk3kZ4V9xbl5sKW&OL2>{Hsa??nL_F@ zx&-$U7l@rb8Hd!ml{W$rIK(}gnpUMb^|N>$Z^^$BlCgTC8Xe|9-dxtcIf6OGsvcn` zmqN#~Mnvv8zJ{slcdXNs@E75hpxn>#4}Y7OjXl)8$zr7JQ0ELyd66$S1cC@g(pRE zk0!~wfMFQN4H@M%aZUWY0J`9(5{jaP@(f*vs_;q#wGmDXPbJ=J!o0N#xB>&ixwls}4 zEF4Xp&l2eD+Ix$!-dDB3(w#f>;LoCjNVCmb7$VjN4nIznH1PY1xTXk)u4lhCXPMKY z2E4hcj80*LR(QK}@@{c(O|c0@-1}cBG^%X@FasT0M>2bBj0-@^*B9lq=JYcP(1Cuuadk`mc=2Kd_5tsR$5sZ51u%I9 zD;cYgiipAqhI`U| z%bW7SD$mIaO|vwHv$ThU6c90f7Bzj#Kw?9tozfrTKL`HGqkrfphuF~{Qj-}eRp+Le zv38ItZ0z3rg|yKCv2BS3+TV-1fns2ZD(b#{-;0VB0DtZ}j_XY_ z)$`pEygAhK0|LE~<2JSIL}>wzw9ReXDdl0mv&x`_>|_Eb;$ZLVT<3P45b@cAy%KVm znOZE+oNEehSw+=2<3*BjBMXf`yBEfo0xa_J!v9j!kFD(^cKiJ z$kOL)Ig`8#^c$Z5I?q{oSOF`;v!eO6SZ^WM%6?}`h&T5(*c|p6R}O!1mPoM?OP86u zS%7XcCmH>)p0KSsuRBC>?|HC~Ph`uB~j8dEwLsC)-1@Jy(#=1jn`RC8CQj_>PA(=nwF;@SDZ% zM2npK;f$Q|#u4`u^?P*Wj>aCs&YCU;-Jt54(%#@*J?`$AG`3wUnI#o>?}w2^w1$re zL9Kw(fBAwArnaHv#7iXS@8MdlX+OLg7JU%94vQ`>ws#*`)8unZ8j_16FcqsbzG$W> zC6-%;yKUJQINU7|%3Uv<0vV7H-DS%>*qhh|@`DfS9dAzW0n>UuC!Uiv@vuxnUCZJXNyRS}`A_S<6DGDn88#KD`IST#5%Yom+ClrVR22#@)rH?YfyCf?Z| z_CZmhH;;G`h@9vCI< zJN;F0B_o|~XGGmU5C1*_;-}q z@bCCAlwvigN!yJY>(RPsr{{X6R3q?@aCq$03PaF^h2FHSbdz3*9PZg;-8DRovD6h(V981s^8QtgnaIt z$qa>WMPOdnM94ldM)~z3>Y6s2i*^<-tCD<|wSpM>j*p0JVwcJ@{2Nn4%>nGP_6FHj z2q^;2*3JbWrUX9uk7uCbBlKAgi6v|u;fEGtv!O~C z!y6G4H1Y2U#Wl%9Z;P=D@H8}IqxAbd^iysb1w8}ALX+c125ytb;lGR3&b6(4mh;%x zm}P;^#yzADd7+r~2UxlT*mgV{z^peNMeI5RJk>zDUA478*DugtZJ<5oMa^j!RZYV} zb8p;0%U8JN@8*S>FWXOpkq-xbBF+M|6wUqHd*yrx_9j~!n)IXQb#2SFJ4f)fflHt3 zEHa^(!tgm8h7wq>1B)T*zw)WB(P)kT?+`}E3lBJb%1{g!bp|ty;h^6j_PGneUJ7@9E?@Rc z_Yo)WmI1NRShHI$pG-N}7R=U}P`Q`k*~C#9KUAHhzWOQ9ENzhF)S^;ITR5$+jiyR+luc7saM7 zW&MOd^{NTtBG^hvNEK-wSb2JG@M!sHuYPV&`7x`%G2ta=TNb?>IVhgwgm;*-kCkY1 zxAGTJFzb;NtHJWo5&aFL%bvYci%G&e-JJnYpZ3kFF=t(5h=mIiZhXz&wU*y0ZQjar zRB-)J(p&n}?l9y-PootSwH9wsokE9~D8IUa;lg|uCk^Gb|9N+4ohh8cwJqc9%Y3Pj zlh){AM+q}PSIB7O(DjZ$fV$Iqy0g_ zH-=oI$l#1nLEZWMOtNnVU;O83b5)%in|(Q9g)Ax4y|47^Lt!Y!CUvqKCZhFh@6D_I z7qrb}EkB%@eTG_W#j~d{f-7E1U=+88FxHGuM|5HT#3d&03L>ljDWdLKY;PLX97~7L z!4blMw*Z|U<91%!cFrt6-F>_TANTVqpK&e&AE=UoX?ZSrU}+Ua{=|p@gJOVYdUV|Y zt|Ka+Wl@@}#NK>$;)YyT`kfG2g2zWxV5Z zrOGZELJu?4=bh%}o_i~=RD{dRE8`p60$V0t3fBWU#QGpoW1QnmFhKWTqBROr(Yn!RR>S%O`%Y@1(>Mm8++AYkv{>`Z3N|^SsO0 zp)$W`oqT8opG#c3p(!P_OzkbrjwYP%QsoLAe8-<>cJ$|OG7s8>)w0~p_noT_?-X5^ zvr7k;bp)%73+$Clqa9Xatd5;Y@Gl4?e}j;QRZPSf0v(SHV(#uaUB<~9)n}#)`O= zZ_t*RR&cw3Y2dlWr|$}x`pekTvtRoqZ)rYZol+3D8q!DA*pS&`7+D@hLc^6&g<&tuo%H7|$g#taS&fp0Ew8^laM35RX2GADn8A%jjy=35=@>vdBqy~?E zPMH7ud4TsYA-M8Ns80}vtNUkD>l((0Po2mp@xK}&?DW&i(^2-OofO6d4%#!exy;m0Ca#b-7mMi1C6ZA$e6&_NvJSDXJu~>B0H+5JN9HR7C^=hgYX|3&c7mtv~!)0J8VMnb1Zz+^qomR3{^3z(ha@5r1JQ}z%u z3%aEBwyADJcj#EAa38v6a~#!;s@XVF-i~^{vls2syvAVQj(e;fJTdp}`Nd)6il)@m z0WH3(bHIqVnW z!sfVvTZEOWgoDV?!J-`((bgb@SDQ7cgSLdW3mldxn0Lt zFM_&hmECp~y9Es?40@VD+Rm*s>q~ggx-QAy0@g6LKvMiX{<>*D(wcLpjldvJ$;#g# z8gqfsNa0x;Q9q4D$pO3^#+w?G|qih$8=MW4Ml^ zqn%D@FWK-~`1?;VF1zJpQZ5z_z8b$wRKB<-|EUEz6c zG~H;WcE{H^31TDKceK20fy<2ibF)errCsIJwk$ItlMo)m0n{Mqq{ zV&PuP&EvskEeWgI=e7rI;BRd@!yN$75O#+p_)K6Lz99Ph^eRP!KH7&HWb2RL8p1lh zK4tZ4R=M4tg?y19^tX>A2G%eL3J$C2088vTSI~B#xCY_oj@RU!^Uh)!gz)u5Ozdc@ zco7~Tu!v>-`zzgg>OtYGQrkCov!;mU&A zo_5wZoe^KnH79PiN4%~kGKeNu%HD^2%9av(WzAd&rOp3qll(Dj&cbQk(sQ745dDXR zf!Jk25hqgG6L6*^ghq=PF*Q)KrL+HgeDwuRr~P0e^E+Ip+hr7ZU>%)JC-%G~>6>|^ zmz*CV7w8lMY&k8bB3w;jt(~x?XlZ70qWH=#wd=drJL2>$*#ItZ?7G(+iKfnD^sbkK zRt)kSJhX~iM(5+Tqpo`MbGV@)CtMX)wY{d?S_w;>qY!MasW}j;I+#>39)?`=f~xj% zB=1ac4ngGz z{lRrlx3UI}YUL;+OUvvBqibIXC^-x*e~zM^Lx%sHH)+ONkJR!v;yEQ%i+^R{=_P-abZ0gAyoz$lG0y0o#U2U{02Gb?Jo!~;qo=cT*8c3=HGQY|9wf4z6_-RJq`W<0BE&8s!%9P++HMtB*3L#;oAIZxSO{^r_$ zcmEQZm1i`89bDs>fzqv#O-neT!>^U%*Sodo>12sVWj3zzRWn+`0lTti^{6MLv#K&R zn1SmgP9r683$1pamK|(lC_rJ`tj0r8px+=wIG6-=oY*eQ`R25jxHH zkXa3br3_J%)eUo79GBpC?w?D1!Dacr=VBi>6d8y z!SAs}KUpb}Y#B*X5z&QJBGq9SAC?f)Y06(rd>QcZ0|0Yy!clP3NI~pH9k{|kJ3x%S z9q`4YRxFVX@iZ^;CDn%Ut#$A8SOgo*wYE+sNv7@xyOYWBr&tS13qPsaI`)n{t!1M1 zX{N}6Tj80;*+jBVw}jNI*k%br@@)ppxCcQ1{gMsqHOII)*)cV220vk z#|$}#Q_-~wf~5h`tUMW`$)eQLWVa{AQGMd@S+2u+VujV=Bobk)0u!2Q!YG~yYclE7 z0k-1?GmV&sp6O(7PtC%-`f5iu2gb6ff=4Kxa`c*{1mMS)aGAmDe{LFj z;v)SfjEYu#EjXBu;7vC|2JLnQtkO+xo2kRm+=;-Tu@*ztj8=xsnlvLl^)Bc?iHM~p z)Y1x3tcIXSBzO%;-<%!(>wZs)7=~-0(VQj<(FXc35vu!J%Crp$xV_CZxd85HVp!kk zBpEzMQ=BN{RGmVG_6;0n-_4UyypU>8QR3TpD>E_pj1!aesk(J!V67iVYdpym_zd!C z!3++yCQcH?gA2B?M{{Zos=#8|0>*qLl;M7f*|q;=HFt~LJ$3(=>HN#?-Qu~4IA<|^ zO<+bL!~X8v?B+5?GR=Azva}f|3|^9-S!&YHPyKh1atw*hURLOHMEcd%L#bX-Sw{U8 z8A?pDs?9NVP&ghg(=W%EQYkTaxT(`@n@-S8ucKG zN$LipI}Y8uz7Rp)M}6hz%u6@DQk`Luc<0h z{PKOKMlDtcVR8lrRG zp>)vKIgHDYl@1ME=+1r3E;sXBGO)?FtZ8iI%52;YR6-+79~aEG49Z<)kWDLh3EA(x z{Rz%u8J(5irWP-KMInr7nvSjJhB$}lhd%cU!jcaOan`6cmJCg-sw-tHJ;7qTIbqr> z3m+23Og44Y@qrCxpSLfc zNI#e1;Cg7WMG7TP@SIU806vqaV)bd{8#>g~7qrVxdENm`eV2GQI`~jIZZ5gwE15xu zAi`2w))nbZoD%&rQKlQr8Lq!d4T9yv@Xd{+3y`7#LUdy`mzVaeTiIxO3XH|Uq~hUr zXar92l;2&dv2(n2-z8fjO-BK)3*Br^lQNEaa;RdmO$ma*bS_n~JH%32oUCOk{6(jh zOGX-+3{i7s1_KO8TdEV7GXui7XGGNJlG%*28hA_!{@gkNjp$(2(=ipRXqQly0T4Ni=xlikEzCp{(U+ z{=Xl1D>g(Xc|x-f7@3d8b84PO4;ZNwW5a{WtMDHk4VoOdYPTX0fW)a3T00%O0rvXf z%0{t~^~M(1Q0C%n@jK)whs+4KWYMVG>LAjI*#_lCjVh||J7X{tuz%)v7Q?Wupl2&j zuAwq}BeW(hI3?xu1o>dhyVmD-l1#Sa4Y_e|C1C{j_c>nMkDT0!^6QcDYtS5&SS;X+k7vF%9Cv<5fzJLi7Zk|69yqp0R&OwS~W_g zV5UiHlVhlMN#pZjUI)v4Ug7x>1kdcqZ1Zkyp+0PWp79Ty+tHylhT6mbU!n6(?ZLJ@ zUayV1#ltPYas}qb@5LVgVqs$u5K}*1e@_XNH&$D1t5}QPEBPHL*Y-QSCZ`+s1wm-k zmSTr=f#h!KS?Vu{zrHOHe{xpzN)b0-)fxNn^0%WCPZ=OKG z3E)BY!uvI4@S~_#{c&rxM6O4q`r!}QA#H;l(*HLPFwCiL#i^ur(chW^?fa(%GE?Mv zf35lxF`=IB(`||*qi|y0%yXZ(i|ft? z0TlhFo4=e90VqFXuEBK+Ye~$9yTdc$x}N!{|BAGrHcj_Ky0$izvXs2MCl{oA6O|;O zd{=@Y51D&aFr3^+4H;MG0J9XJZd9Z-pKpYi1x8VNUt1M`hWs8;9b~uo_nNJbbQd&b zXMPoVhsYXUGaP2cQ^=at2_ybs9tE@=m3qH+;jV8dVmD(uGPKI* ztg15moG$nA(-4~hU>oRbB!Hld0KR#o0jZ6J{a7p(tTXlGHlYJ-4=pDbEjK zrGaLu@hSr}BNk}Ha%H_@ww;q74w?s{FQM}8`#*H#1;}{BZu-%>MUcUvPoZ2+hL!&J z0hYf`;kWwq*hUEuqOovbC|Hz+-ENMZ{^4K^DNw3YVD#VMtEOSu%b@Y8(bF4>o_5`Z z3j~w36L1m9Wz-+IY#zD$9lX=<#R#?0<;iqR~VSN(K+= zHK({FMv7DX$v(m;diYPYlAi^HLYfr^-j++Us&h9$sZx6)G{cM7IQw#xr1hYKM>5(A zBw_cdM`q;?&=7axf}~ajBLK~3BG5UqxQ+NErvCWLDVc3Xz-E6{$h^{zQ(i2*;n1+Q z$)5voU$!IW2UD!I&JD1{pk;4S04#5e>)GbB8jwT-%V+0m3mJUItl{Ww(8Cuxqb9I}zmbgs;!mEDnDg1yw0lUNapnzF_dR)9q(`ci9v7vk z`Kc${UADtZ{ZOcUrsss@pr5-O7wdUW_1M}-V`mthC|qorHH>$Pu)7h>(&P8smSB@7 z@dP*?jDmw-e7r#()o3ZmqVPwUr@f0ZmS!B5wD(JR@x=J=Wq}py)sqhR(FLC#4kNJl4A=R0+W6EF+w+ z{B%&ceB!=w5U}D?PEHB4(~j7QjE*{JWlcot++)kWWgm0Jm;<0lQdAJCPo&JbZPHG^ z^!^)x=8TlH8KF>7ZRUQzBxjnq{u^@}dx zREdnCmp9z1O-)i=m5sTnBho(w+>w?ssA-*XR$S!PK70eu`|xtvE~f)f+mC%1S{8C( zlSzA%E^mB}n&xu>#_r3@H60%Pq5CS-QoN<(7JLZKl5SbC+6OHzapmEhIN|mTrn2vW zq>b*zB!m97*q5S0%ydX&d8iy4LcdBg>(BAV?@5~8p19>5X*k-gx0OfWn+&2l#01ge zd#~hq4_>XoxVnEH21?5A>lizY=A6#j0EjNCKT3f7Z2nKmVuiH&FXPPwmMXCl!Z7=+%&WUaMZwHT;1iD95&%_(v2S9NTNy4 z6?nGP7TB8QxG6}y<0e@Iu{=m5o*43J^lC7fSE)T_U z^BhaE-_rPzRD6-%m9SSMO$?_%sh@iy_*fQec^7D)92gu^}BzOCh)?g`r-4ph@Z|X z3bgeKAV?nHLLW$Zf>q9G3A;m znN@kosa2-=?#*2l_G{ANpLjY^-)o#*F6{c8Ar+t&?;MZ}q?-phy&2|8v((iFP^2E& z#fA+qB1{xN!!BP6Yojy>ZOoh0-7e7j8MP{(-EJyLDit1TMbGC2v5Y519A#*)3ZGw4 z_i)g@4p}XIo~y|BiYtENmC#vK+PAtTi;KObvrkpl@gJmutKznAjeQ&|y-60Te`FX? zH)K(v3>D=ULwbr-_#hP?MTX=*S~3uOCsXr0=Zkv9#riU@b%Tw3U*8++wxRc5S*mz5h?;JBX4nw}#ir!=Z~ zq5-f3N3yc{iFDi`wH^#p+G=;-WZGHJFb1iW2e7t&S~{&o&yFoOnZqM+Zs*Xz`tdG- z{%!ZlqNI(=fDu;TxY1R@ltB}2Oj$SuZgHTAPF!BQ@(6io=n;&#^{W-zu>l^eN9$;M z6>j6CiF1Z;6R4JyngA(AT)ug`b1BhM!dq~**%}>u%Xk)vZaDISEF;t>HjN_b&Q#_! z!Ry1ZM8@Yk&d%j!0;<2bR9BQa&45nZfLJ4BDw-q=i=2)P&T)m@kl(?sxXdf;McKX^ z8RBR+=m&HLjTXuxk3GC#f)k=yr4EPA>29oEjj`Fs+}~fEn&&BvsZcs^*ou@#q1J=Z zxV$(x&QNA_l``uMNgq0NNxoe38J95TCpO)R7#(LS2C?kyv?_3YIDfn@^d|7lg2E@}3qvegFKR|6WCyF)>5kx@tR|_jF|&m= zI6kLk-1TMryNLanYP|~YRDElN4ICl~+p7AFOHx3u#UoeYVbb zPlr0w9}ic$jxbSL<&2(5TvAwnnuf3@2re0rW5yk7=6pzgt7=?dn&Xx4%CqS=_slE% z)he63#T*49A3Y;if#1ue;<$Qe#mkWl%EClh#sB)j1>u9{(nTxW*I2tR%6te*-BJ z0R#9?M0TI3?Y0KIFP_OH>L47w^7m%FKNacpaozR+2Who3l@0Y^u2V411W8Ol_(hPD#D&bV% zZM|vQ6Sc8C-wTO14_TOFoa0{h{n`jyknW}krAI^a8NWrtYp~ASeh$EDpKTj|Zi;ky zrA8asdb-uyXj94pWkzWOa+-U;4M>ACkqTZ^`-!T)4Dvx}h5Iwg3AB0_cBhX+bqmh+ zJv_s@&@Ly2KzJ_N>vZAj$RIN0RjId!8h*YKwV*0<7R;$LvQ?_1#1=%&f-$UjElZd9lnn4`jTRY5XiyutlNanyPWkdl?|z*zAdNF0K#TA3d-hZF4?qDZF2iw?3cXvG5zhPMYOp( zo>}c}|BZ7l19X~|nB|Q@FpOg}ooA#Png^#amyj$Q1frLh9WwE9EaSID;ZX;~HtRgp zJaY6^nzY+yd@3VCPF))MF|&sDA$Vg3PC*UCrjtDl>;B#5EzLN?&i5Zgu0^uTmRX>4 z-je>#A~gg-4K=YyVubH|BI>TqE$UJwW$?CHz*B?%si6_;+E+BZ-lNBWTK(%!{7!uo zpg>+fzse>k)Kd!;)=J_H8LX zB`t>VS80MM6jpP4+eD>;L8v_A$H`e&?_2ubSc*-n(I6}J)Uz|bt;8%uAF}GC)g7{_ z1K)TF1-w;{FS+rg+^-%MtEl9xND$L7q<}Nmv>g4zhq}lWlj^0V{q89b4pnr7&a z`a(bVUlOIs&N{{8#EY3+3>JUjv`8@G%n_`%fL)?Qv7Mp&=D;^s?=vfWHJ0Mqh8JkE zL}OL7NTf=0|0T8Lj@gcXj8E5;&5~5{^ zLT=}5E+Hz|#_{VD&Nfy$oX0n-xRYBW3I04+Z0G2jkx|t_`Six{rn#seuh{N!rF=>x z-UMDtoFji_6tq%_W`U@-ct3s>=NQ%uFuY7)p@y_#4fwWn(UnqsRVeramtNbh?Jfa3 z*e1sx-m%1X+FhesYtKv7-^@UDg}Gm!``{ON78@m=tX+4=E?++=)*)N&VlZxI{r2{* zKL0YnNLuOj15~YE5fci<3TY%l%6y%7(Y2rVJJ08PO$M2dKaxm&hNH=W-hUL%7I&*L zd2iJP{HcUg7yBreIqpJ6)XI2l$SwvG3FGc-q;7Ts)j|MWig7V=VW{${zFJ6B0gb%| z@1$gYVVWD?o^0h6O&!6t&8i|cCY}?lE-f@81br&_wXm4>a-~d6<9m=hN`awrek?{x zGVX-k*+jb+&y)#DQF`L|Kd$o>r%IHMv(zN=x!%rk=ZeVUAHow%TMo zv?A;xcZFado^bc^aFE$ZipFRjt~JeG!T4J7^0Ej=DYM|KWSuwDl33Kgmz2@a$6xq* zEiWtrLHe;G(eN+Pxkl|=1q@)kt|I7n!1l5juJ0%M`jD4T5SmwyJaQQK4jFtxt45n@ z>vhrAsc25n@g`!P9~V|63r;doC;Jjj!}HZGt8@5Xu1+Ih@Z8F2bhV=PLZJXBH@x26 zDt$$0N1@x4>}pfCv0%*{wd4Cmrh;XV;0sk5`{)@R>>3x1*r^}=cvKoPKr(@k&97Y~ zs2mVm2R<5(#f*u7uZ#@GUaIeaFYP79@2pmdVI*WMa@Xo7W@qzGV4n0ee%lW*39ImT zzUQ!51Vf$^!gGd8%f@-={IccBc9pK2BR;W%Q6DN$Y4V-t{Pp`4X#|kaGj(5caiZdd zvlTi3^!c#1bE3zP@rdVVR{fVj2M9juBpLXIq>JxrC52WOZ@v)twv!MaJm-QUs6XAB zxVtv?K&Vk&;7`89O?`AX&~`@Ji=)ScMVhbA4Ooh@4z3w4j|A~*-%>V}k!a%Ps!BOw zt2M;|^0>QOy1SG=s>VAF)00UyRvNs6CCsFbkwQQ~r%MUb^VGp+h5(iEh=AKwjI>(h z7gt_i(2Y52zRN^nixo0bhUwN=n~U4k1}Vq#<%^5mYD$y?HTU}`m66C9cAd;;`OQ9r zFGt(Bb_Ztp!7zuoF!ztJ@!5ucGl5-0(X$AV{q}@H``vztV(;MrE%4mlEy6&Q-d_%t z{S*NlXSBYYBsY|VtEc!A-gQ1rbffs=^&uvqYChKC9I^MBPdWuPmPaqC z#quQNvjL99Tk&AP(zXzHnf1weU!lzs$;9j+CPfdpcDLkHd|fc;6pUZzcpXu+0}Yrn zOSJLCYVL2zweYDs0ZR*qfAE-)fQ?)p-;yFJ+{bmb1bzKlnXQLTeI_JDd0;Dzv!Mgu1ic&S zbLJ-3ETh!!PAp1~C)Yvf*#@K+$L~dakO(Z%JUgQ4c8g7P$FL$xzpZ{-y3EDNkLk`U zF{#LO`If^r8e7kwJCbCV1MgCFGxb4Ql?LAtVp1Vy@{WO#Wc4VHfsp#+5PqCvgZ-J= ziquC0V{tNQP6-1e=%p7n;!DHVw$$5Fn_eKXm4lGRq%6t>Z>aq-+y(gHfINwT7CXr& zwUXacpNli{b-dU_vK9YNr|(B@L=rS_JGEdW+G!M57v z`TpMC>YSM&`oC&ZF4vz>c*?f;hpC$BDAM|eWx6~)z<2W+xZ|ekjm3Ikk9L}ohg-H( zc?z)*tqdD`N;>dyF3RasQ`&)BJVfxWSr%3l6u|>2j1RJhT1K5>(PfopG`k)Bd!U4r z1Moy=r#k%H8<**sCVu11oKV)E`h04=C=ay}Y3529HNKk}A@uDlqG<7zF8exJ{$k0-t~(ZTFr3ngt6s2!)C3~<*-NQ=azBvO)PM8&7d7r7Ur$KXO1tj9KB!}^kJmcP0_4TsmpUT3i6+NB<-p|_&ERCBTa$cpD zWs2w(uKOLmXaU&mgyE+-8M}R-3cA)I`3o+Ry4FNIa@*};l{drMp=kRdx|^OZeVOH= zh9F-FE;qLKq>OY2j*4rsrh!}C?25kPdls~g%_d_8A&F{|-m~GAHEL^i+hZ@!j(u{T za%m|pdBYJ$3Ct#?HX`WaR!yWcY>{0mn|2GV_{2sYW8z2xDkc+mu7REJF_>lBgC*VF zoef`CU*xjxr7`ugDmaVL)YpA;j*J(Yr5rvCmL#AD@NOj?;5uTeSJ$=E`ZSIkL}sWS zA$M~Ou9%WllvJU{Yr}l<0aJgUM|(9Ft32_WYd7X<1`2K|y4J)HF^%Fq^!E=-`CUtW zk~d~AwRLdS74Z@i#$9@>R%Q?B*UInaRoiqf$_l-{?`kPr*^k#`9IR)U@XaOD2$)Z? zDXXsS`W_3NU#bf4NHnMrh*C)w*XtX_x!~h^#EKX#Bu2*>C74m7&xu^la*39~-R{R9 z9zuz9?~r?X4oVgpc*Y^#mT!XH1wbCnhIp~iKFWojI_0%s+{!zK4_oKm(d41sKYmE~ z7)wMvnk_Y+NM@?GO9xr)K*kK-jC*LYyZ!gH(EpJo`hWSUSOnDt1uFu|24xZAtouXUTKbjNYkr|E;NUOA}WTUz*{tn7R#Yru)lR@0ZbBE$LU@ zOR6jF9UO3Tbf_{sjhMvnKgcaB@{&|sOg>|A&Q^j6Z@_Uulav&AEgM~Ui4i+M0vRPx z&O^muOm3G+DhxZceE2B+4*ODc)K} z*RFXkneFCZ`ZyQc3h>p4ne=;Wx>>nPKCw=hd#kF{yQ`_^Mb8bLFW~$9xP^6$#8);> zEI|9t^EKR)0L+X~6Sm5edTQ1OV22@j_#yS2O{Fb44deWs0JPVOpCMcw)2Stczqu~miY4vB`B)@hffi0? z()o4@T~v|HGHGxvp;8&j_`;O!^_)2iW0e^c{P?V&gR6VJSZvqMjxGz?mF4=kn>`&= zL!r5Suwt-5qP`2A3F$(6l=XtWyx$O;*53)4;6uY0Y1ENz-|+#)$yhT61kQR_zG$i+ zBUZ+T@E*!az-L`xofu`E(oV}odMmj##US9K?Kd|Z7v;0BkV+S)n_Blx=9P$#vxQ(; z8P63bNxnDsvgsl%VeW|USI9KUCSjEGy+lbjt9DDWm2Ptmx1W3U%L(z3v?Zq<^y-1O z3`vXIc;@A@FvNv_Y>gQVcmQjicRqx4EZKe%EYMt6-*`Ebl zdqUL?@(DZ1(yUoBV4Bdpo}nZRF35X$A@|y4;yub3J0CaWZ0&yuYGs)y+GJII{%1ds zSYS6JN#DyroI@?1LuTj3vkr@AO6gef9c+iE4Bk@vkkurm502$w8RUowbagmRv%JI; zQXG+bP#o8m-1K#t7Q#8_D-dT?zygwNiR}znF>%FnTc+IXaTqwbzBYAFBGEgg+rjIl zN4gP8ioN~z7Ysp66?R0Ia!E@${Q?aDu(1&V@R=vnBF_h z8AmPa)u^IywZF9ffiEZegkpquXxc)WE|)PCi9fU+UoJ*~`I^fT-4o-zueA;c)F@|o zMW;KYoFXrX2+lCx1E0Rm!(SM*)RyEc_-{Vqj@^~`N*gE4J>2^zZ0^MszyEO`;cLG- zIWn}R+(tm>SJ3;lJXi|dHO>JBSMqL1gmK%b3ExT#gLR6a=W?`}7E!ehZ^yowU&hzu zc^~beF~pBeD62%l=cARIu|&N#f7dep8?s^NZ^B-j*4%c3eEY?aIK~ZE|Io zYOi2GaF7d2UQNb$oqvR+M$D`@FHg|`{&GtUv%jC>UpH4GPP5M{;CSM2Mf}SKnPie)NFUL+e`#xAk8Px4MyMtA zYs>&Z@t)77dIZhCn^EK^<9zp^>j^54&V?m-E(~igW0jaUayPUj18RC#3ynZ@YAOBj z2d)DMLx~T#oNoTW&D!k1#%LEUjjY3Z1l1;YJmp$2`#nmG>;HkfkA$@Sfx9C9$6}S< zc$By?P7ccCwh@2W&?%hUzwuhf3>|XRTGcEgka&@>sCO$8y1;XL2T9Fy157 zd0W_v2W>+yH?Fwpi!o0yAb_Xex6m7NcPQY}#ob-52H>?=v&eOZ>IA8v|JIt>D_!#* zOP|1`Ax_~Nx*O%V(;#Dn@u$yJViA4S^mR2nMm!hCkj$OmvXtRXUo21!bH+o_Brw`1 z;cLRiBxAs-&jEh5JTm2r57ZBF_GXDs8_Hk*S%B3tYD(N2Q;hA6C22%7=S-;Ct7g~` zQ*Qh|H#dXpKy1F~GHbwK*AV(QCZjW)zz0hKjN^nHO=#Fi$Llt$7`bwg2h;HOced&% z%YbQQ!+0v9$49Ts$GwbcPHdLopqwARMt}sI{)WDn74u&%E;XDcxR)4xtJ5`h2!?#n zk$t4JJT>|Rrm+4-+q2&*&qT2wxE}g3}JXs%4$#rF-9po=hFTS4Rd`v z=pI?8HkevJ8-7(EzY?W?hu2V+PBo>yt?<{5Wq6w0sq&r=oENz6MDNHI)TA;Qp!cs0 zC3C?gQpquYtpxZnSm;Of*?wlflxL40N zZQfl1Y2*F{Y*)Teh$Lvt$U_$E{+1Cb+o){}nz@)z^_sMA*5+9oFV@_+D7~FM*;kCx zXU1-Rp?7f!x?2R+WqJs_d)yIS=A#Sr)%Wj#Yzgoaa{n5npl}}v{t+x0i!VZ>)5>xv zt{XV3ANpGJ5_?eNMDE|T@RL@pufwf(It@vW)nx+@lMFupycFj*ii0-7-4RLDD3{bQ z=2YMM!J{xm1eIX{r<~>Bxre->;$|PU5UQ#8oh(L4qx_{$uL2xnhc^D#u1zm6;#I&( z{p`xpLc?gEcd4-YpWpkpk0%KeD(M5@FZKF6u)`iUmtZd#A(0Mlebw*7;07q@^Mbgv zN(4;&caD_+Q_(@&UUi7gogtiHD-i$kQpC{hnPJP)*MOOpa?9*&Ow;k~;*R zXXc1Cy<{!pG@l$n867;anqEjyxhQm&mdG_SA%|43<;9@+%W>#VtTFK#R-EnZRK#+D5rmgH_^k z7reheoKi8T-Bs@6+GfCpJtSj;JDS^|4Ut)MGN5g z6_rUirWfUoaeV_8UT*)1t}N|KJ@em%zio!bgenY-sK($ zwE(t{w^VD&1-1+&N$dnW#-$Cm_st)kW(;Qj)@=nhOwdZ7q;p()qR0M!mGAadhO;#@ zNEvg)TkVL7`yLzZ|3i88DL4#dgXb|{`YHyw8kY81bEtN5dYiSY z)Z_T|Y{kkbOXCE}GuBy9V7?S#c$Mv5*h6f_V=HD_Xcr2??`B*(R$Nx(Ct3C@MPv3! z^kqG@UcUY;a~GLGRABF%uF_k-tGcf>W)~XO(f8nnNjTcC>TolP1LYtmnL8|n?Hey}I1o(gPxxdg|Oo%sS zZY4lgjTnseDrqaZBmGx#jH}J5)I&AcY4#%;{4UNjb+fB6ei=OgQnY`}=D3ab@@Zq~ z?iq<9s0>g8dm!$Fy&!q2$$e~dE`v>KwAT%1NVAG#C+DoJerY_)LUg`K(WK1nkw>ep zlIQn3Dz%dX{0SQhoz0vHch*9$y(q+H;S3S*^fuznU!V|s4ILF1Ae*0;z`NJ$E_G*1v@p6U@ZzZ%@ z%-#cDxT1kL8s(l!CWr!Os?fqszo7Y+c6DPEmfC$(DGL{TyM*VBmCcg;DWc+PrHaFtwb!hBn9~cYLevUJ%iNM*E`zY zNaN~uC9egGmX+kUYjV2;Dgb-&nZvH?s&!e0nA;jEO>rU-N^UG;)%3s5pX>cu+n$Lq?jqr#&uYN*8=h%L(fHYaBve0- z>K;w(;n+}Hq)V7bms{q_r4WMJ`lD`__7acRC&^X7mDj)3fqGuRf-~38@*`V2;Y4cD_J%@Jy zfm@P9Xqw!{5VOlGb2^K&XiPOBP~%}GD&d-x;df+#xAxG2jZyGwVwE*hq$5$1|Wl6oKZ-yh63DE2=`ak|;!%}FZZIv91P8l}Q`MR8P_I=3M- zSK&nGVDd>VJ%wF7HF5coUshlM$C}2+RH!}*X6}-UL zD8e5|HbIG;s5ZVD%DI(2?VmBuR7|CVLrqzdoxi&4pR;=KD%^i;_v3EkL29lB+mLckJ@nctm#wme}nax*1_X`ZPyd-&6 zC@0MCsif&NXqx~{NXVTcrx?OCB%L-+$x6-E&o@d)ki;M5BF}-a*>RR-X#+OnfZ*Q} zb;fgoeg}g(BN2N&%qXibV=~VLY`B^K_Yxe7-i;;`+1VSKV>yE;&XZ5Mi>KHQ_NB|< z(0DltNyY$)eZN{QZMv_A#ILMm87UMQ3LaTuJhA!IqemkSE`k-p@dS#ALH`Cp7n7Pw zFJqwjzAuf&qTq{q_g^;UFK|hCcs;_`N-9qEW9#)LSOvKbW(DNEXq%VnR%v8TPUFkX zq!up3aOkrHl^=#ORb#ikPRWZY&|iKIEJut+%>)KJF5XrmQ;a!xOEk3r-}B^06#q;> zjHc?+&p4fF0r`o&kOXAcD02iuhYH=PiG&m}-`F(r8v$QgSy50;eUY~dmy%BvgnJ^g zwiwO#z&H#im(Q` z{er>Bc{<*2vK3MoKf=Cu*+pr4_ztrK(v!B)w&m?ER8UhUj#H?hIMY6yVx1jx^+w%> zzB)F16`S%MazXVuQfdc-xUUmgqJ7)u=Te<}X zHk;ulhwsJ2MLZdgLub*o=Q6#HQV~+>@RguZhN#oqdlE;-JK>hkc;$R0djscPg zX>kXBckDJa6Ju6O-Zl0|o^^LY#dImJwiRi@xnfM-`ia+jQsZHi8LmJQAVti2@?tT9 z@<&epo=Pmna-(4nV@nq_-aSXL)`nuUMwen`ePvGn47DF9@JT~-5e?O*-pG}2cCq_k z+62>2k`_ZfihgEEt~22vnkdCA+ftE-s4H1ca24jN4~Isso%{`@ooQb)?N%#W`wkeT z!+6oShm{WF@DnZCQ)`&gdYLFSh$m6)=gA8l2=9l2Xf11sOjlv)uFEAEgCo|EcIZ6; z+{5I|%4N3+gS9lE{84mm6R3Z+_LT0sKw@;}(lJP-)?5{n6wY|ZW z@dV>nhSxd^vDE%cR5M1@Hn-`o(V9bjjf~uUl>$W?dsgwI#IoLqBG1}C|7-CqOiQ$| z;O`J9Icydng7Oz}wOeQXk=tq}#Kp_*_TqLs;!{my>f+&kRPr0cpD=yAP}Y?pY~mF~ z(i8ws?ICvt(ZU#J?=*(wW>?cMBW~GO;)*B0zld)2?l4S+o$zw9{#fvUPn)7TY>?yQ z$n2bcn-e-ul@@u-Sf3}2EPcYTMe&D3)0v()^AqMeHoCQi!u|!(`xe`kVX>;A7syTF2)N}2Nr zOL2$8;N`{-faw#RTX7@ce1}r$0i0&*O4A!ds9L|NifjnIevBC}u73t`@#??o50h}- z@ef*5zpaPe)nVz6;Z&7Cm-?}#h1O_KAD`#A@LvHUVI3A~@Qd%5eMA*J*?LFIiaaFw zbY|Tjv`Dw~GBf&}waaGA&lWVI8ck;n?8?H-^rdL^`p8kS8x<|0WntwXPMNRR-}6M= z5U3{URuBtDD?Tk5kmD=yHmE)xUc1@VS(9_9&IINoG; zB`l8$C9PKq<9~_LW`p0!b_Y6oKJt5c2O}NB4^e3J!{(u<>bB}VI@v+fYbDKB3O)Fi zWWVrLuP$i4?6%spYV{rNxW{Go3QlUkO-$4_(=ixsVHcnByWMWMm0)mX8OjjJC`-nc z%e@YQ$u7I})@Vsww}!uZSq8!!R9UFi6J%^@wo%{G<8G>1Ziz59(gZUR?J5#ftZ!|S zEwRvQ^StxgaKfxDYiCWct)lwdPOOmz7&p`*)BQkYa3^ZIsx1kWh@@_0NR&@ZJ*G}r z776jKzS1Oh^|rN9s&+e`nv(~W?@Rxe=+Zn3Pe8!oU4b8~ z*a)d5MK5k-$`cWr$Aw(Ky+iW_#DlX|1F=PY*G_7r$;o#!ZlK@Wwp}l!cQ1 zsVkc4pSFmZZt_#VGy4$l!zthv9HLm0FIAh)Czewc#Tg4|I+l7VtK;DbvOohyNdmXm zv?k^C&2WAX5Ram9MIZL{%p@=dt2S)N*yF{X7F;nZ)|PG7ZLKuRJETamL?AC5G(chN>MUnz7)X;YPBMuFbm zS0sezIX|elxqY1RQQxUgOq)%x{KVyueK=vp zZpwe>)R;m_d~0RGFmOGaDgrk<3&5h(vDp8l6hJ>kK_Ij^weu*GKzGT{I+#0B*AU z_A1VXk9z^7>rpAft8V^HgdJTysiM2Xv}z94nHtBra29AXl}5DhyHkvvq^VazG1 zeNroVs(ft9nhH_s9-Q=xoudLIijbBt8L)Qo+0vTk`=-iy|KOEGJzKhMAjR+T!s^TM z{~-qJ=3mFX5@doNOd#8nou-`Jf^l zXGNn*^ke($PSt!hBlW*p(7ng4d=4|R~%0>HL-pk z{a#BdV2e(lQ8BGIj86$-|V+Y~I9jq3DcrGSVXKAm86&S=5 zXmaiINvBD%yuTi)G^LraTI1=}F*f^6uT;O?*Wusm)PtHjx0c{X4%=qwVPzpiujxV5 z)Z-u|4c=tstGYight6z%)|*N9;aiS6Sz$%i7E*?SPHCT;YWW-tXf%^hy39wYCvI2q z{_cU)po$VLf74OYT046}K5<2$p2tafLdN_I{A z?puMgNbjh7wZexQFqT07l3h7nN~5*9cflk3$8aDA8b_lFl+21J*Z^0U>YlX^3k!K~ zUq_Zsf>C{mOnS2;jPxE<$AvmZpNnps@t`W8D?`wfL}~s9?sa18V$CoTCxq!gGztOy zwGXNj$-sfFTn{I*d|>9yCjB$bpvp9UYwVy9$XKV1E}!LvJ07B*^0G>DMKcSmy{2z;$(Ui<9eu=1f_RNBXVg_- z4`3GWjp?lL>lOrl6%9cnkv8H=^}F7&akOJdID{E@dqD1ABel)IwkR& zYZHr7NE}WUeaTL32r)ZSd;;c=p`MrLZBH%3qXA@) z!;e*|bnYRB-eYfl?6%8f794D*rlDJztAdlP=3cq!!4Id>;67D-7i<%#lom8Mwmc8>50{Qy8P z0K;R8i)H`J#n#Rz!eEcHZu?lpa>(}(`clJB3n43iIlDwjEMw8^obmrUaJ)w`_K1%& zX>@jjcnbQaL0xi>IO_Le-OIIjkNt#mm$LeT6M~Xli2>fSlYHK>+AmaaBX`{9)CY4U zmcPYt`uTL8zE#HT=D?SZsCGXDWcS7Px$M<^?XZLRLYvKD!Oij3uT&9qrG{rj$JEoH*>qv$p9@AwJ&KRdAtNQ2v5u!^~wl4GTg zEk)TZ1~9v+y?*WAscOrov4@#Dn%zcJB`}~fIkhq+2=vq4L04y$Rza{$UD?W{lo4JV zi0`gezb40lW8_%yJHHzGo^Nf_8;v%ZMiqA#&{?ckDL?781xx?gtKE&moLcRM=j*6J zm=|Y6Cr}l?s&p&Ei&<1#r4}&xc=K^V*xFPa?ITvjsM1CopTnh1jTj{w_HwZu7%q>J z`js*#Zt0tNAj@(8^6Za`@^+1+DZda{`C%_Fr^b@n5QIfMTd2%Od-p(iL&Y9fXo<3g zkk3?;T?F{7oF26{Scl3zhNQhZq&C9?PJf`%ID)o)R)4@Jj_vW4#vrn@Q9xa(!<(#U zpQnMwDqIj$^^51u09_Qca(Mb{;c+sf_;c}k+`KYXt?cV$gK6!H`{ zxDx)pzS~k}Mq?LP+VV#Y0V{j5aqwN)6Q(4>(~97!fUupij!WM?TT86Z%-Kdy&OF>D zo520*txDAG!joSSbd$IM74EyM5vsu<=#j=_4a~`99r9|XUp_szyUOv<_TGE2g3;_&Q3_y|wEU*+G*v`7yfWUpZIVu@ zh`o(R7n1~nGbcUAa^EMoRCWp_XqQw1zz~k$#Hm zX+ZJFCNU*h;_LaGeOM5U0PB#q~(?2Vw5^E}XBhbkDY7t9Xpi{)Z{E*3&vN$~HYzYDKevs*L3yUO0p#kdE# zUMD`y6?;QGjaPl-aG?mRq^oYk!wspzJ!cQGGXmvTOEy@^8V9n%%v}XCsU;O$ruRA^ zZT4jTQovCO zd_f|jyw!H-Z|PAjjd`C6GQkDYjLn|Mxz4Rq>nmE*75al8=q>TZrAWR4{a#!0iliVd zr}x9N4yz}}hM91!1uauC+oTm+E`Pz1$K;%ikFX1~7gTgL?f4G!0aJOg4n~j*NE*Gw zSHH#V82e0`SIyf#l_O$|^;6;IEX0CsI7#G7+9E4ajF?{vJcQ%d+fHh+W0qH}4zzxIEz|#WKPvex(CJKE zq2G6rw*{;}iZgHVGTP&ES#-NFKP=}jxOuQ6wws0E)*?3KjBw({nX{(T1t1+^;-
  • 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 literal 221731 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 z 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

    s9-lF)-DOgJ!q!I<;&tsps@LV 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%0D3Vzbpu5V2Cl9>4g-qLuNNgm(WQ+k?RLCTV8tf zWvq3)law6>mzQPwCMQyT{3}bbm_?X)4>Y|)yjkN9)pVu~rx@16#>VO5eTOQiw)H49 z`7Ujk9m2e7NC!OdE*gZx(u?6Io$_Z>cgd3#i!h&0V5E_C13Q1q?emcT|BWvT)U75d0)_6v>&d+sTjCo2|6Vz){Z;7Lo?F9V)yJEQh3TgMh6 z`-5zB8={DY51sYStCrNF59mF&tx8eO1F~eiCs$5Ff;PMVdNNZ~s5%(-oKmf+Ze3sT zAe1S0^KeM^y**dbY;H;|KFETr?8-kG5FC=OdAqhF&{G3{P|zJPoOjN$kb)Xgw(~0TWVn`LPt^RISJ>)ri8*>wG4xYkMc->WKD4yOd+CL;TfHB-pyA<{W5#wCz zb&M?^FpQ@^xcNvrRvG2(wVq&|^80&@V2b?^dS2GkVydnD=x>{5Y}mhs-Cv#ve4C#d z7FcN+54?%kLr|I1qaBeXd~kX1PZ$+-+}N)@|hQA&O`ujFcTzpNwDZ$1G#oAneEFM!`GE!;2*<+ZnIFd`%O6?CFJF0#Ck>hQ{-*?DZX5$iX+;a7fjB0X2 zYAjayv3-?d-j(5<92UEbU9vgnr=dIMmq+R8%Uyfi5XAC>B+HsVnGqv_#rQRIuhYa6 zm-Js$h_ozPaaJ$bUpJMyH0}dHwnkCx>ZSwOph#-V%jTOx*#k6fw@#}(q)VnQ5v~mj zz(Jb#<7GaMRJVz=RY@%LSH-_kic+ApDrdI#XV&qv?EE5DRhPpn4lb#%O}UxPf6Gdg(YRQ6Y;e%^!ZJ# z_F<|#FX1fh2-4aLH?h4GvKTV;0%%y_v%a;{U>$XVMJ)zlP+_-V$~X9tQ;B_~Kzb~Z zdxL7PLy*_n->u?tps!h>O$^Y)Tpa!Lk5?<%A(zs2f^Pm7iry-Zf4uJ`;n8u3 z?R(S~F}%*1S$7K@`@^~1l%BJMu1PD(R^K}8zq_HvGFTK&fOzTmKPxXg8!D+B17&k; z2Y|r~fnXh&L6h=AI7_xq-D_;Y@;R8?0y38HyQ(0~0D3BNC6% z53GoG_9qp)1qH0#SEi{7V&@ec^7&S10vwl(P_tCLJZ=h@`30O@bRm?K15HDD#f0rG zu$K*ArD@GxM7Zb+UKCnh0z%Z<)!9scVRJnY@oBMWBf|?yWW>^uDl+aj#n+FF%cm@n zw9LULEF@g?2iGq-!!8Hh**ULDoF7I!-@ zU>Y1OMk3?KYCo+Ft3+4taie)_73AyHN`kILTP9J0O^;&H^S2$FCxp!X@_lg9wo2#@ zCz;szkN_;HU)telze2;*7_@RecUYn`L1Bz-0wU_~KJ`|UwUhym9*(VujNI2|ehSCY zAACmj=u9D49wsxhzW^)PX0NwKqyf4?q;#F5@0aO@$ZvEceY755{YH7FsrCa50fI5 zaX65YV^IeICsx7ST}XLQg#nl4N?y9BTHNfsp+eH?j)KfIt>dVYJw_<=w?^f3HzD*L zajs*5-qDXfp1(ZdAHK^{!jSdbXYBj)n~a4xnXRG=$MISE2ip zaquNDCQY@J(O@2XQ>qF!W@lgm?L%LUBuKuwt3arPk9r3|UT`8G2N`ATCN~>)8ccPi z<7IrE6cK>;8-=&0dJh@7Hu&@nADH`704L!B>8EX!BDQT$i1R|KUQT!Ob4>5P8l)pw zCa1SdSmrtD;!bK$obieV|M+ltsk3%IEeV^DK9M^>B`pQ^Y}p-PopglBN$@eBzL1|L z`)aOF;a#kK2=()v>dCQ8OTqKF^(LdR&C10ADz_sZ1t1G75cc=+0MAm;f1-6`;AJdo zyns@)kQm<4AdLlTLgZO1#@Ehq5JibUZe9~edH(G`COOvXR$G*-9Kl)5(kf)g8H5IT zJY`Z;=12Zl(WL4vy@S>gngJ|H;xBUF?JOb(0YP&KD?~MmUsfHYlFW8FY#5N1Z9@im z`Op>R*s?TghULSJX_FhIUN20xikz1bp0uR763d{z8ÜWs?9)R4Q@wXCxmb^B!C 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 diff --git a/website/assets/img/docs/pipeline.svg b/website/assets/img/pipeline.svg similarity index 92% rename from website/assets/img/docs/pipeline.svg rename to website/assets/img/pipeline.svg index 9c34636dc..1ff5923cb 100644 --- a/website/assets/img/docs/pipeline.svg +++ b/website/assets/img/pipeline.svg @@ -1,8 +1,8 @@ diff --git a/website/assets/img/showcase/displacy-ent.jpg b/website/assets/img/resources/displacy-ent.jpg similarity index 100% rename from website/assets/img/showcase/displacy-ent.jpg rename to website/assets/img/resources/displacy-ent.jpg diff --git a/website/assets/img/showcase/displacy.jpg b/website/assets/img/resources/displacy.jpg similarity index 100% rename from website/assets/img/showcase/displacy.jpg rename to website/assets/img/resources/displacy.jpg diff --git a/website/assets/img/resources/neuralcoref.jpg b/website/assets/img/resources/neuralcoref.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb8984919837c07cc75237b14bcc526c97b88595 GIT binary patch literal 31380 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

    ?^0&&W&AYiqER$B$^)L6Qz&Z zV~k1c&bSD>F?|})U4}vV*6?X8{|)f2$u#JHU5@xGF8^OQB;Id%{k0uoHVAn4(p{qG z3--*^{iCh#H@*bOS|iQBFW3cu5s^*)FskAt!gG_MswCwp+-nn=qDQlvw{DRBW)pCE z1Gop{)K`3W+00|!bbt5gy7JYR(ETVOimo$G!>^iq;&CQDj;Ga(;g~GT530JUoSRvX z6XqI(g8?=d=FfYzM(A^~23G^TImO(ns;!4N-GW2aIj}1@ErEi^Vmm0$Yk?Aa-^hs` z^;GelYhl`;bSTalx%POGm7T zehi=eB_dJ3=X^kT?Z}QSd_tcQRkgS#&0-a&Rt}ZQmm^tL*0Qd)-3)~^U-P5XGIOM` z0!uln9vJ(B6^t-Q-)NLTj^KG2Ypc)$-xWZFhHll8~*X;di{t^RpUvjp+?;K1W-ZC*s1nOyR7pq1Px-);M2Z&M_NtmAK4Ic7uEGZ&7J$aPb8zXifc zc1q9mesMCU{;t{)F)PxHe|B6oGZ00jj2{|3V_c3pYnPji0HoCo3Pa&+2w4M}euhEi zDk=)%PTzwbF#vfb5t>we2Uhe)AV`IjW?qTQYK zQX2B2Gs!xg8h1&vC~9?#YWo#Qzvp)Ba+3t(YzgLkCR`!)ex}}OCu(a5L zroF7`0@l{m;ZDZ0c&EvNuH=hD1xs2OVmim*#ECEsVNRb;z!WxR$M=v^l-{-{uC@D%a-TMevddql@{&i_DT$QZd^^W;#Cv z1}%r*b&xC8ZD1>FvF!0F5zh%Yy#X{#-T?9>6;>ieT`sOs=o=a?MhZZBLkcnLEo%eX z$i`-VW^;^BqUE!nOviP%s#Nb9wIL`*V%&%!=OKo3TJ*TfzI}NEL~!5Zv9smy(?%V{ z54evvvLw^o=6!`?_43pB++C}YvkV*wegRk?@;UHWDE5RFM5PXNq~m66q`OaOPI4?k z<}6_V{B;=PA!Va?LmU_h$wU*bQc6BnLY~8a5}Nkx^4?pJz>k@!#4E~ZjR?D-1k8&+ z15VGUq#X(TV{=A3%C`0EfM9}MRh%jfR!{o@w9 z8CpYYU^^-*3NtmhS13a&3kL=VNwtHv#7DayPzX@*M5Zmf?ufwV6@Rpt+h~6^5)1Fa z*;@M3VJHR6il834HlJBqc^D`w+jG)!(8VwWKb9Xin$Hx9#SpNYLzvE>c+vY)&n-^E z9|W~`K_~oK{Xqx{kE@V?Md9ng_yjHjsXGLJ=({;IT}@uqHti&lCfRT|229@@?3S3* zL)`d>e`7IY*4FPUn}sZxlVl-}lOTt{7WV%EB?KU+0R=3X`Zm4RJ#|5SQ8j^?=v*3i zc&JGdRSs5xyqBAlrEjlD=9fH}S?!W!%Y-=GWT16l{2AXe@b zkIPL4I=aa0Z2%U;rZ;ZShf94b?9BMc4s!`8|0(Aewsiqysi{vh0-cwGlw+q-Kk_#c z9Xd+?5RcDEV-JZPmKOIz<)ix`Hd#75>|*PxOx-UTOUC<(5rkPB0)d(`u#IrEdSD@F z^nbEL5{ZEkXLTg0fu_wso*^@y*w@n9tUrsng=P;qA5e&ycOAo9;BBe3TbpC?qG{SJ z5j4j*G&?s7tV%3OToyDWJ6p~Urr_48Jjc&P)NxU;;M0yPe%~cfNW=p{5t#2^6t-XD zaShe={$X42&KAGV$;6IX7$|A;#V}Ju{hMHT6va#+JA6l2tNGL`MD7ce!0%8$1va|q zQQUKCyePTt`Y;_=Rw0oyvaJ_mev;_0psTn`UshtYL6M%{!|nq3XmGp#qX@0o_Pf)A zu5Uy##vfSnDmHii3&i23Lj9GGaYL8sTsaUXE#X9QZ-5~QI-3H*JUBdZbUw(=2^NplNJWQ1XB|ETPH0$1n=beAZKhY72G%|k?-niW!Uv8B#o6)3D<_t!C1DLl7awIo( z+9Iy!UthT;I05%0dsxvqw8b)kNHRB(X&)5ew?ynt4Jl9+@D!oyAp~kcd<}$UEd8WK z%aF`&CwQ>kq149`@M=DT^E3@gGX#PMDS%Z&*D&8agi&=Wi9v!9@+IQFW=IToCd;p2 zp^Cldb@Y%rZaztJ0@hX(w+~5;y){v|fnnNJW%R#>UY zA?9zwL}L{z4Go5{QG_DUvg23*(QdwLw(qa0nfj|Y0CQ*Q;JK=^xBuvMS;1%-&6MsS z`$F{<3P#ku`oIVx^g_cAt;oy13L*c!ERVeB53jCNv>F(6Oa=Zzg0Tj3yK*pNBz#1` zAkM{+v@ECMJ*Nyy8(tjy=ulJS30Y`Kpg6*Hf6{tqTnoM`X9C5@$HXO>mE;3x+o~rp&mx-1nx`Qtf&X83&!}22aj+#hpPqkO% zE;qUDH@DWE+~af)E&;{)OZKL5Fk^@(KbH>XKf-cma)tG$ryyqXhxQe?=(0UG!SEWv zY_%%NC1d2NR@O9xGMAyy3;h>P0@jw5n&JE!p@Y`SxQ-aHn_uud{!2rtnPY5>5IHO{3cPMo znt*wvS_^@5A^4+l=bcfI+RbZmh+DDkaP_ZADNAvN@mzbvOMNr4mizKshIc~lQcOpV zeppd|pe2Q+>oC|-^J)Y3uO_VW_P2CDX=T{PenQ&WPsrYxcy>MfZGuah6)hmQYSXBL z+(ptmT2?x;wcPdRv-cr&%RXA`v(>TWrx)B(??s+k@5S#{oA?6fShwBxru9EH$25Ln zDz7<}ettGPQI$CMiJqDzfZF}?E7aA`NkD8UO5o1ft0jHmhV6d!^m(p4^Hxsd4KPuE zmz!rZHH&;$-+i+EjF8jkH5Fs^;EVqcdyb3TuP&2^Kjp`G{wS{3{Q*I>Roye4TWxY& zWIRlG9hCb0{Ocw)?YsLD3K9zbKdw?k05JZt6$~6mnFHeUXSOc|d#=#y{<--6ZrYQj zq*;NfQYCssm zkP?9)Dmk@TgGo|}BJ|wBfJ%sYC>ju4VahR+;AUFubhxT48kB$+b&l~bmZL&=ya6fj z*Zdwh(}(4|X@Ienj{9gM9pQ^JlY1%LeI8nw@E{p?`(AXmOmOd%nwXH{EhIW_!aDqC zjifI!o=^5_<0r(lZAK9+{b{Zf`*yQdJ4R}e%au72vTkvqC*hBPgFdV{z4Fs;&D zvAfTyCtjcC@81!*?#ONgg^KoOe(47dM01a#0&(XJMAPYf1<5j72mF}5y$4wQ!+lE9 zKO_W|%oVu(hoJ=H4qVw`d8*Q_+5A&6%!{Pk@&twOLP~_ky&brU!B`k#M4cCB~Hg`FuJwG8hnPao}-bfUxlY z)7V!>#qn(G&HyuLV6XuKfx%(0K?A|vT>^yQ?iwVxyF;+xmH@$nyA#|cK?awgAxMBc ze&^hK?mzdv^;Xqd)oWKv_3G|jyY~0(-GPo|TqGax)CR5arBuq$NaRQba$*2rluga# z%s>nh0%T=IAXJaS8kPhBpdkT$$mY^XA8dxF%ZTCX2LsX7%v>&qCi6smaR2}i00$f> zw!Uo8NM#zg4;&{Xn{O_KYj*QJ^1ti+3&4Sr6FJEN1|uivu6`q==cPnKcSf?x^;J80 z)>nDCYh~_(Jl4!6bhFW5AJMg@fDW&FNLg?K2FiZNWfsSOeC2*HTc#3d$v_$ci^Wwi zV2eSYFHRJx9C?!dyK}X3fE*k~*nkR>Dlw*E%d}wbDNy5n`CC=Vh%Chy__l(uUZ$rI za%Pdco0S%EwColTFyG^BKv>MUWgHG*;;3AUQ+cfVK@N`OX%C)!l~1mY(e`w1Vb01* z>?K9g3p+5A(^n@iYOUMYb$H%ca(GpfgocF0FZMhiGxuLLeBbJRn23r(RhE7LK&3~ zJH0(-uCAP^RjtEzZu)duck6bCq$W%~L!SsS07Ywv*ncQ1Je_vAz5+Y{av9kx(bBXrT>lErE2G>vY7gyP<6oK;ix6P9d-0cHnHRWG6^=?fd(L&*lHZI0%7D0 zxqse?a?3JmKV`a|uJOrf;o{4(@AFRJGKD4uAyvfdZmd!8VW0P%ia`qnGG`(H>*=Av zHodm1q&BqsLDWNQ;!x)xxSy+5RX`A(U{V3>QIv-NnK+JkcL;3Tv(eYH(ch@gOAmVf zQnql}K$qA5cUAS1s)GMpRiXb+f|~zURc8p7Csp-CK2odQJcq#keI*Ji zQr6T745%70>nI5{)>*!FDr)m=pIgXE@v?OB)FjZwKT$ASpSAr;0{#}K)10<6wA z_+B=wOprAX7OEyQYC_g5^b1tW>3)l#pQZj*3}KZ9W9u!sxZs=q9P*gO&+3-6Wyj&tV`SEz)JUN_E-R z@tfv5{p`BAAL(VsjiToNIFoCFzD*h5_&_LXl;S3TaQ3|I%DltzdjhE?f|I5N7DtJ> z3NUB@#;6XDM6yLNT5e0kZ2pQBKp7WxnPAndmD4HeG7ghW6 zb^*L!R#C0@On~U5APg}r2KZu1<#J zVCRlD2v^%b9XUTPi@qPy_R0T2dxA1Km~4yURd+GyRYCa8s(>x~d%Q#zFAO_F?m-}* z`*fg`AS<1`&+r@yDuPDB+~nJKsYH#E{O8cEehq=|-M>SuX!NF8(HGx}OKv|<^^UDC z9)KfW?uX2=3C@R(5@*@WVh}-p?j+V{d+0LwQnde)uEeiYH`pk8b5AW_onNS|^xXXo zmnTuWCw^E9NdF5GSMhzMw5D6{hg71h!U^5JUjt5sw~H&^3;Z7Z$}{Ku%A<6PEPusG zxL}0N3%VML%nDi^D-$bcA%X(qIi)tB+{Z?uqq9qA3){9Bz1omx(&6$WpMK+8K@Ll? zFavug_t0!G96XeMR(5LJsBWecC88&>NPCI}qPhN7ndJ`JR~TzNuC+3mYNW@L{l^^n zhhPXqd4f{^JNwSRzVS22KL$xq()2kD@dP?-iv5RR2x(uXm(FH74k!8JTuMY~Gi$ED zujLNwU6|(%(4r;(U>#ne<$8#*Y5sYtG|K7q!khW4^a~?Br`Pl8SAG^9M*ororH5Di z(oniYUY1QRjT<&jy`c?boXYwP7t`(1gg(OYf>0 zG+_8Y<;X0OxiGdjhTfn4^4vV-%w;0d`eF0R1ae?{)?hd#SJm13Ok5mS3IQX&9d0Y$R(q4!fGEgBX-Y-Wl&avcHLc8CI)u{9_)(6q13+1XvdXV2|`@0xu~FwB0#)C%)VjVi+L+gAx4LQ-#st1 zaD00)>6L&6!W}nGO>;Og1T@uW*!8eZ`J_ovsTXN=x|-N;YLl}GWHM`8zvG&KCpK`D z(=6(+2i{R1jznX;ae9$7R;=kPMu98}G~~{z{rcQ$Sma_3TlN;k2#(cZ{gVO?=NNqL zQ>O?h4eN)`2vtHfY>;Es^k0Alq(_5F*x`0<+HBR&o{+G3g8(XXFTHZ->Y8%3{&(8d zU@9$!i%d%?{#a6i37%*+4?CFidcq6-({ll_gw!CHczzbG8ikK}%ukH;zkn3+YW(A8 z)RJ@Qy({?utRGSHz@Qyc*XR3az1LVerA%QOIJO!kGA7&2B>v>MLE{4l@ES29-6+!! z4e4AV>)5fMy^UQdb~JQxgDHkxUOrb^dgW&{L3!yf#AjC03(?xJa|;fy3f4@ppuA8F zFAUmV4Rz&Bw}k#waO`r;uKwQ7X3}S+>;8rE-u?1UJJ|hX$H7o-lhJ%_@SdOD;WBJ! z@>2Dc%h9c>(id%@v_tw~mYYui&9Cy*3Tm-E;A?u-^}U2k3S6PCfC=8VfoF?kYMYKY z`ZaL6<}+}SB`DbdO%*$wFv)dlRppEw!E z4VU4t_B|6lOX>qkL`0;H@h3GM)?fsFe;}9`hr)XTw6{4l8-6!#74hsw_51x|KKzl6-tC^(3-8w==XBXx zOCQt<9;qX+KGVg!8tajponZ=tu}HA$g+HlZi#fMLMSsF-?_x&NMn2&9TUer%^&A{l zpA&mo?(QTg)A~zbdi9eALV3Sd8)|6~8Q=ly-Yl}UdtaY`Xq>wAH!B$nqDEovK7*Lm+9zh zXHi@YB26!pa7x{{+H~`Hm&!FnPLo<4+PYm8JN9h19yuMQWbLOnL5}to5lA8$%C)aw z1g3xSVB~!(<+&x=)_A^A@$pDJhNFcs|J-s&LE-jA$0C2SSREz9N!0c@XU>CBcI>)d zxm8%Z;ZBHzEo7uu%{DL}r}Hr&SMYHXI#^epmi4s}dpNcGzG3P)@iiTQwN=p^&kHtbUrCAXnS}TH+L?mq5E(T3X91IFK=w=iNmS%pG@U z%R9f>&nLS;ndj{=JG$0P<(H!xgiFu_6ulY6=GzM8ixSp%VzM6VSI%vkMuB zPCs#hJNrvr2hKy)++%5qm7Gv(AA~i>)W2pl($SUT7Qk>rJ42LF@@AZziDHnh4>8M) zjwDAL8Wb-3|ELATLF1^Z#Xp{Ir*@~iVIv_Zt0;c3+c;3Fw4_^!UK))Ml3$QG#sl1J zoa7&YMuVbB{AkfO4gzJ_O()^=@}$}T4jzea_;xp#mJgmkhV2NpH1J=1ac{jJZ`>_y zG9xH)@G8087&&gKj47w3vISOxz$5LT=AtoFcTmYzbm|^puQtN^sKz*%?COq759b?^ z^SgbFQin3M{@sd%xZCi=M09URQ`+Xn9W~ANI)Wg~PE({#b#B3F&3;H#wbmp4&sihY zY>K>?k^DYZj?Gj9>%+65)=|di87wi2bo<2xOrmkj7|-@yz#90aIMtYn0l>C*HeAp`|qn@kUnQwc1J^*|8fR32Q6n#SR3%8q@}|H3=SOLsxqv z?xm}l#YShRGi@4=R3se>?@njum7zBocv(uXjiaa_fzzU#o>sPlp7T&s%K}#ee{u2| z--|!xsP#;^yzK3jhN#PB^wQ9haT1B)vV91O)}q6kIpsU5fGLDHQUnKE(O05ulR%=; z>;W}1X;$nuqS}^$8EW}rX${sJvjBem7j0j#W3CNBq3wy*gnSY@sdEJ4EK#D+LNciw zUiOQth{VzuW8E)=n(hHl$UCzt*sJ9D z!fNPoCARWyu%Y}{&nF{*{^aN4VOzud`u7KYgJw%q&jgZOHFJ6OFndeTYTcfh!F>>{ zTjl1)V&5BTOY79O+ts;NpxxuziOhmk2VcXZ0W{N%e^6Ct6ttZ6-{-HqEO({AP_FN~ zXBN%Dd$wzT@rT6u^t?A$^56(svj{mbaYP=6>AJcR3uGub*EmNs72AMK{4_FN@z*Z{ z?@2_eBml7{YNzbo$0*xbH6U$G&;q97j6OFMvhor9Q6bwY;D*3SSh)1Q*~$DyG|%=V zXJ4R8n+YKumtDy2Gex|CbweVpF4hN|pyF5&gutT|O=!Vllk7Jno2Gm*Q3ai4ZVq}b zKlWMm63rU{q(S4qpCv`si#5L0`+EJvh-WzEsP~w7*dlOO|LCGhbhS;C-%Fp=gEKz@Nzo&! z3EFJ$RgZ);({@h247{tKd@Z6K+84WntRIk2r(oXt4Q*lWFI_$5<&O1hw|2DW`Hrgb zK^N17`~k;HY&BqpWk*WqZA03349Ch#*|mHGsY0?OB4n(1-*^~LUh>{&Y;=`2;$?MO zK6SU{C2h?9mm~V0IVJzI^7}VwsL`rBCit9|5>n6^Tvo1H{2C{IDS@Q3Z`ytMFdAau$w+*uqyU-hcZde&{ zX4lxQOsn?NQb#CBU6?+j!q`>(ZG5fQO4(Zx%Br|kVovrTPsxf9ye%GDGn31q+%#;D z_+Pa6pBR4ySoUz8WZFtd=>3ElNlI*=%9Ppzp+G2aCx>&x078kf2FJ!R z!;!=mN)a9h8GIsOE~tY7gV6>}xxV=wq6Qy~xJND5624Lg(gfigD{WKzCgY4NFe6f3 zhuOb=WZk66{_xgj%!c#Jd38vA+x=a0#>!oqa%L#uw^Bo}OPgK}F7rkhg#& zSyV2C%Fi@%U_v>JLzxgLU3qA|$#aY_d>B04_1myu9cDSibb_?Lo!?Bi&oX}{@SnhA zj@-5*9nvNRgBh0O?264GsPPB1aK;I&c`1cROFQ5I~ltHl{8v&|)PYT})G~NsW zLUbSPVAwiSuJj`+=^*^s5l{J0VOU%+KoiPPe&YIWbY0cXzu zTZQjnx=tM)x49G|Nb*3`3W@-XCJ>D^c*Wr^2g#}MCYGT)k{soYZo>dLY0l&0c-0NY zWc=}O->6etim=k}Swbu&glJC#`nlD1kzK%q?`lzCE*@EMi)6}pDTSc3?U&QMhh7@R zTW4zEyPbWs;wxS4^nVcPVjo(LRw`m8P+YMrx)44TrCs~KH3uo>Kop3%y19M2t$qO) z=J>nu#2nH_+3ojp{<0nauLkrdgoO9k^~_h9%;Va*$iuY!3;e1pFJAY%dqKb4;H0ea zxagW^TQ+Emls>6MC>#WmeS=>s;`bRt?95(RbU3$T4_^cyAt*$`^vt2PEmKE*JfOqqVYaZ;o^kd9 zM7CdCeA?O3{5D$bCGVJQTt|lipltaIa5g_sasg&Auqp<#9w-o4q}B>^CfJU!D}5h= z@|0`AiDC$y2Zw(GAfaxCyzaewH6!8TVeSl z+Yw-WUHy~tmy*BPT1H}4=@u(~IKvI{D_GP_XbXDYg%^=>ED;wR7qv7PMLHa76P}X! zRh5_lXNKm-DMLfza%XCJds{h=rQJK;s4|!d`7CP|jMd|Hv^B&NE75j=nBfNdIr58b z;xB!xuL9MJe*``XTZCtZlcaib3gf>TJ6Dk-Mc6S=U`R%}K#Qu=$s&)_T52tAGC~zw zYy`ebl2`=8kp>}xvG&xgD`t?OOZ{jAV2}CcUJ+Qu1g&IlYiB zFaHGmGveA?^{EWAL{3Cg9gIW6JEK%-YKK9F3+q|8uEa{)3{4R`Wg;%yr5?J*-9Mu-;GsE>g>nEx`- zSB2OONk6iVdpSwI%w|BYe<18&cc(T!6}~vKV>NrO_n{>vjyA2;n0Mu@&`dh;ZD=Bg z+vl3^$-h{2T+eLcm$Qu{l zQhc~oG>W3zYx$*|6WxvjnB)gBpVXPDBYf!@IkrRbB}!@clIPQ$zDQaJ%XeSriQXpr zaBK^*wUjb5mlWY#eH5AO+uZ)6=!c;g!xr*BIm@z$z)VzdDkV}y$#G0}m#6RuL;BK^ zvu?95d9k>Kq{t=oV|{G0cN%_Z$wF;LPOG@TXy1(y9$teZK6TET3uS#Y3Q928EwxF* zX}UN|M=hT8gP3B%M@Yjn#rAi5jesS!J!i>I+&;B^^RbmtSsl7f-lm%X?9I*JiFC`i zJZb9aiE7c9O6MGReiGpw^n%s@t&}OchJ~1#mvW_~@IyLV4D}7CeoS_F$KJ z=9q8V*lWg`85{-gxot7XfQb5>p9Lkm#ifp6_3o1LtWIg> z-Om;`UBKl>AW7ls;bW|PP8v1J@@R)JP$Ga&OlAc6NQH+-I9cW|$M`wxp=sp%R-T$p z@m#4ZgA;eh^&LLmjq1OM08jQ8+EWk`=F{IL{>A_QFVgUn{RM#`#FG9Y`){64{|8)y zG?LL|qX=Xnk)v7mD?aiZ`9{QWIkjXGNdi191DYL%G`u6>tExYEK_$-qOZRij?^W1? z2e+Acf+Fr0&g&{!3nk}?Xlty)8dn}4{2ksp{kaMt`63Vy@T*d9S6C@GcW{<3T-dAJ z*z_BEE?kj2Cm@afZqm>zUkkJ=>~*Oji?_FNtzUReO%5LaaKoIVANuIajMWDu9EIY_ zNGB3FyefmNb|nYHVk2pXzpF?!A9qlp0=Pnwru!i0r21|s9}mEqxS`)#+IVX8z|zRg z0J+N_Z$hJ!SU;!_I=G?e+RF3D3bYb*LHz%^4 zw(qdg$)lS#EFq1}Wwdm7FthMCIhttnvo4#FZT2R~F0YeENcN?l847c$BlI>CIv#Ox zL@3_)&iBa|U$_xW=V;j5sX_D;AR6*?KUfRI?2~m$uw!c-rDN{wE@mJys$o{__|eT= zHR-^{RbOzGMx$-oXHy<}O!IB!NMYZApQ73ijE8~iI{_?9mv^f30Kf~jvno0?!%suboZCkLV)4!p>p`hHRyI~xk;;WyT@kIdv3A+a z4R&dN*HQz=&VS=27(XP!KijA$NxI^EXgzhN4DG*I7uh_^l4N4lD?%$w6dT70114$! za{%Ltbo!zwOYsL-CCFyxgR-!vmyWI$1rR!&NVjW_>Ut2UgENA!DGnr?2(`wJ1O%=W z6YNCd_$F#pEx}N_PKcm{I;7N}yUCNqzkYU;7w}bsRBDY4zxBU6v)i&_?3L>e=KRD~ z9oXo9bu{=Bof-ge2H;6 zF=^j2!njp(zGv?<#|ZV|#>I$c)mF=SUZVjW;xE8YaA;_D;`5?x!u9N_f!j|JI9TzK zCNO>WYb<&wW(V@t8YBaKtQYxWBs4uDZ_#=C*u(<}i=AXUxv0NtSLP`O?Dt%CIjqM^ zt>69y_|J!Hk{m3557^;kHCyp@wZC_a0PP(DBwzP?^CF~FVKwdYic>j5 zEYubSPm?=+Z}mu_Fsj$foP47OlQ}aG;X8f8L!1mWH{^*+NpXi@i0yF;wCxQrL$K{G zcgo9cpBwl6Hfjf3u`n6m7A<$#B`4>a(Oul71>E}(D0F*^Lo=^HCD>{W5D zn#WOaUE!eHNGf7|t=`};s3N*D&%A4>I(M7<+2CJ=^7#iiKAWkOxyjg}X;f74&fb^y z`;ik&VAi_`MjFfsd`9mA6WANA<`&J?h4@NUopJ~D5Zl)rFSx!A=%+Fc_A;BM>L+ZZBn(xt8Tj-Xv$H-VTj6`3Jk3O}aS3jk?_-M;^<&bq^KQD> zcBee`K|7g|#(t32r-PwZj%JQ@A#Xj)tfDZ~U0;lPqrt>s7t_I; z=f>rqTGG0GIfFtg>w>wi3%Y@ftY&Z;x&zk*ZMObeNIobZQkECxzgS_y$WVB~I?-Gi z`USnmYj>9up=21uEI#x2Jg0ip*1FW?EArsIi&F=qxe7Xo=_04^?i@aAz7q7~z@g6B zmVkdR?FX4TkhUOL%{3jmkiL-57R21J(eJ@2xKYT(qvS?+C)GY)^KmCaW ziq2<|;qdJftzK+K3a301xuSnHj;F<)PDy}+V$3>=bg3=yWBZ$F5&uYmd@~bHzJb%d zl!G77zko?cp~oa+B!{6~@+1eBEoZVr!h_+!_ek%C#}DzJ=xicA{4`9X3M`QtGhUW2 zo_sfQAS9uq>6wvUBPJmtPU*Ja(Udt*o5pNk^|Hfv^CShw(v*_M>T3KYKs4+@Hnqf! z0A;n%cxSpSD+a8TPxoSNX;49e-QaL|Jx1!~vYJ=M<{JC5D%q)SDFZtIRE+2nKSp@J8Ry0 z^JYy|FZI^9zpd)tDyg-Wwj zX(G3mF-(v?Xu%CUMapjL(NbkB#hy{=6-;gfZUoKOo)lKmc9qfmXnK^5s&cK|C~9NG zr<1-@_r4|FTXxvjr>{(7a2rzBeXK(%jLWXk{qd}zSzYCQ&r_==0kJ8l-RV;ezps90 z(D<+q!xJB$kfYLlnjGBX<(Dg#+@X=(qktsd!#`i^)~i4D;IH{}!RHf%*N=`B{h^L6 zZzun=`TTy~x|)aD&SNt6qs}FZi?|+*Z2C+N9UB`dtf*o1LNhxf?pY5_GXsve(a#8%3}@ z-jx+2BQgrs(3#Q#t(BT4?B9D8+{=e2iht%BF0UbyXG)glKl=$wz>X`crgnP&lu}HJ zZ?SOlV2`3%$0@J!?cA&}(awXU-!lYenMWo5hu%W71w5vaO^34|^MH>wLhz>zK>ZJG1mvTUd^8bIn7^6`DDpr4 zIIX4rd797i`X4`FpjDPvb&t0O{ku>8=Q05VDs+PIHOdLN$v!~r0mV}mqhHUp*xtUidcwXROjZ?kLYG8Mz^+Czv+(yNTbrEMC<-op*rPp@St@sD}{`@0_K z6#OiX7MpJW_`XWDr)816@jvmwe+4l!e`sO=@eIOJt2Y-VsTliZs;on@J-EpylG6vB z(;HN&p!V@Zca&e$Po*<+^n8=6DDtN659{`Hz~AsbY*B(hIA{Np(h=OY!!-7Mj&NED zWK^>RzEP4P=`z%S!FJ_%;)S zFO)iRAvL8qw#}$I*sa*L&JVKSzw`ao&h30Jz{0$F&0pi(W7r?CyD6sUwB2P%I9zag z0d-<%{*rdJSKd*ZDiU???#0^Mc0_=a2jITd7;*A_ZnLq47u2y;J(+gO?Z0%kL2Rk% zLdt&FoXQRVa5(#iKOq4Spb%i75D@?PLm(dxhd@C^!@z_@M_ zc6WF&so1%(1EbhQsum0DGoySOs*Q8ZymyJKd1rQQfvw1a!x$=|D4y4v%uf|;GFj(u z-?M%mr-v>5CA>Z)4mDU12}55Cv(C{svSr;rssv+=tw=Jt(ioWh6nJR?(XPM<)U-ZLjN_%xcG22F}IsztH4r1yx~=v9f?SD`aFR7XmtFwibK!9Ry6 zb7lObK=3_2C3JrSp$-!q7Ahth?IRTQmy*{bP3>0*UUFE_AzkjP&k--oYZmZPV_3&3 zCS5PfO(Gc~o2sGKDS==Mk@vjDNJ9BYRBHMn&f9UuoHh<~DjWL@msWixrB&XS zxuP8Q{S)Avf~n(39EO5%UhWbbrZk5F&k}!Pqt4+1;`|Ep9)0gm@dE|$-DCS%8P%kP zG+46nEk)h-)WuNEFH9=Y%t< z*Fy+ivFF?~X~jb*UvZEeu;s*4Y0%w=x)-8BDIcTptaKwk$#Ez%9LzkkvLpu$XPy!_ zs7`RPpn~80vgaing+64?%H0Umu4>G*USb?}wEwJpKs+l)tp-ntzJwbo(46f|5Od}l z98DubQP!C0ZJgeiDy@nJYdblgJ8n&!N~l6Ut6Y+qC45$rs)`eUKQi$vwVw`AGgQ6J~JylPd24|}^|CmHhv_kWQ zg_WrsmyBkr9Osm6LvACh;i)AWuPMv8rzY&TShUhsNrekf?&5y>GhOl|3p4)IG&uLh zdx$W>8U_qODQcuTvgRl<%qJ zIuA^O3yxhTuBl6(*K`XAdo~MIXhhIr+lCh zR&}YHva~RtrrL^D)_8Y;t<^OOWwBG^v&li5IjdFoLcB{Q6LNkj|%#Yp_$KettFZn$OjC-KC?@CnRsz)jqgMaprVYYZ3lz~2c@@?r>kYsdAvZbHpC^M)D1 zM^f~Wn2Ncw;rYdwvXOL1;w2j|b#q0^O8&%lR0(lvJ+(aX`d0ye6@}-*SinfN*5;n! zGlC$X-?!ok$dk>G8>1^<|EvjB-yDDRU%lLjSc@naa&DEyA9li?F_m{pGDsb-DQ7hio zUjt4tu$??_gg*4eu`2W$j53WR0ab#V3zRQ$Bm$MLl2L19SuV4)w&LF@e;OoHjE5G_ z@AELS%PyCbJ(N@L>X_a&N4&9kFG_0bcG^y9n@06md&G{$suA)$M}3X%Gopx?DlaGw z!zKg;Axzp;uRwt*vI0Zy9qU8bZ-7u_aGPLleC&taaGtVF=#zFL8ICM&;V(C`ooO?9 zl!cU&E4_&r6PGmX48wP6O>pE5+q%g1Klu&tnJqK$GzjyGowrzG(PGqJoyRVL901p9(wo#fIIHI`w2Zy?(`q6<>Foyz$84TEa})vd3D&1-FnoQf*Z> zIf)MYS1L;>3x%wh8pj<{Ta}}#f%j(UL-mU%&r6H(<$0aX*LBIX15?Xz``#z)eaRe6 z2P>D(pL##z9lXZ8s9LuURqV!u)?bhgRhWPdDFJO_P6R!1S9QRFJP)XTNL;0;GY&$+ zV60VcoZo;rH|W)Spn#|#4bq8qog|T0{B^;H$DKX`2^D0($Cwoy6awnwfPwi4CH}+_ zC;(J65>gfjRuPqCbTUD zGjrF%o!!5q3>YCWs*H1Ps>?p1K$w@S&P-MFG`4CN(M;6EF%=aRvTA1$c;)P&)^9h^ zP3i?HWhFKgw!WM-W^-4~+jlXh{Gplj-^fBD_LeJ?hvejK^Wz%J=*IBWrKE387*N@n zd~`=all)9v`6LL$EhuCPa&z^LmB8oNr0A8BFMqJWAJD*oCu(HqmrmKYon(_&BL6h) z3sO}G`pPhkv7gvk-eYFs=J3*hKMK-79|z!SiAJ&8!pT{$%)fmZ#g+lC;~$-xZMcD$ zI)wU|+pVHiJ9M1mhhd6u)ZsQ>Bbo)88)u^hJ1fHUaZ`bBe~4b(S`T^eF7V@+tC6M* zfm%D~t!(fefhm`6jyn-QlW5xDoF4U%<^4GAE_gy(H|l|svIjU>SM`6}FJB6*TnZ(a zqQ6n#gjMsCN}1E8O?3!buOrC#>UxyqXU`3PIEO^O8TbU=c8j0}>N8;Gxr@oI7;jst z6#!c#8s-r!#^?*Vw~$q|YURG*;l#P>WDl(+3w>-HmPrC3Aiyt?K^n!ZeZOx>4xF5n z;m*_^#gUXUvEWPK`%HxceMo$s&Vs&-PL>G4^tR%&Zs&O7 ziB{N!%cL@e7oMo-S+8mdvtiYt6u2sU8&@kS@&;%>a$T8-^@MJ zpWM484~2zfVk-5TB+4)od8jffS&SQh7|J00Fh?Glb#oLLyB$aK>XO1}&#+*cR!?v3 zs|1ZTMrMKg76nrGo4`|mx0HW`g@4oxkfPPbh?<8~?_$Ixfo1xyre^xl3Ug3K*ez%%`W%==mb(CB& z;uyO^Q{09uw^k!sHe*SoaS?*ft$s)|Px4N|!2AuFuHv$aLrU^sxz4BJFb+L1DIcI_d?{K;if=*>PF3ZJ^^Of!l6?(h*DiFnDUnLE&oG_8>29C78(lJ| z^ynmWIwCjJ7M`V|e44b}ZX%;&E4|;{Uu{H4QEIk{0vF9)0MAceCLUwL#ImCeGFq6tD3t(hoXFR7qV>|jRDz15x zaY9~UM0`vbV?)hf=prNSjis3bBB=v1T~Xv~MnXEtUcom(gvZL5nWM+IE`4WP2MDMg}ZDF&Xpx5}L)4Sl8C&HP+tTy^Y} z@I?UWpyF6boTjL}qBIJUBSCDQdTO|_lV>KmycHLia{P>meQF5Hp>1|d8yA`_`$MYi zfXa6ajSIHEcNqk3fZi}SakF|{;Vx1g)!011b=Oefu#%Wdm5sF0 zro-VTXzR5*kMN}*fO%Ie&dfo92U=&+n7*so%9^lB-%KR1Ic_$rLxvUDSmmb**fQVa zC@_2)Z}{FvKuRD)=PisxzBUea-pg7Wia~ofprTrhV+X6Hs>ECxY8tyAm8(5r4#sWx z>K-m}mnEe$pE9NFU&ssVL{nH)Si(G`F?WxGn9{<>z4&=Y?x({OtZmq*w>G5(K}>J9EM zB@;E!3%X>T7Hs+~KsdlE6&_OHMvgpJshr87Af3MQaF%qh4F*2WAb~muxm8(@HPV$+ zKKN}9nQnx(YtW+zH<)ySTEy=lHX)er0gF41^lr3{n{Al=o&@NfkgKywCZw{Ci%Ng4 zgxe?!kg<(KzaA^cVk|ZE593ea2R>gtsXMWzbXef9iC;9tEF(<7DUq`;UaK$4AjlG+ zXO))_ku@ba)o++WyP@0I+iojy5KRm0n*&G=kgzJ(cd5TL4lWD_mr_o_l8%~hGYq5* zbzL>zvx;z+`lqne9E{=B#|X5LMQcuOH0&Q;Whvk(b`+hgG@PLGbdGDoOAywW3#!R> zUh7(Wu-{rjj`hAgm~xvnlBaT@9F7q~$QCALnN5Ha9V3;Y!Gw?rYPonSyWT_p25dfV zi-w^`uJiXeIO9^tA=={|TeK1@$oH}0>_PF&Saj(yx)N@!x1vHD`W+h<@_>Mna5}M7 z43v6a_V{N)Ap>k@b%+P_YFs{sN!$e4o_)snTAft;c!IDin zt)8ym5~l6M-9Cj`^4(`-RXc8soe~Bd!Vh&EOs>{#Wj@t~2O?wGpRrc9Iv0)@<8PgA zfj{OO3xFjkR3xCNB%JQcL(bc_vYl2E5&}*Sd>oddlux9EM)BjMhmb?r<(S zLkJu2*SyPKQy%ZZse_48qI!-M4mzT@SAy9QYQiv}K!VdgK5WiNlTltf3f^y^A|TOF z0d0|;qK;EwZCD>;$CoOfQ`$=1Yd0(I6#t1b1vgzkZEzb}_(1FtifV>nQ%L_vW{q)8XhzFwkzC*L@!7c`>!V6-llohi-g<1HCGn zwJ95CuwwaUc}f2801SM^e6xJ<^K%L4aI|OYs6Xp?9r=&XI@1)MyoZQ@Gu5()@E=38 z-v2?Y`%lq-Mfh{! zzs>$ass7^rP54vTzlks2U*l-f)`wnQ6nlR#?L~P!Tz|q>t80t?wVUI+b-8=-{2M@x zX-T3X++k^!q9J8t>Vj`uKYYUn89 zqNNKqF4K2MIX`V9^b{;j>H(PtXM3&GGei=PZB(BLiEmShN;x$Cm;F$zE^?}DcnsS~ zZsP;tIoC2gnd8IEX%;$+D0vNFDd(*;wESn0@IFQ6GxRZmDePobW-Ektu z(XAKih8x#1LfoNitiiXf(o%#5`)(#tvcYDwwe0B_mYgbPW}ZX*-xs|-V>54tR|#2C zA1wkJq%^X+B*ymf>U|laY*w-B5gT|^)i@o#wIQlKngWXtKvL&8cfu@MH^wg=y-UkI z5*mlc;A3hhnjlE*T@ycw?`LB)phPIem(-?daN>4obEH0L+d3fsS>J)#j%6}K_;m%5 z#=?25yo2p)*5ceuKSG+i#a0_S22V+nB=h)jt|1dATxHA#)Wr~l7Ph1wdFifjb$0T7 z%E(qI^;{#3suJsDbv1N5t=3J~ZvfIbg$|AZj;Dn?Ny_Il+5wb>#_2}*hQa3R6NU5{ z{zP%sMH#;Ab3d0LKZZygwsNU)-xFwKq=(RJEvD?&GPM|nYUr^ElZV|-Pkw!Uoc2dQ znh+O^;g5}TPKo%-D1?|L-xn$m~+CKa~2)? zX=hY*Tlde8KU+W1hHPN)Mc5GEm=Dc@nsSl&;hzbO$K6g0SSuAo5nLkIs z79D_B0;|>aT_-~>hU_0rEV=aRw@h6(LfjtrOumwgZ@-~L9h=Enj3+YhOj}I&XEdI$ z2s!df=65!BHb}L*pD=G9*ZEKQxAA)MxDkCtG}t#cm1W*wV?)(z-uhF0 z@Eo6_etFye24GxWExpt2>{PvK4Gd`gstXURyEZ~XFxu@U#Qi$t&;NfX@3|8yO+YAP z0wl%1SiK)sx-TfkhmU2;p?A_fFvh}SIgLFP+-jo8``40v{=ukr>qdhxh((gZjS`7w z%uhIamO8`oi_{&XVwbtN8E4l0G|qm>X?g3pweoWDhFg2b7t;(wU7rf~JVpH$_8aM7 zw-nwM7#xStMSCZEca36mp!}c`tr*Z+bU_A{R(4?wt@rdByx0CjT-*%0H7;#9tIl|Z zjdEqd=}p{79>2Svq)5?x$wHC}2d)!!l#WrbRSfNB5e~qiE-qp@flC!DQEa#~s!vyZ zP16IyX&~XkMG7Z`t-3{e0eTF8N;-qQ8+6t3JW>@GZ6W+BcgPXr$|K!ast03wDht!n zVOFGJk;}i>aNt~dcYRR9Dk%CcyKW<>EZ1se$Sbfb8C6i|gR<08BtacdG#i=uz*GC9 z+TFy4tQ4^Td@ej4JNcY;qqt*rNsFzrBr9s=Xn@?}psTbJGY&oaU=PULFO#vF!0}nV z<-%o7uB$)a&|I0dwaE^h3zehsW7<$IeF)yIT8tgsZloep7?pI0K+XnKj`2IO9swpP z8>5BQ@+YdrI0Nc~SQWQ!*I^E5W6+!iVM6WUi+=4s3)l>MZlar8~>ouYjNx76X&zBscFS?-?AHu=WtI&KP? z5H`kW+Wq9ql+&wbuw8pa@kwWmjU&tgc1@x&g;MUC<09jTs^iilj&ED_7eceBSZT~V zIT>n{kDHE8QMQ^TR?e5TWAxGu2GaU5jVE$#bFI|YiPebrj^n&-hS;@ALYmYz5PTSm zPPDvp@XL0Lk}{lIxzyIN5x)U;CgofmPpu0rU*&SCZ8*9gs+F|AIdtQ)($nK{uQow6 z45~L8{Opc7#}*%rN2X@O>^cw)EWI}?s<=#Hg+6u4+3Zi|`eIWp>xTJbFJTA+-?d;T zeq1I_y~(~<>L44>t$hfBG2a*+wqNDDe1q#SvFTppdNcu^M7ETBkIDFXTjorO$Md

    j(QfNd5o$G!LVEHru@D(XcxC4<6e}kbBU4Kv&gndRRSVf zx^KM*B2-+CUO)7-Zky_=x{bT^$I=cJp55?*vHqP**L)9HYM>Qc3e9yzUxDqRt zf(-wzgZ*g_6#kiPIKu67w?!!E%18h(vQ7JBl8{I#T&8_!adrmBGk z>*}E8!1pLzjvbtw%1E3GMpoJlKyFhnHO)M#_YdCgvyf>2QjV#1B9r%)smyO@#kco+ zYOC3{er&NymM#@%(;NaB!*=Bzor$e%n+UN9x5H&k_O^bUA79*y4_3Ijle@2!!@C=g z!vT>5Vymrx=pQQ9Rf<$J?{t^`Rid+Aw)cWRSg%S}dc)4)KPmsP{`+EaRdCVgPYr(L z#!SV-J6ebw@R`)|#%dGPJn||N6_wt@`m3%7>-g#Rd`=TI&v68ydgMUKSS8j0?k|bF zeX5elKw&B5v;IT!O7ZNb(bvxcQGCwz{0c)QB?+t{W z8co*p%+In@c~G3muyDTe`b{V&lP-5H>Rtv#<4h+VBT~|YJhnKE>8th^tSJ_LE)XM< z8dotzQG#M=3j;D}^9#iqD0I%9YnLbu6Y0!&+w^@FXrcy^h0=^{n9rJ!-(1fRUw;7K zF9f*W_JaK%OatU7w=7o<%4nYZTA|){jNW+$IT}+l;G-qKB!W7zjkSYA@Gq-+d zO^7L?g}@-;tS8x5_}cS;ISpl_niTZ}rg*Vyp{zTyR~Hpq7lIh7^0I|qXyOa#eMura zM8r!&0<&1(=|kH1>fM^+5+FH>>KpWETejNh!K=&rS>OZ7f_CMkioi^sa)jKk|k2?33X1yzc640@?a8yQj-D6&@ZQ zp^pq6*NXEEf8vsqrKcr4A+iS<)sf5$Vb=R~zbwwupfNxyLs<7bp!M50PLsvOhl)>Po>V3Si<{aNZ4!$p9-N${cqk$2Qr1tj#YX3|{gbe@W)*V$pc}0= zX2Oa9rgVM0T)6C2VbU|69dhkB{TlM{X>CtYDTJ)HUw_?_ch8CUOETtKNNEYare_&fQI3-dIiME9b;e>W@?bq``Nsk9YU9$RL0}E6yOm!9LcY z{aFP7fsed8Xw~rWK|Ls=De`cMfD#V8+>82QX z0C{Y&W?bBV!`(_kB!HDpxWjF6e^}&fjDsw~Y#u=c?RdqCZOyHk7;O@DNQDnPPz8lW z3%XMM4HzZB>;60{47zLV0mX<|SOF#hj*9LP4w6IHZvoD%NOT9DDM}C)cs;Yl^KyuE zpZ!*p*X#Be=l*^h{yZ&o!o!sThA_wwP+tUJ{4MV>!aPXgXA1De6sHU*s3vaic`aLV zo^#P`yzOCuJC23=L!VVn7JsTp$onVJYF@M3L!6VJ*-`pT>S=gPyQR9d*lrvrZ}YM$ibcB$KshO4}1 z!7_>tied`huC+x;MW=zh2xAv6Qh?P0`dlv#Hp|cs?vR#o^lhdE-q(fMYUGtmKRb{A zNuG#$|4C}1+G5+Az>sLC^H+T2&phfw96_oK@Af?Q<|#Nqr3C-3(p`j97hi|L1zacz z;n{pAMxX-tWFpA^4E7wHED8gWFhUq>CPPBJTFgVsBW-X23!|8*IIx*BY>7>s+hW}?Cx?H{9u zs%rk}MS{ja5t6IF$@PUZwRqQsxdkg22gEqvMOa>YR8|Ey8~JzwAy`pnk%uki-i%3! zW#@q|1=c@JsBfPL2I0`D7d;skgd5@PKtAa+0x_hVV>b<&J_^t;ATkZAFV?~EwZtUNi+*BHJu!knKO z6Igk$nRHsKCXIs_to9V0W<`0~*l!H;NY2Yo*vH!3{i`X%AosOFlwBb$GAPIr_SsE? z3F`~l6cc6hlR@MNNO7dEGjY^l4lTKNExyCoMZBir?7!oDiL* zL@5MSWl&>kIv2^>Aue8BKJhYG+OT+(Tnh~Bm|&R4G}{iUJs1P4KR6qh%!1~yl#jP{ zp{{0^Hwic-=*csLdlPMEF#8baXYev85j`6S3>mP5!i0)nhn8R`FohKT_cm;mwE(^- znZ!QK5aTZ&^Km{FboAgQW#Ag}57Ukii$h?$hR*vxz6FVFwu?*Bgc`%NYG+!9gs7gG zf?TWst=Caq(G#bZahuDhW|~Y9q^nW6P!f1Dp$SI z$h7+=-+Uq08om&+Y||ui8QgY!w8BpeOCwXaC)znEL$_0L_9aP9<*xQJW*V4Bi<86D zHiBTKLFsq?jrX#jwb?fE4S1ZRqC|UyLpHk$q4VZqo5J~Gda4&IM@7lYiLGM8uVTkk}S9t{|ydD8y1<7=?)*gwF^i6PN)TiDYQ8 zQkr<^l$qAK6(#1bD63!f+2(+QIroXhfo?!jNEDcRI1YFb72uH<@+Z|Yv8BiekiL+~ z*=TgjL}+=CFQF?2oT{(IPLX7ah|kRrl?0Zziy75ceT2x zTbhwkA54E~Cv9)L$>md&KJL=37L%VsVW+!J6IA*o>G=Hc{FJO#<1#_N0W1Xa7v_G4 zWmL0QrT$6;-MpVxn8?Vj2fYr+&iYu*`BCZPU#{@Cl=^kOg+kZ=($x zZ10b5*K&Ja9{1wgKM86!3Wf%0=kp$_lwi-m1T*OlWg)u;ExMdC>NGwlilLL+a5br; z1=Hx3Q=7w^C?IDayO7SvZm4whL#`fClhK2pNn#+Y$;plpKTt7>>Id1VgRh3ln&bmY zk|UGSS?^CFkELP0^tW)cdHdse8Hw8=B`BcLtY8n+>b4eAOrfc8_;$@Fb5&ANvfE@#Cd=>)VJO3qu)mnXS3ao-kPPuzI&u^tl31j~)pN=ayYF)a zWwm#(xKr*H*nCp8Tg9LV0w1)(J_~ zqFzIn8&q2Y`|P3}wdP$8!NTN#= zMIQLK57Te)Bi88d`qCdonrojA$4%lPkX27c25Oz>AVuajm}TOwJ6oUz`i_(^oa2ANZQ$0KisgxfF6E$jIW_|-JSfBRp2?s3(Go)(}lnqxfK zwAUtq1dXCvj?@7wl;~^OdLFz4X_zsEIJPM45tvh0Y|f~*A%xqel`25iELY(S^{C^Z zWE0-4^n3G+Z}66*eF#Y8=%8bRT9zn%-e!)(a(K7~rkG5jp;J&${83t!FxLPF*Fj>l zxa%e$S?0MrU70g+JG87P0~f z7tP%+GxSCYrIna8X>qUM@epBJxry%uu8G+F?8sap!=4KPyrYHo)zuj*O$E8+O3rCV zRekznSZ-CL`Xgtpu$p(;!LiIDtu_>26iMV*@QV{lS7pe5TBfne?K}`Sl@cEdbHQWF zq#q6|_U%T%kv8X_?feE16`JOt$*7XTgQnz9L*}+3aErgenDu`4QIgrSOgNpN>mig6 z&Oct13Piaedaju#mmJ(p8TN91{QK-l;42m`A9@|uY4NoiWDXmt8Y0TC6MpFaapFYI!^Z7dUDuYU$UA$d zt#i7n$I>S_ve}bks~+=+jG6b0+mrWUJ~#X-g>sn^*O(pA{!Fh8Oi`QQWbzf|EWojD%mlY$QUBE9rgJ}LuhOX4wtp7cTImRd8{_CEQyWzRfzv6N)#T|l7Z4>I{-6~ za{w_|Z;_}0F>~V#02#srbc2xtxS_V-mA6r27FEt~Q19S@!9*p%^H9D+;4@7h{5twa z7q$!|4%>B~fo})>zV==&L(rs&@SSSK-gqiTUp}naGbWD)*A7!zB8|eowLaN5GS^KD zLdQ686#WW4wVRb0yPB_=zy^wf%j$%xBPLdWWx|Ys|CbtIO2Vy;;vOyw^5qA5LR=~7 zCWf*MEE!GhukbuOjCm|WC0b`cOX#_QI9EfQ!bx4o7)WqWAMA?982I_hKbp9NsBp=Z35MUpb77qfE0%`>UMVCt+)KU6Yl{zhs!EZg9$!v44Oj|s)nTCc6F(oXWDbXI4|!}_eLNLqTC z+bBtVRzh#JVsgt_T}mG@XG0Cu3W~MJZ9a1x46))FhF0%)DFUb$xud2fsDnAb$C)&+ zJLb%mfN;LavyrRKrsvMzfWl@;cf+3bOX(Tl@W;5|Yw#hdQN-egl+ce)Q&11>BmHd{ zCvn|YuPJ$JH@~R(?gcv#?Wu3fNfj=6^A;wy?|ad?@O@qKNERrjjQi}XuH9aKz95%7Th+hS!*6jTgIG;|VnVrEtmWKs$i zHeo1oQRkq4tlS3yfd+k_hjRrcF;u?AmK4XzzLutBP^2)(%1IC`VOHpJ`ZB#73sh2o zXQCC9C^|jgD=wk>W#T619+rM70rn{U1~BY?55erlZrL8HgJke#vFnRAgx9??{eOTl zx_74Ei!ghzTaNxPeOc`0q77sIF#ick{tNs!<{!{+)~K!DQe3jgaU8F7O;4|;rOazG zym^toyja|7pBYx%!me#9OyM!+=Mclb1u1V2+(d-jd0qyZ<5h+Wx*U6U`xiugaiD^s z7_Ke{ZArP{n->hr{+;B%N)-Xs_dIU!MfH_%s9k{Jef4?uw|j!s;#V`gx14a?8>RHv@@)7q$KD zPyOqs##Bf4GU+d>oLIHFjlThj1(wAWD387YWiR`YP5N<9t+^^Yetk|Ud3B>#dH-ouE9$y z=R=~#F3I=x;zoAZ5;%*c=3uBGlz2TqGMD?(0$RIH~yFkIP#Y+t3FX z_e9=T&o^XAgto}_+rx@+H`Et4YI5y@dGmCf4ECwr=pN;dt(SoKzSHzuUSvO)U&O<) zeWIc0a~%eGzqD_de@)Xa-5jOhD(Ju}&OMb9TLHOoV{VO5mhRp5%gOeg%DE=Mq6< zCBiQ}5%qEpzy4xoeiP;j`KA_CY<#9eI1GvuE4u6CHwN``pWwktH4#Y7Q9YUoi^}Zr z8Z<5(1W&I@cRs2rxHnk$wc}@{OYk-Eco!8yIOy(WRws%4+z9J>xu4`_?BC4o)iqZ= z9%#t`*ZpVCePRbmd{e0!3CYE)Iuv3iz{1vvx~~S050z|se6LRG)E*irVPwxzM!tot z`2(lz_UfE~9kMkJS~`#_t^Q;C2IbYm9$`Y?lH;TD8gycSsr5cP-3E)9cnE?b1P z5YGzT5YPP0KbZ_`uI;}l?vMWfKD2)c$4FghmGWUt=E3G@u(ybc=~#EQ*)`wkEP}rn z8H&Vox)8X@^s92jb_ZkND@>Q-#B`f`el*rA|InrY6Z$B7w^lo-0d z1X6t0&>)UfIw#E5&a<2r_sx!1?JP5R52bT3Z0kGv^Dx0->+L}cl7^g_&&rHyY3uYt zhm>9F0pR$FO&NW7CWU+v%|juUh2=a<#$Hp-6=yv8w0PE*j`;%Wq`E;)uVgn z?8B1^cPD}4t4UJ&DuEN=3VkS*mPf2Z9{anRi{bYWxfq_Wjr_|>+P$mNCKSsry$yzQ zRcF_*8t}zPx;8trqxGS0WOm!GmLL9ZZ07rFQ@iQ?z4hA?PIWL7`6!e1_k8g%+JSEd z(@-ZKU7)8#5}?(byb1y)bqQ6r2(lr| zq+=e}P0%^74}U{T@8V=BLsw8rD~GSR*&kS5MOPBM{~NGe1DH25lA21h(sXUrurg1L zPFUrcF-X%3EGgPwg3vM0)Rb$KRjuw|5?#Hk<9eu7C~5V$?4B5N#TY9qbFcDXPBY!7 zOHx13$dkPAFv2KE5xaW1Hc&af{J4`OzCQ+H6dVOUc(5$}Tg5g0>!>=FkBgM|7=T>RJSdk7Q^NYszGn1w@x zn3)XD9r$dLq%W+_VT#CO{W$*vB&i5J)`!DQ zMg?xZ9g~fc6#Rz;{fG7M(0{@TWV(`#JMqGeq}BSl>-m7M7{?LE1vdlN)rv@^I1t;9 zuek2~fkQ5o*j@9&lqo)}H1uD79^Ofrh@4eu_hhBa5gZykB59G@i=0SAq~e3~)EYX! z_HIa1-vN$^+bTTV_H5vX&y4jRXJFGHrNtGzZ~ySo++37q+*j&NE}@vde*{Z-T6?`D z$}JS8GGM~L1ofD|p8iF(rO;Eb3K$=Ng&~6;KkRn#_OG1PKP<3)P;ng&-ZebLBd4jC6skyb zGb_v8+vu7y!p56Dvt6VhG7%HAbQi}LqM4d{U^wr7IUhHcFLe%4I!N8$f;MoJ+ihDU}?e6`Zf(GfMq&Z`OCy zjqwW0z|$m~wOhH7%IrtQT8}q5!|EKdMT+ngFE8@sYr{1wO}Pb>6NaI>w*n12msK$_ zMe5|mp4tGdP)eb@e$i^1PK7{eNxkx|VH(2Z?ZWOwUmfn36b&aMOpP6wF~>yS6WkM` z<8gbOdLz|J^skDMH>ZL54I3%#1I5FL6oq0L$_X31{*|HJN66MCWxoL`*p z3>?S=<=<>;>evtR7Fdl%i!xSXhP)IgBb7?jVJO907i(l_LsU&8H5M-3q(V5_%Z($X zU6=%KM^$60N$byAxRae&WccQ@(UBAt9*P~LnM?|P4n}L{E!x?@V^Ea^rX9}-8d!zY z8Ig7hl(l#AVSe|0r8jioN|_RW$4qPlQFZIy3Pd`UPFFt+)-9@ z4x0ZfHU$Iuh)sV3FsCcwio;-0+>@cG&57=C%gz*i)Fk@-&^`tWN<_~cSOqG+82|GG zeP3NIQAJTgf(PS6Gz^tE`nTlYH2;~bov+}sfkf{5cOqeW+@??)JPUe@h?u7AROLZs`@0UqstQP^Rn75Ds?7|e}6r2SW1u_WqDG4s>GMw@u0SQ_X71=1!D9ge;av!8z*ahDf|NR`+z>Yxc zuk1#dOjB3~(YF#$g|Bn}AA#S1@aU@4L8Eb%Pc#y*C0IAfA0nIeGI?~B&C0)HpJ>#Q z6dTBmn7w3~eo}u;E__#we)?#Ne`DqS+E{!Iwo(`&i6O}@Zxc2t=b0w2jJSR!xeoh1#0)#- zv9*&B+%C;)Iq0^Er(piumRmR!49cnAZvf!)z+&cwg`+u4zuQFYfx_bOr1}L~zm@7a z=33xdcuS0PsT+gyu&LNN6|HwX<*!GEN54fgm3JMpQ*DONAPnd|We`zocaKntTFxq_ z?r+K3IYJhgR7$J-94WF^NKSW(^sPgetb{_QjPvcgv|c;$(x7MLZGxA$c-N8(Sj}I= zHmvO+aKlm++2c`CF0Keq(3*Hch9~(g4v|PqD$)h_@om4GKPQ)!?ULr|+`onQsJ)INpuTqv7%0yyJkd_w_%xqZRB zKBul9UnddySLh{H89wW}dpRUO_@CT3_(tF%Hu)G7n9V63FY&nac*aIQeZ4Cb@yHqI z)X^H;&gZ3ZSArhg3SD>RM~9AW9{hody0YPnioJn(xOu^~o41ils5n3$U&_{E8yW9* zaB=>9O2<^H9Sng7`P~I-&*rK;|Hs`X{Z1l^w1k~z)miTBYip>AI2sFV0-=D z)U8Q8+&mtzInokdnvjt|Mv^OvhEBKl+cg6fkRa)0O%O%H1^_M)~-^m;D71eSgZ=bR&r)_CL zHyUjrRh@6CTD45?L4oo$+{~;qvrf|iTIyOpL&s+ZzaHyIl)#@`Za#jWpQ0MJU+Vl; zW2-h_etxW>|EZ#Yf`kKnY^?shhN6F*?tyBiuGeJX}a^{e!orPQc?GLAXgPj<_eoX zWEg~#`L3dEk1n~cdg=GqE8*$a%$_eRcK*(~aGkHSu0gvwTLF9R52Uf2=@;G8OlxVP}5UTsu0U)KJRn}>88z6IfW2|^bUPyqvJK=8xvsy@p;5V62M&K zhw!N|@@ekKtc|*zbqIB@2<$}~@hF=vx9FXuc(DdPe7o{ZBOK$S&I`+&dR%$4u||>l z?A)|Aq*)tNyz#64w+y1K!|$JyxL(|sS?y=^aUag71b|=BPX^T&W_2a9J|_g5X6Sl$ z^bHV3N^zL^kbW*u>O_ho`6D_LyDs>$)$@n4a7nNvyUvf8?mk1^$I1Y{{Ygm~2U9)X z@)ceA$Cv0K(y8x$ZYch-TPl3uv7dpcxhktg6&~U{6LN^z`_%9*iJ}-#@?pW2%p%B? z?aEks4pD`D*UQjI6G^#E=c1<7^ovvV*-5O$Ha-;NaW%`rJC2)VV9S`|4HMxu9G0L7 zf;Px8m{_3M7No}*QlkxeGQyNpI)n!se?Pn6LA?os(+^bAa1@$X1QXwe*6^7vqOaAU zIe?bF8du&LlA~uFAxqQ1BO>fonZYNHRB+7IUw{M|lDi|FWg<+E)}!0t_rhzjf!?y> zpNXhJpHZe!b4ed=Uq(z-#(fHauxvT+f=MUJ2tx;qclU|*$A2(MTQJ(4V#806cf&d3 zFGrl^ki-{0$*q!$8BW4%_1-f8QIAaSBd6P^EMgFHZ73)WC`$$ySr$T7UUploWBDI0H3V|iSJhP%KRheo>Qyt5PV zf}J{lyZ6ldWpz<>E zr-~HLckA=wN7Sb>$w1iv0?^HlYFOAJR&0!!OM%$$;&F^&IVMbEc@tjCMNfr?YKh!1 z%4YQ_z?LZzjOrQDlDl{tkUo}az9c|jhYK4r45xf=z5dLnB+@eL6}`o#xlu`_$1r;A z;}|!*ulZ}rmeV82*Z_X&zVQ||U4O@Fq2SUL`Uz#kDrM^Td ztZ^K0w=Mk*i+NzXnz|y3A+IbV^#*&=u36RPv zN*uD0tOm$IpGyO5TMLVP-SBD$H#JfK%6?M{^gch|`zYgY+66BXzdx*H)&;U$al`=# zpVjyzfgHf-WEQ$6f};yX?<nZUK`Vo{vikyPx0WYDnIXe*g~Ih)C1`(qMk9ic^^duz+5mG1jKf$R%=uP z(Z$#TDwR}wB!iQbF#24QU|J2pkcUdW;4gnDJkdUzVr!=#v+LgfF)!YF{8`6v`SkgM z`Uvf~bVU~G*6Snff4o>p(rso;k{t^Uy@Tu&!4Dk$P5#xvH%$Mh5W4&G7aT*qKZVQwt?@aa7KTYz-IKKS+*#8#J61=LAR=%sCKbYv%2M|g4_llwi z%Ip`L(+wYfhRed>!Y3O2@qF78LD-s_oP!=22+MRJg8Mc*{yAbiI_5C5BR|A-E#_j_ z=d;)Gh#%3X4sQzc#f;Z!zk9>?qENvCjC2l!fn=@SCajl(f|&XO;zL~pZQyXfib z)6J)imC<2Vv086lr#v$ZNWZ{)y4=%1#U&HVUq)Q{>UyCk!9q5+Ew^!zEnaq>Zoa;R zBYo&y974v3Ukoy@ysnd!QCv!(P-!%wS})9u=Df|; zOm2vKTi4(mX3<-q;cjNT2?skiNn1OsBUdin*yu4j1UnOjEY!ISIqB?E^QFr_`azcb&@*{=q?N1EwkrdibBkK1pu;8-ckM7AI4m41=WL}CYL-=qqMX$(t_cnA@ zm>~GFTz->Y$N<2aLOIaaXiq8@*1)IwOypUNp^B^H`~@)Tfeq+2WufH1y)oFsCJ2@l zmy+I>j$KRS6}eN^U#jbh0U1hr-0b@-*pFPSQeGmG%!5Y(CgNmzo$^o3kn;G|W;Kgs z@?+;Qap7K6l!Qd=xjM!QjQK+HzmHyMeI=Ykd<(pi>G@)aK3RY!e#?-zN63RQCCNXu zGm4|NSc`E6#?Q;YDh{YcwY~Ag=1Sa%7as;P($z+MaE@+-VXFT4ir2}%G`*)SDzYsq zaxE(TPh(qD`Y`U-i@NI1=V|6rWv!dUX68I!2Q8YNDAkOJu-RWz{^SNx#5vM87T%7_ zAL*VEKZo_hSzz)11;jeeEu~>YM0?rJ_n^LWAteauV>Le@#u~{eX5F(Hh}B-e53`0| z%dZH4V(sV(*Ki5YN-fR;wcv_T9QeaA>RNwE!H1Y2#8p!G%B@Rt{+<`rC)^!~O?H#G zBX{#PzUd zt6KNk>KM^@&fuS+-fA&=QFavAe-$h}s+{?kKL{_ryCcNKW6xfSaq$(FVyvVK_!%2O&YXZD7v;>22E1 z&+0qV)H!?^{R!756$tC@8~=3+6_5Aw&d+MNR{nCzYSvE|x{ni}?(S|_ptz4qzRT9H z2-cpX_)>8Mq_y@TYhU^e0Hu6vbFd#Zyk$6>WtK7_N!Qx+2?rIw6$L|${srQ0=*J#j zyt&dCQcJjfo#2A6Gf2=?6U3Ao>JelUh71T!$tl`aOOIS`5(tkqc zb5%-0q24kVK~zMSI6MvW!O!w470`of0hES8((M%Th~aux0;T%}&}@iM+NtknX3eyS z%T4q%?G%lu_?L>0&@g+NE@6X_7pUxcY1ZwW1`TLy3YBsjn7n6+VM)xQ00i{fAq8EAKM0CHwD27{9-46)B)5V| zl5@m=pv-Lo@Ljl~eC28=VyQW@Hx4~I02J%N8?U&}2tJwQ!rmJ2T~)F z=ebd)N`vQ`ONb{=36bkfoFVDl!bb@o-jevfaWgxir@c1L^+2-Cb=H4hP2ts@Oc7Id zR5xRgBuw-l)Pc9bRW(CTVr8*no!foVpTw%rMYN>^;8-|}58`UVFEZK(fcoLNnX(jf znqOpk-7V5e56s8DwpDW>+@evDgiaePtFVM}tG1Ag*iNEZw+yM1#hD$=!_%pjxrhwE zbN;64a6aWv|I-Zq%uqFh&HR++WcX+OBb5$~e^TrFp+u2_e}%Mt=3feD3^nv8LWeeP z+3NF^z=tGPAm(EaYueTB>?yCPP?Jz>#QY_sHs8XB+{S>iqt|b<1hsHzmhyX@&t0>M#|6&#ll&{zb(2#%`y$^{mm=$f z5@_Fv%BN;X^Ax}Te%!tCo7y|ec}n~^&N89@hZFz>^KqX2*Kzhgq<|0kp6i>B(=3pT zZGIP|`rmanqU3)8X#(Q=F)Qeu2-*~$!gG7vFJYGn5e(16-xfqR*!G~XrgI2t1&5pE zsGkyF5I0PR`rk8xUO)D#A)m)o z*-W+wB9PH(mGcA)v)p!-;|Z|Ni(V=@oNeDfOKvazId1+7;J*}|@mIOa|Np%EBGu6x zH0J@M9gLt;ZxA*lu4NhQO)gQot3&|CV5lBFR*n3mFkWZG1`ZlhlG=AI4ZUGe%JbbTLU#1p!a+*J{>$-dK$q0|XEZZ#cA z*Sf{v$OOw$`hn0132tL5nrW2H)>+v?(EcMBp;FvA&f~P?3Rt~+oe9Ja3~EdsBwW&&E`nIsPj2A zD1dO%W|Xe=A4UOX6oJ$4hyvI#MJY8|KYHf!2OHfCnbhgUU?N=-c_Cni!q|kx?InHi z1IE!ONrax-56`B$i|D@grP&CWf(c|eWws~8_=$l-E2+?>^C5WE0YGS06_u?g3+}%F zg?!)R|IIRH--SbzJ(&n*qmGB%_xNv!o)Vxq$ih66{2Da`NfNw-KO6xvB9xIraY?fd z=%CPVyanj9!N;T(eikpTNuNKOLg3SEQ;Tn~MIuEgKid915&GRA?jMilF!d9-Xs>Gp z>@Xb*@z4Y0xJIHv7su}!@UYA#W?1#qzV0r2Y>p}@dQISHYyE-fz3lNK2z!&h*V$$E``$JFiTnVrLjB8Arc8F{egp1SgXEO``pRN(htWL7{|c`}>z8 z;o}l=9zGQa65_`V&Z30Ro2j}T#vS;f)6LIy2itn)uSPsqN1!`(zGgBz*hgPFb+ih^PuvB1U zrkFR<-b&}JreVmq-*VuBMGjb)k_>$3c_5$76hf4XsRiW{)?4OiDv{{rHlH3xhlDuR6kA1V!%u);x` z_pao~coDpDiEZXmb?(m>MthjMFFHMcP`*_~O~hEnLs9{|;8bUnKHK;rX~dbp;b=`m+c0kQ6jZ=GbYU+udvtwSbQ7N<3R!0=Gpu`e6NDt_ z+41(>WN5eA%LqAoN*>44H2vpu(j%Sd7SL_e^4y>=?Sgx`H!mRiKM-SqVltrg9_G!DTRACjH52YiD>qO9tseN zA8+#AC(rZmkKbmV_wBwaz6AKk^RFJ z`|qIekqG@KDA2*yn9^g8%+ZIsDHSxcm>}By(w=K7))YeuGoa2qDJRj{kG;SWd3 zSH;G;H(0-T21k{_VA2e9Wr8dNk=+t%YdIBWIGd|#;o&8ds>+?ZLH4#MtwtT;5Dk9L zj8$>W6-A`JItM@ik6%gY{z4TG|D_LfT1`xSQBhu1_G2x*s82AG9~2-s4c@~lUbKgd zOa<6(ZFepKkFi5|mXRBkO@Wq@xWX$cOBDsuJ!3{l2lK#B_tEL#77}CC0SAO;)0sa- zs|mf@2Xe3aSg0Znv{bZi)NzX40r1$u9MxKChgwr+r7Rbq&^^T>)*TlhGI{GfMSVu} zX!ryN(4iBP+a7DiNrXG4UVO==!(c{{l4NT}NR!lJwNjboaajeamEc7B#TQxQ+8rreMbR;xZ3WpXE{Uk4re^8v$3+713u z04@(~F$GNwAsMk4Y3FQV9CqNRg650!x2_~Ocjalc@(b(&a*Q+4T zzxJt-I#Ze_!@;5&%!YxL1Os4VAV0RjVd+Yu)u_Q3%XDJLFc8B&_Em>^Zejrd*#{Gp zW>dSkW$=YvYW5MC#zH6%0qXdtZAZ!_1a>m45(ML=88x|IiG>NY+Hh5Ja~~5RtS||7 zd69!~Pbokg{aPB+>DEY&G@0#(c!-H$&B>p)0ZetdnxQ)=HNGelnB8Mew~nl3lPx8aCut)CmePXg<0@Ae~LIpx$)P!Xx%M#OslnGS-@v3O7g%-IZW71o~XyOA5otwjM#ypwWn+B$Wkt01zkm5QVx) z`h$}QNv%0)f~W{$xuy_de7cFw&A$Ub$GoG`hCqvW1v@`4%}!LjwfsqsHpPN>ZCPjd2&AlbpBAF z={eee%j$Vw+~O@b%XPo*G$4rWKa7>YJ|j@FdSNDs-Kdo}c@(%WAb$9#wDe!V(}(sZ z>_6D2kdlx(?7pU#`ZtxyFgihbQ;2RvX*yx$9wW_rzSWbV9UC7Eg8O0 z5~Bj^r>xiX5)7B5q?5<7HYb0C8BTsPW*&N1)Y>DitYwE%G2cznJ>9PQ&7Rt3mJtCOpst|HG zJNzmQoU7Z!Zm0bMXC$o<@VKeK^o!xgmQKX9y|b}55e0zy;F6zlyhcIE1?j+D+D#DZ zilsXgT1}Hbxw_M?h@y>+A)ZbU=fV()2pz>iei`f{UHrIr56{+ypqFU6h1PSHX;^4t z(}}wof#!&)|`0YpIKcxe2xYY>x@yg>T;4>0SHuM|HUS*JU!MfP`Nn(k1&2Wf4#G&e`n@*HocWZci$JoUOC7Y#3?=OJzHVCmx zVi1gf_C6648+MZpT9L)6X$ZD7L?C8EjgOJkOHD_`;RTx$%#ckn1DF(QjIy9X<9qw# zUDz&}z3FsT{E?khf`0*K`!}XJ($Jl+L9#Hj2-hL;nX-VK7s0$@u)P+#`t+v$Hs!da zHqsr(ho-{8U1GiUe2qiK|tWLyrz+C+tIA$H9{GePY4 z@TL|;`vkv_G^P%B>^y}JKeERtJ)AGOzHigQI%{!FsjD*x=0DskQBWhBSCm-ZFNzvU z+!J*HL^gFFl)hh6%;R?+5x=m6$+ldp6DliBs{?sDEd8{RPLHModyS!zy3vksY!+HF z4rV5MX>$>`2R`PQf;>+B@=f{X+&HiVTef2xu?{t?O4sC%kbExQrC^naGp<+G?9A+V2<(v{7uI0$S zKE6iA_Dh6PP=Io(L~EHo1J#in1x)puSNH3W>b*Hv=b!y*N>?Z{ao@{BV;~4)=kPrk z9Z6g7TU)@vC>aS5-4~-jSk{|`GsrkTa2L!tQkJk`wg+#jV0bmCvGi1Ua!hP=Tb?$a z&@gv*!#BQ{U_V4U<-C;^CPGh2U-RuSjuZgoE^m|jN%QSYn9tVdiCJ$q>OmG z7MvKvjv@ycHw>rw62331WXN8>5(-@;pwClSFbQN;Ng@7_(skvk<6&#lof6NRd~F-S zlGcv&F`n#(!Rll<|KP!Kk>@^Dtul#+6M4owOZl1)?h~%N%yTot?q>3;j}Mj8a(9f* z*k3*i0pQp=w3u=P^L!Ql1bKaN*_%7Gnd4|dQh0^apnfo^6!YMOf?)^`G{VNPL)vAk zl{0Uyq0(EvjC0dCA&LzT{@zzW>qHSrKwO$!aI2#vrjeQzU!p?T%iO2p&5>(0c+Y;N z3l{?MDTctzhfo=R%1Tuk61-gfCB$1nIY~$Y0d#$5{Y(MrO?+VQS2)S?`KR}?e9T$2wx8-&m``t`ED{UCkl6jL5 zlK^2Y3%TrR+Q$V%RGIum>*=++c^#a;(}IYgDm%0C8gI0J^0L%p7u$!xKwuL_JL!X; zbGm{oE35qV?nNjQXnMcr6C@&XM#Yl5VGLzA^pdA%iP!AOs=68p2U2P=SKALeeiB6y z{zxG)Z*SjDU9c^k`S)v^tQIUaXoTU)^wYU-vw@+)`3RTFN=+b_ONpuJr_xRGP%OK7 zFjay!{p5deNxr#mMqN8s>xy_iNm$>%cc>D5k`QSO+JRgTH`e)+Hw9VX2$ z(NH<0#N<$#xWHF!7Ib<>7m5WX z8k^yHuc3JtuN5`C5xb>saw>(bE5kvAL$Dnk)n7n8>K;J}b4BXMO0nD3c0AB7)SGk) z%T!S~@&HGh?0QzV#Q+E8SWe~Ao4g}F5x}B5WJkHQ`Ab~>8j-71u3GUrGl zRyPoKY0UO@mn=WQt~1Uk{}95%DjCPv3j_t_UrMbB9PWo%N?4n6f!URC*Cq4_Vc^0A z*OOCdV*!X{t}OwG7$ zba_Okig3ReK}65Xr0ic{LJ=#@_U>u<0LvTqm-yZlq>-!$A7roVS&>+C47lHG0(# zs)DE* z!*j_>8^Es~v8E=Td4{!he<10Vvie&E3o+ER(}+EZU)k7OQo&AIZm9Et`gXVp*-uWF z&uNsQOS8>3P7L=Ycc?9S5mhVgaCpl#4qSh}ZvrXX1^<}DI+*(b z1THIum^UAGwnocUbvg&!D1><=2D$)Lx7I{HMVI&DwObQ?qLUvBZ3;N8Vv_9D0UKi2 zQZ;S&VQqdv=8VYkOU^5!n~bk`YDU0Iqcb%nzRSUKD$fvrH7D5t&MJ(e5%gYkvSGb+k=;~b@%8u`=a%ot3G-$2*j`p5PW+6Uc#;7QZJ;j-2SMT-nCEH|} zfv%b82*$Ni>BWRUY_MqWM9^?v=z7tM=9+*)pNvy;EeU0F_66;Lvtk*f zCoEmfG(0W1Q+tXYN?03Mw@FuINON4X3GM}84OR<&f;AlO5ROb zrMq;lt3OS$FpLu%-&(u^+}+JW6z$?jmKda?AdZ+pBh(Kc9^Y>s5ntA2AV5eTZ?`*D z)aAXO+@F;&C<-Ua`Fd)=zyKL$fwc?MIBubc(+^7MPQSQ1lbeGle-^GnT(fp@7&%eU zF9Z=Jr8U5keuc&WV4jfvGH*l(Z&5334a^pqCbcYRoL#5AnE$Q!O7)iV;jl_8OU}vV^ct*AjK5Cw5g%YMya_%7C9HiN%ILt=bUf3 zL$C7;elK@bg>#1b3iKfKACiG)HSrqJD|!#`x>d)2;6+T{qU zk~I9Cq8V|*p%j!z?iXpi<1)K4yy24X_#8`UQaCxl!^OugQ}-5cAO;I|T^asFumkn@pMEPI3DKk__IYZAOA> z+^&c1fHuQx7U5KRD&-JPNl)%wB7`5C*{B!0^x9>5VWE~DjMPuM(j735w-fGO>t2M@#+-Q z`k=FIa*J#1<{}B!vZGU5+eB~^2Uk)70sCKP!(~YOjmEe1OjVfzsFTj$aLl1etfT1d z!nCveVsUf6!(O?hOT!Nml)|86X6=jxtE%&p0#29K{{n0Q)cRU`Oy1Ct1w%-hKg3f6 z8Rs&C%?dwHWAd(pHO)2x!}}(aglcQn0``~yJ}hYz&%rDy;TZyZc`pSplVPk|ZCfDK z5SXa2oJv!yC|af}OnZGSWK=p`>KZGriw9sN^2}r4m>M0gPD&4Z@eP#FnE#_Nh0y!DU<|2D3AuIIVwx=)r}{kRz%Lsw+(n z_ybi-^-kgmHm$e8hq7Cc6wI_htkJrjby>>YD+Fy>8_xN9dS@w|L0(mjET8yYc=2Uy z#bOBcB|^$4;K?^+p5=k-7^Qhw{i-@u=%*zY>Ri)mSMiZ~OtQ3wF@u^S|2@9QYL>JJ z%KaKRi>l(<>6)mWj<})L1qHBIrqA`hizmDKxe*<6^kMqg1Y#`%^2jgwIRu#DHK!W9 z1<1+w6qfYQ$G-<-jt41H-wZYX>}lR{-{9utbuzE`Z?2axX+EDezqxT4KDGG0ip4!? z#J1*YZPU`{Dc`ofu*MuOTZzT2$-JN!tiEh*W_{Ne;fpXYXz`fc;5#6o{TXEW{Wpp9 z>~!65QBDCn_fchj4k_QF+>HXl0PXQDZ2}?IfWXml)3CQ~(X)PA*2w+42Fz8p!hv(QhWFlogS#K-?mtorA4&@U z0e3(0_+o0;A9;Lm(Fd}d+%T_t19I8@FA)V%;0L%nMKyHcKL#Ju;~`vvbT zB0SY94Qe1kFDjPTMF}&RR0a^Nz0_^%8Ium9%EI)bIY5CjsKhtC5z-%Nz@)}2nEk;B zaFidnq+q`y_UJz6Lusc}kFw3H59NcT3sVXSuQb?p&v=k^g=Fab0ktZ?9q(L9ahqGx zT{b_){aviw^3jReE$Q072hQ{_;II!)yYby56|7zA0lFv zIp|O%fz6JlUWZ>*fs=nnNC@~{LlsKCa97Bjj4)(^6FF>4_~H_i1qwH-n{+@*VN@tJe61NB7z&HJ z(u~UJIx1}kI1?hH3BxD$CZ1MNNWCSYwPFn4_d)s=N=txF3TvRGVvK{0!0Pw#rVFjC zA|q-{de4+eY>bx2pr<_%+9{WQ$4LA=HM@ zSg`Mn0_4l+?v84Nv!`ZXX z=BUEt#Y>#LpkjFlfZl{~E%Ki6P4%_+elAo;UD&BB<99r_G}7T3q|Pc*Uy3>hEu;(^ z4u0|^NtSwa5Odx}yL2g^M%$Ky94JZ{{ z;vWR3@J|y-V1M-Jp72Pt(w$)#;uzg+_~#ui3Ti?CO+=>Vxw@DG4zjbgc8V(>eOiJF*jVBg1j8rD85emxNM(z0MEm1h;4`t;2qmF_>MDU~M z|Fk|2nqZAaTVa(&b$5AS?lLu8o=vsl5r^4{PgrQbRnn4}>ju$&S}<-vhrIqgl}3~R z^H;Ir&M|OR%umgQD=NjOW-p;I0f}tgdS$7eKFp zilzJN9_<;O)C_eFkat%LF7+(7iHZtkG`gF848nlRJ~&l#kYuX(encb<8!EP&@ZjZ{ zawQ~VMS&=oB$G&OUYK`NJB-6uJG!8vcxRl|u1#xJ0t#FC-kbOZ0;>+!1_EOwvsD0I z8~(ll_AGU5Fdo*&Y4miv(N=fL+9Fv$9GplWK$cT|glQh?pU+vtJxtgbH4^0rKhnp? z=J}S2#Z}0cqO>bxsKvmP6CUq5Y!tMPFc0laFNvZMt{Ak7u6)7eJ-I4PufP+`_h0%MAq=*QnydioI7cS)nQtrZFr9cP8R^ zaWwN3t8fOMF|37zg?W$Icgq#vlGO;K>KCxdd<`QxJ>unYNcvCc9o-QA5hT1P5X6jN zW8KzH8p6tBU*8Fs9EU1O9s=|FzI*}@Tubf(>A|bpCB|oPTNsxd-O#3Ps7-Hokt)P% ze*YHrX3fHVS#X7Id=+wP`9US5c@c2`{@QV^*XnNa&^v$i9!g5k@!HIK%I=4$_lR1} zvn9uQkQwx?Jns$pUT5TIjmN9BdoD|4d6BiSv*7Fx7Z3N>@4s9EH@9DTeU9Bcvi^_= z-_+&#bG{7jE&4rpOEc z+JF5~Hw7dsVr%$!(bUa<7?TkH3atIbPVNKeH#yu=;g(yKARd^`C5h9}R;JLk1?A6i zG%g0|K8ww|x{fP11TD;n`t-#zStFF*w#b5o6H2q9_e4Y3xkj|deh)Lkg;B~K$Wd&7 zMr@Qj?2In&P{K}C#4~1}7t`fD^!u+G!{@oo*dFN9I}blsNlPHW0o}6_e*rqQA76C& zqp-^3bg^7HkHPa`I)L`aJHOdEflbJfZ7L&4Zv#SQ>Q%LLA@ zki?ZQ8gh?8Moo>oQzsf!SiywnoO^Bx=N>ZliGie@9E&oFeYe?<1-^uRXLEo_2%-(t zQPml~al?0X=AK?k&lQfy1q>&o<+DIRDg&4G!^Kv|p;mfoq(stM^VwpL7kAMLrKzo% zT6J`SY?Z~MbiYA`=7!9}z_x<@#a7@<%k3>u32lg;Gjp6Ehcw|wdX(EnZiIUwv*#2v zq`mK_h08Th{DdeUM>ybNahk>Lc!ylpGHG4XvJZJYoXqf+WYNC@XudJLAhZ3lx>FwCK9+n+g^NGK~b1?5+PL6Jv&VPL@^) zc~{KN&>2MS#V@V~8l`CIGsH=t#UVkZz%T)T@pue+w0iEAKT6e3(Z}0tG`{MEA&C{P z(qv0VuVkARLh3fkRyG1#9eG;GHV|k=!qGK-vA2G#+p+yoS z7kw=pse~~bf;bt9=2j`Yb3`4XSQ^KyPmmU%A{w?o^d~8oTa8rh3jv zRFW10i)iAq#2K&Bm2xipV)NZ~l&Z7C(qGM4f*}Tp=xj*?Vgp)?AgB|ot{QSEqOwqr zrJSz|K|k3avy>u_=?$Q##nitmZi{Q-nTlacA{lxH?Y<|pFNT)^VAtyU`QyR3$K-I9 zh;B++y~jYEknVekAQMfuk+w-d@3;E}ootu#y>Qm7j7orxqx4*MJG3w=8n>>Dda!s2 zC-i!sl&A66x*Lw3X%1~ED5$SZY0wn17EqS>Ib~6MSRRm}l8F5RV=+_Wwz~6Guz@Y% z@W{~kHD8Z%G>1ASy_e@ioT;e9E>tw)C&}V?D>~JwgC=RW)XmK{QU^pdMfVbT4 zE|lnHPBe4K1Y3LDU#7wkm|APB`GfU4l0zKjJD= z2>CBy?*LvE#*2Xt2u`p5&G6IMZKxq(!&|A+!b@uaoqS<)X0X!_+P4rSGVawK0 zpLX6RU3d{W8!}$>SV-vd&V#$$AG}YU2&1;He{?U%S6>+$q^J6buFcr4vBHNLLzi~} za|l4sW)f>%)Q!SAf~WWY5buuNNSgViOx9~N|{+`IwH?q(1UW5BT)*jGumu4^Cm_;g`5oqq-MzQa2RlffURORy_ z^qijkT`c|a&{3DGaFrj>l6$;k z-uURc{*He#Xz03nldJUsZxe?EPF=0?-X2p9&vy6oZ|1D7;iCM(xGOj2-Q^ow9)14M Jl=-{&bu~^`b)QD{$I{0Z07*hbTm%3D0sw$~K7fx^fd41t{hcgo1Mh%w?06?5XGT>hjTB+?~i|~WH?#gywibKn8 zQk(Dx0C)K6u?tk1N~g!c>i3FP$@F#QO#=(7g4aUBYU5MvKt(ANqD5eT{ zfn1L=OxS6m7HgC@sY6zQrz-ZTAN|+}carT?=gdp}KA~a0gwxr6WnKH-8xVJ5jI@}D zH`G{{=AkaU8v4Z|-`q||0GpW}>fth9ecnc2{hSp5y;>7+GMa%m*Hi5h^UIn5 zunP{5J^%nfzY15R`FR=Y&^|!@WM86tt#Ur!UnT$qu#Iiv)GjT{9`TaHdGsun3!Fj1 zKR|Qp+X0{z+>>6f`&u6)ZzrokH*FlAwP~zbBIxFA#vYPC6Y`CuiA{G8=H<};Tj$ewo z8Sk+9RMtUnK-F&m01AhG>Jy{d`DFUk-cKd@s{~M=8u$<49}ff+4E$3~pkZPDQ4&z3 zPwLa3=ws(|7bI4R)MfxcB}eM$?bisZPwm{iHvn`eg8{H?X4VY=v6V?C2Cg&}GkkMD z#V$-Dxn#nk^`ed%)va4HLkSq*(0N06F5Bgi&l&IZZ1EB}^b&nvcr}0ZcC@H83h;DH zGiqT)qNALJnz1ha0PwzL?DLd8ffc%t=f4ryuE!m0NLSg6ZPB=N|1I+317PBgc%$u> zcg#!m715kd>L$l*yzl!08 zkaIJh|5@K>ZVI=$W$Y@}!(xS0MIv1;UL=6*g)KSy3@sC9mRYzQX$A<)(d5514#-S{ zJ6fzap4JZ>N((zzkxBqq+rx3)uDhTCs9LNnv@mox;9K0?o#Z$Eoi#D&QS5r7)C{%n z05HRaeqsP?>&%IhHvlZp+;9!+e)0a7kVpsmKPeho-hU%_|G&iu^KX3}?5`MK;?7@Frs31F!mg)09IwuFW0&dUB4pr1Do}zj9HV-cn{vBCNs~@*`N^+w`8cj6Ht7 z3%=HkwQmQn>KmBiVneu$-UqtXm=GDflMD5Zdt_%+e%~&aED;%6=x-|l0Jv?|6Y~JvXLZihBn(a&cK~F_bYUbI zDF9U=Q#D(fgbyUop^;p3g%pHI@mj!?N&@gj-zXT+BaZvGwGoVKhSPpGsJnF}>YCHg zeGU`2tLB}*aW^KZ>-W6@0Emw6zlE5r_OqQ1CRKe>06oU?Wh8$AmhoU>=w5mfq;WUeE|oDh5Hop-yVpJ0)RjzWJDw4mq$V;W&+0UKw=Ou zeCHET)V1}AnNiTonYQ<>=^-Iy78J5`h_9^|mQ&I<@Qcgsy}Y{q_t71M7wi!aVXkIj zm|YCdunVs92{+&2s#5b;8j5u{#q9K)9~rVNl@MCHFF9XRgaJXBV{6U_0C`B|G1x`% z15hjZIlQZd?UjB2a>L$rc`TP7U%#cUW0|ZlyV~LwE7o8!$65nzyv9dC_O0|Y+s)YY zEN4<{R5~KqVoL=e;2m=9txyf4Qa#DODe<1hegK9ra-XQW{^WiDl4aAJJbCdEsj}|H zy>`Ro-4nEL<-Nwp$J==E!(EHzO4sTb_xz|47OeKMBl>-JA0H|9^CGF{OT@7bf_{PU zkER^nA~@|9qmQBIgWC8K?ID1Tmb_mC7GE16OX@{YtJks*tat8XBaO_ENaA3TDmhQt zI~tCQy-aCq$Rd^V?;Gm7**77uE*t}wpx2X~2qym=j$5&l9rV zZ)^wSdp3GdpPBtOl|0vHOv$J?6iI9eqeD#5fns1m7zN}FI}|%kRLPIKHd1Vr)bV|Kv~j3Ul&0ExKScK! zI(%lrH3Y-x%13`N`?AZZuEaN+37C*zsvimxHdca77*zuc|y9~c%=0<*SwMW*wk-HfSrfao? zw9J=knB2!~@Z}W+mf7+In4F6_2cuCY-8u1i*}F#Xp;#f*X09t7D=d$u^nJv1)`=)@ zJd*OP!VnRcr*OE_nBGqb zsEqqfF*e=YVchO<4Ebn%cSIm|3onl}DIeo1N)HC*kB#3Ue?j&2pV+h@)jj zQYdM-&|U2d3WRBb*B~&WQq)|dXeQVTwN3f*y0Bfaf=Z{Us56eURPQ^Eu*rAQ0|(sbwex)vswGviWJOPu^-s)2f?a=mxUGy3N=Sd^ zgcd?*=XbSL_z2Wl{H9S+qIV5P&AJlSQ0U{G4XRj$@?)i_8O)d=CC|Md4PR8=rB(1p z48G!rW(e1rncN3(lgjZKtnGC8sY|e>nC>VyVZ@bJg^>IDZXu<=IIu@U zegBPuaesJ-#Dcu8*q7iVuBXSOprf_O9%l()0$g`A+s~!NL$b7?E{tsLxHUAX(5A4R z4}-k})nD#F+9mI8UYnf>V<~Pn`Z`B(5I~nU8y9QN&!#f72-aaa_4QIv;0)bs%`>U{ zM9lQMZ%O1AhXrwPcB6O&HitBc5??9g;9OPMx?J{XD`TX4=NKbrm{_gXZ+%blf%%bF z)5Mg0;A!P3qsH5VPpsi{{eIJ+J{>eIE>Aw*FBsn+Ke@DDeHgd9yVQEu>`(2y;LOBL zQy3-qao%S+uSOo4p4)lwjdw4PWfh)xpB~Xu@C+hSe;}=s2!`ccDC0IrpO=~R(sJ}E zbCb0*dD0|_@XpU#u8bEoUl~}7a#@XY&QT4E=yZo!^PR9dRbyBxsEh}cflHI?18J5R zUX+zu)82|SfAAXezGs$7C|N3H4shTR^ZjbnYEa12&LRzwJuGh(nT?6@;g`88!3`}| z&uSwsZB>wmBN(FbqtmEF^ja^Kpd<*GJD*>#Jx=q{o!^0sGwZXaiq#Gp28hzJjYY0I zFT_oi-08oml~op$6ciVMI(`?D`<{!gyd{Xk@`zlrSC(VBW>J7^RAf^%6mv5bZCwD5 zE~rf-qH-Wz=@m7`$&2T<9Ci}-9OIecwiNVV2iRKFoMpK zCru`J?!3LO=IL8J(vS?(8}!*!;Un585*xhz3+6K4=v&U>+e`Fcev^CvFcw3O0M#0z zc1iM2P>qpeIpCD6MmLHh54<)T8h=hx2`7U#E}rjpGSbDt39Tx6%rl!(+&Z4uQ*nqw zWFcVJEcFC`+V3qk;W;M;-AlfDWwuKSzL382PKxTE-rdAtyjJyo0AA{ySOACEh+Q9m z6D`W+!EPF30*R{|?*mcwVC*ZA$xcF4I_LYh`%x{D?6=R~JpN&o8`7Jd7m$87@7yZG z7P3|D=Q2N1coZi+0@=z#9pWPS9nl*H&%x1RhC|-PPtn!&^(r@qhoK_LBu+J))y{>* zj$qFg-jc6J{~Lhh&VO=#)MCU}Sm8alE{aVRXDbXcg`$gPR5KNk#vHKQ)t}$aHCc7W zF*<`p86k5oDPoJ(8Xst*A5F|lOeNnSg`7q-!g4T;f~p}7Q(M<`?)Q*2`2e)?`sRja z=I>LbU#v?sf$R6?c68s|6MQd_Hc@*uWhh+;ua^9wf*g$wLb z#QTyVR!fu1gvUs5L2{7Znb4ILXy#nh=bB=*%Df{&8=@YDd@IwgE^g9C%zC7%SRd=b zIv#?hH$?nso(D)A^`=kk(Ukiu`sh> zUPSX?>5ie%6~Iwq)akkWIXz}V!)&IlxsF9-J43X8Ji7NFZi&e~Nl@&xwov@3YS(S^ z!u-M!Gc+7C7fM~$%vmf>k<>*P^ZKqE`*1>fu^_owp46pE?^&z$X3+6G>~{B`$cNIu zj~!O7CpkiDb?nffU@Y{50fsM3KAul_WI_qu?f&}@{Qy8H%9_+Z zy?eLx-#uz4Srx9(gV$2eid~gLDF>ri`dD@H(Oz%Q(^g@&k(}X?yvwjSKlts#B>?nN zxCb>?SoXZ~hGP>{*^7l@stm_&Zrpe#-kfJE+RP-Pk4p_|1C?k!i>(V?>@Mb6M8&@B z<@;B1tI~SbLOqiP!M(cK@qDRLnIc$iNJ~D3N2{l+9>11ZmiWrM4sTuDF?$x*7MrDe zT69cD3l6*!N+RTuw~%fz-z?k&hgyE&;7TGLn_CY2>1Z2svAA90v2yl^u4S3VkMs+< zQvEe0xViQsWcRJL;z9E~&UmnP-l8Kt_@S>t&W_N2XrEI>Zn!g$(lYX%Id<(VHL&4* z^p*5RG@$fY=p|u!w$(sXY(tMJ~)p~|FF^f+# zYpbL5&|_^8WJb;;#V|m+RW*e^I%KiJvu9F%aY3v{X1FxmT7a{?eyQB(UCF&*4bJYc zGOM0ubI0_&ETL7JUcI~ztuC#T=q>%0x-3*|gEB)^X@q!A;YoUxT=~xg+V2X-u3tE& zCuK>XZDcNBB9WHd>;}fXWZeywSrYxnYUA1Ex!m#B6cHpTty0v7+7vptzv@I+-Br$J zEn&BDtyo#qzm8mm9DV=%(}iC!XtmO5M|l<>lNY00{3*zzB%>mA-gM1~r3_DVH@D+K zbU>0;5IhfrHOX|zj0}R#`}(WycR$4$EA}5HoaV0^6N{?ELaK%#$2*(VjaKpsWy!dl zAsnu-kvLWMZf0Zv_@)NqpxI_u=MvSGzxT>}=TbdjG7bdo3no7Tb zbLaz>da}&U(ArdKzwOF5*OE1qWO5Z_*D}9Qn!;Y6hMN@t0+h2S4Z7 zt{x>1q7WWT9h&4>$C=B>alYRs?~=M!b{gpoMO}ELZdmG|#nnM?kcm-JY(hUo7(-VwA;}HE|(D1+Y|Q$&_)Sc|qK#w^P4_F+WP9A;P-**mgp5p9ypfnCw!uFhd zgx`TJJ?~!oUjrqW>*<=-XHNaMcFSZ`2sE)2w;(D}&aCqx+qDcvZqtyXelq@PN!t!c z3qmOHd0~#1mq3)v&7r9r#mkNu`~#14H8zkdJ(C7niJcXlJe{8-&V_RUSoz3w%d%!vW|0FWN* zeL!Q0JPKMbLR2((zoi2!=(rv~(FVkg=!AOArP3LAZq_$H6>8}=>3tTS2iCd-@TeTT z=2+LJd7fF+v1$j}JQ&N1_{^9*Z_IM(y^hw!<9oIN`cxjfwJ6_0&E=JWtM&ZYYT6w_UY)#YY%={rU&`rn;)r#Kjo%?^}f#qM)jdX3mw`P+tfyY6m~zkJ<_KpkiiY*1~M`l?JCOi&(& zLwtbf;yHTnQ?QIS!q2q8LvgfERp1q`Eb2+V5BmelerlPaTs@(<3eNUDg;fx3y)>|+ zxA^n|JI-)`5`G@N$6o-aK%-_4;&eQqihw*b%V2ic;-Eq&7pZLKU_gqsE|SL$d4apt zBMz>PSG-Epd~HaTYCV_=x8jP%`|_nhk{_M&H`jG1p4E*-a0GxL69O1N_Z0u` zB3=^YF!1$U$<<8%Yr~L9S^d|B)-nImb%1XqJ7B=PC%hwJ^)#pev4;kk((;-7>L?Ujhr6ZThS}d=FS~qQ2imoV!x%L z2jjFdL7!&`*O*8$m7s<@6#nc}53o&L#nnxYUfPlj&O(9PV+wc7336kCi-iDDMIxVj zVn|A6JSGOFvrOH?-osbSXGzpS+K}5B6ys^>a1qj5)arHQ`U3&xw4r?UqlQIbMKt+B z`Or~BtmOOm_e0iYPsz9>h=TWeJ)MW)&OZ=wqqkZlPZdxZz8a&#AW=x#2Jb+pW`_|9 zQ*FU`9Pc2TaHU94KASfs+ixk}bJj12)6q%gOyTF@YGAKZ%YW&2k`YZh6ETPrgyytJ zicPFL`Yui7Et>m?j1|rjKzQaPLkuLSeCXhff#WXNdU8LrWfVK{u0FMTA~{ zc^X7iP;;_MmkS3I)G~oK!=EtDXo^|7_D%Un)I`U~PT1aJH!jE-%l{x+joN;zgR3iP zbrr9(>d*~d({Oe!Tt6T2_nevpWDf^}&9BlWd9_G6cc~yhRo6H^X#e;efmX8HiXKdT zN1N`=H2SHMQS{#m5l`@F#HzyxMDDaK%hi^FEU|qh)$WXNe8sBNW9fubkVm(2MNXhP?%Cqb0#5>4)Y7!d#e*YRw7b+EJ^-N(!l@q zw`n!(2#j#(u zD5ne6zZ-vXjuo~fHt=`|a_$xbI%Oxi8RIB70I^9T;TR=i_=&z1Hauia{-d|o;C|gt zd_9ksSyD~M1YH+k7~SwpB{hG#VR5sGbrp+y2^FJzmbh)O=;GGj6~GDCae<6`TwA~! z-(vatWtyLwWNeV6EqhdQL9#40{D>B4h+*vJ^<5+-J+499`N7&AEBzYrZxqp z=^g{gE32)e$s(EtzodsMdxuj9c-X&@@g6aT)(SN`h$VqVQ>1{GgSRI^F(Q%lz-q8z z_gVlj&6ugdCeaA3t&_646=q!5;Xu-*vAV+Cxi)k9NE&r1ebjfzNkes4Hwt;f<#PA} zK*1^GN_S(u(5h*xX)tQ0N3&c$06!E-vd#+oqYPJCrPll{4z8s;G6`!3S z)I1{39?5DM=nxbz)a#A{Vwf|TY(Vuoh-7+U#^T~Z4X4~2kq0`XJNQnY7%j{6q z_-p=j&Hlm~fT9$;hX#uT=zeI@P%2RZsJyIqtvNb5e4ek*&o&t`KR$}Daa7_AfS%-3 zgazVemDG1j_3{^Tp5e(_`_uIQ89*kfd7nID|5mCM0UzuQ3T=-!I$apZ#NWgb4)$4YWWrkLEd% z0y|y!E3JV;kY~b@;Mhs{RMjJ=GzYPoA{H@vi^+w zw_gT?MH#)l<)bYGAZUGMuB6QgJ}pz%zTJb@&ghH{0&-|8lQbV>-l zi!Pt+7WsDj63D>OkNuW8##VP0###QE*(kt(GAX)LOKl37zT?(uDN*f62ENX zuPKu1^0SgJo5lPCYLB}krnC;av^FD_JY@eqsG5FG%BsIo-OgSB9>V8G@Bzq{5C+P< zc1~(zap?3zF+2N-?ExAUeofrwPKOYQ8_zq*R~VOtmM5%~$`O6R5_Cqyl+RKGTaE7T z-=TqKp~Jm|oV)qCd(0qOA*LHF*{-9}3g1h9PK2Zd0-=pE4@&|Qgto)IPq{Wko9Q+B zEb9#^6$Cp~tv_Px>pvp{_Fc!v+fJt`btTQmplFtcp?beSym%UmNsCF~01+t$hvpLH z0{U#vj8t_H?3?dtj?9e8_Py)lDHRD#CWTgGTFY+}WxHH-xSun+8z|)iNZhPho!B!9 zGTy`^=Qg2w#c_0FPsi^`M?44~5G-3Iy(V5-+6A4u5W#=1N8AL8mMK23 z5FaRq)@I5!;IN~KOf60W3OU&H&Qr ztprUtDdTtW!!N7@sI|maT-hOUR51qi_QT+)#Y>J)|6b@5EiMf$v_yYj&@8yqQm!|v z)E@Dm8X;(&R)cEawG4#)yhM3U_^g`?Jjo2ME;Rl{ybWWn+AuoDnqvUp1=i_M+ClS= z36bQY5=9E);XayJ{tEW`;KE%JE=E#2PDmfW&ksLyQQbFA$W;D+2Ikt!x0??MO8;+; zu=vjhpzfXSbNVHR{Lfh~7#tK7Gz`Swv;T1PbBj94rPB6%B((;d3T7y^VxU zz$BoQ1I54x)T_B9CiyOB=bPK}dAO_S5F1z5t7BmAH*@uG_81@_yr3j=yXYJ{MH-4H zKE}WavpH7_A|-xT#?Dv)bs6>&hYpR{bg3UkvZS&X!1Lx=9WA9^%3;`kTpOr*yV}s( z0h#8K#eYv9nqjL@NjjW=z`I0!A;lmIl{K^^`{GOG_&+iI|B==w5R9j!i#q{fEW-|! za-;(O=@JRf^f@L!%rP->awH7LhIPqiw%KB-N{PZrv%4D9T#L@VDJXAHo@Bg&R5p_J zpF471U_Jo0ydw8*ItQMv+LV)*$1k(+UMlsxy1eJ)e>Ns9a3{wIscn=B6YJmNi{E;w zg*Dje<-1SA#U+3+s>}dA@i{>My-?#$lM)LfE%kwln#;E0MS3_-%~%0Zb1Xx|?75w_ zU1F?7%fqVe^^&H%>ls3BHkE6cG>;^c(YT)4f|W-@lBU@)-8;j+=1?vvwxeBQZm${A z3~bi~S7|BA$^u2ebN*gsUeT0g5nd-Yzq|x&lz>9YssD&n#eG3^&v!UL0f!jTCGY+q zKpuo2mhzafXOo(?Ac0a}t}^sbAC2DeQ-h&Kq}p?(?#a-86~Vmk(N^Ji{Spj^d*TEvFqa$qk9Fx8V& z*QpFAJ3%9$I$vg)PR9c%f4}l`0D+uA)C$>hS!PLjyhxv`?Ih7T_g*E?REb$j9I9%V z+)PG{@dqtUeqa`EY3QFqybN1GU%6PNXzU3-r-88MiZLr08IAK$an#jpTY_>5EkUJw zxwv7pk*m@~N9fe7wYC|%k>t9cF4c4exw8h@W;tkLBk_|$Rxh>-g36}rMhEH}`F%d$ z;Z69JK}?==^R;BlA{3-V6URKBGZWG`aq5nkNN40BQNf$2)>TpSt-i55V5rhgd?z(p#oQ}6j{^xX}!t5qEyME>4kodOlA~-(h^_` zjQTI=Vq9MjL*?dRr8-7BRk6BMD;Ui;_G!hO05ycK2@LVkJINc96d3{?KV4Id zQ5)OpDoQGjcf?EfQO_tH-crkAvy5Ws&D&_{d!~NBVM?0|`l!y?u>B_9gqfdMTwZtv>S?hCeMt`!1M2QV zk)S(8{7c&-Nc3ZnTlb}ur7vagpCmO$-)p93mbFaq1-w_?7t!#V;&-vrWT#7r84nbA6`j z!zq^hBvUx09TK;*2+0kV6Dx>gHJWFlD-+mywvsj+Bft$m*M^g?!mP<@b>wHXlU9-a zb*l)nW3_4CX?f9QL#TzBm32Nu&;;=%Box?4_TW1FM^L;Z`O9%?Yl6Cxl!YX-h1oha z_e%b37Gn)w*QRnLxaO%=nuQ#&AcYw*hvh1&X8A=Y$SxzqsIp49QSxX}ToZQEsLt4T zX{9p6^cJbY1srR~OSFwZlmz8g#e#(50~0F8*Uh?BsP9Ks$^*L?e@@fz^lyG?lx01} zjM$reb<+zGgAw54>jsGiBV5KQNY&^_Rp)!7s?78$s^8;uPp8zfRLpSUywtvoK~eT! zPp{p}Yf`lD#y$&?Uf4@H(%umL0FZa`$mQohNK&_qN~nJI@5oJDBayq16juv6oo`-G zue@=U*$?= znC1mO2<$p%%JlMG6I(}mI3U2K;;YrZLWX_G5DjsFSVDo8xtI(K`l5uzkfna0SiqdB zc#Blo>vP*Da*#%fwXYr6%9l~M;<1QbJ5v}z7qBbExZ-x>_nk;Fz@-^vq`1=YPV{^? z(zegyIO~tYg=<-q=9w3);4F%yNlqFU;betY<|#Mt-=S^h2|u38()KWopm0KMT9eRB z!WzLZDn?vls&GwA!I;60k+H>``$ie9F=2WH2Z0y!h9o1Q3rDH@1Qs_sHDIH%vf_u( zSb2^1ftl9B{mnb>J93ZGoj>X3pW(LeD+<5m$*J?6`tE67500`LoF(-X{4in}JEXq% zW;S>t>zo_S*3vS|{9qbMZp|--o6l`y#uj>uVf)bvhcG8u5kjey9iO_vYLHDPC#RF{lERs;tZG1iW{J$E8!8uoN*5K)drNzbB{fzaJm|5&3d&I(+ zKaR=Xg>sT1Ux+jDyl&euc2u~a#KkR0XTn@8O8Duz)S!)KH)VIhU$ib(S_Z6hD<4q0 z3s-#8-|II#8XJ|Is5Lyqlng(Xs~p#i>8G@I>8RnJ{u{Q{;QgNqf0!vuSe=Ug%9RFT zJgk4I{Pl(|7{_GA*_B4-=Fy2}GE+m@tx^ZA&}i<{-=ZfI-9(>S-=(hQ1)r1BLivmB zpxk9@AG-3kgS!LyGkNW2at|nJFLkIr)h&xlq-$lWhE1Tv7a25c$|>_Ac*28U)wuj+ zus~m#OxX`WH3*rv{!N8y&MiT~CAw4d{v3xe^Gs>3h>b;ee0ixUI@)NFwsK5n1oDB` z%R$L&!|8Np_;wmgOQ4z>S!@z)v9;r$+1Uu<@nFet(&2u234&Q+4ry>Wc3fu(D_oIU z$W%|}<0$59wtg9AIq|}}S!rzh`57W3bw9LsRcgo<2W-=4`1oAo*GYz>LOA>qsywv#v52wOkb4}T{-(i; zozrh^#lCJw;=WKtS2eT~t*>GJ{3Z58idVPw#fKJ3qvQvCUO$>(9_cRLP{G@#+%@UFDag)FR%EcF1aSP2-rAFF>j){m&M#pmpi>t6I`#j@t&HpRRC>Y#^i*6wQ5&LU^; z8<$(#dr2Y~JENqt^UqS`^KJnz=q=luv1Z*$QU?>P8(oYNO{xy6ngU0piPcoRoH@mf ziLJpjn@=U_k3q~?D`c4}nHa`Qh5MrybVN^2(UY=g#PWQFxuaY6jflsRTdw?Zbdp6m zu~zwogrhlo(G;ab8mQnH8cnhgQf(TImRtMlppxWC$`^;X(4a0};=B1bsDl*`_dyrg z)uK~H?x!dG%BnxStg~Qqw3dw~yCvc$1Rgc%T9}0}FcR^(ppbU<2(!2Z)$N<6Y9)=N z^Q073qRx^njg;20}sF4IxGc}}a<@8;#v-v-?{j4Y&njmswXFr16sdW9B zcaI$)WKBf9>+k18{LbaaOw|7C`^<%O~^|Etq%s=S2K zIf>l@PohCl`Jxcr>u7;YLK{O~`n(x=XMTVDc!w@KS-xgUBJqjF+g>ImUM?-|^h#Tk ztH4BxvVbt{ys0SZ0D?k>&bBRCi3m9=nB9VY5{@8T*Ib_VO)J;Te)zL7O@1YC&Kk+N zoBB_4+^9eu_IzedfNR3t9P->QF(JJ8qt6n4nDi=do63 zd@20iKv8SOv{kO<2Y_*cN~YgZkzc&Ei1Lh5Fe1_|H$<$^9%aGvPg+{CDT4$p<*AsH-C2T^W4uUZhFfgRiCe@C7Z;?nak%17WoDNV>3zmunsQD&YYX<*K%@gu6waes6pP%+41vb(Ij`^)(l77&4z;Q8PJN7PFE+0}RjzMh98E9pj2 zYFGjD#(~YDrDv4uieP#_A6eo)!$(Ru2^4W6Iris|b!PA;!W zB^3`@$8;pAL}?_+3Hgr;#+GFRDK)}@tZ~@;tZw7wy^Z0UP@|*4-|-&+2F4$R)I8p6 zv%g}$8;4Yk8Y{+6+I;{{d7;-V<~9!ToAwI7I?Dd0GyyE`qgatYeEzqf*EB{k>>Jx( z#^%|8OF7b8s3Vm81XT=VXEN?YR(3%C_WIKiY@_;;@t^6Lbrq5rD=7BGwl#EZ{VE8Q zL=9kyOencas)S@@ztSi*+W1ODu@@QVF}%z3GIH5KSoiMtEE4DnEFoB4SHIYYv?>9yoJStj7bD^+t zypruh^ru@(sR!e+m82|+3_uS-c!c{(Yn z#?p-|$L-h<4)8)$+?slH7I+%s9gSy;etZ?hT$LVFZj5KR(C1r5-v{*!=BD(&Mlky5)xW46 zxkyNr&&^tULw;%YH<))w-|mlO;IKtvBU)+sZk4(HDAajCk|J@vEwh`xEmKKLSVlIg zkFkeSrNwKhxAWa#R;K4G@_3O>Sn&gDHD4by5&|sxw=~2Ksx4R5dBS!5FRd@Tfrz(| z_oeJQ9{@gUv%LT9SO;=QzDtQFkIG{%j+td+EzwN;@H&C*thX{*#%26ucD=m0gs;CQ znk{aIYP;@&(WW)gei4Ow->OXHdGigh)xGLUbj(5Fu10UlMIj32HH1GG*@l8ff!lGh zT+V0^%Zox%63v5BTyA>sQI7)QCq?RVWK zDVI@^Tf2wNGHa*g&nrjG^`)A^02PFBUL*8~*8V>xrZ@2}UtA0zuL~$EnVCsU(J@1NNk%ZfcHxq8WwL^NI}S8l z)Gj>@XBH`bac||=mHCl(89BDm(H{An(xTCU>bCpq;%?B=yFJD}suX;!gWgb>_bkl< zD-kr9&Nhb%?(2*h;<$pFry3hHZ1aZu#++B#!sa043(u@JrZuIoAzy`q*>&-_lH%|k zpW^iWO6XWLh5Gp7kp@2t1$uaz=hi>(a;KR;;qZwt9J;uq*E-I;-}{t5^QzKtVZtq} zg7X63VOa3zj1~KS0Cg%sVfnF-QbJvN;oQ;v{+OQ%W*2{MEUv4_M+J?v>-;)L%tc%h z!-Tnlk7{T)kIO(gdu1R(E=L2l278cO?uMRtUn7Y^Ao3f2vD~Vu#{)`Lf}FHlnJm4# zmfTn#I>!eHo zCUlwm^6ECabsDET(f?^ye#(1==c>=CFBQ_~701uZwGe+V#Qt;J@$;(e=O+9WlDzKp zC4p_srzJ#(yQVW*vlgf2(?X(>zHDl6aFckU;LE7E zjI00rOm6s$K4jZogkMDd8vIYs5a;e+wu#4o&+p%I{p*wO;HqXZ9^Mi@Qk8qoS9^v4 zxMHw>@0e0;H>2y0!QSZ>xMF_*x`p=KhqB%o$cYcQJ^((uh^<(YI4^oWa**>=(l_CX zVh9~wqz#&w&8~GZny3}dX7%^E-(eUPju=9v{Efh3M46qrgye+0k%7Pr%3EZdbOCMY zZKH=Ad#xfw{JUiZ>FsELnjiRo*d`gFs_~e2&IqC>yROb>o`pVbzI{)u>F2@u2K!ux zVIjRSR&@4nap8n>hrht`*RLDhbqi00C|ex;Q6)o`SPo9+REb0|Z_(GLM zIFV~aM_c+KIA+Mmv4VrIcsnwVxJKt9jF7BCGL3GhuIr<@HLJ>VBEPsqQ>Kll3JQpq zprji6r`jSB3mvMcX%KR-Zh)0OVP;*LlM0*C`=RR$c{{q_&YT^3OYW@LK8kiwkq7Tm z*`5PH_FS!OWepgx>VvelV@1J>X5z=d8BzdZ8_@*9>^O|sht#n%BN!U#MsdE#7T`wX z5gYdHNkD0MH462he3Bw8$QdDkP8+5_=2i~XbZI511fN@5`7iS~{R6J|`ZLg0E5xkt zqZe@jRvRJHXJC|?Eer_3atSCfGOSl2)FjRz8rrjy9lvvB$-i8M^Px~dd(MrmCO*sN z(petO{9tf(L=zUWh-?pWN1mzQ2;o8bv#44rfjqCEK!RC{7XPK2VPzl?Jh5#H8dWS5 z9t259RL??|@zTTpIo4g|Polw6m|k~IrGubg!S%|51qBdsiD@=NcbKyeETXA^pQy}G zNR*HN)$g;e#ZVGl&-O*`FAZi@R4cBhqszvif-`*jjFD&{s#%;8{kI|}jNN4pI_MDL z%&v`K?^d4seM95*3}YstH4yNR8!elMe`ksxn2Bs2hTIA5#h8#4 zxy(t`!irUq>$-~vzO&uJpO;cp$%11;0&iDh*plTjc~sz~6S9FoTsrs!sF0(9b?UM> zll*WE`0tWER*+VhC~w#tKfUji1>xs2YjM~qR!2-jCWwHzI@9!?QbFX0lbiB)uw-!W zNthM(6evbVWriP9-ytm1qbVj#F%BlvYg*WImAbX6i|<%#ubEUtS9b z{K-r#)lch(i^VzK_7;7YIWeaz>I-;sM`` z7cWxLW1KL!c`byc1C}Q_J6NIa>0I>zp!Z`%cqA!=U~s9#i{%NylnC{|z>KX`ifKYY z4i6%-21aHOr#~vU;_C*B^GWscsp!M`5*T(<<$(D?K{`AFMg%3U;k+aK6V!cLCu+U0 z1OgDy*lltIvf^bWJZROk@klcSb9}+De};NYl*_x@wvV$QHKU-uZa$`hv)7L#g-R^p z$YjPg-GDqSdq8-lsDOEkxLF(imscbL0i_1aRn1)w$P+i$UO@37vu z*h@psVS3`LEd<~}duhB^_0drV5&#MSwe)TX>J3{3ush6tb^AW$$({0t_uJSlew2|b z;!qto)b4Vo-__|P|Kq*!|HuH!hbDviA~P=)Z{#t+)PSTsX@iB~mjG<(qN*-cfMcLR$&f3hU%W<;qx%JvG1RO2Y9}O?fRwlwO~(t&p)4 zj`;-Uf$>fps;x8S*(Cg8GD^1^TW}bKg*9&f?$o2|-#^ZrEG|d3q%$Y_w1#BDn^nZcDW(M9T%sUjWCI87 z0KaP4Ghc)IQ_ZU4^?^FmIGRKG^~IhfF%pjIvmgc=_=0f}8oZ~%XU`(?Oo6fr-;0*lN%3kj2r6aw{xihGRG zBZIR`*ulvR3$Zmd5DMt|@i{eNwQEiW6EkAZMOA^5J!DUg%*(QDICc-GHdmRU0W?SO z(}0U^5J70KM;rgnL1YhIBkkjSOOKrN#j;@A9^Hhfm;gdA8R0e2+pcR0MDj#^Hejd- zyS<(cfkrzkMnl{!UuZT205f=9IlX9PorP@dr%ET?c{I=2;4SSkzu#}DvG=^rH3y1D z*d@N!zIm>jpLuDJ5c?`9+m=6PS|^2=zSe=&fMgpnIIs5mTzB{T`}KM3C<%82&e4BG ztZjR4E1126FQ*ib^qWREp4h{#`yD*Zbu!+C_*s$gym4qbio(dZHGnTUMs#9~#zKwj zd=>K-z3f-raUkY5A+YDlZ@cX}-{qH%Qu@x_DtQ}a*n49NMailuZt?k0uhzE)R&d!h zqK*9Jx@?_5dNiO{k;UUmt8b3?B(x_|;fSbc-Ff*x0NSf|=0lFhY5@`4(wfP)2hpwW zzFuLs_;+tj(pJ`8dEFeKBA6xg^WD%R*i_ST-Kc|f{^)a9QFNh%o*4YgHYbeY`k6E1 z1k<)WW-wQ$_)Ix5&t3oIYg->S7n?UeXJhLPy(fp{W3b{t_Ib$`xzSZz^rwqaro0Yy zJkpT0Mh-to1-OaCL8+|p~F34xdo(VpO z_9+KI>QybgOC0nvlMg1iW)o#60lgvgcg}#4MHof zv^ym$!0fs5wLpmjxXU=^%>Ce`sYL>*K=T=qwhP24!4J|TG~S@zybQsGkY~8a+~F>= zKwl2KJD)D;JO9_nr~QQuHsWa`3t_07D^sGe*KXI<=HtcduXoN50Nw{6^1oH`9zan& zOT6&zvcM8ua#(U+a+Hiq&UuLf0ty0xWKcxeCFhJFL2}MXvg9BrEFh93=b%K9?8E!N z@4frJ`|7KDHC<=sbkCWoQ*%yr&#!y>&Vc@Z=TQopmx;eu={)}PH=za($=`@uAP9_& z{qLk2|Bkq|VRA?3LIo3QR}gyLM2F(7B_7oS6GO@h4SQ*(ka zpA5KatnE%>T$r#Vj`DGWo7OqxWVS!_vvBP#dsIvwQ1*c+=i*jpSO zjeM*0^OP$Z9MRrl(to%Up7z4)C_EBOC;I*=gY@?o6YHG_RNe-m!|pMwmjo0MEh znQ=Dy1p~RlmaO&IFg!3PV80R352!^8tBea7JAgM7_=lx~b#X>~D=<$$U+LM1KWA78 zH`)-^s;Q&7JdFB44j1@CQmnaHA^R=`nllM_p`T1}LK1j9>gHywOa@=YQJ>Sj_AG~E zY}JHVr5|d`Ld#y5&PSZ9(U{cNeqi60m~1}}%KJ_tj;H0Q^z*)WTN=zNbW&G_RzS zqpc(MFf%$Fp+E@YJ`fj=5oh%=01}AFNDT8|E7zz?XTxhumnEF7a7B!Ui(=$|Y-(AU zttXI^2s+tM9g|_xquF;(1l(7_p^?2a1}llU-azAXV3b+C25?lPHSL<_FPA=o7uj%SY8crHa%n^R`C!t8^QN+HY?_LlD<7gD#lv>BsE}yp zUa`hw|4DdoQz~7Os&yCSbbH83L2js~NhP!X6+;eEinOhfFh5`U6ktHonuB$Z$5o$yws91Vh(&J`DzltJCPhe=Bi;?*PgNh?K{#cLu@B&`ga zSw)|ewE+1D{b{Rxv!*om4P0{arXqvEt?~uFYG!7{uGZ~79ZeN(d_0Pc#m-t55f5ot zl@H4NNVHY_*<;v;^_?9B8bXe(R6cGpRSyk!PVO7O+5Z4$uD4`?zs73gge&IhmN~cn}~TyL#Qcvj9v8;DSWK) zYQ@!LZT{u#&h^;QLB`2%pX-f_&hZ~vk6$)EyODg^lymxeYo7gDAba0L>*QosE?d&4 zq9Od_A3)+Ob`miuMSFp=4~I4*T_r(}&)g-d$npYA^%x7Z?xSXRL^{K+UhRE2pb2Rs zsgKt>8ah5Nu&q^#yBHvb6&qFm^hDIpK3bIivBDxyWI7z_xG{R${;O+9Km=+Kpz)fS z^a&LEZ4d3CQs8!2L;CHn_+2V{-+sSQI!whYBDl?VSfB|(4O z+qn4)w*1wBK&*dM;6FKw{sCL`ZQQ#Lp-kw%V9VX1la+t#z`t%pW)J}q_O}@FE&mRG zO}PIFU;b6}5Q!M}@Q-1%{ce!c|1P0l36V;@ia1mMw?b6*uVMZf?B7>fE&ZUOzMN%P zxM)`@;7Hv^Us*3>fRG9@N@*0=sjOQR%^0GrT2v#4+OlLgQ&d5ICy^b|AEZG5Q<#YP z#7_q`4OsvSpPv-d7d8jwL3?=u%|j|vhtkHMQ>8{Hkkj8e3ox8sGC*gl0@50_GBwb# zKmfBtI&HgW3RjK*l&tTm7@Lf}0w>ukos1pLo<^$yqJ8rpuNne!_rJJ~1tnlIf6#Mp zlhyQQ@TR}xq1vYAp;U-Ug!>!Sr857s0mN~Ns(s-HWpp}TMcyFyy|n^U#d#jl%ztBSkBeQQ(?O#Nab@Dq9FMa%+UeOCDqEI{gjZo{i(vh ziEO#-xPqqUSs7+W)Ov;76tsIt&?u8*Q^%dD6K`gtZ~cw*9T88-k~mhQNnahFJnFg7 z3O5Qbv}MLGmV%^Wzs4lfCZX;ZYmHk=&X900sBER%0z04CGPVQsp+xXwemV;62&3DU zN4Q9uJztn%`Bu(j%F8Rwd3R8l;v;y&%O5pI8lJprxtGfQm~^H2q_Xf!49i}M^YR}zZ$yT`e5EL`guSzysKPc~vf$+I<69!f*(0zL!>JC?G3z`aEh zMflsyK$Sj@ZxsE#w0WEMdrt4)FgzcWS_R?|22XI4wWWcZk%^NU;3O=?h>A=5)8^0Z zx-1sd;zb$C?eI?y9pl*aMO?|G%uh69ivvrUaw$om>dJX7FO-5v%PoLsFDszwy6 zUzyaN^h8rDH%DtPLcr>BBbD0g+C5YTq}RKQGmpSmWkOIF)>_-Ox%&kizV{527I3Jz zE&7N@n3#+-S0hq=_}r*^a=gf>To=8*Kx~Y)sNc?qUQJ!(`G4IL^W@y+EDj8}NHnYI z>r02vSXG5-g=kI+Nf!V64H*3eiI%M z;<7GgU>PXj=x)cEDSh%xc+B7FXk6UNBm4M~gGCwms8;1KR|@>7&kGATQ?S{7%m zmm;BF-grisvc%JUr8s}1XFMjPg?T@ivK#|RL?TyC)0SL+&u_Ny`+qBxcz?op!2M0~ z`tj23xR1~ufHcpB+|CkIPWFrRRbP^7I z?BsDn{>zv~*Yno@TSnuKxrhHBfSl8$-@MaDr0n3}S@rYD>$r5=H!a8cN{){Gbeww# zXUoZA;u~&cGBIU9lLlQ+^j`2y@&oqK6HVThD<$Iv3)tLB?DcfR<f3=bYc#Un}gT8 zmxJL&BuWsgN-of3#yPcdi1>8&tAN$;MEBn_Hlfu2O`_}!o|x;uK{j0fcp9+4cPB3Y z*#Z7r`Q2$gn{GjbJ6bOxxAvb{{yR1K04kY2=(OWeYH=9X{twNLaq65QG`6XK*b0j{ zEOPfPa~|q}v7rvXM0(^-{=f9`#QSTQdWv}Q%ejWCGOfkZ_awjHQ~dsW{ZE4Zi%I`4 z=AHDvJKS|9`zy^lo-Dk7!6>{H{PT<+sU`UQbF4C9X!Rz0aT|oZ$k)KeagW0z9v7#x z3kJUC^xeFJ)9zr2i=~;rcgt=RFUSK5o0-VLdBK^M0u~a{1pqh_KoHLwm;1a$T}#Pb z*;8e?_0D#?@5HYh<;8D-oMd%Qf#)Cv!Gmn!m&$7a11#b}@e!qtNBdlaaQz1GBpUGL zy@{kWc40p{6nV*0%e|xBR>AA#oxm@#fFuD!9aQZNVc1!s4AI~|O2GCe6q+wsZ}0bH zQ?h4Ol?VF<=vvg>$=vS3v(S|%oT)jceZ2eh;f<=$MR@Q~{XHp9~v-7qEAcF6dRmYaM6scF;Zw5MrI%h}Bj-a4jCt zQfSobj0Ur+7LnhVwl{iOPX60dUVyHh^f`5Q0hyCBySk$PTQ(xmH9av$AWKM7*oo|p z&AB5@Q88}R$Hzg0nUT4L+hD}acKACwmvL;)T)r;M+S~hKoqx>S}V+j{sUSiQm_Z)a$<0Y1CX6>0z7-=1yS%;3aB zLY_})djS()`wa}hL5H2H7}B?ZHQjf7?QZklR)4=a%y4^%H*<`IRucp$p3+@yOO!sn zx+)rsV|def?>bra&@n#NYngQPd-8yCG0Hk-i|DL@>Wffg)^h^^<2;_g z@tIE{z~fIb2_t@j_-MDN+%9bWBvo1y10lYijp z;djZU`}8?PMU+xr``CpjND<$Nn7h#hKp$tB*TqlIXQIbjkpIK15oyE1a(g|rQGc0- z6@MJN>+@ieARI;A_ri0TTuI(JVcwjIaL`qVE{e;6?pESx?Ms}T|BIumfbUd6MX#J5 z);X{~r>1NDVi`IdMT(vmgHeT_L^D@zu4(G<5xAtm1>ZF>Vm(RJ=~V0Q{kmUjn3v)Q z>(1%R>5K5=R26R!_iQJk^& z+tW=PkxXbbIDZRdYef1wv>NqMAU-5Jv^3o-`opXR3IqzMZsFe#}I z$>Y8ztc+kS3l&k~7JJDTVX*qiQlYJ&k)$Uw)a=Ra`p#&Z07UdY?$&mVoF-bERcWe5 zwl_?Pl5`!xeXA=wKQ2dPGr&}IDivc!z0*%zHqG3(7DOZPeW5?<<)XfD+|vDBMVe=j zL%rP}g-uju+_>T6mEDEn=T7;x}DX(`|21i7UsTV*I8p8xz+D19SL1Tb1A? zC9VN!$6yY{L!vp~)ya(xeAOjmjnh#YG!*za9edvNczMbbfN~lVNo5*0U>>gKX9%wx zo-74i@H!kRxD@T)2*}Q3XdKNHT4t45VZn1S4*)?3ar;l+C*;UyFp}u>Qarxt=ASLb zOHMQGOFx9za0^|+BBv;L5k09xqR$NI?nnCeMJ}qbv2{=&lP!xw1XoLO;;~BP=JIvH zt01tb($f?-mQ{B_zJiiu;|3a?w);SBAFSN4%QJpn`DxV61KIgW7eNFn@d9B;Pg7Sf zlRnNgvw}`VQeBe#3|y9t^yS`S3!Bu7qiXyyp-cWV8vZ^$K-b5w08n0wnNnm**H={x zcwYVf$4>Q|9nG~4$x($BrRDut%H;^g<+6*PixIY9H)l$BJv`9Ow_nwM>G)}$)(xEe zk0h4A;G!sxpgsF)Zl}<+$3$BO!4R5U^KW6jDMGqS<#%80Gufxe-Ka7!l^TXjjM-5h ztS&?^M!Hk5ELLyp+A|9vrSu8e9a&U!Tk{rd!#TjB;AY3432DUa>psDn1rz{3DOx2T zTp9WQc2%}iA!idE-l>TrLdZmN(-=t50PNkLPieAj(kQ~XkBBeAI7PYc^{^BEpz<)JZ!!ZD2l*3KpXKH@ah|-729f$AqcYAN&91zn< zxUKYt{a0mTzzVDT`aF^T;Jou6)a7r83lT>9NVa+$UF?qd>L zneNl)8QI_M*Zxng=cwfW4`X!MZ*iew?Bko)T@PS{Y!D+EAT|oyB|bD+30u(42+!-0 zsY6E$9qrAHclO#ww*U2Q6V=&f{k4DnL3TDqZepUPxL`qga+DXCitvqo?bYK}1+z)o z?#+!(=k1AP!CwH4r%ad0M^f}gS@k{|>!J}=2p?gaCs(2nFRcCkfG1tI)(t&n6Al}p zBbNt0>=$c?k;OS)fy4-$T?vg4{PkKq$+TXqU>HO&H4;r?=I7fs*(2x#pa@zu$SYME zOx7*g^Io#N)PX4P<)w$nYXJ&{MEVs1$9H8`bQr{V1;eSaGq}j4;MgS&+H4c#>#KHP zdHDi_-VRh%{U9Lj?dy}1gZBc$7HY5_?ny!G!_N+S{toRFgM&ZWhgVJ$ATl=ar|Vqx zRnWQRE2b0Dz#5i`Ad;FfoU6XwykH39Q2x_t8&O5Qw?VVK#eq(0SR&{gY&B}0JjLUZ zOY}6cT-q=lkEM=%G$DJ`gb)Bq#u`9Gnahp*F1>;}*nhhxBTwLM7P%6t`->QV)EhU|;* z;*5mLW0NIwP?(RR2dAi7Y`OD&8D0df;{tj0k|W$n@*oQP4)~<4Oy@n;J@+L*)Cx_6 zR9lI3*xz6Ak_IKcscC}Li^su0?50dke4-e_cZo%3!Oky4Jr=)|6vduduOsf#-7n<$ z&kpf_{qTz1nPq?whm?D6y6Vti}J*BVRIK(EdGe^L?cDl*TG|9Zg!*<;); zB5=uj^3a+u|Er6W_#-S9zm{pH;>%olX7eDFCNCqH$t8E$9MFR*;m{_2hoJrr7+e)q zbXNhD72x6bZDUcw-9cM5fXP;|Qh6}odr8~^iVQk*L}>|Yl>GzvXT>%r<*~PpQYT^) z&J_8w_6Ru*OMVa^Eep@sJ&(slz$@z9W|&yl-hCx9B=a`7&Q5t)UJH>`i`q=)}S5t&O9-EJjyKnYj$z$tcRZsU8o;QToKWrpQix z=ngC~r8mi)8Uhp>ym{5%w5emNRtFT?U5VJ7#e8r9i#cjB29Qs_9A@z<2#cx+8+iIg z`qCO>Z-Sm;EX+>bOR*~6_5B0Lv~HAY+TvU@E2!kY`2+YUafVVY$>z)?&yT;C$M~D4 zG2rOY@P?)AoAvA0vK?eCf&jPMV!D7T2y(+WJU_2PFYvn7$Rzc`xT37!o@w-x98#lF zV9D8doEWjtQUTDA7gQB8tq8vis`->#lh=pB3T`MWHAtMA@fgsio>3|x*H^}mh-_-DFR><1~#`n3D6=^Lvp zDvp!JVwW3Q*GKoJU(n|P6X^kmMArN|W$wzl=^tQJ2EvCNbF}5!-}+)2k`R5o+y<1$ z351G#Vr&d`ZZls)OtbVN=HX)BRzQABG6lVh%6Yht&k9O?)}=$>%|^Q+$?^}&Wq&qg zqZ|yKEU}?#6t*es&h*#)ak6 zBV_8f+p{+Je0)-yydu8MDLj~r85_JOW>tGIN}%P!l1U2L{x$sjj5$wK9A5jqh}cx7 z9!s;R$nl}L5`=c~dp!LL^kajUoaQ`O@0EZ^aqChe%QBr=*IjN19Ihzo-}w3KR}x zPHt+Ck3Uec<1ui3_mD2p!(F^P!m{v*Q(It$qOR2T6GRDiU}cVc12j|dciFeeLitM{wIq?V)we-;|CSF0mZ*kL`wody}(@9v|aRbI^~^C>sY#9 zb!~qDpz>Xp83#35hYshFos?956FDq?6aGinKqaNxx3V;vhsA?dTispHKat9b$eEUz~3Z8AfnWC^*U6x%8-P{G6u! zOoc3a97VC_d}P__>-uOqVfMDe^Jr{Vr4e z^m%NIueIKvblvNd^0lx7jVZ$^&~9E}>IOlM1tZyW|2&EnVzb8Szq81 zNsST&qIgLJu97@C1*9Pb;@1o73pO=5M;RTmh2Ijb)R;Pna=m!)0693LPhu%dP{dZ& zKplYl`=)L@!6$kw-(WZIh?opg&Ae9Ug%j&-ka=v=gU(;Z6C$zwT%Q)@DbB(5_c>UM z10zc;aBGDR>Q+8^JO(z~_u^y`k%ZdAYD*xdLrCgUK2M9h!cxGl@Wn?V%7-lDZvnht zV~z#Mtd(<^tWyNV__5T{YSy4f<4{Kouw)YD=HIzD{ebQQZ3^r5>4X+~bM?B2h=H|> zmf2@Aw$Xt${wrkKg9sthAc@S+ABqJ*mjG?A%fX3yoHacaDYpPdSgs%sGeLI~QT(qc zgmR9enhRp>DYT=DmRN`PoHWlbr-2Ei(K>)sP+e zkm-|eMiK@IJU;oT_SXWx_OfIByFcfHh&pl#yfrH*jPp$xT@+ucibnY_FQQg{IRne-+7VenTk}=o=XRdpjMk0)G(}j8~^PrRnR2?$N}7!Sylvz<2u>3Ok3UOO9}mw25qjS(z1IL3F(nUZ*VVvb%l|f$oXHK zY#D#dv9^zd88N$A9M2O+l`(orrESPafDP63UqwlDGrw;-x;FsQ?*qR^-&5r5Ue12T z1{_BK&mgcL)AV(xz|*{oEq=eJMR(-$jY3o`hZW0S1?U~swdpV7 z>Y}^J#dJbV}xC+A7w;Vhg=zf;eJAQrN*o`I*Fc}rU__TTF~V4Uuk@clT;RRz1~BatZI zyLbMCls9R-lOcb$Wilt}Bw*fUS{2-?^3SRIEt{@7^2@ z-H*-zN_C(S3YYs3*tqRVmKjkI^RB0lFBuv68mh;8c<>%RYOlF~#=+_V#iK2x&~BCW)KY`VCm@gHo`iC+3AYP56kU zU}UmT4raxuQ^iQr?gOl1cGov)l{`V_nci9NN2TaE2CMtZtKC5}^SocY5BCa27=9G8 zDt>_ywZPY^E2qgMT`euG+TGXQ`wrBE6x~R?Z)1@DC9}pNH~rwqvRQhq%l8pB^M>I| z@Y>67*=^Y}B6}@;0)BF?@I^lw-Lfvn?b)wBqVPh}Y4JDSPRk^?DhVbA8x$*CUMTHu zz*-|UG8kQ>?3(uKvGljH3-hZs|J!((Qn7Js7POW2@Mq~RmJGDu?%XgbJMs)I-)jDy zKH-D=Cp50YFu1X#$xn`%lCKi6BMKnuHVj;&wfnhXM`d5Gaqpq8FL{JB+P?V~JH8NHQAIKNF%}BSrUy!7Y1rlA zw`Ulw5VikaiTKN{T?6ux|Jo%Kwp?i%F;d5TiemypA_txyc T>4}+c<9DC*kH614|IGdmFuXRf diff --git a/website/assets/img/showcase/laice.jpg b/website/assets/img/showcase/laice.jpg deleted file mode 100644 index fb151b1fcdb3557813ba6fc152037dabb8a5abb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9263 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 diff --git a/website/assets/img/showcase/textanalysis.jpg b/website/assets/img/showcase/textanalysis.jpg deleted file mode 100644 index 16207825759bf6a93a3f89419074d2cad956d74f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16789 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 diff --git a/website/assets/img/showcase/truthbot.jpg b/website/assets/img/showcase/truthbot.jpg deleted file mode 100644 index 4903f3d176a374bbaefe49df8dbde8f292b424d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24521 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 diff --git a/website/assets/img/social/preview_101.jpg b/website/assets/img/social/preview_101.jpg index 448c63eafadef39e478c5b860bdc4e36ae218d19..f65eaf8708b4ab4c715eb660fc551ca7ba846f05 100644 GIT binary patch delta 361916 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

    C(IRVt2l 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

    uyAu_#enA5c^x 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

    dChw` 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 W*LCvrt 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%0A#pgNp<50xlqo_#g_w`(HVLM3 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 n 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 z�-lK3d%Wy)IAj(YT3pRxYh>(_5SL5`Wb*s^xpHDi@2!VI_@C7!4u2C4#3iqBilGvqU3>U<#>qD@I3$dK>0G4IU!XG=oDy z_E?(3bM+{%beca%nY~`j5V;YLLEd{L>fF)aGV*Kp7q?z9yK->M^abU{6M@KET%+Mg zyr^6XtD*#A1AV;5{VicxT0>*ux5gf(?8&**p2JL&g4)Jz;rfF_<$V&Ey42l+8r4`D zpCLyE{xrxagm534YRH`|TMpF`6ja01S zM6MpU51QmKO7~;gGY8Cad%keU1(riGyh2R~xapO~;UP59vMcs~NZ4OQQ4(YSxzZJ2 z&8&~wH{rS6u?V`wxtF!7FV!A(Ev=vk==L_MM*-c=Kb>93$oL?2#vy(AB4ji&Vienwk+E$Ba6f9J_0g$|yY$xR@knVIq$1=cQXNgAA0` zl~`>E!L=;j8S+M^o$`{cD~?)VK2Y<#|C(7_OJL+UUTCJG0qhNMmdWQs_Xl0c`ZqZ< zzJQmbZ&!qVB1v<4b(&5CKM*W%=rPiQQ6-#@XS?`R=KCaf1VYQidFHpWa@$L@@-_9P zdM=;h+P~s&pIlqb&kN-X-hCexE}YB~d7tmQ5CdOU{%~>K=dQpD+i)kaK3@t-W$Dg@ ziMUj|uqYQ_t9fs*Ws&<9`Y>3ij2#Gr>p8<3&2X3Hk3I2%!cQfj+-HTwQ}^W>Efm<6 z1)*Js*@`Cm#@@zOX5DdNC1(-Cgg9XLWwl>Nn) zg|Pb+xU9!2lt_eCs*64+x1KK<6tREU%a;F+q6`&V7fhOQTFxr(2e|zTy*26t2Hrd5 zSnq&0cseDoH*y!F`3wEkvri~>{Pl|au-F3^z<94OGF7NaStLx1^32%6&m0G?B(68N429zM>g*8Th=sUT*AcQa9TOYxLRhxdQD?vo>W0xh;js-=>qOUW~t=s0`Z+uUkD zNNjIml584~!rJpwx5+M>4Hjkd8$~B#tJW~2hc*`2Cs0iSAJFmFsW^B7p0(Igacd`i zJUqd}+?2EH?cIp1u?*S(1-2waCl%g+&{l`C8#zhM=00YF0}7@29%6z0*lO^|g2 zH|qke0U92~STb$Hgr1quLs<@R2HD9i((yy%mPWZWcF!WU5FuYYex7LEiz?MjR z<2E@T*bE_55>0%M_mICWFNs)qQkjpcHU-rK5)3XtXtmPX-=TP?a%iG64EwUdV`d)% zsq<~%{>zk&QA-|TXP1s|B|ZhuCte&113!mAWi=+Q@lf2a=FBblDZ}%O2lK@RURF}V zB~%kPVHgPasJL?*cy>fU%jnet-PE(Ie9vveeL_!g~0nhN|kHUsA`p4 zv^bQ>DeU?$33<(!K~Mapm@^+&7*IUauj#Mx0SD7W=RL2Hmw*?K2IWXgXEpdsficfV zXBCpqwbov@GXTH#+I!{8%M2~#pCE*Yt$r=9a18glzGY5%dmwV^15kqxvf~-G#eI^; zyU@lrQoEZhlZs}yyO>A2gLGGuY3vKEpBoZb+$|ds zfo6?O3DqryJK1{q*k0>MZ#EwwM+gwxfQ>{?aWLtxJvx$Qz{-(Dw&2rXdr7@4frmHl zxNH%ZO-4Cdr`zj_b_$er4s-i3nC-8Jr`^7p#;JOE>oLjnHV?vc%SInYrQ#jyS!k?)DrswK7~t2jYGzMV=?hzWkXAFljoOBFw5^$mO}4cP2?+`=#&F_?t#=i63<}!g zQd_?eC*GMQFK-_+<@AgxC>|}=m;PQC=qMaz+NF_J`mC*=uR*QtWO8y(c`bf$e}gaW z4;uSs{`vby{_^j-$26D9sA;e=1r~=4n8U;?K0vVk@d#G`cu z4>K2A9}=8h;nwHIhJQG4Xi~Z9lFp!zQ_?S1&LZU~LP~=SZv? zGLM|R|9lM`K1l~d6OakmRBmO7Zh%HK09XH@DeNE#d)>}>gvh~{-J(oHjg7)T@`lTQ z9Fa>14d0VVE}9P`w#%5Sow*G68m^>BUV|!dS{57F(m)s%P!YkWfw7~VR$yCCJ%{`{ zf4%%=1GX-_o&-&f>B0gItRD920grNFIv)p5_9dYy;({(U>5V&d;9*6uF!%uy#P7K=*!TRNk-MM<^M83_4*E}39-t|79t}-q~qLl@$z`akJqbf z6oBmKF%#B;IMLQorHrhQHTIr8+dDQkxkh#NkB6ZbJT5>fh~l?Y@=bj`9R-wA%>-t* z^VdhdhWs#YC$Lvlug6MM3X_|nRfc$_8}?sXJ#6rCyvO6)HXhqC%)ER9Zmbh)DTp8* z)Psv88;My1cYL4IpKE*ZSbz~3Iau^V%D?SqnvJxS(KG?9kyTpq(=SH%>8fi?{+JT{ zg%mBNFGz8{<&M@XOMM3z(Anh5r1 z8z1)M)tqtPvG(-Jdv@5b&?y3Xzd`W`^gaKlI-2%om?djUDvz;K&VTFP;=$)HdFbA$ zCs7H7njcf8dVQV!PJ>!H2sv=F(|T<3;Za{!^*+;D~VU)(=(|L5O7jUCDHx4 zl6d|*Mza#_{v{Guz`4Dxqq4PY8TMgGNgDg8JNxI6qeuO|{~_W!35ipyxtpTX-@Ywmtq93scFN^&J-8(rTERxEyvF&uSviL$m) z7>a~cO*zyGacsj9&R||zh6_33YM%q*d6h8Os8>^xtW$?$#t8gTUo7!2MeGoQ4t|Qq zW9kj*7#3V6rK&4_^~l zN|g&d>anM!mk7H5@iE~J9nX@;r=CFCKf-9j7h`UV!_9#s{?GSo{9=dqv~7{6X+7Tj zmD^qN>zT0)=rWQFuTuv{Um(xsap`@%@#C+Q0|fBDTB*#}>Ru_+ii=!3>8_L49g9m` z{*5E&mr{A%Xd@A7ukTg0^T@#dGb3B^+G|MTV$u3O7XJGAK}ww4VN%LYneadRrzn7| zsdeH5JTGpoVEs^SCRe0a<5qQEp1oUg8r4114>?^F5?jbB*`BNY^R!0*dTm6moU{{> zd)vjv$p}dSX4&9@V8LT>M7e>bNo7Z)aj95-|D%_E?pZHu7E6wT9c#mLJ$zdXgopBP zD%_2@W6<$l1X`x!P^w?C6#JuCsgPff^>NPdvR=08@`rj4K}Aa=H;3k)wj{3@(@|Oq5eVPP3#QcWtJ| zUKK2XnC8dZQL5Ccl*nX$kn7*CuytDg;bk$gQ^zx@RCyJ;MniV5fMz8S@9KR;OR58+ zm)GJt)tp~OT>nT&4xE6%QU5h+9(=?jL=kf7vlvsPf12cM8bOC`w2)DyBWqi_&*gyV zh8wTWA}NeUuE>BG%IzvwHoBa%bi?~9?rFcmoT*a7R;fw&6-`$$i=0>?eNwrOHXtdDu`f3dV^KE)qyNwLr>-C6hEN67lC)IkXW0P9`tjU998Z|KT z#?tVuTL4xqPV#m=AuoxF+XxJIFjr<4p{8EXeZH?!G8->@S8+&-UZ*s3A}V)sI<4Z2 zzrqxk_WPuvgU$GN8N!)Ko%_6bxw|sEYcFn?47`g8c`i3*V)~uYWrCP9w@N0&cb%_C zgwbp6Uj5RHi}dWUWgFqprzqqzf<($wRbd{K>4UJ0FK_`qrWKIu(L;>ei=nb_X0s>? zBYHXkfZ5*VJLXd4ZPTm?-NT2rus+nu>*}v{bIcz8voAiSk_1v8{9+@F*CG?IJ<1fJ zQ_lc42Zk8X2oWSW{M^)c2~Wd{)lIa!Gh4ExaIM7tg7~HZO(NfE9@D65INVL%D^t6a zoWcVt{{AT4CU>4lNBJPuZg~-4OHh=8Fh#t<7y|8}m^g0qN+Cg%t^E54nCpuOo@>o7 z96aj0{sJ4fuYAc^j`h0o{_VpkAQrfZT}71pLRyC*a8$l9P@|pK64~kpu8qP!!7w^y zlS`+5f-!F9^Z*M0q?8(IK*BSq5(tAlm|{#~W(}27Bw35L{)eICkoCBv#ti$b}+an7ZMf zV{0-AU$QmZx5V&2l(j9S^3Lb>2q8r)z8bd$>u=ajEx^T;)Wk@1pU1?f+dvnxrnaoa z!+sWaX7@R&&+nE|Ke>9|>sx@RYd79O7BBtuVi7<`72aEQKK19tdqZrqEbMWsPyNd3Dy>7iL8m>2 z-R`WQRQ#IL#XeA(Nbd#c1{Uv&%l2|_gQ_rKzWX!UIWVFnV@1mm1MI|~({SjaS?&{-l&`ba@LE4YfZyP4^&4kZ?lN$80MSypo&N zl*~LfVJ#n=8_R7jSA1;}ec4EV;Ujr^;Cc9CXXDQ@+(6Lg>$p~D_~YhkJ3}x!k^ct^p694AW+`zKjq;c=t#nrMd7YlNa}%n zx=E0d?*F)HSeAQ9Q>s+wd;{l?&$%`)R|-cb)jwZi$DjfIj@au*y<4VjS>KP+UA_0V zf+W?>TL2jxW_q|p{7LaMD}@nAw=gVXkp-57DzTi~*2&ah^Hqupcs` zRo!^*41E&rxympdPV~$Qw`OR9uN!Eumjy0{MSEzf(TbEd=={f4S0;SEQnE~lpWpGk z;^W&c6XQSuf&jfTh7Z_(99miG_2h<>dZtgh#B*z9is{Ot&C~F#{QgGuOpBD(!$&@U zJ1+B(lgZyW>=MjQ+?ior$C`-Cz4GHIy~B&Ihad~))*RsvM=&p)opfLODqcz@(O}@y zOPV^eGJ#a@8()Myb1i6kk|P%xKW58O)~{)tkyS4)<>BVDxpX+uwee>e4)ef<2>*Pt zVyk+|d15KmU*;P@^E_|cFh^WYPL@0GGi#r9?4fb!*oEQ^Lzu-%ZLf%h8MxIx7P%x} zpvRX7Mz`y#zqP!VuV&k|3)@|49EVPN{DgRI5e|O$&?I)3sha9Imjy1zvgnZU@NSN# zKevvjbj`lBIF}1mPdj5e33leETIPpVOYZU3(;vLoo4AyOAtYrQj1zk{gNL2L7C@qm$;p+}{-%x|7kv!He~0+@ZqEH@nc>ITBmFerK>tU{G0TY+Q|68;*LhW7Q&eaR$!{1%=4rFXIwv{CwtuSivV1| zr~E}gQ5>denA!HlO)o*kt}Ke=nM*rC5s2acx>s~2xOA?n4wjzLnJN0~0iU5Dpypn9?^P9pH>=znGp^b05#g1kb{*hxkXj`Xlr1;~R z4iUX`?0PY)u_p`J&+trch)SCQbtGv06i^rCxx-+zLG7jZ(r_F^$Es~AO4^A9E;h5Mr_Fe5FLr-$RY zG5hTj;gAPhKF%r|BgPuSA;<{tq~gD{ZENWn(|F?J^!z10d;)ou&WZ;U_O%Zi1;IUp zeiHO~*X=;J)A%25o_bCxns1sQpl?ybqR9`d#{Yx;8^p|JS~a3f1cXRQabwZMH2<;U zSX^}p_`9L+k71ecd%83_H`jgtXrzJa>{6vVnfu^q1vFE5{c2CFZf`bM@j1Wd)XJxZ8~KQW)v_?fIQd;8vr$4Z%QF|BTP>wsrd zEX-;AT>Ka+E1fKS;_^r?#?}M#{q<`jPF{p6S7p8IyP9by`%a0~DO)<*TI{x`4%+DZ z6xW1$sH-%2nWXxORpPO&dN0fF5aVVk9CAa9$*TZWLmT7pPmUCw3Dd+2r zpBH}P5S}--b9zK4&kxrNM|xAAOCAdi6I03%`Ok{!O^DBgTOoxF4|a5D$d&n=#Ni;7B-Tx5y&_l>a_cMgF>RJ%i>qBN%Ku#MjCMT*>*(s z4px)qzb0d32V%fJD|?x6K9F;*3%k$AMBQK-={B;YS(b}CnFJEQuBeoVPyMqJtCJHL{ zh6A(x(PwqznTwYAr08rCncI@j>JF_$#w@%RrTUw0A5kRrZo_;v>7>OyUn^Qv4{erl z&m-q4rJC-Rpz4hgzW9}r4J~66eG$JzlWQ+#cbv(^8f#A8oLKfcNzBFb|6BWLi(R^8 z6d8DJa2G`Ss+lmobb8r}qR;Pa^~7za;}o%zvGPk)A4QuzfV2|H4w9Trx@%p-8;IGV z^^?5z_Lnr@ab(}LldL^d`&;8Drfwld%@Uq*OR9dcf$j*kOh4A0Hc{~gGYv5*q<^fKn5l=lO-suhanmoLIlRJvNdz>9kn#Mida+|>)+RNe1lYG= zXK%IC=rFKMd0y1TBd5^^Ir`NqaF`BaP+$FxL-Q~Sv%PQjgT!NBz zfcq*^5vZmmoGM}+3PCzs^tI~v%!p|`u zS?~56=Z_S}PLbN^=lV=#&CA?ip&5lT--5l8bH^zCruE-ANs_wz0<07dCCYb(o29vQ zo>&0KmQJS<@o5?;t>;Oq!&Lj${n`K;JiOC9Wi#B8o-9DAQz@sRG1YmsJe{CKw6 zla`NP>+aKu3^=2OJX31>9MSHJ!){b%*0Q80Z?~VHy%j|hdDr7MOuH_NkiMfp!$;;K zrP}mo_~ypCq1^)RxYJ0EaK#_u4ap<(Gg^G^1E!C!eNiHE=vEz0Yc=6iyuz7Wd5S@XjV?6wDk>C20T|moTs5 zm}y9G|GkSJjvhmzF$;`n^5$Q+c0|~+kU&`!J?d$>#c1dFkmQI5cE#=+Btu*j&DUl} z(JyZ25@}jjif6aUuup4(`gd+Sd+hk6znCeW@{6Oxvg=16+{wtc^(Pv(cnc>s8HN^X z0+`dU-N+1?^_KuJ<64vSRN(I7zb;dy)%h9o)#htb>$a+O&KOY}5u`m;YHpK+`k1;6 zn2}*pV)ZiXsk?UGeA1Y|#~5cYgpD5NfLy|5OSq5i{8ChL?ih@S+&LYK_>CjHk@=HY zqeQptb9;}r?!I3KO^)n6`K#)pa(3Pj(5Y?!+R|MNcvJdz&<4qIf79i@bXD(i7r2B7QH`u$1fPR0a){7u^*CY$>g}&wyUw-|E2 zFVGp&d?gX$Pi5Dpvf}A6WY|XnJiLD=sdMI2HS1ALHlOL zj*&iRl82$oT+m3dDt+~2d5Z3Q@>8838tbSq1VY43(h*{}G`c78r-We zQH)fh2+M2VIA%IkiR_Xx5kSMBTirYJLcw_XWm4uY=<~`D8q6rx|!W( z=U;jXRMyuJYdRhb?#@&PgE=i)!J5j;r^KevEu&KRFBM)~C} z-i$4u@XPQ!D1re}>WcH+yUlCc6AmwOj6I7_8->$_Qw=h2@8XP<2cX|Ji0oKHw))$* zOfW`M>eG%kJLs~@PDdyCZtdr3Cr%q)zFKvC@Q$sd&h40m>Q`rjts~Zv+ef07NL~84 zem_G$CG4DsJN3H>hgWZ8N2feM3O?LGihN>bF6ts#X6|}2GS}WX@7P{CXXdKm`ix!Q zRnNgio&fS=sI9{iU_Cf3_ z`^W3Vt!!An-+Up7n7VzQO{vMvNKD&f{@A9SAqa$9q7x5PdJ?{YX!#D?M7}H)$b?zl zgfZ(;cxxL)!!x@*p8Ik1SEC#lgQS*z;{;DljUP`g?r~Qz&Uaj(o9~+PZj)nnw`Puu z`yBIsI=P%=&5E8_*7}$CkNq>3LGOe1Lr&)Q0xL zNVnJ~MnPdXmiy+l0`?Rmx+JFeXcvQ{UTTU2@f-INbPGWS-EJNfT{rlb@)1QZwyMUV zBGfr)4kaVT9>z#PuCYRATf{y9DXW}5SKcDO9ienV{fB$?7x~vKW=2W|p5B3|$Ny_p zCtO)krT4ClDj)fHLy)P;F zb(sfH>5-+UZEb2|jvd<`9NtvT#OQkO6A$xkbl=RZV@ON>Z=9p&hAlncfBMQm5x=%6 z#m7D-w6nHuzDd&VqV;8dA3w=`t6u^hp1Rx4&D*lwkl5;1Z{^!GV>0U)NYEFoX6;K* z)*>9NlA5AMA#82im~UEqk0~>4ayq}q(P_XjK$JATD6QR6=&@J;Qw=+zsK=B6XgKZY zH;&=^zO>8&%Oj*6T2v~kZxh{n$&}tz@=OnTws(S@)i|j@RE~LtcB#ohWm+$Pc}zyI zT&tIPL*J-=YT#eBcoK5s)|rS)E-(p3<5JNShlpgRe-aC%H6(hMOvec~A_mHyygfEG z^U>mZ-r#$}oU zU3lH?C>rS;$YHUb)Tzv9iNC(*ne9(4K(7cmrsy zI%a?65m^0GzSrjE)H(S!EmXd*sG<3d`ZDwjxD!f&wWv&yyyO-N4&APMwU+8`19`K! z9-k)XD9C(bcHQK=sNv1l#dn;#qLdCPjc!ROoz}uyx5eFo#3$JA$9k?A(o&EfQAW^r z<8lgK?A>}#!~&C$2MmQyv30 z(lly?#@{$;XiM+_jK*_c;#|sYMz-+@@!rXVe#lASq)m1r zsG%6O9L($kZgq_((k(d+A<$46aBciBU(fs1S>Lx}Y*Rr8s1tQ}m-=jWy)#q0XIi$1 z7+VLNCnEc{6t*hqL@^aTvkIH&9?OEqNaIc;0Y+HeiT})RoRich|A-0O-9GCd&`U<{ ztnRJLvAL-W)MRE=x8Hb-%Z%iXXn2O5)gy@#t1(;=uDXT+P_5bp6S#m*F3qm&6Y18= z8jqN@&pdrSZ+aqF6I?%uZk2p z_CCwuu!)^`dyzRyv_!4pWMk3E{4|=T<;6skOsMIleo$=fdvsuTi9M~t(wAK zwSDRoo}Y&hbZ2|j!9xbRCkAaKxMU>HY6;rBhdGr^4~REm?}#DUGazQ68!LP%&EC0B7pAFuH>f zu4vaQ80Jn_4NKn4v~_4!mF_1(T#)?sAv>vD_^3iLCZ?d@5+J%3jj3EW7knhkA}x`P zg)OeF=e@#G(BSoSWlq$yp5Ac}Fyp#TO7~GVu7tb5$pLNSZ}J%Lr3jrTog#+e5FxL= z*)EMAHxgu-!@>y_R~T>wS=or4GAoE{(si$!->p|FP8J)5 zsKNc8xlJ(PmcEX{U_S8>0cUZMnFii#WualIp;3Wz+h^5Y-HAuemd*F23d+`s zs*Py(GHbTr>p>4h3A0$}WPp)i<*9Cr}3f!K8h;;W*ih)>hOQT#iqs?sQ@{U!;~XB9`A7Dv7g zGWWMutnwlzj7v`v=8`75qK!5Ei#<0DCpd#`_YzlQFz4D*hh{62n$$1r!|ieT4})8_ z(nWn6wt}Y~m6}s*2=Zt2y|4$*8&(Mt1Ma})#b7C4e6W( z^`%YKwowWXmrWJs-exx03_0c1(|(vg330k~Gh(VV!W0Bib39gbt-mf=Iit`H^>#Vw zn@UgjZGtyGWRTd=%>taMqF3+V`BJM>&Mijq!?4Cz4UiR<%#G*o{FkpG4GM7mBJ0n! zfSRKxV^`;{I>q~O%v2~hzCUG)j$UzOaTn<*Ewro?yi`W-bu(lPU@8|%Y)JC4TM#T` zd^RUz!FN)7@8raTm*2_KlTs`dFiNKqj4V>F*Be?J-B)0~+R)KnDTyKmWqQ-9ytMk! zWrc(+HeZO8(g{}70Fu|=U?w$uIMoBGP8xIOEkLrE+%ja)dc%$=in~R6yEfWSIhx$`_&Z*6wng3;h`^|Zm>n1Uz|k8_#YnAYOcNv9RO5ds&M-p{>2Zj^w{U*O_4;v{KM z=w`?6QHl9}Vx=$RZp)sxrMGv*%x!XMVg7gC<8ZsJ+l27b8IMw_LKo+Le1{g0% zHhpIiMu>>WtSNPDi?thAt-PzYF`{#a)?1PdL3PMwr#+O#7>XUi74)qfM~TUmjRekk zbZYEYS64_<+d~XNRRtlKfD57MNe?GmTkRw;U!n&40H4cfS_HZqNT;z2NB;FXP3q(G zl$bqW49?U}d)ngtEUmuL4pci2Q2Y3t@XUrfs-O_bI&OyV z)|~I8#=!L|>$?xoj=I($rL@19)4a-uH>dUbPUP`x3{c(GUQVhCmEQ{2|1O#aI?M5^2nk;BZ|sy|Mcfzn-NBCV`vcuVAKaSGd?e!8u>&` zl4;@1e0qm}he4ihFT-ZK*E|K)*SG2f`QHY^E5omW?=^%`;~cxynOoD`KpuEJc6dCX z`cDWAl-`FWovjbK`e90sT(?TQ)=Cpr>FYHxT&=T(fUiDfaQ)eYZmC#l%eb(E!(T5x z&0ZqQ=XPGp%Y^XtS~@%O?R!*Wh@y;JODsidJhR{Qd}%3$DSS2%jE`#zJ3{%y6s%cP zJAbGSor+5C`L?(>C*u4}J#cNvzm6fMP{a z#D@kyG`O9|`{(_WhbO*>`Ua`eB}aY6FsbEoulm&~f>B9*s?`YLT?@UP^Jh?eQ_R8{ ztuy@|X~WxE^+#zNcL2Ut_mU4VhOX2P$H`}_;YijmH9#iRUs6{zwqgR+pj6lE>-oLk7yb( z&i5n-XPi2>-t5jeEpa*h^pRYdT6Q^qUL9qFl8Tv0;_|3;Bt+GE-`-D(5NyG{PqD8S zw*`36GtTRk=-~L^wHpV>zw;S)bGL`#?}<&A$QPd9Vmope|LC&J!HN#CS=@6Km@c+> zDtEK+YAaUNmmFZz^%9|6?#a|i?67}r#K#mdKggCXq~u-=ey(m29~28FE7!O0(}@Oq zQ6+1X;oZ*Hm(he<%slif(I;QqtP~F6lUvs8``1~ww7KqH{NuOd1-5O5KYeS<26B>EOHd!{CXoFXV^T)@_{wc}VQ= zXEU;0KU7;Ae%bm6I|JqwW?*RRYI?(nqu#d)UEnNsuIKz# zvS23hTYsGR)g@;bCNKBegKfo&kzaYfV{aWz5vhLt9<}e(>%I(@Bi_ zsctndxNgHiREB-Ryv~X1qWb=H7Uul!wvdfsy#Z8&=pM3W z{Uj=TaZhjW|FL!6fmHqf<0rH<$llrEBIMeH2-$nDYs9?>*{fvly+^X$>vHW8%DDFC z+R4t2jLd#V_5OU`-|zSL&*^sJcJFze@p?VS<8ed9sS%*o(G0i*^B;+uv~_xj$MaM- zmUMXsnZ5^C`lb(5Hr@SZhaBe=$au3|);%?mP)TQ`T{S)D)AE;WRQA)^vOkIT&%|y) z`U|V#`u^wf_@L9&xaH3s2_l+gZY3;DC;2#|kY89o+A=yZ_hvB#1;W)oD+byskQR+7 z2^P`dQ$hrgX($O9cTZYeVaF{WtPxV_3F`%^{KDE9U!?0Ld@nvj>e-9yl8*{I>%)j? z%~}-dqw@%4(};umh-f@Z6?)D;^8Pcc``$J4dhiGpqXDzx_CkMu{sm}2S@2X=gJWM8 z-VSdW)<^ZK_97cuacCL>o>?;)K8W}5pWv6WjU;6x?x<3#r(CnZ8$S%}TRw8*4j(l0 zrK{bnJlmh_IkC-fO?IX#nm)T*UuF3{`TK$5&OpzOwTl6vnT{(Yy7PX!m?D^Tb+tyO za_|B2wf?QD>u7-oZSmG^bPne@bHUa@m(BDbdp=LE8e<*8WVAI3X#O!thaL4=yW&{w zd+Ah*Y|e8z_;|JXPFQiOawwBsH~gSm7hvMz_$E3a^QYFAogG_9g`q3l&EQ5Y0o{3% z$sLh^7haz$z3!vZY3q%9pmyMSOE<4KwN+<84CrVp=-kzhF>6Yh>dTb-jMBvRP9L;; z3L`#)I2MUwgOF?Fi5+I8Yx$D-^6<>qnb4Grj9dcHxl6_)3C9!-DiMd8Gx?8pMLpZT zm{;$^Y8WJwi#TrweMl0s*Q}lx)~>qA>T2NN=6dE=;pHez7MGujUfTcpMS|=M4Wt8W z>8tW}&ICiUHVbHWXn?7ga)kzuOFVvW%BMENO`&Vs*S<}ZJl=G5%2Q+1x3aRb);Lv$ zV=R-TCd|uq9x zGJD7Y;a^!YHvZomA^+I(LMEVg^XkO;g{6aJXy%MK-xaC0yoh(Yu|AGu@8 z(;LV%-Ddr&!ooPKro_+^aw=TGecu-a@LDKPUJlh%AE$*yv`}ZMKer~0%9IqrKZ-0K zS+Y%ZnO_0}`BxjMC4;_^StMHBo@<{ccD_l6RL ziO1kF7y8l;Z}n}KB`5yx$!=~r(|omk@2L6V(Y!B}0vR}L zW5G3p@b1g~x2dUFPSxouIbJO@7l=744CJWM;+Sktt#R&$W?>X}Tz?wi^_}bge(r2P zZ2x9SSeYO><$7u-dq__#?m#)tBd(+dZ%m6U}8I>hH0?CY%FQ`-XJS@!&#OAoX_jxOrYrQraB5 z=_p?hbSrLj^%3&ZX_zw+(Mg?#1=mPO+i=ZL9Ts~h z;%(ws+PBcy=OyokXl`#qu>;4f(IdJWF7(Dh^LHePiKO+^>EWVP)#-}bs6zGk(p(OEu~lF;KopdAA8bOl9_y#+?kNxl$=oGNZm| z&+nZ4fS3c>w|U=5GkvEjKf>*NZ1Qfh#pk||QxBDPi2L0K-)B_zP7*3JlJfk)q}r6Z?0naOX+t&D`OsQ3u2*bo7vS?kR)Q|%T&ia71^FP~9)9m*d{lJ{o!26YHXE5?& z%Am?)yQsJDXQ7{YqEI!TaB2sO<*QRRbE|$a)#K3d@Nsx*jBeE?-UDw_3Z8?)rvQ+p z-us!4n39%s)@SCGn6_^(H>#6##G&T!<%v7;IiFhfoKh}cCsFF()t!FX5oKIlk zdhg+f#uhGsqj!lG*&nSiyTZqi%8-7zzV%Gs?a@_L=)?PZ5jIfVH~#w|+f70a|L_rr zS8r)d<$cgiK+0yX836Llvcwx2196D2ULqSQ?z^+ z-}-sUu(iEyzoDY%vhOrg!Wl57H=zBowCNk%Zd^FWmAm27K|g!@@x2OUP|JJA?)WM` z#5>PzzU({J_2Yw%kRaAsK5aW>QABp4a#Sax(OAoq!B!$AAogaYC)?9b0X5{pN&z-! zKqb)rYfPSxHIal?lH@=8NLo;HPv>_>=fr-LL0yhcr9GCC0AxHS#P2%rWpx_Fs z*3zZoyX)1jwx3FFLTWTPtERTDcbS3(EFBx~SENf+2u9J-oT0VxO<$cgmf8>*wb!fc zDPOj>u&@O*JD+aeXT~f9eQLX3zydiq;ozb^e0%fLvzsfrpViw1`SWGtB%jzf8*^C6 zn8IOiMpDLk?|K(z3-vJFBG}EUxIHSPDmWb@CfuaXp7Po|mqwNmQSWrH8AU#0SfIX! z^)8L0Yu{1pS}t=t!V5oDUhzBHE7S0pR8XyoUtdwgHSzW4Q^kn;LWlf^PU9Yk zVPa~|b%upk?c0JuSMmj|y6G5Iuzk&-To!!V&K@}*U-@qk=ARiqZ%zG=#AS}@s5y8- z!N+4Qgq`uo8QS6@)3fU=*C4U*d6QRyu+^>F$eKst1{_sXbzkmvcZwBGm8MM76m)Cm zRQ|%cHGik}*#5|Y%E4XnQ+waJ;;ynAyjd)Fn%%=Og#AYzP>a07z-#f4x@3t|bi%i~ zetWV}XQV>dCAyA{NV*p&T}jhD{dxF+aPS~CWQ~XNcC{^&0SvZ;AcK`@q#@QQahPLL zxY_;5H|y=~9$N`&`*>-gOW(?fdiSOrD+NyqnV!XPrP1;E|&4ACg- zWfPsmn(zaoED~B~3Z#5uZZ5BqrgdF$Zaer0R=O=ub3(aDALf!0_&wU+p!JAq`L;hX z(eCS)eU+9kQyRqK|Jf`2KU;1TZyDUOYzH+#Mk*MDHn_+E3`o!ooa0-KvN!IxyL>Xx zYh>TkZy&eTZLTQ8)kT+cpYP)clwangRT5vE^W$s9>M8YI>9lxnt5+lTI6_gA$?-(Ep;Fd*sCEJ!-YYP z;J&UFMo;d9jzV!pCLeNx`gOaiH@1QJRFR1T&@OJ)Ms7`az43jkgMlX(XHl6E2|-%5 zuSvwkL7A&TwQt`d2fN`4$Z74tIPwa(JCt&0v(Y0dQyh2IsNLP(pQ-#FO^Da91p0S?i1+Sx;(WEfqeS(~OI?5J7<0bjdJffHr8#d(s2!c;yrc?{aD+3*fQIT16Ui$nQr0`qDy2;H1}KiJa=N%*ug3ZQV*!{y4eRqP)D`ZkdXv-7y@-$Pc?h|W!$ zizrB&DH5Nd7m|ZMokwYf?nmQ-Iu1Ge-SwW0HXiIXPz!?(mDF!cp1Hr zsMq|e*0!VpbxgNw{^%bw{baF`I-x#FSOA-kv2+T)nuyT>H3wwPMzHCCuu@`TbdB%cqN; z&Hui*_kZ^M-=F!vdw}1{bv#Q74ShG8wW`-!M-?~Qvuf#Ff47&oo4{Vf`NbNLqQj}> zD4s1?&7*e~iJC>UqbpnRMcxjE%0zBo(j|FJU}V#)PQ;d21WWm({3YA0xrNnDsW}m7puq$5 z_+`;_g{vNumM!nF3PXgQ;CeQ*PV%F0-Q(vkI3ecOjPzNaeRzGp)I+L~Q6UV!uD8}| zs{MZ771{K1(VbrCfn1Llg%S}mT!e43XMYWe)-Z}FXrxe5(Ggl}t!B?x1xfrXnC5Ut z`bK_9rezA#O2Adks#d?jC+V@tiDFbiD($12)c{Dl`DJM8%H2nunk2|3t6AO^g;060 zoviTZ>UShtytyt3a(!Gw-o<)CA5fMsa|_8igmT3b^vBS$t5kQOc>{-q_KxL~_Bk7u z%KF6Uf`aj%*7jbhN^ZPq78$88_@j{U2cO*v@U%VEewV~gMAw)77RJ=_H7n)Jat)KZ zVMm-lt##^wi(-z%MJrSLWcp|~Dk?^ca$UG)Ra0%-h))8M{T_&sTbQqI^cnM6GpyD{ zTU?*FklRQ0K|L_HUs%HqzpxgLE#1~D72(ddM+QPDk>@E>O8JYy&G1oMQ6#NfU-^v?d<{Fswr98!IKD<$K1d zCZrWHriH{ZqhuwXR{JD>?*TWw)gNcAYCH=cnY3?AHTJFo?{@br)hA3ivlVAK4+e>s zz(6ZCP^UaC_|JbtI-Rp$0Wy@dz;@SuXlm*jf0xWU!^2$X;?bG*b(g(JuD~yrjtH$} z1aOOPtrj7zf35tm!H*+mj82+g(-ZN5Kank+K{!YLjV+4um3-+Nuq`hlf>(%-@NmI| z_Ka}iM(FG3%k<2#*h9J#$lge(QXiO4v(FAAjClOe3{(L?-ftgMzj~{xfwWR|kkRnO-1UuDx^Cw!#4V&PUstNPl-rYj`U;kq zhP#uBlZtcrp_8U3w^0i%Vn0mX=*ls!mE4d;iN#LO6Op4DK35Y;ui3ey@#}-T$#+xG zcK2ARGF!j@9GJ(9*t=PS4amx~Z=~<`?M9nAy{$g|Ire4sd#!w>0b$JCaqH@=9gsW( z3XzR!^nX@=A)VOieN9?ZX!d=c=oc1wx{OiMk)O4=kidHRlxN-C+Rm{_t1izla1JnK(WHNk(MRP( z1Ino^j7%4QKHG?2nA`0GI;)2V?(bGEz@RZF5C$w<8Z7!&-VnAC$fCn*(YZ-kmFsy| z(i{bZOSqgwT_9OE(PC{ApbkNEITjWc(>NZf(53)&OBT;t5rIMv3>6<=mAyHN68ZLM za@_w1{C)S`jowZma28)#oZZhSjGk5?{%jXc_bsa5kKS3neE)qXSxkMNp2x8BiTm&MY~1LewDi| z^o}Xg4!3+#rn?tt?a(#^w_ha7A(>2?wK`S= zkMT!ccIzUKA85%Htm2n z|GD11i=$+*ih8AWyE(Bb`(r40XSYqIJ!=fO`EXW2%gX|QQ-G}ft;2nX`A4{d2ybqT zvc_U3wgaTj+rv)gqGaBl)vVaQ%+1{n17jJ48Ivs?yOKxL?Aq*#*DjpZf@^|ZQu||? z+B|Bh_C)q9GSfTHMOKmL;^%71Zhq+#ivqu})*EXkK6C%VG6d5FcSc`gHI=oY$2IM< zVR*l==%^$cC+sTfHZ}@$^E!^Z; zz#G|@c#%BS7u_+~4#wy?d~*F_IN9{g4!mA@?p9r~KBF|bz0=!xMtsYay(TA<%5)%8 zOC=i7DQumQ@EurtjF8RRP9PFF=^@_cRW zWec*2`3oEUA4;C9Hfo!a5?j0QXBFtjF$wWmY&X#}ZxSU(O!bU>WO*k`wEtx8|5I-9 za}}c}{G9D2V?x8|mJdZ6(B=z0IBlC)hO?F2Chcl)agxd;Lpn=}gGBp0Ah%PO7r6(sJg%EcBAN{O*#%^m4W zTbyMssaZ*!hTa!OW5gkni11qZRQnc`=*Ju6p(3*_MZ=KG(b(wi1<{06lYQf zJ1@~*LO6+t2zmBOZTK&#YEG2S1zs8ud|6ek-sAt+HD|mAE|W0$s=c~Xqw?~o7AO&3 zvj6hgN+7awrgd&$sWzl^!@d%7G$KLR@(W98uBQ2x-|0g6xwxp`cf4(Tw}p4^>AO?s zNh2`d_DdQA#WP#iJ+KJm$j!9IfuzEKEqYQE^P{#mZqg|87Z!Ks&rNTWJ5=qnL4!-K z@i1|mmhX5p-j2JxU`FS`sS=ZGQ~l#RKP4JFtKq*uc7` zmauh`IL&o-_xDs8sNDEx{I8q=A*jL;mq$0gIn|&Um@#x#9<}~{VXg^21vm`b4*K{g zBf&G!qX#{YNfXA6QCZ(yJXtuKS;!s7arD3D+*1rK$9?1CydG6d{ivDH;+_*RxgEz% zc(g~2NWH+jbbM-`V&rb$tdA81pLAp?E}xJHP22Xh=EXzLP4=`7-z$MrXm(+e@4vd_ z|8{nBLuBtX$uZEzm4!1U0hP6i1=i+t_b%0u=}M8Pd$j+--tRU(n;?Fj+ zDeTu+3E2d}c+I}udm4Z~T^u2?Gt?{)dQ;v_p3hc9O=NR;(%Q=kTS_VbXhi4rz%(r& z&e6tDDpH7_azOT3i1lij{)`SL?QrX^PCkGVfj z&)sR(m(8rT>y5L%<1@7y6td%+egrMl6h27&bjAjWphk&1BDfn=4owoju)xjK{51w@ zFU(z4Y`|@db-STr(evZ|Ir%^UJA`Z9!HD|$@%OXfpL27wFfKZrrtI+O&wpB!q3|_^|^pua_=_fT5&*eOCi#&$a5KpOQ9?xR$o_{0ZVWyO)D5L z*bjQO);Hy5NsM9UKyyaI61pi=`ZYs%5Ii3`8{!Lqm5D2F+CR(4iNYS+8u5{gcu;oz z$i6ly7D}FXn_)wlqoxbOnQC0~Fr;meyX1}fY{8rp|fmPv00glr0sW2*NMWajwg;Dpp01Ujay^S{) z)2NW8kcsep4sFJ+<*CwpZuxko;HUH)?YdL(G^HWkcSs}tOeg2s3O^4K5m80kjr z^4+IVDd3BY*tbRgW}hAy^8Cn+s#3(Dp>z~>xmLpkrn0Q{`3`NknA`rs?e2bIWqd_Gga^4;Sov86*21+u$tHHT1*>*;6Kp2j)mz5P-BN{4hU(a#V*e}Tsey%>9 z#BNSiGB#uD$8Alc&e(9blwavBc6jvxzV6Y)sw3J@9>d$6kf`p;sTe2xBNTNwvWItC z(?%9miUXvlEW*z?&cZP!JFG8&Tx7p40ujKu9&5~79PlF>q0$HAHy?TWp2Z8Hu zAq$8jlFl{LqCj?r$-E=vR8pvuIua0`MG8M1;vg0IueS9ibcxys+mgsAuYTdGLzN9M zm&E$k>yyls@$m4C=TPus)2YbD+%NV~*p}2SZY^D5X|W7_)eMiS)iyBFvvaYm9#5M1 z`?9L%c-F}7z_qH}+%bYEK91bK{p{ViKciP(4V~Rlyqkeq=*->tS-SR`_T4tpv~Rz# zPPs#OBO;W$N4sIP8-|z`@=iYg`kzTId#As!I=mqf0qL$kRJ#;p;(gy)R&6Q;KULa{ zsXG9mxjrcy`s*>8!lUMq0lrST?(L0WUJ`~%&v#MWvje4scWb*k(s>U2AyjAkz_N*Q zOk*k>-1yJe9uA8}`Xl+zKXd6Z2UU#xEt*l!| z=qoUfp(8j+K`|~%y^77pJdSFs?TTHKSr( zd=UKNlxohropoQp(rqE)tpP;0uBCJ@*LBWj4+ZB%-Tw0=Sh^aoiMoyXrxES@rzh@1 zD~ocT6-C-j!f593@_u}E-n7lI z^IG@xDEHLM2fe!4ztwtjZ&*Qk(R>|xWo}d`KkCMb$+W~0J1&krvbnZ6yo}PH{ySD< z8C-q@7d`F!6DPqtI&$YyZak)Ert|H5PCb0reqlYn3KO**bCmtK3jg#;T-_vqeH$%{ zx9Z^xR<*tlMbePXOMZRQPAy7)DZVQ%mu6>)qkaTNeZ?Fe|Jm{T%}rLXLQ+>hW3qQ+ zwj(|fNbwWQ^@94CfO^87)SH{Xum(#9Z95ln>Kit9=&nAGRtxY()A50Wi*)t6S^C-S z(oVC5Nsv9#DW}V*9*1{}jb1bT;erO9ozo7jpG2^p@)MT944}NE$0N z81LCeOW}lW9wIb}d@JzXtC-lO-8b>DX=K_D{e1a@x}(W)&C}#-J%?X9*{ii!1c6(N~adEBw?&P2@_&N-|X8o=8oidp#A#mEvR+exldh` zvxIJH2HNbve7ZMU)aS#PogB%^e&;3jmk&pxlQjT8rb{5KZ1U;tcfgQ= z>R!I<{N3CGZ?!83Rc6wgGu!BEpYo1kJV5O;{;Y*k?UEs)Ke|16eWW$h{o1qOwc(|B zEnrBP9QAOijZ5ZyS!86U`-%8HZ<+sP{&H~_RdKuT+P4E8lV#KZ5-8ozOddq^JjrK`tiFRAz7V5#Nx*_IX5R5|X$RDr^UX9|*L?&4ZrR6~ZNzP6bWT$uI+LaMsjwT)S_O58I>3^lr5ZW~&uX+_IH4k0=DL2Ml?I}jjuzWRs z8cl|$@7Ww~30I1WH;j19RPm{mIKw>9|2|)Kv0?|{#Pg22WY%x@3Ucz}*53KLze0^T z@JwgH>Cq1)xnsWvPX za@`1)CzFa*xgSc}S|e)^m`Dp`wG98n72s{TBL=0-K`cM+C#H`SNFaqSeGZp-V=3xI zX>Q*=MOr~j`~j-&0u;%aa}{PODsZMM$37r0lwXu^J}^O?hXRpJouf9Dvw?95M-zZ7 z)Co)u_Rs}Xkl4wdIzuTq$r3}L7)N`8;tTj>*q6QaNPS%99u3Xw0Z}Xu~xDU zXF22oo+W8LMAQ)fm#TtXhv}H>ZL7}{#?UHa=Hf{znJD^dbA08f2=(@FXHH2_mUo)x|_nKcGZ0Y_0s`3K;tHPDoUreV&;iaipc8gV!Ux8!1B16_1{ zl2tIh*3iwS-}@-e+_ZBUXB%aWNNao#=fLnbs)AUB8==WB-09nc!ez%z8&H)-4nEps zN-tpL1*wx=Vtb<{ua!UJQ^Z!^O_8eNV~|n>+sV;))bVvn8~8aPuHjAz)p z6%a;t`TkRg=R3aPhgm>U2%fdrdAp0_?l#^h(m>k=pG4KSQfih$H=hWnbx2y(AST!c zn3JipJGI6L?{EJ{wS>^@o3`lBesxL0nW!i9C)vCS40SO>=%Yx;@O{74E(4bG1d?^} zb{8B+41t)V{%4G7%JK-`?W%g9h`*#XP~X6s!!WRXFC;F7uviP8caW~$o>2OcT`#SF zGrekIegj@Gx}g}tHI)h0u(ta*(Y-p6pCM-x@u2RU4Ku zbaU;c8Pm^(9`bIE3jp>0MEfIV3`M=s+;BOi0LgvzmdVR_4db^}hT%t9U^%QF7=$@; zG5jvV=SBEyyXPGII;!-!CP}=AOQ;@c^G(u+uoMDIH;x_Ke6T*3^x`NWuF|;T*M@c! zSZDoKS;5IMk3_=Z54NDBwEuD$X=kRC$ANO5O|OvbSwQZfIMF(%xXUGAVIz{gnzd7~ zO#|Z6_lYf1X9FPs@;+e}Vs1RuF4H*ZTczREApD;ZISdbsO0;Jr9c;q$7dB`(XZZRp zS9h}7h+nRs01c%bpXn8i@-Omy$Wzp5hVd`-V;XoBj9*igx!;eqQ6)CuEHbI^`ehN)vSwVqF$ug(fwEBrK{7) z84Q#cWZyA)TxJtXIN$+g7)4eUG=qEd7vmbP!5s)g-?fwJ+)l-Mv!xF=j^S%EI)_6aS`Bkamg2YqsJ3sdqtKXB zxJ>Kii+EZ#(L;cO^`Q8I6EaYDEc+AzA!YxsFRB*dV}M`5(px$1`28mOX{YPh6nY|i zJxL+nH|ik4u00V-GGq8&4_)e_qi9&s*J$NekX~HhON&<8PfH>I%*Z!#gLilDncRRo-K-3hLN`!02lNY z-)Qql4ww>KUydh=9{4IF|CU=>S{DgV1*gV(u7D{+SO2X(%1Eq_(tjWFmIGrqXBoGG zW-<5ZpnCQ5pr%wSZQyYh#jS7oMv&I_ULJ+`j!)MRy8pje*uU9!zoTYPeo(pZ?0FC2 zs__DjL(=PDkN#?2J7GvoKVY*s$ryyYfCPjTWiNCN;p> zfC2DsAgNWR0WmH>qg*LRZ6{yEd9eAUy~eWqY)xb3W$l!zEe`oaiuS1w4P6m+1cmN0 zWfU;yRTza$sI%8FN9SCJn)RkV7hoKPU_zJlKWoDtD-3Xs-nE;Fe;FXHfLI%3zDGYw zmx8*ta$==)d4YDB)^h?)aoKM!}g$<{ibw_|`E(RbjAeKRFTe`p9R)F%# zc0Hb_o44IJNwAO@^Cs1xs3*Vcpgf7kHUj<-k6-eZ$Q_cv3@Arg<29gK0n}ba`kYX- zFvAdNy3lqnEV!WUs|Lxx=53Ol;*ySkb!|ck0FYWkbz>hu>XQ`eV()!SwDVw}{vFn| z)rAuq4z-0O7j66rb9QS_#FZkVVa4w|0K_YKC<9?AFlfSgIWB>3b-O)Xn? z*222c4RZp_7UbsQe}~?)r>|#Iar9Dn;%1aHVg8~4<5=f}rK{_dMBYY8BSyQvr$K%w zrBrvD`pxVI7gH5^HL*AOlW3mX;MOS)9-i(uJaSdSYrUHVxE3YYIHb00*EREc@%k!~ z@FMVlRZ*yzd4tzIhJBZlec))8F&h{w)O<{IDC-G)k(MuW+~E?bX+x3)bSR&$8GfZG z(Jp9g;YXHe%T8~N8+||sptUmQtn+h*5;*PnHK!gtz2iK>s~_s! zDW-eyaW zFd5EobCNp)Y(}N{v1@km{z>o1dS!cCZrDQv#WUV*4dXe<3k&i zPW`OPiI4!jhyY+Da+@FhoXjDl-!lI2F-|!Bs7!RDN6>+=lvS}B8@rmEZ#co_4be6I z>Nw#q;{Z$F@5TT4CAf1i`p6Y92Sg3Eztdx7;$u*or6I&U7)U?qjN6O|0=JU_r%3+b z(}QH4L*avGxXc9e1ER^EEIfw{Isl-%Y@k4N4%{+6Y!vc$;qsgqbss^j^YXtGUz4UE8M3R)H2LscQB6?K$lS8mGi%| zKB7xDKjEv365??RHB1z%dt|NY;<8yM9CxpL^n>2;%&vL0Z3UIV*w{h{ci-OV2boeD zh{E-ellAcH&tLFL<>>@+zqrg|DsX3C3G~5o8VorfSw~5=Sp%1+Hmb}y< zstUaTq63cPnUgAQUKd}4e{npmzip~s6P{_4EXdGi zg-emt*a)|7#Iu)jSL2hKdZ|l)^AU&9xu)%fOqhR%J$dtUt%WuM$9p`Pz&wNAN~eY( zpiH}kg`Y>1#Ipwy6QnoXn^~E(BoiNURyxX~eY0!nA1Sro%Vm-vn_pN|4#q}+%=qs? zpD9W1>CM-0m~9D^%fa_Y#W^8(jF30Z)ejQVr|?Zee6Mm<;gq6EZ*D!hU<4voDq0RS zFCUWw?$P~-N-K}&Ne<%r8I6#`{q6Axugz#}Ic9HK>cL1np{05iV5wp;6O-J4+0xlUGTgSIEl}Bslzl7U zTK%CZXq1q!A|>2$fO$={a%*&M;UQ>l>ONA!uCGpE9lD&FlUtvJpe?}dScJu zAwrI(iF*JPOGB@2<1{uT9huWdaO6@tt8LXh6^`e)YeW5YsTH>p(w0Of4yXQ9Dmix~ ziPN^#_%PX4M?ei96X4wj0M_n9DjQoG z&{DZzKn1$D?T^O5$O;}ar(*x5w%o2KCpof{cBH?MtOt+?k{F;wS7y<(H~UPs8-Nt*gl_;gd`cw!l3#(F+x>g31(>#5~yTsvxnrW_-RmD5pm1G_q zvsA5TDs~a9U|kn@V(?8_y$(Td)u%#FKimHjNs?g zB~cK41%Ng$E}0Hx=PY!-+2Lyqsq8S!nKoeJ?Jybs#zItbsF^@0l}(UOke(rX8YGk|gk+#^gHL*^!fVSTOxFK8rG}Fe72_OCP z<$kwzfW=F9WxtFf9E~j;{XnD_LymfPX1SYFrrDco;#Sqj$j3Hc}sLOcTTT!=vVd+INZ-nEyCRsx%9US?6fA{16$?DP*7YSL_ z`J1DiRvp<4wQWi_nOA&&I=$bMdBcZ_q5>szUomK)e>bsu?!%BYXN<)a;a4j-OQC(; zZ@iayKq*dJ&YHN6MR2*T3Vpq#uaWY5hR&K&AoMa<%a#VY_WZYM9w@vlO;9gr*hC}r zEQIE(mb^#>H*c8g2e-!=jo*8^teSiy1XZxKog4d!vf^bTO~;Sf>bM+BNWwLDR557(!wY%%w9 zJO6v9xdKInS)@u?e(L<_0ogm>W8(0+MrlU-L;l-kaFy{U@Lyz=+a zgmz&jejjW(1j0RjUd%Q7py69V;JAvdWFsBhcoa|s1id}|2 z6t-<>Gd6;Kjc}e7b2^8N(LjFJAoIsZGu>(8$OqGcs!AYi3H-WU22750`M>>_MBz7e z`-63jg%srYNy<1~Sypb9(R56d_iSz6qO7OiAcffBUg{RwTS4SI9@i7iduUCNtoyd; zU7arUyEJ)oWoBY!V02MnTB#$M{7Wm`I~XYHWP`{IRe z@qWp_{>h+=2E%U?pDbMhFX)$d9V>ng*{D+jR(R>TcgN0JM_s4Sxv+`{+ty(as znX!4BkZ@3FNVnAGVY=x@ABtVu(ShE`e4vGN_=h+rAF_D7JEc=IWh2v^#d@r-uWwLj z0q6#i{IopD`$daawYBH{!aGy#)kpR44UJ;*{0P&`n_D9lK-jiuC>7UN`A@2TNO9Sw zOX;~1l)&1WmNbk`7hAWABJP20#?+v^@t)qTg!K_0O`{Qc(vOwt z_7Vp9dKr)>I}gI9m!hofoP+qst$37Fhx=xx$j`hzb)JCy?r|fAUANf=HA_{}#AxCQ zHQ@X)#Jv@WPtZ|H;G8SUMtHNnK(fT*!CBxaO&4k(Kbss!E2Lr)ayqMqN?xeDfX630cJi1a3(j6~mOIBpjB{-FxQu z{zXj!6dCW~kc5FRMLChL;*gj_ZS^|KFwNcy+_Z_f=X$m*OL!dgF$@nvQ?g!>ZQmHx zNT`*_1vSmfzA6|3p!t)XGD$?izkOPz*hNz|x;)TX$9*h{ls7z9x!Yg>iaeTD~w44Ki&Uxj+K-||#o zp>OEe%Y|7f7s*fto8>vR?x^4zXsSC={eWn*+TSeGw`s~Dp8=U=T1}eR4H#-V!7yps zqQC8l|HQfg#8g2=6FUN#33<@^TJQR3xWHiQY+h(0=V7c>OL3tk%c;D+Z|rF(0Wm=t zGt3^h{$VRVF)dxRz9QW5+?8slOn>=<;mR2Q&jJ6u`P;ZBSp z>AYQC&>Q&5I z&gs%nrA|!m`2NZIv&^apiyoG#XRiuYW>j*0!uk;2(aVMXDM!qj3DaR7dMCw0mj0Wf zfkj+t>qD0)xDs4l_Fg4ipMgN5q^6gU#7KWa6MLqFMY7CD$G8F6&zN`ryl>!5&^UK1^EjN=t@@ zRCft5MV8mtc3@ShpROx7LRp{mr95k0Qc~T#tv91TY%xa1BFvnSQU0NTf%9P>v(;1g zg~V|$y=dteCUj0!K<50@rL93`GP$aHOZD=wEuG$wUszL@XpqIWi|x83(8#;ecDc4$ z(@Dkb9$hpUx)2J(@As@qm7XmA%4Ej#P}W*>a2Z{od%0i?6YfN zCn=s4JHl<4*`Wu43OAOzHb`w2tOUHqpdMtHmQMd=4MAq_ORC$2^_O(vobZT$J+z*c zSPe^De{^X`MG=YOkXQNk$MIdeX6QJslszf|k(cOraEKk?3Om-O*b+OiAd7)V0 z^L%)a4e6oe-18FMW<$Uum7yMzk{CI#(rc>Q$T~$OmxfFnB+)MqSvLWY+4Ro3Gu$4$ z)Oz^k&XoIP{6hHg)Okbec!C#HXHAiJt-78pedvE_&{4DXMEJgPAseER4lL}UQTdpi z564vFd~(L{r+I`ToxUz^JU<;asakXl= z*;*Q!OxLCxqm>2?xnGpNQM?N`^X&O5&HR`@uI4HvQE;K#HSR=pcpJrkJ?TO8a=YKw z`683^H7pcblaFnUbqtvNe4f3lQ3f_<(1D&>6U(B2gy07n4XfuQ1bi^an^^2yp;8qt zr-9-86r9<-95vks$X+t3Djnq_^1ys~3#c%y9Y)Mj>z;ER`(eNhnCyjiF~k2u^l;(Iv&i~(pkIA9)IaWW;@90d0#ndN49~WO2Gw?rG9iA z_u7iH3{Y}Sv)28EWdqfmz*8G}a^k+}T}Pi66n?E$D^_(<@)kBha=&&iD0$=}Fh^Rw z86|^b8c;g!E|!5IGN7Dv!|pP`3Vik@@5_|XiEQr&D1X6XycJ5qaoT#;DydBaFC2dy z7JxTZ7$Jf11i1#&$bVe0d`>eMs}rW>dFpddSUl~(ecKcC`hs6@TI#X&x4r2D_iv|z zCAsQMP+cz&H7Y#UEay6jOo{rNDxRg{Llp_e=KutPH33L^9!94G>2Cm`DRG%6BR){z ze~OlAk(STM_x;C@3*6yJc)p$1*E1u$UU!A`Mf_xabQmqK`|*r^#83P$)b{F9oUuZ^ zfmm3SfmVCNf5$jnr;syG_Sia#fPlB_RPj}~6YZrt9uWpDj~CYy?u-@QPTu4u?B?4C zIN&C6flnVDf;lZFyT3i1sMsB(+bGF`8)$txI6`2AOPP~#E!1H*&3wDxRA zs|nqlJ7uRA)`7P66@~#Q9-gZLa*ID_ybszo+llr;p_>nmMM0YdalMj3A5TT^%|5iV^71J@;e*Occ!uM-+z3iDYaB z?ddtiAodC$e_ao9z)>P}7}WE70AC%j+d z)*4xaupH>GLr5{587G={U(OJBygqg>Xq*@0pnlfw><|f;kh5Zrr5@`@i_Xbr`8y_8 z6w%};xD4cf8ASgq5P2v9JhOgUz}=H;8^+a!)?;a)~RAiUvhQ!{~Z}a9|zTM8{Ho$u`NA; zxi9fP*c>*fceJO!y;%Ji^#boYlfE|dEQqc zq%u(df1MbA{hwdFIV=hCN?{!b>D!fRIt8@_CRfjkF|9RiC|Fi~C$7oHHPWilb;9hH z{-N?)gQ$wMy2&-7fAeDi+)r_*&Pzf~`iBe;{)i=(WFy2y1}ftMJ8g4Nky)@2gb-i9 zZB_WvWVJ17Ts#$M*H(jPt)D{yrQWK2FmijH)wY$m^BN|4 z0yt*ZBv`JJ+ZwaESq8H~;Xlk}r4{^>xp269>rw($KrdL_A@CB-P31qy3Esq|gWs=S z1~p4H-gzS0BTFAozF}UDo(zdY^vb0TJUp?P6RuDr%_=bkkyg!GwEc|$k1(rtCG$dm zV&vHJl5lW)>3p#!d--h&v{Z#XJ2SgWuVtO@uZbc7n7qPGh-Q;;p^-bHV{bgF_SP3X?pY3GRTSpt-G$9?nz4Q;j7 zcIPuaL%6FMFi0I#ArzYjdC&;8)~nkK4Cr%eBWK@juYA~C82ebA#%wq~u;1m_MW5$W zQLLZotm!=c+3K@+M|k0}%I>Z{NVZfroqZ+KuZsu(7V;5aQDFND@3yGjoj1L46*^W8hVPyYT%w(ZdhKjC|&C z6?-?NoLUzjCyb7hFllJ{CsvL;aVC}4)P_{GJyo@Q9hf`D%=+wIeD$wstee<4*taCG zo(b?&3zRsJn(p4+Y;el~Q|vGct5D2lS9hNo{&y46HJ~*h$cqRLy03xDp|$9JAD83C z@aIWOYyXB)?QI>3jZ(uQ!M(OQj;7$|xdpfDKLV7t67_MTdcKbn{+LmnGNxVlLgq8` z{}_7p$--`6TBP49($6*MJ!FY zn^mjkZS3a?XuCZ9qQCOZy3|jsFRvn8?oOui{6cSK&-cVJR$Xw%0r6d&2(0gQ{uw@u zz=$&j_Tla2|M~x_lEiXlF5mg9&{D*?VPiWO?-;F!uxvG8TNRnJ4;yKZro}t%c1+K* zMz)L9UT#D_-s2YAqf+dX&$o1)Rje~nhclPT0P~GroYV5;pE}9HOSc0VZ6^x#qf7>N zh1wt{gh3bsL>KEF@TSgLx|;ohQ+H8p=fDc7r{fAq%p6iN z=XAG1MYgD0;U{Z`yj68~_wKa81|^&A^(qm?c1@~Bhv-h^d#&CQ7ocHq(RH5*IZRq+ zx?}O#={lu{ySTGeqbFciQzgf_e?vby;Sw6K0-uLR@X%@p%k*{feQ!x~MCw#Li7WHf z8QJZsi5P5KZ-Y2n>sK1YM+kR@YCrZJy^TECsN3800BW;!9`&{eosvbKztGJBPK?3h zuV1Ri9Zl#L+K5{`W-8pyQeBWZ!Jo6h&@?I@Fjj1NxcMoZ*K1V5LMj!wopW}H6|}G< zIkwa#`)R#n@C6P37)g?C^rk3J+NUevw_tkzt6a3^<`*m#r8SNWsw4MNz8|V4C1~mP z*6>^XU*oy*u}uZCUHuCo`Q>#dqWSAz@Y&|dchWS_$|TwOU})AWUxy9iH72qyvf0S* z*@wvj4C-yvjisYN(JiWE`;q$kY=^e!2}Dce9t*=yWp1Ap2O(kh{;A*aLhqF}Y6n|f zzw(E?cP?i4WcAyJ16SLn+^>7Q#kRh8dOWH*U>M%c7TnvENWId2CXF`a&r|GS@$4#& zZtI=D_UA)I`qCqowZhI+*ZAFH7k5?~n?Q~gnqlR|b#>stm0q)0O5?qS6ORNmU^3%I z3%=ud1KVVg-zd)hF6h!=Doh;SZupG&dB^(z;&fxMMRv?%%Ky(2z@KhBXP9!{5eV@h z&kLq>cw+)9#i1uF&VJ>&s^u-Fk&kNiR=ks&&{Tz17Jl2|wd8X>ioJL_xn-Z&6SV*A zDZ~H96RiEL^`2xH5UOidQI_6Ek>!>he-pm|HkX(yxHp@6=bvydFdVlfVUg)6t4=c- zJp>Ya)?nM4?zwX`x76rx1EKHurcHECzAm*;+eLKM@{l9NleGQrT#pSUtFqbY7Y6b5 z{}UjkOlF4N_?NiJShIqTypIg%eeT+XRIC8X=Jc4luf4=J%w5{_WcSLAM~gSl;*UH1 zw~*r}-~kJ}DMBOc|B4cu?}Bt!0QNlft%&n_qEXhja&_|e*F)~cM0=@j_~$S5!af?v zF__)uqE{b_1l~0fSNYmR-2!6cFwdF|THhW#aR>U%*e(%t8rZW#T$fGA zEr^+j|Q_zDs7Rxo8rNTBvlQ95zqH<4p5$Aq0K$@>*$s^~7`{2rBVoa-LO{Bxi!tDz#T_xec_0=8}^$o_jV z+Yfmlq-c8oY?L&RO8;eqoEdC}BbDhl?K@BOd+%wU@{v zxi9>}P$Ugsl%oetl7AXL4m-&a4j;wIb40L!pLV)%f16?Z_WV1U?MLrRt$a?(R_IW7 z-b+bniR$>0cP^GT9!dJsCg_y(G$_s>C78~n6kNjB@E6L11-lYYEA8G7NX6XGN55wT z+P_dzE8Li>P#?EH{2$Q#jhXgrAlrkb#s?XwZ5cbE~EjI&~yG zS`MT@Ed@uEgFhg21Xj4Nj4QaUI~LQ9R8{G&v}7YOnyY0wh8R|S8wYLLCeE391#&4s zOWc~CCkamna;q5{7N9a73kgN=%D&Yma-fVQvVd^-qCUTS==fon>z%z8EP~1{vw38E ze-3lzV!zDf*k@07ts&cyxNZWR82fnd_8Ha&-Yk7p-4fTeMILAnca(82yiq+$ZCJPt zZ{hmwfyKlxaDVz7l4TtPH6qVd`RRLq{O!L!@wqhRO0GlWr;_S43^+GO%Gy!HL&ioq z5Kgpe4zx4oOz3(^bFR0vAK8PyJ^Z4fwu_*po9-9|?z{@o`OzNunz|MZLr3tx7`4D*{`2>i!Na61Ca!pzb~*?yZ0;&T6;q3E(hI(!A8UX;ga6nOEU z&e6>hTGAK@P9-oYH*NHUU_Yp+U^6G1a}uRQt%g5_7{DRMJJv3-<&SXG^N|cMHc1d{`q|Z%^2^b2d)8II-stsKSqN*qGf#yMdWbyCqHe;BE3FC6P${1gw

    D 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 z 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%0D}jYknT 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�>?Lk3dFM6Qb~!M4<(rY27w3L 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

    QOnEjJ;yC|boyUL5A{=;G@3*b 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 z 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

    ^NoL2#A6H@H*%vNZM6&Qn2|XZWvtZJfw#yQpJV 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

    VK)|VtcCHk`AcL1AfcM%QkA*&Ky>MHY(8Yuw4hv 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 -@OT3gnT-m4 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 diff --git a/website/assets/img/docs/training-loop.svg b/website/assets/img/training-loop.svg similarity index 95% rename from website/assets/img/docs/training-loop.svg rename to website/assets/img/training-loop.svg index e670f816a..e883b36be 100644 --- a/website/assets/img/docs/training-loop.svg +++ b/website/assets/img/training-loop.svg @@ -1,7 +1,7 @@ diff --git a/website/assets/img/docs/training.svg b/website/assets/img/training.svg similarity index 95% rename from website/assets/img/docs/training.svg rename to website/assets/img/training.svg index cd6b74f04..65f6de0b6 100644 --- a/website/assets/img/docs/training.svg +++ b/website/assets/img/training.svg @@ -1,7 +1,7 @@ diff --git a/website/assets/img/docs/vocab_stringstore.svg b/website/assets/img/vocab_stringstore.svg similarity index 94% rename from website/assets/img/docs/vocab_stringstore.svg rename to website/assets/img/vocab_stringstore.svg index 119175247..b604041f2 100644 --- a/website/assets/img/docs/vocab_stringstore.svg +++ b/website/assets/img/vocab_stringstore.svg @@ -1,9 +1,9 @@ From 49b58d35fd60d15406a4f2fecea982fb3de82f9f Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 3 Oct 2017 14:18:49 +0200 Subject: [PATCH 169/649] Update JavaScript --- website/_includes/_scripts.jade | 53 ++- website/assets/js/chart.min.js | 14 + website/assets/js/in-view.min.js | 6 + website/assets/js/main.js | 329 +++++++++++++++++- website/assets/js/{prism.js => prism.min.js} | 0 .../js/{quickstart.js => quickstart.min.js} | 0 6 files changed, 371 insertions(+), 31 deletions(-) create mode 100644 website/assets/js/chart.min.js create mode 100644 website/assets/js/in-view.min.js rename website/assets/js/{prism.js => prism.min.js} (100%) rename website/assets/js/{quickstart.js => quickstart.min.js} (100%) diff --git a/website/_includes/_scripts.jade b/website/_includes/_scripts.jade index e5a863787..4bb4d87ef 100644 --- a/website/_includes/_scripts.jade +++ b/website/_includes/_scripts.jade @@ -1,27 +1,46 @@ //- 💫 INCLUDES > SCRIPTS -script(src="/assets/js/main.js?v#{V_JS}") -script(src="/assets/js/prism.js") +if quickstart + script(src="/assets/js/quickstart.min.js") -if SECTION == "docs" - if quickstart - script(src="/assets/js/quickstart.js") - script var qs = new Quickstart("#qs") +if IS_PAGE + script(src="/assets/js/in-view.min.js") - script. - ((window.gitter = {}).chat = {}).options = { - useStyles: false, - activationElement: '.js-gitter-button', - targetElement: '.js-gitter', - room: '!{SOCIAL.gitter}' - }; - - script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer) +if HAS_MODELS + script(src="/assets/js/chart.min.js") if environment == "deploy" - script + script(async src="https://www.google-analytics.com/analytics.js") + +script(src="/assets/js/prism.min.js") +script(src="/assets/js/main.js?v#{V_JS}") + +script + | new ProgressBar('.js-progress'); + + if changelog + | new Changelog('!{SOCIAL.github}', 'spacy'); + + if quickstart + | new Quickstart("#qs"); + + if IS_PAGE + | new SectionHighlighter('data-section', 'data-nav'); + | new GitHubEmbed('!{SOCIAL.github}', 'data-gh-embed'); + | ((window.gitter = {}).chat = {}).options = { + | useStyles: false, + | activationElement: '.js-gitter-button', + | targetElement: '.js-gitter', + | room: '!{SOCIAL.gitter}' + | }; + + if HAS_MODELS + | new ModelLoader('!{MODELS_REPO}', !{JSON.stringify(CURRENT_MODELS)}, !{JSON.stringify(MODEL_LICENSES)}, !{JSON.stringify(MODEL_ACCURACY)}); + + if environment == "deploy" | window.ga=window.ga||function(){ | (ga.q=ga.q||[]).push(arguments)}; ga.l=+new Date; | ga('create', '#{ANALYTICS}', 'auto'); ga('send', 'pageview'); - script(async src="https://www.google-analytics.com/analytics.js") +if IS_PAGE + script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer) diff --git a/website/assets/js/chart.min.js b/website/assets/js/chart.min.js new file mode 100644 index 000000000..184c23440 --- /dev/null +++ b/website/assets/js/chart.min.js @@ -0,0 +1,14 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.6.0 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){return function t(e,n,i){function a(r,l){if(!n[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[r]={exports:{}};e[r][0].call(d.exports,function(t){var n=e[r][1][t];return a(n?n:t)},d,d.exports,t,e,n,i)}return n[r].exports}for(var o="function"==typeof require&&require,r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return e<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,o=2*a-1,r=n.alpha()-i.alpha(),l=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*n.red()+s*i.red(),l*n.green()+s*i.green(),l*n.blue()+s*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new o,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],e={}.toString.call(t),"[object Array]"===e?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var a=.4124*e+.3576*n+.1805*i,o=.2126*e+.7152*n+.0722*i,r=.0193*e+.1192*n+.9505*i;return[100*a,100*o,100*r]}function d(t){var e,n,i,a=u(t),o=a[0],r=a[1],l=a[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,n=500*(o-r),i=200*(r-l),[e,n,i]}function c(t){return B(d(t))}function h(t){var e,n,i,a,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];n=s<.5?s*(1+l):s+l-s*l,e=2*s-n,a=[0,0,0];for(var u=0;u<3;u++)i=r+1/3*-(u-1),i<0&&i++,i>1&&i--,o=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*o;return a}function f(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=o<=1?o:2-o,n=(o+a)/2,e=2*a/(o+a),[i,100*e,100*n])}function p(t){return o(h(t))}function m(t){return l(h(t))}function v(t){return s(h(t))}function x(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-n),l=255*i*(1-n*o),s=255*i*(1-n*(1-o)),i=255*i;switch(a){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function y(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]}function k(t){return o(x(t))}function w(t){return l(x(t))}function M(t){return s(x(t))}function S(t){var e,n,i,a,o=t[0]/360,l=t[1]/100,s=t[2]/100,u=l+s;switch(u>1&&(l/=u,s/=u),e=Math.floor(6*o),n=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),a=l+i*(n-l),e){default:case 6:case 0:r=n,g=a,b=l;break;case 1:r=a,g=n,b=l;break;case 2:r=l,g=n,b=a;break;case 3:r=l,g=a,b=n;break;case 4:r=a,g=l,b=n;break;case 5:r=n,g=l,b=a}return[255*r,255*g,255*b]}function C(t){return i(S(t))}function D(t){return a(S(t))}function I(t){return l(S(t))}function A(t){return s(S(t))}function P(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,a*(1-l)+l),n=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*n,255*i]}function _(t){return i(P(t))}function T(t){return a(P(t))}function F(t){return o(P(t))}function R(t){return s(P(t))}function L(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+o*-1.5372+r*-.4986,n=a*-.9689+1.8758*o+.0415*r,i=.0557*a+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function V(t){var e,n,i,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,n=500*(a-o),i=200*(o-r),[e,n,i]}function O(t){return B(V(t))}function z(t){var e,n,i,a,o=t[0],r=t[1],l=t[2];return o<=8?(n=100*o/903.3,a=7.787*(n/100)+16/116):(n=100*Math.pow((o+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i=i/108.883<=.008859?i=108.883*(a-l/200-16/116)/7.787:108.883*Math.pow(a-l/200,3),[e,n,i]}function B(t){var e,n,i,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),n=360*e/2/Math.PI,n<0&&(n+=360),i=Math.sqrt(o*o+r*r),[a,i,n]}function W(t){return L(z(t))}function N(t){var e,n,i,a=t[0],o=t[1],r=t[2];return i=r/360*2*Math.PI,e=o*Math.cos(i),n=o*Math.sin(i),[a,e,n]}function E(t){return z(N(t))}function H(t){return W(N(t))}function q(t){return J[t]}function j(t){return i(q(t))}function Y(t){return a(q(t))}function U(t){return o(q(t))}function X(t){return l(q(t))}function K(t){return d(q(t))}function G(t){return u(q(t))}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:u,rgb2lab:d,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:w,hsv2keyword:M,hwb2rgb:S,hwb2hsl:C,hwb2hsv:D,hwb2cmyk:I,hwb2keyword:A,cmyk2rgb:P,cmyk2hsl:_,cmyk2hsv:T,cmyk2hwb:F,cmyk2keyword:R,keyword2rgb:q,keyword2hsl:j,keyword2hsv:Y,keyword2hwb:U,keyword2cmyk:X,keyword2lab:K,keyword2xyz:G,xyz2rgb:L,xyz2lab:V,xyz2lch:O,lab2xyz:z,lab2rgb:W,lab2lch:B,lch2lab:N,lch2xyz:E,lch2rgb:H};var J={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Z={};for(var Q in J)Z[JSON.stringify(J[Q])]=Q},{}],5:[function(t,e,n){var i=t(4),a=function(){return new u};for(var o in i){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];a[l]=a[l]||{},a[l][s]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a=0&&a>0)&&(m+=a));return o=c.getPixelForValue(m),r=c.getPixelForValue(m+f),l=(r-o)/2,{size:l,base:o,head:r,center:r+l/2}},calculateBarIndexPixels:function(t,e,n){var i=this,a=n.scale,o=i.chart.isCombo,r=i.getStackIndex(t),l=a.getPixelForValue(null,e,t,o),s=n.barSize;return l-=o?n.tickSize/2:0,l+=n.fullBarSize*r,l+=n.categorySpacing/2,l+=n.barSpacing/2,{size:s,base:l,head:l+s,center:l+s/2}},draw:function(){var t,n=this,i=n.chart,a=n.getMeta().data,o=n.getDataset(),r=a.length,l=0;for(e.canvas.clipArea(i.ctx,i.chartArea);l0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("

    Szi%!Of)(Ky)~HOvLM~Sg#noB<@x#3U>gJ1 zdeE0A{rmO3u2P&X?vpD}q*<(_Im|JeFK0Y=(hMz?>8(GS?Ee!O9D;yqTf6cf`A9kD{FB4JhXkIx1YJk5V9T;v5a_piV}N*5HW=O>dxLk{v~AQfVJ&z^UnJo5~Mh zNutp@qk}US)j_)$A~{Oj=loe}USCekpy8Kxc9rNu9F(SjQB)S%Ru(Fve{hewmIP^R zcHD|3K>#ui%^%P=Lixf)H~)}WkY=};f+|c{0yaf1UK&{}dJx1kQ{8twWzWVZ&yc>Q z6nGsq;b>o{WRJ<9kDDGB#o`x;t)I+%VfxiJr*zW>4qy|@&}hTRhV31 z?Bpm7U7NoX9qx4Z(=WyYg_vD)rJI!HntAA{@4YdH?!CIZp^G3)nnib3I>e8Kd3U`u z7|Sm-%IQok8{{sWXHnq>Qq<}S2cs>^G}GZyHa*TT(ao(ln>$`|?~R~fkbp4r(aliC zAJIe=ag!oR2|jHs(@mbfn{m3=xBks;S7DSaO>V92N;#ZTDxS+9~Bk!EAC;xe>B#10=BlSo_m~BFSO9LK}aaqSh7T` zTee`(mJ3o;BR561`Q0umH2@}+BRV>aV6)FS-wr{K5gALOOmNK6XAnQyGn2RzHj+Zw z_qkzD#>0&e^E=o2vP`}YYcT@5FRvftwkzWPu{ZyJk1)F^C`+Iv0`N!u(3et5T5-wv z%;jnsp*W`NxWs`&V^y(HCRRc91PMrUkegf$rGX-KJw^KfG9`$}EsCyMa*F=>1Yehlo6!IY0F-L>luSP!0Nmwl(Hwvz^~>z5zMSjR`h^ z`w%mD?#9@bC8gBbZ$(8v&dkt7`s`BA8lK}QA-IJM!9&|C);*7{ghuppZMF^}(VMq! zzF@PjN$_NZ&jBkV*~fGr3>?+H6#(Kuv&(hsvWKqfEF`ZnF`i3SInVeM;OCMQU? z0{(+C*h-Bk;eopxR<>xwI+Z?T?TgfJGw@B&dONH z@pD^jih>B5gtm<9Wjphb75St}0DIZa1A-`6`?+H6Ir4DC5|^(++t=F=J-cDs$?Wve z&Jl@2(5$s6#H|JB?uu!1g|QJ2o9#$hpFG#~OW9KiG~-Hip^8(A2-!7;`6L2u!9c~y zd0#j|PJnw0)BuJ`fCeTC{cQYkIliyrHVDG10mP{xhSL$UT4=}QzE}v>&JDvfT=|g*pji>wg zKQHNGlp;Ol>@iEQ55%!g0nO)azqED>pmR*)k^u(ngn_FdF=h=9V0S{!NLApR9 zm;&^Wd!rG@kw2jP+Z6Eu-OIaKavUUIN_S-a&(O;2ZplYdwE?!5FpJv`+JxrbRnICP`H=?l6CeWuFkaG zGq+I~X7dMukAZ0117+LCn{Zvq9|hD4N^7vvtoPl#!^qbnW0KW9rU>3rHd^jaYQn1| zSnO*Y!sg=N3pHKL#>th$Bt0C=Gq?j;Z5sAJuEz%V6J?S*_N6LoE0Eu++CD%szes{O*YL`rF5CYfUYiT440(SvBwNZCqqxx+XlR}Lg&16R;yqffE|iY?@v}y9!cgVO=$P4{kWdR5+^K_kbck?e_$p2M$EZdnm4Q%e>kae*8fq&gZKNGY z5ct?@Vbvw=F+p!rt{Pu9pZoUXLOqhm~XB#1i-{(;xR_V;-eP7n4 zJV~7HLYH31ZqbW}h|b&lz`+iId=bMg1lx?k#VyckmZY7?Dh@>esT$F>S!_K*tFu7? zB`J|&b@y%kC?VVhH%c?4ZNydME}*W@5Y-NS!ANE1Ru!Humjhq6$C>C13j>YzeOf0s z%iU)&{GY`sgTb%sdsenQS=kr$YJmRsnzxa!^fBWiqUIEp+BG^>8_0D(E2;em!v-+W}l=d@7=`h z=ETj+{*XS+LunionHIZuKfF-a=)13ZnH8tDT7{K<&|8XV3x@ya$#m>UZE5M+H^#o1n z>i3xgk@&Zn-MAG}m_lnN&kTEvb2^pgBwX6I-54+$tw9=e_*jxe z6JA7Pt}5(v5m#T5S;#Bn)nCL~%CIf~Ka4`sINcxW;)_+nOu1A%2FHxG1VU9dwwt@P z;sjtvR!VHCk>>bU>ja(oUYdJKKHfin6pbVyX)ID$h#i4*owR8ex|A4`2dkJfvMV>! zTiS_Lf%X1pj;E(O{ZZZ#yT$GMlP8jnOZ3f;_aZ0#c!3ws16{e%yB^O2PA5sFpF2cj z)K`+yvmgGm&-oR+D{IyFf`kIpyu=+Cx7T@5vagYT5kvPPabC=?oX__XLWAc-lBq&0 zCM;Y1Q^t^(NZz@K><_x;)TO(LBu*v4Bd3!C5HjC&2I%-+Oy$T(tyr<^H_hb)V_rvV z+_-H=cB0K(gR=!Cd}8oWa>imPm7)T*Yq=>8mxBk@9|rek-Y~_Q5r7iYNOvkVJy}*Y z7;qy@KJh7#ziV2d3^$54CqW;!sX7?5RdUl_^-VKA{~co0$-L6s_IN&@mAeUhVOhmW z{!Ee&&&Mx#+VVCS%7d}NN3l`9`@pAL-P-3-Hf_0u8YzW6X#LLXXwsZ^^X~rWJOc=R z5olj)@4%gy>>n*Q1ibUHeNZ3szmJId%3KQiniObL4w02qS9`Tt0GJH_7(v0q0RvS02 zwkdt~A+%j!7hSiuOc&~V4`--o^ITUA8;5T$s#P`tU4D}p2uNZ0El%h@G^?Qm>EMvW zxJQcrg{I1Df;4J{<=3R4wm2FhQc}uJ;Y;-l!HQ=UnpLG0lTT94@q}hU08^8&sxtOl z{Eg%mXS#-}X%sf%B+tHKJ_mx;6e2;RY2(5unBp#u0vSD=ign*Z1`y3yRC-)1ljo1l~|&&@}C`vIhs-=6%EBy1wq@+3a>e+zXz%H z3|2(uPM)ZK-<8|wUXnx;42BxoQV-7TJz#RA{VbRRfYH+nTAsk2<`$JNyOdIdBGy0zU?ky|Z#AT;H z&H3LqdPshLiv@PZ5Wds_P67tK!fgTA%A1*Eqx{O?rzm>W(W1z znaA7VF0r1wY)=Hm7Jz{zVGUVKJ1MMQe7cMHu_+x#H2}?+# z!p&l$PjW)ktgzPXN|*in{PXww-&Wv+#M~dI1jDu9>)DFXRD!v&@@k2(8TB)%3Bs zb=s&73YCX#qYc+fCCS8JG!C?9+sL8a!lLh`8pmkeKrOV2Z>1t)l`;i!_tTgeHJ5}S zxYpx|-_yqwYdFz2#xD(=n7XkH81cf#OT%M}I@N(oL2JIGgTAg>%)j`T+o*uspoe&l zXz4+rt4vJ1qY68nMDH+ zz6JFA4~YF#Ibl*p_CNKk_xEoQ<2N{l zL5ySO5>6Z<5H0ml5v{JVvbF#>5$$x~L^KkaK>qQ9^#Q-jKO6o^khg4>^-nkXN&C~Z zq=kG#SXPcK3p>9<8NFTr`R8Em==y?+oL`=R%lg01lU-#(0HtVrZrVz`6o+V%31xID z7@mabE4lS;SOHb|(y9a&sqYSEBZtY$578dIR<3ZXa3Cbf5R)cwfv{T)LS`pXPeNju zDQD>f{pt5UFE;>DTp63b&Ys|mF|3SHKNGS)9Ref zwW%ELnLwDu=dm*d|9itxkMtQQQ>^E?`DRo?LZ9Ei!q+jn+^GYUBP)le8;=PMl>)Uh zaKjK;TQlA$hvFI|UIJ)Stl^!c2&Utp+^^A`eO3#8!Rn9Q0%(4C2E3Y| zquj-LGBaf$n=GG_PT_9!ROKmUPaa2W1W9RbLVzy5nf)SMqa;$3?Z=EaYss$AGuqHJ zU8o5uw{a^Hv4{c~oh;XV?o?UuNV&{#2dW{In(ki1(@oI+W6MyzvZh*Z;wGb&d;q7P zz8m4r+m8YIL25)uPXJtkG}(2ySKdF?dy&&jkD(!WJLvltVH9&PF>tJQv}Knd;RrC+ zfx~IJOc+A?nj#s6-GoL-^zl3kElO0jC4>Y{lmppIXD~5;Gl(%387EzD(1VNp# z+zrWPn@Oo*>oIt5p?shXr;l(cUW=T3&btdznkU8ofPb%X1b(Yl7>9s4u0pY&I?gf= zf8e7eX`tIvR_ENjo~5gxTanfUgC@W;@nUoqp6o4@;n?WD4MV%jTdnYcvxwU;ffI#$ zfj68_uO=O8(Fla-oUXbw|JRab2A2Gxba;`Yd>WQ2R%tK%-p4iJGU`ZSoT{+jnUQca zmqVfTbz`n`!^pqVaR#ini_EgYsBDNwjFjLEY9fUGf|wo{d52uaANpn;s9&IL_-Zw) z6}jGX)!){qMzILt(0`9@hFiLa42B}+d%ciNnNwBO9_-*Edl8|mcp~>_iCnJ#t^`q~ z)FZK0f7@F>!)O( zpNHnW!0|8Hq1Q@*H>?jxZXZf#ZVoy_RO#Y^km8!o&y!DuUGLB&eNxvrE|Xig85y15 zcw1fjLk;=P#U?CcE;(M%(036Bl<5{9l!F&)*$nZaC}_|ZW@Mr&-*RxI)eK2`uYYC@2|dW`+pTAjAf zW99TcEusMUJCv0L!r@=Nb+9pa&k+JmDSqhPcEXI3Ox0GbPKQYP0mfVHvn2l*j0ch>2?=hV4f?4THb^@%t$Q{}q zy1njn-4T53dgg=jvNXo(?E2^i)oYDhOz(g`dsx4=@id4W>K1jwE|xp84=E2kcv{aLFow{B$FeWEHo+jH?NSYDgLRX;xqp5Vl_ebODmI?cNkKu|*l}Rv7s%t0 zlJj6FvddIpt(X2CFSRD&730NDGuyxfef9P9eppr5cY+5U>V#9!| zDV`rbsH>FOeLoXwRoN-98KK}fUFM4lOX6h;RUt6uA$m4h?AEEkG99G#1U5JBTmmc% zE#pdX((qanVlgim42p>zmWadSMSF8a)S5(F+l6Q#?Mv+G#g?%{OeDcjUYFq?7X^LH zMIw5wwOVObTaxIK^gMZ4ro&D8P2wmhF@u!HrASzQ!=#|1tY{}#t*qK^3mP08MLhGF zllNKBV8SL7IjJTRU-66-P+_U`rT$0Hp-mfoxb!asL?u~M(Jp@n=%D<(y6(Ax3dw>%BchFNC7BN;rai%dOWHT=_N6vNNXAx39QdA=s34IN#zA-h zUlYZPY2QVweXb6Jq$4K@AvP&b+FU}b*_DK>yHEy-4l51bV$+LFr5Maa8@Mh*+DRA? zr2y`w6O4_S`BiL>@IWK(A(4{P#on7OQeFJYKKunkf| zL1*HX+6YzrDKFMN8z7I_A@`4{hCjn>zGm_^yj{}uYrPxY_?y!4 z)vGA^cWURCz|E8kQood_>VJ_?@CdL=qs_)+)$}n-JtE{)>&Ibh>fl~yWerw^RhpZR zeY$x*^}+yp-PdhGQ~l_t9StqMjuhP^5n|{Q;UZgp=cFLNh~tUB z$fzfc9AzgQ#%DR#&rn)FVrbEj+ch7poqpE8R@<1JV21P|A{&+5{aFXEhdsq~ar zj1YGsK2`q@EO|@NHN}zzR^$7Ql{mOyq^G1EBclT(D)Z5t88wO2NED3xFDp>|3-c@P$v{a6Y9>MmT4B#SBxQhd&tuxc*^w&e?gNMstv>Y|T@EE5ot1 z!+MbzlHS5w7Rm91A9~Xg0J-(5Ru;Gf5qkCnv+}dejabMDcE5gw3yF*u9eaD~1}i>I z(Z_SJUb})_FDZi0+qnT-;pdiB#=YNKitN?D5L5{+EYrHJ^DUOYe9XzN!4g165>0%r zejd}R70V}59{1+uS_m=>0I+>a%>#iK|w?6YjEvk7~sK2lC{9tlefN8xbOxla=; z0us19AV0gUgc*^6DC~9TeH|m?gfZ=8ZSEcr9C};cK0T0)=SM_joY$hKLVKs~mp2dL zKTR%+^X{B*)&hAsSVNv1rV(OIJ-Qml8(zIbTjnbo))Z_QjFq?Rx2Zc?DPaON8F)tY2Yota5_n?e|V5s=PI1^dc)8&DqQsTE z#Rxrdv8w?Kgx2iaqL5Q~Bp6ia(M>~f?HwDa?+VhU=2z56+T)rBmNj&ApELT=^0fx^ zO}zDapxnvtDE#}CZE!4Lx=OpfT?NsDVa1_o^QF+$3#aQ!F`Js{2s*WM<YO>`xvJ zQ_0&RJsPPyYBo5TI1k#PB%~38P0~#Vt>N{t-9mtnE&j7PG=k34<PEpVo`SfB*)HpeQ6fFgL4YtG+)7! z(96v1witAu^=ZHKj~K0nMPK?wcs*2tVE0dU)!-1_Hvdhp>cZORx3%r_*CSPW=O6Vm zX(n5H_4qjfY2QK(#lqr>awl>Eg943s>CtF05at->=dX^R4LlO^il2_$<;YcbGO2l2 z8vkzXJ!*TBzu0Gi>z}!pOB9AClLb?|pYTGod%7&gDp1zAjBBy$rgvC#ze9khtfsKv zTVf>yv$|7Bzt;D2X3ZgKjI^*?c@tKgkVe!PI88lsWw&eoYZh&E@Ru?J!~)Ncsuz}g(ubiKtchrFm6 zx*DCC<&((YFNUa<_*{MKlA;HG<$mg-4XL5A0AXK&REdV`%m>}zS|g+U3eo&2#5bOJ zId7-s!BZuWa*3Q3$G8?4XiVyNs8ljG45dOIpYl#+!UTdAau^0FGK6MVJ5pnGQXCaa zKSModun%*(t1iJ;>dhxmgnCptcP-x3Lws%2H#M_UhIh$%9a*q(w#Nkon$vUk2pZ|q z5jc2Fw_uP4*alHgp)0iQF^f|6x8l!2UkJ`e1K>Xaq~904+M{1PWd!RYu^9 z<>DrC+T=wU+HXr{=NS*j2L&H|Y4C%j7-SZ=hsg;GW$~OrE^%WP!blt(3%qoC_8y%#F90ET3CA?A^3HsRI6h21wz!J#jXSmr-aZg|?2| zZH~Bwi$V@wGId^o@h^rT%%QOgTA*3F1_TwfALII$5%CwQVM2rW(-{qt12KF>SAet_ zdC9GNk#X^#wX=v4%Vgj{{^R31e=ZTovj>FW4^||1vYD(6y9%?}Dpzwu8h)_{BHP&y zW5Pg4bb0+a7<5flp_1w=YNOIbr1#zZt%fOHL{yCQ8H!UFq`-B?3Ak$mcu~r)@VWZS zb`B;DC=1^Hs~^lfA2zt{g!;;A=2kF-f zEMWdRy}pF3PIZ+|c6iwMX*Kt|g9TjJtE`o5x+>EWM#3w$`aE!w2$|pGgNrltAOmf{ zl^C^Wb^odBHz0#!35iENL+K;#O8k1)8;*oE540G~LTQ4^t9Zy=w8(Bp%adJ|z%4~6 z37H?}K8NWZy+iTY$_huT#l4lh&4cUf2srk8*X`;8R7cV--Q*ham&tHAh+TP*WogvN z!tN}%D|p+PpX<2?#<#4mHB0q)hs}|&PNCGquEyd)E&!9~nuWl}As(kM0#1Fa2xswF zw$DA#pAG|BX@*Bu;W@>bCHZEc${H)NezSXrja8Q&hVKnnS$mpDC)<6qc+<9|NN-St z$QU1uBgCX<;={(a=Z?S1hS&Gl-F)^qfR{SF?>IP<{q3F&A`CSP`Hm|;b{BSBgfgXQ z?re@}PZ}swjcM2{WW5mK_V^nYCK;DMW|^vrv9Kb;c{||L!Tb)eAu3NcVOJEDQQ2=_ z#@iCnwb|#jrtFMj^QE@6@QW2=n&MIN*HvtN0T>pI3kh>9`jda+&ORGB=f?z0jNgOrAm-Cu*or z{uU2m{Z=^4=k?jMMQB^?>^`F#ER%gD%@z%dvz42R%{Mt;+$U{m*x7ZFkENA|5A3Ct zhyB13%$;9n38Y;~n_AH}$Vpo=aY}Jp^Uc>A4>dirGH<5=KbS}jF3PU;HbQU%@WJ_C zBi|JDVdTGbN8Jij9`hTarO$aTdyH>akC<~8t$||CQnWs$(e1)=bUBSfWKWOfhhZH|>l_vY-YLt3 zGe{h#ZB={Tj(|->!kD`U@XZB)!27gX{?op{#QKgyv{!cy2!Xop*41jVzO+5xow`MW z;Z-<_6c(XZld?lh-Dia8RF${*KDbeHuI2aO1_79uUDcZ+Otd({h2uzEW*Y!m5qLJh zq}~cR{yI2%c%mV1N+r4@X$*2Pjl^LB+nKvZSoTMJai!cIkIDeI8_!Pl9b7;4FO>le zY&YX>!m0GN=X4 zwd;#$*i8}k!Qc(>46e{P{&ep<1`35(J8N`k;&oCE^%ls|$CXo&m{xRx&&RI=8^f7A|szKZqmP_T{VMI7uV8Q_xB4d?9c>l+yw={%RN^hjs36kr7o* z1(Pt;Nl8!Dh^a5XRm2{4RBRt7(cl}N|cHj%?z=} zpg5?!cXFFm`2+CtLt}Ww%G?xt1WL~qtj3wDvQJ0AQl|dpWAP})=2YR>(Jj^@DE>x; z#nd}Z6JrQ%R-jg{D$%t61IrlPR~n8$$wD@86}k*L4Gbcd(*ij@eAQ}+;1%dgVR(Xb7`Dx`xf<)d3NnneA!mS zLVw1nIZdZZr1sFK!|t_pIv9OzcL^X#-k70Qa?|<#g^LDzpEJnYi@XN;90A*|UDHl+ zm76ADI#K$-I?iK63=wuSyX}hW)xciiYRlbJFNROyG5vbw$Pz5<(!s7KgZYJ*kynv% zb?tM?mm$c5(=W$>x%K0}zX7u-I;G5Ucli&c$s$#E4G#DrnJRXtxP~49OqP6zf3Uh8H(iC*P2>E>Ughyq3+cnR{vU0#Bcm^ymel!wK|_qb|K39Of*!( z)~uXj-Y+`2LgrH#FIugx#(kpjZU1Ha<21jrXUz6K4o+`eTca&gHAvqnHi7r8dhX)J zBLV-&2gn8L1qM}J1yoXOeePZF$xWa94SZYxqrrFgzaylYv1|wflALwRB$-0fC9sM} z&rF3V^V%@(YLa~i?aJhwQvSYgaOA(JF?D#shofpj4D^8&`qYPj=+w+#p9U|l9zvr6 zo7;IvVWWpaP#D13caB2Wx~k{CTCjZO-|bhFMRI+?>;H`@VJw&?RPZyGQf-kFhZg{l zMGh>}tCI+y<+^#bOMt+tMN~qZDmMDIvLk1xI}3MG=)G?1M7LWaYr>a4%V*IDKH~4U z0-lEtDX~pHV3nChlLZ~Fi+i~3)@1iJCI`MB2!cUhuoMIvGBv(Yv0Jb+gb%h~BjB{* zquM5J2*F?h73sm1m6rKck)E~dt^Son%O{~1E2$4>H%Tyc&ESPy7&#R=L3cMs?8A^K zfq-*dIU6gz2H)L3Y^pE&1_og?geX0T*&xkLb06RJrRwz>yTc}E4gu>0vkb3Gt`NFa zFG;;~26G=ulcKcRCtd~in9&V=brVj|);byo@X^$3QU{uy6`?4(5$=nv(hojr?fT5w z?Z186+F2OZ^()8R%a_OMZ#xr@bw>LV6If11PeXU~Opn8Ry$-9!6ME=VA!HYOqi5yq z+&W4rh9mGXBKfUfH{xO)wvmS0BCuZJu6QvlS>@wcf9FHQn2??M1`1$sApGGF;QVkl zI$QH$YWu^4cy)HYKCas(9n9iSOgJU7K)LN#@gjInY^>d`7n}W&E9)^^^RvG0a(-d9 zM5AsocP*NTef5CYIYY$vEmMuxusT54)r-5CEatF}`sRlfUW)2M8(V|3y0yP1L6KVn5YBdvtBn zkIzU^$H;j;oPIfnkKh?a$+sxIxM%$jGz_UEhGfd>z#9N7fB$d)BbAYKpm1I3>flMj zr3vuT!?l`&tG1fmG%d1QNDoKX!pvy zki;MT1GldEb@*39NcO_bdgvXn2u}{k^-kYD)vo%bw1wGh8fDKki3x7H_1Gsy^p83# z)JInh3GEQBK0D8Ym%KqHb_Ru(cJp^&G!jWlzycb%#cBB-EF{O6s{waS++cxTihyEI zdDIua8F#51ZOglb0D3996Ai$(QaA9j7B{v2v7+@0hL*M8hjl9OTXgy5XS=DQ|2Djn zdR1kkF(ZH1v?Y2PhBEKG1Gf_i(1Z)Tg=OgPd`#@raK{C8&`Y_6o`82fk*)maU3cGI z#=Yl$xP`07V2xy~((fcN>M>KGv3XQ?gBWnPyw18c%2o3NC|EK8$Kme6$K36aUxUB? zmS5xFRH@2#dtFG%x0!163A6-Ex0m20*yoEg)~?&(em6eL<9)sn?Z zpPGs$Nn&A2D6)Rqeb{*Lg~f?)LOua8!kMe_8Dm9k_McuVM4Aa2! zKSog?aCM|^x{mssd{*Lv&p$gN*U)^Gf6cDAd_Hb$4|ada&oi(+N`iZze)xAQN%4$9 zxV?*?dlWJf)u|&5+v_b=v3xoQy1|{^>JGIA#U$j~!&s!g|84j2$|gh@&^Q4vIpY=s zoPvN9sO0FE@MxFAYnEYr1sX45mCj&YWy5lV#_#G5!oYqa^pkLLt|>bmvtpWS)eNF( z=HJzNtIh%~&9WC5#_;dX5JkhHl&KXS;O3U9JE`lc@jERWbm$kEeWpbsGwq>X{Z?TX zs5b;=Pe{JmLqq1UWZH+htUd<78N= zCTo-Mx2MS04_U<5+#utm1d~uffz6NBO39Qg0d3s9GmH4%Vq6ao{DQZQReDEYMFPZS z(&}FP;um3*wA_5?PYAre+q9aT!oW@z-J0J5#u*2;XWs!o24nvS8&DWi3d%L#1i$+t znD+22_N4pID(7EkRzu$&v0z!g<&aJ#mL$zL|@!AApHjEnV63I^{aQ6uS zzM@I=CyLZMLb5i!1$X-%EN4UNEW5>b9pTI8Ds!BLG-Rt_UsBsGH9brMH%j{j_}pDr z4~(h28hvXMAX*}@^o>MlU9I$)euoDBztVzd%s+Pdre@A3_atQ{WxK)Hs< z1w`jRH3}wUc#zZq?-wF)&%L(prIgF^e?un!K~4VeQF9Y~(=Z5;cY5L2w5f>B%2bMj6{UxyPV^1{5}-;FTAETt#NUGMH4X3a~I zwKH7KOg_(PSrO2nmM3OI~7M-x)X&cZ19XGG$K>oC|0SB~L@q|oU zjRt}L(jfZTVk*8@Z%-C`zSk}`i9h0J*gZ9q_ouC+=jRiyzzOfu1M7O5GX@x{i`^eS z1fe$YREHe-q|#E2Xs;1|3nMC<0Wx!iIBaN5Rg#tkpFFFiv}WN6;(zxa`>8EHGbyb`9IBU!T(4YHJ8RVQC|iI7T|;PJRsV8 zlPH+*y^nwY(DFZ<#aJtMjmTS=YP7y4oI~@nAz2BdzAwWVSI^494%hQ-w$JKejDy5A zL2Tyn2O?u6fR}wkJLJtm{P<(Do|#EKByr-xXq|5zpMjmmiALS@JWmuWnyo+^ofM8I zSTt-i`n^}X`V8=F@TG$!T4pU#SM9!4H#ROiOgu?@!(YkukebSjBz>62VA-7qQ3b8C z;a{PF(rFampJiEwZ|O*R&%UX7-9vrnjC?)C|AH%nYP&j$OmGMZb?2G72q7Zdkqu8o z=xecMIm(z9#YbcGbuL&mXw%bk;Xj+U?f@LXRc4b;(rS3-bF|71cE5uvjV_%^Cs@0j z=Z5HF60b!=6Z1c&K%c7+BTLxq5git~EiSofSkC`6zWTBA_Jq*m-Demmtn7fS44yWw z$2QlM(0V?ei(?Yz2(~rKE$ttO5`7={Jqga<&5!ZVDxK=}yC`<{nfa&chYqx&#Cwte zbXP)Zd)_5u_aAwJro1?(_>YuQ_f2Ww4nILjZkF*j{Q>c20-SIV%8>@q3WNvdO31b7 z%;nOFzTH1_ZSmT5_gMo*mYA43TI=$heNUD>tAvKH61byYX0okO5T6-G3XVhI7Tf>1 z1f}}=sRt^N^WLi8Vr+G=5|G$@0YU4%H+Gzaqm!B(bq@``>?>Ha`*UQd^0zYx1$xub zw2KF}DrgLqv!CeYqRT{vMgV!t_v8daSM<}}7Tuiqa66n7)gm&SE!M1Q+cN(TTVDYc z*Rr%bxVsG!Jh;0BcXxMpmjv6myGsa8AV6?;cMa|m+(WP+=gm3y-v7Vvt+!XRde5F2 zV1HG;ySnjp?KofdXYU*Wv$b|AG zsU3|1cr&^6h3%iQk+wqZ6>IWf(DI$T!*~Dh4)}NfznxOZh+b2V)A+&i=9u1aU;SIy|ANB$Sl*}r&I5Be(oJ<5!V zcqZSiY!4=~dHvMI@psFz{?(&ZG`K%=NYX0rwn`F;xz-(W!^Zy?4)m7ETtb@L0A#gI z6^{Tmso?DzPag86DeEx_p&aYvKMGhola?QwT8`ZPXB@P&UKSUL<_;%Y-2E3A{|myu zFKVkc_)Yh8g+)SE3KIFgk`CFg^Sy+q+X%kLTZ@bDV(xf(s8OYZMI%g>EwgQ1U!UXM zK*BTq3$C0)IH?U;oc+xk!8Mzi!b)&p;Ah|c!sh7yJK=PA9)DHC$cAwE*NLG&SC6}H zfp8a1^h)cl1Ux-S%fE=;BuqvjU;z|0Ke=Bb(l&aqI2qUN7oylReaukP00)dv1bL)K zNwLmV!FF$_JJ%Oyr~3!0nJd#00`QV+ma|tSb);hk?mr4bZ%Tzv`nQ$<1=mFf!U#@P z0USP;43glp9f%%H>9V={yv!?F5n5E9&+VXgGe7fp zP`db%@#oCw{!y%ACye8*1A*LSKqau^jl0v|sSPoALHs>4kbyqDQ+H49t}b_I(*yW5HAX!V5XOUw!)k)8&Q! z?3Zw=Am#`+_TLcv3l$h0YZs*NW3YBBIwW+#mW;)II-1^$3mY$-7Y}jfq0C6Fx3ck^ za9;po^dOR>0h48a4Vxm8_|o`3c~or0%w zbmjp?moR{x~oOGo0M?tbFXsmQEr?Bz^=8D<%mzvGbUd^tWRzurtO=td#1XIuq7MOTPaY)BuU+j89dJCM_X#$$8N?#Z!VO69n+&^WApTr3PmDf@C&d<< zDt^OVV;eX^j=80OjJ+!^P#V{{-?F0{aw-CbcWNX)8Ci4>h9S(>Ty!ohneN?+DX|dN z3`vLC{!g>O_s(5e-s)xX!dWjXOZy4NZ_WD9bg}HpXP!bpOCj6Z^&^E6DXUe$0Uv=i=)ej-J5=j&e z_wVr+MrtcH8t%!oB5P@(Fz=3HT-ai(ykd6!!4KJwK#U~~g1he&Jv_YNHdiS=%ZiK3 zcwJ`l!o$0)wIE?KJR+=uEU((^8@*GkxBzY)6iT+WL!lT^Bj1-uQB%+ zc;}?_j2zixXh!O}%bZg#hBMq<9zsiZleg;S{tQo1v~v7{Vy=~JinIdnpl|7M-qqEt zR)UEL048iyyYzHobSRK3%lPI>tvAXB?5Fu!CJgit!p8#9BFR2(9=$M8%v#uPsoJDj z0=;Z)u~7GZaV)Gt=Wg=b`EEqi1l+!BIbAq~(8L@?f`p}q0F<;`&6lB-_c@&;(OU!D z+|b6uLT4*N%e9{%L(I7Euq$-R4I zjQr0B|L1f6`o0i%n9I+oWWy1NtK(N#i3~~gg}4gC?2qqH0JTEw-$d}V^jR0GD*R+h(qZ<>1{r~5 z#8CUQIbs>a4miq5F0}swnC?D9vx5&?V~j%^f~&!QVD`LKhvzqoXE>%2ToP&?<`T=c ze5evK#I9|4gjlhx9C*PCQNc5fVcRekEiIuXT;q(NtjF(f_UsyPv zQ`79y8!+=XohxB&ZeODTw$KVmQkFv6)m|u9==1Lk-_AdT@fbv-bYTX`O=~*b80@8`_>wQ;gYQ8o@Jtt!Ns}ny)xBj=Lexvs zw5{4am7)TzcyOQ4=8_zIqtS>DxiRt|1JDkXxp-M8)In-Yxwlb3_3aNYmoK>$Azz^t zA8`9*qT&6d3+7d zs(n`b5N+;yPQS`d_r30_CnGUt%N0-ycJ&=7#d9>9a8X#3ri$CQ#qIapNz);)e$|_h zIShhD_(e4zc3p`Ah;2eFcWn%u`gV!BmbMEy%SR0r1@y-Nb#s*78`&}D>p$gtnZbKS zKZ2=FJE}9ky+?O4oK(m%FuGu9Cen3j9dOeK%2iBx8a$DTpcHZ;*iCI@SL%<*250Y@ z^w#X?T+?IeJ_`EsHhIaIcPWhzh_YiTZT!4dCl&tH#8UDERHg`*g<^tMr%mwQAMC2j zqbpw!NlFK0aRrvQDx<|%k8lKyXOb6klw^SWNyT<^gX5&;;teH4XW?l1w){7jf->S1 zzt1M`PG`##jSlC!hQ5({uyTR zIsc91)rl4jXcj~qf%PRv7 z!=?ZpWecT5XJ@9G5{IIDcmF5Ha0zPxR1gHG4QcPn18_E5JAV40{=fz0YcjuKt z@@!~uh(WRk48O_RAO30JPo22 zX3E4tQD~-OM1&j=kO@LS_doWWZ3>nVuA3%PrrwuDl3#jp)-J@q3wQ({ zfK9^-8|qI*!Jw*BoUJl}fez_;91jh?iJygt@X*_Wcblq^rO^J|^AZNa*4BP|?Z>=y zgzI5ny!ONDx#<{mpFd?kkm~%@j7W$5R|>+Y0rC4H*tUbNqhc`+Op8q|ilAs@qr9R`kc^%ae@(>9oEs|EJBClCv%D zD{d4%S^g<8HPC^1&^0rCSu5pBnrS|TIq#fjZl$X>Gm(A!0gg_-uhYX*{HzC@qQ4a(k??}ue3Q>ZC{%(`twT}tdvvBzmKRg-3E zVyw`8gL0v9h{3q-8g5t%nxA39vS!Qc$ECuMo0)Zua)=1&5Nq|}tKVnh5TgDnY0I!9 zx5-6MtqT?yTvDmSS1OOUMN9)~6|n~iW#K|XE6wR$sF8yutPtQ30-K?<)QR&?!&zNt`8cM6eA z3BM$FWX|wp;o3mWGaW5PVtU4f%m=U{S}1h_IOk9M^~M#JEBR=(OIgZ^; z3mPo?4lKFC{Cib+kfNnp6g5$QpTC+oiD?Flc+&K)=onMB>DMTsB-f%GZ&}0$bGqz! zId+YhlB>13p{pEYf3GojB!b{o)^iElbFZn2S+ZFApsgr5oSG+J;_-CVjaKWWBWWeY z`VS7U`(q{h5!`KaZL`2XI;v;WoNB}laisLyCUm9VZ$t$)p6QZ|WJ922bML*Bg7X2>tl33+iPLz{<{kSNhHSnCc`@xW}Nkh zh^0pDMqRl=V$HQZyP?aC>v1J9E7l?WLA|e*aMpTyxBE2TO(!}m{~Ox;Jw|(|yZU#Z ziJ-Nw^}zctekjDDmXo>bC+467{uf7xt7_J7j)E<$f>8@}0JTG$=h!V#b>>Ph+C3%lPb z-FWVq^{1hk1*L`pQ_?eEpwc&Dy~;s`GueNHZF`^_Dn1cWTVt2igW3$+}j%0 zb+@cJ@>QAkJ+KGEZ1mCwGk&+>hOyNcP@P~vmT#pCv%VFQ?H%^c2qsh_p_W9!vz82rNhzTijT>9uW^iCQwHDdH$60?BaSek z+F8aie=sH;O^ni+MjvnohvX}>^$F&XQ^(5iMsE`mE*+_6V&fXhsQZx7ebfvS=Sbag z76sz0x^Ruen6*IEs_*d_dLm9N@x2hP>Re$TNv&DL+$@czATlqH6~>n-yf3 zi0$dpl!%(H(kz(qN$rPW_fLioGYW8^zhkcqLv&R3XKxUz?**)Ne-IW7TZ9{_y0!>0 zFmD7EX%!)Jpd|&z#{U#wEDCPK;xsO}H3lF*|Gy?NRu~p|g25(CtOgYokY*ne=P8WQzB-IIO2*Mvrhaf3e3*F~?XW}?&OMQD(cAN~u}!jloF zOca<$KY-*Bk!Vj)N0m*xH9gVrxbkyH>Vycdg87o6Pz}P^RU2^Pu)yv$@ZI%BP804KGtT{eN2ecS2wyO|L zjBu9Bo2&8eMG&z#{T34Z6WZm%PDC6)D|oFtJg z>4|GA@Y~0(a`$oJQ-LwD%WbUgf{nO9X6@ee7Iot^WA^AGai49ya{4Fsr*b}qfjc~) z==ZO;3ZZbFwC5V)P=OP64#2AfQGwDbxS-MFcQ7dwm>&_O=0>W(&BTn{POSFOwR4Hy zfs=>;5)a0#r+lB|uL749=A#7C^F~a$3Cy*C&B*xv_y#MPI&$ovjOBmc++f|pJ21JT zCtVfng!Ng~ki1YqcX!1G2m46(@?&T;Mn+2k)+4&*ucC>nUYfYd0pMq0V+P5fIXRM^ zoZc$btiWF&KPGD0g}14`S_9PJC^R2IRNEBlFLY*0DVCFBJC(LLDqEv9Lqi}Q^^K~& zJmM2&5K;k*4*qXBRo8B5<_Ws-(tf8p7qkhwS?e@gjsnGctkwidYc5q2Wi1L0Vtfu% z`AGA03N9$`eShSfS)hMRuqRkCBQ07;WHJhJ#H@uJKf5=fBkJz>ahZd5l}!0$TySZl zOfXvMwymnJ0WXkfg#I7rob&fRk=K2}Qa}+Dl+}_M@zC^@_!D%p~a!>isQMKxMqjpa`@jJ8> z^P%PUGtfk~_vv<~he$FRi>$Y75dr&EN>N-YIl7xoykakf5jFKd1s3RjWOATwS3|c!0Bko z^HnB*1#tE6>x8=NTa`X$bLh9}#^4Yqx0{K^;tG zkQ7&7NzC`o5N(_8Mg1}wE-AeWt3S~g7A6QE1kyz;>6T?Hj--~{nx7yDv*4&z)xY?e z3kGs0^}v#Y_{DC?ZS`zOE|_w?81YFppYZX}CAc@FT30g|o(#Z4QNc7>c)ZE5EYSr^ zJc`*Ee|w-)k%)5?Yrmp08rf4`%Ge+uPh5==ZYwASxvH2f%6nzAfyh_*JUX&sT**-z zAJ5I0d)ZNNAPJ^UM3INAlB1AU5qxo#0CGFAWQ3jShxaaRi~(Z?m-5^0+RrI18|mFY z|GCI8Kof_aALsB+n5!mtz-T%#urX>NVN8&r(XOO#MkIy}Ml<2QrV;klrScOyiBf3{ zkN=Cd`LYGA$!8mrm^R}_(rkZq=x0w-{Y7{kqmgD|y4?Fuk4Mc4)Qk%{MeHt~#0dzARk zL%o}LDrkg$9G!_s5<|Wt9k&m>uFsY4Lbx29i7aTXV^q9WYHe;sIaFsR#pdnVdWS|g zhx18mu7(6GMwt6DN1g|JmAZjP%@L8nw~EVx?Sv)ge7Vvw*n5@k#v3-*2U>F^uL^q1 z-kg6s{@Ff6{RcH3!X5^0l%KdR)YQI|Db<8?wE zo=?${D$Yk!b0>yXxXJ~x@7sTh`%DiDlPe1@GNl)MSUJ_}3jza-5%5rH5%hzHCBL90 zn4yXZxrebo+UOu4_qBj2lfU&(ie=E{u0RFC5gsv_kNRZqa|;Q8|0scZ-FnbF^ya8# zO{poNu+d^%jKL_`R6(B6Sv+O728olqBTD6zAmkPD>roI06NLLH4WWW zCTIuYy<}WQt}fv9eFto%yU`!46?Rka_cQ*Ed>#(_vn(GIc0Yx>w!}e!`XyW?r*N7? z3}Xapial%}ISR-WUaZbS6io?f{#kBU78*v;+aoB^9@@2-?!qjTq`LW$rOc5$7Nuht zE89rAKZ>fxK57+PxyXr|Q^eK6ZK7Ssu2+@s0Tszv76iz9bJj5+rF}HTt^$>7SLR41 zDWDF?%HkmiBtqO^T&Na&6Tup7xoMiGS*W=2IT>b^Q6I(@eu=fIt3<&KZk1++=hhvq zd|U;g&Nxo1{_*?$h=US+y$UbJ=3SAD=>YUkdS7d{`8z}@T=P`CZziPtl z>b{<{YuYQ?R4~wrgb%XWSF(A{zdDZZMsw6wu;5VyTLB3bU3CXK)B;@%iRU1)STezvm`PJjcx2vP!{;D>^#*CA!V>kLf-)D#+UA~dSp0}sYfbK8ok21kFuvJzhPJk zV0B==+xZ6t%Z(wmGQv1zuHk$HxKnKo6QjtXL2RH}Tn6olb{wxUW=khoP0}zo!Z?|F z)vmY|MVJbdo8{+v!A;FteQI;qs8H}&G!80-9sU*;6!}UoydmFr7;f>X!$HOrF;i$+ zI#D8t{Dy0*ORk?XUWp=DV(h`awHZYilITa4uqEWMTO1->48+8VU>r4o$-49hH!C4B zs=S`FTA>(p8Z%<3<1oX(&q-8M`CVqbBHEKD;b!4n&?Z(6qGh>cSu{~EO3);Hoky)C zB>Gu~K4qPrpekB1=l4=_G};M@dHj4-vXxvepH zr;6FS2C6``P&$q(n#2>}Ci?k>5H6X|0B=`KrTx_}UVoXY;`!?nP1oOr)(B90Dzvk2Idy3GH4>IW7xT1V^wO7OJ z_W`#hI=Ou(X@I2Cg>!ub-=K@%36oG947Hh(ABvhI+E{z3SZk9r>(BTQ@F1^>0G1v}|IQc1k3OEYtO}+Uhi`md5;t=vNqWC$sbABf0q|vgd zZ-eIZE^7h{W|2;H*ff5-cvq+8pZz$J+w3ttpjES3pXYK)m2Ufbj~HSuXQjZT6t?nu zTDNdN{JJK9K|CB2tp}p;gU(vvPjgswX1o`;ULY7uQ&f;HCO-7S)Xw{TG^n5l$>~!f zQ3Q_M!}JP{@^95Y$G1X+FwFkg!SYGKqWm;VSD`2A4CB*AExbTtm&N-vS9{1abC zY(SUHC+cdg9;KeZ?M6J)g;N)l{oXZ5c4mm6XAW{syYyLcwxn}m!W**8hE z72=?qS3F0Bz7m)H*q0*5s)Lc^J9V{-31oLwA1(&?Or4YYTImfA#iJ%rHcsC_s#9*1 zug!cBKqGtb`ZaGPF+WC1)G&ehIcI>k^h^4pTt1ZCCmMiqcxN5jOcttjhNwl~U1Vn6 zUfXnHD>!IV@Dk;+;s|6mVRXksB^h|cH+Z9l?5JL+dL-Hv_KL8zjGCuwpl?Ax!yIH> zC!S0zW>fyo4oeJb1q9WTCrZ)jJz+!iAryNS_;DD`Oo43Gx}AHd@1&i+@kZ~c_j1>J zHJlmZ(qmarXA(JuX18#w^M~vDY&co*%y{+BaG5vC)%8U-?fqMRq|BAB5Sbq~yA4r< zu*%nIu3gd5+1Iy^wh(%VFV1D1khlN!0q||J_AH<%D*lXm8s*E;*^_!$EA3V~?o4d} z&@;|%I8EppPE)#(DSv) zhuh;T3%X+NvVLQ7!1oh@wFPioRlsE>%Lh^}XqYuVe!v!b-_$Q#qSJ+JJ1>P0r}Ruo zczHc)-w5UI5m|NwJ_!>hYR;1g8VpJYv_MGO3zlb4)qC$QVP_xDyR_DzS-(k{GE5?2 z*PuW#mxh{RlZ3K~rSka=pw(JE*9ZE|Q=tofh@Vnn%Yk~&ahk6+o9`99UpuSAOwjSJ z!V((GDU}DQt|PF-Qv!n8y4IRq8~?L+)E;LRf_ok? zn}xEhT)Z_v4JN)>N|lCIKY!Q`$Li%VM_lsN92++4dz}+v_b{5i-KZGqF{pSD%^f-0 zAD+mz713&6m6FMO@8FsuS4xnT$9A9C-Vt)_2Um=ds3bwu3c3rWx>T4C} zz^29Zpew)*&obG6;M!3)i`}o5S44UOjE-~Dy)iPrQ|8D?!hI3Y#>G*vAhBs8#}teS z_BRXrEKDCtDZ9%P;}5tsT%KZVq!P9M1&W`}Sm{N{^`H}{L~(_2ri%AuUE0{7J`Y%s zjArH6hY&CjpA-a7& zk`Jpvq4mr2q}??CI9vQ41C*d=@vcTR2-d(KqCs5X0^QHUFTgRS0HNC|K0Jxf#9CsT zkGO3PTpTY}!@|~!K7Znw89h8qQ4R~!P*X)M`SY6OL)t4hE*;^4PMqS5QdnD>oGJ@e zm#N(De*s&gsq>9-5tlFro;g+jbKbEziO=A$bHMNE1n82H$PXii-!6tSfZ{HBb4$Y- zN5IX`W$hEMej9H`PY7l2bQDUS`77p$!cV5RX0}~^J}!>Ff*%3PmZihk)$z;y_djJw zJ()$VQF=tmGO10U&(8}O<=r>46%y_L9C`%(CwkE{KCnEy;n#+pm^ zh^;JjmbS%?tw54x!^(Q3=@+O6BG^3HnN3Kr^hZtaw&5=kNd%m4NUW72E43;oH3uIl6K6k=MZFMLkVHz-HsaQfsS z0<7dVRpJjZtMJq`yrv!gT*bU~?Dc$q ztU2pu;7f(#n!toiY$eNeZRNi2A9`mGo!Gnek5$?SZ&t%KRvUEXO`o23B~zJ{-hJf1 z2(3M9eJ=A%D7{}K%$M_by5sF3jP0O=kPe`N6ob;@ZC%N^HX=X%i;e)?Y8MfIu~&W% zzAlHBQ2m>o5Nz2IIz@&G?-hiaFtT+uOtX;iZp`urR0(n@*pQ$21B6jY`i!9xQrHR= z+4arer}es=X%ixgDA?%=IlRk1zC_}~dt?WqajuF~2^~Fy(f+@MPml{tcT{fU&HNM$ zN@&kcQ))u)65EkLqCjr*d|jK|wk2X3R85X(v05m zeRkraOYe%<*%1U3SO|85KCNRoTfcpyqcC6BK2uO35tamAzE*w1=2Ij!iLv%Z$jqZw z3laEydOa+o9!B~XNIQ;);Ea^9%#TY_lYV9Of?L}VyWay%$xa~{X^F;LmjvPz8gv#u z{u*FtxP^y3O2XS9E1B%@Up`WZYaAJ*P;uCZtHL0$MED$?2YVsH73++A)m>SxF^>Rv z;Jvowysb|GPKQ0sw2 zoakg$w<~6w_;aKkM3(7kb#W})Z3_8|x)%RvB5v#wsO%Xi67+7XqS6?g8gli)%6yFDC)lL7AT|_n zI9QdvP@aU-=5T>8bG`oN;X^R_JJk^ZIy;ONh%dC!B_;QoRgDLveAmO=Lc|Sdj)ldw zIO0kU$II4qDt?yv#Y=G^icrWt%5wjesT=*rQjYMjhV0-Yy$L@?yCETPJSCQ9F=oVgR*9ZTjG}wiu|e=dR8gJHZ#oRly<~A+=JrzPK9kx1!nk&^ zHY4D%U@+2cbxu&Tw|DzD8XlBvZX=(WMgaMZ5#d_x1?jqa5j3LF)>DngA4n?~=Oq{- zK;o^5c>qMdJ&1hkjgBDxI^AmkUSgW28N;NB&3JX0)9LhcU5zb`u13&v%8qa4E(8U3 zS1{GSx|a_`q`^T_j&c)7;G(kk-(7I)^yj-L#UZme8tgfcNEIUlsmwh{N#I-Tqc=b# zTIH9@(U8!HOUM)mNy)3$X4Go`gYHp7>cFS80>F*t*fp~0*%gkdl4hoPEw0ulwiWLs zO=sAh7V(@c?Ri#&$MGiPj^1yES3vl8v1rJXY3LRUuJlaj`a)Ee3^#SZ*21G85I zMul0QuVfLVl&s>lBi{6UDhSyR_zUC}-mSRrEOM@iIu%xL*pRKa?c{;%JM_UktPEN1 z8i3?-?QTc##aDnkkZiMD?vKHF2^H-EOmY)FC-QCn^i`8Yp3z^p8OBsWH_4611on4vnNIzyh7P01cVbK|R-DUpYLfS3 zGpNE25-dkRJJv^vK*zhvPTNuO0a6KZfMcSHdVo3U1K)g#%>d7z7c-?))J|lkATO6S zhJMqMr?Ss4#tyVlyw*Nvsyk}rn@`Wec5w1PG6}5uFyjENrM!ycv}@xb3e1j?A)}b- zaI-bY14@Dcfmwg6jg-;%=f~=^fGBN*tSp^KrOrED^`YH9P1*SFw!u+uO7|i|- zDFZ>&iy%X(r8GLF5O7OelKle3Ag%o87&_`wbGpRc@JZW&(~kkO%8+^n`HO7Zqz0YZ zJnl*kWSk3>nYGjk!D9uzkP-rVz53#AN+A>4@QpaQ*=3vB=~~tW!E`y;x_V=5&{{)< zm``bSu!E=X7K;Ap4I+vI9(28RkZ@(wp~`FFbIOF3K1zFWRyf@3(PC(MZOW*NtOFlKbkCZc zxhRP-jDduC&JvH!QU)X7sr$&4jPJ92>^|~h-xXe1k=5a;#P3EGFXI{8 zOD%0e?&83g+X=8-sT~Io;^qk@(m>n)6{WFhL&MnKTV?)gzpt zk)&KQoCuqoUlFIs{3=M^iJJ*?(iJB+Zw-3VtKm1!sJ_m5vuFBZR{;o{=rmU8S9`Hk z@As1@dUjUo{F*)qb$9wGOM9`FipXIMF|@>y@?XfI0;Ll3q0JQTQ=+D%D0?}d>#iL; zc-Yo2niz{8yvKVpl9^T^mWL1DF!UG<8T7bWAGNDK0^z+WeMp+1bsE!eT|sbJx{ab} zAf_?@^2}-2RTmk$VFmac``-VDy|q}Fg05DtEGK2HuX%rPFDeLQ+VYpHdB|9&JArlX zeRRSs&?g#|B8Y+tv((DzKcTxzW)dSxXk7QM0voRPbl*54IGU=O;xkF|fEQIgYj9Lw zVz3p3Y=L@sxn902qUjJylh`CK4mH?AzM%{ge%$$bK`C!ju-(T`k;NlG9n2}B*&h%v zZedOKb%&hVflFraS9Xa44}cTL>F(FjaXqvL^o`BLvq)l0$+h+ahfE=!d!xKB5x?r62>9tck=e3ZR$HdT zQzUCT&Q>q>qQ63Rb07k z{kRU*-n^-vA32dE`3Ns_QCaoVWp+3B&sTem#P&d_8-y_hMM`04+rL1diB^(8*NVb0 z|M7eKl?cIv$D0}niF)u-raG%7r1oDZka1xL2kwE`&#gIxYmnrd|BBRs0gXCzZC--+ zRsDsTe{16+806Qu=x2Mr+BKjdnBd@vf@{b-K#iJ;%+w)&u1UoUzHnyaIXUEtoV#C((+%6k_$x&=5Z~2oW0X+jem72J{%D;y}SD=z?h+Rk=j0HoRPCue_>d0LF zuwULdJA^f9qH$V92bs6;V3(t)ay5!mD|Hnlu)UFFp!g~T_rEs#c=9Vvo8#wJZAizRuWRXQ8gq+ayuXjEECRZP$N+=&A9P^1lX%hpwl@E)5nv zDqj#Z2q0bu%y|gnAxm;8h8%@W?OE5y2*!~2BYCrbmPGF~@+_IC_z2lLY$z=q;Qqs> z(T~#i$_2aU_NrM02!Zdugp1FgJqKtre*xePwhyQur}zTqxakt%3NZ=!n+Hz2-qRc# zJ^Ig4QlWv991_5KSE?S1P{bDxvW;Kcj9RSl0umD%Q3vf!Dzt|#{3nbKddO27NN5*iSL4(Zr z_|m#4`}Zqbr)H=~B;&bB3OM|}knF0I&}KiseWv5rWJ-818XfYvzh;oI1ue29tnoW6 z5>$3<%=cb5BFql@EGF{A0wup}@(j87q-jEdC`q(8n26}~idw^<2mNkV zkMOs{=%J`HX(|4?Sl#EMhyxFWthY@4|U|IhtUT?iNyb+rW*z36{{cxwRHmE_j)WAuLt#L0)+uH$#R%>>fUU+&UmVYk{ zV>eiih{P;pd=%;YG+!NZxi9SL6vaA16}%lWqJH^3d8J7CkTtgPJ3h`(k4w9<^H`f= zIb|&Du&;Up(&S9$)=0^m@l>`vp(HQgH~R(leeF&%uLVCxXwj^a^TNkc#+Q(&Y}f?U zM$K$_0iE%xdb>cNp?o&A-#3$CS4mw4CGBFf?+=c`yjUu$AMP)fTe7G!{!m5c*WT_+*-QgkK@ zp?_1f-0DBmnqB;$Ou7ZNw`;&sJvx9uT_8ufxtl4Vh-0rLraNr_ugR+W&K4y*5{{i2 z*F1&$FOd0Y^bkCqYZlBcQe+B)_Onma}Ft_Ba*=Y67a}kw`%=Etnr3|JF1|Nfl{t3Aoq? z8--c=QInc>Vq8)Dnq!^cjDPT6k>A1r`&8HfVQ&R2p7r;(1`##OzmjX+dJjJw7m3Bi z|H|quETZ-G0mlu$4;p2u0-(I;Uc+TB7=^Niuj5{P7U;J;yfa3mu@A4-C^hu8r9Tk? z@--(~uM9=vM*e)$CRU^Tkud<^IBJiV^KT=LQUD@RAQPjt!vR?I{|}$e*!Nj z#jM=or@ywEg-TsN_N+@4gviaaQyDA;5ETZ6m?=pl0HGlK7eeMF*=*?peBD&?9?ZOv zMO@JYta~n8ecfTT)}<7D^%Tne46-qhGI<Ny~%wh$~2=u9m`H^!FbZs*DbKBS@A}UyxNXyQ{(pE zJg)LvDVONb#OXyo=s@?cn$<I9Ewj8nk&7NAfy z;(zYI1EspbMXRQCpvA`9cD0Bl{27!Tf3k=lvACbZ++^m_LlmDXFe-tDj!j2W{e=%L z=M?r{N85gK=WI9_ic!6XjxE2n%I7;I+X0+b5X!e^&``1dVw+6+A2`*p={n+8!|$ar5V_9@YG}+snsrR*dqkGi_*tqiljQ7IgO6 zU6T@SMgp3&y`QsnXj2bdC`D9!Cv#eu1>zc*V$hhi3yN@qXUwh)cnm|V_?q#6yjr`` z0r|LO6V;$RCP$wd=4$0=L5>@<{#FG z^T&88?!myl^w~e9t2o9YrAl9E@|{jP3Jx+!x#-3h=+n#oq4GikC+#!LmLO5hSad{t zo<&xD&hK$*9ZwcAXhMak(t%3!xr-(`TPTzp$QJWsjo6KG=w2>f@0Dmj5}k&yc(V=N zl4r#T8=a)CB&J$4J!Pi2J_B`>&D3Tb&Ko5ZlrDRPtItDlSY=EEj;xUp1u;_)B*?g8ajfAl*>YwnKl@G#;SHDmA|KKoq1u8Nlt!cyQ#D z<(=qMA$~3c$La8#$o)E!6Qp=RMZ#Ncf}xn}F(Ge*jv6sQWhtriKx$8ZJ^8(7Pn3f2 z;oeSf4JdO6dl*iwM-KK;ki$neW45Ik9Z^_2*H zGO$cvPrKuvfe_Bm-^F<%34)8kMO^jd6EVJi;ZKjm>MI>Y7%w?)w30yXuPDz%mB@b! zU4JQX-F4`;*UYnjUwmb)BYUMB{HI0-EelwS+NM=2T#;a4@4D1}_z~|Cz_;|T?!rAQ z>UhLu0DYEu2O(9VDtYsH?Fzx2MMOyn+qp-2ss1mJ=L4jwDU<+jlVoc< z&#-2RZ0qn1mHM-op0JQhR;4nR!}J2Bd5ZIRkgoa z;&dxP(y)B<7L3#5rc|^Q+Topo+)-Tdpiy-8ftQO_5x&4_`?YAV#?`v5@AbZN3d4`1 z9mBgF;k3(;Cx()3)&gG#K)?IXpRS%sHbRNx#(9^QN2Dje@~Tt)wYrR~mlAb{#HlAj z<-V*9XUXfFl;N5W_P#jOKKVoCijeA)EJr>;rL#l754=p^-3ixA9|R2vPe`Jc^jLOw zekQ9@>9IN-PJH%mqJ!px!TV}{a=m6Rq)w`%5Bb>29V3A8E4>0qL_ME4bl^QW##Btwlk1cS` zcsa=}NSTCv2WpJ!f7YNP_See2&tykJ=5%S<(F7lDMYZSntXy5>_sVOt_N3@K$28iK zecd>_2geBs#*7@pm%kULaMr zkdO9*h#aZ;RQ$B=dPyPd9NbYdCqC)-D<^+}{%`>)eqgOUs(fELGoP6M++IlpRN+pf z$Mc0KMTSMkRXnuy3h!HmoSO)I6@BQwnWU`DPL95!AuZDIzoMEbs#t%w2mtZ;U^3^o z^?#Cd@Zwpzl6_@aFAtJ8a?Bjte+t9398PfzZzw-CA1UR~z@m}ckw&c~32{QJ$DVvY z4TrCY0>)7!;2B^sX*b^(^b&z`%G9R7;hznz*LcL_606nl!e!fJBS-01K_+Yq=e?l4 zi~JA-r6tuDdeM8P)GEvgY%Nrfa}b8o{z6>F$1g|aGOV>cW2P~FnrPxG$s%tU!L{YGr&1peH`FZGi6d>q1 z6l_tdzd*t3Z;}u1NS7d6HW!{4ixBHMSl@-DGEg&uE3xIM(NP|dP_Q^=dorH8)dfAy zL^43wkD=$@u6=uT*lX){|{AX0o7L1t>FN{p;&Mz?(SOL-L1G=akt>^uEpK0Kq>C-Qd|lY zx8juVreFVi*Zo&!C5Lbl$js!NGkfp%c}Hfx{R4pZ#Z2nD=9U>Z?bCwmPmkAu53`4+ z-~Bj{7Yk19lh5Oe%q>SOJ(xs&+LH zgGP=O5eb?y%6KYTfS`sD+Np~EgjPh993AsLBZjUMc_8LIs6^tBfRgYER%8Jn1{cNY zA)?}fvRVZXNzRIdLKplXXErbD04{+7OYHlj)iE8IkXaE$Dy5~S^t~*h$$`i%v?z9R zv<+Ww)zT%@+ilQQKuMNz-QY|$QWRBceY!o)#FBpisoFEIOc(qgYUSo9N%ago=b>bI z-D$&g6b?UiT8Uiht*AbzA7-P0hh4XRT3apWjExo8XuJDB@=(HmhfBhMDj{CeI7BvL zx)pLXLMh)!hs+(atxU;A)&@YbNCV?KAuT#kq$6q=j?0hpEBKP<#9vm|Zfs>^szwdQ z6oD5i7k`7n)5HR%Xp9;!MwQeeOBf4SG6I8pnrFopzAx8TWB&efPTBIE<6N4N4kO9~ zNyrbeCxOo%=t-c<-Tv@Lt6_x;AC2_ecfZP15M%p#S1t<8Io-bqqnyXADr9B*rm@2Y zZPtZ7SMx8cM}gUVbxKCUnZgB{iW)BpWk-JtqokcWr~$A>%Q|Q$=%MnE+TXw!{7E1Q zohWC*DCa^Tkod>diHxA=c%2qQn%)qo#30_dWWpAC2YVL7`OWxZ2?;r0W>7mt%IN8JRx z^CwdeX82PS(Gx>h>5uLCCvpF8CSU2AC>QIB&ZCDHE1o ze5_GImP%cppFMr8fTn&g$OHNWzi`-?XH|Fn%C248VR(20f%o_v3uj6>qNKrs30TDj zsSg5$8!rU7)(0X$-_Xs*7|-=s<4%HLs>(m+MXC%>Nz43ZU_?j%ENN!)z0K^Zj)_kz(l;HLS>E1WHaHZ_$u$Pt^PLXH(M&`&Bnj(X6of`e z<3=`|5`NDROb%cJE28m?Dc_J9I2KFHEH<@KB1vfqp%7UPB>7Q+Rsx`I7VKO(%L`s{ zEwYjJ@?GX160=Ldx~RqL9{%{)QcXYpikGX!x2)9mOq-+nDC1!XEL`CDvE1OWBo*t(5Cn2sxjc|)vXf_r{29$cY`t*HgZzj{lRZN4d~+GoBS zfIIW=sZu=%z<^SSIiQgTzpC@4EHLNTOMLl#rMO;!`#yFXzC)!9U~1+Qiu|q?`U^&e zvp%()Mf=O!!j}(IUVNXCbga&XfMQtlN4v>gpT-|}(pFwpAcm}Ti;3{2SLh-tGi~^`ko_hr zkipCrM|lv$1A9~}QN4Y9T*VGc+QpI}Wf#B>4~Nhx{#Wj(`pbCNw&n`%ve*S`FnqVW^!dVq4^@S%)Eu=I*zEK zW4IPl5V22t<5;GLKOr)Sdz)^oJ`2u07n6ajSv&3E4 zDAqq}+}@@;*t-p?-=$Q(8EjOg4uH6c2GD|?&>j26vXKuMUk`@k_jE3QXT4Pu5KnpG zgKd!_N{>+K?UG%sU&4TYMv>ATg-j(kyUJJgm$O>cfKMgl7 zBXzcXd+6d6`I~aCQ-Kl-y5?=IqZ__vj&K?j) zjxlj0TKeXybv-4M4Chttby#x)eO4>3Lsjb&6nYxs_EKsVShe^x_~r6`^DD7< zhJ^}Ba4o{6BwIw4i(F_V#9zpoW9nzslvEn<-jPG|k*TG&_6B~f_#(;{4le!zNM3S2 z)G_NYW`?I=gG0myCdvcx)tKQpYIKi%I^-;^?hH$=Ax-NFNq$NZbJD66`SizpA5yT> zQJ9p<$9^xw!@wx^Erxf=Oy!qGOA_io1G3Z2`_VVu3(HU(IBsl|P?G=ENWzk1Y)|>D zr$LdufGC-D3#g3k!od*hP*Ongl8g>nZw$3Pq%)t8M;n(Wq~(w>>6| zZ*LWKvZA7Xr6LYZj4@L0N#!kZu76j zov(e*o)6zoc4a;?qVo4y1#me;14oDIkhaozo0+7DL-8)4{KO8}Y{9Vf0vdE%o%kU* z0c3@egACv(-}YgUN}xFJmuWLSb>lBQvZ>Q85=7>^%iCO(y@MmUL!9JBOo8>@Jv2w~ zhsk)(^n^j4f?7DvrT+kKHs6A%K9s-!`_CM1rZ{A;#*mPjIBf@Y0CXing_X8%yyV$2 zRkMhj0w+%q;kj6d^el`{GjVR^9)ZKqyh*>ycV)qjoEJ$AU#%usmOR`}I#DyAeVxnr zsP-OkB|K{DH%imszWK@NDu4yc7v%HUA8iOF#v%cOVd&gj$~=wfBjBV%>5A+FN+2>6U+-i!ybuh|$h*PSMv*RrfZ8TnNsIu&!0Gv8HS zvY5f#JdNTSYG%B>m)$z*Sx%P0PYUVL+r#Z6vY9XC+;A5J5Op`k%81&ZCd zO7CcfBp+r`@7WFwyF!M1;s3%}7*++f8@wup>*pKVzu;U#Y99O&u-(yTy$Vc%`c@0h z1U}Q*(qLk(L7oQXCAbcOp>t9NPK&{RXjR;9@pmVewhFo#X%$Z)f>>ar)DG7htMlx5 z1eb}szGHRkPi8?nhBFIl-gM27GSJ*&fb)G;;UjB3e>gPuN%ss zRm&8JBe1wLbACBJJ26=;6!4VMKGT6De^bW`>oz|>yUCn{6AD?`_Z+s-1DrfD{^$W+ zBw0X-#*=YT6Ys>YMUw7STpP#g=TQ<3YaBXb@T%|+pp{Oyv`kzY9TV9CqZ~EQP*a#oZRQQeHCg@e(0W?bi12_VR@s#9HZtpDsA*T&4qsew2_$G zYm%{H2&e>So!W*fBKX!VO5n}jE;2{OO@#@9r>`gqnysrUIp+-O^eDsgFM9W-?55VJ z$Q1?XWO00jszek@R2ZJPSA93n#c};b&0lFh8PCCrlakv2WUWgP-sU4|`v~k)s`}Mb zh-ApaF0Z4vlaI+Ap`Dm`$Y7Jv0p`FIJdCyh%E{3Vk*2M5d~ob&tT_rWT8%|b zC-NYa6bhdLy}Fihu!{HXmUR=L4~6$rqhQvxNI7T1#Bcg*>D{VsI)W zDYGY9f};`}6(nb0OjZ18Z83=W6E|J!q^%XpVt?UU$g|PdDFxVYcyIj86aR1?Nlh-A~dGP-isWm*Ev{kSP!mM{3d;xJ5M$NNa zH@ak1XG~#?p)}@wPs{u@EnrDj_7(n8E)<2?XUe1!->NfW4?r8FdwRV+j{QJufc3Y3{#pzpa(wrZjyTXQJ(Xma|hC6|h9X)1B>9NBIb1}%AYFC89()1=edmUV8&|N>Hp9~9}yX^js28O zTCmN8H`)KY65>T}W?rNg=LlLzMaBA@Bu$+t8l)D%MHNE`4aAJ9=lnc<0yHoFl-;x>jd?2IC%{ zL#_a#leHY5(oB1;(%glmAmiSJdM=@6#rnF>6_}RfzIUuzNTArQ|43{tL25;uAXp`V z{Y4pheZG+CY@Yy6V<>c87(^7Cx{vpc+hLSelP zDVcM}tJ+7@^}`Z*1L;iL)(ZOpn0T+S9sbLSG~3zne4jwP ztJ|&gcL&c0l8b&6l@EHQ0s{sIqN^Iz2{fUn{XzFoTR|8w^O?vn!kkV6J!yVY_#j}& zTvkcAyx=7@WgB2GDwE? zH4YO}`tlDzrNI8+O$=#u;+12=J*wgs%l>w=?im5I0dJk;YvwdOIoFmtQ9NRf$FePV zG&M&82*3`HO8iTdT?Qq<-gDi@xt09T+3sr%C4LdL*M%!RG~hT#As6CdB$J8E>!?82oQ|p+3@X8E*9FLX}bHG-D zj1Ljo098i^h&TG)sHj|YMW@ftbDh5hqOq`E%4v4o_<8xZ=pX(a3qfEJij4ee>g%i{ zK=$i)Rfse5v`au`l-ZO#KF78@7Nx_yF6~ywXFH!m?-DLV4Z<0LPxqu1MCkd&7X>Id zuPAo(V_rX9hSO3nASDr}YS4{+S4R?`RQFQk+?oC7p!KZsGNy|l=*XuuD_iplJ-CQI zPh}dC_&bZcLf%!Ee*kM?6D@^6iR=-bY+hy~4QX7e2cuFvyz&T=O?pOz)FbdFYrE7* zT(fTX^P~-N0ak%JG!%66bv6e#!HW+l-rGBZYv8s-E zG>J4leknQ2bvDZF0Bd-M8)^3)%f#}o$XrUwKm!J^w;ES%gzjEZT(0QdRvms5zPMGB z#xsA`)0B6wyw*d=8k(q^K>P5Xi!}#+?8mu!QW1+Fy&RqZAu7g!s7^4U)3pd3<%}b! zG-|+hSn`oCahNL6KB27)iTm0$DnuSZBnhCz5AP?NqR62$2_|Ho||;+uHVL zvCo|1t=Gp4$$U48Jj~+RR{4|F7%edH5^C9oPLGZHict1x-cL-* z8Vj>kx1QgH;b1xSA{EF5ilEL9!!3wrfq~dW<#UOON@VJK>_h1$?uZfRK$5vh8aZB1 zV4$%zB)GoHgiW4+K<%M-@bL)d{I|vqHUVqy3D*{i5|vQo$9%MlghjwMMI}2LyyN{ZaDxl~b)jMULGyeRBkq3FyWn(& z;G2?z)C4r)&!iJ7bOhDE=GvPviuZzo!_8A70M}A|Dv66Epvha6)n}`TYx!vrfLygP zv}S`wa<0oTep{R>4zUcYHOIcz{Eu!SYxaE-zTfK2q&)_w&d4sm&;KL>?0@m3_G&u) zVd8-~t);!KQHC{$R?`p?4IIZ~08C=St+7{VzdHm*y5Mf+KO)8-&OsKL*W8^Ov@VKE zMr`6SI}WkZr#A$_ivU|+xYbmgHGLi<>QWUg3WX|q)A*9#+SL&|8Uy<1&J9W*Y1Gn| zVz7{V=%!PlF*Bm|$(nB9U zCNs^7O6}Wx%hE$5%7^bSLTsVRP3&Ql5<`{p3LkOSmaw<-Er=(OEk8L(@W&x_=22g< z&P6_c9g;{eHF63&ueiM+*Tcxib1X}#Px*akz<48Yc3d8e zFaoUY`{G$vNek_^bL&5^r~t$5n7Yn?9L~8b7ODD8E|(6%$PIk2U{%W5IF#B6iHd@b zt$48xBT-N7Pwa`TNdga1xp4uDzC2&HWo3VwO0z}mTFd3Ta-6l^j`&sE@6m;!q)C3v3qOqbNSY3I0>{msur#jh9v z^0Nlv^f}*~ILh2F#EwU5N;U;FmLj3kr2$*usAmNgC-ZYcpe^7S_O-$$U6{&%~snq?IYI)CbQ%-hqO2}W|Q|-YDjmWJMwU6UN^YdN-p zr~sTq94+Rq6q$gWkUemxVIoK$uCU%>qNur`Z;%0FjxHu~=ec4|n1-uMxyIZ)0D0VC za4Cy=61>@+3v5|?pE;i!7=UTa+R~%JU7)6dSb(fCLK%W^DtvJLrUMSozx4|s?tz|? ztabH&=T2wtTsm-AN}vCytzunK_-qbq~)*k~4Ls9yv$`D5RedYm|AJ{2R(NAJcF2HI5= zg}5_KVrjvsVELVpaJhrf6zvF-@XCT<4db~s0!}N+-6Kow-1VEIGfOM&5efh(bd=Ia z$=^Oi4>T|x7S<@Dgz?cYIzu;lY0K;2?$YuK;iL%Bhq?v>m#|<%?V}>Is7JxemE;sxZ6S1L5tAe!n&8W3RjQ-$kXs} zu!)r1Fl22h{tp0#<+)pUrtP`WIV}3{`^0k@vcc7K*}H_3)E1mTYHu5b&m>j9NUC%# z-}aS21FTE!6_&#i*H(W>*5E&&bO_4&BL;xZ%L8kg4sy5_BZWOu8w#dYBY$bF-JKaP zn7#JaEDCMC%llkMNY)U$AsjHpE4};Tt63r3TYeecIM89EaAPkkS$K&6S8_z6t3V^HiD* zqk2fkC~Gfq2v3*-?D_2Z4*>ZeKwi&*K1ylMuYi+>~e^{ zwpDc)u)%bxRBNGq|2^IUT`9UU-t_Rv0>=xJOr`|9`sbG~r4+1n&#V`FIjPBnu zmV9(^#9Y&`Fx~_VEoMMt+fsi+M;zA8`|=)F?OsQxhcJT*{1Krk;0zT}&sBl5Faio{ zh6H|KQr&UgNoYY93iCmy-2ci&|Kv*O`C<4pf=!828rlNS4ivyGvoHWpJp{a3pKfjs z5C>Hj+g_@an5&1)4N(GTA3J1X$zqB%bRf!N!htebq>+U zVBB8bD7}8ClE_<58lTt3%h$Vxc~P)2SOzB$2yLM@$D}mm_f%QGd05ipnf(?r#qKTm zAN0ijVWbSXV>st{80VJXit{E|EQXRbv*jbvy~sQwj>5+yA?)Ab|HoUimWA>817&6$ z`d&KPxGdNrTZfJ+83;>8r;`3vP@io9;y_Y1xt77f=xwE5V3N93>keI#n6sGC^F-+* zXqR%UaOG0um`f1J*=T&i>FhAZ8z3@~H$Ah&k%`)Fq0{@o2`*4VcwTlMo6Z(J7dwiiin36~Q}Kf8=XTc-M+F!d(O*+?Fb|U?@N(E)_%k57Oyx ziyrf`!^mXRK>yw`V{CgHN5-%ZsX<>-d)jmWp)@C4rvH~Bz_&TCs8tzE8=Rm<|j zRN0&|Hn`%?%Nk^~X{P8*Nrf)UY};CqaNuZv9N<3tZ>m7Tr-jB={XtaWf?!P~vEae7 zxSw};8yYr9Vu{5XY#g*~j@XfGW_j-w&0lR>K%v|3QZg6P@*w3HI+Y_=2`^iz&9Zw2 z2GtvH6#SE(qXn)%fBG-F#B(FI8D$f`FQ>=4 zgwKyFAUyPAfg9lo%^4y`Zv0{?nlqXb3?<_2l-`=c!3G7pD^|c`+B!%hs~TyEH}Gab ziz2}c1Bwkk(Exd&GO+}IV?(4y9)&WMk8+J8RWYGt7(7z>z$t+`C&|t5ef-n)gxp6` zFm|vQ3>m*>rv?p1EQ@%*}o^Fwe6zN^oCrxNFWTbRj5Iz-9XhpT#< z!>;n|`_Fc3-mi)>ir|3gHm1hS3(kI6j{SSBN&^ntNwyK?bv5&j`gI9aHw#-HfX!YI z+u813R7mBBAzFZNgvPz~BC@LWpokym78$TH+4L2Ant^gwMu&2ejWQ!D1&0wycxZ@& z4G7zjYicNKh7 ze0s1ddTt`)T%~q^!xyCS+9jfOpt&I~@<-&b8IZ%BRzwWNcq!Mh86H#O7Zd zoJX*1^`O4;FXb5miF6>%ZY3!daXufKn%l}@OhE2%HO|idb zK3#l-whX9pB0h=Zg%gHIJGE}b8LPN8KmaY+V9gj7*`U#r6!ff4$+pyi>uB9bwlhh+ z6x0f6`@%Uo4(L5+ES4t~fk9}npp;b9u+vzXg~Ub|59a~&a4$R=U-UdHw;r%0kHOqR zYC+diZxmr0Sc(_S3W1qXn{trAI(E=`QFU4seyeNTif0vhT?);|J&Hq*p=oX|6gtHk zvGTt&5WmT`WQkUq?+Q7unfqa*q6K>#vz7LtUS9TO@y^z#rFMnHC4(3|vROu!jcRT_Y$$287zK-kJ~-9WG_uF=}gdHK{nC3rn-ch z{s+K0n&EiuT@pRY_ACTGwjJikA0nmGBKV3@=T-Q%{jHk-G7a<$kvi+O{bYWt4OW%R zQvUzpM3dET53FmO(rMFmM+vz1<=f3v>69?rai6xDvQ^70XUAs22l^e;9}mdrkL zo@u-hx1`zet7%sJT?8b?<2UNdC6LpJJ)q%I)0}!e^U&SimR#N$9PHUNkQo-_KAtLq zPgHA1txgxX2->Dkw8yZu438Wthlk_&m2DwGnVgvA7`U7+X_^$z@kwSVR(x+`JB$(; zE8J5qgwj$?3fzcAcpS^ixaq)Mz4)k^f+R|5Iz}NIxO&BE`XLCzVRVhAI4dJn&a5Ow zn*c1qz^(QWD}j$9f)YOsRUi9X zcV|HT2KS{-Y>L**G~6ws7#ll$=KaKh;ek&zPW#Cx9kj1)-O63*-boLN=eOUMM9+6=r|P2>h<(8x)Ls(<8<_vOBY$fNX-TU%S79w)dx1p zV8jAZRDXhw7Q*v2cl_1VvayW1n!WenTts92=sduqUU=<-NfWiKRL zRddW|HyH=T_lpvDlekqpd+iXAC^;e0rQ*Vx3 zi4Ulr&UCVbuk0l@--aFxHDA>K0cd=*aq!bQZ28!Mei=fP_V{X?6*G?r+Et)Q#z)EK z9`L{h;9%gGDbQ)uMsD1cx$R;&rlrb3>Ujv{X*cCtE*bnP5PL=HhEtO34~7^7!B+l9 z5R)GOpaIGl8R{Q^D1+BKP8A+1yd&h~uy7qloRYK32Z+(=0w?v3tWx8)m6-p357$~V z55syoi|yzBCfLVGmlY(+UR|jT3PH|pPFEI&?ayfbA$5J&7hEb_=-Kz#Z&?4r77Uss zw}MVh7r6?+kIG*m!aK+oWJ3gjn6_7(=I5ZJ2Z<#FkCA4YOsw2Owy z1(t=5V};r8^w@5zd;1QM?x@Dj)qm39D!4bVuv1wst|eM#n@Xvb39&pp98-l)V_orn zP_S1fNvPsPz=g*ZINqGj<~KX9o_xQb1lgS#+r8`X|;Y^!;kOI_(#7xTBOVUz}EIW6?kqYtcXF`R?e z$EG|rY&y=QQbaA=2GU!DB67x+crdHG=|787kQXlZ+xGn&BGSyBd3GbuVqg%K7ZUgz z!JwTV=fl<~HnQnNT$_WH#*-vXu{%F^If(~(Nj_1EcSdAW`*|Sml;eT&t_Sl@rD4DO zeMAR#$c0(BDmGbCD=4t>4v14$q(QrNF(wyD$j&dm=%K65;mF-Ne%+b`Dy4O`NIvzG zALmH=v~6Of#%@U9HHU&!+sL*gp-40&z=z;vG9`;ZYpW6~`J@T`Z?l9(4gM{eQ5l?d zjoYSCDK)>TPy;O&dVK4qLtko?iSzyx=ciA%)P;$~z>{_o(K_oGJyc8KNp05>1T{IR zn)A9>u3DdbN`vp@!V9cF;rcDrQ?YVKkZo_ZQD*uNz_MgHi`9}}l@vH7TT8JE7CIIK zVyW5bYvmVj(y?$&J-lu6@;!?Rb2xXvHzt4-43UARVdQ#L%zck1ic5I!;OCk+eY5W4{Mr(GXeq%@1V_PGW zBdDS16P-fJ4}X6{l<%Vxb&- z7MRh5P?V=h!g2AlI5Ei|vV2@?E6lKix=U0_1`zrwaN*a};6JJ2qEZH0v81sDuzbf@ zF8OGy)~l8w7a4nGYzw>f2`%)BPCsN-ODrR7G%3>~23NSV=%9d+8OpwQc3}Q6+zE!# zvSf{;jJO+12B*N36ui^ENOnIOUO=w}gH45;*e4x^811+eJ}xoT#f3C_D2RF9t++03}!g-CmxQ54p;g)60QIdhE9VaJFq3V z5?_zQya=5Qnlc6+fieYyCTa3WEHE)79d^9~;Y=J*Az{W44VJ}5HuzG@!=>Sq0x%V$ z!0`EEdTrS6#3u!0#%5!;uYG}ng+nM=-xyL!ZkK>EPpcuBK^k<14sEHLML!E;P3Z_8 zRmBBwJX`<+dyzwASHpwokDy6ob)nEsvkkvDlZ%qk?m-J-NHI`p6R8p**!n|w*%P!m zSeO{TCrJ%K;8|w`6>{!^d{&9?R3$h?#9al!VKFf5a6zQ2fm9(P3%p}EXW^AoJPeZN zev4V2VbyC0;YzKz7)sRc|I49Lk5Z^j$1~}1{BzY~kp><0L{cSIQn~5or-&f?)51rD z+%b!M2|AF%57A0)Ba$iSYn=iQ!!Is~T^AT^a4mP2Iyn?N{~u6~Zs0Kc&rbuk6cLRo zxu75W|3%i8%gQq&Elu}Os2AnL9BvIjpAch`GhrYc#L~T>$rN^@PP%K+S-{ILnTZpD z9fLe2`1!%bD~l+5wB+J|C!q0WT{jag-M& zJ8+HhV{n&##A|mE*^q`JllPcZYjiERQX#mw3L&f2hfDO#WXrKi%Lf1@zb#+`?n}|9 z;yGE>r87>_MT%Jm4j?7D-$X0w4&QQaDhmBl5H|N6iD*klW%z7{)IKsnYWN&l5mcS# z40#2b%e^Fh$hD=O$VF_KfKF}dXg`b3dLfN%EJ3jP^7C!5yd5sZM}ue z#lqv54Y?v=CW0T;1?j1hebG2@3%AY^36`ayGKOkIc0nQJ;jIjeUNe!TmbU{F@=8=7 zHZnMA1tU@V(1y+@Nzg^1%PiW`_5nbNMJz%9DJXINrIS6(in-?eVtxr7$q^5r|^B za(E@&3*rg~(fDf3e!!2&KLlfF@@iiZe6FC%KypE%N&`ccNM>>Z$tAnViOE9{uCb0d zYGtqY>ZhgkphDc6QX_efB*YVEWuOA_&i}^JSMIm$UL3g~03s!H#Y}*ny=n? zaQB}>^ZFM1n{`cg*M^qbvn5PMu3$%Lrc7sr$D>(i(2@osZwkOi6slf&L-g&bmd+y? zwLQ=#)P8iTBtfS*0XBh>`@W$Uv0pe)vUf>%T}p6>{X8o?iDo#zmEF^Dpk>>)oEWt% ze8^UM_x_@eQ;nM9+mQF_wGz_D^054*3VG<<{3V)qnfd9-vI``Gk&%63HiaLd`YGKj zgPHi8{{w3V|DiQoOYmT)=nX{iJNi%Oe50VaKgS|RilxPI-?GknEYRAIKl_5g1IrL5 zb_PKb<=WAx8McxkcJ2IsrS!jUf?ygQn7VzB`o8v`2tT|Z2m%7Ih%302?3BYF`>tMm zT9t@M(CS)*#s&v;C{#Oh=8Ks_!IX#)o1xLe0QL}SdQ!pfViYNAby7bhO%UHvF!!m| za5UL7<6#8W0a~1qrOcA~xI(#P<*^1$7=VGk=2(H;*U*O?fwO@PZUaA}kG;F^3KRyD z!!j;DofVrYMt+rLK|&W4T|sKa*MQ1xsv9MpU_nI3HOB@~v1ml@DBuN_fNdAOfbWx_ zU}LD{5oU`D3I-TM4@B^(%%@33FfmQ95L*!6b*=XD|G+;>{}@fH;J8=WPgbHWu9mI| z3>?n<-p|EhLq|lE42>|DL@7X;i=?F!7&xtfIIl!tGO-j_gQK@xoM`9(tz;d%;4OOO z(VNN5xHCpMCZb}T%pFq*2c9+&t8@=cEMrC2AcOt{`z`(`b)TOqlq_bAe^@2{IFXfV zk&ey9Hkp+*`Ll{GG%EG;F7LZ7uJ%IH^T==7oAv4IWe_AFMkpHRif0P~>>6a2S-w(S zK|ILR|Bs+m*eA@I<6QkbA(bp*h5z(z-^WXwg99AdpO*@jsx@&|C;!wz_1`scWegS< z+(j~btVeq-fRW*kgk=E&e?4knSt007^Mj7Xx!o^w}N5V zMPm=!ev~3CPuGAyo-sII=)E1fd*07h|?+Hom7H|!fbe3U5A@p$9Xi*IqDA0kKlu!`B>nL~2 z=oBv5K0h@FEP_gScrjC-T(D*hH@{9fszXX=c0}+7CZY)}oqjK%W}8?d0ebgFE7`FQ zaW)A(R<{9sI>C>k%1tj@D!VUZso!9+g9lrEU~QPDv*JXqCO^I-3x$~C7l~w|ff|cx z%6!l;QYm%8l_|=mLe?N3MgH1_tO-m;XMcdhuylQ_;t-{Tmk?Ebg%1%y0SK+n2Z*^) zs-=$L>447a^|DnqG5alcLoOdO9=LUEjw;B1-aa`T5r`uLi_jMI#YR584WLy858`H~}4A!f=Uia^<$q#(!SR|C) zS5vZwm=xi#lXzG&KrYIQ6+}mr86^dNS!}ki|LY9kBtwNSbCWRa58~^o(%^DobgSfu2~r^iCDuAmoT4`6^?FL%!b07(YdSZHjaCXj zX)fxc0bjHTB=)>jMf~MDyDHf#{MN^7M)=MTuABe$R;6<#muz23Z35HqJLRI<*dj}c z+#&rTFaGO}Q(D4!(2x(JbuD1dO4!E9|EwT5*@10=_-w#SP59wY=;Bvw#YHs>y4F|9 zn_a{37(*`#1w?gz6`9U&YA8I{Wo?fisuOu=jKOFV(&JocJ=cj>W`)9T8>X9kEgsy- z*9D~Lbd}%gc}T!{;Z)f06qC2wrmpYlptU_$8WkCN@NNRK)dqHpLP8ww{$FpaqK`vP z*0d=YU(>Oen?H_FM{%-DcpLaaL|u>4Z85hOzG)0PZ`m!(?s?A|oYxWV4jOLS+BY%o zBjL>MC-fwM9xUM$;?h2n0BZ+}t!OD1dpa<*V?i{t;`g&i1f^ij8zYJ zR17~f&U6jX0X)yY;n;1Hj!`4;1+5e47T(k6rE2zA8kP{D4=3yn1~_HAc{@s0*^KH! zV9SfuWx{a8jT&(1{za8>m^pWjQQDyp{ezcF1yuA= zLINSIQpoK~w2pAk`fZ_pcSwHuUxNL{L|MI0|git90m`8o1%- z?sQhzhZR#f=wg8`isYV_MP1+VWs*^(O!3;v5f+tSm16iWdC-G7Gv_2r*D99pMWDE-%St?izo##21^$pXok25I89MdQOJ=2s3}QwLxT(J8&C2n~zbCYd%NCTXUf!LJ+yIORL6y$M*u@yF*}W)Y`8aBI8O)4MAJMSe{MZFPja(G%$NO>B zz_jPDarnH^Fa0d&V>Icp=!+KYvV*wVQ=kiO>JeC<^!iNE8eS_Y%-NRURp%H;Z$i!| z+heISOClAi={YuVpsijwUYESJtzuf>I?mOpolC{Rg?0SHcd*l7%a*W)d5!Ky0a>H- z_AW#brjjhOnLy32rEHYW!ISk5z(!C}iiF>nP@b&VZx6$pZBR!SrcZ1mR0i-x0!~I$ z7UfzBjcKt!o`OO1C%qD_$!@VfS)Ymr*G6?6m%}3c*9L}n&VG*lMSx02sO~Dn9n#@= z%Xl|ri%f%ECa}>K9kgtX^)g8>bi*f#??PDhNFfb1BD|d4EI0GjOly(mL(hA2muMru zw4FB%A}oxcXW!f6jp@&PH-JRqkT9tkXUDjvg@)T4J~Mb6@BQ~fafiaxH?8x9A%{&t z6?V}t8F_#939GWQb1R`k04uU=I?Ki)d_a`1cCa`S&`H`QB z*N>p(ZpqLW!W+oq%+PtMZgw(2cSo{dg_;j|R;5Yh`v<_FAj!v>xBvw6$&Q`tSZ+x? ze_v0s6gc|(ry<{c+Lpc#+n<-n(vkPF#>u&sZ4pO@Itjcg6U`|0B7pgGPY{duA+cnW ztj@!$oANLJ01~gQUh7b3SS~K>`vH`Uxho^>^BHt$56UA=YtSh~>S8_Lv>&1c#O*xvd=f4Wq5deou`v7JHnG!UHd@Wn3Q{r z!QOaDfb+4}x34bprLOoQIG&+}$c$TPqzlrw|LNlYJgD}Y{Iu;pQo`N5lSbem+Bal) zFj}?U(L;US(~KY5{FE?Omk+W?Q71`(F9nM!=CeQ-%Lr~(y$GXw`*-Qj{d8IvEIQ2} z(rGwOV9MJxWlt{&tWgC5C+L`m9yQL7vJAME6V;J@4{R|_ll=CUB8(xP3&BCGzym)+ z5ON0z3r===hRl!7N{M7wVWrk-{1oL?_#cz^i*ZRE&yHejnn~8U-aGEafl3|k4ZwGC z8+Pp%bpuT`v0+E>ev2qok_~8X`~OZZ2Vjjd_Ng-V$$z(qaGG`XbnDaSdNr^A-)gVn zT%RigV<2+?ik9n-F}2;Q;9^bFtl)e$^_XY@JWfx;;w$u!J1vcq<*CuC4Zh|!xQPkQ z%P*ctDyts?3V_Tgm)2JBdvE?d!7C51{*3ES9m_)2+gX0LJ+hlYSHT&{vCStpt7~^QqK9o2Rkq$xPivA?H_N8A18?^yvvZkdxwVupP9h#Z3Xx z1mSgg6l2UKHDs9>5wZz{?k3XOlN zS4L~fYXi(c&RD*FixMK{{*NS_GQBcJ#a16L)Y%(p2E_WYu(U5y3}l(LCe|$sFdiU> zIW}!xtJiwH{~CsR7q60~3|}tmV5WhGpqCmq+y(nP`FArbhqC(jG$+BCWNf)9k}9W$ zyjo;2;M?Czm8|c%71yh!W*`K`zg+!#4b{^ydsfuIXuReyiL8|NT(5RN&CFbnV26TbS@(pD7^1p zYxphkYV6+=-rsQaOU+Q6DL~;weZ(r_B*Djl|Mex#P^n@_A*{M9n|LFBglKz75S)JY z3aJq_vlV5Ot=UcHGwPhJCw6Wlep5g zAW9eaLQ`5>Wqliavg?;paGgNzyN^i3yqWFlppK+R$!Slo4+MFVC4b@))(@ z#5XQGw#XsN_t_T*8H51!h+FFz(p9mbz5JNP=JADLOn}&B2{*E0GhxL16*1yvTK|TR z54jQMfPZ&RzHO3fVZQKbfO#NMM5GnR;Sy{%jAF2PpY!01l&O7&d@-ra%UGaP>-Z`W zlAC@BK`NmyFPG^#Rv2l+gwTQnI{11h@K4Nr_omid!DDchJAmA@+rCcKsiAq9N8`Ns zWv&brmHf}|yuv;jKw^JGYmQe6J5PShr3gtaVRhv+-NC6VXrWePQBAA7I_RGQ&`wUP zMJ%?T+}afh_+dt&{A>opW~uY@ZBemg2}->FhezfdSKPhbezcb$Ft^aLzl%jOv`0Hj0b8mZW^ST^@@<%ViJB1PeS!m1XIMYWy2m+2ti>Sb+@vZF!%^dzFgFE?7Wghl0@zbMy># z$eqOICKVBX$xAoB%=+=o!H?Nn)8Uc4`D8wsFCKgHXD_Fk$VxLmoMI%+$3MG zwN70Z_U9~hNHTv?ac92*xWZ8|qYjje8lk#1Vs5?}rcdkIb80knT$7+rU)%^RR}sOn zB$Cc~mS4Qc7ZCQpTEoAW0iF3nX0-OEs;iBGHznZuQ|8UIh7{>?8f*eMGISX##j->R zY4N<&;8+E@OgZHjYQ@rUd?xW5@a}+9ZPJ?u==T&|jfRQ%=Z9vop+4n5s44hLjw1-| z3NPq`hi35~t!XEN*517f!#3-jjg?~~WB-Vs@8Hzf>9=T~UwXba7Mr!1E1=F4LKIp$ z=6H_W`;t$*r8W+}9#r5#-=5%Kz}+F~HWQ!syHV#!w>pYnX}*!@v2~$|Ly5+_8U1D$ zC=`3;!WZ85qbQ7}_A|HJIm2(?-a&Bzg^?Uq&b#Hagl@_R@H;vZjb^=)^q*sphS7a5%Ab`ZX`roKD268u+8kT&G>G5(m z4MG3WoNCcWBzF#*(VY@66ezyUY+^fN5V<-%fYQZ(<9HrL^nPr>rB1Dsn@9! z9$%B#5;*WRaEwa(J)iBb2|DS$WL@1^_?V``i-V>2>*Lv|)ccunr-AOAfrfb;>$Q~A z|A@eK#|Gp(`Xk00ovhIm3w8FSR|HFFA2-qa`U+hxHxpMACv3yYMXzxBGXz=sDVeV= zJ6}PeDSXO}-k?8tqFwto8E++k7yiGor2~gKm=Kh^Wug7hR_&1P*}dtszS*6K@@<&s|Rz1z!3`Fixq zU7l4{n)tN1HOtK^tHtc66nwdn+ITs3A0Zo&#X}`!36MWxZ@{;n9Vw694vf!8?Gso! z4S|K~U!o+PXRd2zA<8gx6WRmIY3)DkF}AGe^Ha1x2fXzd3*G*8xaqBFRK8xB&bixp a!r`>~@nt4A+93i{1EFmdOggmxGx=X_m@4A{ diff --git a/website/assets/img/social/preview_alpha.jpg b/website/assets/img/social/preview_alpha.jpg index 6da62256986825cb2b62f10610a18a2bf3ef6818..821db408a0447461206e3481eca4be2ba3681b3c 100644 GIT binary patch literal 386720 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 U-_Sr61^43=f^zs~jvRaN>7O0W zphBkh=-~~cXw|Y=a_ga2C+rOo8m>0_0?{3C;F1ONM%~|VD$424F8Ak3H4T6(=nP+Z6h?9)hb0;JVbtdyr(0rW4aWTCOdIrZ1l`m_D0qwb2ULc zV*E-$YePnGH<_*XJnD>+DK@m_D1q^Ut3^_1_*>ze!$4PbrtvPL95D$>*P?pd@=@C5 z*!QJQ;XnmBmwl<31X{dW5Jms(Fc48`{=J3|m5YLJ89-w}CsIH)-kW#qS#i9{AV=<& za(e}~<4P=+H!QtEi;SZ~0qlO<%6%nXw$DTwS19I~56Fs#5(T}*+mVx7d$0Cku)ST$ z^ucAb7oW7CM;~aTrA**39@tPaU;vxAg1i&NRLW&H<@$2_vOB7$!^F=ZoYleVnVZoL zSgMWoYS?PDdKbRecQwq7TO7U+uHL|ogNi$vo-C*;PG38?n1n^z~BQYA?IX4Z}NWX`hr)z7D=}>(_`T zk5{8#R4iCzGw`9o0CltGoed4zmgtQvdNFUFZT#A8if>I#1=BCbIqKn#88U}~B4WX* z@3hK{qq4XBntGjR1IkUdH_INWz5gG`V6US;g6V^TS3UeUY`ZOE?|5_41#;y}&Zd@U z(9^c(aM%(QlgHUO_eAVw(9`$kaGZW7@L^da6d^`m@T&M|Hix<=sgTOkn#wL4P14YE z$#D(@nP|eVrBe_&o;XJCjr7*ti&*XC+0y;kYxbRpi5hgdSH*>*0|6lI7zCW4?FVGIgdYGahmL3dYYr(+Uh z^eTC&B^%LWz|1U2QN^eX(viMK5xiA&Z=JV3pJ$jL)3Z~0Nqdm|nl@`$;DbG%mJ;<~ zS~Z;(q&{rZfbFCAyCFR>J#|jRp9Jga+6OGQgcin^);tQvC?1kD$u{tDaVbxH;wHjX z4WyRdb(3l*9#Vu5G9b0lQ{$k>6ed8)Th?%uMuDnKR?q0Sv-XyOLTl4Cbr5=#U)M@q z^amw(^-aZ+=^uCw*P;lza)n7vn61?sJC`cxA3(6DzCxB7BlFFMhGu&aY(nn1KrxG1 zkvfXLJYbV|i}s5v78UOvQ{*aAPd34pl!3DqkDkzw@5fps*>X7tvO9`3#b%-T2=HLG zD}~+gP2oR2ynjK?MiE6_8YF0W!*Rj_EeDSxV@W&1>7*WL>q1RT3LR~-exjJq* z-(?fEm;{D5l@K*f!Uj0tPLBa*!M-c`o)imM8Me|jUKa(dIJGrN?AyOcaALXylu0Dt zEPV#e5w3JNikwU8UhbJvBK{{77i;P~E4TriXRc_{6RBhXiC>9QiRZT-ONpCuaje53b$Ty;VLYL$)hon2WRragXYA_X*7*KUp{TdcH6Sy{$8=ZTQ3RSD z-!<2zi#e1_NPU%(!CeeN=Sk5fu5)$ytZiQ{*;e2_$+`9f=r5en-b*Mn#5kad+-ikO z{J4F){qGIunU+ciPSMuIyaB--bA|rHP8HY)Z@^Xhmw;O^0VhOwk@^DdZzG|bu+V$* zLuH(NPi$dKEl+FgbuzhF@CYdR*X{$S)-vXdoF2961c!(wvu4*&BY8jRADpPUWMQPf zb8;oKhA+RqT;IgiV8HrS#u@@UejU35$N%Otd6)rtpB7l4>^LYs1ES}T7^RPA2*6$~ zd89!rxMKgEeTM2hF=ZPK_F==s!3SWHY_rDRtO-drglmfZe2w@yy9|kS1Olb$6_V4a z__Phk$=R{)HF|W=cb~;8z1jTAwsUC}X~QMTD+i+joelVbq&gd_gPcYn^siMP7Q+U|*r}^PD)AMB=&yEeAwXzpJye6uPLahVeoNIKPKyPBzaTKq@8hbXp)}Zs zvW1Ql0X`e6c7R{jum6IE$`TYx7vM|7b);n_{WRc-bY3YG=hplGVgg2a zdP~9&voYf{JY9Fol~!lLE{q8gBg)Zaawnyho**@ROrNX|8erJVs$PrFNQ?#>&l6>2 zTpNUC=S74lN4arh&CC}gfZVE#Y@i8$Hb@EInuZN926M25tLhmEboIxH)f+uyi>rYI zY0|D!)s@c(T*WD5K6nS(q1E3A_%|)ZN3$c<6BbY~tIDq1%e#|0a~<0GXQO-Qd&Xnm z)E8Fs1-@}kJ2#7O9Z4t8S+FxBg}X8`M0p9ay6JCYFgRwbOY>?i{WW$zoK5uMkPh{ZjkFb_5ZI)^TVyPrMQKn7$^>x0u=fwTX0( zyj}>$TUk_hxd#K|`a6X{>tl8n>=1y&#Gie+u6mB!=wbj9ZU>Y zAYhFPs6Gh~G^Q@EEm+pzYb93E!8X)6IL*M^RvtZzK>>7qS1n0nBXe8_aeH4wg)Rr{1kXT=JzFgFRAeQKcNV*IM)%thPy z-9v_0OQY0-VraPlnzhW*e3$q2-pfyq_I5~i?`X6C=b_pKWcywsMF${hXd&>@Bh4g{ zhvA}8Qrdx>I+H)sDr}KopG(G|37D7T+bDeN&^rE!YijL1tH3!5uNZXsnR{>^vB;Px zP#(=&?7&_{r#$anVtUE9v^b)qRyrEsz-pw_wkCo>^2Y6|rQv%P5F#u{_>iWffIDsI600~f>7I$}Op+Ot8xVyVM72Kh?7kAg< z#a)WK7k7uYwD&K)pXZ$Oedo=rnf#HNOeSmXwfFkSbuCl_e;J&q?U=54aJ1=tMxExj z{>5oiI=^-x@g7B5?)%7?Nrl?7CP~EL-bNTMNRM{T^4#Ow8v^aaCYvoi4p;7!LZpoq zFHBCXxVEp!us9zf&t*<-p~w`G2O=!siXBC{l0W79Js_&;O-csdl@f(Xy(5OXnY0sQ z5fN9Z*9fyDY3Q2Dr?se zOI>W@$!%_J8|e@VQ>+L^05hzFxr7(}Ta(X64UzyFg}4=KVBJw&;tLg$;><4qbLBoz zwnClghq^QwAC~;S--dZQ^&%;{Cu5T98seF-puGDMC4(kvrAj*Kzn-K2<=GidkTf^RMxpT?U7h}TFl`< z`l0lKS0d69`x4j%Mcyj$(P|8!v6MtB1!&_B6$yTxXh(4~L=(YeUX-|lda!vsDauib zT%h*g5;sP4t~sG<&(xJf>2k?<+5?jUV^O8jf)GgAz$l-;km=~ul>Aipl`;`$D6iEs_XVg4nGb7R6wAyOn~yLfPM{Cvi0Re znwbD`qVLL|_oj*A8DAx3>c2T2TW)sB+_*AM)aB}(qiiPU6c=P@J%`gCcvz~Mz z(yK)forNc1_xz;K)q!1+;Fw3(vG+e{cknMrR!P2sY zaJL`7)=}Cvg8LU68|EY;-e|L(iB((7NH;aPGOvJYe(l9pNeoy5W^wnQzk4QUp`pdH zZrD^EiM=KETPXa|qGPPJPr=7hPfleb7TbgXV7}xydpGo|W~wg2+2R#1oi@I`<@{)1 zeHT`&KOGsMhBNaIz}VKZr<1QWcTGT7%KXBY)Ef#Cvh|8Q>48MXxBDc^F$&um*smGf z3O^49G6INmn|`T2RloIZ^LWE{G(G!R!~U~LR@-leMq8;-ytrT7To0UagX|N658T_0 zsPYw$yS*VVD~V&v1Dq`|yO7j8dJY6#t)Fd^` zi+jtDb%@rKd4~nsA|f5l)?}u0UHc_QJo2wl17~|osN)@)HkCgnDlCStWJzCl%=qNC zIFz1Eg9+DBgeo zUk7?3OSmq)>khdDbqCW~lN$#f=6whOEilA%hn_4(@U~rI@C_&i$tnw%R#62IqM$_8 zLaura5h|WYdXVS)Vv^&T@U*CRd2NLSHihr{ww2F8GLr7miQ3atVQk$TaxZJ?_OF)@ zU-Okisi)rW`SRn;6p(X9!75x=$QgHh^3jQD( zW*Jj=hJRHY|IwZN+fnm}_ktY=;C6oN<|tU0MX?aZcNM}FUq<2~`dDWi49pZfkf{a6 z(VR7B1AXqe#?fijt7wH*FmYNl_^qObzI;&FxsMHUk`9x?Nxv69Tuepkm;k1JZ<*Fl zeq2^-(t6&UfAW=e!;87nLW(|a zTx3_>&G|k@f=xHT2H?-8pV%mu!mAUdzM)f|yabN9r!`?w5%c$DwpSMFf+rK>&ZN{a z$^3(AKr5_hY}T5astASjhBFogfZ^0LY_qZ+K1bpEj;up9C5I)2xB&zlM}Z!VlQx2? zm_{LRkSMq~kY-d%f+cvtmcM?4n~FAf=X5P8T&IOn{k67zP!yom{++jBV#hDJ z%r#NFzpel8vbU@cZ|xFld~pT?1v=8U&`?_qv?0hq~f{GfF$ z|D9fU5OB%RZc}B?*vmTzu_DaCs20_du86L^3=2>lmmpyffCBqa_?0)($^LV~Q~Fnz zAv<1}RqOV9UN(5w_~AvoxUpw2gYwj|b8Eu*FDH8}u06P8DN{rU22b_CjFY_;bHN{% zZ}PkNr0=GLXP79mlqTL#kB180YP>*Szf9Fhv3RAMs{x?bgW6854`DNDv35`?vN*i< zpf5?C7#Imqi(_?6(&z5?w;$NL-%|sep#tCIDJsE9s6!oJLbts%Pq|QOJe~$H+8fK? zt8A`h6qpAF-f*0MOg@-au#yyI(dN@MAX9^PQr2iL~2&X53cLdM-bH3Pb)n%Ae9 zxaA#XDf&bi!pCf&{c?021e;;mrd7pKB7qnDy8~p3_=w%)fnwe_B9bGtEPScogCdjE z6Zt14%<(?9X-dV(5wopmRcmVsw#iZydlR_;axzp}KB?*mHrs0gmOcZ{--%+$;pC!d ztwcqpznmPL`?+aIFHh}3bvVIcpSg2N-}8cWaPB~?fNRiXy5YVe@!U%5VcSva%LQxu zLC%xd!=`_H22%pD3Mb#cU7UnjkxEF~NF4oC+gRf2bX)oGjTs*y4bm7lghm@hmDZVj zx~7TV@7CO|dctAy^*%vlF3!pNt3VDR346%f>%cmSpa)6OI>wa%DYPlTz60T!4lB+> zANl5hp;uV^3dviq>A=Kshk-zI_DVTL8A&t0K;<=ZTPrIvs`S5FrUb8;Wp}>4u|>!G9`Eh3=dI&u&AaeWD|~!o*ZgDHons{ z{F*PPiQjkdlh6(F;Y@P?xNj(jU2;~a#N=*)#pG}Cc~vr~aKO{z*!~V7Pgi}DLm~e2 z?>daD`U|KWYro5)!T7?b7pv#{#BomQvu`crJRSuk zvR?elb@{hjR)`9w?M3%FN9wBw_oSmqDJB4A3V^{bN@9^nhst^-zR|H@5S~|`j0%`5 zU_;23k9pJ<3TZ=eb$f?Bztc$JU=U%?Vgg5};wDyu+oyU)zcw#UtJL)o+r!))CEP(27J$7CN?Nm`n$aAZ zIEE>h>`d96y*=-e1>EePq*Qz4^A^TStF!PnJ;Akcu#NmE!xjAn zhz1Od-~dccREA?GEJXl16_gwZ_y^Gcw=?qpUMPMX0t%sX@teekwUgGFtz7yS*uDS| z6bP(^Vg)ptjtNJYngs&YN8)hZXl%B$iCjDmuQNL?m zP4S^Yqkz3@;^!54FNEPKM8iPl+`-)iM5e7Rk@mRu7;Z0qULCQkfKLGPe$as<4Pwy(t3-a*=-IzZS zvFXE$#-9fr?+9q!z+Zpu=0#C)kK$~Y$vwBNC3E^9HZPPHY6%RQdH?$Zu@?oh!d7)) zI7vv zv!8TkN2|pa^QXBO7KjcHj}cFqstf*+U0sD?#;(2$K2@D0a#1AC%0*X(MY3d`7lpou zM9!oG9qDZbA5^Fz;_Ok*5O^;L6@ZSy-8Z&>+fwk};*Ct!ik*GaEz^B6O~x*Jtl#Fi zy2PxMUsM|t&I=xhQk?-WVdxdxjDdIhtY!RpA9LH+UBtzMF0oble!9B0)fZ{W^)Du(rg6)N?aTjj%F+V@z)7NQint?)5)LtZ{pr`r zA^W@~w0)z+YxU<^WEocF?Dg9%3S)EJdA>`Y~>+jibxSztsY?1LFf>J`iIhA0D z7{Bk=NjKil^Cown>?-CzfTR@29DVdp5awxKYil)~4_ox6kyHV5v2fk$2y(oXI+dCUSGXf+~-96noTq z(B6^q#rQz5Q7+Y0XSKFz(q_!wSlqQIs#3`*mzC2+j<`T<#(?(l!TydjqF>rDi%-_CYbm^`CHlv0rQ<%m30l%^+I3 z*1t$2EVk#~`YwO$v}IdJ-+5c2!?i({%z>WV6!s<3FBVJUt|vYVJ5ISh$yX>Pj7r6$ z3o=Kqu-3}OHm>MFu<^y{!Z5Rgb9f62C3Tq?MdtC?M*SjX1&%tUK#l0rXn2Q;F-yye zGTT}@Ju?!{Td(%J%H1E-$I~xSG_jyX?1%t)yl1H}b5-?MDROwG+Det2#qh_3g2 z_HZVL*``yTe(OXEoAfC>KKr>0%~J>fgvoZDw^WNH$I-X8}7KU4ZAc!ER-OL5R0esjPrVZjK z`mID6-FpM0HRACu(NRA@T5x!ngyp*YT*IHK%>W%=!D@5c3-~e zzTGrR0TUWnQZ7bUH}L%#H7)fQ>Ry!7jb$nQn30iqL!;z{$Y?oakH5f<6F4OB zz;QT#D#839I9gS6)i_U6U@i#hos*d)A~Xq|s6L&IdcmaIpSdf&O&zIk7m{Z}$JQx* zhWi#wib5E`Ob>sXF4n6$z)hqc)s~Nf2OUnBO(zR@E-N$w=eUe^PV}die zh=_GWDgd%LAxB;bv5o#E>aRLqn`Z}N`+~zwO255+^iQwL?`>tl_|!{~K$1PHB{34I z(7%eUHwC~3VMvChPROCdKNqXC>r_!mlfU)U(fJsM!L38{+Wjl3aRU}XxKS+quA4P# z{$a#83I5iRoPRy^C0&v*oTD1fhu*rRD$l>|2ipe32x z_7#=YtYJNry*zoDE?B#Gbkl_)w>2{1h$7r*To)TjdFW_?;@0|l4=KF*cXG$O zRRY#zD9du&-k@{Aa}3=V9AjI7pF$q12ljvihKW?w%ddECbqADpT-4;t=1-Yg1 z&DpS_y71f(QUs}(i}g|EJEbiRS>Z9%K%@fKeIPhq>#yph<-yPPob|k4UJ?^Xw-u;t zkr9F~KllBC_90ybxC~Z*j3-CA=IAV?^BlTcd0Dfe;)y-?TSvZegw!yym&zvOTsJc7 z3`t}=S=Dl(Ix~#EoJoPp?(B_fvnxPA7r$L$gyPogXTW3Z%8g%(>Az3L|J)i|uzoO< z%7TLcR0wh!0jaW-AgUG=H^RkXK9-Ul2R3chsRXdGFn%)6@R!jE{AnLhsfq7i6Qqq% zCIUZ?C!sHD`~{DY6nvdtIh=+DkqYY-iGe#OEQ;;UokYgLgKdNP+S-IHQ>j2+@et~& zv|t;skQm~&Y<8Ah)XLV-;Fh>Q&qg65*YDHYMq!k7eg*y70n$vB(gvmjTjwA}mZNeJ zW|zheUdc_P#?Zl0%11)9Hq-D{lfVX|?c}3g0QqBW+Mtl+UWa}PLgk4 zOL__jRP2e8ksa>hA5{=lF#6&O`5z)jBaIXR1j=qhcb4b9TLj(2tIJK5@5k zCM8#Pslf-07IS*(#2fh@BB>eysE;p{-GeM}kM5#xnf3BVh8oV*J;pM#Yk;oY55B9u z0cTOlvwVDbxv~#XARLeW9A8oeia5Qy@~sp^x-Z3c;S1Lm}fNP_=07k zEUtK+FG8*fKY7BTrpCjnC=zs_VGo#XGT(qOhN0u1`MrlZv0>O;=I9m$=`l6(zVmbH z?@#{|qL%z6JSkYAN9HFZh*3FWE1j(67goXNCnao!L44z{BzoC@s*u;iTKFNA8hvKn z5%M?+jRdC%2Yeg=jiwxCt6e8ixYT}F-om!{8t}yTQ~gUn_X^Y5p+xRmQNV$sgJFL5 z;QHf671t&9hVuJ1bGnngx-p#3dUY(IC;Mi()7KUks#(eAq_!w;RWB?1LUEL4*P#YBdv$~myWqqWkQEmrL4ijhbCv(O-M8=aqm}aV>Bp9V+9ELDCeY0yM;?Jo zAQ29RRt_MJ&l$zUj@R)+HAB$~}#RSTF+rU;?1D>k$6?s69^e0${_B-E+YjLRvb|&<3`E-|b zv3w9Fl=_!k>7nqmnMJt~#LY0=RBz>{e>p=zAOWljvve617}|Txrxp>%7J&Uu)p7>H zW@JZb`c19_2IwW9c}p(3ZXR$K4n(9BvT#IF15@lElFWL2j$9)N1o22l4E}}NC*)~J zUM2_JI}|849<1tVCi7yY8^#QlmXuA_g`xyIYO5~4I(+j*C`bU6hfNQJ3hV(%!Klf@ zcNJwKMHQ1sNadXJe@)*CAzZ=OSYF@psk8HS+$PB^`c)HcFqt1QEy<4tO3K{1Kv0l` zmM*>nHQH++Nc=q$bzqQbbj0WJ2@a~9eL_Hdqs|bZToL%26Ps2-Mbutfdzof08>P%= zLDJY^8DNcVL7Fo5i}_a97Q8I@>_<6``dcpFe6nto74c^%ba#|8bTQsIdJssU`b58HAAS*ethYo19DhldMQaxkr5vS50{O+}I&PYH< zp6?kFAtV9|J$}oJoreGb2w<#@n{$2H-eS(Nqq-3M)~0B9MG~^3IfxZX51vaf?|w<{ zH}`mZH-4)v8$*Z!(c_C5EBQl*38hLZlg;fVrEQ$;oWsPg^d~8z23uANMmVOFPY(-< zbjt_2(9Wb%X7^U98qH`?nTveze6L95XO&H%0i+D0*)2F#`TQk z^|Eu};#=pxc}A6l^Ni6v8#9T?9=~p;Rr+2aTgy1_z!T3!plyFK7PgxdrXI;uMMurW z21GUF-2DF^TBj#y24g-eT@|t@Fkuo>PB~eNxSs@?sq~<3u<@G4ewDcX%(+4C@mhvp zz83e*yocbS#O4!M?~ex=SF%2~0hmpZj@VkVMfy&=q1a+^<)v~IWMrf<`F%tn#DZir zzHu!1Txlyox%j)51CL%dZNqsr9Er)U&hvzhJ_LJrdd`Y`#$zAXdQ-$~T$b$Z?k zco|KHZ-Z|(a|+Oym>_^O>rZH6rcTR7eiuXb+h87Gx5axpYBWrAcr@NHe?+dJ;PdFq zzmvI>kFxgJT3}k0!u6$;hHkUo!eXM-^%K9M#NyPkT&4>b`l`qBnW8j`IjGM6l)-z{ zF#$lyULLxiQouViQWEvB_&;NTjc8av9*x-FoiSbbt;nDKa5`Sm0-tY6w;&ngHB78o zvi)SzG?=U@*$q9_-eg$ueX2Q!Y)0QOm+aT;TffAohzk8xAoO0K*)Kwrn0|O4>+=C z>PdM^kOx%w_2laMM++*wYtf9U-4C_h5EN#hAd)Q4ZfIsZGJp)k#+(67`+ar^)0;Z} z0SH~X<2z@PV9U9%GeD_AuhHP$g;8N<_(c1czSzOACEDvUWaFOrciLgz5C7A`XRbIX z0W)g?o=D+`H6iVFn*RWLExwqX{cZ14+bFWXy~SwF?TyKd=%e3Ba{rJ4V5h^J@79AE zGDxH-%=eDQl0R`xRZrnJD%_|u2@4?-umjmGh{cI=SpjsC9X#(mz#fM0uPS(BdZX%y&e8t4xLu?dneSWk;b z$;dtuZmq2>8P)$_1v={?>iPV0O9%;B_`oqJPAkp#BO=Z;U?(^f0M|wZY9%hwAj}u! zZYJ--a08OoET4-R(F^4>rT{v5;7bUe_W0?jGhOqVd275f zuCb5n(3Q{3teS}jQ?St57%>&$p?ynArb-_$Gk}~oWuIW|N|^7iw|n)QFgXl~;#pf( z^PT#gEqlEtwAe<#mVo=0Z*S#KuG)*wJverM+C7x6o@_XN^PMA$z5ZT6QK90->$cp? z@(%zS{yX`()sSn6o1j!LLjGrUP7mW-dfQ0^gI!uqqhBGbP1s$iLk!N|K*pLF&UV~~ zu!l$;gxx*%#M6nH^>&-l7^LkbPK;d%QR_K(K+pwA=K`pO-)%1e>$x#E9@oVlkd&|7Fudki;7&DT^BdJWHbDs`N%T zw~WnOO{{>v%saW?WFKc+u`^e{*>+CQaSYV&Rb~l}o*6}NA+MpaOy2W<0Lc;ljPExY zpUv;Pij>;>ypL2cBfTMGAdW*hBX*f+W;4GP+|Z5+?PQQ7M``Gm z7;_{<+jJ0p%HUXsL*681{d+2gz|Gq?sUzJltNh_D3Sa7sc+ZB2d$-?lT*zp0UdY~? z(-s6T%AZYN#G(nSLbzlgMr705NyHk`bLNX7d<1ks2Zc`q2(YnbC_-u?L%)PapskCl zEF=`Xz|*l1|L&<3fuh&z6b{xHWD%&2sREj;=opOV5~ zp^j38`8ib_te`%xn`(1Bp{I$I8ynY4f0pmsooX8IS>ymnm+n?_iAmZmeD7x%CMpB1 zUze59Uj+qnUASDew>aLAYbr56e0_2?cD9tlJ+cil*#tyjN7rST7n#x=N&(C}Wx@nV z;_kjm6sKc4N+<2XwbE9@8l`dJRI$+yd!s?7s;PBP*VUGyB+Rb{*VN0Yd@O`}1G<$l zR@?VXV`YoD#wZ@9Hsdft~ zD|76?Nkg8k)W!zt2PWU96l)CYucse&Wt`b!4ZZ@l%L!qJ*FK?!DQ^t~dTqHm@!k5o z%X-Ced`*5eaM@yntSLA2sS=ZAw&Ef_&HPi^rENyZBP4qKN*q$CyrMW@A0{rpmVG;H zq}~G^TabIasD`BJbNHtpNb;z0M5>6^u1*;YOHnR3GTwAj|G%v(8(g+ksR}90$0`EhU>A3>vRZXx>Ya*RS8*z?V*;bm_ z(j%WM1F^WnO}6tBgYrlIu)Kz{Y8vb4+P>7*)N%|k3f@Ajcjf&}Cid6p4>8<~A2U(c z2ZU*ZRY~7fcxN3d7?%!h1JN^F)_myVnQav}n9bh2r;B3n{_Crn{CD+{gi62|5{t?m zfYiN+E%V8_`~i6jGa1u*IXMKQ1j4&aI6crfQywB(8qv&T2}zL3&h7`01AjFlnR%@L zYs<#u!VG3}Z`^6IA)rAOa3X9S6-OEF8p303l2CxRVYzR8V>+f`cNaTM-^X%&L!D#$ zL31F2a^zkmbAgJW(cgEb9@6yDO*LgP!r*z2%f{y;`F5&x(+lM?>Xi`rbt4A(kr*D=cz4*vFH#Sh!02cHarxiX z$H}D;%%B%8SjyfT`qi%Qznhgr97|qfyeq=NHcY86U*V04v}bp?lZRA%r^(oL{JNT? ztc1J?uXF(_8v|qr)pg%9R$_pF3N?dgw7YS{l2O%6{(73)8{%vd;W+S{*CJ9F+Fwjb z7O<4ysZ>6*Ity+KArDtrCggOt0u6N39M0I7G>gix_+G0LEZiOORrb*D4EOKBiV!d} z9`QFiE%X8a9lG`w4}M$W1$A7hCML(8%XH^gQQ@a`$?f6hg=oXe7FG;%m}Kzp7D;RY z?<2g>SXf!GbCWG6{zoi5{T8ZF8W<=W2U{DtKon*0TGh5ryPv$%dmlrS@95;0bh~PH zDqVCHmf$A#O$zcQ#thvIy9%D#jKDv+#A?%6uESBokWwG~G&@D+R)kUtX^5>jL861t zR%4>auw|B}wc}I>-DzSv$(tQ>#>Y5L$He~u;5tVNfp35kyd-HhB&Aq|+DeZ|Vb}lh zk4O8uL5!kQ6-4)Y+yCx;!SCY$^@Lr1+FG-LQ~A1@fzSsxyM%;!|h}pi3|g6B~GerPFd8#{C98o z@`o}5o?r11RfJm|yvv_k=QUSlPrtU)%261!^7+O`QC23qCv5k2JVbO4>&7;;i+~8& zpXb!%&EF!LtW~b&*6V%3nXE=`kN}@DLA6z47zyOplliY3JnWA;M|#4PUKCVad55kP zfK8NaPmKFU;zDbs!E85ADZy`=w-f)vl;7NxK0fxZiiMib?N&>QUpol`(dx8i8ur|( zM4AnQP<~X<*9aYbR-{aFkG;`_%DyahM`9mi{|0w|=fSjj{DRyMU16%hlYBKbz)lKS_@n3*SfWV7|NG998(_f3C*QPpXlTdS(Z!_=s@ zuC}74TLAwGF3`T}bq0hj+6EQNzOnEoxP=%g@c57LT=RM+c)MCK7X&wv(JETYiy|CW zRZM*LA4*5^e_`**x`;I$!CkiW~r z(nC4%>|nhSN2|*_t%B&`Lk7QkBFUmttNBxgf`qd&sygNwOXdVU#bi&e=S5?w90tBT#)QfVApA&NGy_(L`BF0jd>X%_ zI+MgPlR${%#Ofa}jEq!gI6Wx3{4 z*?sntbM(5CS53YV8XmlMWZl|cE~+i6Jg?>Ea^MR!=v;Xbp!bx z?pb0DZ>9=Iq)LB|BARyB^^dBtr>Ps;Vd_PZ+HnoD{jZ^Z?xRLQvSngyOFk9Kx>S=x zZKfZ@~W zFqDs48ei%3R*y;R;Bl7Mm*gz5D5l=5gr$yiwiqQANmdQ?1d#t2oMUTkqaR?)nq95J zOaM})#`mg)koz0Agj|=%eS;`HdyyrL`wDbeQGML;)fUIassZW1!E-Ji*=mN8g**ojy4mMa6oOSW+AsInOR5PHTAon@9Nj`3Nsh zNLtvGG>i*P0J~y}$vi%u&Wl3yQHO>4G^w4CN~9F1BTG^D{|dDDHa5}ezo606*|G?w zMWqu&tB}%AqYU$qKchmr0HDo9g!s=7?!cAVq@~)I9c|%)|6AU&e;hhAp+9UPqKaSu zPJf)L8rHSr6^m&hVCsPo!=}Dp>aq5o-jdEZ{~<89xk+XS)#3uWJz0ZETTy55Z!<*v zV4d_D?Ysh%R&vqUU7*H$QR~#tF&?vB+b2;63F1lLcwauhb(dJbKzS+SX@%^VuE$VH|R4uPyoFSHQBjWe-3Dgnp7!&liF zC~1y@zmm@om_Vu}N5&VN8THni-F79wY5b271Ih%Mp83jKa!$zfapZ$fgjA(4^g592R=QK_Lh zT&{VhHx!l`CJ>+qm*~O##$R~Dr5NPWTo|nTEQG`V;WZZ0N*uqp7;aHYT)nqMSa!`u z;aI`2x)4W&{aj7txw-Z*k59H3wuQGrc6S(YNMLocn3nvcM~rb-0XSF?ew? z6z_79@=X)+xVrAmAO;+(^4TkEaoOO=O{}sj9wBb{fQ!B;(e~=5bb#cO8nGR|V1n(V z;q9^+4u#f1&dIBHU*(W1d-U`cX)ow%Ih?fhzu>!6cdzqjIFt#VL0ee|uXw-q`TA{} zW$EGl$Onz*D9Cg!F$1sMjy57XI%FyD`ZCi$T27Wzu97MP2LW)Z0m5|OUlXH7no=hs ziCx;1qc6jnC`|N&{Rl)iUf||b-IbZ!NRSxJ*u2=Q>|7FsvQbH+d)$SZ&e^$!Vq@^9 zh;ln|3>R$FI{qquI1J*VIui0@u#qgy4Dp>Kn!M(roYgP!bLxH6L5czJ0vkF^nqMuC zJrgyw2{;~`dj_TKf7f@U+;D&(J!~{BB@11e)BG2kA!dYidYPa@8iuQTSu?AwRxw~-vhrsYwoE7!W^si*&=K2%-(9+K znc;Mz5ed~Q{cuP$39qdQunN4i^<5gB#cQO~I;hqNB`XNc(-on3yhkAg814xYC|zzD zS72;@9;lc819p~NkkE|mvI(jl7xp@=6O0owVJ%;ILHX~zJ zLG#^yF8|B_{)_ZR%R^~9op{HN?roUxTD_bNlSvrWYU7s5TGk?!inl_UM-rFLalFpQ z7j^9g9U^;jo*D0%nW6>K*K51~1g2f-F#6I|b2ZJ+5g22`pFHCa!!XCI!j_knKY~y)|!xNsx|CC?ZWyC^#XCi7ax9!b|t)7APqs?tJygL$UkQKIFewyr3`)$YvdX08iQ!ny z(losNUC%dw9h2H@iu{wW+eM#qis3xjZRpfsJSDeX8fQ;=DZ?cI0AWA^cy{Gm zxhrytR~#2VcAdiB%6=-+r&{CMcPcaNj$ROwlG^C_ekFx-0|RV&)6hp+%m=^K;Wi&% zOubWOs8l_2BjI^tNbim+*l;0R^N6j2+ae6UB;C64z?YdgR}ZZh56*Q+Z3bei-DnF{ z*XJ~7a{78T&v1#h`ddJcJ0nRy?{nws!tRKmzN^`*4+h#x{K79jw*4M=3BtjonuiGYh)CeWsg|Wi z=4uGC<9a%p=EA$=o=poz{!nZ_BIF;SpgMl9J+AWuiI$&Ajz`}ue)!C4wF%5_mwWsl z6=7LzNAHTfDj8ckQO6a&)%=&sfOU;B`;obH;idZ$&0I67_YHhPsm8}%dg11bc|KO` z+nr}}<&{~EF%rV0N2^swIW5SKbiciwSbaIGaZCeyBYh(?kS)Vs zytXFTm7`syVhUsD&um`l=qg8!k_c9@Z9BUxs~4t}48~g~E?#la>&_O%^#*ED1%96C zF!K>vPmE3ze-N9L94xT+H*f#HSTh3$9G zp_YPqwdI_E;&gmS=m{}UcV+Pym3ihvZl?;i4g(>sG2;En+hut|ed+tQKd%@JRCghy z?pe<$m`*+D0t+e~5uhFTbc<{C%uKS-{_I=$#{pzmTrzCg$RT!aYKYn; zznk(X=|L0v8`kt{p*ap6vyJwxXM%a=oIHXI+2Q*S;25MIE*jh@J<3B-b;CT?7=f)EJj4>^e!1Tka{jd((WCsCq#GC8 z@J1NRuR|zJQ&U4jNAskKq(O^BGQRE9rrx?ls-qd3@>rJp0w@RlOL zQ6E)ZW}qgJa>xH9%E(aqGv^*aZgc6C8mv>@hRbmk?QmHtb7dfHe`jdFb}X^NJjUoP zGKOeSR2maSP2_#PCJl$F0OIvgXRgVHwC)!h-=N!*FZCy4grC6U(EW4DuNVX~Vj32D zHn9NO=)Ie0T$ZDDO4ku<>y}4GY|fcx2Wu51)dha~i5Q*bw5G&@qcocdwa6ZpvffJM z-4pi=d#?~FoO%9b)#1x(*cTybhI_4S_Akp|=^62W<&} z1+q$nktod;jKxJ?o8{&B0)H#W1<^5t)H|2Qjh*MT-T2a|=B`1r=Ogm)Kw{&1Pny$V z4sU+xhMmNn@UaXDy&ljW6ejwu8}ockJb854{T~2xF*ngw`QiJ^xiHT8z|X~X5h?f* zJSliAbfhGrag_2ZH#U#o%8ifFn>~T+))FQtGr(>Gfjfa!hi1|(wFi84YI!Tx6x7Bp zc41Q}oxFI%<2ylQv1phIG1E%c=bq`$l!6xuyf=c5yWd7s1z@AL1m7jQfAy!bs z7vA|QCs67b+&yQ9yriOACP`nhzD|}-Z-ctt#3IXON$M7jCr*lgC>M|G)=F|I))0yw z>V4RL&y0#sj6y;&(UR?Gk3^cwXh8`BI}qBu?=I#N&!$N;5yKVFF*S7ztI

  • ");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var o=t.getDatasetMeta(0),r=n.datasets[0],l=o.data[a],s=l&&l.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:u(r.backgroundColor,a,d.backgroundColor),h=s.borderColor?s.borderColor:u(r.borderColor,a,d.borderColor),f=s.borderWidth?s.borderWidth:u(r.borderWidth,a,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[a])||o.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&0<=p||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,w=h/100,M={x:y?-1:Math.min(m.x*(m.x<0?1:w),v.x*(v.x<0?1:w)),y:k?-1:Math.min(m.y*(m.y<0?1:w),v.y*(v.y<0?1:w))},S={x:b?1:Math.max(m.x*(m.x>0?1:w),v.x*(v.x>0?1:w)),y:x?1:Math.max(m.y*(m.y>0?1:w),v.y*(v.y>0?1:w))},C={width:.5*(S.x-M.x),height:.5*(S.y-M.y)};u=Math.min(l/C.width,s/C.height),d={x:(S.x+M.x)*-.5,y:(S.y+M.y)*-.5}}i.borderWidth=n.getMaxBorderWidth(c.data),i.outerRadius=Math.max((u-i.borderWidth)/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:0,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=d.x*i.outerRadius,i.offsetY=d.y*i.outerRadius,c.total=n.calculateTotal(),n.outerRadius=i.outerRadius-i.radiusLength*n.getRingIndex(n.index),n.innerRadius=Math.max(n.outerRadius-i.radiusLength,0),e.each(c.data,function(e,i){n.updateElement(e,i,t)})},updateElement:function(t,n,i){var a=this,o=a.chart,r=o.chartArea,l=o.options,s=l.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=a.getDataset(),g=i&&s.animateRotate?0:t.hidden?0:a.calculateCircumference(f.data[n])*(l.circumference/(2*Math.PI)),p=i&&s.animateScale?0:a.innerRadius,m=i&&s.animateScale?0:a.outerRadius,v=e.getValueAtIndexOrDefault;e.extend(t,{_datasetIndex:a.index,_index:n,_model:{x:u+o.offsetX,y:d+o.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:v(f.label,n,o.data.labels[n])}});var b=t._model;this.removeHoverStyle(t),i&&s.animateRotate||(0===n?b.startAngle=l.rotation:b.startAngle=a.getMeta().data[n-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,n=this.getDataset(),i=this.getMeta(),a=0;return e.each(i.data,function(e,i){t=n.data[i],isNaN(t)||e.hidden||(a+=Math.abs(t))}),a},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,o=t.length,r=0;ri?e:i,i=n>i?n:i;return i}})}},{}],18:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return n.getValueOrDefault(t.showLine,e.showLines)}var n=t.helpers;t.defaults.line={showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,update:function(t){var i,a,o,r=this,l=r.getMeta(),s=l.dataset,u=l.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(o=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=u,s._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:o.tension?o.tension:n.getValueOrDefault(f.lineTension,c.tension),backgroundColor:o.backgroundColor?o.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:f.borderWidth||c.borderWidth,borderColor:o.borderColor?o.borderColor:f.borderColor||c.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:o.borderDash?o.borderDash:f.borderDash||c.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:o.fill?o.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:o.steppedLine?o.steppedLine:n.getValueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:o.cubicInterpolationMode?o.cubicInterpolationMode:n.getValueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},s.pivot()),i=0,a=u.length;i');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var o=t.getDatasetMeta(0),r=n.datasets[0],l=o.data[a],s=l.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:u(r.backgroundColor,a,d.backgroundColor),h=s.borderColor?s.borderColor:u(r.borderColor,a,d.borderColor),f=s.borderWidth?s.borderWidth:u(r.borderWidth,a,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[a])||o.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={aspectRatio:1,scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,update:function(t){var n=this,i=n.getMeta(),a=i.dataset,o=i.data,r=a.custom||{},l=n.getDataset(),s=n.chart.options.elements.line,u=n.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),e.extend(i.dataset,{_datasetIndex:n.index,_scale:u,_children:o,_loop:!0,_model:{tension:r.tension?r.tension:e.getValueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle}}),i.dataset.pivot(),e.each(o,function(e,i){n.updateElement(e,i,t)},n),n.updateBezierControlPoints()},updateElement:function(t,n,i){var a=this,o=t.custom||{},r=a.getDataset(),l=a.chart.scale,s=a.chart.options.elements.point,u=l.getPointPositionForValue(n,r.data[n]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),e.extend(t,{_datasetIndex:a.index,_index:n,_scale:l,_model:{x:i?l.xCenter:u.x,y:i?l.yCenter:u.y,tension:o.tension?o.tension:e.getValueOrDefault(r.lineTension,a.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(r.pointRadius,n,s.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(r.pointBackgroundColor,n,s.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(r.pointBorderColor,n,s.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(r.pointBorderWidth,n,s.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(r.pointStyle,n,s.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(r.pointHitRadius,n,s.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,n=this.getMeta();e.each(n.data,function(i,a){var o=i._model,r=e.splineCurve(e.previousItem(n.data,a,!0)._model,o,e.nextItem(n.data,a,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},setHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,o=t._model;o.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(n.pointHoverRadius,a,this.chart.options.elements.point.hoverRadius),o.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(n.pointHoverBackgroundColor,a,e.getHoverColor(o.backgroundColor)),o.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(n.pointHoverBorderColor,a,e.getHoverColor(o.borderColor)),o.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(n.pointHoverBorderWidth,a,o.borderWidth)},removeHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(n.pointRadius,a,r.radius),o.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(n.pointBackgroundColor,a,r.backgroundColor),o.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(n.pointBorderColor,a,r.borderColor),o.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(n.pointBorderWidth,a,r.borderWidth)}})}},{}],21:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,o,r=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,o=r.length;a1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var n,i,a=this.animations,o=0;o=n.numSteps?(e.callback(n.onAnimationComplete,[n],i),i.animating=!1,a.splice(o,1)):++o}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{}],22:[function(t,e,n){"use strict";e.exports=function(t){var e=t.canvasHelpers={};e.drawPoint=function(e,n,i,a,o){var r,l,s,u,d,c;if("object"==typeof n&&(r=n.toString(),"[object HTMLImageElement]"===r||"[object HTMLCanvasElement]"===r))return void e.drawImage(n,a-n.width/2,o-n.height/2,n.width,n.height);if(!(isNaN(i)||i<=0)){switch(n){default:e.beginPath(),e.arc(a,o,i,0,2*Math.PI),e.closePath(),e.fill();break;case"triangle":e.beginPath(),l=3*i/Math.sqrt(3),d=l*Math.sqrt(3)/2,e.moveTo(a-l/2,o+d/3),e.lineTo(a+l/2,o+d/3),e.lineTo(a,o-2*d/3),e.closePath(),e.fill();break;case"rect":c=1/Math.SQRT2*i,e.beginPath(),e.fillRect(a-c,o-c,2*c,2*c),e.strokeRect(a-c,o-c,2*c,2*c);break;case"rectRounded":var h=i/Math.SQRT2,f=a-h,g=o-h,p=Math.SQRT2*i;t.helpers.drawRoundedRectangle(e,f,g,p,p,i/2),e.fill();break;case"rectRot":c=1/Math.SQRT2*i,e.beginPath(),e.moveTo(a-c,o),e.lineTo(a,o+c),e.lineTo(a+c,o),e.lineTo(a,o-c),e.closePath(),e.fill();break;case"cross":e.beginPath(),e.moveTo(a,o+i),e.lineTo(a,o-i),e.moveTo(a-i,o),e.lineTo(a+i,o),e.closePath();break;case"crossRot":e.beginPath(),s=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(a-s,o-u),e.lineTo(a+s,o+u),e.moveTo(a-s,o+u),e.lineTo(a+s,o-u),e.closePath();break;case"star":e.beginPath(),e.moveTo(a,o+i),e.lineTo(a,o-i),e.moveTo(a-i,o),e.lineTo(a+i,o),s=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(a-s,o-u),e.lineTo(a+s,o+u),e.moveTo(a-s,o+u),e.lineTo(a+s,o-u),e.closePath();break;case"line":e.beginPath(),e.moveTo(a-i,o),e.lineTo(a+i,o),e.closePath();break;case"dash":e.beginPath(),e.moveTo(a,o),e.lineTo(a+i,o),e.closePath()}e.stroke()}},e.clipArea=function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},e.unclipArea=function(t){t.restore()},e.lineTo=function(t,e,n,i){return n.steppedLine?("after"===n.steppedLine?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y)):n.tension?void t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):void t.lineTo(n.x,n.y)},t.helpers.canvas=e}},{}],23:[function(t,e,n){"use strict";e.exports=function(t){function e(e){e=e||{};var n=e.data=e.data||{};return n.datasets=n.datasets||[],n.labels=n.labels||[],e.options=a.configMerge(t.defaults.global,t.defaults[e.type],e.options||{}),e}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function i(t){return"top"===t||"bottom"===t}var a=t.helpers,o=t.plugins,r=t.platform;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var o=this;i=e(i);var l=r.acquireContext(n,i),s=l&&l.canvas,u=s&&s.height,d=s&&s.width;return o.id=a.uid(),o.ctx=l,o.canvas=s,o.config=i,o.width=d,o.height=u,o.aspectRatio=u?d/u:null,o.options=i.options,o._bufferedRender=!1,o.chart=o,o.controller=o,t.instances[o.id]=o,Object.defineProperty(o,"data",{get:function(){return o.config.data},set:function(t){o.config.data=t}}),l&&s?(o.initialize(),void o.update()):void console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return o.notify(t,"beforeInit"),a.retinaScale(t),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),o.notify(t,"afterInit"),t},clear:function(){return a.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,r=n.maintainAspectRatio&&e.aspectRatio||null,l=Math.floor(a.getMaximumWidth(i)),s=Math.floor(r?l/r:a.getMaximumHeight(i));if((e.width!==l||e.height!==s)&&(i.width=e.width=l,i.height=e.height=s,i.style.width=l+"px",i.style.height=s+"px",a.retinaScale(e),!t)){var u={width:l,height:s};o.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,o=e.scales={},r=[];n.scales&&(r=r.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&r.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(r,function(n){var r=n.options,l=a.getValueOrDefault(r.type,n.dtype),s=t.scaleService.getScaleConstructor(l);if(s){i(r.position)!==i(n.dposition)&&(r.position=n.dposition);var u=new s({id:r.id,options:r,ctx:e.ctx,chart:e});o[u.id]=u,n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];if(a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o);if(r.type||(r.type=a.type||e.config.type),n.push(r.type),r.controller)r.controller.updateIndex(o);else{var l=t.controllers[r.type];if(void 0===l)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new l(e,o),i.push(r.controller)}},e),n.length>1)for(var o=1;o=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);o.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};o.notify(n,"beforeDatasetDraw",[a])!==!1&&(i.controller.draw(e),o.notify(n,"afterDatasetDraw",[a]))},getElementAtEvent:function(e){return t.Interaction.modes.single(this,e)},getElementsAtEvent:function(e){return t.Interaction.modes.label(this,e,{intersect:!0})},getElementsAtXAxis:function(e){return t.Interaction.modes["x-axis"](this,e,{intersect:!0})},getElementsAtEventForMode:function(e,n,i){var a=t.Interaction.modes[n];return"function"==typeof a?a(this,e,i):[]},getDatasetAtEvent:function(e){return t.Interaction.modes.dataset(this,e,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var i=t.helpers,a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],o=i.data;for(t=0,e=a.length;ti&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n=0;a--)e.call(n,t[a],a);else for(a=0;a=i[n].length||!i[n][a].type?i[n].push(o.configMerge(l,e)):e.type&&e.type!==i[n][a].type?i[n][a]=o.configMerge(i[n][a],l,e):i[n][a]=o.configMerge(i[n][a],e)}):(i[n]=[],o.each(e,function(e){var a=o.getValueOrDefault(e.type,"xAxes"===n?"category":"linear");i[n].push(o.configMerge(t.scaleService.getScaleDefaults(a),e))})):i.hasOwnProperty(n)&&"object"==typeof i[n]&&null!==i[n]&&"object"==typeof e?i[n]=o.configMerge(i[n],e):i[n]=e}),i},o.getValueAtIndexOrDefault=function(t,e,n){return void 0===t||null===t?n:o.isArray(t)?e=0;i--){var a=t[i];if(e(a))return a}},o.inherits=function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=o.inherits,t&&o.extend(n.prototype,t),n.__super__=e.prototype,n},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,n){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return t=+t,0===t||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),o=Math.atan2(i,n);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,n,i){var a=t.skip?e:t,o=e,r=n.skip?e:n,l=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=l/(l+s),d=s/(l+s);u=isNaN(u)?0:u,d=isNaN(d)?0:d;var c=i*u,h=i*d;return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,n,i,a,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),l=r.length;for(e=0;e0?r[e-1]:null,a=e0?r[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var n,i=Math.floor(o.log10(t)),a=t/Math.pow(10,i);return n=e?a<1.5?1:a<3?2:a<7?5:10:a<=1?1:a<=2?2:a<=5?5:10,n*Math.pow(10,i)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===(t/=1)?1:(n||(n=.3),i0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-u-c,g=l.bottom-l.top-d-h;return n=Math.round((n-l.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-d)/g*r.height/e.currentDevicePixelRatio),{x:n,y:i}},o.addEvent=function(t,e,n){t.addEventListener?t.addEventListener(e,n):t.attachEvent?t.attachEvent("on"+e,n):t["on"+e]=n},o.removeEvent=function(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent?t.detachEvent("on"+e,n):t["on"+e]=o.noop},o.getConstraintWidth=function(t){return a(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return a(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,n=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode,n=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t){var e=t.currentDevicePixelRatio=window.devicePixelRatio||1;if(1!==e){var n=t.canvas,i=t.height,a=t.width;n.height=i*e,n.width=a*e,t.ctx.scale(e,e),n.style.height=i+"px",n.style.width=a+"px"}},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,n){return e+" "+t+"px "+n},o.longestText=function(t,e,n,i){i=i||{};var a=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(n,function(e){void 0!==e&&null!==e&&o.isArray(e)!==!0?l=o.measureText(t,a,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,a,r,l,e))})});var s=r.length/2;if(s>n.length){for(var u=0;ui&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.drawRoundedRectangle=function(t,e,n,i,a,o){t.beginPath(),t.moveTo(e+o,n),t.lineTo(e+i-o,n),t.quadraticCurveTo(e+i,n,e+i,n+o),t.lineTo(e+i,n+a-o),t.quadraticCurveTo(e+i,n+a,e+i-o,n+a),t.lineTo(e+o,n+a),t.quadraticCurveTo(e,n+a,e,n+a-o),t.lineTo(e,n+o),t.quadraticCurveTo(e,n,e+o,n),t.closePath()},o.color=i?function(e){return e instanceof CanvasGradient&&(e=t.defaults.global.defaultColor),i(e)}:function(t){return console.error("Color.js not found!"),t},o.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var n,i,a,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n0&&(l=t.getDatasetMeta(l[0]._datasetIndex).data),l},"x-axis":function(t,e){return o(t,e,!0)},point:function(t,n){var a=e(n,t);return i(t,a)},nearest:function(t,n,i){var o=e(n,t),r=a(t,o,i.intersect);return r.length>1&&r.sort(function(t,e){var n=t.getArea(),i=e.getArea(),a=n-i;return 0===a&&(a=t._datasetIndex-e._datasetIndex),a}),r.slice(0,1)},x:function(t,i,a){var o=e(i,t),r=[],l=!1;return n(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),a.intersect&&!l&&(r=[]),r},y:function(t,i,a){var o=e(i,t),r=[],l=!1;return n(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),a.intersect&&!l&&(r=[]),r}}}}},{}],28:[function(t,e,n){"use strict";e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('
      ');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push("
    "),e.join("")}}},t.Chart=t,t}},{}],29:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}var i=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;n!==-1&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],o=a.length,r=0;rc&&rt.maxHeight){r--;break}r++,d=l*u}t.labelRotation=r},afterCalculateTickRotation:function(){i.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){i.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},o=t.options,r=o.ticks,l=o.scaleLabel,s=o.gridLines,u=o.display,d=t.isHorizontal(),c=n(r),h=1.5*n(l).size,f=o.gridLines.tickMarkLength;if(d?a.width=t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:a.width=u&&s.drawTicks?f:0,d?a.height=u&&s.drawTicks?f:0:a.height=t.maxHeight,l.display&&u&&(d?a.height+=h:a.width+=h),r.display&&u){var g=i.longestText(t.ctx,c.font,t.ticks,t.longestTextCache),p=i.numberOfLabelLines(t.ticks),m=.5*c.size;if(d){t.longestLabelWidth=g;var v=i.toRadians(t.labelRotation),b=Math.cos(v),x=Math.sin(v),y=x*g+c.size*p+m*p;a.height=Math.min(t.maxHeight,a.height+y),t.ctx.font=c.font;var k=t.ticks[0],w=e(t.ctx,k,c.font),M=t.ticks[t.ticks.length-1],S=e(t.ctx,M,c.font);0!==t.labelRotation?(t.paddingLeft="bottom"===o.position?b*w+3:b*m+3,t.paddingRight="bottom"===o.position?b*m+3:b*S+3):(t.paddingLeft=w/2+3,t.paddingRight=S/2+3)}else r.mirror?g=0:g+=t.options.ticks.padding,a.width=Math.min(t.maxWidth,a.width+g),t.paddingTop=c.size/2,t.paddingBottom=c.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){i.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){return null===t||"undefined"==typeof t?NaN:"number"!=typeof t||isFinite(t)?"object"==typeof t?t instanceof Date||t.isValid?t:this.getRightValue(this.isHorizontal()?t.x:t.y):t:NaN},getLabelForIndex:i.noop,getPixelForValue:i.noop,getValueForPixel:i.noop,getPixelForTick:function(t,e){var n=this;if(n.isHorizontal()){var i=n.width-(n.paddingLeft+n.paddingRight),a=i/Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),o=a*t+n.paddingLeft;e&&(o+=a/2);var r=n.left+Math.round(o);return r+=n.isFullWidth()?n.margins.left:0}var l=n.height-(n.paddingTop+n.paddingBottom);return n.top+t*(l/(n.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=e.width-(e.paddingLeft+e.paddingRight),i=n*t+e.paddingLeft,a=e.left+Math.round(i);return a+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},draw:function(e){var a=this,o=a.options;if(o.display){var r,l,s=a.ctx,u=t.defaults.global,d=o.ticks,c=o.gridLines,h=o.scaleLabel,f=0!==a.labelRotation,g=d.autoSkip,p=a.isHorizontal();d.maxTicksLimit&&(l=d.maxTicksLimit);var m=i.getValueOrDefault(d.fontColor,u.defaultFontColor),v=n(d),b=c.drawTicks?c.tickMarkLength:0,x=i.getValueOrDefault(h.fontColor,u.defaultFontColor),y=n(h),k=i.toRadians(a.labelRotation),w=Math.cos(k),M=a.longestLabelWidth*w;s.fillStyle=m;var S=[];if(p){if(r=!1,(M+d.autoSkipPadding)*a.ticks.length>a.width-(a.paddingLeft+a.paddingRight)&&(r=1+Math.floor((M+d.autoSkipPadding)*a.ticks.length/(a.width-(a.paddingLeft+a.paddingRight)))),l&&a.ticks.length>l)for(;!r||a.ticks.length/(r||1)>l;)r||(r=1),r+=1;g||(r=!1)}var C="right"===o.position?a.left:a.right-b,D="right"===o.position?a.left+b:a.right,I="bottom"===o.position?a.top:a.bottom-b,A="bottom"===o.position?a.top+b:a.bottom;if(i.each(a.ticks,function(t,n){if(void 0!==t&&null!==t){var l=a.ticks.length===n+1,s=r>1&&n%r>0||n%r===0&&n+r>=a.ticks.length;if((!s||l)&&void 0!==t&&null!==t){var h,g,m,v;n===("undefined"!=typeof a.zeroLineIndex?a.zeroLineIndex:0)?(h=c.zeroLineWidth,g=c.zeroLineColor,m=c.zeroLineBorderDash,v=c.zeroLineBorderDashOffset):(h=i.getValueAtIndexOrDefault(c.lineWidth,n),g=i.getValueAtIndexOrDefault(c.color,n),m=i.getValueOrDefault(c.borderDash,u.borderDash),v=i.getValueOrDefault(c.borderDashOffset,u.borderDashOffset));var x,y,w,M,P,_,T,F,R,L,V="middle",O="middle";if(p){"bottom"===o.position?(O=f?"middle":"top",V=f?"right":"center",L=a.top+b):(O=f?"middle":"bottom",V=f?"left":"center",L=a.bottom-b);var z=a.getPixelForTick(n)+i.aliasPixel(h);R=a.getPixelForTick(n,c.offsetGridLines)+d.labelOffset,x=w=P=T=z,y=I,M=A,_=e.top,F=e.bottom}else{var B,W="left"===o.position,N=d.padding;d.mirror?(V=W?"left":"right",B=N):(V=W?"right":"left", +B=b+N),R=W?a.right-B:a.left+B;var E=a.getPixelForTick(n);E+=i.aliasPixel(h),L=a.getPixelForTick(n,c.offsetGridLines),x=C,w=D,P=e.left,T=e.right,y=M=_=F=E}S.push({tx1:x,ty1:y,tx2:w,ty2:M,x1:P,y1:_,x2:T,y2:F,labelX:R,labelY:L,glWidth:h,glColor:g,glBorderDash:m,glBorderDashOffset:v,rotation:-1*k,label:t,textBaseline:O,textAlign:V})}}}),i.each(S,function(t){if(c.display&&(s.save(),s.lineWidth=t.glWidth,s.strokeStyle=t.glColor,s.setLineDash&&(s.setLineDash(t.glBorderDash),s.lineDashOffset=t.glBorderDashOffset),s.beginPath(),c.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),c.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke(),s.restore()),d.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=v.font,s.textBaseline=t.textBaseline,s.textAlign=t.textAlign;var e=t.label;if(i.isArray(e))for(var n=0,a=0;n0)i=t.stepSize;else{var o=e.niceNum(n.max-n.min,!1);i=e.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(n.min/i)*i,l=Math.ceil(n.max/i)*i;t.min&&t.max&&t.stepSize&&e.almostWhole((t.max-t.min)/t.stepSize,i/1e3)&&(r=t.min,l=t.max);var s=(l-r)/i;s=e.almostEquals(s,Math.round(s),i/1e3)?Math.round(s):Math.ceil(s),a.push(void 0!==t.min?t.min:r);for(var u=1;u3?i[2]-i[1]:i[1]-i[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=e.log10(Math.abs(a)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,n,i){var a=t/Math.pow(10,Math.floor(e.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===n||n===i.length-1?t.toExponential():""}}}}},{}],34:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){var n=s.color(t);return n.alpha(e*n.alpha()).rgbaString()}function n(t,e){return e&&(s.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function i(t){var e=t._xScale,n=t._yScale||t._scale,i=t._index,a=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,a):"",yLabel:n?n.getLabelForIndex(i,a):"",index:i,datasetIndex:a,x:t._model.x,y:t._model.y}}function a(e){var n=t.defaults.global,i=s.getValueOrDefault;return{xPadding:e.xPadding,yPadding:e.yPadding,xAlign:e.xAlign,yAlign:e.yAlign,bodyFontColor:e.bodyFontColor,_bodyFontFamily:i(e.bodyFontFamily,n.defaultFontFamily),_bodyFontStyle:i(e.bodyFontStyle,n.defaultFontStyle),_bodyAlign:e.bodyAlign,bodyFontSize:i(e.bodyFontSize,n.defaultFontSize),bodySpacing:e.bodySpacing,titleFontColor:e.titleFontColor,_titleFontFamily:i(e.titleFontFamily,n.defaultFontFamily),_titleFontStyle:i(e.titleFontStyle,n.defaultFontStyle),titleFontSize:i(e.titleFontSize,n.defaultFontSize),_titleAlign:e.titleAlign,titleSpacing:e.titleSpacing,titleMarginBottom:e.titleMarginBottom,footerFontColor:e.footerFontColor,_footerFontFamily:i(e.footerFontFamily,n.defaultFontFamily),_footerFontStyle:i(e.footerFontStyle,n.defaultFontStyle),footerFontSize:i(e.footerFontSize,n.defaultFontSize),_footerAlign:e.footerAlign,footerSpacing:e.footerSpacing,footerMarginTop:e.footerMarginTop,caretSize:e.caretSize,cornerRadius:e.cornerRadius,backgroundColor:e.backgroundColor,opacity:0,legendColorBackground:e.multiKeyBackground,displayColors:e.displayColors,borderColor:e.borderColor,borderWidth:e.borderWidth}}function o(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,o=e.body,r=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=e.beforeBody.length+e.afterBody.length;var l=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=l*d,i+=l?(l-1)*e.titleSpacing:0,i+=l?e.titleMarginBottom:0,i+=r*c,i+=r?(r-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,n.measureText(t).width+f)};return n.font=s.fontString(d,e._titleFontStyle,e._titleFontFamily),s.each(e.title,g),n.font=s.fontString(c,e._bodyFontStyle,e._bodyFontFamily),s.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,s.each(o,function(t){s.each(t.before,g),s.each(t.lines,g),s.each(t.after,g)}),f=0,n.font=s.fontString(h,e._footerFontStyle,e._footerFontFamily),s.each(e.footer,g),a+=2*e.xPadding,{width:a,height:i}}function r(t,e){var n=t._model,i=t._chart,a=t._chart.chartArea,o="center",r="center";n.yi.height-e.height&&(r="bottom");var l,s,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===r?(l=function(t){return t<=h},s=function(t){return t>h}):(l=function(t){return t<=e.width/2},s=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},l(n.x)?(o="left",u(n.x)&&(o="center",r=c(n.y))):s(n.x)&&(o="right",d(n.x)&&(o="center",r=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function l(t,e,n){var i=t.x,a=t.y,o=t.caretSize,r=t.caretPadding,l=t.cornerRadius,s=n.xAlign,u=n.yAlign,d=o+r,c=l+r;return"right"===s?i-=e.width:"center"===s&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===s?i+=d:"right"===s&&(i-=d):"left"===s?i-=c:"right"===s&&(i+=c),{x:i,y:a}}var s=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:s.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?n=o.xLabel:a>0&&o.index0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),i=!s.arrayEquals(e._active,e._lastActive),!i)return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,o=0;for(e=0,n=t.length;es;)o-=2*Math.PI;for(;o=l&&o<=s,d=r>=i.innerRadius&&r<=i.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],36:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:n.defaultColor,borderWidth:3,borderColor:n.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0},t.elements.Line=t.Element.extend({draw:function(){var t,i,a,o,r=this,l=r._view,s=r._chart.ctx,u=l.spanGaps,d=r._children.slice(),c=n.elements.line,h=-1;for(r._loop&&d.length&&d.push(d[0]),s.save(),s.lineCap=l.borderCapStyle||c.borderCapStyle,s.setLineDash&&s.setLineDash(l.borderDash||c.borderDash),s.lineDashOffset=l.borderDashOffset||c.borderDashOffset,s.lineJoin=l.borderJoinStyle||c.borderJoinStyle,s.lineWidth=l.borderWidth||c.borderWidth,s.strokeStyle=l.borderColor||n.defaultColor,s.beginPath(),h=-1,t=0;te?1:-1,r=1,l=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,a=u.base,o=1,r=a>i?1:-1,l=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a));d=d>c?c:d;var h=d/2,f=e+("left"!==l?h*o:0),g=n+("right"!==l?-h*o:0),p=i+("top"!==l?h*r:0),m=a+("bottom"!==l?-h*r:0);f!==g&&(i=p,a=m),p!==m&&(e=f,n=g)}s.beginPath(),s.fillStyle=u.backgroundColor,s.strokeStyle=u.borderColor,s.lineWidth=d;var v=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"],x=b.indexOf(l,0);x===-1&&(x=0);var y=t(0);s.moveTo(y[0],y[1]);for(var k=1;k<4;k++)y=t(k),s.lineTo(y[0],y[1]);s.fill(),d&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=!1;if(this._view){var a=n(this);i=t>=a.left&&t<=a.right&&e>=a.top&&e<=a.bottom}return i},inLabelRange:function(t,i){var a=this;if(!a._view)return!1;var o=!1,r=n(a);return o=e(a)?t>=r.left&&t<=r.right:i>=r.top&&i<=r.bottom},inXRange:function(t){var e=n(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=n(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,n,i=this._view;return e(this)?(t=i.x,n=(i.y+i.base)/2):(t=(i.x+i.base)/2,n=i.y),{x:t,y:n}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],39:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){var n=s.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}function n(t,n){var i=t.style,a=t.getAttribute("height"),o=t.getAttribute("width");if(t._chartjs={initial:{height:a,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===o||""===o){var r=e(t,"width");void 0!==r&&(t.width=r)}if(null===a||""===a)if(""===t.style.height)t.height=t.width/(n.options.aspectRatio||2);else{var l=e(t,"height");void 0!==r&&(t.height=l)}return t}function i(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function a(t,e){var n=u[t.type]||t.type,a=s.getRelativePosition(t,e);return i(n,e,a.x,a.y,t)}function o(t){var e=document.createElement("iframe");return e.className="chartjs-hidden-iframe",e.style.cssText="display:block;overflow:hidden;border:0;margin:0;top:0;left:0;bottom:0;right:0;height:100%;width:100%;position:absolute;pointer-events:none;z-index:-1;",e.tabIndex=-1,s.addEvent(e,"load",function(){s.addEvent(e.contentWindow||e,"resize",t),t()}),e}function r(t,e,n){var a=t._chartjs={ticking:!1},r=function(){a.ticking||(a.ticking=!0,s.requestAnimFrame.call(window,function(){if(a.resizer)return a.ticking=!1,e(i("resize",n))}))};a.resizer=o(r),t.insertBefore(a.resizer,t.firstChild)}function l(t){if(t&&t._chartjs){var e=t._chartjs.resizer;e&&(e.parentNode.removeChild(e),t._chartjs.resizer=null),delete t._chartjs}}var s=t.helpers,u={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};return{acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(n(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e._chartjs){var n=e._chartjs.initial;["height","width"].forEach(function(t){var i=n[t];void 0===i||null===i?e.removeAttribute(t):e.setAttribute(t,i)}),s.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e._chartjs}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"===e)return void r(i.parentNode,n,t);var o=n._chartjs||(n._chartjs={}),l=o.proxies||(o.proxies={}),u=l[t.id+"_"+e]=function(e){n(a(e,t))};s.addEvent(i,e,u)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"===e)return void l(i.parentNode,n);var a=n._chartjs||{},o=a.proxies||{},r=o[t.id+"_"+e];r&&s.removeEvent(i,e,r)}}}},{}],40:[function(t,e,n){"use strict";var i=t(39);e.exports=function(t){t.platform={acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},t.helpers.extend(t.platform,i(t))}},{39:39}],41:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e,n){var i,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),o===!1||null===o)return!1;if(o===!0)return"origin";if(i=parseFloat(o,10),isFinite(i)&&Math.floor(i)===i)return"-"!==o[0]&&"+"!==o[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function n(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?o=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?o=n.scaleZero:i.getBasePosition?o=i.getBasePosition():i.getBasePixel&&(o=i.getBasePixel()),void 0!==o&&null!==o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return e=i.isHorizontal(),{x:e?o:null,y:e?null:o}}return null}function i(t,e,n){var i,a=t[e],o=a.fill,r=[e];if(!n)return o;for(;o!==!1&&r.indexOf(o)===-1;){if(!isFinite(o))return o;if(i=t[o],!i)return!1;if(i.visible)return o;r.push(o),o=i.fill}return!1}function a(t){var e=t.fill,n="dataset";return e===!1?null:(isFinite(e)||(n="boundary"),d[n](t))}function o(t){return t&&!t.skip}function r(t,e,n,i,a){var o;if(i&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o0;--o)u.canvas.lineTo(t,n[o],n[o-1],!0)}}function l(t,e,n,i,a,l){var s,u,d,c,h,f,g,p=e.length,m=i.spanGaps,v=[],b=[],x=0,y=0;for(t.beginPath(),s=0,u=p+!!l;s=n.width&&(b+=d+o.padding,v[v.length]=n.left),g[i]={left:0,top:0,width:r,height:d},v[v.length-1]+=r+o.padding}),p.height+=b}else{var x=o.padding,y=n.columnWidths=[],k=o.padding,w=0,M=0,S=d+x;i.each(n.legendItems,function(t,n){var i=e(o,d),a=i+d/2+l.measureText(t.text).width;M+S>p.height&&(k+=w+o.padding,y.push(w),w=0,M=0),w=Math.max(w,a),M+=S,g[n]={left:0,top:0,width:a,height:d}}),k+=w,y.push(w),p.width+=k}n.width=p.width,n.height=p.height},afterFit:o,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var n=this,a=n.options,o=a.labels,r=t.defaults.global,l=r.elements.line,s=n.width,u=n.lineWidths;if(a.display){var d,c=n.ctx,h=i.getValueOrDefault,f=h(o.fontColor,r.defaultFontColor),g=h(o.fontSize,r.defaultFontSize),p=h(o.fontStyle,r.defaultFontStyle),m=h(o.fontFamily,r.defaultFontFamily),v=i.fontString(g,p,m);c.textAlign="left",c.textBaseline="top",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var b=e(o,g),x=n.legendHitBoxes,y=function(e,n,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,l.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,l.borderDashOffset),c.lineJoin=h(i.lineJoin,l.borderJoinStyle),c.lineWidth=h(i.lineWidth,l.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var o=0===h(i.lineWidth,l.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,l.borderDash)),a.labels&&a.labels.usePointStyle){var s=g*Math.SQRT2/2,u=s/Math.SQRT2,d=e+u,f=n+u;t.canvasHelpers.drawPoint(c,i.pointStyle,s,d,f)}else o||c.strokeRect(e,n,b,g),c.fillRect(e,n,b,g);c.restore()}},k=function(t,e,n,i){c.fillText(n.text,b+g/2+t,e),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(b+g/2+t,e+g/2),c.lineTo(b+g/2+t+i,e+g/2),c.stroke())},w=n.isHorizontal();d=w?{x:n.left+(s-u[0])/2,y:n.top+o.padding,line:0}:{x:n.left+o.padding,y:n.top+o.padding,line:0};var M=g+o.padding;i.each(n.legendItems,function(t,e){var i=c.measureText(t.text).width,a=b+g/2+i,r=d.x,l=d.y;w?r+a>=s&&(l=d.y+=M,d.line++,r=d.x=n.left+(s-u[d.line])/2):l+M>n.bottom&&(r=d.x=r+n.columnWidths[d.line]+o.padding,l=d.y=n.top+o.padding,d.line++),y(r,l,t),x[e].left=r,x[e].top=l,k(r,l,t,i),w?d.x+=a+o.padding:d.y+=M})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var l=e.legendHitBoxes,s=0;s=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[s]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[s]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(e){var o=e.options.legend,r=e.legend;o?(o=i.configMerge(t.defaults.global.legend,o),r?(a.configure(e,r,o),r.options=o):n(e,o)):r&&(a.removeBox(e,r),delete e.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{}],43:[function(t,e,n){"use strict";e.exports=function(t){function e(e,n){var a=new t.Title({ctx:e.ctx,options:n,chart:e});i.configure(e,a,n),i.addBox(e,a),e.titleBlock=a}var n=t.helpers,i=t.layoutService,a=n.noop;return t.defaults.global.title={display:!1,position:"top",fullWidth:!0,weight:2e3,fontStyle:"bold",padding:10,text:""},t.Title=t.Element.extend({initialize:function(t){var e=this;n.extend(e,t),e.legendHitBoxes=[]; +},beforeUpdate:a,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:a,beforeSetDimensions:a,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:a,beforeBuildLabels:a,buildLabels:a,afterBuildLabels:a,beforeFit:a,fit:function(){var e=this,i=n.getValueOrDefault,a=e.options,o=t.defaults.global,r=a.display,l=i(a.fontSize,o.defaultFontSize),s=e.minSize;e.isHorizontal()?(s.width=e.maxWidth,s.height=r?l+2*a.padding:0):(s.width=r?l+2*a.padding:0,s.height=e.maxHeight),e.width=s.width,e.height=s.height},afterFit:a,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var e=this,i=e.ctx,a=n.getValueOrDefault,o=e.options,r=t.defaults.global;if(o.display){var l,s,u,d=a(o.fontSize,r.defaultFontSize),c=a(o.fontStyle,r.defaultFontStyle),h=a(o.fontFamily,r.defaultFontFamily),f=n.fontString(d,c,h),g=0,p=e.top,m=e.left,v=e.bottom,b=e.right;i.fillStyle=a(o.fontColor,r.defaultFontColor),i.font=f,e.isHorizontal()?(l=m+(b-m)/2,s=p+(v-p)/2,u=b-m):(l="left"===o.position?m+d/2:b-d/2,s=p+(v-p)/2,u=v-p,g=Math.PI*("left"===o.position?-.5:.5)),i.save(),i.translate(l,s),i.rotate(g),i.textAlign="center",i.textBaseline="middle",i.fillText(o.text,0,0,u),i.restore()}}}),{id:"title",beforeInit:function(t){var n=t.options.title;n&&e(t,n)},beforeUpdate:function(a){var o=a.options.title,r=a.titleBlock;o?(o=n.configMerge(t.defaults.global.title,o),r?(i.configure(a,r,o),r.options=o):e(a,o)):r&&(t.layoutService.removeBox(a,r),delete a.titleBlock)}}}},{}],44:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"bottom"},i=t.Scale.extend({getLabels:function(){var t=this.chart.data;return(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,n=t.getLabels();t.minIndex=0,t.maxIndex=n.length-1;var i;void 0!==t.options.ticks.min&&(i=e.indexOf(n,t.options.ticks.min),t.minIndex=i!==-1?i:t.minIndex),void 0!==t.options.ticks.max&&(i=e.indexOf(n,t.options.ticks.max),t.maxIndex=i!==-1?i:t.maxIndex),t.min=n[t.minIndex],t.max=n[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.isHorizontal();return i.yLabels&&!a?n.getRightValue(i.datasets[e].data[t]):n.ticks[t-n.minIndex]},getPixelForValue:function(t,e,n,i){var a,o=this,r=Math.max(o.maxIndex+1-o.minIndex-(o.options.gridLines.offsetGridLines?0:1),1);if(void 0!==t&&null!==t&&(a=o.isHorizontal()?t.x:t.y),void 0!==a||void 0!==t&&isNaN(e)){var l=o.getLabels();t=a||t;var s=l.indexOf(t);e=s!==-1?s:e}if(o.isHorizontal()){var u=o.width/r,d=u*(e-o.minIndex);return(o.options.gridLines.offsetGridLines&&i||o.maxIndex===o.minIndex&&i)&&(d+=u/2),o.left+Math.round(d)}var c=o.height/r,h=c*(e-o.minIndex);return o.options.gridLines.offsetGridLines&&i&&(h+=c/2),o.top+Math.round(h)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,n=this,i=Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),a=n.isHorizontal(),o=(a?n.width:n.height)/i;return t-=a?n.left:n.top,n.options.gridLines.offsetGridLines&&(t-=o/2),e=t<=0?0:Math.round(t/o)},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType("category",i,n)}},{}],45:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:t.Ticks.formatters.linear}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=n.chart,o=a.data,r=o.datasets,l=n.isHorizontal(),s=0,u=1;n.min=null,n.max=null;var d=i.stacked;if(void 0===d&&e.each(r,function(e,n){if(!d){var i=a.getDatasetMeta(n);a.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(r,function(o,r){var l=a.getDatasetMeta(r),s=[l.type,void 0===i.stacked&&void 0===l.stack?r:"",l.stack].join(".");void 0===c[s]&&(c[s]={positiveValues:[],negativeValues:[]});var u=c[s].positiveValues,d=c[s].negativeValues;a.isDatasetVisible(r)&&t(l)&&e.each(o.data,function(t,e){var a=+n.getRightValue(t);isNaN(a)||l.data[e].hidden||(u[e]=u[e]||0,d[e]=d[e]||0,i.relativePoints?u[e]=100:a<0?d[e]+=a:u[e]+=a)})}),e.each(c,function(t){var i=t.positiveValues.concat(t.negativeValues),a=e.min(i),o=e.max(i);n.min=null===n.min?a:Math.min(n.min,a),n.max=null===n.max?o:Math.max(n.max,o)})}else e.each(r,function(i,o){var r=a.getDatasetMeta(o);a.isDatasetVisible(o)&&t(r)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===n.min?n.min=i:in.max&&(n.max=i))})});n.min=isFinite(n.min)?n.min:s,n.max=isFinite(n.max)?n.max:u,this.handleTickRangeOptions()},getTickLimit:function(){var n,i=this,a=i.options.ticks;if(i.isHorizontal())n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.width/50));else{var o=e.getValueOrDefault(a.fontSize,t.defaults.global.defaultFontSize);n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.height/(2*o)))}return n},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),o=n.end-i;return n.isHorizontal()?(e=n.left+n.width/o*(a-i),Math.round(e)):(e=n.bottom-n.height/o*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",i,n)}},{}],46:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,n=t.options,i=n.ticks;if(i.beginAtZero){var a=e.sign(t.min),o=e.sign(t.max);a<0&&o<0?t.max=0:a>0&&o>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(null===t.min?t.min=i.suggestedMin:t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(null===t.max?t.max=i.suggestedMax:t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:n,handleDirectionalChanges:n,buildTicks:function(){var n=this,i=n.options,a=i.ticks,o=n.getTickLimit();o=Math.max(2,o);var r={maxTicks:o,min:a.min,max:a.max,stepSize:e.getValueOrDefault(a.fixedStepSize,a.stepSize)},l=n.ticks=t.Ticks.generators.linear(r,n);n.handleDirectionalChanges(),n.max=e.max(l),n.min=e.min(l),a.reverse?(l.reverse(),n.start=n.max,n.end=n.min):(n.start=n.min,n.end=n.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],47:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:t.Ticks.formatters.logarithmic}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return u?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=i.ticks,o=n.chart,r=o.data,l=r.datasets,s=e.getValueOrDefault,u=n.isHorizontal();n.min=null,n.max=null,n.minNotZero=null;var d=i.stacked;if(void 0===d&&e.each(l,function(e,n){if(!d){var i=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(l,function(a,r){var l=o.getDatasetMeta(r),s=[l.type,void 0===i.stacked&&void 0===l.stack?r:"",l.stack].join(".");o.isDatasetVisible(r)&&t(l)&&(void 0===c[s]&&(c[s]=[]),e.each(a.data,function(t,e){var a=c[s],o=+n.getRightValue(t);isNaN(o)||l.data[e].hidden||(a[e]=a[e]||0,i.relativePoints?a[e]=100:a[e]+=o)}))}),e.each(c,function(t){var i=e.min(t),a=e.max(t);n.min=null===n.min?i:Math.min(n.min,i),n.max=null===n.max?a:Math.max(n.max,a)})}else e.each(l,function(i,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===n.min?n.min=i:in.max&&(n.max=i),0!==i&&(null===n.minNotZero||ia?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function o(t){var o,r,l,s=n(t),u=Math.min(t.height/2,t.width/2),d={r:t.width,l:0,t:t.height,b:0},c={};t.ctx.font=s.font,t._pointLabelSizes=[];var h=e(t);for(o=0;od.r&&(d.r=m.end,c.r=g),v.startd.b&&(d.b=v.end,c.b=g)}t.setReductions(u,d,c)}function r(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function l(t){return 0===t||180===t?"center":t<180?"left":"right"}function s(t,e,n,i){if(f.isArray(e))for(var a=n.y,o=1.5*i,r=0;r270||t<90)&&(n.y-=e.h)}function d(t){var i=t.ctx,a=f.getValueOrDefault,o=t.options,r=o.angleLines,d=o.pointLabels;i.lineWidth=r.lineWidth,i.strokeStyle=r.color;var c=t.getDistanceFromCenterForValue(o.reverse?t.min:t.max),h=n(t);i.textBaseline="top";for(var p=e(t)-1;p>=0;p--){if(r.display){var m=t.getPointPosition(p,c);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(m.x,m.y),i.stroke(),i.closePath()}if(d.display){var v=t.getPointPosition(p,c+5),b=a(d.fontColor,g.defaultFontColor);i.font=h.font,i.fillStyle=b;var x=t.getIndexAngle(p),y=f.toDegrees(x);i.textAlign=l(y),u(y,t._pointLabelSizes[p],v),s(i,t.pointLabels[p]||"",v,h.size)}}}function c(t,n,i,a){var o=t.ctx;if(o.strokeStyle=f.getValueAtIndexOrDefault(n.color,a-1),o.lineWidth=f.getValueAtIndexOrDefault(n.lineWidth,a-1),t.options.gridLines.circular)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var r=e(t);if(0===r)return;o.beginPath();var l=t.getPointPosition(0,i);o.moveTo(l.x,l.y);for(var s=1;s0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,a=f.getValueOrDefault;if(e.display){var o=t.ctx,r=a(i.fontSize,g.defaultFontSize),l=a(i.fontStyle,g.defaultFontStyle),s=a(i.fontFamily,g.defaultFontFamily),u=f.fontString(r,l,s);f.each(t.ticks,function(l,s){if(s>0||e.reverse){var d=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]),h=t.yCenter-d;if(n.display&&0!==s&&c(t,n,d,s),i.display){var f=a(i.fontColor,g.defaultFontColor);if(o.font=u,i.showLabelBackdrop){var p=o.measureText(l).width;o.fillStyle=i.backdropColor,o.fillRect(t.xCenter-p/2-i.backdropPaddingX,h-r/2-i.backdropPaddingY,p+2*i.backdropPaddingX,r+2*i.backdropPaddingY)}o.textAlign="center",o.textBaseline="middle",o.fillStyle=f,o.fillText(l,t.xCenter,h)}}}),(e.angleLines.display||e.pointLabels.display)&&d(t)}}});t.scaleService.registerScaleType("radialLinear",m,p)}},{}],49:[function(t,e,n){"use strict";var i=t(1);i="function"==typeof i?i:window.moment,e.exports=function(t){function e(t,e){var n=t.options.time;if("string"==typeof n.parser)return i(e,n.parser);if("function"==typeof n.parser)return n.parser(e);if("function"==typeof e.getMonth||"number"==typeof e)return i(e);if(e.isValid&&e.isValid())return e;var a=n.format;return"string"!=typeof a&&a.call?(console.warn("options.time.format is deprecated and replaced by options.time.parser."),a(e)):i(e,a)}function n(t,e,n,i){for(var a,o=Object.keys(l),r=o.length,s=o.indexOf(t);si;c++)s=a.steps[c],r=Math.ceil(u/(o*s));else for(;r>i&&i>0;)++s,r=Math.ceil(u/(o*s));return s}function o(t,e,n){var a=[];if(t.maxTicks){var o=t.stepSize;a.push(void 0!==t.min?t.min:n.min);for(var r=i(n.min);r.add(o,t.unit).valueOf()0&&a.add(1,"week"),a=a.valueOf()):(n=i(e.min).startOf(t.unit).valueOf(),a=i(e.max).startOf(t.unit),e.max-a>0&&a.add(1,t.unit),a=a.valueOf()),o(t,e,{min:n,max:a})};var u=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},determineDataLimits:function(){var t,n=this,i=n.options.time,a=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER,l=n.chart.data,s={labels:[],datasets:[]};r.each(l.labels,function(r,l){var u=e(n,r);u.isValid()&&(i.round&&u.startOf(i.round),t=u.valueOf(),a=Math.min(t,a),o=Math.max(t,o),s.labels[l]=t)}),r.each(l.datasets,function(l,u){var d=[];"object"==typeof l.data[0]&&null!==l.data[0]&&n.chart.isDatasetVisible(u)?r.each(l.data,function(r,l){var s=e(n,n.getRightValue(r));s.isValid()&&(i.round&&s.startOf(i.round),t=s.valueOf(),a=Math.min(t,a),o=Math.max(t,o),d[l]=t)}):d=s.labels.slice(),s.datasets[u]=d}),n.dataMin=a,n.dataMax=o,n._parsedData=s},buildTicks:function(){var i,o,l=this,s=l.options.time,u=l.dataMin,d=l.dataMax;if(s.min){var c=e(l,s.min);s.round&&c.round(s.round),i=c.valueOf()}s.max&&(o=e(l,s.max).valueOf());var h=l.getLabelCapacity(i||u),f=s.unit||n(s.minUnit,i||u,o||d,h);l.displayFormat=s.displayFormats[f];var g=s.stepSize||a(i||u,o||d,f,h);l.ticks=t.Ticks.generators.time({maxTicks:h,min:i,max:o,stepSize:g,unit:f,isoWeekday:s.isoWeekday},{min:u,max:d}),l.max=r.max(l.ticks),l.min=r.min(l.ticks)},getLabelForIndex:function(t,n){var i=this,a=i.chart.data.labels&&t - https://camwiegert.github.io/in-view + * License: MIT + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.inView=e():t.inView=e()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),o=r(i);t.exports=o["default"]},function(t,e){function n(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=n},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(9),o=r(i),u=n(3),f=r(u),s=n(4),c=function(){if("undefined"!=typeof window){var t=100,e=["scroll","resize","load"],n={history:[]},r={offset:{},threshold:0,test:s.inViewport},i=(0,o["default"])(function(){n.history.forEach(function(t){n[t].check()})},t);e.forEach(function(t){return addEventListener(t,i)}),window.MutationObserver&&addEventListener("DOMContentLoaded",function(){new MutationObserver(i).observe(document.body,{attributes:!0,childList:!0,subtree:!0})});var u=function(t){if("string"==typeof t){var e=[].slice.call(document.querySelectorAll(t));return n.history.indexOf(t)>-1?n[t].elements=e:(n[t]=(0,f["default"])(e,r),n.history.push(t)),n[t]}};return u.offset=function(t){if(void 0===t)return r.offset;var e=function(t){return"number"==typeof t};return["top","right","bottom","left"].forEach(e(t)?function(e){return r.offset[e]=t}:function(n){return e(t[n])?r.offset[n]=t[n]:null}),r.offset},u.threshold=function(t){return"number"==typeof t&&t>=0&&t<=1?r.threshold=t:r.threshold},u.test=function(t){return"function"==typeof t?r.test=t:r.test},u.is=function(t){return r.test(t,r)},u.offset(0),u}};e["default"]=c()},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n-1,o=n&&!i,u=!n&&i;o&&(t.current.push(e),t.emit("enter",e)),u&&(t.current.splice(r,1),t.emit("exit",e))}),this}},{key:"on",value:function(t,e){return this.handlers[t].push(e),this}},{key:"once",value:function(t,e){return this.singles[t].unshift(e),this}},{key:"emit",value:function(t,e){for(;this.singles[t].length;)this.singles[t].pop()(e);for(var n=this.handlers[t].length;--n>-1;)this.handlers[t][n](e);return this}}]),t}();e["default"]=function(t,e){return new i(t,e)}},function(t,e){"use strict";function n(t,e){var n=t.getBoundingClientRect(),r=n.top,i=n.right,o=n.bottom,u=n.left,f=n.width,s=n.height,c={t:o,r:window.innerWidth-u,b:window.innerHeight-r,l:i},a={x:e.threshold*f,y:e.threshold*s};return c.t>e.offset.top+a.y&&c.r>e.offset.right+a.x&&c.b>e.offset.bottom+a.y&&c.l>e.offset.left+a.x}Object.defineProperty(e,"__esModule",{value:!0}),e.inViewport=n},function(t,e){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(e,function(){return this}())},function(t,e,n){var r=n(5),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();t.exports=o},function(t,e,n){function r(t,e,n){function r(e){var n=x,r=m;return x=m=void 0,E=e,w=t.apply(r,n)}function a(t){return E=t,j=setTimeout(h,e),M?r(t):w}function l(t){var n=t-O,r=t-E,i=e-n;return _?c(i,g-r):i}function d(t){var n=t-O,r=t-E;return void 0===O||n>=e||n<0||_&&r>=g}function h(){var t=o();return d(t)?p(t):void(j=setTimeout(h,l(t)))}function p(t){return j=void 0,T&&x?r(t):(x=m=void 0,w)}function v(){void 0!==j&&clearTimeout(j),E=0,x=O=m=j=void 0}function y(){return void 0===j?w:p(o())}function b(){var t=o(),n=d(t);if(x=arguments,m=this,O=t,n){if(void 0===j)return a(O);if(_)return j=setTimeout(h,e),r(O)}return void 0===j&&(j=setTimeout(h,e)),w}var x,m,g,w,j,O,E=0,M=!1,_=!1,T=!0;if("function"!=typeof t)throw new TypeError(f);return e=u(e)||0,i(n)&&(M=!!n.leading,_="maxWait"in n,g=_?s(u(n.maxWait)||0,e):g,T="trailing"in n?!!n.trailing:T),b.cancel=v,b.flush=y,b}var i=n(1),o=n(8),u=n(10),f="Expected a function",s=Math.max,c=Math.min;t.exports=r},function(t,e,n){var r=n(6),i=function(){return r.Date.now()};t.exports=i},function(t,e,n){function r(t,e,n){var r=!0,f=!0;if("function"!=typeof t)throw new TypeError(u);return o(n)&&(r="leading"in n?!!n.leading:r,f="trailing"in n?!!n.trailing:f),i(t,e,{leading:r,maxWait:e,trailing:f})}var i=n(7),o=n(1),u="Expected a function";t.exports=r},function(t,e){function n(t){return t}t.exports=n}])}); diff --git a/website/assets/js/main.js b/website/assets/js/main.js index 616fbb1df..42199538f 100644 --- a/website/assets/js/main.js +++ b/website/assets/js/main.js @@ -1,23 +1,324 @@ //- 💫 MAIN JAVASCRIPT +//- Note: Will be compiled using Babel before deployment. 'use strict' -{ - const nav = document.querySelector('.js-nav') - const fixedClass = 'is-fixed' - let vh, scrollY = 0, scrollUp = false +const $ = document.querySelector.bind(document); +const $$ = document.querySelectorAll.bind(document); - const updateVh = () => Math.max(document.documentElement.clientHeight, window.innerHeight || 0) - const updateNav = () => { - const vh = updateVh() - const newScrollY = (window.pageYOffset || document.scrollTop) - (document.clientTop || 0) - if (newScrollY != scrollY) scrollUp = newScrollY <= scrollY - scrollY = newScrollY - - if(scrollUp && !(isNaN(scrollY) || scrollY <= vh)) nav.classList.add(fixedClass) - else if (!scrollUp || (isNaN(scrollY) || scrollY <= vh/2)) nav.classList.remove(fixedClass) +class ProgressBar { + /** + * Animated reading progress bar. + * @param {String} selector – CSS selector of progress bar element. + */ + constructor(selector) { + this.el = $(selector); + this.scrollY = 0; + this.sizes = this.updateSizes(); + this.el.setAttribute('max', 100); + this.init(); } - window.addEventListener('scroll', () => requestAnimationFrame(updateNav)) + init() { + window.addEventListener('scroll', () => { + this.scrollY = (window.pageYOffset || document.scrollTop) - (document.clientTop || 0); + requestAnimationFrame(this.update.bind(this)); + }, false); + window.addEventListener('resize', () => { + this.sizes = this.updateSizes(); + requestAnimationFrame(this.update.bind(this)); + }) + } + + update() { + const offset = 100 - ((this.sizes.height - this.scrollY - this.sizes.vh) / this.sizes.height * 100); + this.el.setAttribute('value', (this.scrollY == 0) ? 0 : offset || 0); + } + + updateSizes() { + const body = document.body; + const html = document.documentElement; + return { + height: Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight), + vh: Math.max(html.clientHeight, window.innerHeight || 0) + } + } +} + + +class SectionHighlighter { + /** + * Hightlight section in viewport in sidebar, using in-view library. + * @param {String} sectionAttr - Data attribute of sections. + * @param {String} navAttr - Data attribute of navigation items. + * @param {String} activeClass – Class name of active element. + */ + constructor(sectionAttr, navAttr, activeClass = 'is-active') { + this.sections = [...$$(`[${navAttr}]`)]; + this.navAttr = navAttr; + this.sectionAttr = sectionAttr; + this.activeClass = activeClass; + inView(`[${sectionAttr}]`).on('enter', this.highlightSection.bind(this)); + } + + highlightSection(section) { + const id = section.getAttribute(this.sectionAttr); + const el = $(`[${this.navAttr}="${id}"]`); + if (el) { + this.sections.forEach(el => el.classList.remove(this.activeClass)); + el.classList.add(this.activeClass); + } + } +} + + +class Templater { + /** + * Mini templating engine based on data attributes. Selects elements based + * on a data-tpl and data-tpl-key attribute and can set textContent + * and innterHtml. + * + * @param {String} templateId - Template section, e.g. value of data-tpl. + */ + constructor(templateId) { + this.templateId = templateId; + } + + get(key) { + return $(`[data-tpl="${this.templateId}"][data-tpl-key="${key}"]`); + } + + fill(key, value, html = false) { + const el = this.get(key); + if (html) el.innerHTML = value || ''; + else el.textContent = value || ''; + return el; + } +} + + +class ModelLoader { + /** + * Load model meta from GitHub and update model details on site. Uses the + * Templater mini template engine to update DOM. + * + * @param {String} repo - Path tp GitHub repository containing releases. + * @param {Array} models - List of model IDs, e.g. "en_core_web_sm". + * @param {Object} licenses - License IDs mapped to URLs. + * @param {Object} accKeys - Available accuracy keys mapped to display labels. + */ + constructor(repo, models = [], licenses = {}, accKeys = {}) { + this.url = `https://raw.githubusercontent.com/${repo}/master`; + this.repo = `https://github.com/${repo}`; + this.modelIds = models; + this.licenses = licenses; + this.accKeys = accKeys; + this.chartColor = '#09a3d5'; + this.chartOptions = { + type: 'bar', + options: { responsive: true, scales: { + yAxes: [{ label: 'Accuracy', ticks: { suggestedMin: 70 }}], + xAxes: [{ barPercentage: 0.425 }] + }} + } + Chart.defaults.global.legend.position = 'bottom'; + Chart.defaults.global.defaultFontFamily = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"; + this.init(); + } + + init() { + this.modelIds.forEach(modelId => + new Templater(modelId).get('table').setAttribute('data-loading', '')); + fetch(`${this.url}/compatibility.json`) + .then(res => this.handleResponse(res)) + .then(json => json.ok ? this.getModels(json['spacy']) : this.modelIds.forEach(modelId => this.showError(modelId))) + } + + handleResponse(res) { + if (res.ok) return res.json().then(json => Object.assign({}, json, { ok: res.ok })) + else return ({ ok: res.ok }) + } + + getModels(compat) { + this.compat = compat; + for (let modelId of this.modelIds) { + const version = this.getLatestVersion(modelId, compat); + if (!version) { + this.showError(modelId); return; + } + fetch(`${this.url}/meta/${modelId}-${version}.json`) + .then(res => this.handleResponse(res)) + .then(json => json.ok ? this.render(json) : this.showError(modelId)) + } + // make sure scroll positions for progress bar etc. are recalculated + window.dispatchEvent(new Event('resize')); + } + + showError(modelId) { + const template = new Templater(modelId); + template.get('table').removeAttribute('data-loading'); + template.get('error').style.display = 'block'; + for (let key of ['sources', 'pipeline', 'author', 'license']) { + template.get(key).parentElement.parentElement.style.display = 'none'; + } + } + + /** + * Update model details in tables. Currently quite hacky :( + */ + render({ lang, name, version, sources, pipeline, url, author, license, accuracy, size, description, notes }) { + const modelId = `${lang}_${name}`; + const model = `${modelId}-${version}`; + const template = new Templater(modelId); + + const getSources = s => (s instanceof Array) ? s.join(', ') : s; + const getPipeline = p => p.map(comp => `${comp}`).join(', '); + const getLink = (t, l) => `
    ${t}`; + + const keys = { version, size, description, notes } + Object.keys(keys).forEach(key => template.fill(key, keys[key])); + + if (sources) template.fill('sources', getSources(sources)); + if (pipeline && pipeline.length) template.fill('pipeline', getPipeline(pipeline), true); + else template.get('pipeline').parentElement.parentElement.style.display = 'none'; + + if (author) template.fill('author', url ? getLink(author, url) : author, true); + if (license) template.fill('license', this.licenses[license] ? getLink(license, this.licenses[license]) : license, true); + + template.get('download').setAttribute('href', `${this.repo}/releases/tag/${model}`); + if (accuracy) this.renderAccuracy(template, accuracy, modelId); + this.renderCompat(template, modelId); + template.get('table').removeAttribute('data-loading'); + } + + renderCompat(template, modelId) { + template.get('compat-wrapper').style.display = 'table-row'; + const options = Object.keys(this.compat).map(v => ``).join(''); + template + .fill('compat', '' + options, true) + .addEventListener('change', ev => { + const result = this.compat[ev.target.value][modelId]; + if (result) template.fill('compat-versions', `${modelId}-${result[0]}`, true); + else template.fill('compat-versions', ''); + }); + } + + renderAccuracy(template, accuracy, modelId, compare=false) { + template.get('accuracy-wrapper').style.display = 'block'; + const metaKeys = Object.keys(this.accKeys).map(k => accuracy[k] ? k : false).filter(k => k); + for (let key of metaKeys) { + template.fill(key, accuracy[key].toFixed(2)).parentElement.style.display = 'table-row'; + } + + this.chartOptions.options.legend = { display: compare } + new Chart(`chart_${modelId}`, Object.assign({}, this.chartOptions, { data: { + datasets: [{ + label: modelId, + data: metaKeys.map(key => accuracy[key].toFixed(2)), + backgroundColor: this.chartColor + }], + labels: metaKeys.map(key => this.accKeys[key]) + }})) + } + + getLatestVersion(model, compat = {}) { + for (let spacy_v of Object.keys(compat)) { + const models = compat[spacy_v]; + if (models[model]) return models[model][0]; + } + } +} + + +class Changelog { + /** + * Fetch and render changelog from GitHub. Clones a template node (table row) + * to avoid doubling templating markup in JavaScript. + * + * @param {String} user - GitHub username. + * @param {String} repo - Repository to fetch releases from. + */ + constructor(user, repo) { + this.url = `https://api.github.com/repos/${user}/${repo}/releases`; + this.template = new Templater('changelog'); + fetch(this.url) + .then(res => this.handleResponse(res)) + .then(json => json.ok ? this.render(json) : false) + } + + /** + * Get template section from template row. Slightly hacky, but does make sense. + */ + $(item, id) { + return item.querySelector(`[data-changelog="${id}"]`); + } + + handleResponse(res) { + if (res.ok) return res.json().then(json => Object.assign({}, json, { ok: res.ok })) + else return ({ ok: res.ok }) + } + + render(json) { + this.template.get('error').style.display = 'none'; + this.template.get('table').style.display = 'block'; + this.row = this.template.get('item'); + this.releases = this.template.get('releases'); + this.prereleases = this.template.get('prereleases'); + Object.values(json) + .filter(release => release.name) + .forEach(release => this.renderRelease(release)); + this.row.remove(); + // make sure scroll positions for progress bar etc. are recalculated + window.dispatchEvent(new Event('resize')); + } + + /** + * Clone the template row and populate with content from API response. + * https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository + * + * @param {String} name - Release title. + * @param {String} tag (tag_name) - Release tag. + * @param {String} url (html_url) - URL to the release page on GitHub. + * @param {String} date (published_at) - Timestamp of release publication. + * @param {Boolean} pre (prerelease) - Whether the release is a prerelease. + */ + renderRelease({ name, tag_name: tag, html_url: url, published_at: date, prerelease: pre }) { + const container = pre ? this.prereleases : this.releases; + const row = this.row.cloneNode(true); + this.$(row, 'date').textContent = date.split('T')[0]; + this.$(row, 'tag').innerHTML = `${tag}`; + this.$(row, 'title').textContent = (name.split(': ').length == 2) ? name.split(': ')[1] : name; + container.appendChild(row); + } +} + + +class GitHubEmbed { + /** + * Embed code from GitHub repositories, similar to Gist embeds. Fetches the + * raw text and places it inside element. + * Usage:
    +     *
    +     * @param {String} user - GitHub user or organization.
    +     * @param {String} attr - Data attribute used to select containers. Attribute
    +     *                        value should be path to file relative to user.
    +     */
    +    constructor(user, attr) {
    +        this.url = `https://raw.githubusercontent.com/${user}`;
    +        this.attr = attr;
    +        this.error = `\nCan't fetch code example from GitHub :(\n\nPlease use the link below to view the example. If you've come across\na broken link, we always appreciate a pull request to the repository,\nor a report on the issue tracker. Thanks!`;
    +        [...$$(`[${this.attr}]`)].forEach(el => this.embed(el));
    +    }
    +
    +    embed(el) {
    +        el.parentElement.setAttribute('data-loading', '');
    +        fetch(`${this.url}/${el.getAttribute(this.attr)}`)
    +            .then(res => res.text().then(text => ({ text, ok: res.ok })))
    +            .then(({ text, ok }) => {
    +                el.textContent = ok ? text : this.error;
    +                if (ok && window.Prism) Prism.highlightElement(el);
    +            })
    +        el.parentElement.removeAttribute('data-loading');
    +    }
     }
    diff --git a/website/assets/js/prism.js b/website/assets/js/prism.min.js
    similarity index 100%
    rename from website/assets/js/prism.js
    rename to website/assets/js/prism.min.js
    diff --git a/website/assets/js/quickstart.js b/website/assets/js/quickstart.min.js
    similarity index 100%
    rename from website/assets/js/quickstart.js
    rename to website/assets/js/quickstart.min.js
    
    From 9af604f0da5676103b5cbbae2147abdb1e5ce089 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:20:13 +0200
    Subject: [PATCH 170/649] Update layout templates, partials and mixins
    
    ---
     website/404.jade                    |   3 +-
     website/_includes/_footer.jade      |  12 +-
     website/_includes/_functions.jade   |  70 ++++++--
     website/_includes/_mixins-base.jade | 124 +++++++++-----
     website/_includes/_mixins.jade      | 249 ++++++++++++++++------------
     website/_includes/_navigation.jade  |  20 +--
     website/_includes/_newsletter.jade  |   9 +-
     website/_includes/_page-docs.jade   |  61 ++++---
     website/_includes/_page_models.jade |  77 +++++++++
     website/_includes/_sidebar.jade     |  24 ++-
     website/_layout.jade                |  19 ++-
     11 files changed, 436 insertions(+), 232 deletions(-)
     create mode 100644 website/_includes/_page_models.jade
    
    diff --git a/website/404.jade b/website/404.jade
    index 33b936a08..af4e7d0f2 100644
    --- a/website/404.jade
    +++ b/website/404.jade
    @@ -8,4 +8,5 @@ include _includes/_mixins
             | does not exist!
     
         h2.c-landing__title.u-heading-3.u-padding-small
    -        a(href="javascript:history.go(-1)") Click here to go back.
    +        +button(false, true, "secondary-light")(href="javascript:history.go(-1)")
    +            |  Click here to go back
    diff --git a/website/_includes/_footer.jade b/website/_includes/_footer.jade
    index e933f37a8..4d0d34cb5 100644
    --- a/website/_includes/_footer.jade
    +++ b/website/_includes/_footer.jade
    @@ -1,8 +1,6 @@
     //- 💫 INCLUDES > FOOTER
     
    -include _mixins
    -
    -footer.o-footer.u-text.u-border-dotted
    +footer.o-footer.u-text
         +grid.o-content
             each group, label in FOOTER
                 +grid-col("quarter")
    @@ -13,18 +11,18 @@ footer.o-footer.u-text.u-border-dotted
                             li
                                 +a(url)=item
     
    -        if SECTION != "docs"
    +        if SECTION == "index"
                 +grid-col("quarter")
                     include _newsletter
     
    -    if SECTION == "docs"
    +    if SECTION != "index"
             .o-content.o-block.u-border-dotted
                 include _newsletter
     
         .o-inline-list.u-text-center.u-text-tiny.u-color-subtle
             span © 2016-#{new Date().getFullYear()} #[+a(COMPANY_URL, true)=COMPANY]
     
    -        +a(COMPANY_URL, true)
    -            +svg("graphics", "explosion", 45).o-icon.u-color-theme.u-grayscale
    +        +a(COMPANY_URL, true)(aria-label="Explosion AI")
    +            +icon("explosion", 45).o-icon.u-color-theme.u-grayscale
     
             +a(COMPANY_URL + "/legal", true) Legal / Imprint
    diff --git a/website/_includes/_functions.jade b/website/_includes/_functions.jade
    index e88e678cb..5209dbbec 100644
    --- a/website/_includes/_functions.jade
    +++ b/website/_includes/_functions.jade
    @@ -1,35 +1,71 @@
     //- 💫 INCLUDES > FUNCTIONS
     
    -//- More descriptive variables for current.path and current.source
    +//- Descriptive variables, available in the global scope
     
     - CURRENT = current.source
     - SECTION = current.path[0]
    -- SUBSECTION = current.path[1]
    +- LANGUAGES = public.models._data.LANGUAGES
    +- MODELS = public.models._data.MODELS
    +- CURRENT_MODELS = MODELS[current.source] || []
    +
    +- MODEL_COUNT = Object.keys(MODELS).map(m => Object.keys(MODELS[m]).length).reduce((a, b) => a + b)
    +- MODEL_LANG_COUNT = Object.keys(MODELS).length
    +- LANG_COUNT = Object.keys(LANGUAGES).length
    +
    +- MODEL_META = public.models._data.MODEL_META
    +- MODEL_LICENSES = public.models._data.MODEL_LICENSES
    +- MODEL_ACCURACY = public.models._data.MODEL_ACCURACY
    +- EXAMPLE_SENTENCES = public.models._data.EXAMPLE_SENTENCES
    +
    +- IS_PAGE = (SECTION != "index") && !landing
    +- IS_MODELS = (SECTION == "models" && LANGUAGES[current.source])
    +- HAS_MODELS = IS_MODELS && CURRENT_MODELS.length
     
     
     //- Add prefixes to items of an array (for modifier CSS classes)
    +    array   - [array] list of class names or options, e.g. ["foot"]
    +    prefix  - [string] prefix to add to each class, e.g. "c-table__row"
    +    RETURNS - [array] list of modified class names
     
     -   function prefixArgs(array, prefix) {
    --       return array.map(function(arg) {
    --           return prefix + '--' + arg;
    --       }).join(' ');
    +-       return array.map(arg => prefix + '--' + arg).join(' ');
    +-   }
    +
    +
    +//- Convert API paths (semi-temporary fix for renamed sections)
    +    path    - [string] link path supplied to +api mixin
    +    RETURNS - [string] new link path to correct location
    +
    +-   function convertAPIPath(path) {
    +-       if (path.startsWith('spacy#') || path.startsWith('displacy#') || path.startsWith('util#')) {
    +-           var comps = path.split('#');
    +-           return "top-level#" + comps[0] + '.' + comps[1];
    +-       }
    +-       else if (path.startsWith('cli#')) {
    +-           return "top-level#" + path.split('#')[1];
    +-       }
    +-       return path;
    +-   }
    +
    +
    +//- Get model components from ID. Components can then be looked up in LANGUAGES
    +    and MODEL_META respectively, to get their human-readable form.
    +    id      - [string] model ID, e.g. "en_core_web_sm"
    +    RETURNS - [object] object keyed by components lang, type, genre and size
    +
    +-   function getModelComponents(id) {
    +-       var comps = id.split('_');
    +-       return {'lang': comps[0], 'type': comps[1], 'genre': comps[2], 'size': comps[3]}
     -   }
     
     
     //- Generate GitHub links
    +    repo     - [string] name of repo owned by explosion
    +    filepath - [string] logical path to file relative to repository root
    +    branch   - [string] optional branch, defaults to "master"
    +    RETURNS  - [string] the correct link to the file on GitHub
     
     -   function gh(repo, filepath, branch) {
     -       var branch = ALPHA ? 'develop' : branch
    --       return 'https://github.com/' + SOCIAL.github + '/' + repo + (filepath ? '/blob/' + (branch || 'master') + '/' + filepath : '' );
    --   }
    -
    -
    -//- Get social images
    -
    --   function getSocialImg() {
    --       var base = SITE_URL + '/assets/img/social/preview_'
    --       var image = ALPHA ? 'alpha' : 'default'
    --       if (preview) image = preview
    --       else if (SECTION == 'docs' && !ALPHA) image = 'docs'
    --       return base + image + '.jpg'
    +-       return 'https://github.com/' + SOCIAL.github + '/' + (repo || '') + (filepath ? '/blob/' + (branch || 'master') + '/' + filepath : '' );
     -   }
    diff --git a/website/_includes/_mixins-base.jade b/website/_includes/_mixins-base.jade
    index 7534a6f4e..752423d79 100644
    --- a/website/_includes/_mixins-base.jade
    +++ b/website/_includes/_mixins-base.jade
    @@ -1,5 +1,13 @@
     //- 💫 MIXINS > BASE
     
    +//- Section
    +    id - [string] anchor assigned to section (used for breadcrumb navigation)
    +
    +mixin section(id)
    +    section.o-section(id="section-" + id data-section=id)
    +        block
    +
    +
     //- Aside wrapper
         label - [string] aside label
     
    @@ -11,34 +19,26 @@ mixin aside-wrapper(label)
     
                 block
     
    -//- Date
    -    input - [string] date in the format YYYY-MM-DD
     
    -mixin date(input)
    -    - var date = new Date(input)
    -    - var months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]
    -
    -    time(datetime=JSON.parse(JSON.stringify(date)))&attributes(attributes)=months[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear()
    -
    -
    -//- SVG from map
    -    file   - [string] SVG file name in /assets/img/
    +//- SVG from map (uses embedded SVG sprite)
         name   - [string] SVG symbol id
         width  - [integer] width in px
         height - [integer] height in px (default: same as width)
     
    -mixin svg(file, name, width, height)
    +mixin svg(name, width, height)
         svg(aria-hidden="true" viewBox="0 0 #{width} #{height || width}" width=width height=(height || width))&attributes(attributes)
    -        use(xlink:href="/assets/img/#{file}.svg##{name}")
    +        use(xlink:href="#svg_#{name}")
     
     
     //- Icon
    -    name - [string] icon name, should be SVG symbol ID
    -    size - [integer] icon width and height (default: 20)
    +    name   - [string] icon name (will be used as symbol id: #svg_{name})
    +    width  - [integer] icon width (default: 20)
    +    height - [integer] icon height (defaults to width)
     
    -mixin icon(name, size)
    -    - var size = size || 20
    -    +svg("icons", name, size).o-icon(style="min-width: #{size}px")&attributes(attributes)
    +mixin icon(name, width, height)
    +    - var width = width || 20
    +    - var height = height || width
    +    +svg(name, width, height).o-icon(style="min-width: #{width}px")&attributes(attributes)
     
     
     //- Pro/Con/Neutral icon
    @@ -46,8 +46,8 @@ mixin icon(name, size)
         size - [integer] icon size (optional)
     
     mixin procon(icon, size)
    -    - colors = { pro: "green", con: "red", neutral: "yellow" }
    -    +icon(icon, size)(class="u-color-#{colors[icon] || 'subtle'}" aria-label=icon)&attributes(attributes)
    +    - colors = { pro: "green", con: "red", neutral: "subtle" }
    +    +icon("circle", size || 16)(class="u-color-#{colors[icon] || 'subtle'}" aria-label=icon)&attributes(attributes)
     
     
     //- Headlines Helper Mixin
    @@ -80,8 +80,7 @@ mixin headline(level)
     
     mixin permalink(id)
         if id
    -        a.u-permalink(id=id href="##{id}")
    -            +icon("anchor").u-permalink__icon
    +        a.u-permalink(href="##{id}")
                 block
     
         else
    @@ -109,7 +108,7 @@ mixin quickstart(groups, headline, description, hide_results)
                         .c-quickstart__fields
                             for option in group.options
                                 input.c-quickstart__input(class="c-quickstart__input--" + (group.input_style ? group.input_style : group.multiple ? "check" : "radio") type=group.multiple ? "checkbox" : "radio" name=group.id id="qs-#{option.id}" value=option.id checked=option.checked)
    -                            label.c-quickstart__label(for="qs-#{option.id}")!=option.title
    +                            label.c-quickstart__label.u-text-tiny(for="qs-#{option.id}")!=option.title
                                     if option.meta
                                         |  #[span.c-quickstart__label__meta (#{option.meta})]
                                     if option.help
    @@ -122,12 +121,10 @@ mixin quickstart(groups, headline, description, hide_results)
                     code.c-code-block__content.c-quickstart__code(data-qs-results="")
                         block
     
    -    .c-quickstart__info.u-text-tiny.o-block.u-text-right
    -        |  Like this widget? Check out #[+a("https://github.com/ines/quickstart").u-link quickstart.js]!
    -
     
     //- Quickstart code item
    -    data [object] - Rendering conditions (keyed by option group ID, value: option)
    +    data  - [object] Rendering conditions (keyed by option group ID, value: option)
    +    style - [string] modifier ID for line style
     
     mixin qs(data, style)
         - args = {}
    @@ -148,6 +145,13 @@ mixin terminal(label)
             +code.x-terminal__code
                 block
     
    +//- Chart.js
    +    id - [string] chart ID, will be assigned as #chart_{id}
    +
    +mixin chart(id)
    +    figure.o-block&attributes(attributes)
    +        canvas(id="chart_#{id}" width="800" height="400" style="max-width: 100%")
    +
     
     //- Gitter chat button and widget
         button - [string] text shown on button
    @@ -156,26 +160,24 @@ mixin terminal(label)
     mixin gitter(button, label)
         aside.js-gitter.c-chat.is-collapsed(data-title=(label || button))
     
    -    button.js-gitter-button.c-chat__button.u-text-small
    -        +icon("chat").o-icon--inline
    +    button.js-gitter-button.c-chat__button.u-text-tag
    +        +icon("chat", 16).o-icon--inline
             !=button
     
     
     //- Badge
    -    name - [string] "pipy" or "conda"
    +    image - [string] path to badge image
    +    url   - [string] badge link
     
    -mixin badge(name)
    -    - site = BADGES[name]
    -
    -    if site
    -        +a(site.link).u-padding-small
    -            img(src=site.badge alt="{name} version" height="20")
    +mixin badge(image, url)
    +    +a(url).u-padding-small.u-hide-link&attributes(attributes)
    +        img.o-badge(src=image alt=url height="20")
     
     
    -//- Logo
    +//- spaCy logo
     
     mixin logo()
    -    +svg("graphics", "spacy", 675, 215).o-logo&attributes(attributes)
    +    +svg("spacy", 675, 215).o-logo&attributes(attributes)
     
     
     //- Landing
    @@ -186,18 +188,56 @@ mixin landing-header()
                 .c-landing__content
                     block
     
    +mixin landing-banner(headline, label)
    +    .c-landing__banner.u-padding.o-block.u-color-light
    +        +grid.c-landing__banner__content.o-no-block
    +            +grid-col("third")
    +                h3.u-heading.u-heading-1
    +                    if label
    +                        div
    +                            span.u-text-label.u-text-label--light=label
    +                    !=headline
     
    -mixin landing-badge(url, graphic, alt, size)
    -    +a(url)(aria-label=alt title=alt).c-landing__badge
    -        +svg("graphics", graphic, size || 225)
    +            +grid-col("two-thirds").c-landing__banner__text
    +                block
    +
    +
    +mixin landing-logos(title, logos)
    +    .o-content.u-text-center&attributes(attributes)
    +        h3.u-heading.u-text-label.u-color-dark=title
    +
    +        each row, i in logos
    +            - var is_last = i == logos.length - 1
    +            +grid("center").o-inline-list.o-no-block(class=is_last ? "o-no-block" : null)
    +                each details, name in row
    +                    +a(details[0]).u-padding-medium
    +                        +icon(name, details[1], details[2])
    +
    +                if is_last
    +                    block
     
     
     //- Under construction (temporary)
         Marks sections that still need to be completed for the v2.0 release.
     
     mixin under-construction()
    -    +infobox("🚧 Under construction")
    +    +infobox("Under construction", "🚧")
             |  This section is still being written and will be updated for the v2.0
             |  release. Is there anything that you think should definitely mentioned or
             |  explained here? Any examples you'd like to see? #[strong Let us know]
             |  on the #[+a(gh("spacy") + "/issues/1105") v2.0 alpha thread] on GitHub!
    +
    +
    +//- Alpha infobox (temporary)
    +    Added in the templates to notify user that they're visiting the alpha site.
    +
    +mixin alpha-info()
    +    +infobox("You are viewing the spaCy v2.0.0 alpha docs", "⚠️")
    +        strong This page is part of the alpha documentation for spaCy v2.0.
    +        |  It does not reflect the state of the latest stable release.
    +        |  Because v2.0 is still under development, the implementation
    +        |  may differ from the intended state described here. See the
    +        |  #[+a(gh("spaCy") + "/releases/tag/v2.0.0-alpha") release notes]
    +        |  for details on how to install and test the new version. To
    +        |  read the official docs for spaCy v1.x,
    +        |  #[+a("https://spacy.io/docs") go here].
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index b140151b2..4876c6b6b 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -8,11 +8,15 @@ include _mixins-base
         level - [integer] headline level, corresponds to h1, h2, h3 etc.
         id    - [string] unique identifier, creates permalink (optional)
     
    -mixin h(level, id)
    -    +headline(level).u-heading&attributes(attributes)
    +mixin h(level, id, source)
    +    +headline(level).u-heading(id=id)&attributes(attributes)
             +permalink(id)
                 block
     
    +        if source
    +            +button(gh("spacy", source), false, "secondary", "small").u-nowrap.u-float-right
    +                span Source #[+icon("code", 14).o-icon--inline]
    +
     
     //- External links
         url     - [string] link href
    @@ -38,21 +42,23 @@ mixin src(url)
     
     
     //- API link (with added tag and automatically generated path)
    -    path - [string] path to API docs page relative to /docs/api/
    +    path - [string] path to API docs page relative to /api/
     
     mixin api(path)
    -    +a("/docs/api/" + path, true)(target="_self").u-no-border.u-inline-block.u-nowrap
    +    - path = convertAPIPath(path)
    +    +a("/api/" + path, true)(target="_self").u-no-border.u-inline-block.u-nowrap
             block
     
    -        |  #[+icon("book", 18).o-icon--inline.u-color-theme]
    +        |  #[+icon("book", 16).o-icon--inline.u-color-theme]
     
     
     //- Help icon with tooltip
    -    tooltip - [string] Tooltip text
    +    tooltip   - [string] Tooltip text
    +    icon_size - [integer] Optional size of help icon in px.
     
    -mixin help(tooltip)
    +mixin help(tooltip, icon_size)
         span(data-tooltip=tooltip)&attributes(attributes)
    -        +icon("help", 16).i-icon--inline
    +        +icon("help", icon_size || 16).o-icon--inline
     
     
     //- Aside for text
    @@ -68,24 +74,43 @@ mixin aside(label)
         label    - [string] aside title (optional or false for no label)
         language - [string] language for syntax highlighting (default: "python")
                    supports basic relevant languages available for PrismJS
    +    prompt   - [string] prompt displayed before first line, e.g. "$"
     
    -mixin aside-code(label, language)
    +mixin aside-code(label, language, prompt)
         +aside-wrapper(label)
    -        +code(false, language).o-no-block
    +        +code(false, language, prompt).o-no-block
                 block
     
     
     //- Infobox
         label - [string] infobox title (optional or false for no title)
    +    emoji - [string] optional emoji displayed before the title, necessary as
    +            argument to be able to wrap it for spacing
     
    -mixin infobox(label)
    +mixin infobox(label, emoji)
         aside.o-box.o-block.u-text-small
             if label
    -            h3.u-text-label.u-color-theme=label
    +            h3.u-heading.u-text-label.u-color-theme
    +                if emoji
    +                    span.o-emoji=emoji
    +                |  #{label}
     
             block
     
     
    +//- Logos displayed in the top corner of some infoboxes
    +    logos - [array] List of icon ID, width, height and link.
    +
    +mixin infobox-logos(...logos)
    +    .o-box__logos.u-text-right.u-float-right
    +        for logo in logos
    +            if logo[3]
    +                |  #[+a(logo[3]).u-inline-block.u-hide-link.u-padding-small #[+icon(logo[0], logo[1], logo[2]).u-color-dark]]
    +            else
    +                |  #[+icon(logo[0], logo[1], logo[2]).u-color-dark]
    +
    +
    +
     //- Link button
         url      - [string] link href
         trusted  - [boolean] if not set / false, rel="noopener nofollow" is added
    @@ -94,7 +119,7 @@ mixin infobox(label)
                    see assets/css/_components/_buttons.sass
     
     mixin button(url, trusted, ...style)
    -    - external = url.includes("http")
    +    - external = url && url.includes("http")
         a.c-button.u-text-label(href=url class=prefixArgs(style, "c-button") role="button" target=external ? "_blank" : null rel=external && !trusted ? "noopener nofollow" : null)&attributes(attributes)
             block
     
    @@ -103,31 +128,33 @@ mixin button(url, trusted, ...style)
         label    - [string] aside title (optional or false for no label)
         language - [string] language for syntax highlighting (default: "python")
                    supports basic relevant languages available for PrismJS
    -    prompt    - [string] prompt or icon to display next to code block, (mostly used for old/new)
    +    prompt   - [string] prompt displayed before first line, e.g. "$"
         height   - [integer] optional height to clip code block to
    +    icon     - [string] icon displayed next to code block (e.g. "accept" for new code)
    +    wrap     - [boolean] wrap text and disable horizontal scrolling
     
    -mixin code(label, language, prompt, height)
    +mixin code(label, language, prompt, height, icon, wrap)
         pre.c-code-block.o-block(class="lang-#{(language || DEFAULT_SYNTAX)}" class=icon ? "c-code-block--has-icon" : null style=height ? "height: #{height}px" : null)&attributes(attributes)
             if label
                 h4.u-text-label.u-text-label--dark=label
    -        - var icon = (prompt == 'accept' || prompt == 'reject')
    +        - var icon = icon || (prompt == 'accept' || prompt == 'reject')
             if icon
                 - var classes = {'accept': 'u-color-green', 'reject': 'u-color-red'}
                 .c-code-block__icon(class=classes[icon] || null class=classes[icon] ? "c-code-block__icon--border" : null)
                     +icon(icon, 18)
     
    -        code.c-code-block__content(data-prompt=icon ? null : prompt)
    +        code.c-code-block__content(class=wrap ? "u-wrap" : null data-prompt=icon ? null : prompt)
                 block
     
     
     //- Code blocks to display old/new versions
     
     mixin code-old()
    -    +code(false, false, "reject").o-block-small
    +    +code(false, false, false, false, "reject").o-block-small
             block
     
     mixin code-new()
    -    +code(false, false, "accept").o-block-small
    +    +code(false, false, false, false, "accept").o-block-small
             block
     
     
    @@ -138,12 +165,33 @@ mixin code-new()
     
     mixin codepen(slug, height, default_tab)
         figure.o-block(style="min-height: #{height}px")&attributes(attributes)
    -        .codepen(data-height=height data-theme-id="26467" data-slug-hash=slug data-default-tab=(default_tab || "result") data-embed-version="2" data-user=SOCIAL.codepen)
    +        .codepen(data-height=height data-theme-id="31335" data-slug-hash=slug data-default-tab=(default_tab || "result") data-embed-version="2" data-user=SOCIAL.codepen)
                 +a("https://codepen.io/" + SOCIAL.codepen + "/" + slug) View on CodePen
     
             script(async src="https://assets.codepen.io/assets/embed/ei.js")
     
     
    +//- GitHub embed
    +    repo     - [string] repository owned by explosion organization
    +    file     - [string] logical path to file, relative to repository root
    +    alt_file - [string] alternative file path used in footer and link button
    +    height   - [integer] height of code preview in px
    +
    +mixin github(repo, file, alt_file, height)
    +    - var branch = ALPHA ? "develop" : "master"
    +    - var height = height || 250
    +
    +    figure.o-block
    +        pre.c-code-block.o-block-small(class="lang-#{(language || DEFAULT_SYNTAX)}" style="height: #{height}px; min-height: #{height}px")
    +            code.c-code-block__content(data-gh-embed="#{repo}/#{branch}/#{file}")
    +
    +        footer.o-grid.u-text
    +            .o-block-small.u-flex-full #[+icon("github")] #[code=repo + '/' + (alt_file || file)]
    +            div
    +                +button(gh(repo, alt_file || file), false, "primary", "small") View on GitHub
    +
    +
    +
     //- Images / figures
         url     - [string] url or path to image
         width   - [integer] image width in px, for better rendering (default: 500)
    @@ -168,10 +216,26 @@ mixin image-caption()
             block
     
     
    -//- Label
    +//- Graphic or illustration with button
    +    original - [string] Path to original image
    +
    +mixin graphic(original)
    +    +image
    +        block
    +        if original
    +            .u-text-right
    +                +button(original, false, "secondary", "small") View large graphic
    +
    +
    +//- Labels
     
     mixin label()
    -    .u-text-label.u-color-subtle&attributes(attributes)
    +    .u-text-label.u-color-dark&attributes(attributes)
    +        block
    +
    +
    +mixin label-inline()
    +    strong.u-text-label.u-color-dark&attributes(attributes)
             block
     
     
    @@ -188,8 +252,10 @@ mixin tag()
     mixin tag-model(...capabs)
         - var intro = "To use this functionality, spaCy needs a model to be installed"
         - var ext = capabs.length ? " that supports the following capabilities: " + capabs.join(', ') : ""
    -    +tag Requires model
    -    +help(intro + ext + ".").u-color-theme
    +
    +    span.u-nowrap
    +        +tag Needs model
    +        +help(intro + ext + ".").u-color-theme
     
     
     //- "New" tag to label features new in a specific version
    @@ -219,15 +285,9 @@ mixin list(type, start)
     
     //- List item (only used within +list)
     
    -mixin item(procon)
    -    if procon
    -        li&attributes(attributes)
    -            +procon(procon).c-list__icon
    -            block
    -
    -    else
    -        li.c-list__item&attributes(attributes)
    -            block
    +mixin item()
    +    li.c-list__item&attributes(attributes)
    +        block
     
     
     //- Table
    @@ -237,9 +297,9 @@ mixin table(head)
         table.c-table.o-block&attributes(attributes)
     
             if head
    -            +row
    +            +row("head")
                     each column in head
    -                    th.c-table__head-cell.u-text-label=column
    +                    +head-cell=column
     
             block
     
    @@ -251,10 +311,11 @@ mixin row(...style)
             block
     
     
    -//- Footer table row (only ued within +table)
     
    -mixin footrow()
    -    tr.c-table__row.c-table__row--foot&attributes(attributes)
    +//- Header table cell (only used within +row)
    +
    +mixin head-cell()
    +    th.c-table__head-cell.u-text-label&attributes(attributes)
             block
     
     
    @@ -284,71 +345,58 @@ mixin grid-col(width)
     
     
     //- Card (only used within +grid)
    -    title     - [string] card title
    -    details   - [object] url, image, author, description, tags etc.
    -                (see /docs/usage/_data.json)
    +    title  - [string] card title
    +    url    - [string] link for card
    +    author - [string] optional author, displayed as byline at the bottom
    +    icon   - [string] optional ID of icon displayed with card
    +    width  - [string] optional width of grid column, defaults to "half"
     
    -mixin card(title, details)
    -    +grid-col("half").o-card.u-text&attributes(attributes)
    -        if details.image
    -            +a(details.url).o-block-small
    -                img(src=details.image alt=title width="300" role="presentation")
    -
    -        if title
    -            +a(details.url)
    -                +h(3)=title
    -
    -                    if details.author
    -                        .u-text-small.u-color-subtle by #{details.author}
    -
    -        if details.description || details.tags
    -            ul
    -                if details.description
    -                    li=details.description
    -
    -                if details.tags
    -                    li
    -                        each tag in details.tags
    -                            span.u-text-tag #{tag}
    -                            |  
    -
    -        block
    +mixin card(title, url, author, icon, width)
    +    +grid-col(width || "half").o-box.o-grid.o-grid--space.u-text&attributes(attributes)
    +        +a(url)
    +            h4.u-heading.u-text-label
    +                if icon
    +                    +icon(icon, 25).u-float-right
    +                if title
    +                    span.u-color-dark=title
    +            .o-block-small.u-text-small
    +                block
    +        if author
    +            .u-color-subtle.u-text-tiny by #{author}
     
     
    -//- Simpler card list item (only used within +list)
    -    title     - [string] card title
    -    details   - [object] url, image, author, description, tags etc.
    -                (see /docs/usage/_data.json)
    +//- Table of contents, to be used with +item mixins for links
    +    col - [string] width of column (see +grid-col)
     
    -mixin card-item(title, details)
    -    +item&attributes(attributes)
    -        +a(details.url)=title
    -
    -        if details.description
    -            br
    -            span=details.description
    -
    -        if details.author
    -            br
    -            span.u-text-small.u-color-subtle by #{details.author}
    +mixin table-of-contents(col)
    +    +grid-col(col || "half")
    +        +infobox
    +            +label.o-block-small Table of contents
    +            +list("numbers").u-text-small.o-no-block
    +                block
     
     
    -//- Table row for models table
    +//- Bibliography
    +    id - [string] ID of bibliography component, for anchor links. Can be used if
    +         there's more than one bibliography on one page.
     
    -mixin model-row(name, lang, procon, size, license, default_model, divider)
    -    - var licenses = { "CC BY-SA": "https://creativecommons.org/licenses/by-sa/3.0/", "CC BY-NC": "https://creativecommons.org/licenses/by-nc/3.0/" }
    +mixin bibliography(id)
    +    section(id=id || "bibliography")
    +        +infobox
    +            +label.o-block-small Bibliography
    +            +list("numbers").u-text-small.o-no-block
    +                block
     
    -    +row(divider ? "divider": null)
    -        +cell #[code=name]
    -            if default_model
    -                |  #[span.u-color-theme(title="default model") #[+icon("star", 16)]]
    -        +cell=lang
    -        each icon in procon
    -            +cell.u-text-center #[+procon(icon ? "pro" : "con")]
    -        +cell.u-text-right=size
    -        +cell
    -            if license in licenses
    -                +a(licenses[license])=license
    +
    +//- Footnote
    +    id      - [string / integer] ID of footnote.
    +    bib_id  - [string] ID of bibliography component, defaults to "bibliography".
    +    tooltip - [string] optional text displayed as tooltip
    +
    +mixin fn(id, bib_id, tooltip)
    +    sup.u-padding-small(id="bib" + id data-tooltip=tooltip)
    +        span.u-text-tag
    +            +a("#" + (bib_id || "bibliography")).u-hide-link #{id}
     
     
     //- Table rows for annotation specs
    @@ -383,14 +431,3 @@ mixin annotation-row(annots, style)
                 else
                     +cell=cell
             block
    -
    -
    -//- Table of contents, to be used with +item mixins for links
    -    col - [string] width of column (see +grid-col)
    -
    -mixin table-of-contents(col)
    -    +grid-col(col || "half")
    -        +infobox
    -            +label.o-block-small Table of contents
    -            +list("numbers").u-text-small.o-no-block
    -                block
    diff --git a/website/_includes/_navigation.jade b/website/_includes/_navigation.jade
    index f113ca3f4..c7f2c956f 100644
    --- a/website/_includes/_navigation.jade
    +++ b/website/_includes/_navigation.jade
    @@ -1,19 +1,15 @@
     //- 💫 INCLUDES > TOP NAVIGATION
     
    -include _mixins
    -
     nav.c-nav.u-text.js-nav(class=landing ? "c-nav--theme" : null)
    -    a(href='/') #[+logo]
    -
    -    if SUBSECTION != "index"
    -        .u-text-label.u-padding-small.u-hidden-xs=SUBSECTION
    +    a(href="/" aria-label=SITENAME) #[+logo]
     
         ul.c-nav__menu
    -        - var NAV = ALPHA ? { "Usage": "/docs/usage", "Reference": "/docs/api" } : NAVIGATION
    -
    -        each url, item in NAV
    -            li.c-nav__menu__item(class=(url == "/") ? "u-hidden-xs" : null)
    +        - var current_url = '/' + current.path[0]
    +        each url, item in NAVIGATION
    +            li.c-nav__menu__item(class=(current_url == url) ? "is-active" : null)
                     +a(url)=item
     
    -        li.c-nav__menu__item
    -            +a(gh("spaCy"))(aria-label="GitHub").u-hidden-xs #[+icon("github", 20)]
    +        li.c-nav__menu__item.u-hidden-xs
    +            +a(gh("spaCy"))(aria-label="GitHub") #[+icon("github", 20)]
    +
    +    progress.c-progress.js-progress(value="0" max="1")
    diff --git a/website/_includes/_newsletter.jade b/website/_includes/_newsletter.jade
    index 9bfe88d39..ca8333f86 100644
    --- a/website/_includes/_newsletter.jade
    +++ b/website/_includes/_newsletter.jade
    @@ -1,6 +1,6 @@
     //- 💫 INCLUDES > NEWSLETTER
     
    -ul.o-block
    +ul.o-block-small
         li.u-text-label.u-color-subtle Stay in the loop!
         li Receive updates about new releases, tutorials and more.
     
    @@ -10,7 +10,6 @@ form.o-grid#mc-embedded-subscribe-form(action="//#{MAILCHIMP.user}.list-manage.c
         div(style="position: absolute; left: -5000px;" aria-hidden="true")
             input(type="text" name="b_#{MAILCHIMP.id}_#{MAILCHIMP.list}" tabindex="-1" value="")
     
    -    .o-grid-col.u-border.u-padding-small
    -        input#mce-EMAIL.u-text(type="email" name="EMAIL" placeholder="Your email")
    -
    -        button#mc-embedded-subscribe.u-text-label.u-color-theme(type="submit" name="subscribe") Sign up
    +    .o-grid-col.o-grid.o-grid--nowrap.o-field.u-padding-small
    +        input#mce-EMAIL.o-field__input.u-text(type="email" name="EMAIL" placeholder="Your email" aria-label="Your email")
    +        button#mc-embedded-subscribe.o-field__button.u-text-label.u-color-theme.u-nowrap(type="submit" name="subscribe") Sign up
    diff --git a/website/_includes/_page-docs.jade b/website/_includes/_page-docs.jade
    index 7afbc6bdc..703102487 100644
    --- a/website/_includes/_page-docs.jade
    +++ b/website/_includes/_page-docs.jade
    @@ -1,47 +1,56 @@
     //- 💫 INCLUDES > DOCS PAGE TEMPLATE
     
    -- sidebar_content = (SUBSECTION != "index") ? public.docs[SUBSECTION]._data.sidebar : public.docs._data.sidebar || FOOTER
    +- sidebar_content = (public[SECTION] ? public[SECTION]._data.sidebar : public._data[SECTION] ? public._data[SECTION].sidebar : false) || FOOTER
     
     include _sidebar
     
     main.o-main.o-main--sidebar.o-main--aside
         article.o-content
             +grid.o-no-block
    -            +grid-col(source ? "two-thirds" : "full")
    -                +h(1)=title
    -                    if tag
    -                        +tag=tag
    +            +h(1).u-heading--title=title.replace("'", "’")
    +                if tag
    +                    +tag=tag
    +                if tag_new
    +                    +tag-new(tag_new)
    +
    +                if teaser
    +                    .u-heading__teaser.u-text-small.u-color-dark=teaser
    +                else if IS_MODELS
    +                    .u-heading__teaser.u-text-small.u-color-dark
    +                        |  Available statistical models for
    +                        |  #[code=current.source] (#{LANGUAGES[current.source]}).
     
                 if source
    -                +grid-col("third").u-text-right
    -                    .o-inline-list
    -                        +button(gh("spacy", source), false, "secondary").u-text-tag Source #[+icon("code", 14)]
    +                .o-block.u-text-right
    +                    +button(gh("spacy", source), false, "secondary", "small").u-nowrap
    +                        |  Source #[+icon("code", 14)]
     
    +        //-if ALPHA
    +        //-    +alpha-info
     
    -        if ALPHA
    -            +infobox("⚠️ You are viewing the spaCy v2.0.0 alpha docs")
    -                strong This page is part of the alpha documentation for spaCy v2.0.
    -                |  It does not reflect the state of the latest stable release.
    -                |  Because v2.0 is still under development, the implementation
    -                |  may differ from the intended state described here. See the
    -                |  #[+a(gh("spaCy") + "/releases/tag/v2.0.0-alpha") release notes]
    -                |  for details on how to install and test the new version. To
    -                |  read the official docs for spaCy v1.x,
    -                |  #[+a("https://spacy.io/docs") go here].
    -
    -        !=yield
    +        if IS_MODELS
    +            include _page_models
    +        else
    +            !=yield
     
         +grid.o-content.u-text
             +grid-col("half")
    -            if next && public.docs[SUBSECTION]._data[next]
    -                - data = public.docs[SUBSECTION]._data[next]
    -
    +            if !IS_MODELS
                     .o-inline-list
    -                    span #[strong.u-text-label Read next:] #[+a(next).u-link=data.title]
    +                    +button(gh("spacy", "website/" + current.path.join('/') + ".jade"), false, "secondary", "small")
    +                        |  #[span.o-icon Suggest edits] #[+icon("code", 14)]
     
             +grid-col("half").u-text-right
    -            .o-inline-list
    -                +button(gh("spacy", "website/" + current.path.join('/') + ".jade"), false, "secondary").u-text-tag Suggest edits #[+icon("code", 14)]
    +            if next && public[SECTION]._data[next]
    +                - data = public[SECTION]._data[next]
    +
    +                +grid("vcenter")
    +                    +a(next).u-text-small.u-flex-full
    +                        h4.u-text-label.u-color-dark Read next
    +                        |  #{data.title}
    +
    +                    +a(next).c-icon-button.c-icon-button--right(aria-hidden="true")
    +                        +icon("arrow-right", 24)
     
         +gitter("spaCy chat")
     
    diff --git a/website/_includes/_page_models.jade b/website/_includes/_page_models.jade
    new file mode 100644
    index 000000000..6370f1b94
    --- /dev/null
    +++ b/website/_includes/_page_models.jade
    @@ -0,0 +1,77 @@
    +//- 💫 INCLUDES > MODELS PAGE TEMPLATE
    +
    +for id in CURRENT_MODELS
    +    +section(id)
    +        +grid("vcenter").o-no-block(id=id)
    +            +grid-col("two-thirds")
    +                +h(2)
    +                    +a("#" + id).u-permalink=id
    +
    +            +grid-col("third").u-text-right
    +                .u-color-subtle.u-text-tiny
    +                    +button(gh("spacy-models") + "/releases", true, "secondary", "small")(data-tpl=id data-tpl-key="download")
    +                        |  Release details
    +                    .u-padding-small Latest: #[code(data-tpl=id data-tpl-key="version") n/a]
    +
    +        +aside-code("Installation", "bash", "$").
    +            spacy download #{id}
    +
    +        - var comps = getModelComponents(id)
    +
    +        p(data-tpl=id data-tpl-key="description")
    +
    +        div(data-tpl=id data-tpl-key="error" style="display: none")
    +            +infobox
    +                |  Unable to load model details from GitHub. To find out more
    +                |  about this model, see the overview of the
    +                |  #[+a(gh("spacy-models") + "/releases") latest model releases].
    +
    +        +table(data-tpl=id data-tpl-key="table")
    +            +row
    +                +cell #[+label Language]
    +                +cell #[+tag=comps.lang] #{LANGUAGES[comps.lang]}
    +            for comp, label in {"Type": comps.type, "Genre": comps.genre}
    +                +row
    +                    +cell #[+label=label]
    +                    +cell #[+tag=comp] #{MODEL_META[comp]}
    +            +row
    +                +cell #[+label Size]
    +                +cell #[+tag=comps.size] #[span(data-tpl=id data-tpl-key="size") #[em n/a]]
    +
    +            each label in ["Pipeline", "Sources", "Author", "License"]
    +                - var field = label.toLowerCase()
    +                +row
    +                    +cell.u-nowrap
    +                        +label=label
    +                            if MODEL_META[field]
    +                                |  #[+help(MODEL_META[field]).u-color-subtle]
    +                    +cell
    +                        span(data-tpl=id data-tpl-key=field) #[em n/a]
    +
    +            +row(data-tpl=id data-tpl-key="compat-wrapper" style="display: none")
    +                +cell
    +                    +label Compat #[+help("Latest compatible model version for your spaCy installation").u-color-subtle]
    +                +cell
    +                    .o-field.u-float-left
    +                        select.o-field__select.u-text-small(data-tpl=id data-tpl-key="compat")
    +                    .o-empty(data-tpl=id data-tpl-key="compat-versions")  
    +
    +        section(data-tpl=id data-tpl-key="accuracy-wrapper" style="display: none")
    +            +grid.o-no-block
    +                +grid-col("third")
    +                    +h(4) Accuracy
    +                    +table.o-no-block
    +                        for label, field in MODEL_ACCURACY
    +                            +row(style="display: none")
    +                                +cell.u-nowrap
    +                                    +label=label
    +                                        if MODEL_META[field]
    +                                            |  #[+help(MODEL_META[field]).u-color-subtle]
    +                                +cell.u-text-right(data-tpl=id data-tpl-key=field)
    +                                    |  n/a
    +
    +                +grid-col("two-thirds")
    +                    +h(4) Comparison
    +                    +chart(id).u-padding-small
    +
    +        p.u-text-small.u-color-dark(data-tpl=id data-tpl-key="notes")
    diff --git a/website/_includes/_sidebar.jade b/website/_includes/_sidebar.jade
    index 241a77132..1bca2cb80 100644
    --- a/website/_includes/_sidebar.jade
    +++ b/website/_includes/_sidebar.jade
    @@ -1,13 +1,23 @@
     //- 💫 INCLUDES > SIDEBAR
     
    -include _mixins
    -
     menu.c-sidebar.js-sidebar.u-text
         if sidebar_content
    -        each items, menu in sidebar_content
    -            ul.c-sidebar__section.o-block
    -                li.u-text-label.u-color-subtle=menu
    +        each items, sectiontitle in sidebar_content
    +            ul.c-sidebar__section.o-block-small
    +                li.u-text-label.u-color-dark=sectiontitle
     
                     each url, item in items
    -                    li(class=(CURRENT == url || (CURRENT == "index" && url == "./")) ? "is-active" : null)
    -                        +a(url)=item
    +                    - var is_current = CURRENT == url || (CURRENT == "index" && url == "./")
    +                    li.c-sidebar__item
    +                        +a(url)(class=is_current ? "is-active" : null)=item
    +
    +                        if is_current
    +                            if IS_MODELS && CURRENT_MODELS.length
    +                                - menu = Object.assign({}, ...CURRENT_MODELS.map(id => ({ [id]: id })))
    +                            if menu
    +                                ul.c-sidebar__crumb.u-hidden-sm
    +                                    - var counter = 0
    +                                    for id, title in menu
    +                                        - counter++
    +                                        li.c-sidebar__crumb__item(data-nav=id class=(counter == 1) ? "is-active" : null)
    +                                            +a("#section-" + id)=title
    diff --git a/website/_layout.jade b/website/_layout.jade
    index b198c8333..31c6ce6c3 100644
    --- a/website/_layout.jade
    +++ b/website/_layout.jade
    @@ -2,11 +2,15 @@
     
     include _includes/_mixins
     
    +- title = IS_MODELS ? LANGUAGES[current.source] || title : title
    +- social_img = SITE_URL + "/assets/img/social/preview_" + (preview || ALPHA ? "alpha" : "default") + ".jpg"
    +
     doctype html
     html(lang="en")
         title
    -        if SECTION == "docs" && SUBSECTION && SUBSECTION != "index"
    -            | #{title} | #{SITENAME} #{SUBSECTION == "api" ? "API" : "Usage"} Documentation
    +        if SECTION == "api" || SECTION == "usage" || SECTION == "models"
    +            - var title_section = (SECTION == "api") ? "API" : SECTION.charAt(0).toUpperCase() + SECTION.slice(1)
    +            | #{title} | #{SITENAME} #{title_section} Documentation
     
             else if SECTION != "index"
                 | #{title} | #{SITENAME}
    @@ -24,23 +28,20 @@ html(lang="en")
         meta(property="og:url" content="#{SITE_URL}/#{current.path.join('/')}")
         meta(property="og:title" content="#{title} - spaCy")
         meta(property="og:description" content=description)
    -    meta(property="og:image" content=getSocialImg())
    +    meta(property="og:image" content=social_img)
     
         meta(name="twitter:card" content="summary_large_image")
         meta(name="twitter:site" content="@" + SOCIAL.twitter)
         meta(name="twitter:title" content="#{title} - spaCy")
         meta(name="twitter:description" content=description)
    -    meta(name="twitter:image" content=getSocialImg())
    +    meta(name="twitter:image" content=social_img)
     
         link(rel="shortcut icon" href="/assets/img/favicon.ico")
         link(rel="icon" type="image/x-icon" href="/assets/img/favicon.ico")
     
    -    if ALPHA && SECTION == "docs"
    +    if SECTION == "api"
             link(href="/assets/css/style_green.css?v#{V_CSS}" rel="stylesheet")
     
    -    else if SUBSECTION == "usage"
    -        link(href="/assets/css/style_red.css?v#{V_CSS}" rel="stylesheet")
    -
         else
             link(href="/assets/css/style.css?v#{V_CSS}" rel="stylesheet")
     
    @@ -48,7 +49,7 @@ html(lang="en")
             include _includes/_svg
             include _includes/_navigation
     
    -        if SECTION == "docs"
    +        if !landing
                 include _includes/_page-docs
     
             else
    
    From 3f4fd2c5d5d61d9a939a563ff3747b57fba6ef25 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:26:20 +0200
    Subject: [PATCH 171/649] Update usage documentation
    
    ---
     website/docs/_data.json                       |  28 -
     website/docs/index.jade                       |  25 -
     website/docs/usage/_data.json                 | 420 --------------
     website/docs/usage/_models-list.jade          |  24 -
     website/docs/usage/deep-learning.jade         |  92 ---
     website/docs/usage/index.jade                 | 353 ------------
     website/docs/usage/production-use.jade        | 147 -----
     website/docs/usage/showcase.jade              |  44 --
     website/docs/usage/spacy-101.jade             | 430 --------------
     website/docs/usage/text-classification.jade   |   5 -
     website/docs/usage/training-ner.jade          | 114 ----
     website/docs/usage/tutorials.jade             |  38 --
     website/docs/usage/v2.jade                    | 531 ------------------
     .../_adding-languages/_language-data.jade}    | 354 +++---------
     website/usage/_adding-languages/_testing.jade |  76 +++
     .../usage/_adding-languages/_training.jade    |  93 +++
     website/usage/_data.json                      | 195 +++++++
     website/usage/_deep-learning/_dynet.jade      |  11 +
     .../usage/_deep-learning/_pre-processing.jade |   3 +
     website/usage/_deep-learning/_pytorch.jade    |  91 +++
     .../usage/_deep-learning/_scikit-learn.jade   |  15 +
     .../_deep-learning/_tensorflow-keras.jade     |  11 +
     website/usage/_deep-learning/_thinc.jade      |  66 +++
     .../_facts-figures/_benchmarks-choi-2015.jade |  45 ++
     .../_facts-figures/_benchmarks-models.jade    |  48 ++
     website/usage/_facts-figures/_benchmarks.jade | 206 +++++++
     .../_facts-figures/_feature-comparison.jade   |  58 ++
     .../_facts-figures/_other-libraries.jade      |  70 +++
     website/usage/_install/_changelog.jade        |  31 +
     website/usage/_install/_instructions.jade     | 185 ++++++
     website/usage/_install/_quickstart.jade       |  26 +
     website/usage/_install/_troubleshooting.jade  | 147 +++++
     .../_dependency-parse.jade}                   |  25 +-
     .../_named-entities.jade}                     |  78 +--
     .../_linguistic-features/_pos-tagging.jade}   |  26 +-
     .../_rule-based-matching.jade}                |  29 +-
     .../_linguistic-features/_tokenization.jade}  |  95 +++-
     website/usage/_models/_available-models.jade  |  22 +
     website/usage/_models/_install-basics.jade    |  33 ++
     .../_models/_install.jade}                    |  87 +--
     website/usage/_models/_production.jade        |  81 +++
     website/usage/_models/_quickstart.jade        |  17 +
     .../_processing-pipelines/_examples.jade      | 126 +++++
     .../_multithreading.jade                      |  40 ++
     .../_processing-pipelines/_pipelines.jade}    | 198 ++-----
     .../_processing-pipelines/_serialization.jade |  38 ++
     .../_processing-pipelines/_user-hooks.jade    |  61 ++
     .../usage/_spacy-101/_architecture.jade       | 116 ++--
     website/usage/_spacy-101/_community-faq.jade  | 141 +++++
     .../usage/_spacy-101/_language-data.jade      |  30 +-
     .../_spacy-101/_lightning-tour.jade}          |  56 +-
     .../usage/_spacy-101/_named-entities.jade     |   4 +-
     .../usage/_spacy-101/_pipelines.jade          |  16 +-
     .../usage/_spacy-101/_pos-deps.jade           |   4 +-
     .../usage/_spacy-101/_serialization.jade      |   0
     .../usage/_spacy-101/_similarity.jade         |   0
     .../usage/_spacy-101/_tokenization.jade       |   8 +-
     .../usage/_spacy-101/_training.jade           |   6 +-
     .../{docs => }/usage/_spacy-101/_vocab.jade   |   6 +-
     .../usage/_spacy-101/_word-vectors.jade       |   4 +-
     .../_training/_basics.jade}                   |  34 +-
     website/usage/_training/_ner.jade             |  61 ++
     .../_training/_saving-loading.jade}           |  90 ++-
     website/usage/_training/_similarity.jade      |   3 +
     website/usage/_training/_tagger-parser.jade   |   3 +
     website/usage/_training/_textcat.jade         |  13 +
     .../usage/_vectors-similarity/_basics.jade    |  15 +
     .../usage/_vectors-similarity/_custom.jade    |  91 +++
     website/usage/_vectors-similarity/_gpu.jade   |  30 +
     .../_vectors-similarity/_in-context.jade}     |  45 +-
     website/usage/adding-languages.jade           |  59 ++
     website/usage/deep-learning.jade              |  29 +
     website/usage/examples.jade                   |  73 +++
     website/usage/facts-figures.jade              |  32 ++
     website/usage/index.jade                      |  27 +
     website/usage/linguistic-features.jade        |  38 ++
     website/usage/models.jade                     |  37 ++
     website/usage/processing-pipelines.jade       |  25 +
     website/usage/resources.jade                  | 125 +++++
     website/usage/spacy-101.jade                  | 300 ++++++++++
     website/usage/text-classification.jade        |   9 +
     website/usage/training.jade                   |  33 ++
     website/usage/v2.jade                         | 520 +++++++++++++++++
     website/usage/vectors-similarity.jade         |  18 +
     website/{docs => }/usage/visualizers.jade     |  10 +-
     85 files changed, 3906 insertions(+), 3143 deletions(-)
     delete mode 100644 website/docs/_data.json
     delete mode 100644 website/docs/index.jade
     delete mode 100644 website/docs/usage/_data.json
     delete mode 100644 website/docs/usage/_models-list.jade
     delete mode 100644 website/docs/usage/deep-learning.jade
     delete mode 100644 website/docs/usage/index.jade
     delete mode 100644 website/docs/usage/production-use.jade
     delete mode 100644 website/docs/usage/showcase.jade
     delete mode 100644 website/docs/usage/spacy-101.jade
     delete mode 100644 website/docs/usage/text-classification.jade
     delete mode 100644 website/docs/usage/training-ner.jade
     delete mode 100644 website/docs/usage/tutorials.jade
     delete mode 100644 website/docs/usage/v2.jade
     rename website/{docs/usage/adding-languages.jade => usage/_adding-languages/_language-data.jade} (62%)
     create mode 100644 website/usage/_adding-languages/_testing.jade
     create mode 100644 website/usage/_adding-languages/_training.jade
     create mode 100644 website/usage/_data.json
     create mode 100644 website/usage/_deep-learning/_dynet.jade
     create mode 100644 website/usage/_deep-learning/_pre-processing.jade
     create mode 100644 website/usage/_deep-learning/_pytorch.jade
     create mode 100644 website/usage/_deep-learning/_scikit-learn.jade
     create mode 100644 website/usage/_deep-learning/_tensorflow-keras.jade
     create mode 100644 website/usage/_deep-learning/_thinc.jade
     create mode 100644 website/usage/_facts-figures/_benchmarks-choi-2015.jade
     create mode 100644 website/usage/_facts-figures/_benchmarks-models.jade
     create mode 100644 website/usage/_facts-figures/_benchmarks.jade
     create mode 100644 website/usage/_facts-figures/_feature-comparison.jade
     create mode 100644 website/usage/_facts-figures/_other-libraries.jade
     create mode 100644 website/usage/_install/_changelog.jade
     create mode 100644 website/usage/_install/_instructions.jade
     create mode 100644 website/usage/_install/_quickstart.jade
     create mode 100644 website/usage/_install/_troubleshooting.jade
     rename website/{docs/usage/dependency-parse.jade => usage/_linguistic-features/_dependency-parse.jade} (93%)
     rename website/{docs/usage/entity-recognition.jade => usage/_linguistic-features/_named-entities.jade} (74%)
     rename website/{docs/usage/pos-tagging.jade => usage/_linguistic-features/_pos-tagging.jade} (76%)
     rename website/{docs/usage/rule-based-matching.jade => usage/_linguistic-features/_rule-based-matching.jade} (95%)
     rename website/{docs/usage/customizing-tokenizer.jade => usage/_linguistic-features/_tokenization.jade} (76%)
     create mode 100644 website/usage/_models/_available-models.jade
     create mode 100644 website/usage/_models/_install-basics.jade
     rename website/{docs/usage/models.jade => usage/_models/_install.jade} (67%)
     create mode 100644 website/usage/_models/_production.jade
     create mode 100644 website/usage/_models/_quickstart.jade
     create mode 100644 website/usage/_processing-pipelines/_examples.jade
     create mode 100644 website/usage/_processing-pipelines/_multithreading.jade
     rename website/{docs/usage/language-processing-pipeline.jade => usage/_processing-pipelines/_pipelines.jade} (56%)
     create mode 100644 website/usage/_processing-pipelines/_serialization.jade
     create mode 100644 website/usage/_processing-pipelines/_user-hooks.jade
     rename website/{docs => }/usage/_spacy-101/_architecture.jade (83%)
     create mode 100644 website/usage/_spacy-101/_community-faq.jade
     rename website/{docs => }/usage/_spacy-101/_language-data.jade (86%)
     rename website/{docs/usage/lightning-tour.jade => usage/_spacy-101/_lightning-tour.jade} (82%)
     rename website/{docs => }/usage/_spacy-101/_named-entities.jade (90%)
     rename website/{docs => }/usage/_spacy-101/_pipelines.jade (89%)
     rename website/{docs => }/usage/_spacy-101/_pos-deps.jade (95%)
     rename website/{docs => }/usage/_spacy-101/_serialization.jade (100%)
     rename website/{docs => }/usage/_spacy-101/_similarity.jade (100%)
     rename website/{docs => }/usage/_spacy-101/_tokenization.jade (90%)
     rename website/{docs => }/usage/_spacy-101/_training.jade (94%)
     rename website/{docs => }/usage/_spacy-101/_vocab.jade (96%)
     rename website/{docs => }/usage/_spacy-101/_word-vectors.jade (98%)
     rename website/{docs/usage/training.jade => usage/_training/_basics.jade} (89%)
     create mode 100644 website/usage/_training/_ner.jade
     rename website/{docs/usage/saving-loading.jade => usage/_training/_saving-loading.jade} (70%)
     create mode 100644 website/usage/_training/_similarity.jade
     create mode 100644 website/usage/_training/_tagger-parser.jade
     create mode 100644 website/usage/_training/_textcat.jade
     create mode 100644 website/usage/_vectors-similarity/_basics.jade
     create mode 100644 website/usage/_vectors-similarity/_custom.jade
     create mode 100644 website/usage/_vectors-similarity/_gpu.jade
     rename website/{docs/usage/word-vectors-similarities.jade => usage/_vectors-similarity/_in-context.jade} (72%)
     create mode 100644 website/usage/adding-languages.jade
     create mode 100644 website/usage/deep-learning.jade
     create mode 100644 website/usage/examples.jade
     create mode 100644 website/usage/facts-figures.jade
     create mode 100644 website/usage/index.jade
     create mode 100644 website/usage/linguistic-features.jade
     create mode 100644 website/usage/models.jade
     create mode 100644 website/usage/processing-pipelines.jade
     create mode 100644 website/usage/resources.jade
     create mode 100644 website/usage/spacy-101.jade
     create mode 100644 website/usage/text-classification.jade
     create mode 100644 website/usage/training.jade
     create mode 100644 website/usage/v2.jade
     create mode 100644 website/usage/vectors-similarity.jade
     rename website/{docs => }/usage/visualizers.jade (97%)
    
    diff --git a/website/docs/_data.json b/website/docs/_data.json
    deleted file mode 100644
    index bc33ebc4c..000000000
    --- a/website/docs/_data.json
    +++ /dev/null
    @@ -1,28 +0,0 @@
    -{
    -    "index": {
    -        "title" : "Documentation",
    -
    -        "sections": {
    -            "Usage": {
    -                "url": "/docs/usage",
    -                "svg": "computer",
    -                "description": "How to use spaCy and its features."
    -            },
    -            "API": {
    -                "url": "/docs/api",
    -                "svg": "brain",
    -                "description": "The detailed reference for spaCy's API."
    -            },
    -            "Tutorials": {
    -                "url": "/docs/usage/tutorials",
    -                "svg": "eye",
    -                "description": "End-to-end examples, with code you can modify and run."
    -            },
    -            "Showcase & Demos": {
    -                "url": "/docs/usage/showcase",
    -                "svg": "bubble",
    -                "description": "Demos, libraries and products from the spaCy community."
    -            }
    -        }
    -    }
    -}
    diff --git a/website/docs/index.jade b/website/docs/index.jade
    deleted file mode 100644
    index d5a8c6deb..000000000
    --- a/website/docs/index.jade
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -//- 💫 DOCS
    -
    -include ../_includes/_mixins
    -
    -+aside("Help us improve the docs")
    -    |  Did you spot a mistake or come across explanations that
    -    |  are unclear? You can find a "Suggest edits" button at the
    -    |  bottom of each page that points you to the source.
    -    |  We always appreciate
    -    |  #[+a(gh("spaCy") + "/pulls") pull requests].#[br]#[br]
    -    |  Have you built something cool with spaCy, or did you
    -    |  write a tutorial to help others use spaCy?
    -    |  #[a(href="mailto:#{EMAIL}") Let us know!]
    -
    -+grid
    -    each details, title in sections
    -        +card(false, false)
    -            a(href=details.url)
    -                +svg("graphics", details.svg, 300, 150).u-color-theme
    -
    -            a(href=details.url)
    -                +h(3)=title
    -
    -            p=details.description
    -            +button(details.url, true, "primary")(target="_self") View
    diff --git a/website/docs/usage/_data.json b/website/docs/usage/_data.json
    deleted file mode 100644
    index c8373a095..000000000
    --- a/website/docs/usage/_data.json
    +++ /dev/null
    @@ -1,420 +0,0 @@
    -{
    -    "sidebar": {
    -        "Get started": {
    -            "Installation": "./",
    -            "Models": "models",
    -            "spaCy 101": "spacy-101",
    -            "Lightning tour": "lightning-tour",
    -            "What's new in v2.0": "v2"
    -        },
    -        "Guides": {
    -            "POS tagging": "pos-tagging",
    -            "Using the parse": "dependency-parse",
    -            "Entity recognition": "entity-recognition",
    -            "Vectors & similarity": "word-vectors-similarities",
    -            "Custom tokenization": "customizing-tokenizer",
    -            "Rule-based matching": "rule-based-matching",
    -            "Adding languages": "adding-languages",
    -            "Processing pipelines": "language-processing-pipeline",
    -            "Text classification": "text-classification",
    -            "Deep learning": "deep-learning",
    -            "Production use": "production-use",
    -            "Training": "training",
    -            "Training NER": "training-ner",
    -            "Saving & loading": "saving-loading",
    -            "Visualizers": "visualizers"
    -        },
    -        "Examples": {
    -            "Tutorials": "tutorials",
    -            "Showcase": "showcase"
    -        }
    -    },
    -
    -    "index": {
    -        "title": "Install spaCy",
    -        "next": "models",
    -        "quickstart": true
    -    },
    -
    -    "models": {
    -        "title": "Models",
    -        "next": "spacy-101",
    -        "quickstart": true
    -    },
    -
    -    "spacy-101": {
    -        "title": "spaCy 101 – Everything you need to know",
    -        "next": "lightning-tour",
    -        "quickstart": true,
    -        "preview": "101"
    -    },
    -
    -    "lightning-tour": {
    -        "title": "Lightning tour",
    -        "next": "v2"
    -    },
    -
    -    "visualizers": {
    -        "title": "Visualizers"
    -    },
    -
    -    "v2": {
    -        "title": "What's new in v2.0"
    -    },
    -
    -    "pos-tagging": {
    -        "title": "Part-of-speech tagging",
    -        "next": "dependency-parse"
    -    },
    -
    -    "dependency-parse": {
    -        "title": "Using the dependency parse",
    -        "next": "entity-recognition"
    -    },
    -
    -    "entity-recognition": {
    -        "title": "Named Entity Recognition",
    -        "next": "training-ner"
    -    },
    -
    -    "word-vectors-similarities": {
    -        "title": "Using word vectors and semantic similarities",
    -        "next": "customizing-tokenizer"
    -    },
    -
    -    "customizing-tokenizer": {
    -        "title": "Customising the tokenizer",
    -        "next": "rule-based-matching"
    -    },
    -
    -    "rule-based-matching": {
    -        "title": "Rule-based matching",
    -        "next": "adding-languages"
    -    },
    -
    -    "adding-languages": {
    -        "title": "Adding languages",
    -        "next": "training"
    -    },
    -
    -    "language-processing-pipeline": {
    -        "title": "Language processing pipelines",
    -        "next": "deep-learning"
    -    },
    -
    -    "deep-learning": {
    -        "title": "Hooking a deep learning model into spaCy",
    -        "next": "production use"
    -    },
    -
    -    "text-classification": {
    -        "title": "Text classification",
    -        "next": "training"
    -    },
    -
    -    "production-use": {
    -        "title": "Production use",
    -        "next": "training"
    -    },
    -
    -    "training": {
    -        "title": "Training spaCy's statistical models",
    -        "next": "saving-loading"
    -    },
    -
    -    "training-ner": {
    -        "title": "Training the Named Entity Recognizer",
    -        "next": "saving-loading"
    -    },
    -
    -    "saving-loading": {
    -        "title": "Saving, loading and data serialization"
    -    },
    -
    -    "showcase": {
    -        "title": "Showcase",
    -
    -        "libraries": {
    -            "spacy_api": {
    -                "url": "https://github.com/kootenpv/spacy_api",
    -                "author": "Pascal van Kooten",
    -                "description": "Server/client to load models in a separate, dedicated process."
    -            },
    -            "spacy-nlp": {
    -                "url": "https://github.com/kengz/spacy-nlp",
    -                "author": "Wah Loon Keng",
    -                "description": "Expose spaCy NLP text parsing to Node.js (and other languages) via Socket.IO."
    -            },
    -            "spacy-api-docker": {
    -                "url": "https://github.com/jgontrum/spacy-api-docker",
    -                "author": "Johannes Gontrum",
    -                "description": "spaCy accessed by a REST API, wrapped in a Docker container."
    -            },
    -            "spacy-nlp-zeromq": {
    -                "url": "https://github.com/pasupulaphani/spacy-nlp-docker",
    -                "author": "Phaninder Pasupula",
    -                "description": "Docker image exposing spaCy with ZeroMQ bindings."
    -            },
    -            "textacy": {
    -                "url": "https://github.com/chartbeat-labs/textacy",
    -                "author": " Burton DeWilde (Chartbeat)",
    -                "description": "Higher-level NLP built on spaCy."
    -            },
    -            "visual-qa": {
    -                "url": "https://github.com/avisingh599/visual-qa",
    -                "author": "Avi Singh",
    -                "description": "Keras-based LSTM/CNN models for Visual Question Answering."
    -            },
    -            "rasa_nlu": {
    -                "url": "https://github.com/golastmile/rasa_nlu",
    -                "author": "LASTMILE",
    -                "description": "High level APIs for building your own language parser using existing NLP and ML libraries."
    -            },
    -            "spacyr": {
    -                "url": "https://github.com/kbenoit/spacyr",
    -                "author": "Kenneth Benoit",
    -                "description": "An R wrapper for spaCy."
    -            }
    -        },
    -        "visualizations": {
    -            "displaCy": {
    -                "url": "https://demos.explosion.ai/displacy",
    -                "author": "Ines Montani",
    -                "description": "An open-source NLP visualiser for the modern web.",
    -                "image": "displacy.jpg"
    -            },
    -            "displaCy ENT": {
    -                "url": "https://demos.explosion.ai/displacy-ent",
    -                "author": "Ines Montani",
    -                "description": "An open-source named entity visualiser for the modern web.",
    -                "image": "displacy-ent.jpg"
    -            }
    -        },
    -        "products": {
    -            "sense2vec": {
    -                "url": "https://demos.explosion.ai/sense2vec",
    -                "author": "Matthew Honnibal and Ines Montani",
    -                "description": "Semantic analysis of the Reddit hivemind.",
    -                "image": "sense2vec.jpg"
    -            },
    -            "TruthBot": {
    -                "url": "http://summerscope.github.io/govhack/2016/truthbot/",
    -                "author": "Team Truthbot",
    -                "description": "The world's first artificially intelligent fact checking robot.",
    -                "image": "truthbot.jpg"
    -            },
    -            "Laice": {
    -                "url": "https://github.com/kendricktan/laice",
    -                "author": "Kendrick Tan",
    -                "description": "Train your own Natural Language Processor from a browser.",
    -                "image": "laice.jpg"
    -            },
    -            "FoxType": {
    -                "url": "https://foxtype.com",
    -                "description": "Smart tools for writers.",
    -                "image": "foxtype.jpg"
    -            },
    -            "Kip": {
    -                "url": "https://kipthis.com",
    -                "description": "An AI chat assistant for group shopping.",
    -                "image": "kip.jpg"
    -            },
    -            "Indico": {
    -                "url": "https://indico.io",
    -                "description": "Text and image analysis powered by Machine Learning.",
    -                "image": "indico.jpg"
    -            },
    -            "TextAnalysisOnline": {
    -                "url": "http://textanalysisonline.com",
    -                "description": "Online tool for spaCy's tokenizer, parser, NER and more.",
    -                "image": "textanalysis.jpg"
    -            }
    -        },
    -        "books": {
    -            "Introduction to Machine Learning with Python: A Guide for Data Scientists": {
    -                "url": "https://books.google.de/books?id=vbQlDQAAQBAJ",
    -                "author": "Andreas C. Müller and Sarah Guido (O'Reilly, 2016)",
    -                "description": "Andreas is a lead developer of Scikit-Learn, and Sarah is a lead data scientist at Mashable. We're proud to get a mention."
    -            },
    -
    -            "Text Analytics with Python: A Practical Real-World Approach to Gaining Actionable Insights from your Data": {
    -                "url": "https://www.amazon.com/Text-Analytics-Python-Real-World-Actionable/dp/148422387X",
    -                "author": "Dipanjan Sarkar (Apress / Springer, 2016)",
    -                "description": "Derive useful insights from your data using Python. Learn the techniques related to natural language processing and text analytics, and gain the skills to know which technique is best suited to solve a particular problem."
    -            }
    -        },
    -        "research": {
    -            "Distributional semantics for understanding spoken meal descriptions": {
    -                "url": "https://www.semanticscholar.org/paper/Distributional-semantics-for-understanding-spoken-Korpusik-Huang/5f55c5535e80d3e5ed7f1f0b89531e32725faff5",
    -                "author": "Mandy Korpusik et al. (2016)"
    -            },
    -
    -            "Refactoring the Genia Event Extraction Shared Task Toward a General Framework for IE-Driven KB Development": {
    -                "url": "https://www.semanticscholar.org/paper/Refactoring-the-Genia-Event-Extraction-Shared-Task-Kim-Wang/06d94b64a7bd2d3433f57caddad5084435d6a91f",
    -                "author": "Jin-Dong Kim et al. (2016)"
    -            },
    -            "Mixing Dirichlet Topic Models and Word Embeddings to Make lda2vec": {
    -                "url": "https://www.semanticscholar.org/paper/Mixing-Dirichlet-Topic-Models-and-Word-Embeddings-Moody/bf8116e06f7b498c6abfbf97aeb67d0838c08609",
    -                "author": "Christopher E. Moody (2016)"
    -            },
    -            "Predicting Pre-click Quality for Native Advertisements": {
    -                "url": "https://www.semanticscholar.org/paper/Predicting-Pre-click-Quality-for-Native-Zhou-Redi/564985430ff2fbc3a9daa9c2af8997b7f5046da8",
    -                "author": "Ke Zhou et al. (2016)"
    -            },
    -            "Threat detection in online discussions": {
    -                "url": "https://www.semanticscholar.org/paper/Threat-detection-in-online-discussions-Wester-%C3%98vrelid/f4150e2fb4d8646ebc2ea84f1a86afa1b593239b",
    -                "author": "Aksel Wester et al. (2016)"
    -            },
    -            "The language of mental health problems in social media": {
    -                "url": "https://www.semanticscholar.org/paper/The-language-of-mental-health-problems-in-social-Gkotsis-Oellrich/537db6c2984514d92a754a591841e2e20845985a",
    -                "author": "George Gkotsis et al. (2016)"
    -            }
    -        }
    -    },
    -
    -    "tutorials": {
    -        "title": "Tutorials",
    -        "next": "showcase",
    -
    -        "first_steps": {
    -            "Setting up an NLP environment with Python": {
    -                "url": "https://shirishkadam.com/2016/10/06/setting-up-natural-language-processing-environment-with-python/",
    -                "author": "Shirish Kadam"
    -            },
    -            "NLP with spaCy in 10 lines of code": {
    -                "url": "https://github.com/cytora/pycon-nlp-in-10-lines",
    -                "author": "Andraz Hribernik et al. (Cytora)",
    -                "tags": ["jupyter"]
    -            },
    -            "Intro to NLP with spaCy": {
    -                "url": "https://nicschrading.com/project/Intro-to-NLP-with-spaCy/",
    -                "author": "J Nicolas Schrading"
    -            },
    -            "NLP with spaCy and IPython Notebook": {
    -                "url": "http://blog.sharepointexperience.com/2016/01/nlp-and-sharepoint-part-1/",
    -                "author": "Dustin Miller (SharePoint)",
    -                "tags": ["jupyter"]
    -            },
    -            "Getting Started with spaCy": {
    -                "url": "http://textminingonline.com/getting-started-with-spacy",
    -                "author": "TextMiner"
    -            },
    -            "spaCy – A fast natural language processing library": {
    -                "url": "https://bjoernkw.com/2015/11/22/spacy-a-fast-natural-language-processing-library/",
    -                "author": "Björn Wilmsmann"
    -            },
    -            "NLP (almost) From Scratch - POS Network with spaCy": {
    -                "url": "http://sujitpal.blogspot.de/2016/07/nlp-almost-from-scratch-implementing.html",
    -                "author": "Sujit Pal",
    -                "tags": ["gensim", "keras"]
    -            },
    -            "NLP tasks with various libraries": {
    -                "url": "http://clarkgrubb.com/nlp",
    -                "author": "Clark Grubb"
    -            },
    -            "A very (very) short primer on spacy.io": {
    -                "url": "http://blog.milonimrod.com/2015/10/a-very-very-short-primer-on-spacyio.html",
    -                "author": "Nimrod Milo  "
    -            }
    -        },
    -
    -        "deep_dives": {
    -            "Modern NLP in Python – What you can learn about food by analyzing a million Yelp reviews": {
    -                "url": "http://nbviewer.jupyter.org/github/skipgram/modern-nlp-in-python/blob/master/executable/Modern_NLP_in_Python.ipynb",
    -                "author": "Patrick Harrison (S&P Global)",
    -                "tags": ["jupyter", "gensim"]
    -            },
    -            "Deep Learning with custom pipelines and Keras": {
    -                "url": "https://explosion.ai/blog/spacy-deep-learning-keras",
    -                "author": "Matthew Honnibal",
    -                "tags": ["keras", "sentiment"]
    -            },
    -            "A decomposable attention model for Natural Language Inference": {
    -                "url": "https://github.com/explosion/spaCy/tree/master/examples/keras_parikh_entailment",
    -                "author": "Matthew Honnibal",
    -                "tags": ["keras", "similarity"]
    -            },
    -
    -            "Using the German model": {
    -                "url": "https://explosion.ai/blog/german-model",
    -                "author": "Wolfgang Seeker",
    -                "tags": ["multi-lingual"]
    -            },
    -            "Sense2vec with spaCy and Gensim": {
    -                "url": "https://explosion.ai/blog/sense2vec-with-spacy",
    -                "author": "Matthew Honnibal",
    -                "tags": ["big data", "gensim"]
    -            },
    -            "Building your bot's brain with Node.js and spaCy": {
    -                "url": "https://explosion.ai/blog/chatbot-node-js-spacy",
    -                "author": "Wah Loon Keng",
    -                "tags": ["bots", "node.js"]
    -            },
    -            "An intent classifier with spaCy": {
    -                "url": "http://blog.themusio.com/2016/07/18/musios-intent-classifier-2/",
    -                "author": "Musio",
    -                "tags": ["bots", "keras"]
    -            },
    -            "Visual Question Answering with spaCy": {
    -                "url": "http://iamaaditya.github.io/2016/04/visual_question_answering_demo_notebook",
    -                "author": "Aaditya Prakash",
    -                "tags": ["vqa", "keras"]
    -            },
    -            "Extracting time suggestions from emails with spaCy": {
    -                "url": "https://medium.com/redsift-outbox/what-time-cc9ce0c2aed2",
    -                "author": "Chris Savvopoulos",
    -                "tags": ["ner"]
    -            },
    -
    -            "Advanced text analysis with spaCy and Scikit-Learn": {
    -                "url": "https://github.com/JonathanReeve/advanced-text-analysis-workshop-2017/blob/master/advanced-text-analysis.ipynb",
    -                "author": "Jonathan Reeve",
    -                "tags": ["jupyter", "scikit-learn"]
    -            }
    -        },
    -
    -        "code": {
    -            "Training a new entity type": {
    -                "url": "https://github.com/explosion/spaCy/blob/master/examples/training/train_new_entity_type.py",
    -                "author": "Matthew Honnibal",
    -                "tags": ["ner", "training"]
    -            },
    -
    -            "Training an NER system from scratch": {
    -                "url": "https://github.com/explosion/spaCy/blob/master/examples/training/train_ner_standalone.py",
    -                "author": "Matthew Honnibal",
    -                "tags": ["ner", "training"]
    -            },
    -
    -            "Information extraction": {
    -                "url": "https://github.com/explosion/spaCy/blob/master/examples/information_extraction.py",
    -                "author": "Matthew Honnibal",
    -                "tags": ["snippet"]
    -            },
    -            "Neural bag of words": {
    -                "url": "https://github.com/explosion/spaCy/blob/master/examples/nn_text_class.py",
    -                "author": "Matthew Honnibal",
    -                "tags": ["sentiment"]
    -            },
    -            "Part-of-speech tagging": {
    -                "url": "https://github.com/explosion/spaCy/blob/master/examples/pos_tag.py",
    -                "author": "Matthew Honnibal",
    -                "tags": ["pos"]
    -            },
    -            "Parallel parse": {
    -                "url": "https://github.com/explosion/spaCy/blob/master/examples/parallel_parse.py",
    -                "author": "Matthew Honnibal",
    -                "tags": ["big data"]
    -            },
    -            "Inventory count": {
    -                "url": "https://github.com/explosion/spaCy/tree/master/examples/inventory_count",
    -                "author": "Oleg Zd"
    -            },
    -            "Multi-word matches": {
    -                "url": "https://github.com/explosion/spaCy/blob/master/examples/multi_word_matches.py",
    -                "author": "Matthew Honnibal",
    -                "tags": ["matcher", "out of date"]
    -            }
    -        }
    -    }
    -}
    diff --git a/website/docs/usage/_models-list.jade b/website/docs/usage/_models-list.jade
    deleted file mode 100644
    index 195df9f56..000000000
    --- a/website/docs/usage/_models-list.jade
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -//- 💫 DOCS > USAGE > MODELS LIST
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  Model differences are mostly statistical. In general, we do expect larger
    -    |  models to be "better" and more accurate overall. Ultimately, it depends on
    -    |  your use case and requirements, and we recommend starting with the default
    -    |  models (marked with a star below).
    -
    -+aside
    -    |  Models are now available as #[code .tar.gz] archives #[+a(gh("spacy-models")) from GitHub],
    -    |  attached to individual releases. They can be downloaded and loaded manually,
    -    |  or using spaCy's #[code download] and #[code link] commands. All models
    -    |  follow the naming convention of #[code [language]_[type]_[genre]_[size]].
    -    | #[br]#[br]
    -
    -    +button(gh("spacy-models"), true, "primary").u-text-tag
    -        |  View model releases
    -
    -+table(["Name", "Language", "Voc", "Dep", "Ent", "Vec", "Size", "License"])
    -    for models, lang in MODELS
    -        for model, i in models
    -            +model-row(model.id, model.lang, model.feats, model.size, model.license, model.def || models.length == 1, i == 0)
    diff --git a/website/docs/usage/deep-learning.jade b/website/docs/usage/deep-learning.jade
    deleted file mode 100644
    index 78448e43e..000000000
    --- a/website/docs/usage/deep-learning.jade
    +++ /dev/null
    @@ -1,92 +0,0 @@
    -//- 💫 DOCS > USAGE > DEEP LEARNING
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  In this example, we'll be using #[+a("https://keras.io/") Keras], as
    -    |  it's the most popular deep learning library for Python. Using Keras,
    -    |  we will write a custom sentiment analysis model that predicts whether a
    -    |  document is positive or negative. Then, we will use it to find which entities
    -    |  are commonly associated with positive or negative documents. Here's a
    -    |  quick example of how that can look at runtime.
    -
    -+aside("What's Keras?")
    -    |  #[+a("https://keras.io/") Keras] gives you a high-level, declarative
    -    |  interface to define neural networks. Models are trained using Google's
    -    |  #[+a("https://www.tensorflow.org") TensorFlow] by default.
    -    |  #[+a("http://deeplearning.net/software/theano/") Theano] is also
    -    |  supported.
    -
    -+under-construction
    -
    -p
    -    |  For most applications, I it's recommended to use pre-trained word embeddings
    -    |  without "fine-tuning". This means that you'll use the same embeddings
    -    |  across different models, and avoid learning adjustments to them on your
    -    |  training data. The embeddings table is large, and the values provided by
    -    |  the pre-trained vectors are already pretty good. Fine-tuning the
    -    |  embeddings table is therefore a waste of your "parameter budget". It's
    -    |  usually better to make your network larger some other way, e.g. by
    -    |  adding another LSTM layer, using attention mechanism, using character
    -    |  features, etc.
    -
    -+h(2, "attribute-hooks") Attribute hooks
    -
    -+under-construction
    -
    -p
    -    |  Earlier, we saw how to store data in the new generic #[code user_data]
    -    |  dict. This generalises well, but it's not terribly satisfying. Ideally,
    -    |  we want to let the custom data drive more "native" behaviours. For
    -    |  instance, consider the #[code .similarity()] methods provided by spaCy's
    -    |  #[+api("doc") #[code Doc]], #[+api("token") #[code Token]] and
    -    |  #[+api("span") #[code Span]] objects:
    -
    -+code("Polymorphic similarity example").
    -    span.similarity(doc)
    -    token.similarity(span)
    -    doc1.similarity(doc2)
    -
    -p
    -    |  By default, this just averages the vectors for each document, and
    -    |  computes their cosine. Obviously, spaCy should make it easy for you to
    -    |  install your own similarity model. This introduces a tricky design
    -    |  challenge. The current solution is to add three more dicts to the
    -    |  #[code Doc] object:
    -
    -+aside("Implementation note")
    -    |  The hooks live on the #[code Doc] object because the #[code Span] and
    -    |  #[code Token] objects are created lazily, and don't own any data. They
    -    |  just proxy to their parent #[code Doc]. This turns out to be convenient
    -    |  here — we only have to worry about installing hooks in one place.
    -
    -+table(["Name", "Description"])
    -    +row
    -        +cell #[code user_hooks]
    -        +cell Customise behaviour of #[code doc.vector], #[code doc.has_vector], #[code doc.vector_norm] or #[code doc.sents]
    -
    -    +row
    -        +cell #[code user_token_hooks]
    -        +cell Customise behaviour of #[code token.similarity], #[code token.vector], #[code token.has_vector], #[code token.vector_norm] or #[code token.conjuncts]
    -
    -    +row
    -        +cell #[code user_span_hooks]
    -        +cell Customise behaviour of #[code span.similarity], #[code span.vector], #[code span.has_vector], #[code span.vector_norm] or #[code span.root]
    -
    -p
    -    |  To sum up, here's an example of hooking in custom #[code .similarity()]
    -    |  methods:
    -
    -+code("Add custom similarity hooks").
    -    class SimilarityModel(object):
    -        def __init__(self, model):
    -            self._model = model
    -
    -        def __call__(self, doc):
    -            doc.user_hooks['similarity'] = self.similarity
    -            doc.user_span_hooks['similarity'] = self.similarity
    -            doc.user_token_hooks['similarity'] = self.similarity
    -
    -        def similarity(self, obj1, obj2):
    -            y = self._model([obj1.vector, obj2.vector])
    -            return float(y[0])
    diff --git a/website/docs/usage/index.jade b/website/docs/usage/index.jade
    deleted file mode 100644
    index a0aa1dca8..000000000
    --- a/website/docs/usage/index.jade
    +++ /dev/null
    @@ -1,353 +0,0 @@
    -//- 💫 DOCS > USAGE
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  spaCy is compatible with #[strong 64-bit CPython 2.6+∕3.3+] and
    -    |  runs on #[strong Unix/Linux], #[strong macOS/OS X] and
    -    |  #[strong Windows]. The latest spaCy releases are
    -    |  available over #[+a("https://pypi.python.org/pypi/spacy") pip] (source
    -    |  packages only) and #[+a("https://anaconda.org/conda-forge/spacy") conda].
    -    |  Installation requires a working build environment. See notes on
    -    |  #[a(href="#source-ubuntu") Ubuntu], #[a(href="#source-osx") macOS/OS X]
    -    |  and #[a(href="#source-windows") Windows] for details.
    -
    -+quickstart(QUICKSTART, "Quickstart")
    -    +qs({config: 'venv', python: 2}) python -m pip install -U virtualenv
    -    +qs({config: 'venv', python: 3}) python -m pip install -U venv
    -    +qs({config: 'venv', python: 2}) virtualenv .env
    -    +qs({config: 'venv', python: 3}) venv .env
    -    +qs({config: 'venv', os: 'mac'}) source .env/bin/activate
    -    +qs({config: 'venv', os: 'linux'}) source .env/bin/activate
    -    +qs({config: 'venv', os: 'windows'}) .env\Scripts\activate
    -
    -    +qs({config: 'gpu', os: 'mac'}) export PATH=$PATH:/usr/local/cuda-8.0/bin
    -    +qs({config: 'gpu', os: 'linux'}) export PATH=$PATH:/usr/local/cuda-8.0/bin
    -
    -    +qs({package: 'pip'}) pip install -U spacy
    -    +qs({package: 'conda'}) conda install -c conda-forge spacy
    -
    -    +qs({package: 'source'}) git clone https://github.com/explosion/spaCy
    -    +qs({package: 'source'}) cd spaCy
    -    +qs({package: 'source'}) pip install -r requirements.txt
    -    +qs({package: 'source'}) pip install -e .
    -
    -    +qs({model: 'en'}) spacy download en
    -    +qs({model: 'de'}) spacy download de
    -    +qs({model: 'fr'}) spacy download fr
    -    +qs({model: 'es'}) spacy download es
    -
    -+h(2, "installation") Installation instructions
    -
    -+h(3, "pip") pip
    -    +badge("pipy")
    -
    -p Using pip, spaCy releases are currently only available as source packages.
    -
    -+code(false, "bash").
    -    pip install -U spacy
    -
    -+aside("Download models")
    -    |  After installation you need to download a language model. For more info
    -    |  and available models, see the #[+a("/docs/usage/models") docs on models].
    -
    -    +code.o-no-block.
    -        spacy download en
    -
    -        >>> import spacy
    -        >>> nlp = spacy.load('en')
    -
    -p
    -    |  When using pip it is generally recommended to install packages in a
    -    |  #[code virtualenv] to avoid modifying system state:
    -
    -+code(false, "bash").
    -    virtualenv .env
    -    source .env/bin/activate
    -    pip install spacy
    -
    -+h(3, "conda") conda
    -    +badge("conda")
    -
    -p
    -    |  Thanks to our great community, we've finally re-added conda support. You
    -    |  can now install spaCy via #[code conda-forge]:
    -
    -+code(false, "bash").
    -    conda config --add channels conda-forge
    -    conda install spacy
    -
    -p
    -    |  For the feedstock including the build recipe and configuration, check out
    -    |  #[+a("https://github.com/conda-forge/spacy-feedstock") this repository].
    -    |  Improvements and pull requests to the recipe and setup are always appreciated.
    -
    -+h(2, "gpu") Run spaCy with GPU
    -
    -p
    -    |  As of v2.0, spaCy's comes with neural network models that are implemented
    -    |  in our machine learning library, #[+a(gh("thinc")) Thinc]. For GPU
    -    |  support, we've been grateful to use the work of
    -    |  #[+a("http://chainer.org") Chainer]'s CuPy module, which provides
    -    |  a NumPy-compatible interface for GPU arrays.
    -
    -p
    -    |  First, install follows the normal CUDA installation procedure. Next, set
    -    |  your environment variables so that the installation will be able to find
    -    |  CUDA. Finally, install spaCy.
    -
    -+code(false, "bash").
    -   export CUDA_HOME=/usr/local/cuda-8.0 # Or wherever your CUDA is
    -   export PATH=$PATH:$CUDA_HOME/bin
    -
    -   pip install spacy
    -   python -c "import thinc.neural.gpu_ops" # Check the GPU ops were built
    -
    -+h(2, "source") Compile from source
    -
    -p
    -    |  The other way to install spaCy is to clone its
    -    |  #[+a(gh("spaCy")) GitHub repository] and build it from source. That is
    -    |  the common way if you want to make changes to the code base. You'll need to
    -    |  make sure that you have a development environment consisting of a Python
    -    |  distribution including header files, a compiler,
    -    |  #[+a("https://pip.pypa.io/en/latest/installing/") pip],
    -    |  #[+a("https://virtualenv.pypa.io/") virtualenv] and
    -    |  #[+a("https://git-scm.com") git] installed. The compiler part is the
    -    |  trickiest. How to do that depends on your system. See notes on
    -    |  #[a(href="#source-ubuntu") Ubuntu], #[a(href="#source-osx") OS X] and
    -    |  #[a(href="#source-windows") Windows] for details.
    -
    -+code(false, "bash").
    -    # make sure you are using recent pip/virtualenv versions
    -    python -m pip install -U pip virtualenv
    -    git clone #{gh("spaCy")}
    -    cd spaCy
    -
    -    virtualenv .env
    -    source .env/bin/activate
    -    pip install -r requirements.txt
    -    pip install -e .
    -
    -p
    -    |  Compared to regular install via pip, #[+a(gh("spaCy", "requirements.txt")) requirements.txt]
    -    |  additionally installs developer dependencies such as Cython.
    -
    -p
    -    |  Instead of the above verbose commands, you can also use the following
    -    |  #[+a("http://www.fabfile.org/") Fabric] commands:
    -
    -+table(["Command", "Description"])
    -    +row
    -        +cell #[code fab env]
    -        +cell Create #[code virtualenv] and delete previous one, if it exists.
    -
    -    +row
    -        +cell #[code fab make]
    -        +cell Compile the source.
    -
    -    +row
    -        +cell #[code fab clean]
    -        +cell Remove compiled objects, including the generated C++.
    -
    -    +row
    -        +cell #[code fab test]
    -        +cell Run basic tests, aborting after first failure.
    -
    -p
    -    |  All commands assume that your #[code virtualenv] is located in a
    -    |  directory #[code .env]. If you're using a different directory, you can
    -    |  change it via the environment variable #[code VENV_DIR], for example:
    -
    -+code(false, "bash").
    -    VENV_DIR=".custom-env" fab clean make
    -
    -+h(3, "source-ubuntu") Ubuntu
    -
    -p Install system-level dependencies via #[code apt-get]:
    -
    -+code(false, "bash").
    -    sudo apt-get install build-essential python-dev git
    -
    -+h(3, "source-osx") macOS / OS X
    -
    -p
    -    |  Install a recent version of #[+a("https://developer.apple.com/xcode/") XCode],
    -    |  including the so-called "Command Line Tools". macOS and OS X ship with
    -    |  Python and git preinstalled. To compile spaCy with multi-threading support
    -    |  on macOS / OS X, #[+a("https://github.com/explosion/spaCy/issues/267") see here].
    -
    -+h(3, "source-windows") Windows
    -
    -p
    -    |  Install a version of
    -    |  #[+a("https://www.visualstudio.com/vs/visual-studio-express/") Visual Studio Express]
    -    |  that matches the version that was used to compile your Python
    -    |  interpreter. For official distributions these are:
    -
    -+table([ "Distribution", "Version"])
    -    +row
    -        +cell Python 2.7
    -        +cell Visual Studio 2008
    -
    -    +row
    -        +cell Python 3.4
    -        +cell Visual Studio 2010
    -
    -    +row
    -        +cell Python 3.5+
    -        +cell Visual Studio 2015
    -
    -+h(2, "troubleshooting") Troubleshooting guide
    -
    -p
    -    |  This section collects some of the most common errors you may come
    -    |  across when installing, loading and using spaCy, as well as their solutions.
    -
    -+aside("Help us improve this guide")
    -    |  Did you come across a problem like the ones listed here and want to
    -    |  share the solution? You can find the "Suggest edits" button at the
    -    |  bottom of this page that points you to the source. We always
    -    |  appreciate #[+a(gh("spaCy") + "/pulls") pull requests]!
    -
    -+h(3, "compatible-model") No compatible model found
    -
    -+code(false, "text").
    -    No compatible model found for [lang] (spaCy v#{SPACY_VERSION}).
    -
    -p
    -    |  This usually means that the model you're trying to download does not
    -    |  exist, or isn't available for your version of spaCy. Check the
    -    |  #[+a(gh("spacy-models", "compatibility.json")) compatibility table]
    -    |  to see which models are available for your spaCy version. If you're using
    -    |  an old version, consider upgrading to the latest release. Note that while
    -    |  spaCy supports tokenization for
    -    |  #[+a("/docs/api/language-models/#alpha-support") a variety of languages],
    -    |  not all of them come with statistical models. To only use the tokenizer,
    -    |  import the language's #[code Language] class instead, for example
    -    |  #[code from spacy.fr import French].
    -
    -+h(3, "symlink-privilege") Symbolic link privilege not held
    -
    -+code(false, "text").
    -    OSError: symbolic link privilege not held
    -
    -p
    -    |  To create #[+a("/docs/usage/models/#usage") shortcut links] that let you
    -    |  load models by name, spaCy creates a symbolic link in the
    -    |  #[code spacy/data] directory. This means your user needs permission to do
    -    |  this. The above error mostly occurs when doing a system-wide installation,
    -    |  which will create the symlinks in a system directory. Run the
    -    |  #[code download] or #[code link] command as administrator, or use a
    -    |  #[code virtualenv] to install spaCy in a user directory, instead
    -    |  of doing a system-wide installation.
    -
    -+h(3, "no-cache-dir") No such option: --no-cache-dir
    -
    -+code(false, "text").
    -    no such option: --no-cache-dir
    -
    -p
    -    |  The #[code download] command uses pip to install the models and sets the
    -    |  #[code --no-cache-dir] flag to prevent it from requiring too much memory.
    -    |  #[+a("https://pip.pypa.io/en/stable/reference/pip_install/#caching") This setting]
    -    |  requires pip v6.0 or newer. Run #[code pip install -U pip] to upgrade to
    -    |  the latest version of pip. To see which version you have installed,
    -    |  run #[code pip --version].
    -
    -+h(3, "import-error") Import error
    -
    -+code(false, "text").
    -    Import Error: No module named spacy
    -
    -p
    -    |  This error means that the spaCy module can't be located on your system, or in
    -    |  your environment. Make sure you have spaCy installed. If you're using a
    -    |  #[code virtualenv], make sure it's activated and check that spaCy is
    -    |  installed in that environment – otherwise, you're trying to load a system
    -    |  installation. You can also run #[code which python] to find out where
    -    |  your Python executable is located.
    -
    -+h(3, "import-error-models") Import error: models
    -
    -+code(false, "text").
    -    ImportError: No module named 'en_core_web_sm'
    -
    -p
    -    |  As of spaCy v1.7, all models can be installed as Python packages. This means
    -    |  that they'll become importable modules of your application. When creating
    -    |  #[+a("/docs/usage/models/#usage") shortcut links], spaCy will also try
    -    |  to import the model to load its meta data. If this fails, it's usually a
    -    |  sign that the package is not installed in the current environment.
    -    |  Run #[code pip list] or #[code pip freeze] to check which model packages
    -    |  you have installed, and install the
    -    |  #[+a("/docs/usage/models#available") correct models] if necessary. If you're
    -    |  importing a model manually at the top of a file, make sure to use the name
    -    |  of the package, not the shortcut link you've created.
    -
    -+h(3, "vocab-strings") File not found: vocab/strings.json
    -
    -+code(false, "text").
    -    FileNotFoundError: No such file or directory: [...]/vocab/strings.json
    -
    -p
    -    |  This error may occur when using #[code spacy.load()] to load
    -    |  a language model – either because you haven't set up a
    -    |  #[+a("/docs/usage/models/#usage") shortcut link] for it, or because it
    -    |  doesn't actually exist. Set up a
    -    |  #[+a("/docs/usage/models/#usage") shortcut link] for the model
    -    |  you want to load. This can either be an installed model package, or a
    -    |  local directory containing the model data. If you want to use one of the
    -    |  #[+a("/docs/api/language-models/#alpha-support") alpha tokenizers] for
    -    |  languages that don't yet have a statistical model, you should import its
    -    |  #[code Language] class instead, for example
    -    |  #[code from spacy.lang.bn import Bengali].
    -
    -+h(3, "command-not-found") Command not found
    -
    -+code(false, "text").
    -    command not found: spacy
    -
    -p
    -    |  This error may occur when running the #[code spacy] command from the
    -    |  command line. spaCy does not currently add an entry to our #[code PATH]
    -    |  environment variable, as this can lead to unexpected results, especially
    -    |  when using #[code virtualenv]. Instead, spaCy adds an auto-alias that
    -    |  maps #[code spacy] to #[code python -m spacy]. If this is not working as
    -    |  expected, run the command with #[code python -m], yourself –
    -    |  for example #[code python -m spacy download en]. For more info on this,
    -    |  see #[+api("cli#download") download].
    -
    -+h(3, "module-load") 'module' object has no attribute 'load'
    -
    -+code(false, "text").
    -    AttributeError: 'module' object has no attribute 'load'
    -
    -p
    -    |  While this could technically have many causes, including spaCy being
    -    |  broken, the most likely one is that your script's file or directory name
    -    |  is "shadowing" the module – e.g. your file is called #[code spacy.py],
    -    |  or a directory you're importing from is called #[code spacy]. So, when
    -    |  using spaCy, never call anything else #[code spacy].
    -
    -+h(2, "tests") Run tests
    -
    -p
    -    |  spaCy comes with an #[+a(gh("spacy", "spacy/tests")) extensive test suite].
    -    |  First, find out where spaCy is installed:
    -
    -+code(false, "bash").
    -    python -c "import os; import spacy; print(os.path.dirname(spacy.__file__))"
    -
    -p
    -    |  Then run #[code pytest] on that directory. The flags #[code --slow] and
    -    |  #[code --model] are optional and enable additional tests.
    -
    -+code(false, "bash").
    -    # make sure you are using recent pytest version
    -    python -m pip install -U pytest
    -
    -    python -m pytest <spacy-directory>                 # basic tests
    -    python -m pytest <spacy-directory> --slow          # basic and slow tests
    -    python -m pytest <spacy-directory> --models --all  # basic and all model tests
    -    python -m pytest <spacy-directory> --models --en   # basic and English model tests
    diff --git a/website/docs/usage/production-use.jade b/website/docs/usage/production-use.jade
    deleted file mode 100644
    index d4a1ffbc2..000000000
    --- a/website/docs/usage/production-use.jade
    +++ /dev/null
    @@ -1,147 +0,0 @@
    -//- 💫 DOCS > USAGE > PROCESSING TEXT
    -
    -include ../../_includes/_mixins
    -
    -+under-construction
    -
    -+h(2, "multithreading") Multi-threading with #[code .pipe()]
    -
    -p
    -    |  If you have a sequence of documents to process, you should use the
    -    |  #[+api("language#pipe") #[code Language.pipe()]] method. The method takes
    -    |  an iterator of texts, and accumulates an internal buffer,
    -    |  which it works on in parallel. It then yields the documents in order,
    -    |  one-by-one. After a long and bitter struggle, the global interpreter
    -    |  lock was freed around spaCy's main parsing loop in v0.100.3. This means
    -    |  that #[code .pipe()] will be significantly faster in most
    -    |  practical situations, because it allows shared memory parallelism.
    -
    -+code.
    -    for doc in nlp.pipe(texts, batch_size=10000, n_threads=3):
    -       pass
    -
    -p
    -    |  To make full use of the #[code .pipe()] function, you might want to
    -    |  brush up on #[strong Python generators]. Here are a few quick hints:
    -
    -+list
    -    +item
    -        |  Generator comprehensions can be written as
    -        |  #[code (item for item in sequence)].
    -
    -    +item
    -        |  The
    -        |  #[+a("https://docs.python.org/2/library/itertools.html") #[code itertools] built-in library]
    -        |  and the
    -        |  #[+a("https://github.com/pytoolz/cytoolz") #[code cytoolz] package]
    -        |  provide a lot of handy #[strong generator tools].
    -
    -    +item
    -        |  Often you'll have an input stream that pairs text with some
    -        |  important meta data, e.g. a JSON document. To
    -        |  #[strong pair up the meta data] with the processed #[code Doc]
    -        |  object, you should use the #[code itertools.tee] function to split
    -        |  the generator in two, and then #[code izip] the extra stream to the
    -        |  document stream.
    -
    -+h(2, "own-annotations") Bringing your own annotations
    -
    -p
    -    |  spaCy generally assumes by default that your data is raw text. However,
    -    |  sometimes your data is partially annotated, e.g. with pre-existing
    -    |  tokenization, part-of-speech tags, etc. The most common situation is
    -    |  that you have pre-defined tokenization. If you have a list of strings,
    -    |  you can create a #[code Doc] object directly. Optionally, you can also
    -    |  specify a list of boolean values, indicating whether each word has a
    -    |  subsequent space.
    -
    -+code.
    -    doc = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'], spaces=[False, True, False, False])
    -
    -p
    -    |  If provided, the spaces list must be the same length as the words list.
    -    |  The spaces list affects the #[code doc.text], #[code span.text],
    -    |  #[code token.idx], #[code span.start_char] and #[code span.end_char]
    -    |  attributes. If you don't provide a #[code spaces] sequence, spaCy will
    -    |  assume that all words are whitespace delimited.
    -
    -+code.
    -    good_spaces = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'], spaces=[False, True, False, False])
    -    bad_spaces = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'])
    -    assert bad_spaces.text == u'Hello , world !'
    -    assert good_spaces.text == u'Hello, world!'
    -
    -p
    -    |  Once you have a #[+api("doc") #[code Doc]] object, you can write to its
    -    |  attributes to set the part-of-speech tags, syntactic dependencies, named
    -    |  entities and other attributes. For details, see the respective usage
    -    |  pages.
    -
    -+h(2, "models") Working with models
    -
    -p
    -    |  If your application depends on one or more #[+a("/docs/usage/models") models],
    -    |  you'll usually want to integrate them into your continuous integration
    -    |  workflow and build process. While spaCy provides a range of useful helpers
    -    |  for downloading, linking and loading models, the underlying functionality
    -    |  is entirely based on native Python packages. This allows your application
    -    |  to handle a model like any other package dependency.
    -
    -+h(3, "models-download") Downloading and requiring model dependencies
    -
    -p
    -    |  spaCy's built-in #[+api("cli#download") #[code download]] command
    -    |  is mostly intended as a convenient, interactive wrapper. It performs
    -    |  compatibility checks and prints detailed error messages and warnings.
    -    |  However, if you're downloading models as part of an automated build
    -    |  process, this only adds an unnecessary layer of complexity. If you know
    -    |  which models your application needs, you should be specifying them directly.
    -
    -p
    -    |  Because all models are valid Python packages, you can add them to your
    -    |  application's #[code requirements.txt]. If you're running your own
    -    |  internal PyPi installation, you can simply upload the models there. pip's
    -    |  #[+a("https://pip.pypa.io/en/latest/reference/pip_install/#requirements-file-format") requirements file format]
    -    |  supports both package names to download via a PyPi server, as well as direct
    -    |  URLs.
    -
    -+code("requirements.txt", "text").
    -    spacy>=2.0.0,<3.0.0
    -    -e #{gh("spacy-models")}/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz
    -
    -p
    -    |  All models are versioned and specify their spaCy dependency. This ensures
    -    |  cross-compatibility and lets you specify exact version requirements for
    -    |  each model. If you've trained your own model, you can use the
    -    |  #[+api("cli#package") #[code package]] command to generate the required
    -    |  meta data and turn it into a loadable package.
    -
    -+h(3, "models-loading") Loading and testing models
    -
    -p
    -    |  Downloading models directly via pip won't call spaCy's link
    -    |  #[+api("cli#link") #[code link]] command, which creates
    -    |  symlinks for model shortcuts. This means that you'll have to run this
    -    |  command separately, or use the native #[code import] syntax to load the
    -    |  models:
    -
    -+code.
    -    import en_core_web_sm
    -    nlp = en_core_web_sm.load()
    -
    -p
    -    |  In general, this approach is recommended for larger code bases, as it's
    -    |  more "native", and doesn't depend on symlinks or rely on spaCy's loader
    -    |  to resolve string names to model packages. If a model can't be
    -    |  imported, Python will raise an #[code ImportError] immediately. And if a
    -    |  model is imported but not used, any linter will catch that.
    -
    -p
    -    |  Similarly, it'll give you more flexibility when writing tests that
    -    |  require loading models. For example, instead of writing your own
    -    |  #[code try] and #[code except] logic around spaCy's loader, you can use
    -    |  #[+a("http://pytest.readthedocs.io/en/latest/") pytest]'s
    -    |  #[code importorskip()] method to only run a test if a specific model or
    -    |  model version is installed. Each model package exposes a #[code __version__]
    -    |  attribute which you can also use to perform your own version compatibility
    -    |  checks before loading a model.
    diff --git a/website/docs/usage/showcase.jade b/website/docs/usage/showcase.jade
    deleted file mode 100644
    index 66b7e6d86..000000000
    --- a/website/docs/usage/showcase.jade
    +++ /dev/null
    @@ -1,44 +0,0 @@
    -//- 💫 DOCS > USAGE > SHOWCASE
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  On this page, we'll be featuring demos, libraries and products from
    -    |  the spaCy community. Have you done something cool with spaCy?
    -    |  #[a(href="mailto:#{EMAIL}") Let us know!]
    -
    -+h(2, "libraries") Third-party libraries
    -
    -+list
    -    each details, title in libraries
    -        +card-item(title, details)
    -
    -+h(2, "visualizations") Visualizations
    -
    -+grid
    -    each details, name in visualizations
    -        - details.image = "/assets/img/showcase/" + details.image
    -        +card(name, details)
    -
    -+h(2, "products") Built with spaCy
    -
    -+grid
    -    each details, name in products
    -        - details.image = "/assets/img/showcase/" + details.image
    -        +card(name, details)
    -
    -+h(2, "books") Books
    -
    -p We're excited to see books featuring spaCy already start to appear.
    -
    -+list
    -    each details, title in books
    -        +card-item(title, details)
    -
    -+h(2, "research") Research systems
    -
    -p Researchers are using spaCy to build ambitious, next-generation text processing technologies. spaCy is particularly popular amongst the biomedical NLP community, who are working on extracting knowledge from the huge volume of literature in their field. For an up-to-date list of the papers citing spaCy, see #[+a("https://www.semanticscholar.org/search?year%5B%5D=2015&year%5B%5D=2020&q=spacy&sort=relevance&ae=false") Semantic Scholar].
    -
    -+list
    -    each details, title in research
    -        +card-item(title, details)
    diff --git a/website/docs/usage/spacy-101.jade b/website/docs/usage/spacy-101.jade
    deleted file mode 100644
    index ac3e808b3..000000000
    --- a/website/docs/usage/spacy-101.jade
    +++ /dev/null
    @@ -1,430 +0,0 @@
    -//- 💫 DOCS > USAGE > SPACY 101
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  Whether you're new to spaCy, or just want to brush up on some
    -    |  NLP basics and implementation details – this page should have you covered.
    -    |  Each section will explain one of spaCy's features in simple terms and
    -    |  with examples or illustrations. Some sections will also reappear across
    -    |  the usage guides as a quick introcution.
    -
    -+aside("Help us improve the docs")
    -    |  Did you spot a mistake or come across explanations that
    -    |  are unclear? We always appreciate improvement
    -    |  #[+a(gh("spaCy") + "/issues") suggestions] or
    -    |  #[+a(gh("spaCy") + "/pulls") pull requests]. You can find a "Suggest
    -    |  edits" link at the bottom of each page that points you to the source.
    -
    -+h(2, "whats-spacy") What's spaCy?
    -
    -+grid.o-no-block
    -    +grid-col("half")
    -        p
    -            |  spaCy is a #[strong free, open-source library] for advanced
    -            |  #[strong Natural Language Processing] (NLP) in Python.
    -
    -        p
    -            |  If you're working with a lot of text, you'll eventually want to
    -            |  know more about it. For example, what's it about? What do the
    -            |  words mean in context? Who is doing what to whom? What companies
    -            |  and products are mentioned? Which texts are similar to each other?
    -
    -        p
    -            |  spaCy is designed specifically for #[strong production use] and
    -            |  helps you build applications that process and "understand"
    -            |  large volumes of text. It can be used to build
    -            |  #[strong information extraction] or
    -            |  #[strong natural language understanding] systems, or to
    -            |  pre-process text for #[strong deep learning].
    -
    -    +table-of-contents
    -        +item #[+a("#features") Features]
    -        +item #[+a("#annotations") Linguistic annotations]
    -        +item #[+a("#annotations-token") Tokenization]
    -        +item #[+a("#annotations-pos-deps") POS tags and dependencies]
    -        +item #[+a("#annotations-ner") Named entities]
    -        +item #[+a("#vectors-similarity") Word vectors and similarity]
    -        +item #[+a("#pipelines") Pipelines]
    -        +item #[+a("#vocab") Vocab, hashes and lexemes]
    -        +item #[+a("#serialization") Serialization]
    -        +item #[+a("#training") Training]
    -        +item #[+a("#language-data") Language data]
    -        +item #[+a("#architecture") Architecture]
    -        +item #[+a("#community") Community & FAQ]
    -
    -+h(3, "what-spacy-isnt") What spaCy isn't
    -
    -+list
    -    +item #[strong spaCy is not a platform or "an API"].
    -        |  Unlike a platform, spaCy does not provide a software as a service, or
    -        |  a web application. It's an open-source library designed to help you
    -        |  build NLP applications, not a consumable service.
    -    +item #[strong spaCy is not an out-of-the-box chat bot engine].
    -        |  While spaCy can be used to power conversational applications, it's
    -        |  not designed specifically for chat bots, and only provides the
    -        |  underlying text processing capabilities.
    -    +item #[strong spaCy is not research software].
    -        |  It's built on the latest research, but it's designed to get
    -        |  things done. This leads to fairly different design decisions than
    -        |  #[+a("https://github./nltk/nltk") NLTK]
    -        |  or #[+a("https://stanfordnlp.github.io/CoreNLP/") CoreNLP], which were
    -        |  created as platforms for teaching and research. The main difference
    -        |  is that spaCy is integrated and opinionated. spaCy tries to avoid asking
    -        |  the user to choose between multiple algorithms that deliver equivalent
    -        |  functionality. Keeping the menu small lets spaCy deliver generally better
    -        |  performance and developer experience.
    -    +item #[strong spaCy is not a company].
    -        |  It's an open-source library. Our company publishing spaCy and other
    -        |  software is called #[+a(COMPANY_URL, true) Explosion AI].
    -
    -+h(2, "features") Features
    -
    -p
    -    |  In the documentation, you'll come across mentions of spaCy's
    -    |  features and capabilities. Some of them refer to linguistic concepts,
    -    |  while others are related to more general machine learning functionality.
    -
    -+aside
    -    |  If one of spaCy's functionalities #[strong needs a model], it means that
    -    |  you need to have one of the available
    -    |  #[+a("/docs/usage/models") statistical models] installed. Models are used
    -    |  to #[strong predict] linguistic annotations – for example, if a word is
    -    |  a verb or a noun.
    -
    -+table(["Name", "Description", "Needs model"])
    -    +row
    -        +cell #[strong Tokenization]
    -        +cell Segmenting text into words, punctuations marks etc.
    -        +cell #[+procon("con")]
    -
    -    +row
    -        +cell #[strong Part-of-speech] (POS) #[strong Tagging]
    -        +cell Assigning word types to tokens, like verb or noun.
    -        +cell #[+procon("pro")]
    -
    -    +row
    -        +cell #[strong Dependency Parsing]
    -        +cell
    -            |  Assigning syntactic dependency labels, describing the relations
    -            |  between individual tokens, like subject or object.
    -        +cell #[+procon("pro")]
    -
    -    +row
    -        +cell #[strong Lemmatization]
    -        +cell
    -            |  Assigning the base forms of words. For example, the lemma of
    -            |  "was" is "be", and the lemma of "rats" is "rat".
    -        +cell #[+procon("pro")]
    -
    -    +row
    -        +cell #[strong Sentence Boundary Detection] (SBD)
    -        +cell Finding and segmenting individual sentences.
    -        +cell #[+procon("pro")]
    -
    -    +row
    -        +cell #[strong Named Entity Recongition] (NER)
    -        +cell
    -            |  Labelling named "real-world" objects, like persons, companies or
    -            |  locations.
    -        +cell #[+procon("pro")]
    -
    -    +row
    -        +cell #[strong Similarity]
    -        +cell
    -            |  Comparing words, text spans and documents and how similar they
    -            |  are to each other.
    -        +cell #[+procon("pro")]
    -
    -    +row
    -        +cell #[strong Text classification]
    -        +cell Assigning categories or labels to a whole document, or parts of a document.
    -        +cell #[+procon("pro")]
    -
    -    +row
    -        +cell #[strong Rule-based Matching]
    -        +cell
    -            |  Finding sequences of tokens based on their texts and linguistic
    -            |  annotations, similar to regular expressions.
    -        +cell #[+procon("con")]
    -
    -    +row
    -        +cell #[strong Training]
    -        +cell Updating and improving a statistical model's predictions.
    -        +cell #[+procon("neutral")]
    -
    -    +row
    -        +cell #[strong Serialization]
    -        +cell Saving objects to files or byte strings.
    -        +cell #[+procon("neutral")]
    -
    -+h(2, "annotations") Linguistic annotations
    -
    -p
    -    |  spaCy provides a variety of linguistic annotations to give you
    -    |  #[strong insights into a text's grammatical structure]. This includes the
    -    |  word types, like the parts of speech, and how the words are related to
    -    |  each other. For example, if you're analysing text, it makes a huge
    -    |  difference whether a noun is the subject of a sentence, or the object –
    -    |  or whether "google" is used as a verb, or refers to the website or
    -    |  company in a specific context.
    -
    -p
    -    |  Once you've downloaded and installed a #[+a("/docs/usage/models") model],
    -    |  you can load it via #[+api("spacy#load") #[code spacy.load()]]. This will
    -    |  return a #[code Language] object contaning all components and data needed
    -    |  to process text. We usually call it #[code nlp]. Calling the #[code nlp]
    -    |  object on a string of text will return a processed #[code Doc]:
    -
    -+code.
    -    import spacy
    -
    -    nlp = spacy.load('en')
    -    doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion')
    -
    -p
    -    |  Even though a #[code Doc] is processed – e.g. split into individual words
    -    |  and annotated – it still holds #[strong all information of the original text],
    -    |  like whitespace characters. You can always get the offset of a token into the
    -    |  original string, or reconstruct the original by joining the tokens and their
    -    |  trailing whitespace. This way, you'll never lose any information
    -    |  when processing text with spaCy.
    -
    -+h(3, "annotations-token") Tokenization
    -
    -include _spacy-101/_tokenization
    -
    -+infobox
    -    |  To learn more about how spaCy's tokenization rules work in detail,
    -    |  how to #[strong customise and replace] the default tokenizer and how to
    -    |  #[strong add language-specific data], see the usage guides on
    -    |  #[+a("/docs/usage/adding-languages") adding languages] and
    -    |  #[+a("/docs/usage/customizing-tokenizer") customising the tokenizer].
    -
    -+h(3, "annotations-pos-deps") Part-of-speech tags and dependencies
    -    +tag-model("dependency parse")
    -
    -include _spacy-101/_pos-deps
    -
    -+infobox
    -    |  To learn more about #[strong part-of-speech tagging] and rule-based
    -    |  morphology, and how to #[strong navigate and use the parse tree]
    -    |  effectively, see the usage guides on
    -    |  #[+a("/docs/usage/pos-tagging") part-of-speech tagging] and
    -    |  #[+a("/docs/usage/dependency-parse") using the dependency parse].
    -
    -+h(3, "annotations-ner") Named Entities
    -    +tag-model("named entities")
    -
    -include _spacy-101/_named-entities
    -
    -+infobox
    -    |  To learn more about entity recognition in spaCy, how to
    -    |  #[strong add your own entities] to a document and how to
    -    |  #[strong train and update] the entity predictions of a model, see the
    -    |  usage guides on
    -    |  #[+a("/docs/usage/entity-recognition") named entity recognition] and
    -    |  #[+a("/docs/usage/training-ner") training the named entity recognizer].
    -
    -+h(2, "vectors-similarity") Word vectors and similarity
    -    +tag-model("vectors")
    -
    -include _spacy-101/_similarity
    -
    -include _spacy-101/_word-vectors
    -
    -+infobox
    -    |  To learn more about word vectors, how to #[strong customise them] and
    -    |  how to load #[strong your own vectors] into spaCy, see the usage
    -    |  guide on
    -    |  #[+a("/docs/usage/word-vectors-similarities") using word vectors and semantic similarities].
    -
    -+h(2, "pipelines") Pipelines
    -
    -include _spacy-101/_pipelines
    -
    -+infobox
    -    |  To learn more about #[strong how processing pipelines work] in detail,
    -    |  how to enable and disable their components, and how to
    -    |  #[strong create your own], see the usage guide on
    -    |  #[+a("/docs/usage/language-processing-pipeline") language processing pipelines].
    -
    -+h(2, "vocab") Vocab, hashes and lexemes
    -
    -include _spacy-101/_vocab
    -
    -+h(2, "serialization") Serialization
    -
    -include _spacy-101/_serialization
    -
    -+infobox
    -    |  To learn more about #[strong serialization] and how to
    -    |  #[strong save and load your own models], see the usage guide on
    -    |  #[+a("/docs/usage/saving-loading") saving, loading and data serialization].
    -
    -+h(2, "training") Training
    -
    -include _spacy-101/_training
    -
    -+infobox
    -    |  To learn more about #[strong training and updating] models, how to create
    -    |  training data and how to improve spaCy's named entity recognition models,
    -    |  see the usage guides on #[+a("/docs/usage/training") training] and
    -    |  #[+a("/docs/usage/training-ner") training the named entity recognizer].
    -
    -+h(2, "language-data") Language data
    -
    -include _spacy-101/_language-data
    -
    -+infobox
    -    |  To learn more about the individual components of the language data and
    -    |  how to #[strong add a new language] to spaCy in preparation for training
    -    |  a language model, see the usage guide on
    -    |  #[+a("/docs/usage/adding-languages") adding languages].
    -
    -+h(2, "architecture") Architecture
    -
    -include _spacy-101/_architecture.jade
    -
    -+h(2, "community") Community & FAQ
    -
    -p
    -    |  We're very happy to see the spaCy community grow and include a mix of
    -    |  people from all kinds of different backgrounds – computational
    -    |  linguistics, data science, deep learning, research and more. If you'd
    -    |  like to get involved, below are some answers to the most important
    -    |  questions and resources for further reading.
    -
    -+h(3, "faq-help-code") Help, my code isn't working!
    -
    -p
    -    |  Bugs suck, and we're doing our best to continuously improve the tests
    -    |  and fix bugs as soon as possible. Before you submit an issue, do a
    -    |  quick search and check if the problem has already been reported. If
    -    |  you're having installation or loading problems, make sure to also check
    -    |  out the #[+a("/docs/usage#troubleshooting") troubleshooting guide]. Help
    -    |  with spaCy is available via the following platforms:
    -
    -+aside("How do I know if something is a bug?")
    -    |  Of course, it's always hard to know for sure, so don't worry – we're not
    -    |  going to be mad if a bug report turns out to be a typo in your
    -    |  code. As a simple rule, any C-level error without a Python traceback,
    -    |  like a #[strong segmentation fault] or #[strong memory error],
    -    |  is #[strong always] a spaCy bug.#[br]#[br]
    -
    -    |  Because models are statistical, their performance will never be
    -    |  #[em perfect]. However, if you come across
    -    |  #[strong patterns that might indicate an underlying issue], please do
    -    |  file a report. Similarly, we also care about behaviours that
    -    |  #[strong contradict our docs].
    -
    -+table(["Platform", "Purpose"])
    -    +row
    -        +cell #[+a("https://stackoverflow.com/questions/tagged/spacy") StackOverflow]
    -        +cell
    -            |  #[strong Usage questions] and everything related to problems with
    -            |  your specific code. The StackOverflow community is much larger
    -            |  than ours, so if your problem can be solved by others, you'll
    -            |  receive help much quicker.
    -
    -    +row
    -        +cell #[+a("https://gitter.im/" + SOCIAL.gitter) Gitter chat]
    -        +cell
    -            |  #[strong General discussion] about spaCy, meeting other community
    -            |  members and exchanging #[strong tips, tricks and best practices].
    -            |  If we're working on experimental models and features, we usually
    -            |  share them on Gitter first.
    -
    -    +row
    -        +cell #[+a(gh("spaCy") + "/issues") GitHub issue tracker]
    -        +cell
    -            |  #[strong Bug reports] and #[strong improvement suggestions], i.e.
    -            |  everything that's likely spaCy's fault. This also includes
    -            |  problems with the models beyond statistical imprecisions, like
    -            |  patterns that point to a bug.
    -
    -+infobox
    -    |  Please understand that we won't be able to provide individual support via
    -    |  email. We also believe that help is much more valuable if it's shared
    -    |  publicly, so that #[strong more people can benefit from it]. If you come
    -    |  across an issue and you think you might be able to help, consider posting
    -    |  a quick update with your solution. No matter how simple, it can easily
    -    |  save someone a lot of time and headache – and the next time you need help,
    -    |  they might repay the favour.
    -
    -+h(3, "faq-contributing") How can I contribute to spaCy?
    -
    -p
    -    |  You don't have to be an NLP expert or Python pro to contribute, and we're
    -    |  happy to help you get started. If you're new to spaCy, a good place to
    -    |  start is the
    -    |  #[+a(gh("spaCy") + '/issues?q=is%3Aissue+is%3Aopen+label%3A"help+wanted+%28easy%29"') #[code help wanted (easy)] label]
    -    |  on GitHub, which we use to tag bugs and feature requests that are easy
    -    |  and self-contained. We also appreciate contributions to the docs – whether
    -    |  it's fixing a typo, improving an example or adding additional explanations.
    -    |  You'll find a "Suggest edits" link at the bottom of each page that points
    -    |  you to the source.
    -
    -p
    -    |  Another way of getting involved is to help us improve the
    -    |  #[+a("/docs/usage/adding-languages#language-data") language data] –
    -    |  especially if you happen to speak one of the languages currently in
    -    |  #[+a("/docs/api/language-models#alpha-support") alpha support]. Even
    -    |  adding simple tokenizer exceptions, stop words or lemmatizer data
    -    |  can make a big difference. It will also make it easier for us to provide
    -    |  a statistical model for the language in the future. Submitting a test
    -    |  that documents a bug or performance issue, or covers functionality that's
    -    |  especially important for your application is also very helpful. This way,
    -    |  you'll also make sure we never accidentally introduce regressions to the
    -    |  parts of the library that you care about the most.
    -
    -p
    -    strong
    -        |  For more details on the types of contributions we're looking for, the
    -        |  code conventions and other useful tips, make sure to check out the
    -        |  #[+a(gh("spaCy", "CONTRIBUTING.md")) contributing guidelines].
    -
    -+infobox("Code of Conduct")
    -    |  spaCy adheres to the
    -    |  #[+a("http://contributor-covenant.org/version/1/4/") Contributor Covenant Code of Conduct].
    -    |  By participating, you are expected to uphold this code.
    -
    -+h(3, "faq-project-with-spacy")
    -    |  I've built something cool with spaCy – how can I get the word out?
    -
    -p
    -    |  First, congrats – we'd love to check it out! When you share your
    -    |  project on Twitter, don't forget to tag
    -    |  #[+a("https://twitter.com/" + SOCIAL.twitter) @#{SOCIAL.twitter}] so we
    -    |  don't miss it. If you think your project would be a good fit for the
    -    |  #[+a("/docs/usage/showcase") showcase], #[strong feel free to submit it!]
    -    |  Tutorials are also incredibly valuable to other users and a great way to
    -    |  get exposure. So we strongly encourage #[strong writing up your experiences],
    -    |  or sharing your code and some tips and tricks on your blog. Since our
    -    |  website is open-source, you can add your project or tutorial by making a
    -    |  pull request on GitHub.
    -
    -+aside("Contributing to spacy.io")
    -    |  All showcase and tutorial links are stored in a
    -    |  #[+a(gh("spaCy", "website/docs/usage/_data.json")) JSON file], so you
    -    |  won't even have to edit any markup. For more info on how to submit
    -    |  your project, see the
    -    |  #[+a(gh("spaCy", "CONTRIBUTING.md#submitting-a-project-to-the-showcase")) contributing guidelines]
    -    |  and our #[+a(gh("spaCy", "website")) website docs].
    -
    -p
    -    |  If you would like to use the spaCy logo on your site, please get in touch
    -    |  and ask us first. However, if you want to show support and tell others
    -    |  that your project is using spaCy, you can grab one of our
    -    |  #[strong spaCy badges] here:
    -
    -- SPACY_BADGES =  ["built%20with-spaCy-09a3d5.svg", "made%20with%20❤%20and-spaCy-09a3d5.svg", "spaCy-v2-09a3d5.svg"]
    -+quickstart([{id: "badge", input_style: "check", options: SPACY_BADGES.map(function(badge, i) { return {id: i, title: "", checked: (i == 0) ? true : false}}) }], false, false, true)
    -    .c-code-block(data-qs-results)
    -        for badge, i in SPACY_BADGES
    -            - var url = "https://img.shields.io/badge/" + badge
    -            +code(false, "text", "star").o-no-block(data-qs-badge=i)=url
    -            +code(false, "text", "code").o-no-block(data-qs-badge=i).
    -                <a href="#{SITE_URL}"><img src="#{url}" height="20"></a>
    -            +code(false, "text", "markdown").o-no-block(data-qs-badge=i).
    -                [![spaCy](#{url})](#{SITE_URL})
    diff --git a/website/docs/usage/text-classification.jade b/website/docs/usage/text-classification.jade
    deleted file mode 100644
    index 33e384dbd..000000000
    --- a/website/docs/usage/text-classification.jade
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -//- 💫 DOCS > USAGE > TEXT CLASSIFICATION
    -
    -include ../../_includes/_mixins
    -
    -+under-construction
    diff --git a/website/docs/usage/training-ner.jade b/website/docs/usage/training-ner.jade
    deleted file mode 100644
    index 3c74f7a9d..000000000
    --- a/website/docs/usage/training-ner.jade
    +++ /dev/null
    @@ -1,114 +0,0 @@
    -include ../../_includes/_mixins
    -
    -p
    -    |  All #[+a("/docs/usage/models") spaCy models] support online learning, so
    -    |  you can update a pre-trained model with new examples. You can even add
    -    |  new classes to an existing model, to recognise a new entity type,
    -    |  part-of-speech, or syntactic relation. Updating an existing model is
    -    |  particularly useful as a "quick and dirty solution", if you have only a
    -    |  few corrections or annotations.
    -
    -+h(2, "improving-accuracy") Improving accuracy on existing entity types
    -
    -p
    -    |  To update the model, you first need to create an instance of
    -    |  #[+api("goldparse") #[code GoldParse]], with the entity labels
    -    |  you want to learn. You'll usually need to provide many examples to
    -    |  meaningfully improve the system — a few hundred is a good start, although
    -    |  more is better.
    -
    -+image
    -    include ../../assets/img/docs/training-loop.svg
    -    .u-text-right
    -        +button("/assets/img/docs/training-loop.svg", false, "secondary").u-text-tag View large graphic
    -
    -p
    -    |  You should avoid iterating over the same few examples multiple times, or
    -    |  the model is likely to "forget" how to annotate other examples. If you
    -    |  iterate over the same few examples, you're effectively changing the loss
    -    |  function. The optimizer will find a way to minimize the loss on your
    -    |  examples, without regard for the consequences on the examples it's no
    -    |  longer paying attention to.
    -
    -p
    -    |  One way to avoid this "catastrophic forgetting" problem is to "remind"
    -    |  the model of other examples by augmenting your annotations with sentences
    -    |  annotated with entities automatically recognised by the original model.
    -    |  Ultimately, this is an empirical process: you'll need to
    -    |  #[strong experiment on your own data] to find a solution that works best
    -    |  for you.
    -
    -+h(2, "example") Example
    -
    -+under-construction
    -
    -+code.
    -    import random
    -    from spacy.lang.en import English
    -    from spacy.gold import GoldParse, biluo_tags_from_offsets
    -
    -    def main(model_dir=None):
    -        train_data = [
    -            ('Who is Shaka Khan?',
    -                [(len('Who is '), len('Who is Shaka Khan'), 'PERSON')]),
    -            ('I like London and Berlin.',
    -                [(len('I like '), len('I like London'), 'LOC'),
    -                (len('I like London and '), len('I like London and Berlin'), 'LOC')])
    -        ]
    -        nlp = English(pipeline=['tensorizer', 'ner'])
    -        get_data = lambda: reformat_train_data(nlp.tokenizer, train_data)
    -        optimizer = nlp.begin_training(get_data)
    -        for itn in range(100):
    -            random.shuffle(train_data)
    -            losses = {}
    -            for raw_text, entity_offsets in train_data:
    -                doc = nlp.make_doc(raw_text)
    -                gold = GoldParse(doc, entities=entity_offsets)
    -                nlp.update([doc], [gold], drop=0.5, sgd=optimizer, losses=losses)
    -        nlp.to_disk(model_dir)
    -
    -+code.
    -    def reformat_train_data(tokenizer, examples):
    -        """Reformat data to match JSON format"""
    -        output = []
    -        for i, (text, entity_offsets) in enumerate(examples):
    -            doc = tokenizer(text)
    -            ner_tags = biluo_tags_from_offsets(tokenizer(text), entity_offsets)
    -            words = [w.text for w in doc]
    -            tags = ['-'] * len(doc)
    -            heads = [0] * len(doc)
    -            deps = [''] * len(doc)
    -            sentence = (range(len(doc)), words, tags, heads, deps, ner_tags)
    -            output.append((text, [(sentence, [])]))
    -        return output
    -
    -p.u-text-right
    -    +button(gh("spaCy", "examples/training/train_ner.py"), false, "secondary").u-text-tag View full example
    -
    -+h(2, "saving-loading") Saving and loading
    -
    -p
    -    |  After training our model, you'll usually want to save its state, and load
    -    |  it back later. You can do this with the
    -    |  #[+api("language#to_disk") #[code Language.to_disk()]] method:
    -
    -+code.
    -    nlp.to_disk('/home/me/data/en_technology')
    -
    -p
    -    |  To make the model more convenient to deploy, we recommend wrapping it as
    -    |  a Python package, so that you can install it via pip and load it as a
    -    |  module. spaCy comes with a handy #[+api("cli#package") #[code package]]
    -    |  CLI command to create all required files and directories.
    -
    -+code(false, "bash").
    -    spacy package /home/me/data/en_technology /home/me/my_models
    -
    -p
    -    |  To build the package and create a #[code .tar.gz] archive, run
    -    |  #[code python setup.py sdist] from within its directory.
    -
    -+infobox("Saving and loading models")
    -    |  For more information and a detailed guide on how to package your model,
    -    |  see the documentation on
    -    |  #[+a("/docs/usage/saving-loading#models") saving and loading models].
    diff --git a/website/docs/usage/tutorials.jade b/website/docs/usage/tutorials.jade
    deleted file mode 100644
    index 2b8eddbf1..000000000
    --- a/website/docs/usage/tutorials.jade
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -//- 💫 DOCS > USAGE > TUTORIALS
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  Have you written a tutorial on spaCy, or did you find one that should be
    -    |  featured here? #[a(href="mailto:#{EMAIL}") Let us know!]
    -
    -+h(2, "first-steps") First steps
    -
    -p
    -    |  These tutorials help you get started. They describe how to set up your
    -    |  environment and start using spaCy.
    -
    -+grid
    -    each details, title in first_steps
    -        +card(title, details)
    -
    -+h(2, "features") Deep dives
    -
    -p
    -    |  These tutorials take a closer look at particular features of spaCy, or
    -    |  particular types of NLP problems. Most come with more explanatory text,
    -    |  to help introduce you to new concepts.
    -
    -+grid
    -    each details, title in deep_dives
    -        +card(title, details)
    -
    -+h(2, "code") Programs and scripts
    -
    -p
    -    |  These tutorials give you all the code and nothing but the code — they're
    -    |  Python scripts you can modify and run.
    -
    -+grid
    -    each details, title in code
    -        +card(title, details)
    diff --git a/website/docs/usage/v2.jade b/website/docs/usage/v2.jade
    deleted file mode 100644
    index 6d98e3f05..000000000
    --- a/website/docs/usage/v2.jade
    +++ /dev/null
    @@ -1,531 +0,0 @@
    -//- 💫 DOCS > USAGE > WHAT'S NEW IN V2.0
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  We're very excited to finally introduce spaCy v2.0! On this page, you'll
    -    |  find a summary of the new features, information on the backwards
    -    |  incompatibilities, including a handy overview of what's been renamed or
    -    |  deprecated. To help you make the most of v2.0, we also
    -    |  #[strong re-wrote almost all of the usage guides and API docs], and added
    -    |  more real-world examples. If you're new to spaCy, or just want to brush
    -    |  up on some NLP basics and the details of the library, check out
    -    |  the #[+a("/docs/usage/spacy-101") spaCy 101 guide] that explains the most
    -    |  important concepts with examples and illustrations.
    -
    -+h(2, "summary") Summary
    -
    -+grid.o-no-block
    -    +grid-col("half")
    -
    -        p This release features
    -            |  entirely new #[strong deep learning-powered models] for spaCy's tagger,
    -            |  parser and entity recognizer. The new models are #[strong 20x smaller]
    -            |  than the linear models that have powered spaCy until now: from 300 MB to
    -            |  only 15 MB.
    -
    -        p
    -            |  We've also made several usability improvements that are
    -            |  particularly helpful for #[strong production deployments]. spaCy
    -            |  v2 now fully supports the Pickle protocol, making it easy to use
    -            |  spaCy with #[+a("https://spark.apache.org/") Apache Spark]. The
    -            |  string-to-integer mapping is #[strong no longer stateful], making
    -            |  it easy to reconcile annotations made in different processes.
    -            |  Models are smaller and use less memory, and the APIs for serialization
    -            |  are now much more consistent.
    -
    -    +table-of-contents
    -        +item #[+a("#summary") Summary]
    -        +item #[+a("#features") New features]
    -        +item #[+a("#features-pipelines") Improved processing pipelines]
    -        +item #[+a("#features-text-classification") Text classification]
    -        +item #[+a("#features-hash-ids") Hash values instead of integer IDs]
    -        +item #[+a("#features-serializer") Saving, loading and serialization]
    -        +item #[+a("#features-displacy") displaCy visualizer]
    -        +item #[+a("#features-language") Language data and lazy loading]
    -        +item #[+a("#features-matcher") Revised matcher API]
    -        +item #[+a("#features-models") Neural network models]
    -        +item #[+a("#incompat") Backwards incompatibilities]
    -        +item #[+a("#migrating") Migrating from spaCy v1.x]
    -        +item #[+a("#benchmarks") Benchmarks]
    -
    -p
    -    |  The main usability improvements you'll notice in spaCy v2.0 are around
    -    |  #[strong defining, training and loading your own models] and components.
    -    |  The new neural network models make it much easier to train a model from
    -    |  scratch, or update an existing model with a few examples. In v1.x, the
    -    |  statistical models depended on the state of the #[code Vocab]. If you
    -    |  taught the model a new word, you would have to save and load a lot of
    -    |  data — otherwise the model wouldn't correctly recall the features of your
    -    |  new example. That's no longer the case.
    -
    -p
    -    |  Due to some clever use of hashing, the statistical models
    -    |  #[strong never change size], even as they learn new vocabulary items.
    -    |  The whole pipeline is also now fully differentiable. Even if you don't
    -    |  have explicitly annotated data, you can update spaCy using all the
    -    |  #[strong latest deep learning tricks] like adversarial training, noise
    -    |  contrastive estimation or reinforcement learning.
    -
    -+h(2, "features") New features
    -
    -p
    -    |  This section contains an overview of the most important
    -    |  #[strong new features and improvements]. The #[+a("/docs/api") API docs]
    -    |  include additional  deprecation notes. New methods and functions that
    -    |  were introduced in this version are marked with a #[+tag-new(2)] tag.
    -
    -+h(3, "features-pipelines") Improved processing pipelines
    -
    -+aside-code("Example").
    -    # Modify an existing pipeline
    -    nlp = spacy.load('en')
    -    nlp.pipeline.append(my_component)
    -
    -    # Register a factory to create a component
    -    spacy.set_factory('my_factory', my_factory)
    -    nlp = Language(pipeline=['my_factory', mycomponent])
    -
    -p
    -    |  It's now much easier to #[strong customise the pipeline] with your own
    -    |  components, functions that receive a #[code Doc] object, modify and
    -    |  return it. If your component is stateful, you can define and register a
    -    |  factory which receives the shared #[code Vocab] object and returns a
    -    |  component. spaCy's default components can be added to your pipeline by
    -    |  using their string IDs. This way, you won't have to worry about finding
    -    |  and implementing them – simply add #[code "tagger"] to the pipeline,
    -    |  and spaCy will know what to do.
    -
    -+image
    -    include ../../assets/img/docs/pipeline.svg
    -
    -+infobox
    -    |  #[strong API:] #[+api("language") #[code Language]]
    -    |  #[strong Usage:] #[+a("/docs/usage/language-processing-pipeline") Processing text]
    -
    -+h(3, "features-text-classification") Text classification
    -
    -+aside-code("Example").
    -    from spacy.lang.en import English
    -    nlp = English(pipeline=['tensorizer', 'tagger', 'textcat'])
    -
    -p
    -    |  spaCy v2.0 lets you add text categorization models to spaCy pipelines.
    -    |  The model supports classification with multiple, non-mutually exclusive
    -    |  labels – so multiple labels can apply at once. You can change the model
    -    |  architecture rather easily, but by default, the #[code TextCategorizer]
    -    |  class uses a convolutional neural network to assign position-sensitive
    -    |  vectors to each word in the document.
    -
    -+infobox
    -    |  #[strong API:] #[+api("textcategorizer") #[code TextCategorizer]],
    -    |  #[+api("doc#attributes") #[code Doc.cats]],
    -    |  #[+api("goldparse#attributes") #[code GoldParse.cats]]#[br]
    -    |  #[strong Usage:] #[+a("/docs/usage/text-classification") Text classification]
    -
    -+h(3, "features-hash-ids") Hash values instead of integer IDs
    -
    -+aside-code("Example").
    -    doc = nlp(u'I love coffee')
    -    assert doc.vocab.strings[u'coffee'] == 3197928453018144401
    -    assert doc.vocab.strings[3197928453018144401] == u'coffee'
    -
    -    beer_hash = doc.vocab.strings.add(u'beer')
    -    assert doc.vocab.strings[u'beer'] == beer_hash
    -    assert doc.vocab.strings[beer_hash] == u'beer'
    -
    -p
    -    |  The #[+api("stringstore") #[code StringStore]] now resolves all strings
    -    |  to hash values instead of integer IDs. This means that the string-to-int
    -    |  mapping #[strong no longer depends on the vocabulary state], making a lot
    -    |  of workflows much simpler, especially during training. Unlike integer IDs
    -    |  in spaCy v1.x, hash values will #[strong always match] – even across
    -    |  models. Strings can now be added explicitly using the new
    -    |  #[+api("stringstore#add") #[code Stringstore.add]] method. A token's hash
    -    |  is available via #[code token.orth].
    -
    -+infobox
    -    |  #[strong API:] #[+api("stringstore") #[code StringStore]]
    -    |  #[strong Usage:] #[+a("/docs/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
    -
    -+h(3, "features-serializer") Saving, loading and serialization
    -
    -+aside-code("Example").
    -    nlp = spacy.load('en') # shortcut link
    -    nlp = spacy.load('en_core_web_sm') # package
    -    nlp = spacy.load('/path/to/en') # unicode path
    -    nlp = spacy.load(Path('/path/to/en')) # pathlib Path
    -
    -    nlp.to_disk('/path/to/nlp')
    -    nlp = English().from_disk('/path/to/nlp')
    -
    -p
    -    |  spay's serialization API has been made consistent across classes and
    -    |  objects. All container classes, i.e. #[code Language], #[code Doc],
    -    |  #[code Vocab] and #[code StringStore] now have a #[code to_bytes()],
    -    |  #[code from_bytes()], #[code to_disk()] and #[code from_disk()] method
    -    |  that supports the Pickle protocol.
    -
    -p
    -    |  The improved #[code spacy.load] makes loading models easier and more
    -    |  transparent. You can load a model by supplying its
    -    |  #[+a("/docs/usage/models#usage") shortcut link], the name of an installed
    -    |  #[+a("/docs/usage/saving-loading#generating") model package] or a path.
    -    |  The #[code Language] class to initialise will be determined based on the
    -    |  model's settings. For a blank language, you can import the class directly,
    -    |  e.g. #[code from spacy.lang.en import English].
    -
    -+infobox
    -    |  #[strong API:] #[+api("spacy#load") #[code spacy.load]], #[+api("binder") #[code Binder]]
    -    |  #[strong Usage:] #[+a("/docs/usage/saving-loading") Saving and loading]
    -
    -+h(3, "features-displacy") displaCy visualizer with Jupyter support
    -
    -+aside-code("Example").
    -    from spacy import displacy
    -    doc = nlp(u'This is a sentence about Facebook.')
    -    displacy.serve(doc, style='dep') # run the web server
    -    html = displacy.render(doc, style='ent') # generate HTML
    -
    -p
    -    |  Our popular dependency and named entity visualizers are now an official
    -    |  part of the spaCy library! displaCy can run a simple web server, or
    -    |  generate raw HTML markup or SVG files to be exported. You can pass in one
    -    |  or more docs, and customise the style. displaCy also auto-detects whether
    -    |  you're running #[+a("https://jupyter.org") Jupyter] and will render the
    -    |  visualizations in your notebook.
    -
    -+infobox
    -    |  #[strong API:] #[+api("displacy") #[code displacy]]
    -    |  #[strong Usage:] #[+a("/docs/usage/visualizers") Visualizing spaCy]
    -
    -+h(3, "features-language") Improved language data and lazy loading
    -
    -p
    -    |  Language-specfic data now lives in its own submodule, #[code spacy.lang].
    -    |  Languages are lazy-loaded, i.e. only loaded when you import a
    -    |  #[code Language] class, or load a model that initialises one. This allows
    -    |  languages to contain more custom data, e.g. lemmatizer lookup tables, or
    -    |  complex regular expressions. The language data has also been tidied up
    -    |  and simplified. spaCy now also supports simple lookup-based lemmatization.
    -
    -+infobox
    -    |  #[strong API:] #[+api("language") #[code Language]]
    -    |  #[strong Code:] #[+src(gh("spaCy", "spacy/lang")) spacy/lang]
    -    |  #[strong Usage:] #[+a("/docs/usage/adding-languages") Adding languages]
    -
    -+h(3, "features-matcher") Revised matcher API
    -
    -+aside-code("Example").
    -    from spacy.matcher import Matcher
    -    matcher = Matcher(nlp.vocab)
    -    matcher.add('HEARTS', None, [{'ORTH': '❤️', 'OP': '+'}])
    -    assert len(matcher) == 1
    -    assert 'HEARTS' in matcher
    -
    -p
    -    |  Patterns can now be added to the matcher by calling
    -    |  #[+api("matcher-add") #[code matcher.add()]] with a match ID, an optional
    -    |  callback function to be invoked on each match, and one or more patterns.
    -    |  This allows you to write powerful, pattern-specific logic using only one
    -    |  matcher. For example, you might only want to merge some entity types,
    -    |  and set custom flags for other matched patterns.
    -
    -+infobox
    -    |  #[strong API:] #[+api("matcher") #[code Matcher]]
    -    |  #[strong Usage:] #[+a("/docs/usage/rule-based-matching") Rule-based matching]
    -
    -+h(3, "features-models") Neural network models for English, German, French, Spanish and multi-language NER
    -
    -+aside-code("Example", "bash").
    -    spacy download en # default English model
    -    spacy download de # default German model
    -    spacy download fr # default French model
    -    spacy download es # default Spanish model
    -    spacy download xx_ent_wiki_sm # multi-language NER
    -
    -p
    -    |  spaCy v2.0 comes with new and improved neural network models for English,
    -    |  German, French and Spanish, as well as a multi-language named entity
    -    |  recognition model trained on Wikipedia. #[strong GPU usage] is now
    -    |  supported via #[+a("http://chainer.org") Chainer]'s CuPy module.
    -
    -+infobox
    -    |  #[strong Details:] #[+a("/docs/api/language-models") Languages],
    -    |  #[+src(gh("spacy-models")) spacy-models]
    -    |  #[strong Usage:] #[+a("/docs/usage/models") Models],
    -    |  #[+a("/docs/usage#gpu") Using spaCy with GPU]
    -
    -+h(2, "incompat") Backwards incompatibilities
    -
    -+table(["Old", "New"])
    -    +row
    -        +cell
    -            |  #[code spacy.en]
    -            |  #[code spacy.xx]
    -        +cell
    -            |  #[code spacy.lang.en]
    -            |  #[code spacy.lang.xx]
    -
    -    +row
    -        +cell #[code orth]
    -        +cell #[code lang.xx.lex_attrs]
    -
    -    +row
    -        +cell #[code syntax.iterators]
    -        +cell #[code lang.xx.syntax_iterators]
    -
    -    +row
    -        +cell #[code Language.save_to_directory]
    -        +cell #[+api("language#to_disk") #[code Language.to_disk]]
    -
    -    +row
    -        +cell #[code Language.create_make_doc]
    -        +cell #[+api("language#attributes") #[code Language.tokenizer]]
    -
    -    +row
    -        +cell
    -            |  #[code Vocab.load]
    -            |  #[code Vocab.load_lexemes]
    -        +cell
    -            |  #[+api("vocab#from_disk") #[code Vocab.from_disk]]
    -            |  #[+api("vocab#from_bytes") #[code Vocab.from_bytes]]
    -
    -    +row
    -        +cell
    -            |  #[code Vocab.dump]
    -        +cell
    -            |  #[+api("vocab#to_disk") #[code Vocab.to_disk]]#[br]
    -            |  #[+api("vocab#to_bytes") #[code Vocab.to_bytes]]
    -
    -    +row
    -        +cell
    -            |  #[code Vocab.load_vectors]
    -            |  #[code Vocab.load_vectors_from_bin_loc]
    -        +cell
    -            |  #[+api("vectors#from_disk") #[code Vectors.from_disk]]
    -            |  #[+api("vectors#from_bytes") #[code Vectors.from_bytes]]
    -
    -    +row
    -        +cell
    -            |  #[code Vocab.dump_vectors]
    -        +cell
    -            |  #[+api("vectors#to_disk") #[code Vectors.to_disk]]
    -            |  #[+api("vectors#to_bytes") #[code Vectors.to_bytes]]
    -
    -    +row
    -        +cell
    -            |  #[code StringStore.load]
    -        +cell
    -            |  #[+api("stringstore#from_disk") #[code StringStore.from_disk]]
    -            |  #[+api("stringstore#from_bytes") #[code StringStore.from_bytes]]
    -
    -    +row
    -        +cell
    -            |  #[code StringStore.dump]
    -        +cell
    -            |  #[+api("stringstore#to_disk") #[code StringStore.to_disk]]
    -            |  #[+api("stringstore#to_bytes") #[code StringStore.to_bytes]]
    -
    -    +row
    -        +cell #[code Tokenizer.load]
    -        +cell
    -            |  #[+api("tokenizer#from_disk") #[code Tokenizer.from_disk]]
    -            |  #[+api("tokenizer#from_bytes") #[code Tokenizer.from_bytes]]
    -
    -    +row
    -        +cell #[code Tagger.load]
    -        +cell
    -            |  #[+api("tagger#from_disk") #[code Tagger.from_disk]]
    -            |  #[+api("tagger#from_bytes") #[code Tagger.from_bytes]]
    -
    -    +row
    -        +cell #[code DependencyParser.load]
    -        +cell
    -            |  #[+api("dependencyparser#from_disk") #[code DependencyParser.from_disk]]
    -            |  #[+api("dependencyparser#from_bytes") #[code DependencyParser.from_bytes]]
    -
    -    +row
    -        +cell #[code EntityRecognizer.load]
    -        +cell
    -            |  #[+api("entityrecognizer#from_disk") #[code EntityRecognizer.from_disk]]
    -            |  #[+api("entityrecognizer#from_bytes") #[code EntityRecognizer.from_bytes]]
    -
    -    +row
    -        +cell #[code Matcher.load]
    -        +cell -
    -
    -    +row
    -        +cell
    -            |  #[code Matcher.add_pattern]
    -            |  #[code Matcher.add_entity]
    -        +cell #[+api("matcher#add") #[code Matcher.add]]
    -
    -    +row
    -        +cell #[code Matcher.get_entity]
    -        +cell #[+api("matcher#get") #[code Matcher.get]]
    -
    -    +row
    -        +cell #[code Matcher.has_entity]
    -        +cell #[+api("matcher#contains") #[code Matcher.__contains__]]
    -
    -    +row
    -        +cell #[code Doc.read_bytes]
    -        +cell #[+api("binder") #[code Binder]]
    -
    -    +row
    -        +cell #[code Token.is_ancestor_of]
    -        +cell #[+api("token#is_ancestor") #[code Token.is_ancestor]]
    -
    -    +row
    -        +cell #[code cli.model]
    -        +cell -
    -
    -+h(2, "migrating") Migrating from spaCy 1.x
    -
    -p
    -    |  Because we'e made so many architectural changes to the library, we've
    -    |  tried to #[strong keep breaking changes to a minimum]. A lot of projects
    -    |  follow the philosophy that if you're going to break anything, you may as
    -    |  well break everything. We think migration is easier if there's a logic to
    -    |  what has changed.
    -
    -p
    -    |  We've therefore followed a policy of avoiding breaking changes to the
    -    |  #[code Doc], #[code Span] and #[code Token] objects. This way, you can
    -    |  focus on only migrating the code that does training, loading and
    -    |  serialization — in other words, code that works with the #[code nlp]
    -    |  object directly. Code that uses the annotations should continue to work.
    -
    -+infobox("Important note")
    -    |  If you've trained your own models, keep in mind that your train and
    -    |  runtime inputs must match. This means you'll have to
    -    |  #[strong retrain your models] with spaCy v2.0.
    -
    -+h(3, "migrating-saving-loading") Saving, loading and serialization
    -
    -p
    -    |  Double-check all calls to #[code spacy.load()] and make sure they don't
    -    |  use the #[code path] keyword argument. If you're only loading in binary
    -    |  data and not a model package that can construct its own #[code Language]
    -    |  class and pipeline, you should now use the
    -    |  #[+api("language#from_disk") #[code Language.from_disk()]] method.
    -
    -+code-new.
    -    nlp = spacy.load('/model')
    -    nlp = English().from_disk('/model/data')
    -+code-old nlp = spacy.load('en', path='/model')
    -
    -p
    -    |  Review all other code that writes state to disk or bytes.
    -    |  All containers, now share the same, consistent API for saving and
    -    |  loading. Replace saving with #[code to_disk()] or #[code to_bytes()], and
    -    |  loading with #[code from_disk()] and #[code from_bytes()].
    -
    -+code-new.
    -    nlp.to_disk('/model')
    -    nlp.vocab.to_disk('/vocab')
    -
    -+code-old.
    -    nlp.save_to_directory('/model')
    -    nlp.vocab.dump('/vocab')
    -
    -p
    -    |  If you've trained models with input from v1.x, you'll need to
    -    |  #[strong retrain them] with spaCy v2.0. All previous models will not
    -    |  be compatible with the new version.
    -
    -+h(3, "migrating-strings") Strings and hash values
    -
    -p
    -    |  The change from integer IDs to hash values may not actually affect your
    -    |  code very much. However, if you're adding strings to the vocab manually,
    -    |  you now need to call #[+api("stringstore#add") #[code StringStore.add()]]
    -    |  explicitly. You can also now be sure that the string-to-hash mapping will
    -    |  always match across vocabularies.
    -
    -+code-new.
    -    nlp.vocab.strings.add(u'coffee')
    -    nlp.vocab.strings[u'coffee']       # 3197928453018144401
    -    other_nlp.vocab.strings[u'coffee'] # 3197928453018144401
    -
    -+code-old.
    -    nlp.vocab.strings[u'coffee']       # 3672
    -    other_nlp.vocab.strings[u'coffee'] # 40259
    -
    -+h(3, "migrating-languages") Processing pipelines and language data
    -
    -p
    -    |  If you're importing language data or #[code Language] classes, make sure
    -    |  to change your import statements to import from #[code spacy.lang]. If
    -    |  you've added your own custom language, it needs to be moved to
    -    |  #[code spacy/lang/xx] and adjusted accordingly.
    -
    -+code-new from spacy.lang.en import English
    -+code-old from spacy.en import English
    -
    -p
    -    |  If you've been using custom pipeline components, check out the new
    -    |  guide on #[+a("/docs/usage/language-processing-pipelines") processing pipelines].
    -    |  Appending functions to the pipeline still works – but you might be able
    -    |  to make this more convenient by registering "component factories".
    -    |  Components of the processing pipeline can now be disabled by passing a
    -    |  list of their names to the #[code disable] keyword argument on loading
    -    |  or processing.
    -
    -+code-new.
    -    nlp = spacy.load('en', disable=['tagger', 'ner'])
    -    doc = nlp(u"I don't want parsed", disable=['parser'])
    -+code-old.
    -    nlp = spacy.load('en', tagger=False, entity=False)
    -    doc = nlp(u"I don't want parsed", parse=False)
    -
    -+h(3, "migrating-matcher") Adding patterns and callbacks to the matcher
    -
    -p
    -    |  If you're using the matcher, you can now add patterns in one step. This
    -    |  should be easy to update – simply merge the ID, callback and patterns
    -    |  into one call to #[+api("matcher#add") #[code Matcher.add()]].
    -
    -+code-new.
    -    matcher.add('GoogleNow', merge_phrases, [{ORTH: 'Google'}, {ORTH: 'Now'}])
    -
    -+code-old.
    -    matcher.add_entity('GoogleNow', on_match=merge_phrases)
    -    matcher.add_pattern('GoogleNow', [{ORTH: 'Google'}, {ORTH: 'Now'}])
    -
    -p
    -    |  If you've been using #[strong acceptor functions], you'll need to move
    -    |  this logic into the
    -    |  #[+a("/docs/usage/rule-based-matching#on_match") #[code on_match] callbacks].
    -    |  The callback function is invoked on every match and will give you access to
    -    |  the doc, the index of the current match and all total matches. This lets
    -    |  you both accept or reject the match, and define the actions to be
    -    |  triggered.
    -
    -+h(2, "benchmarks") Benchmarks
    -
    -+under-construction
    -
    -+aside("Data sources")
    -    |  #[strong Parser, tagger, NER:] #[+a("https://www.gabormelli.com/RKB/OntoNotes_Corpus") OntoNotes 5]#[br]
    -    |  #[strong Word vectors:] #[+a("http://commoncrawl.org") Common Crawl]#[br]
    -
    -p The evaluation was conducted on raw text with no gold standard information.
    -
    -+table(["Model", "Version", "Type", "UAS", "LAS", "NER F", "POS", "w/s"])
    -    mixin benchmark-row(name, details, values, highlight, style)
    -        +row(style)
    -            +cell #[code=name]
    -            for cell in details
    -                +cell=cell
    -            for cell, i in values
    -                +cell.u-text-right
    -                    if highlight && highlight[i]
    -                        strong=cell
    -                    else
    -                        !=cell
    -
    -    +benchmark-row("en_core_web_sm", ["2.0.0", "neural"], ["91.2", "89.2", "82.6", "96.6", "10,300"], [1, 1, 1, 0, 0])
    -    +benchmark-row("en_core_web_sm", ["1.2.0", "linear"], ["86.6", "83.8", "78.5", "96.6", "25,700"], [0, 0, 0, 0, 1], "divider")
    -    +benchmark-row("en_core_web_md", ["1.2.1", "linear"], ["90.6", "88.5", "81.4", "96.7", "18,800"], [0, 0, 0, 1, 0])
    diff --git a/website/docs/usage/adding-languages.jade b/website/usage/_adding-languages/_language-data.jade
    similarity index 62%
    rename from website/docs/usage/adding-languages.jade
    rename to website/usage/_adding-languages/_language-data.jade
    index b341c9f9b..81a6d638e 100644
    --- a/website/docs/usage/adding-languages.jade
    +++ b/website/usage/_adding-languages/_language-data.jade
    @@ -1,58 +1,4 @@
    -//- 💫 DOCS > USAGE > ADDING LANGUAGES
    -
    -include ../../_includes/_mixins
    -
    -p
    -        |  Adding full support for a language touches many different parts of the
    -        |  spaCy library. This guide explains how to fit everything together, and
    -        |  points you to the specific workflows for each component.
    -
    -+aside("Working on spaCy's source")
    -    |  To add a new language to spaCy, you'll need to
    -    |  #[strong modify the library's code]. The easiest way to do this is to
    -    |  clone the #[+src(gh("spaCy")) repository] and #[strong build spaCy from source].
    -    |  For more information on this, see the #[+a("/docs/usage") installation guide].
    -    |  Unlike spaCy's core, which is mostly written in Cython, all language
    -    |  data is stored in regular Python files. This means that you won't have to
    -    |  rebuild anything in between – you can simply make edits and reload spaCy
    -    |  to test them.
    -
    -+grid.o-no-block
    -    +grid-col("half")
    -        p
    -            |  Obviously, there are lots of ways you can organise your code when
    -            |  you implement your own language data. This guide will focus on
    -            |  how it's done within spaCy. For full language support, you'll
    -            |  need to create a #[code Language] subclass, define custom
    -            |  #[strong language data], like a stop list and tokenizer
    -            |  exceptions and test the new tokenizer. Once the language is set
    -            |  up, you can #[strong build the vocabulary], including word
    -            |  frequencies, Brown clusters and word vectors. Finally, you can
    -            |  #[strong train the tagger and parser], and save the model to a
    -            |  directory.
    -
    -        p
    -            |  For some languages, you may also want to develop a solution for
    -            |  lemmatization and morphological analysis.
    -
    -    +table-of-contents
    -        +item #[+a("#101") Language data 101]
    -        +item #[+a("#language-subclass") The Language subclass]
    -        +item #[+a("#stop-words") Stop words]
    -        +item #[+a("#tokenizer-exceptions") Tokenizer exceptions]
    -        +item #[+a("#norm-exceptions") Norm exceptions]
    -        +item #[+a("#lex-attrs") Lexical attributes]
    -        +item #[+a("#syntax-iterators") Syntax iterators]
    -        +item #[+a("#lemmatizer") Lemmatizer]
    -        +item #[+a("#tag-map") Tag map]
    -        +item #[+a("#morph-rules") Morph rules]
    -        +item #[+a("#testing") Testing the tokenizer]
    -        +item #[+a("#vocabulary") Building the vocabulary]
    -        +item #[+a("#training") Training]
    -
    -+h(2, "101") Language data 101
    -
    -include _spacy-101/_language-data
    +//- 💫 DOCS > USAGE > ADDING LANGUAGES > LANGUAGE DATA
     
     p
         |  The individual components #[strong expose variables] that can be imported
    @@ -137,7 +83,7 @@ p
     
     +aside("Should I ever update the global data?")
         |  Reuseable language data is collected as atomic pieces in the root of the
    -    |  #[+src(gh("spaCy", "lang")) spacy.lang] package. Often, when a new
    +    |  #[+src(gh("spaCy", "lang")) #[code spacy.lang]] package. Often, when a new
         |  language is added, you'll find a pattern or symbol that's missing. Even
         |  if it isn't common in other languages, it might be best to add it to the
         |  shared language data, unless it has some conflicting interpretation. For
    @@ -150,14 +96,14 @@ p
         |  needs to know the language's character set. If the language you're adding
         |  uses non-latin characters, you might need to add the required character
         |  classes to the global
    -    |  #[+src(gh("spacy", "spacy/lang/char_classes.py")) char_classes.py].
    +    |  #[+src(gh("spacy", "spacy/lang/char_classes.py")) #[code char_classes.py]].
         |  spaCy uses the #[+a("https://pypi.python.org/pypi/regex/") #[code regex] library]
         |  to keep this simple and readable. If the language requires very specific
         |  punctuation rules, you should consider overwriting the default regular
         |  expressions with your own in the language's #[code Defaults].
     
     
    -+h(2, "language-subclass") Creating a #[code Language] subclass
    ++h(3, "language-subclass") Creating a #[code Language] subclass
     
     p
         |  Language-specific code and resources should be organised into a
    @@ -250,7 +196,7 @@ p
     +h(3, "tokenizer-exceptions") Tokenizer exceptions
     
     p
    -    |  spaCy's #[+a("/docs/usage/customizing-tokenizer#how-tokenizer-works") tokenization algorithm]
    +    |  spaCy's #[+a("/usage/linguistic-features#how-tokenizer-works") tokenization algorithm]
         |  lets you deal with whitespace-delimited chunks separately. This makes it
         |  easy to define special-case rules, without worrying about how they
         |  interact with the rest of the tokenizer. Whenever the key string is
    @@ -284,7 +230,7 @@ p
         |  efficiently and make your data less verbose. How you do this ultimately
         |  depends on the language. Here's an example of how exceptions for time
         |  formats like "1a.m." and "1am" are generated in the English
    -    |  #[+src(gh("spaCy", "spacy/en/lang/tokenizer_exceptions.py")) tokenizer_exceptions.py]:
    +    |  #[+src(gh("spaCy", "spacy/en/lang/tokenizer_exceptions.py")) #[code tokenizer_exceptions.py]]:
     
     +code("tokenizer_exceptions.py (excerpt)").
         # use short, internal variable for readability
    @@ -376,7 +322,7 @@ p
     p
         |  Norm exceptions can be provided as a simple dictionary. For more examples,
         |  see the English
    -    |  #[+src(gh("spaCy", "spacy/lang/en/norm_exceptions.py")) norm_exceptions.py].
    +    |  #[+src(gh("spaCy", "spacy/lang/en/norm_exceptions.py")) #[code norm_exceptions.py]].
     
     +code("Example").
         NORM_EXCEPTIONS = {
    @@ -428,7 +374,7 @@ p
     
     p
         |  Here's an example from the English
    -    |  #[+src(gh("spaCy", "spacy/en/lang/lex_attrs.py")) lex_attrs.py]:
    +    |  #[+src(gh("spaCy", "spacy/en/lang/lex_attrs.py")) #[code lex_attrs.py]]:
     
     +code("lex_attrs.py").
         _num_words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
    @@ -466,7 +412,7 @@ p
         |  Syntax iterators are functions that compute views of a #[code Doc]
         |  object based on its syntax. At the moment, this data is only used for
         |  extracting
    -    |  #[+a("/docs/usage/dependency-parse#noun-chunks") noun chunks], which
    +    |  #[+a("/usage/linguistic-features#noun-chunks") noun chunks], which
         |  are available as the #[+api("doc#noun_chunks") #[code Doc.noun_chunks]]
         |  property. Because base noun phrases work differently across languages,
         |  the rules to compute them are part of the individual language's data. If
    @@ -479,13 +425,14 @@ p
         assert chunks[0].text == "A phrase"
         assert chunks[1].text == "another phrase"
     
    -+table(["Language", "Source"])
    -    for lang, lang_id in {en: "English", de: "German", es: "Spanish"}
    ++table(["Language", "Code", "Source"])
    +    for lang in ["en", "de", "fr", "es"]
             +row
    -            +cell=lang
    +            +cell=LANGUAGES[lang]
    +            +cell #[code=lang]
                 +cell
    -                +src(gh("spaCy", "spacy/lang/" + lang_id + "/syntax_iterators.py"))
    -                    |  lang/#{lang_id}/syntax_iterators.py
    +                +src(gh("spaCy", "spacy/lang/" + lang + "/syntax_iterators.py"))
    +                    code lang/#{lang}/syntax_iterators.py
     
     +h(3, "lemmatizer") Lemmatizer
     
    @@ -547,7 +494,7 @@ p
         |  #[+a("http://universaldependencies.org/u/pos/all.html") Universal Dependencies]
         |  tags. Optionally, you can also include morphological features or other
         |  token attributes in the tag map as well. This allows you to do simple
    -    |  #[+a("/docs/usage/pos-tagging#rule-based-morphology") rule-based morphological analysis].
    +    |  #[+a("/usage/linguistic-features#rule-based-morphology") rule-based morphological analysis].
     
     +code("Example").
         from ..symbols import POS, NOUN, VERB, DET
    @@ -560,233 +507,62 @@ p
     
     +h(3, "morph-rules") Morph rules
     
    -+under-construction
    +p
    +    |  The morphology rules let you set token attributes such as lemmas, keyed
    +    |  by the extended part-of-speech tag and token text. The morphological
    +    |  features and their possible values are language-specific and based on the
    +    |  #[+a("http://universaldependencies.org") Universal Dependencies scheme].
     
    -+h(2, "testing") Testing the new language tokenizer
    +
    ++code("Example").
    +    from ..symbols import LEMMA
    +
    +    MORPH_RULES = {
    +        "VBZ": {
    +            "am": {LEMMA: "be", "VerbForm": "Fin", "Person": "One", "Tense": "Pres", "Mood": "Ind"},
    +            "are": {LEMMA: "be", "VerbForm": "Fin", "Person": "Two", "Tense": "Pres", "Mood": "Ind"},
    +            "is": {LEMMA: "be", "VerbForm": "Fin", "Person": "Three", "Tense": "Pres", "Mood": "Ind"},
    +            "'re": {LEMMA: "be", "VerbForm": "Fin", "Person": "Two", "Tense": "Pres", "Mood": "Ind"},
    +            "'s": {LEMMA: "be", "VerbForm": "Fin", "Person": "Three", "Tense": "Pres", "Mood": "Ind"}
    +        }
    +    }
     
     p
    -    |  Before using the new language or submitting a
    -    |  #[+a(gh("spaCy") + "/pulls") pull request] to spaCy, you should make sure
    -    |  it works as expected. This is especially important if you've added custom
    -    |  regular expressions for token matching or punctuation – you don't want to
    -    |  be causing regressions.
    +    |  In the example of #[code "am"], the attributes look like this:
     
    -+aside("spaCy's test suite")
    -    |  spaCy uses the #[+a("https://docs.pytest.org/en/latest/") pytest framework]
    -    |  for testing. For more details on how the tests are structured and best
    -    |  practices for writing your own tests, see our
    -    |  #[+a(gh("spaCy", "spacy/tests")) tests documentation].
    ++table(["Attribute", "Description"])
    +    +row
    +        +cell #[code LEMMA: "be"]
    +        +cell Base form, e.g. "to be".
     
    -+h(3, "testing-tokenizer") Testing the basic tokenizer
    +    +row
    +        +cell #[code "VerbForm": "Fin"]
    +        +cell
    +            |  Finite verb. Finite verbs have a subject and can be the root of
    +            |  an independent clause – "I am." is a valid, complete
    +            |  sentence.
     
    -p
    -    |  The easiest way to test your new tokenizer is to run the
    -    |  language-independent "tokenizer sanity" tests located in
    -    |  #[+src(gh("spaCy", "spacy/tests/tokenizer")) tests/tokenizer]. This will
    -    |  test for basic behaviours like punctuation splitting, URL matching and
    -    |  correct handling of whitespace. In the
    -    |  #[+src(gh("spaCy", "spacy/tests/conftest.py")) conftest.py], add the new
    -    |  language ID to the list of #[code _languages]:
    +    +row
    +        +cell #[code "Person": "One"]
    +        +cell First person, i.e. "#[strong I] am".
     
    -+code.
    -    _languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'it', 'nb',
    -                  'nl', 'pl', 'pt', 'sv', 'xx'] # new language here
    +    +row
    +        +cell #[code "Tense": "Pres"]
    +        +cell
    +            |  Present tense, i.e. actions that are happening right now or
    +            |  actions that usually happen.
     
    -+aside-code("Global tokenizer test example").
    -    # use fixture by adding it as an argument
    -    def test_with_all_languages(tokenizer):
    -        # will be performed on ALL language tokenizers
    -        tokens = tokenizer(u'Some text here.')
    +    +row
    +        +cell #[code "Mood": "Ind"]
    +        +cell
    +            |  Indicative, i.e. something happens, has happened or will happen
    +            |  (as opposed to imperative or conditional).
     
    -p
    -    |  The language will now be included in the #[code tokenizer] test fixture,
    -    |  which is used by the basic tokenizer tests. If you want to add your own
    -    |  tests that should be run over all languages, you can use this fixture as
    -    |  an argument of your test function.
     
    -+h(3, "testing-custom") Writing language-specific tests
    -
    -p
    -    |  It's recommended to always add at least some tests with examples specific
    -    |  to the language. Language tests should be located in
    -    |  #[+src(gh("spaCy", "spacy/tests/lang")) tests/lang] in a directory named
    -    |  after the language ID. You'll also need to create a fixture for your
    -    |  tokenizer in the #[+src(gh("spaCy", "spacy/tests/conftest.py")) conftest.py].
    -    |  Always use the #[code get_lang_class()] helper function within the fixture,
    -    |  instead of importing the class at the top of the file. This will load the
    -    |  language data only when it's needed. (Otherwise, #[em all data] would be
    -    |  loaded every time you run a test.)
    -
    -+code.
    -    @pytest.fixture
    -    def en_tokenizer():
    -        return util.get_lang_class('en').Defaults.create_tokenizer()
    -
    -p
    -    |  When adding test cases, always
    -    |  #[+a(gh("spaCy", "spacy/tests#parameters")) #[code parametrize]] them –
    -    |  this will make it easier for others to add more test cases without having
    -    |  to modify the test itself. You can also add parameter tuples, for example,
    -    |  a test sentence and its expected length, or a list of expected tokens.
    -    |  Here's an example of an English tokenizer test for combinations of
    -    |  punctuation and abbreviations:
    -
    -+code("Example test").
    -    @pytest.mark.parametrize('text,length', [
    -        ("The U.S. Army likes Shock and Awe.", 8),
    -        ("U.N. regulations are not a part of their concern.", 10),
    -        ("“Isn't it?”", 6)])
    -    def test_en_tokenizer_handles_punct_abbrev(en_tokenizer, text, length):
    -        tokens = en_tokenizer(text)
    -        assert len(tokens) == length
    -
    -+h(2, "vocabulary") Building the vocabulary
    -
    -+under-construction
    -
    -p
    -    |  spaCy expects that common words will be cached in a
    -    |  #[+api("vocab") #[code Vocab]] instance. The vocabulary caches lexical
    -    |  features, and makes it easy to use information from unlabelled text
    -    |  samples in your models. Specifically, you'll usually want to collect
    -    |  word frequencies, and train two types of distributional similarity model:
    -    |  Brown clusters, and word vectors. The Brown clusters are used as features
    -    |  by linear models, while the word vectors are useful for lexical
    -    |  similarity models and deep learning.
    -
    -+h(3, "word-frequencies") Word frequencies
    -
    -p
    -    |  To generate the word frequencies from a large, raw corpus, you can use the
    -    |  #[+src(gh("spacy-dev-resources", "training/word_freqs.py")) word_freqs.py]
    -    |  script from the spaCy developer resources. Note that your corpus should
    -    |  not be preprocessed (i.e. you need punctuation for example). The
    -    |  #[+api("cli#model") #[code model]] command expects a tab-separated word
    -    |  frequencies file with three columns:
    -
    -+list("numbers")
    -    +item The number of times the word occurred in your language sample.
    -    +item The number of distinct documents the word occurred in.
    -    +item The word itself.
    -
    -p
    -    |  An example word frequencies file could look like this:
    -
    -+code("es_word_freqs.txt", "text").
    -    6361109	111	Aunque
    -    23598543	111	aunque
    -    10097056	111	claro
    -    193454	111	aro
    -    7711123	111	viene
    -    12812323	111	mal
    -    23414636	111	momento
    -    2014580	111	felicidad
    -    233865	111	repleto
    -    15527	111	eto
    -    235565	111	deliciosos
    -    17259079	111	buena
    -    71155	111	Anímate
    -    37705	111	anímate
    -    33155	111	cuéntanos
    -    2389171	111	cuál
    -    961576	111	típico
    -
    -p
    -    |  You should make sure you use the spaCy tokenizer for your
    -    |  language to segment the text for your word frequencies. This will ensure
    -    |  that the frequencies refer to the same segmentation standards you'll be
    -    |  using at run-time. For instance, spaCy's English tokenizer segments
    -    |  "can't" into two tokens. If we segmented the text by whitespace to
    -    |  produce the frequency counts, we'll have incorrect frequency counts for
    -    |  the tokens "ca" and "n't".
    -
    -+h(3, "brown-clusters") Training the Brown clusters
    -
    -p
    -    |  spaCy's tagger, parser and entity recognizer are designed to use
    -    |  distributional similarity features provided by the
    -    |  #[+a("https://github.com/percyliang/brown-cluster") Brown clustering algorithm].
    -    |  You should train a model with between 500 and 1000 clusters. A minimum
    -    |  frequency threshold of 10 usually works well.
    -
    -p
    -    |  An example clusters file could look like this:
    -
    -+code("es_clusters.data", "text").
    -    0000	Vestigial	1
    -    0000	Vesturland	1
    -    0000	Veyreau	1
    -    0000	Veynes	1
    -    0000	Vexilografía	1
    -    0000	Vetrigne	1
    -    0000	Vetónica	1
    -    0000	Asunden	1
    -    0000	Villalambrús	1
    -    0000	Vichuquén	1
    -    0000	Vichtis	1
    -    0000	Vichigasta	1
    -    0000	VAAH	1
    -    0000	Viciebsk	1
    -    0000	Vicovaro	1
    -    0000	Villardeveyo	1
    -    0000	Vidala	1
    -    0000	Videoguard	1
    -    0000	Vedás	1
    -    0000	Videocomunicado	1
    -    0000	VideoCrypt	1
    -
    -+h(3, "word-vectors") Training the word vectors
    -
    -+under-construction
    -
    -p
    -    |  #[+a("https://en.wikipedia.org/wiki/Word2vec") Word2vec] and related
    -    |  algorithms let you train useful word similarity models from unlabelled
    -    |  text. This is a key part of using
    -    |  #[+a("/docs/usage/deep-learning") deep learning] for NLP with limited
    -    |  labelled data. The vectors are also useful by themselves – they power
    -    |  the #[code .similarity()] methods in spaCy. For best results, you should
    -    |  pre-process the text with spaCy before training the Word2vec model. This
    -    |  ensures your tokenization will match.
    -
    -p
    -    | You can use our
    -    |  #[+src(gh("spacy-dev-resources", "training/word_vectors.py")) word vectors training script],
    -    |  which pre-processes the text with your language-specific tokenizer and
    -    |  trains the model using #[+a("https://radimrehurek.com/gensim/") Gensim].
    -    |  The #[code vectors.bin] file should consist of one word and vector per line.
    -
    -//-+aside-code("your_data_directory", "yaml").
    -    ├── vocab/
    -    |   ├── lexemes.bin
    -    |   ├── strings.json
    -    |   └── oov_prob
    -    ├── pos/
    -    |   ├── model
    -    |   └── config.json
    -    ├── deps/
    -    |   ├── model
    -    |   └── config.json
    -    └── ner/
    -        ├── model
    -        └── config.json
    -
    -+h(2, "train-tagger-parser") Training the tagger and parser
    -
    -+under-construction
    -
    -p
    -    |  You can now train the model using a corpus for your language annotated
    -    |  with #[+a("http://universaldependencies.org/") Universal Dependencies].
    -    |  If your corpus uses the
    -    |  #[+a("http://universaldependencies.org/docs/format.html") CoNLL-U] format,
    -    |  i.e. files with the extension #[code .conllu], you can use the
    -    |  #[+api("cli#convert") #[code convert]] command to convert it to spaCy's
    -    |  #[+a("/docs/api/annotation#json-input") JSON format] for training.
    -
    -p
    -    |  Once you have your UD corpus transformed into JSON, you can train your
    -    |  model use the using spaCy's #[+api("cli#train") #[code train]] command:
    -
    -+code(false, "bash").
    -    spacy train [lang] [output_dir] [train_data] [dev_data] [--n-iter] [--n-sents] [--use-gpu] [--no-tagger] [--no-parser] [--no-entities]
    ++infobox("Important note", "⚠️")
    +    |  The morphological attributes are currently #[strong not all used by spaCy].
    +    |  Full integration is still being developed. In the meantime, it can still
    +    |  be useful to add them, especially if the language you're adding includes
    +    |  important distinctions and special cases. This ensures that as soon as
    +    |  full support is introduced, your language will be able to assign all
    +    |  possible attributes.
    diff --git a/website/usage/_adding-languages/_testing.jade b/website/usage/_adding-languages/_testing.jade
    new file mode 100644
    index 000000000..825d8db6f
    --- /dev/null
    +++ b/website/usage/_adding-languages/_testing.jade
    @@ -0,0 +1,76 @@
    +//- 💫 DOCS > USAGE > ADDING LANGUAGES > TESTING
    +
    +p
    +    |  Before using the new language or submitting a
    +    |  #[+a(gh("spaCy") + "/pulls") pull request] to spaCy, you should make sure
    +    |  it works as expected. This is especially important if you've added custom
    +    |  regular expressions for token matching or punctuation – you don't want to
    +    |  be causing regressions.
    +
    ++infobox("spaCy's test suite")
    +    |  spaCy uses the #[+a("https://docs.pytest.org/en/latest/") pytest framework]
    +    |  for testing. For more details on how the tests are structured and best
    +    |  practices for writing your own tests, see our
    +    |  #[+a(gh("spaCy", "spacy/tests")) tests documentation].
    +
    +p
    +    |  The easiest way to test your new tokenizer is to run the
    +    |  language-independent "tokenizer sanity" tests located in
    +    |  #[+src(gh("spaCy", "spacy/tests/tokenizer")) #[code tests/tokenizer]].
    +    |  This will test for basic behaviours like punctuation splitting, URL
    +    |  matching and correct handling of whitespace. In the
    +    |  #[+src(gh("spaCy", "spacy/tests/conftest.py")) #[code conftest.py]], add
    +    |  the new language ID to the list of #[code _languages]:
    +
    ++code.
    +    _languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'it', 'nb',
    +                  'nl', 'pl', 'pt', 'sv', 'xx'] # new language here
    +
    ++aside-code("Global tokenizer test example").
    +    # use fixture by adding it as an argument
    +    def test_with_all_languages(tokenizer):
    +        # will be performed on ALL language tokenizers
    +        tokens = tokenizer(u'Some text here.')
    +
    +p
    +    |  The language will now be included in the #[code tokenizer] test fixture,
    +    |  which is used by the basic tokenizer tests. If you want to add your own
    +    |  tests that should be run over all languages, you can use this fixture as
    +    |  an argument of your test function.
    +
    ++h(3, "testing-custom") Writing language-specific tests
    +
    +p
    +    |  It's recommended to always add at least some tests with examples specific
    +    |  to the language. Language tests should be located in
    +    |  #[+src(gh("spaCy", "spacy/tests/lang")) #[code tests/lang]] in a
    +    |  directory named after the language ID. You'll also need to create a
    +    |  fixture for your tokenizer in the
    +    |  #[+src(gh("spaCy", "spacy/tests/conftest.py")) #[code conftest.py]].
    +    |  Always use the #[+api("util#get_lang_class") #[code get_lang_class()]]
    +    |  helper function within the fixture, instead of importing the class at the
    +    |  top of the file. This will load the language data only when it's needed.
    +    |  (Otherwise, #[em all data] would be loaded every time you run a test.)
    +
    ++code.
    +    @pytest.fixture
    +    def en_tokenizer():
    +        return util.get_lang_class('en').Defaults.create_tokenizer()
    +
    +p
    +    |  When adding test cases, always
    +    |  #[+a(gh("spaCy", "spacy/tests#parameters")) #[code parametrize]] them –
    +    |  this will make it easier for others to add more test cases without having
    +    |  to modify the test itself. You can also add parameter tuples, for example,
    +    |  a test sentence and its expected length, or a list of expected tokens.
    +    |  Here's an example of an English tokenizer test for combinations of
    +    |  punctuation and abbreviations:
    +
    ++code("Example test").
    +    @pytest.mark.parametrize('text,length', [
    +        ("The U.S. Army likes Shock and Awe.", 8),
    +        ("U.N. regulations are not a part of their concern.", 10),
    +        ("“Isn't it?”", 6)])
    +    def test_en_tokenizer_handles_punct_abbrev(en_tokenizer, text, length):
    +        tokens = en_tokenizer(text)
    +        assert len(tokens) == length
    diff --git a/website/usage/_adding-languages/_training.jade b/website/usage/_adding-languages/_training.jade
    new file mode 100644
    index 000000000..054f2a460
    --- /dev/null
    +++ b/website/usage/_adding-languages/_training.jade
    @@ -0,0 +1,93 @@
    +//- 💫 DOCS > USAGE > ADDING LANGUAGES > TRAINING
    +
    +p
    +    |  spaCy expects that common words will be cached in a
    +    |  #[+api("vocab") #[code Vocab]] instance. The vocabulary caches lexical
    +    |  features, and makes it easy to use information from unlabelled text
    +    |  samples in your models. Specifically, you'll usually want to collect
    +    |  word frequencies, and train word vectors. To generate the word frequencies
    +    |  from a large, raw corpus, you can use the
    +    |  #[+src(gh("spacy-dev-resources", "training/word_freqs.py")) #[code word_freqs.py]]
    +    |  script from the spaCy developer resources.
    +
    ++github("spacy-dev-resources", "training/word_freqs.py")
    +
    +p
    +    |  Note that your corpus should not be preprocessed (i.e. you need
    +    |  punctuation for example). The word frequencies should be generated as a
    +    |  tab-separated file with three columns:
    +
    ++list("numbers")
    +    +item The number of times the word occurred in your language sample.
    +    +item The number of distinct documents the word occurred in.
    +    +item The word itself.
    +
    ++code("es_word_freqs.txt", "text").
    +    6361109	111	Aunque
    +    23598543	111	aunque
    +    10097056	111	claro
    +    193454	111	aro
    +    7711123	111	viene
    +    12812323	111	mal
    +    23414636	111	momento
    +    2014580	111	felicidad
    +    233865	111	repleto
    +    15527	111	eto
    +    235565	111	deliciosos
    +    17259079	111	buena
    +    71155	111	Anímate
    +    37705	111	anímate
    +    33155	111	cuéntanos
    +    2389171	111	cuál
    +    961576	111	típico
    +
    ++aside("Brown Clusters")
    +    |  Additionally, you can use distributional similarity features provided by the
    +    |  #[+a("https://github.com/percyliang/brown-cluster") Brown clustering algorithm].
    +    |  You should train a model with between 500 and 1000 clusters. A minimum
    +    |  frequency threshold of 10 usually works well.
    +
    +p
    +    |  You should make sure you use the spaCy tokenizer for your
    +    |  language to segment the text for your word frequencies. This will ensure
    +    |  that the frequencies refer to the same segmentation standards you'll be
    +    |  using at run-time. For instance, spaCy's English tokenizer segments
    +    |  "can't" into two tokens. If we segmented the text by whitespace to
    +    |  produce the frequency counts, we'll have incorrect frequency counts for
    +    |  the tokens "ca" and "n't".
    +
    ++h(4, "word-vectors") Training the word vectors
    +
    +p
    +    |  #[+a("https://en.wikipedia.org/wiki/Word2vec") Word2vec] and related
    +    |  algorithms let you train useful word similarity models from unlabelled
    +    |  text. This is a key part of using
    +    |  #[+a("/usage/deep-learning") deep learning] for NLP with limited
    +    |  labelled data. The vectors are also useful by themselves – they power
    +    |  the #[code .similarity()] methods in spaCy. For best results, you should
    +    |  pre-process the text with spaCy before training the Word2vec model. This
    +    |  ensures your tokenization will match. You can use our
    +    |  #[+src(gh("spacy-dev-resources", "training/word_vectors.py")) word vectors training script],
    +    |  which pre-processes the text with your language-specific tokenizer and
    +    |  trains the model using #[+a("https://radimrehurek.com/gensim/") Gensim].
    +    |  The #[code vectors.bin] file should consist of one word and vector per line.
    +
    ++github("spacy-dev-resources", "training/word_vectors.py")
    +
    ++h(3, "train-tagger-parser") Training the tagger and parser
    +
    +p
    +    |  You can now train the model using a corpus for your language annotated
    +    |  with #[+a("http://universaldependencies.org/") Universal Dependencies].
    +    |  If your corpus uses the
    +    |  #[+a("http://universaldependencies.org/docs/format.html") CoNLL-U] format,
    +    |  i.e. files with the extension #[code .conllu], you can use the
    +    |  #[+api("cli#convert") #[code convert]] command to convert it to spaCy's
    +    |  #[+a("/api/annotation#json-input") JSON format] for training.
    +    |  Once you have your UD corpus transformed into JSON, you can train your
    +    |  model use the using spaCy's #[+api("cli#train") #[code train]] command.
    +
    ++infobox
    +    |  For more details and examples of how to
    +    |  #[strong train the tagger and dependency parser], see the
    +    |  #[+a("/usage/training#tagger-parser") usage guide on training].
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    new file mode 100644
    index 000000000..3c37ee4d1
    --- /dev/null
    +++ b/website/usage/_data.json
    @@ -0,0 +1,195 @@
    +{
    +    "sidebar": {
    +        "Get started": {
    +            "Installation": "./",
    +            "Models & Languages": "models",
    +            "Facts & Figures": "facts-figures",
    +            "spaCy 101": "spacy-101",
    +            "New in v2.0": "v2"
    +        },
    +        "Guides": {
    +            "Linguistic Features": "linguistic-features",
    +            "Processing Pipelines": "processing-pipelines",
    +            "Vectors & Similarity": "vectors-similarity",
    +            "Text Classification": "text-classification",
    +            "Deep Learning": "deep-learning",
    +            "Training Models": "training",
    +            "Adding Languages": "adding-languages",
    +            "Visualizers": "visualizers"
    +        },
    +        "In-depth": {
    +            "Code Examples": "examples",
    +            "Resources": "resources"
    +        }
    +    },
    +
    +    "index": {
    +        "title": "Install spaCy",
    +        "next": "models",
    +        "quickstart": true,
    +        "changelog": true,
    +        "menu": {
    +            "Quickstart": "quickstart",
    +            "Instructions": "instructions",
    +            "Troubleshooting": "troubleshooting",
    +            "Changelog": "changelog"
    +        }
    +    },
    +
    +    "models": {
    +        "title": "Models & Languages",
    +        "next": "facts-figures",
    +        "quickstart": true,
    +        "menu": {
    +            "Quickstart": "quickstart",
    +            "Available Models": "available",
    +            "Installation & Usage": "install",
    +            "Language Support": "languages",
    +            "Production Use": "production"
    +        }
    +    },
    +
    +    "facts-figures": {
    +        "title": "Facts & Figures",
    +        "teaser": "The hard numbers for spaCy and how it compares to other libraries and tools.",
    +        "next": "spacy-101",
    +        "menu": {
    +            "Feature comparison": "comparison",
    +            "Benchmarks": "benchmarks",
    +            "Powered by spaCy": "powered-by",
    +            "Other Libraries": "other-libraries"
    +        }
    +    },
    +
    +    "spacy-101": {
    +        "title": "spaCy 101: Everything you need to know",
    +        "teaser": "The most important concepts, explained in simple terms.",
    +        "next": "index",
    +        "quickstart": true,
    +        "preview": "101",
    +        "menu": {
    +            "Features": "features",
    +            "Lightning tour": "lightning-tour",
    +            "Architecture": "architecture",
    +            "Community & FAQ": "community-faq"
    +        }
    +    },
    +
    +    "v2": {
    +        "title": "What's New in v2.0",
    +        "teaser": "New features, backwards incompatibilities and migration guide.",
    +        "menu": {
    +            "New features": "features",
    +            "Backwards Incompatibilities": "incompat",
    +            "Migrating from v1.x": "migrating",
    +            "Benchmarks": "benchmarks"
    +        }
    +    },
    +
    +    "linguistic-features": {
    +        "title": "Linguistic Features",
    +        "teaser": "Using spaCy to extract linguistic features like part-of-speech tags, dependency labels and named entities, customising the tokenizer and working with the rule-based matcher.",
    +        "next": "processing-pipelines",
    +        "menu": {
    +            "POS Tagging": "pos-tagging",
    +            "Dependency Parse": "dependency-parse",
    +            "Named Entities": "named-entities",
    +            "Tokenization": "tokenization",
    +            "Rule-based Matching": "rule-based-matching"
    +        }
    +    },
    +
    +    "processing-pipelines": {
    +        "title": "Language Processing Pipelines",
    +        "next": "vectors-similarity",
    +        "menu": {
    +            "How pipelines work": "pipelines",
    +            "Examples": "examples",
    +            "Multi-threading": "multithreading",
    +            "User Hooks": "user-hooks",
    +            "Serialization": "serialization"
    +        }
    +    },
    +
    +    "vectors-similarity": {
    +        "title": "Word Vectors and Semantic Similarity",
    +        "next": "text-classification",
    +        "menu": {
    +            "Basics": "basics",
    +            "Similarity in Context": "in-context",
    +            "Custom Vectors": "custom",
    +            "GPU Usage": "gpu"
    +        }
    +    },
    +
    +    "deep-learning": {
    +        "title": "Deep Learning",
    +        "teaser": "Using spaCy to pre-process text for deep learning, and how to plug in your own machine learning models.",
    +        "next": "training",
    +        "menu": {
    +            "Pre-processing Text": "pre-processing",
    +            "spaCy and Thinc": "thinc",
    +            "TensorFlow / Keras": "tensorflow-keras",
    +            "scikit-learn": "scikit-learn",
    +            "PyTorch": "pytorch",
    +            "DyNet": "dynet"
    +        }
    +    },
    +
    +    "text-classification": {
    +        "title": "Text Classification",
    +        "next": "training"
    +    },
    +
    +    "training": {
    +        "title": "Training spaCy's Statistical Models",
    +        "next": "adding-languages",
    +        "menu": {
    +            "Basics": "basics",
    +            "NER": "ner",
    +            "Tagger & Parser": "tagger-parser",
    +            "Similarity": "similarity",
    +            "Text Classification": "textcat",
    +            "Saving & Loading": "saving-loading"
    +        }
    +    },
    +
    +    "adding-languages": {
    +        "title": "Adding Languages",
    +        "teaser": "Adding full support for a language touches many different parts of the spaCy library. This guide explains how to fit everything together, and points you to the specific workflows for each component.",
    +        "next": "training",
    +        "menu": {
    +            "Language data": "language-data",
    +            "Testing": "testing",
    +            "Training": "training"
    +        }
    +    },
    +
    +    "visualizers": {
    +        "title": "Visualizers",
    +        "next": "resources"
    +    },
    +
    +    "resources": {
    +        "title": "Resources",
    +        "teaser": "Libraries, demos, books, courses and research systems featuring spaCy.",
    +        "menu": {
    +            "Third-party libraries": "libraries",
    +            "Demos & Visualizations": "demos",
    +            "Books & Courses": "books",
    +            "Jupyter Notebooks": "notebooks",
    +            "Research": "research"
    +        }
    +    },
    +
    +    "examples": {
    +        "title": "Code Examples",
    +        "teaser": "Full code examples you can modify and run.",
    +        "next": "resources",
    +        "menu": {
    +            "Matching": "matching",
    +            "Training": "training",
    +            "Deep Learning": "deep-learning"
    +        }
    +    }
    +}
    diff --git a/website/usage/_deep-learning/_dynet.jade b/website/usage/_deep-learning/_dynet.jade
    new file mode 100644
    index 000000000..81aa4e066
    --- /dev/null
    +++ b/website/usage/_deep-learning/_dynet.jade
    @@ -0,0 +1,11 @@
    +//- 💫 DOCS > USAGE > DEEP LEARNING > DYNET
    +
    ++infobox
    +    +infobox-logos(["dynet", 80, 34, "http://dynet.readthedocs.io/"])
    +    |  #[strong DyNet] is a dynamic neural network library, which can be much
    +    |  easier to work with for NLP. Outside of Google, there's a general shift
    +    |  among NLP researchers to both DyNet and Pytorch. You can use DyNet to
    +    |  create spaCy pipeline components, to add annotations to the #[code Doc]
    +    |  object.
    +
    ++under-construction
    diff --git a/website/usage/_deep-learning/_pre-processing.jade b/website/usage/_deep-learning/_pre-processing.jade
    new file mode 100644
    index 000000000..ca87cee7b
    --- /dev/null
    +++ b/website/usage/_deep-learning/_pre-processing.jade
    @@ -0,0 +1,3 @@
    +//- 💫 DOCS > USAGE > DEEP LEARNING > PRE-PROCESSING
    +
    ++under-construction
    diff --git a/website/usage/_deep-learning/_pytorch.jade b/website/usage/_deep-learning/_pytorch.jade
    new file mode 100644
    index 000000000..cf0f692f9
    --- /dev/null
    +++ b/website/usage/_deep-learning/_pytorch.jade
    @@ -0,0 +1,91 @@
    +//- 💫 DOCS > USAGE > DEEP LEARNING > PYTORCH
    +
    ++infobox
    +    +infobox-logos(["pytorch", 100, 48, "http://pytorch.org"])
    +    |  #[strong PyTorch] is a dynamic neural network library, which can be much
    +    |  easier to work with for NLP. Outside of Google, there's a general shift
    +    |  among NLP researchers to both Pytorch and DyNet. spaCy is the front-end
    +    |  of choice for PyTorch's #[code torch.text] extension. You can use PyTorch
    +    |  to create spaCy pipeline components, to add annotations to the
    +    |  #[code Doc] object.
    +
    ++under-construction
    +
    +p
    +    |  Here's how a #[code begin_update] function that wraps an arbitrary
    +    |  PyTorch model would look:
    +
    ++code.
    +    class PytorchWrapper(thinc.neural.Model):
    +        def __init__(self, pytorch_model):
    +            self.pytorch_model = pytorch_model
    +
    +        def begin_update(self, x_data, drop=0.):
    +            x_var = Variable(x_data)
    +            # Make prediction
    +            y_var = pytorch_model.forward(x_var)
    +            def backward(dy_data, sgd=None):
    +                dy_var = Variable(dy_data)
    +                dx_var = torch.autograd.backward(x_var, dy_var)
    +                return dx_var
    +            return y_var.data, backward
    +
    +p
    +    |  PyTorch requires data to be wrapped in a container, #[code Variable],
    +    |  that tracks the operations performed on the data. This "tape" of
    +    |  operations is then used by #[code torch.autograd.backward] to compute the
    +    |  gradient with respect to the input. For example, the following code
    +    |  constructs a PyTorch Linear layer that takes a vector of shape
    +    |  #[code (length, 2)], multiples it by a #[code (2, 2)] matrix of weights,
    +    |  adds a #[code (2,)] bias, and returns the resulting #[code (length, 2)]
    +    |  vector:
    +
    ++code("PyTorch Linear").
    +    from torch import autograd
    +    from torch import nn
    +    import torch
    +    import numpy
    +
    +    pt_model = nn.Linear(2, 2)
    +    length = 5
    +
    +    input_data = numpy.ones((5, 2), dtype='f')
    +    input_var = autograd.Variable(torch.Tensor(input_data))
    +
    +    output_var = pt_model(input_var)
    +    output_data = output_var.data.numpy()
    +
    +p
    +    |  Given target values we would like the output data to approximate, we can
    +    |  then "learn" values of the parameters within #[code pt_model], to give us
    +    |  output that's closer to our target. As a trivial example, let's make the
    +    |  linear layer compute the negative inverse of the input:
    +
    ++code.
    +    def get_target(input_data):
    +        return -(1 / input_data)
    +
    +p
    +    |  To update the PyTorch model, we create an optimizer and give it
    +    |  references to the model's parameters. We'll then randomly generate input
    +    |  data and get the target result we'd like the function to produce. We then
    +    |  compute the #[strong gradient of the error] between the current output
    +    |  and the target. Using the most popular definition of "error", this is
    +    |  simply the average difference:
    +
    ++code.
    +    from torch import optim
    +
    +    optimizer = optim.SGD(pt_model.parameters(), lr = 0.01)
    +    for i in range(10):
    +        input_data = numpy.random.uniform(-1., 1., (length, 2))
    +        target = -(1 / input_data)
    +
    +        output_var = pt_model(autograd.Variable(torch.Tensor(input_data)))
    +        output_data = output_var.data.numpy()
    +
    +        d_output_data = (output_data - target) / length
    +        d_output_var = autograd.Variable(torch.Tensor(d_output_data))
    +
    +        d_input_var = torch.autograg.backward(output_var, d_output_var)
    +        optimizer.step()
    diff --git a/website/usage/_deep-learning/_scikit-learn.jade b/website/usage/_deep-learning/_scikit-learn.jade
    new file mode 100644
    index 000000000..3d0f30397
    --- /dev/null
    +++ b/website/usage/_deep-learning/_scikit-learn.jade
    @@ -0,0 +1,15 @@
    +//- 💫 DOCS > USAGE > DEEP LEARNING > SCIKIT-LEARN
    +
    ++infobox
    +    +infobox-logos(["scikitlearn", 70, 34, "http://scikit-learn.org"])
    +    |  #[strong scikit-learn] features a number of useful NLP functions,
    +    |  especially for solving text classification problems using linear models
    +    |  with bag-of-words features. If you know you need exactly that, it might
    +    |  be better to use scikit-learn's built-in pipeline directly. However, if
    +    |  you want to extract more detailed features, using part-of-speech tags,
    +    |  named entity labels, or string transformations, you can use spaCy as a
    +    |  pre-process in your classification system. scikit-learn also provides a
    +    |  lot of experiment management and evaluation utilities that people use
    +    |  alongside spaCy.
    +
    ++under-construction
    diff --git a/website/usage/_deep-learning/_tensorflow-keras.jade b/website/usage/_deep-learning/_tensorflow-keras.jade
    new file mode 100644
    index 000000000..3efb2e2a6
    --- /dev/null
    +++ b/website/usage/_deep-learning/_tensorflow-keras.jade
    @@ -0,0 +1,11 @@
    +//- 💫 DOCS > USAGE > DEEP LEARNING > TENSORFLOW / KERAS
    +
    ++infobox
    +    +infobox-logos(["tensorflow", 35, 42, "https://www.tensorflow.org"], ["keras", 45, 45, "https://www.keras.io"])
    +    |  #[strong Tensorflow / Keras] is the most popular deep learning library.
    +    |  spaCy provides efficient and powerful feature extraction functionality,
    +    |  that can be used as a pre-process to any deep learning library. You can
    +    |  also use Tensorflow and Keras to create spaCy pipeline components, to add
    +    |  annotations to the #[code Doc] object.
    +
    ++under-construction
    diff --git a/website/usage/_deep-learning/_thinc.jade b/website/usage/_deep-learning/_thinc.jade
    new file mode 100644
    index 000000000..6c354f708
    --- /dev/null
    +++ b/website/usage/_deep-learning/_thinc.jade
    @@ -0,0 +1,66 @@
    +//- 💫 DOCS > USAGE > DEEP LEARNING > THINC
    +
    +p
    +    |  #[+a(gh("thinc")) Thinc] is the machine learning library powering spaCy.
    +    |  It's a practical toolkit for implementing models that follow the
    +    |  #[+a("https://explosion.ai/blog/deep-learning-formula-nlp", true) "Embed, encode, attend, predict"]
    +    |  architecture. It's designed to be easy to install, efficient for CPU
    +    |  usage and optimised for NLP and deep learning with text – in particular,
    +    |  hierarchically structured input and variable-length sequences.
    +
    +p
    +    |  spaCy's built-in pipeline components can all be powered by any object
    +    |  that follows Thinc's #[code Model] API. If a wrapper is not yet available
    +    |  for the library you're using, you should create a
    +    |  #[code thinc.neural.Model] subclass that implements a #[code begin_update]
    +    |  method. You'll also want to implement #[code to_bytes], #[code from_bytes],
    +    |  #[code to_disk] and #[code from_disk] methods, to save and load your
    +    |  model. Here's the tempate you'll need to fill in:
    +
    +    +code("Thinc Model API").
    +        class ThincModel(thinc.neural.Model):
    +            def __init__(self, *args, **kwargs):
    +                pass
    +
    +            def begin_update(self, X, drop=0.):
    +                def backprop(dY, sgd=None):
    +                    return dX
    +                return Y, backprop
    +
    +            def to_disk(self, path, **exclude):
    +                return None
    +
    +            def from_disk(self, path, **exclude):
    +                return self
    +
    +            def to_bytes(self, **exclude):
    +                return bytes
    +
    +            def from_bytes(self, msgpacked_bytes, **exclude):
    +                return self
    +
    +p
    +    |  The #[code begin_update] method should return a callback, that takes the
    +    |  gradient with respect to the output, and returns the gradient with
    +    |  respect to the input.  It's usually convenient to implement the callback
    +    |  as a nested function, so you can refer to any intermediate variables from
    +    |  the forward computation in the enclosing scope.
    +
    ++h(3, "how-thinc-works") How Thinc works
    +
    +p
    +    |  Neural networks are all about composing small functions that we know how
    +    |  to differentiate into larger functions that we know how to differentiate.
    +    |  To differentiate a function efficiently, you usually need to store
    +    |  intermediate results, computed during the "forward pass", to reuse them
    +    |  during the backward pass. Most libraries require the data passed through
    +    |  the network to accumulate these intermediate result. This is the "tape"
    +    |  in tape-based differentiation.
    +
    +p
    +    |  In Thinc, a model that computes #[code y = f(x)] is required to also
    +    |  return a callback that computes #[code dx = f'(dy)]. The same
    +    |  intermediate state needs to be tracked, but this becomes an
    +    |  implementation detail for the model to take care of – usually, the
    +    |  callback is implemented as a closure, so the intermediate results can be
    +    |  read from the enclosing scope.
    diff --git a/website/usage/_facts-figures/_benchmarks-choi-2015.jade b/website/usage/_facts-figures/_benchmarks-choi-2015.jade
    new file mode 100644
    index 000000000..5c3386ce6
    --- /dev/null
    +++ b/website/usage/_facts-figures/_benchmarks-choi-2015.jade
    @@ -0,0 +1,45 @@
    +//- 💫 DOCS > USAGE > FACTS & FIGURES > BENCHMARKS > CHOI ET AL. (2015)
    +
    ++table(["System", "Year", "Language", "Accuracy", "Speed (wps)"])
    +    +row
    +        +cell #[strong spaCy v2.x]
    +        +cell 2017
    +        +cell Python / Cython
    +        +cell.u-text-right #[strong 92.6]
    +        +cell.u-text-right #[em n/a]
    +            |  #[+help("This table shows speed as benchmarked by Choi et al. We therefore can't provide comparable figures, as we'd be running the benchmark on different hardware.").u-color-dark]
    +
    +    +row
    +        +cell #[strong spaCy v1.x]
    +        +cell 2015
    +        +cell Python / Cython
    +        +cell.u-text-right 91.8
    +        +cell.u-text-right 13,963
    +
    +    +row
    +        +cell ClearNLP
    +        +cell 2015
    +        +cell Java
    +        +cell.u-text-right 91.7
    +        +cell.u-text-right 10,271
    +
    +    +row
    +        +cell CoreNLP
    +        +cell 2015
    +        +cell Java
    +        +cell.u-text-right 89.6
    +        +cell.u-text-right 8,602
    +
    +    +row
    +        +cell MATE
    +        +cell 2015
    +        +cell Java
    +        +cell.u-text-right 92.5
    +        +cell.u-text-right 550
    +
    +    +row
    +        +cell Turbo
    +        +cell 2015
    +        +cell C++
    +        +cell.u-text-right 92.4
    +        +cell.u-text-right 349
    diff --git a/website/usage/_facts-figures/_benchmarks-models.jade b/website/usage/_facts-figures/_benchmarks-models.jade
    new file mode 100644
    index 000000000..208e7da48
    --- /dev/null
    +++ b/website/usage/_facts-figures/_benchmarks-models.jade
    @@ -0,0 +1,48 @@
    +//- 💫 DOCS > USAGE > FACTS & FIGURES > BENCHMARKS > MODEL COMPARISON
    +
    +p
    +    |  In this section, we provide benchmark accuracies for the pre-trained
    +    |  model pipelines we distribute with spaCy. Evaluations are conducted
    +    |  end-to-end from raw text, with no "gold standard" pre-processing, over
    +    |  text from a mix of genres where possible.
    +
    ++under-construction
    +
    ++aside("Methodology")
    +    |  The evaluation was conducted on raw text with no gold standard
    +    |  information. The parser, tagger and entity recognizer were trained on the
    +    |  #[+a("https://www.gabormelli.com/RKB/OntoNotes_Corpus") OntoNotes 5]
    +    |  corpus, the word vectors on #[+a("http://commoncrawl.org") Common Crawl].
    +
    ++table(["Model", "spaCy", "Type", "UAS", "NER F", "POS", "WPS", "Size"])
    +    +row
    +        +cell #[+a("/models/en#en_core_web_sm") #[code en_core_web_sm]] 2.0.0a5
    +        each data in ["2.x", "neural"]
    +            +cell.u-text-right=data
    +        +cell.u-text-right 91.4
    +        +cell.u-text-right 85.5
    +        +cell.u-text-right 97.0
    +        +cell.u-text-right 8.2k
    +        +cell.u-text-right #[strong 36 MB]
    +
    +    +row
    +        +cell #[+a("/models/en#en_core_web_lg") #[code en_core_web_lg]] 2.0.0a0
    +        each data in ["2.x", "neural"]
    +            +cell.u-text-right=data
    +        +cell.u-text-right #[strong 91.9]
    +        +cell.u-text-right #[strong 86.4]
    +        +cell.u-text-right #[strong 97.2]
    +        +cell.u-text-right #[em n/a]
    +        +cell.u-text-right 667 MB
    +
    +    +row("divider")
    +        +cell #[code en_core_web_sm] 1.2.0
    +        each data in ["1.x", "linear", 86.6, 78.5, 96.6]
    +            +cell.u-text-right=data
    +        +cell.u-text-right #[strong 25.7k]
    +        +cell.u-text-right 50 MB
    +
    +    +row
    +        +cell #[code en_core_web_md] 1.2.1
    +        each data in ["1.x", "linear", 90.6, 81.4, 96.7, "18.8k", "1 GB"]
    +            +cell.u-text-right=data
    diff --git a/website/usage/_facts-figures/_benchmarks.jade b/website/usage/_facts-figures/_benchmarks.jade
    new file mode 100644
    index 000000000..fa0e26763
    --- /dev/null
    +++ b/website/usage/_facts-figures/_benchmarks.jade
    @@ -0,0 +1,206 @@
    +//- 💫 DOCS > USAGE > FACTS & FIGURES > BENCHMARKS
    +
    +p
    +    |  Two peer-reviewed papers in 2015 confirm that spaCy offers the
    +    |  #[strong fastest syntactic parser in the world] and that
    +    |  #[strong its accuracy is within 1% of the best] available. The few
    +    |  systems that are more accurate are 20× slower or more.
    +
    ++aside("About the evaluation")
    +    |  The first of the evaluations was published by #[strong Yahoo! Labs] and
    +    |  #[strong Emory University], as part of a survey of current parsing
    +    |  technologies #[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") (Choi et al., 2015)].
    +    |  Their results and subsequent discussions helped us develop a novel
    +    |  psychologically-motivated technique to improve spaCy's accuracy, which
    +    |  we published in joint work with Macquarie University
    +    |  #[+a("https://aclweb.org/anthology/D/D15/D15-1162.pdf") (Honnibal and Johnson, 2015)].
    +
    +include _benchmarks-choi-2015
    +
    ++h(3, "algorithm") Algorithm comparison
    +
    +p
    +    |  In this section, we compare spaCy's algorithms to recently published
    +    |  systems, using some of the most popular benchmarks. These benchmarks are
    +    |  designed to help isolate the contributions of specific algorithmic
    +    |  decisions, so they promote slightly "idealised" conditions. Specifically,
    +    |  the text comes pre-processed with "gold standard" token and sentence
    +    |  boundaries. The data sets also tend to be fairly small, to help
    +    |  researchers iterate quickly. These conditions mean the models trained on
    +    |  these data sets are not always useful for practical purposes.
    +
    ++h(4, "parse-accuracy-penn") Parse accuracy (Penn Treebank / Wall Street Journal)
    +
    +p
    +    |  This is the "classic" evaluation, so it's the number parsing researchers
    +    |  are most easily able to put in context. However, it's quite far removed
    +    |  from actual usage: it uses sentences with gold-standard segmentation and
    +    |  tokenization, from a pretty specific type of text (articles from a single
    +    |  newspaper, 1984-1989).
    +
    ++aside("Methodology")
    +    |  #[+a("http://arxiv.org/abs/1603.06042") Andor et al. (2016)] chose
    +    |  slightly different experimental conditions from
    +    |  #[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") Choi et al. (2015)],
    +    |  so the two accuracy tables here do not present directly comparable
    +    |  figures.
    +
    ++table(["System", "Year", "Type", "Accuracy"])
    +    +row
    +        +cell spaCy v2.0.0
    +        +cell 2017
    +        +cell neural
    +        +cell.u-text-right 94.48
    +
    +    +row
    +        +cell spaCy v1.1.0
    +        +cell 2016
    +        +cell linear
    +        +cell.u-text-right 92.80
    +
    +    +row("divider")
    +        +cell
    +            +a("https://arxiv.org/pdf/1611.01734.pdf") Dozat and Manning
    +            +cell 2017
    +            +cell neural
    +            +cell.u-text-right #[strong 95.75]
    +
    +    +row
    +        +cell
    +            +a("http://arxiv.org/abs/1603.06042") Andor et al.
    +        +cell 2016
    +        +cell neural
    +        +cell.u-text-right 94.44
    +
    +    +row
    +        +cell
    +            +a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet Parsey McParseface
    +        +cell 2016
    +        +cell neural
    +        +cell.u-text-right 94.15
    +
    +    +row
    +        +cell
    +            +a("http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43800.pdf") Weiss et al.
    +        +cell 2015
    +        +cell neural
    +        +cell.u-text-right 93.91
    +
    +    +row
    +        +cell
    +            +a("http://research.google.com/pubs/archive/38148.pdf") Zhang and McDonald
    +        +cell 2014
    +        +cell linear
    +        +cell.u-text-right 93.32
    +
    +    +row
    +        +cell
    +            +a("http://www.cs.cmu.edu/~ark/TurboParser/") Martins et al.
    +        +cell 2013
    +        +cell linear
    +        +cell.u-text-right 93.10
    +
    ++h(4, "ner-accuracy-ontonotes5") NER accuracy (OntoNotes 5, no pre-process)
    +
    +p
    +    |  This is the evaluation we use to tune spaCy's parameters are decide which
    +    |  algorithms are better than others. It's reasonably close to actual usage,
    +    |  because it requires the parses to be produced from raw text, without any
    +    |  pre-processing.
    +
    ++table(["System", "Year", "Type", "Accuracy"])
    +    +row
    +        +cell spaCy #[+a("/models/en#en_core_web_lg") #[code en_core_web_lg]] v2.0.0
    +        +cell 2017
    +        +cell neural
    +        +cell.u-text-right 86.45
    +
    +    +row("divider")
    +        +cell
    +            +a("https://arxiv.org/pdf/1702.02098.pdf") Strubell et al.
    +        +cell 2017
    +        +cell neural
    +        +cell.u-text-right #[strong 86.81]
    +
    +    +row
    +        +cell
    +            +a("https://www.semanticscholar.org/paper/Named-Entity-Recognition-with-Bidirectional-LSTM-C-Chiu-Nichols/10a4db59e81d26b2e0e896d3186ef81b4458b93f") Chiu and Nichols
    +        +cell 2016
    +        +cell neural
    +        +cell.u-text-right 86.19
    +
    +    +row
    +        +cell
    +            +a("https://www.semanticscholar.org/paper/A-Joint-Model-for-Entity-Analysis-Coreference-Typi-Durrett-Klein/28eb033eee5f51c5e5389cbb6b777779203a6778") Durrett and Klein
    +        +cell 2014
    +        +cell neural
    +        +cell.u-text-right 84.04
    +
    +    +row
    +        +cell
    +            +a("http://www.aclweb.org/anthology/W09-1119") Ratinov and Roth
    +        +cell 2009
    +        +cell linear
    +        +cell.u-text-right 83.45
    +
    ++h(3, "spacy-models") Model comparison
    +
    +include _benchmarks-models
    +
    ++h(3, "speed-comparison") Detailed speed comparison
    +
    +p
    +    |  Here we compare the per-document processing time of various spaCy
    +    |  functionalities against other NLP libraries. We show both absolute
    +    |  timings (in ms) and relative performance (normalized to spaCy). Lower is
    +    |  better.
    +
    ++infobox("Important note", "⚠️")
    +    |  This evaluation was conducted in 2015. We're working on benchmarks on
    +    |  current CPU and GPU hardware.
    +
    ++aside("Methodology")
    +    |  #[strong Set up:] 100,000 plain-text documents were streamed from an
    +    |  SQLite3 database, and processed with an NLP library, to one of three
    +    |  levels of detail — tokenization, tagging, or parsing. The tasks are
    +    |  additive: to parse the text you have to tokenize and tag it. The
    +    |  pre-processing was not subtracted from the times — we report the time
    +    |  required for the pipeline to complete. We report mean times per document,
    +    |  in milliseconds.#[br]#[br]
    +    |  #[strong Hardware]: Intel i7-3770 (2012)#[br]
    +    |  #[strong Implementation]: #[+src(gh("spacy-benchmarks")) #[code spacy-benchmarks]]
    +
    ++table
    +    +row.u-text-label.u-text-center
    +        +head-cell
    +        +head-cell(colspan="3") Absolute (ms per doc)
    +        +head-cell(colspan="3") Relative (to spaCy)
    +
    +    +row
    +        each column in ["System", "Tokenize", "Tag", "Parse", "Tokenize", "Tag", "Parse"]
    +            +head-cell=column
    +
    +    +row
    +        +cell #[strong spaCy]
    +        each data in [ "0.2ms", "1ms", "19ms"]
    +            +cell.u-text-right #[strong=data]
    +
    +        each data in ["1x", "1x", "1x"]
    +            +cell.u-text-right=data
    +
    +    +row
    +        +cell CoreNLP
    +        each data in ["2ms", "10ms", "49ms", "10x", "10x", "2.6x"]
    +            +cell.u-text-right=data
    +    +row
    +        +cell ZPar
    +        each data in ["1ms", "8ms", "850ms", "5x", "8x", "44.7x"]
    +            +cell.u-text-right=data
    +    +row
    +        +cell NLTK
    +        each data in ["4ms", "443ms"]
    +            +cell.u-text-right=data
    +        +cell.u-text-right #[em n/a]
    +        each data in ["20x", "443x"]
    +            +cell.u-text-right=data
    +        +cell.u-text-right #[em n/a]
    diff --git a/website/usage/_facts-figures/_feature-comparison.jade b/website/usage/_facts-figures/_feature-comparison.jade
    new file mode 100644
    index 000000000..92ac69050
    --- /dev/null
    +++ b/website/usage/_facts-figures/_feature-comparison.jade
    @@ -0,0 +1,58 @@
    +//- 💫 DOCS > USAGE > FACTS & FIGURES > FEATURE COMPARISON
    +
    +p
    +    |  Here's a quick comparison of the functionalities offered by spaCy,
    +    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet],
    +    |  #[+a("http://www.nltk.org/py-modindex.html") NLTK] and
    +    |  #[+a("http://stanfordnlp.github.io/CoreNLP/") CoreNLP].
    +
    ++table(["", "spaCy", "SyntaxNet", "NLTK", "CoreNLP"])
    +    +row
    +        +cell Programming language
    +        each lang in ["Python", "C++", "Python", "Java"]
    +            +cell.u-text-small.u-text-center=lang
    +
    +    +row
    +        +cell Neural network models
    +            each icon in ["pro", "pro", "con", "pro"]
    +                +cell.u-text-center #[+procon(icon)]
    +
    +    +row
    +        +cell Integrated word vectors
    +        each icon in ["pro", "con", "con", "con"]
    +            +cell.u-text-center #[+procon(icon)]
    +
    +    +row
    +        +cell Multi-language support
    +        each icon in ["pro", "pro", "pro", "pro"]
    +            +cell.u-text-center #[+procon(icon)]
    +
    +    +row
    +        +cell Tokenization
    +        each icon in ["pro", "pro", "pro", "pro"]
    +            +cell.u-text-center #[+procon(icon)]
    +
    +    +row
    +        +cell Part-of-speech tagging
    +        each icon in ["pro", "pro", "pro", "pro"]
    +            +cell.u-text-center #[+procon(icon)]
    +
    +    +row
    +        +cell Sentence segmentation
    +        each icon in ["pro", "pro", "pro", "pro"]
    +            +cell.u-text-center #[+procon(icon)]
    +
    +    +row
    +        +cell Dependency parsing
    +        each icon in ["pro", "pro", "con", "pro"]
    +            +cell.u-text-center #[+procon(icon)]
    +
    +    +row
    +        +cell Entity recognition
    +        each icon in ["pro", "con", "pro", "pro"]
    +            +cell.u-text-center #[+procon(icon)]
    +
    +    +row
    +        +cell Coreference resolution
    +        each icon in ["con", "con", "con", "pro"]
    +            +cell.u-text-center #[+procon(icon)]
    diff --git a/website/usage/_facts-figures/_other-libraries.jade b/website/usage/_facts-figures/_other-libraries.jade
    new file mode 100644
    index 000000000..427debb27
    --- /dev/null
    +++ b/website/usage/_facts-figures/_other-libraries.jade
    @@ -0,0 +1,70 @@
    +//- 💫 DOCS > USAGE > FACTS & FIGURES > OTHER LIBRARIES
    +
    +p
    +    |  Data scientists, researchers and machine learning engineers have
    +    |  converged on Python as the language for AI. This gives developers a rich
    +    |  ecosystem of NLP libraries to work with. Here's how we think the pieces
    +    |  fit together.
    +
    ++aside("Using spaCy with other libraries")
    +    |  For details on how to use spaCy together with popular machine learning
    +    |  libraries like TensorFlow, Keras or PyTorch, see the
    +    |  #[+a("/usage/deep-learning") usage guide on deep learning].
    +
    ++infobox
    +    +infobox-logos(["nltk", 80, 25, "http://nltk.org"])
    +    |  #[+label-inline NLTK] offers some of the same functionality as spaCy.
    +    |  Although originally developed for teaching and research, its longevity
    +    |  and stability has resulted in a large number of industrial users. It's
    +    |  the main alternative to spaCy for tokenization and sentence segmentation.
    +    |  In comparison to spaCy, NLTK takes a much more "broad church" approach –
    +    |  so it has some functions that spaCy doesn't provide, at the expense of a
    +    |  bit more clutter to sift through. spaCy is also much more
    +    |  performance-focussed than NLTK: where the two libraries provide the same
    +    |  functionality, spaCy's implementation will usually be faster and more
    +    |  accurate.
    +
    ++infobox
    +    +infobox-logos(["gensim", 40, 40, "https://radimrehurek.com/gensim/"])
    +    |  #[+label-inline Gensim] provides unsupervised text modelling algorithms.
    +    |  Although Gensim isn't a runtime dependency of spaCy, we use it to train
    +    |  word vectors. There's almost no overlap between the libraries – the two
    +    |  work together.
    +
    ++infobox
    +    +infobox-logos(["tensorflow", 35, 42, "https://www.tensorflow.org"], ["keras", 45, 45, "https://www.keras.io"])
    +    |  #[+label-inline Tensorflow / Keras] is the most popular deep learning library.
    +    |  spaCy provides efficient and powerful feature extraction functionality,
    +    |  that can be used as a pre-process to any deep learning library. You can
    +    |  also use Tensorflow and Keras to create spaCy pipeline components, to add
    +    |  annotations to the #[code Doc] object.
    +
    ++infobox
    +    +infobox-logos(["scikitlearn", 90, 44, "http://scikit-learn.org"])
    +    |  #[+label-inline scikit-learn] features a number of useful NLP functions,
    +    |  especially for solving text classification problems using linear models
    +    |  with bag-of-words features. If you know you need exactly that, it might
    +    |  be better to use scikit-learn's built-in pipeline directly. However, if
    +    |  you want to extract more detailed features, using part-of-speech tags,
    +    |  named entity labels, or string transformations, you can use spaCy as a
    +    |  pre-process in your classification system. scikit-learn also provides a
    +    |  lot of experiment management and evaluation utilities that people use
    +    |  alongside spaCy.
    +
    ++infobox
    +    +infobox-logos(["pytorch", 100, 48, "http://pytorch.org"], ["dynet", 80, 34, "http://dynet.readthedocs.io/"], ["chainer", 80, 43, "http://chainer.org"])
    +    |  #[+label-inline PyTorch, DyNet and Chainer] are dynamic neural network
    +    |  libraries, which can be much easier to work with for NLP. Outside of
    +    |  Google, there's a general shift among NLP researchers to both DyNet and
    +    |  Pytorch. spaCy is the front-end of choice for PyTorch's
    +    |  #[code torch.text] extension. You can use any of these libraries to
    +    |  create spaCy pipeline components, to add annotations to the #[code Doc]
    +    |  object.
    +
    ++infobox
    +    +infobox-logos(["allennlp", 124, 22, "http://allennlp.org"])
    +    |  #[+label-inline AllenNLP] is a new library designed to accelerate NLP
    +    |  research, by providing a framework that supports modern deep learning
    +    |  workflows for cutting-edge language understanding problems. AllenNLP uses
    +    |  spaCy as a preprocessing component. You can also use AllenNLP to develop
    +    |  spaCy pipeline components, to add annotations to the #[code Doc] object.
    diff --git a/website/usage/_install/_changelog.jade b/website/usage/_install/_changelog.jade
    new file mode 100644
    index 000000000..e966b6695
    --- /dev/null
    +++ b/website/usage/_install/_changelog.jade
    @@ -0,0 +1,31 @@
    +//- 💫 DOCS > USAGE > INSTALL > CHANGELOG
    +
    ++h(2, "changelog") Changelog
    +    +button(gh("spacy") + "/releases", false, "secondary", "small").u-float-right.u-nowrap View releases
    +
    +div(data-tpl="changelog" data-tpl-key="error")
    +    +infobox
    +        |  Unable to load changelog from GitHub. Please see the
    +        |  #[+a(gh("spacy") + "/releases") releases page] instead.
    +
    +section(data-tpl="changelog" data-tpl-key="table" style="display: none")
    +    +table(["Date", "Version", "Title"])
    +        tbody(data-tpl="changelog" data-tpl-key="releases")
    +            +row(data-tpl="changelog" data-tpl-key="item")
    +                +cell.u-nowrap
    +                    +label(data-changelog="date")
    +                +cell(data-changelog="tag")
    +                +cell.u-text-small(data-changelog="title")
    +
    +    +h(3) Pre-releases
    +
    +    +aside("About pre-releases")
    +        .o-block-small
    +            |  Pre-releases include alpha and beta versions, as well as release
    +            |  candidates. They are not intended for production use. You can
    +            |  download spaCy pre-releases via the #[code spacy-nightly] package
    +            |  on pip.
    +        +badge("https://img.shields.io/pypi/v/spacy-nightly.svg?style=flat-square", "https://pypi.python.org/pypi/spacy-nightly")
    +
    +    +table(["Date", "Version", "Title"])
    +        tbody(data-tpl="changelog" data-tpl-key="prereleases")
    diff --git a/website/usage/_install/_instructions.jade b/website/usage/_install/_instructions.jade
    new file mode 100644
    index 000000000..10132a646
    --- /dev/null
    +++ b/website/usage/_install/_instructions.jade
    @@ -0,0 +1,185 @@
    +//- 💫 DOCS > USAGE > INSTALL > INSTRUCTIONS
    +
    ++h(3, "pip") pip
    +    +badge("https://img.shields.io/pypi/v/spacy.svg?style=flat-square", "https://pypi.python.org/pypi/spacy")
    +
    +p Using pip, spaCy releases are currently only available as source packages.
    +
    ++code(false, "bash").
    +    pip install -U spacy
    +
    ++aside("Download models")
    +    |  After installation you need to download a language model. For more info
    +    |  and available models, see the #[+a("/usage/models") docs on models].
    +
    +    +code.o-no-block.
    +        spacy download en
    +
    +        >>> import spacy
    +        >>> nlp = spacy.load('en')
    +
    +p
    +    |  When using pip it is generally recommended to install packages in a
    +    |  #[code virtualenv] to avoid modifying system state:
    +
    ++code(false, "bash").
    +    virtualenv .env
    +    source .env/bin/activate
    +    pip install spacy
    +
    ++h(3, "conda") conda
    +    +badge("https://anaconda.org/conda-forge/spacy/badges/version.svg", "https://anaconda.org/conda-forge/spacy")
    +
    +p
    +    |  Thanks to our great community, we've finally re-added conda support. You
    +    |  can now install spaCy via #[code conda-forge]:
    +
    ++code(false, "bash").
    +    conda config --add channels conda-forge
    +    conda install spacy
    +
    +p
    +    |  For the feedstock including the build recipe and configuration, check out
    +    |  #[+a("https://github.com/conda-forge/spacy-feedstock") this repository].
    +    |  Improvements and pull requests to the recipe and setup are always
    +    |  appreciated.
    +
    ++h(3, "gpu") Run spaCy with GPU
    +
    +p
    +    |  As of v2.0, spaCy's comes with neural network models that are implemented
    +    |  in our machine learning library, #[+a(gh("thinc")) Thinc]. For GPU
    +    |  support, we've been grateful to use the work of
    +    |  #[+a("http://chainer.org") Chainer]'s CuPy module, which provides
    +    |  a NumPy-compatible interface for GPU arrays.
    +
    +p
    +    |  First, install follows the normal CUDA installation procedure. Next, set
    +    |  your environment variables so that the installation will be able to find
    +    |  CUDA. Finally, install spaCy.
    +
    ++code(false, "bash").
    +    export CUDA_HOME=/usr/local/cuda-8.0 # Or wherever your CUDA is
    +    export PATH=$PATH:$CUDA_HOME/bin
    +
    +    pip install spacy
    +    python -c "import thinc.neural.gpu_ops" # Check the GPU ops were built
    +
    ++h(3, "source") Compile from source
    +
    +p
    +    |  The other way to install spaCy is to clone its
    +    |  #[+a(gh("spaCy")) GitHub repository] and build it from source. That is
    +    |  the common way if you want to make changes to the code base. You'll need
    +    |  to make sure that you have a development environment consisting of a
    +    |  Python distribution including header files, a compiler,
    +    |  #[+a("https://pip.pypa.io/en/latest/installing/") pip],
    +    |  #[+a("https://virtualenv.pypa.io/") virtualenv] and
    +    |  #[+a("https://git-scm.com") git] installed. The compiler part is the
    +    |  trickiest. How to do that depends on your system. See notes on
    +    |  #[a(href="#source-ubuntu") Ubuntu], #[a(href="#source-osx") OS X] and
    +    |  #[a(href="#source-windows") Windows] for details.
    +
    ++code(false, "bash").
    +    # make sure you are using recent pip/virtualenv versions
    +    python -m pip install -U pip virtualenv
    +    git clone #{gh("spaCy")}
    +    cd spaCy
    +
    +    virtualenv .env
    +    source .env/bin/activate
    +    pip install -r requirements.txt
    +    pip install -e .
    +
    +p
    +    |  Compared to regular install via pip,
    +    |  #[+a(gh("spaCy", "requirements.txt")) requirements.txt]
    +    |  additionally installs developer dependencies such as Cython.
    +
    +p
    +    |  Instead of the above verbose commands, you can also use the following
    +    |  #[+a("http://www.fabfile.org/") Fabric] commands:
    +
    ++table(["Command", "Description"])
    +    +row
    +        +cell #[code fab env]
    +        +cell Create #[code virtualenv] and delete previous one, if it exists.
    +
    +    +row
    +        +cell #[code fab make]
    +        +cell Compile the source.
    +
    +    +row
    +        +cell #[code fab clean]
    +        +cell Remove compiled objects, including the generated C++.
    +
    +    +row
    +        +cell #[code fab test]
    +        +cell Run basic tests, aborting after first failure.
    +
    +p
    +    |  All commands assume that your #[code virtualenv] is located in a
    +    |  directory #[code .env]. If you're using a different directory, you can
    +    |  change it via the environment variable #[code VENV_DIR], for example:
    +
    ++code(false, "bash").
    +    VENV_DIR=".custom-env" fab clean make
    +
    ++h(4, "source-ubuntu") Ubuntu
    +
    +p Install system-level dependencies via #[code apt-get]:
    +
    ++code(false, "bash").
    +    sudo apt-get install build-essential python-dev git
    +
    ++h(4, "source-osx") macOS / OS X
    +
    +p
    +    |  Install a recent version of
    +    |  #[+a("https://developer.apple.com/xcode/") XCode], including the
    +    |  so-called "Command Line Tools". macOS and OS X ship with Python and git
    +    |  preinstalled. To compile spaCy with multi-threading support on macOS / OS X,
    +    |  #[+a("https://github.com/explosion/spaCy/issues/267") see here].
    +
    ++h(4, "source-windows") Windows
    +
    +p
    +    |  Install a version of
    +    |  #[+a("https://www.visualstudio.com/vs/visual-studio-express/") Visual Studio Express]
    +    |  that matches the version that was used to compile your Python
    +    |  interpreter. For official distributions these are:
    +
    ++table([ "Distribution", "Version"])
    +    +row
    +        +cell Python 2.7
    +        +cell Visual Studio 2008
    +
    +    +row
    +        +cell Python 3.4
    +        +cell Visual Studio 2010
    +
    +    +row
    +        +cell Python 3.5+
    +        +cell Visual Studio 2015
    +
    ++h(3, "tests") Run tests
    +
    +p
    +    |  spaCy comes with an #[+a(gh("spacy", "spacy/tests")) extensive test suite].
    +    |  First, find out where spaCy is installed:
    +
    ++code(false, "bash").
    +    python -c "import os; import spacy; print(os.path.dirname(spacy.__file__))"
    +
    +p
    +    |  Then run #[code pytest] on that directory. The flags #[code --slow] and
    +    |  #[code --model] are optional and enable additional tests.
    +
    ++code(false, "bash").
    +    # make sure you are using recent pytest version
    +    python -m pip install -U pytest
    +
    +    python -m pytest <spacy-directory>                 # basic tests
    +    python -m pytest <spacy-directory> --slow          # basic and slow tests
    +    python -m pytest <spacy-directory> --models --all  # basic and all model tests
    +    python -m pytest <spacy-directory> --models --en   # basic and English model tests
    diff --git a/website/usage/_install/_quickstart.jade b/website/usage/_install/_quickstart.jade
    new file mode 100644
    index 000000000..8e581994c
    --- /dev/null
    +++ b/website/usage/_install/_quickstart.jade
    @@ -0,0 +1,26 @@
    +//- 💫 DOCS > USAGE > INSTALL > QUICKSTART
    +
    +- QUICKSTART[QUICKSTART.length - 1].options = Object.keys(MODELS).map(m => ({ id: m, title: LANGUAGES[m] }))
    +
    ++quickstart(QUICKSTART, "Quickstart")
    +    +qs({config: 'venv', python: 2}) python -m pip install -U virtualenv
    +    +qs({config: 'venv', python: 3}) python -m pip install -U venv
    +    +qs({config: 'venv', python: 2}) virtualenv .env
    +    +qs({config: 'venv', python: 3}) venv .env
    +    +qs({config: 'venv', os: 'mac'}) source .env/bin/activate
    +    +qs({config: 'venv', os: 'linux'}) source .env/bin/activate
    +    +qs({config: 'venv', os: 'windows'}) .env\Scripts\activate
    +
    +    +qs({config: 'gpu', os: 'mac'}) export PATH=$PATH:/usr/local/cuda-8.0/bin
    +    +qs({config: 'gpu', os: 'linux'}) export PATH=$PATH:/usr/local/cuda-8.0/bin
    +
    +    +qs({package: 'pip'}) pip install -U spacy
    +    +qs({package: 'conda'}) conda install -c conda-forge spacy
    +
    +    +qs({package: 'source'}) git clone https://github.com/explosion/spaCy
    +    +qs({package: 'source'}) cd spaCy
    +    +qs({package: 'source'}) pip install -r requirements.txt
    +    +qs({package: 'source'}) pip install -e .
    +
    +    for _, model in MODELS
    +        +qs({model: model}) spacy download #{model}
    diff --git a/website/usage/_install/_troubleshooting.jade b/website/usage/_install/_troubleshooting.jade
    new file mode 100644
    index 000000000..9fb92f17b
    --- /dev/null
    +++ b/website/usage/_install/_troubleshooting.jade
    @@ -0,0 +1,147 @@
    +//- 💫 DOCS > USAGE > INSTALL > TROUBLESHOOTING
    +
    +p
    +    |  This section collects some of the most common errors you may come
    +    |  across when installing, loading and using spaCy, as well as their solutions.
    +
    ++aside("Help us improve this guide")
    +    |  Did you come across a problem like the ones listed here and want to
    +    |  share the solution? You can find the "Suggest edits" button at the
    +    |  bottom of this page that points you to the source. We always
    +    |  appreciate #[+a(gh("spaCy") + "/pulls") pull requests]!
    +
    ++h(3, "compatible-model") No compatible model found
    +
    ++code(false, "text").
    +    No compatible model found for [lang] (spaCy v#{SPACY_VERSION}).
    +
    +p
    +    |  This usually means that the model you're trying to download does not
    +    |  exist, or isn't available for your version of spaCy. Check the
    +    |  #[+a(gh("spacy-models", "compatibility.json")) compatibility table]
    +    |  to see which models are available for your spaCy version. If you're using
    +    |  an old version, consider upgrading to the latest release. Note that while
    +    |  spaCy supports tokenization for
    +    |  #[+a("/usage/models/#languages") a variety of languages],
    +    |  not all of them come with statistical models. To only use the tokenizer,
    +    |  import the language's #[code Language] class instead, for example
    +    |  #[code from spacy.fr import French].
    +
    ++h(3, "symlink-privilege") Symbolic link privilege not held
    +
    ++code(false, "text").
    +    OSError: symbolic link privilege not held
    +
    +p
    +    |  To create #[+a("/usage/models/#usage") shortcut links] that let you
    +    |  load models by name, spaCy creates a symbolic link in the
    +    |  #[code spacy/data] directory. This means your user needs permission to do
    +    |  this. The above error mostly occurs when doing a system-wide installation,
    +    |  which will create the symlinks in a system directory. Run the
    +    |  #[code download] or #[code link] command as administrator, or use a
    +    |  #[code virtualenv] to install spaCy in a user directory, instead
    +    |  of doing a system-wide installation.
    +
    ++h(3, "no-cache-dir") No such option: --no-cache-dir
    +
    ++code(false, "text").
    +    no such option: --no-cache-dir
    +
    +p
    +    |  The #[code download] command uses pip to install the models and sets the
    +    |  #[code --no-cache-dir] flag to prevent it from requiring too much memory.
    +    |  #[+a("https://pip.pypa.io/en/stable/reference/pip_install/#caching") This setting]
    +    |  requires pip v6.0 or newer. Run #[code pip install -U pip] to upgrade to
    +    |  the latest version of pip. To see which version you have installed,
    +    |  run #[code pip --version].
    +
    ++h(3, "import-error") Import error
    +
    ++code(false, "text").
    +    Import Error: No module named spacy
    +
    +p
    +    |  This error means that the spaCy module can't be located on your system, or in
    +    |  your environment. Make sure you have spaCy installed. If you're using a
    +    |  #[code virtualenv], make sure it's activated and check that spaCy is
    +    |  installed in that environment – otherwise, you're trying to load a system
    +    |  installation. You can also run #[code which python] to find out where
    +    |  your Python executable is located.
    +
    ++h(3, "import-error-models") Import error: models
    +
    ++code(false, "text").
    +    ImportError: No module named 'en_core_web_sm'
    +
    +p
    +    |  As of spaCy v1.7, all models can be installed as Python packages. This means
    +    |  that they'll become importable modules of your application. When creating
    +    |  #[+a("/usage/models/#usage") shortcut links], spaCy will also try
    +    |  to import the model to load its meta data. If this fails, it's usually a
    +    |  sign that the package is not installed in the current environment.
    +    |  Run #[code pip list] or #[code pip freeze] to check which model packages
    +    |  you have installed, and install the
    +    |  #[+a("/models") correct models] if necessary. If you're
    +    |  importing a model manually at the top of a file, make sure to use the name
    +    |  of the package, not the shortcut link you've created.
    +
    ++h(3, "vocab-strings") File not found: vocab/strings.json
    +
    ++code(false, "text").
    +    FileNotFoundError: No such file or directory: [...]/vocab/strings.json
    +
    +p
    +    |  This error may occur when using #[code spacy.load()] to load
    +    |  a language model – either because you haven't set up a
    +    |  #[+a("/usage/models/#usage") shortcut link] for it, or because it
    +    |  doesn't actually exist. Set up a
    +    |  #[+a("/usage/models/#usage") shortcut link] for the model
    +    |  you want to load. This can either be an installed model package, or a
    +    |  local directory containing the model data. If you want to use one of the
    +    |  #[+a("/usage/models#languages") alpha tokenizers] for
    +    |  languages that don't yet have a statistical model, you should import its
    +    |  #[code Language] class instead, for example
    +    |  #[code from spacy.lang.bn import Bengali].
    +
    ++h(3, "command-not-found") Command not found
    +
    ++code(false, "text").
    +    command not found: spacy
    +
    +p
    +    |  This error may occur when running the #[code spacy] command from the
    +    |  command line. spaCy does not currently add an entry to our #[code PATH]
    +    |  environment variable, as this can lead to unexpected results, especially
    +    |  when using #[code virtualenv]. Instead, spaCy adds an auto-alias that
    +    |  maps #[code spacy] to #[code python -m spacy]. If this is not working as
    +    |  expected, run the command with #[code python -m], yourself –
    +    |  for example #[code python -m spacy download en]. For more info on this,
    +    |  see #[+api("cli#download") download].
    +
    ++h(3, "module-load") 'module' object has no attribute 'load'
    +
    ++code(false, "text").
    +    AttributeError: 'module' object has no attribute 'load'
    +
    +p
    +    |  While this could technically have many causes, including spaCy being
    +    |  broken, the most likely one is that your script's file or directory name
    +    |  is "shadowing" the module – e.g. your file is called #[code spacy.py],
    +    |  or a directory you're importing from is called #[code spacy]. So, when
    +    |  using spaCy, never call anything else #[code spacy].
    +
    ++h(3, "pron-lemma") Pronoun lemma is returned as #[code -PRON-]
    +
    ++code.
    +    doc = nlp(u'They are')
    +    print(doc[0].lemma_)
    +    # -PRON-
    +
    +p
    +    |  This is in fact expected behaviour and not a bug.
    +    |  Unlike verbs and common nouns, there's no clear base form of a personal
    +    |  pronoun. Should the lemma of "me" be "I", or should we normalize person
    +    |  as well, giving "it" — or maybe "he"? spaCy's solution is to introduce a
    +    |  novel symbol, #[code -PRON-], which is used as the lemma for
    +    |  all personal pronouns. For more info on this, see the
    +    |  #[+api("annotation#lemmatization") annotation specs] on lemmatization.
    diff --git a/website/docs/usage/dependency-parse.jade b/website/usage/_linguistic-features/_dependency-parse.jade
    similarity index 93%
    rename from website/docs/usage/dependency-parse.jade
    rename to website/usage/_linguistic-features/_dependency-parse.jade
    index beae36578..85d9179df 100644
    --- a/website/docs/usage/dependency-parse.jade
    +++ b/website/usage/_linguistic-features/_dependency-parse.jade
    @@ -1,6 +1,4 @@
    -//- 💫 DOCS > USAGE > DEPENDENCY PARSE
    -
    -include ../../_includes/_mixins
    +//- 💫 DOCS > USAGE > LINGUISTIC FEATURES > DEPENDENCY PARSE
     
     p
         |  spaCy features a fast and accurate syntactic dependency parser, and has
    @@ -11,8 +9,7 @@ p
         |  boolean value. If this attribute is #[code False], the default sentence
         |  iterator will raise an exception.
     
    -+h(2, "noun-chunks") Noun chunks
    -    +tag-model("dependency parse")
    ++h(3, "noun-chunks") Noun chunks
     
     p
         |  Noun chunks are "base noun phrases" – flat phrases that have a noun as
    @@ -41,7 +38,7 @@ p
         +annotation-row(["insurance liability", "liability", "dobj", "shift"], style)
         +annotation-row(["manufacturers", "manufacturers", "pobj", "toward"], style)
     
    -+h(2, "navigating") Navigating the parse tree
    ++h(3, "navigating") Navigating the parse tree
     
     p
         |  spaCy uses the terms #[strong head] and #[strong child] to describe the words
    @@ -110,7 +107,7 @@ p
         |  attribute, which provides a sequence of #[+api("token") #[code Token]]
         |  objects.
     
    -+h(3, "navigating-around") Iterating around the local tree
    ++h(4, "navigating-around") Iterating around the local tree
     
     p
         |  A few more convenience attributes are provided for iterating around the
    @@ -135,7 +132,7 @@ p
         |  method.
     
     +aside("Projective vs. non-projective")
    -    |  For the #[+a("/docs/usage/models#available") default English model], the
    +    |  For the #[+a("/models/en") default English model], the
         |  parse tree is #[strong projective], which means that there are no crossing
         |  brackets. The tokens returned by #[code .subtree] are therefore guaranteed
         |  to be contiguous. This is not true for the German model, which has many
    @@ -181,7 +178,7 @@ p
         +annotation-row(["their", "ADJ", "poss", "requests"], style)
         +annotation-row(["requests", "NOUN", "dobj", "submit"], style)
     
    -+h(2, "displacy") Visualizing dependencies
    ++h(3, "displacy") Visualizing dependencies
     
     p
         |  The best way to understand spaCy's dependency parser is interactively.
    @@ -201,14 +198,14 @@ p
     
     +infobox
         |  For more details and examples, see the
    -    |  #[+a("/docs/usage/visualizers") usage guide on visualizing spaCy]. You
    +    |  #[+a("/usage/visualizers") usage guide on visualizing spaCy]. You
         |  can also test displaCy in our #[+a(DEMOS_URL + "/displacy", true) online demo].
     
    -+h(2, "disabling") Disabling the parser
    ++h(3, "disabling") Disabling the parser
     
     p
    -    |  In the #[+a("/docs/usage/models/available") default models], the parser
    -    |  is loaded and enabled as part of the
    +    |  In the #[+a("/models") default models], the parser is loaded and enabled
    +    |  as part of the
         |  #[+a("docs/usage/language-processing-pipelines") standard processing pipeline].
         |  If you don't need any of the syntactic information, you should disable
         |  the parser. Disabling the parser will make spaCy load and run much faster.
    @@ -225,7 +222,7 @@ p
             |  Since spaCy v2.0 comes with better support for customising the
             |  processing pipeline components, the #[code parser] keyword argument
             |  has been replaced with #[code disable], which takes a list of
    -        |  #[+a("/docs/usage/language-processing-pipeline") pipeline component names].
    +        |  #[+a("/usage/processing-pipelines") pipeline component names].
             |  This lets you disable both default and custom components when loading
             |  a model, or initialising a Language class via
             |  #[+api("language-from_disk") #[code from_disk]].
    diff --git a/website/docs/usage/entity-recognition.jade b/website/usage/_linguistic-features/_named-entities.jade
    similarity index 74%
    rename from website/docs/usage/entity-recognition.jade
    rename to website/usage/_linguistic-features/_named-entities.jade
    index 826de1543..f42df3342 100644
    --- a/website/docs/usage/entity-recognition.jade
    +++ b/website/usage/_linguistic-features/_named-entities.jade
    @@ -1,6 +1,4 @@
    -//- 💫 DOCS > USAGE > NAMED ENTITY RECOGNITION
    -
    -include ../../_includes/_mixins
    +//- 💫 DOCS > USAGE > LINGUISTIC FEATURES > NAMED ENTITY RECOGNITION
     
     p
         |  spaCy features an extremely fast statistical entity recognition system,
    @@ -9,12 +7,11 @@ p
         |  locations, organizations and products. You can add arbitrary classes to
         |  the entity recognition system, and update the model with new examples.
     
    -+h(2, "101") Named Entity Recognition 101
    -    +tag-model("named entities")
    ++h(3, "101") Named Entity Recognition 101
     
    -include _spacy-101/_named-entities
    +include ../_spacy-101/_named-entities
     
    -+h(2, "accessing") Accessing entity annotations
    ++h(3, "accessing") Accessing entity annotations
     
     p
         |  The standard way to access entity annotations is the
    @@ -62,7 +59,7 @@ p
         +annotation-row(["delivery", 2, "O", '""', "outside an entity"], style)
         +annotation-row(["robots", 2, "O", '""', "outside an entity"], style)
     
    -+h(2, "setting") Setting entity annotations
    ++h(3, "setting") Setting entity annotations
     
     p
         |  To ensure that the sequence of token annotations remains consistent, you
    @@ -92,7 +89,7 @@ p
         |  but at the document level, the entity will have the start and end
         |  indices #[code (0, 7)].
     
    -+h(3, "setting-from-array") Setting entity annotations from array
    ++h(4, "setting-from-array") Setting entity annotations from array
     
     p
         |  You can also assign entity annotations using the
    @@ -114,7 +111,7 @@ p
         doc.from_array(header, attr_array)
         assert list(doc.ents)[0].text == u'London'
     
    -+h(3, "setting-cython") Setting entity annotations in Cython
    ++h(4, "setting-cython") Setting entity annotations in Cython
     
     p
         |  Finally, you can always write to the underlying struct, if you compile
    @@ -137,18 +134,16 @@ p
         |  you'll have responsibility for ensuring that the data is left in a
         |  consistent state.
     
    -+h(2, "entity-types") Built-in entity types
    ++h(3, "entity-types") Built-in entity types
     
     +aside("Tip: Understanding entity types")
         |  You can also use #[code spacy.explain()] to get the description for the
         |  string representation of an entity label. For example,
         |  #[code spacy.explain("LANGUAGE")] will return "any named language".
     
    -include ../api/_annotation/_named-entities
    +include ../../api/_annotation/_named-entities
     
    -+h(2, "updating") Training and updating
    -
    -+under-construction
    ++h(3, "updating") Training and updating
     
     p
         |  To provide training examples to the entity recogniser, you'll first need
    @@ -166,65 +161,24 @@ p
     
     +code.
         doc = Doc(nlp.vocab, [u'rats', u'make', u'good', u'pets'])
    -    gold = GoldParse(doc, [u'U-ANIMAL', u'O', u'O', u'O'])
    +    gold = GoldParse(doc, entities=[u'U-ANIMAL', u'O', u'O', u'O'])
     
     +infobox
         |  For more details on #[strong training and updating] the named entity
    -    |  recognizer, see the usage guides on #[+a("/docs/usage/training") training]
    -    |  and #[+a("/docs/usage/training-ner") training the named entity recognizer],
    +    |  recognizer, see the usage guides on #[+a("/usage/training") training]
         |  or check out the runnable
         |  #[+src(gh("spaCy", "examples/training/train_ner.py")) training script]
         |  on GitHub.
     
    -+h(3, "updating-biluo") The BILUO Scheme
    ++h(4, "updating-biluo") The BILUO Scheme
     
     p
         |  You can also provide token-level entity annotation, using the
         |  following tagging scheme to describe the entity boundaries:
     
    -+table([ "Tag", "Description" ])
    -    +row
    -        +cell #[code #[span.u-color-theme B] EGIN]
    -        +cell The first token of a multi-token entity.
    +include ../../api/_annotation/_biluo
     
    -    +row
    -        +cell #[code #[span.u-color-theme I] N]
    -        +cell An inner token of a multi-token entity.
    -
    -    +row
    -        +cell #[code #[span.u-color-theme L] AST]
    -        +cell The final token of a multi-token entity.
    -
    -    +row
    -        +cell #[code #[span.u-color-theme U] NIT]
    -        +cell A single-token entity.
    -
    -    +row
    -        +cell #[code #[span.u-color-theme O] UT]
    -        +cell A non-entity token.
    -
    -+aside("Why BILUO, not IOB?")
    -    |  There are several coding schemes for encoding entity annotations as
    -    |  token tags.  These coding schemes are equally expressive, but not
    -    |  necessarily equally learnable.
    -    |  #[+a("http://www.aclweb.org/anthology/W09-1119") Ratinov and Roth]
    -    |  showed that the minimal #[strong Begin], #[strong In], #[strong Out]
    -    |  scheme was more difficult to learn than the #[strong BILUO] scheme that
    -    |  we use, which explicitly marks boundary tokens.
    -
    -p
    -    |  spaCy translates the character offsets into this scheme, in order to
    -    |  decide the cost of each action given the current state of the entity
    -    |  recogniser. The costs are then used to calculate the gradient of the
    -    |  loss, to train the model. The exact algorithm is a pastiche of
    -    |  well-known methods, and is not currently described in any single
    -    |  publication. The model is a greedy transition-based parser guided by a
    -    |  linear model whose weights are learned using the averaged perceptron
    -    |  loss, via the #[+a("http://www.aclweb.org/anthology/C12-1059") dynamic oracle]
    -    |  imitation learning strategy. The transition system is equivalent to the
    -    |  BILOU tagging scheme.
    -
    -+h(2, "displacy") Visualizing named entities
    ++h(3, "displacy") Visualizing named entities
     
     p
         |  The #[+a(DEMOS_URL + "/displacy-ent/") displaCy #[sup ENT] visualizer]
    @@ -238,7 +192,7 @@ p
     
     p
         |  For more details and examples, see the
    -    |  #[+a("/docs/usage/visualizers") usage guide on visualizing spaCy].
    +    |  #[+a("/usage/visualizers") usage guide on visualizing spaCy].
     
     +code("Named Entity example").
         import spacy
    diff --git a/website/docs/usage/pos-tagging.jade b/website/usage/_linguistic-features/_pos-tagging.jade
    similarity index 76%
    rename from website/docs/usage/pos-tagging.jade
    rename to website/usage/_linguistic-features/_pos-tagging.jade
    index effc185e9..4e845cdaf 100644
    --- a/website/docs/usage/pos-tagging.jade
    +++ b/website/usage/_linguistic-features/_pos-tagging.jade
    @@ -1,20 +1,10 @@
    -//- 💫 DOCS > USAGE > PART-OF-SPEECH TAGGING
    +//- 💫 DOCS > USAGE > LINGUISTIC FEATURES > PART-OF-SPEECH TAGGING
     
    -include ../../_includes/_mixins
    +include ../_spacy-101/_pos-deps
     
    -p
    -    |  Part-of-speech tags are labels like noun, verb, adjective etc that are
    -    |  assigned to each token in the document. They're useful in rule-based
    -    |  processes. They can also be useful features in some statistical models.
    +//-+aside("Help – spaCy's output is wrong!")
     
    -+h(2, "101") Part-of-speech tagging 101
    -    +tag-model("tagger", "dependency parse")
    -
    -include _spacy-101/_pos-deps
    -
    -+aside("Help – spaCy's output is wrong!")
    -
    -+h(2, "rule-based-morphology") Rule-based morphology
    ++h(3, "rule-based-morphology") Rule-based morphology
     
     p
         |  Inflectional morphology is the process by which a root form of a word is
    @@ -54,7 +44,7 @@ p
     +list("numbers")
         +item
             |  The tokenizer consults a
    -        |  #[+a("/docs/usage/adding-languages#tokenizer-exceptions") mapping table]
    +        |  #[+a("/usage/adding-languages#tokenizer-exceptions") mapping table]
             |  #[code TOKENIZER_EXCEPTIONS], which allows sequences of characters
             |  to be mapped to multiple tokens. Each token may be assigned a part
             |  of speech and one or more morphological features.
    @@ -68,7 +58,7 @@ p
     
         +item
             |  For words whose POS is not set by a prior process, a
    -        |  #[+a("/docs/usage/adding-languages#tag-map") mapping table]
    +        |  #[+a("/usage/adding-languages#tag-map") mapping table]
             |  #[code TAG_MAP] maps the tags to a part-of-speech and a set of
             |  morphological features.
     
    @@ -80,6 +70,4 @@ p
             |  list-based exception files, acquired from
             |  #[+a("https://wordnet.princeton.edu/") WordNet].
     
    -+h(2, "pos-schemes") Part-of-speech tag schemes
    -
    -include ../api/_annotation/_pos-tags
    +include ../../api/_annotation/_pos-tags
    diff --git a/website/docs/usage/rule-based-matching.jade b/website/usage/_linguistic-features/_rule-based-matching.jade
    similarity index 95%
    rename from website/docs/usage/rule-based-matching.jade
    rename to website/usage/_linguistic-features/_rule-based-matching.jade
    index 71400ea55..88a713ffc 100644
    --- a/website/docs/usage/rule-based-matching.jade
    +++ b/website/usage/_linguistic-features/_rule-based-matching.jade
    @@ -1,19 +1,18 @@
     //- 💫 DOCS > USAGE > RULE-BASED MATCHING
     
    -include ../../_includes/_mixins
    -
     p
    -    |  spaCy features a rule-matching engine that operates over tokens, similar
    +    |  spaCy features a rule-matching engine, the #[+api("matcher") #[code Matcher]],
    +    |  that operates over tokens, similar
         |  to regular expressions. The rules can refer to token annotations (e.g.
         |  the token #[code text] or #[code tag_], and flags (e.g. #[code IS_PUNCT]).
         |  The rule matcher also lets you pass in a custom callback
         |  to act on matches – for example, to merge entities and apply custom labels.
         |  You can also associate patterns with entity IDs, to allow some basic
    -    |  entity linking or disambiguation.
    +    |  entity linking or disambiguation. To match large terminology lists,
    +    |  you can use the #[+api("phrasematcher") #[code PhraseMatcher]], which
    +    |  accepts #[code Doc] objects as match patterns.
     
    -//-+aside("What about \"real\" regular expressions?")
    -
    -+h(2, "adding-patterns") Adding patterns
    ++h(3, "adding-patterns") Adding patterns
     
     p
         |  Let's say we want to enable spaCy to find a combination of three tokens:
    @@ -76,7 +75,7 @@ p
         |  other pattern types. You shouldn't have to create different matchers for
         |  each of those processes.
     
    -+h(2, "on_match") Adding #[code on_match] rules
    ++h(3, "on_match") Adding #[code on_match] rules
     
     p
         |  To move on to a more realistic example, let's say you're working with a
    @@ -142,7 +141,7 @@ p
                                    options={'ents': ['EVENT']})
     
         |  For more info and examples, see the usage guide on
    -    |  #[+a("/docs/usage/visualizers") visualizing spaCy].
    +    |  #[+a("/usage/visualizers") visualizing spaCy].
     
     p
         |  We can now call the matcher on our documents. The patterns will be
    @@ -184,7 +183,7 @@ p
                 |  A list of #[code (match_id, start, end)] tuples, describing the
                 |  matches. A match tuple describes a span #[code doc[start:end]].
     
    -+h(2, "quantifiers") Using operators and quantifiers
    ++h(3, "quantifiers") Using operators and quantifiers
     
     p
         |  The matcher also lets you use quantifiers, specified as the #[code 'OP']
    @@ -221,7 +220,7 @@ p
             +cell match 0 or 1 times
             +cell optional, max one
     
    -+h(2, "example1") Example: Using linguistic annotations
    ++h(3, "example1") Example: Using linguistic annotations
     
     p
         |  Let's say you're analysing user comments and you want to find out what
    @@ -246,13 +245,13 @@ p
     p
         |  To get a quick overview of the results, you could collect all sentences
         |  containing a match and render them with the
    -    |  #[+a("/docs/usage/visualizers") displaCy visualizer].
    +    |  #[+a("/usage/visualizers") displaCy visualizer].
         |  In the callback function, you'll have access to the #[code start] and
         |  #[code end] of each match, as well as the parent #[code Doc]. This lets
         |  you determine the sentence containing the match,
         |  #[code doc[start : end].sent], and calculate the start and end of the
         |  matched span within the sentence. Using displaCy in
    -    |  #[+a("/docs/usage/visualizers#manual-usage") "manual" mode] lets you
    +    |  #[+a("/usage/visualizers#manual-usage") "manual" mode] lets you
         |  pass in a list of dictionaries containing the text and entities to render.
     
     +code.
    @@ -283,7 +282,7 @@ p
         # set manual=True to make displaCy render straight from a dictionary
         displacy.serve(matched_sents, style='ent', manual=True)
     
    -+h(2, "example2") Example: Phone numbers
    ++h(3, "example2") Example: Phone numbers
     
     p
         |  Phone numbers can have many different formats and matching them is often
    @@ -321,7 +320,7 @@ p
         |  extend, and doesn't require any training data – only a set of
         |  test cases.
     
    -+h(2, "example3") Example: Hashtags and emoji on social media
    ++h(3, "example3") Example: Hashtags and emoji on social media
     
     p
         |  Social media posts, especially tweets, can be difficult to work with.
    diff --git a/website/docs/usage/customizing-tokenizer.jade b/website/usage/_linguistic-features/_tokenization.jade
    similarity index 76%
    rename from website/docs/usage/customizing-tokenizer.jade
    rename to website/usage/_linguistic-features/_tokenization.jade
    index 0bc81771d..182bc31e9 100644
    --- a/website/docs/usage/customizing-tokenizer.jade
    +++ b/website/usage/_linguistic-features/_tokenization.jade
    @@ -1,6 +1,4 @@
    -//- 💫 DOCS > USAGE > TOKENIZER
    -
    -include ../../_includes/_mixins
    +//- 💫 DOCS > USAGE > LINGUISTIC FEATURES > TOKENIZATION
     
     p
         |  Tokenization is the task of splitting a text into meaningful segments,
    @@ -11,15 +9,14 @@ p
         |  #[code spaces] booleans, which allow you to maintain alignment of the
         |  tokens into the original string.
     
    -+h(2, "101") Tokenizer 101
    +include ../_spacy-101/_tokenization
     
    -include _spacy-101/_tokenization
    -
    -+h(3, "101-data") Tokenizer data
    ++h(4, "101-data") Tokenizer data
     
     p
         |  #[strong Global] and #[strong language-specific] tokenizer data is
    -    |  supplied via the language data in #[+src(gh("spaCy", "spacy/lang")) spacy/lang].
    +    |  supplied via the language data in
    +    |  #[+src(gh("spaCy", "spacy/lang")) #[code spacy/lang]].
         |  The tokenizer exceptions define special cases like "don't" in English,
         |  which needs to be split into two tokens: #[code {ORTH: "do"}] and
         |  #[code {ORTH: "n't", LEMMA: "not"}]. The prefixes, suffixes and infixes
    @@ -27,16 +24,14 @@ p
         |  (at the end of a sentence), and when to leave token containing periods
         |  intact (abbreviations like "U.S.").
     
    -+image
    -    include ../../assets/img/docs/language_data.svg
    -    .u-text-right
    -        +button("/assets/img/docs/language_data.svg", false, "secondary").u-text-tag View large graphic
    ++graphic("/assets/img/language_data.svg")
    +    include ../../assets/img/language_data.svg
     
     +infobox
         |  For more details on the language-specific data, see the
    -    |  usage guide on #[+a("/docs/usage/adding-languages") adding languages].
    +    |  usage guide on #[+a("/usage/adding-languages") adding languages].
     
    -+h(2, "special-cases") Adding special case tokenization rules
    ++h(3, "special-cases") Adding special case tokenization rules
     
     p
         |  Most domains have at least some idiosyncrasies that require custom
    @@ -46,7 +41,7 @@ p
     +aside("Language data vs. custom tokenization")
         |  Tokenization rules that are specific to one language, but can be
         |  #[strong generalised across that language] should ideally live in the
    -    |  language data in #[+src(gh("spaCy", "spacy/lang")) spacy/lang] – we
    +    |  language data in #[+src(gh("spaCy", "spacy/lang")) #[code spacy/lang]] – we
         |  always appreciate pull requests! Anything that's specific to a domain or
         |  text type – like financial trading abbreviations, or Bavarian youth slang
         |  – should be added as a special case rule to your tokenizer instance. If
    @@ -69,9 +64,12 @@ p
         special_case = [{ORTH: u'gim', LEMMA: u'give', POS: u'VERB'}, {ORTH: u'me'}]
         nlp.tokenizer.add_special_case(u'gimme', special_case)
         assert [w.text for w in nlp(u'gimme that')] == [u'gim', u'me', u'that']
    -    assert [w.lemma_ for w in nlp(u'gimme that')] == [u'give', u'me', u'that']
    +    # Pronoun lemma is returned as -PRON-!
    +    assert [w.lemma_ for w in nlp(u'gimme that')] == [u'give', u'-PRON-', u'that']
     
     p
    +    |  For details on spaCy's custom pronoun lemma #[code -PRON-],
    +    |  #[+a("/usage/#pron-lemma") see here].
         |  The special case doesn't have to match an entire whitespace-delimited
         |  substring. The tokenizer will incrementally split off punctuation, and
         |  keep looking up the remaining substring:
    @@ -97,7 +95,7 @@ p
         |  #[+api("language") #[code Language]] class itself.
     
     
    -+h(2, "how-tokenizer-works") How spaCy's tokenizer works
    ++h(3, "how-tokenizer-works") How spaCy's tokenizer works
     
     p
         |  spaCy introduces a novel tokenization algorithm, that gives a better
    @@ -113,8 +111,8 @@ p
         |  algorithm in Python, optimized for readability rather than performance:
     
     +code.
    -    def tokenizer_pseudo_code(text, find_prefix, find_suffix,
    -                              find_infixes, special_cases):
    +    def tokenizer_pseudo_code(text, special_cases,
    +                              find_prefix, find_suffix, find_infixes):
             tokens = []
             for substring in text.split(' '):
                 suffixes = []
    @@ -162,11 +160,11 @@ p
             |  like hyphens etc.
         +item Once we can't consume any more of the string, handle it as a single token.
     
    -+h(2, "native-tokenizers") Customizing spaCy's Tokenizer class
    ++h(3, "native-tokenizers") Customizing spaCy's Tokenizer class
     
     p
         |  Let's imagine you wanted to create a tokenizer for a new language or
    -    |  specific domain. There are four things you would need to define:
    +    |  specific domain. There are five things you would need to define:
     
     +list("numbers")
         +item
    @@ -188,6 +186,11 @@ p
             |  A function #[code infixes_finditer], to handle non-whitespace
             |  separators, such as hyphens etc.
     
    +    +item
    +        |  An optional boolean function #[code token_match] matching strings
    +        |  that should never be split, overriding the previous rules.
    +        |  Useful for things like URLs or numbers.
    +
     p
         |  You shouldn't usually need to create a #[code Tokenizer] subclass.
         |  Standard usage is to use #[code re.compile()] to build a regular
    @@ -200,10 +203,14 @@ p
     
         prefix_re = re.compile(r'''[\[\("']''')
         suffix_re = re.compile(r'''[\]\)"']''')
    +    infix_re = re.compile(r'''[-~]''')
    +    simple_url_re = re.compile(r'''^https?://''')
     
         def custom_tokenizer(nlp):
             return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
    -                                    suffix_search=suffix_re.search)
    +                                    suffix_search=suffix_re.search,
    +                                    infix_finditer=infix_re.finditer,
    +                                    token_match=simple_url_re.match)
     
         nlp = spacy.load('en')
         nlp.tokenizer = custom_tokenizer(nlp)
    @@ -213,7 +220,7 @@ p
         |  specialize are #[code find_prefix], #[code find_suffix] and
         |  #[code find_infix].
     
    -+h(2, "custom-tokenizer") Hooking an arbitrary tokenizer into the pipeline
    ++h(3, "custom-tokenizer") Hooking an arbitrary tokenizer into the pipeline
     
     p
         |  The tokenizer is the first component of the processing pipeline and the
    @@ -222,11 +229,8 @@ p
         |  it takes a text and returns a #[code Doc], whereas all other components
         |  expect to already receive a tokenized #[code Doc].
     
    -+image
    -    include ../../assets/img/docs/pipeline.svg
    -    .u-text-right
    -        +button("/assets/img/docs/pipeline.svg", false, "secondary").u-text-tag View large graphic
    -
    ++graphic("/assets/img/pipeline.svg")
    +    include ../../assets/img/pipeline.svg
     
     p
         |  To overwrite the existing tokenizer, you need to replace
    @@ -243,7 +247,7 @@ p
             +cell unicode
             +cell The raw text to tokenize.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell The tokenized document.
    @@ -295,3 +299,36 @@ p
     +code.
         nlp = spacy.load('en')
         nlp.tokenizer = WhitespaceTokenizer(nlp.vocab)
    +
    ++h(3, "own-annotations") Bringing your own annotations
    +
    +p
    +    |  spaCy generally assumes by default that your data is raw text. However,
    +    |  sometimes your data is partially annotated, e.g. with pre-existing
    +    |  tokenization, part-of-speech tags, etc. The most common situation is
    +    |  that you have pre-defined tokenization. If you have a list of strings,
    +    |  you can create a #[code Doc] object directly. Optionally, you can also
    +    |  specify a list of boolean values, indicating whether each word has a
    +    |  subsequent space.
    +
    ++code.
    +    doc = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'], spaces=[False, True, False, False])
    +
    +p
    +    |  If provided, the spaces list must be the same length as the words list.
    +    |  The spaces list affects the #[code doc.text], #[code span.text],
    +    |  #[code token.idx], #[code span.start_char] and #[code span.end_char]
    +    |  attributes. If you don't provide a #[code spaces] sequence, spaCy will
    +    |  assume that all words are whitespace delimited.
    +
    ++code.
    +    good_spaces = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'], spaces=[False, True, False, False])
    +    bad_spaces = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'])
    +    assert bad_spaces.text == u'Hello , world !'
    +    assert good_spaces.text == u'Hello, world!'
    +
    +p
    +    |  Once you have a #[+api("doc") #[code Doc]] object, you can write to its
    +    |  attributes to set the part-of-speech tags, syntactic dependencies, named
    +    |  entities and other attributes. For details, see the respective usage
    +    |  pages.
    diff --git a/website/usage/_models/_available-models.jade b/website/usage/_models/_available-models.jade
    new file mode 100644
    index 000000000..b4fa1fc90
    --- /dev/null
    +++ b/website/usage/_models/_available-models.jade
    @@ -0,0 +1,22 @@
    +//- 💫 DOCS > USAGE > MODELS > AVAILABE MODELS
    +
    +p
    +    |  Model differences are mostly statistical. In general, we do expect larger
    +    |  models to be "better" and more accurate overall. Ultimately, it depends on
    +    |  your use case and requirements, and we recommend starting with the default
    +    |  models (marked with a star below). For a more detailed overview, see the
    +    |  #[+a("/models") models directory].
    +
    ++table(["Name", "Language", "Type"])
    +    for models, lang in MODELS
    +        for model, i in models
    +            - var comps = getModelComponents(model)
    +            +row
    +                +cell #[+a("/models/" + lang + "#" + model) #[code=model]]
    +                    if i == 0
    +                        +icon("star", 16).o-icon--inline.u-color-theme
    +                +cell #{LANGUAGES[comps.lang]}
    +                +cell #{MODEL_META[comps.type]}
    +
    +.u-text-right
    +    +button("/models", true, "primary", "small") View models directory
    diff --git a/website/usage/_models/_install-basics.jade b/website/usage/_models/_install-basics.jade
    new file mode 100644
    index 000000000..a8029cc10
    --- /dev/null
    +++ b/website/usage/_models/_install-basics.jade
    @@ -0,0 +1,33 @@
    +//- 💫 DOCS > USAGE > MODELS > INSTALLATION BASICS
    +
    +p
    +    |  The easiest way to download a model is via spaCy's
    +    |  #[+api("cli#download") #[code download]] command. It takes care of
    +    |  finding the best-matching model compatible with your spaCy installation.
    +
    +- var models = Object.keys(MODELS).map(function(lang) { return "spacy download " + lang })
    ++code(false, "bash").
    +    # out-of-the-box: download best-matching default model
    +    #{Object.keys(MODELS).map(function(l) {return "spacy download " + l}).join('\n')}
    +
    +    # download best-matching version of specific model for your spaCy installation
    +    spacy download en_core_web_sm
    +
    +    # download exact model version (doesn't create shortcut link)
    +    spacy download en_core_web_sm-2.0.0 --direct
    +
    +p
    +    |  The download command will #[+a("/usage/models#download-pip") install the model] via
    +    |  pip, place the package in your #[code site-packages] directory and create
    +    |  a #[+a("/usage/models#usage") shortcut link] that lets you load the model by a custom
    +    |  name. The shortcut link will be the same as the model name used in
    +    |  #[code spacy download].
    +
    ++code(false, "bash").
    +    pip install spacy
    +    spacy download en
    +
    ++code.
    +    import spacy
    +    nlp = spacy.load('en')
    +    doc = nlp(u'This is a sentence.')
    diff --git a/website/docs/usage/models.jade b/website/usage/_models/_install.jade
    similarity index 67%
    rename from website/docs/usage/models.jade
    rename to website/usage/_models/_install.jade
    index 7421e8aad..1d15199a2 100644
    --- a/website/docs/usage/models.jade
    +++ b/website/usage/_models/_install.jade
    @@ -1,38 +1,4 @@
    -//- 💫 DOCS > USAGE > MODELS
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  As of v1.7.0, models for spaCy can be installed as #[strong Python packages].
    -    |  This means that they're a component of your application, just like any
    -    |  other module. They're versioned and can be defined as a dependency in your
    -    |  #[code requirements.txt]. Models can be installed from a download URL or
    -    |  a local directory, manually or via #[+a("https://pypi.python.org/pypi/pip") pip].
    -    |  Their data can be located anywhere on your file system.
    -
    -+aside("Important note")
    -    |  If you're upgrading to spaCy v1.7.x or v2.x, you need to
    -    |  #[strong download the new models]. If you've trained statistical models
    -    |  that use spaCy's annotations, you should #[strong retrain your models]
    -    |  after updating spaCy. If you don't retrain, you may suffer train/test
    -    |  skew, which might decrease your accuracy.
    -
    -+quickstart(QUICKSTART_MODELS, "Quickstart", "Install a default model, get the code to load it from within spaCy and an example to test it. For more options, see the section on available models below.")
    -    for models, lang in MODELS
    -        - var package = (models.length == 1) ? models[0] : models.find(function(m) { return m.def })
    -        +qs({lang: lang}) spacy download #{lang}
    -        +qs({lang: lang}, "divider")
    -        +qs({lang: lang, load: "module"}, "python") import #{package.id}
    -        +qs({lang: lang, load: "module"}, "python") nlp = #{package.id}.load()
    -        +qs({lang: lang, load: "spacy"}, "python") nlp = spacy.load('#{lang}')
    -        +qs({lang: lang, config: "example"}, "python") doc = nlp(u"#{EXAMPLE_SENTENCES[lang]}")
    -        +qs({lang: lang, config: "example"}, "python") print([(w.text, w.pos_) for w in doc])
    -
    -+h(2, "available") Available models
    -
    -include _models-list
    -
    -+h(2, "download") Downloading models
    +//- 💫 DOCS > USAGE > MODELS > INSTALLATION
     
     +aside("Downloading models in spaCy < v1.7")
         |  In older versions of spaCy, you can still use the old download commands.
    @@ -47,37 +13,8 @@ include _models-list
         |  The old models are also #[+a(gh("spacy") + "/tree/v1.6.0") attached to the v1.6.0 release].
         |  To download and install them manually, unpack the archive, drop the
         |  contained directory into #[code spacy/data].
    -p
    -    |  The easiest way to download a model is via spaCy's
    -    |  #[+api("cli#download") #[code download]] command. It takes care of
    -    |  finding the best-matching model compatible with your spaCy installation.
     
    -- var models = Object.keys(MODELS).map(function(lang) { return "spacy download " + lang })
    -+code(false, "bash").
    -    # out-of-the-box: download best-matching default model
    -    #{Object.keys(MODELS).map(function(l) {return "spacy download " + l}).join('\n')}
    -
    -    # download best-matching version of specific model for your spaCy installation
    -    spacy download en_core_web_md
    -
    -    # download exact model version (doesn't create shortcut link)
    -    spacy download en_core_web_md-1.2.0 --direct
    -
    -p
    -    |  The download command will #[+a("#download-pip") install the model] via
    -    |  pip, place the package in your #[code site-packages] directory and create
    -    |  a #[+a("#usage") shortcut link] that lets you load the model by a custom
    -    |  name. The shortcut link will be the same as the model name used in
    -    |  #[code spacy.download].
    -
    -+code(false, "bash").
    -    pip install spacy
    -    spacy download en
    -
    -+code.
    -    import spacy
    -    nlp = spacy.load('en')
    -    doc = nlp(u'This is a sentence.')
    +include _install-basics
     
     +h(3, "download-pip") Installation via pip
     
    @@ -107,8 +44,8 @@ p
     +infobox
         |  You can also add the direct download link to your application's
         |  #[code requirements.txt]. For more details,
    -    |  see the usage guide on
    -    |  #[+a("/docs/usage/production-use#models") working with models in production].
    +    |  see the section on
    +    |  #[+a("/models/#production") working with models in production].
     
     
     +h(3, "download-manual") Manual download and installation
    @@ -135,7 +72,7 @@ p
         |  local file system. To use it with spaCy, simply assign it a name by
         |  creating a #[+a("#usage") shortcut link] for the data directory.
     
    -+h(2, "usage") Using models with spaCy
    ++h(3, "usage") Using models with spaCy
     
     p
         |  To load a model, use #[+api("spacy#load") #[code spacy.load()]] with the
    @@ -201,7 +138,7 @@ p
         |  privileges, the #[code spacy link] command may fail. The easiest solution
         |  is to re-run the command as admin, or use a #[code virtualenv]. For more
         |  info on this, see the
    -    |  #[+a("/docs/usage/#symlink-privilege") troubleshooting guide].
    +    |  #[+a("/usage/#symlink-privilege") troubleshooting guide].
     
     +h(3, "usage-import") Importing models as modules
     
    @@ -227,15 +164,15 @@ p
         |  #[code spacy.load()].
     
     +infobox
    -    |  For more details, see the usage guide on
    -    |  #[+a("/docs/usage/production-use#models") working with models in production].
    +    |  For more details, see the section on
    +    |  #[+a("/models/#production") working with models in production].
     
    -+h(2, "own-models") Using your own models
    ++h(3, "own-models") Using your own models
     
     p
         |  If you've trained your own model, for example for
    -    |  #[+a("/docs/usage/adding-languages") additional languages] or
    -    |  #[+a("/docs/usage/train-ner") custom named entities], you can save its
    +    |  #[+a("/usage/adding-languages") additional languages] or
    +    |  #[+a("/usage/training#ner") custom named entities], you can save its
         |  state using the #[+api("language#to_disk") #[code Language.to_disk()]]
         |  method. To make the model more convenient to deploy, we recommend
         |  wrapping it as a Python package.
    @@ -243,4 +180,4 @@ p
     +infobox("Saving and loading models")
         |  For more information and a detailed guide on how to package your model,
         |  see the documentation on
    -    |  #[+a("/docs/usage/saving-loading#models") saving and loading models].
    +    |  #[+a("/usage/training#saving-loading") saving and loading models].
    diff --git a/website/usage/_models/_production.jade b/website/usage/_models/_production.jade
    new file mode 100644
    index 000000000..43f4b1ba9
    --- /dev/null
    +++ b/website/usage/_models/_production.jade
    @@ -0,0 +1,81 @@
    +//- 💫 DOCS > USAGE > MODELS > PRODUCTION USE
    +
    +p
    +    |  If your application depends on one or more models,
    +    |  you'll usually want to integrate them into your continuous integration
    +    |  workflow and build process. While spaCy provides a range of useful helpers
    +    |  for downloading, linking and loading models, the underlying functionality
    +    |  is entirely based on native Python packages. This allows your application
    +    |  to handle a model like any other package dependency.
    +
    ++infobox("Training models for production")
    +    |  For an example of an automated model training and build process, see
    +    |  #[+a("/usage/training#example-training-spacy") this example] of how
    +    |  we're training and packaging our models for spaCy.
    +
    ++h(3, "models-download") Downloading and requiring model dependencies
    +
    +p
    +    |  spaCy's built-in #[+api("cli#download") #[code download]] command
    +    |  is mostly intended as a convenient, interactive wrapper. It performs
    +    |  compatibility checks and prints detailed error messages and warnings.
    +    |  However, if you're downloading models as part of an automated build
    +    |  process, this only adds an unnecessary layer of complexity. If you know
    +    |  which models your application needs, you should be specifying them directly.
    +
    +p
    +    |  Because all models are valid Python packages, you can add them to your
    +    |  application's #[code requirements.txt]. If you're running your own
    +    |  internal PyPi installation, you can simply upload the models there. pip's
    +    |  #[+a("https://pip.pypa.io/en/latest/reference/pip_install/#requirements-file-format") requirements file format]
    +    |  supports both package names to download via a PyPi server, as well as direct
    +    |  URLs.
    +
    ++code("requirements.txt", "text").
    +    spacy>=2.0.0,<3.0.0
    +    -e #{gh("spacy-models")}/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz#en_core_web_sm
    +
    +p
    +    |  Specifying #[code #egg=] with the package name tells pip
    +    |  which package to expect from the download URL. This way, the
    +    |  package won't be re-downloaded and overwritten if it's already
    +    |  installed - just like when you're downloading a package from PyPi.
    +
    +p
    +    |  All models are versioned and specify their spaCy dependency. This ensures
    +    |  cross-compatibility and lets you specify exact version requirements for
    +    |  each model. If you've trained your own model, you can use the
    +    |  #[+api("cli#package") #[code package]] command to generate the required
    +    |  meta data and turn it into a loadable package.
    +
    +
    ++h(3, "models-loading") Loading and testing models
    +
    +p
    +    |  Downloading models directly via pip won't call spaCy's link
    +    |  #[+api("cli#link") #[code link]] command, which creates
    +    |  symlinks for model shortcuts. This means that you'll have to run this
    +    |  command separately, or use the native #[code import] syntax to load the
    +    |  models:
    +
    ++code.
    +    import en_core_web_sm
    +    nlp = en_core_web_sm.load()
    +
    +p
    +    |  In general, this approach is recommended for larger code bases, as it's
    +    |  more "native", and doesn't depend on symlinks or rely on spaCy's loader
    +    |  to resolve string names to model packages. If a model can't be
    +    |  imported, Python will raise an #[code ImportError] immediately. And if a
    +    |  model is imported but not used, any linter will catch that.
    +
    +p
    +    |  Similarly, it'll give you more flexibility when writing tests that
    +    |  require loading models. For example, instead of writing your own
    +    |  #[code try] and #[code except] logic around spaCy's loader, you can use
    +    |  #[+a("http://pytest.readthedocs.io/en/latest/") pytest]'s
    +    |  #[+a("https://docs.pytest.org/en/latest/builtin.html#_pytest.outcomes.importorskip") #[code importorskip()]]
    +    |  method to only run a test if a specific model or model version is
    +    |  installed. Each model package exposes a #[code __version__] attribute
    +    |  which you can also use to perform your own version compatibility checks
    +    |  before loading a model.
    diff --git a/website/usage/_models/_quickstart.jade b/website/usage/_models/_quickstart.jade
    new file mode 100644
    index 000000000..c8f702cb4
    --- /dev/null
    +++ b/website/usage/_models/_quickstart.jade
    @@ -0,0 +1,17 @@
    +//- 💫 DOCS > USAGE > MODELS > QUICKSTART
    +
    +- QUICKSTART_MODELS[0].options = Object.keys(MODELS).map(m => ({ id: m, title: LANGUAGES[m], checked: m == 'en'}))
    ++quickstart(QUICKSTART_MODELS, "Quickstart", "Install a default model, get the code to load it from within spaCy and an example to test it. For more options, see the section on available models below.")
    +    for models, lang in MODELS
    +        - var package = models[0]
    +        +qs({lang: lang}) spacy download #{lang}
    +        +qs({lang: lang}, "divider")
    +        +qs({lang: lang, load: "module"}, "python") import #{package}
    +        +qs({lang: lang, load: "module"}, "python") nlp = #{package}.load()
    +        +qs({lang: lang, load: "spacy"}, "python") nlp = spacy.load('#{lang}')
    +        +qs({lang: lang, config: "example"}, "python") doc = nlp(u"#{EXAMPLE_SENTENCES[lang]}")
    +
    +        if lang != "xx"
    +            +qs({lang: lang, config: "example"}, "python") print([(w.text, w.pos_) for w in doc])
    +        else
    +            +qs({lang: lang, config: "example"}, "python") print([(ent.text, ent.label) for ent in doc.ents])
    diff --git a/website/usage/_processing-pipelines/_examples.jade b/website/usage/_processing-pipelines/_examples.jade
    new file mode 100644
    index 000000000..616bed32c
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_examples.jade
    @@ -0,0 +1,126 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > EXAMPLES
    +
    +p
    +    |  To see real-world examples of pipeline factories and components in action,
    +    |  you can have a look at the source of spaCy's built-in components, e.g.
    +    |  the #[+api("tagger") #[code Tagger]], #[+api("parser") #[code Parser]] or
    +    |  #[+api("entityrecognizer") #[code EntityRecongnizer]].
    +
    ++h(3, "example1") Example: Custom sentence segmentation logic
    +
    +p
    +    |  Let's say you want to implement custom logic to improve spaCy's sentence
    +    |  boundary detection. Currently, sentence segmentation is based on the
    +    |  dependency parse, which doesn't always produce ideal results. The custom
    +    |  logic should therefore be applied #[strong after] tokenization, but
    +    |  #[strong before] the dependency parsing – this way, the parser can also
    +    |  take advantage of the sentence boundaries.
    +
    ++code.
    +    def sbd_component(doc):
    +        for i, token in enumerate(doc[:-2]):
    +            # define sentence start if period + titlecase token
    +            if token.text == '.' and doc[i+1].is_title:
    +                doc[i+1].sent_start = True
    +        return doc
    +
    +p
    +    |  In this case, we simply want to add the component to the existing
    +    |  pipeline of the English model. We can do this by inserting it at index 0
    +    |  of #[code nlp.pipeline]:
    +
    ++code.
    +    nlp = spacy.load('en')
    +    nlp.pipeline.insert(0, sbd_component)
    +
    +p
    +    |  When you call #[code nlp] on some text, spaCy will tokenize it to create
    +    |  a #[code Doc] object, and first call #[code sbd_component] on it, followed
    +    |  by the model's default pipeline.
    +
    ++h(3, "example2") Example: Sentiment model
    +
    +p
    +    |  Let's say you have trained your own document sentiment model on English
    +    |  text. After tokenization, you want spaCy to first execute the
    +    |  #[strong default tensorizer], followed by a custom
    +    |  #[strong sentiment component] that adds a #[code .sentiment]
    +    |  property to the #[code Doc], containing your model's sentiment precition.
    +
    +p
    +    |  Your component class will have a #[code from_disk()] method that spaCy
    +    |  calls to load the model data. When called, the component will compute
    +    |  the sentiment score, add it to the #[code Doc] and return the modified
    +    |  document. Optionally, the component can include an #[code update()] method
    +    |  to allow training the model.
    +
    ++code.
    +    import pickle
    +    from pathlib import Path
    +
    +    class SentimentComponent(object):
    +        def __init__(self, vocab):
    +            self.weights = None
    +
    +        def __call__(self, doc):
    +            doc.sentiment = sum(self.weights*doc.vector) # set sentiment property
    +            return doc
    +
    +        def from_disk(self, path): # path = model path + factory ID ('sentiment')
    +            self.weights = pickle.load(Path(path) / 'weights.bin') # load weights
    +            return self
    +
    +        def update(self, doc, gold): # update weights – allows training!
    +            prediction = sum(self.weights*doc.vector)
    +            self.weights -= 0.001*doc.vector*(prediction-gold.sentiment)
    +
    +p
    +    |  The factory will initialise the component with the #[code Vocab] object.
    +    |  To be able to add it to your model's pipeline as #[code 'sentiment'],
    +    |  it also needs to be registered via
    +    |  #[+api("spacy#set_factory") #[code set_factory()]].
    +
    ++code.
    +    def sentiment_factory(vocab):
    +        component = SentimentComponent(vocab) # initialise component
    +        return component
    +
    +    spacy.set_factory('sentiment', sentiment_factory)
    +
    +p
    +    |  The above code should be #[strong shipped with your model]. You can use
    +    |  the #[+api("cli#package") #[code package]] command to create all required
    +    |  files and directories. The model package will include an
    +    |  #[+src(gh("spacy-dev-resources", "templates/model/en_model_name/__init__.py")) #[code __init__.py]]
    +    |  with a #[code load()] method, that will initialise the language class with
    +    |  the model's pipeline and call the #[code from_disk()] method to load
    +    |  the model data.
    +
    +p
    +    |  In the model package's meta.json, specify the language class and pipeline
    +    |  IDs:
    +
    ++code("meta.json (excerpt)", "json").
    +    {
    +        "name": "sentiment_model",
    +        "lang": "en",
    +        "version": "1.0.0",
    +        "spacy_version": ">=2.0.0,<3.0.0",
    +        "pipeline": ["tensorizer", "sentiment"]
    +    }
    +
    +p
    +    |  When you load your new model, spaCy will call the model's #[code load()]
    +    |  method. This will return a #[code Language] object with a pipeline
    +    |  containing the default tensorizer, and the sentiment component returned
    +    |  by your custom #[code "sentiment"] factory.
    +
    ++code.
    +    nlp = spacy.load('en_sentiment_model')
    +    doc = nlp(u'I love pizza')
    +    assert doc.sentiment
    +
    ++infobox("Saving and loading models")
    +    |  For more information and a detailed guide on how to package your model,
    +    |  see the documentation on
    +    |  #[+a("/usage/training#saving-loading") saving and loading models].
    diff --git a/website/usage/_processing-pipelines/_multithreading.jade b/website/usage/_processing-pipelines/_multithreading.jade
    new file mode 100644
    index 000000000..1e08508b8
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_multithreading.jade
    @@ -0,0 +1,40 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > MULTI-THREADING
    +
    +p
    +    |  If you have a sequence of documents to process, you should use the
    +    |  #[+api("language#pipe") #[code Language.pipe()]] method. The method takes
    +    |  an iterator of texts, and accumulates an internal buffer,
    +    |  which it works on in parallel. It then yields the documents in order,
    +    |  one-by-one. After a long and bitter struggle, the global interpreter
    +    |  lock was freed around spaCy's main parsing loop in v0.100.3. This means
    +    |  that #[code .pipe()] will be significantly faster in most
    +    |  practical situations, because it allows shared memory parallelism.
    +
    ++code.
    +    for doc in nlp.pipe(texts, batch_size=10000, n_threads=3):
    +       pass
    +
    +p
    +    |  To make full use of the #[code .pipe()] function, you might want to
    +    |  brush up on #[strong Python generators]. Here are a few quick hints:
    +
    ++list
    +    +item
    +        |  Generator comprehensions can be written as
    +        |  #[code (item for item in sequence)].
    +
    +    +item
    +        |  The
    +        |  #[+a("https://docs.python.org/2/library/itertools.html") #[code itertools] built-in library]
    +        |  and the
    +        |  #[+a("https://github.com/pytoolz/cytoolz") #[code cytoolz] package]
    +        |  provide a lot of handy #[strong generator tools].
    +
    +    +item
    +        |  Often you'll have an input stream that pairs text with some
    +        |  important meta data, e.g. a JSON document. To
    +        |  #[strong pair up the meta data] with the processed #[code Doc]
    +        |  object, you should use the #[code itertools.tee] function to split
    +        |  the generator in two, and then #[code izip] the extra stream to the
    +        |  document stream. Here's
    +        |  #[+a(gh("spacy") + "/issues/172#issuecomment-183963403") an example].
    diff --git a/website/docs/usage/language-processing-pipeline.jade b/website/usage/_processing-pipelines/_pipelines.jade
    similarity index 56%
    rename from website/docs/usage/language-processing-pipeline.jade
    rename to website/usage/_processing-pipelines/_pipelines.jade
    index 03f6c28f5..d09ed4ead 100644
    --- a/website/docs/usage/language-processing-pipeline.jade
    +++ b/website/usage/_processing-pipelines/_pipelines.jade
    @@ -1,12 +1,4 @@
    -//- 💫 DOCS > USAGE > PIPELINE
    -
    -include ../../_includes/_mixins
    -
    -+h(2, "101") Pipelines 101
    -
    -include _spacy-101/_pipelines
    -
    -+h(2, "pipelines") How pipelines work
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > PIPELINES
     
     p
         |  spaCy makes it very easy to create your own pipelines consisting of
    @@ -15,11 +7,11 @@ p
         |  functions. A pipeline component can be added to an already existing
         |  #[code nlp] object, specified when initialising a #[code Language] class,
         |  or defined within a
    -    |  #[+a("/docs/usage/saving-loading#models-generating") model package].
    +    |  #[+a("/usage/saving-loading#models-generating") model package].
     
     p
         |  When you load a model, spaCy first consults the model's
    -    |  #[+a("/docs/usage/saving-loading#models-generating") meta.json]. The
    +    |  #[+a("/usage/saving-loading#models-generating") meta.json]. The
         |  meta typically includes the model details, the ID of a language class,
         |  and an optional list of pipeline components. spaCy then does the
         |  following:
    @@ -29,7 +21,7 @@ p
             "name": "example_model",
             "lang": "en"
             "description": "Example model for spaCy",
    -        "pipeline": ["token_vectors", "tagger"]
    +        "pipeline": ["tensorizer", "tagger"]
         }
     
     +list("numbers")
    @@ -56,24 +48,50 @@ p
     
     p
         | ... the model tells spaCy to use the pipeline
    -    |  #[code ["tensorizer", "tagger", "parser", "ner"]]. spaCy will then look
    -    |  up each string in its internal factories registry and initialise the
    -    |  individual components. It'll then load #[code spacy.lang.en.English],
    -    |  pass it the path to the model's data directory, and return it for you
    -    |  to use as the #[code nlp] object.
    +    |  #[code.u-break ["tensorizer", "tagger", "parser", "ner"]]. spaCy will
    +    |  then look up each string in its internal factories registry and
    +    |  initialise the individual components. It'll then load
    +    |  #[code spacy.lang.en.English], pass it the path to the model's data
    +    |  directory, and return it for you to use as the #[code nlp] object.
    +
    +p
    +    |  Fundamentally, a #[+a("/models") spaCy model] consists of three
    +    |  components: #[strong the weights], i.e. binary data loaded in from a
    +    |  directory, a #[strong pipeline] of functions called in order,
    +    |  and #[strong language data] like the tokenization rules and annotation
    +    |  scheme. All of this is specific to each model, and defined in the
    +    |  model's #[code meta.json] – for example, a Spanish NER model requires
    +    |  different weights, language data and pipeline components than an English
    +    |  parsing and tagging model. This is also why the pipeline state is always
    +    |  held by the #[code Language] class.
    +    |  #[+api("spacy#load") #[code spacy.load]] puts this all together and
    +    |  returns an instance of #[code Language]  with a pipeline set and access
    +    |  to the binary data:
    +
    ++code("spacy.load under the hood").
    +    lang = 'en'
    +    pipeline = ['tensorizer', 'tagger', 'parser', 'ner']
    +    data_path = 'path/to/en_core_web_sm/en_core_web_sm-2.0.0'
    +
    +    cls = spacy.util.get_lang_class(lang)  # 1. get Language instance, e.g. English()
    +    nlp = cls(pipeline=pipeline)           # 2. initialise it with the pipeline
    +    nlp.from_disk(model_data_path)         # 3. load in the binary data
     
     p
         |  When you call #[code nlp] on a text, spaCy will #[strong tokenize] it and
         |  then #[strong call each component] on the #[code Doc], in order.
    -    |  Components all return the modified document, which is then processed by
    -    |  the component next in the pipeline.
    +    |  Since the model data is loaded, the components can access it to assign
    +    |  annotations to the #[code Doc] object, and subsequently to the
    +    |  #[code Token] and #[code Span] which are only views of the #[code Doc],
    +    |  and don't own any data themselves. All components return the modified
    +    |  document, which is then processed by the component next in the pipeline.
     
     +code("The pipeline under the hood").
         doc = nlp.make_doc(u'This is a sentence')
         for proc in nlp.pipeline:
             doc = proc(doc)
     
    -+h(2, "creating") Creating pipeline components and factories
    ++h(3, "creating") Creating pipeline components and factories
     
     p
         |  spaCy lets you customise the pipeline with your own components. Components
    @@ -82,7 +100,7 @@ p
         |  pipeline. You can do that by defining and registering a factory which
         |  receives the shared #[code Vocab] object and returns a component.
     
    -+h(3, "creating-component") Creating a  component
    ++h(4, "creating-component") Creating a  component
     
     p
         |  A component receives a #[code Doc] object and
    @@ -103,7 +121,7 @@ p
             +cell #[code Doc]
             +cell The #[code Doc] object processed by the previous component.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell The #[code Doc] object processed by this pipeline component.
    @@ -123,7 +141,7 @@ p
         nlp = spacy.load('en')
         nlp.pipeline.append(my_component)
     
    -+h(3, "creating-factory") Creating a factory
    ++h(4, "creating-factory") Creating a factory
     
     p
         |  A factory is a #[strong function that returns a pipeline component].
    @@ -149,7 +167,7 @@ p
                 |  Shared data between components, including strings, morphology,
                 |  vectors etc.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell callable
             +cell The pipeline component.
    @@ -171,148 +189,22 @@ p
         |  by looking it up in the available factories. The factory will then be
         |  initialised with the #[code Vocab]. Providing factory names instead of
         |  callables also makes it easy to specify them in the model's
    -    |  #[+a("/docs/usage/saving-loading#models-generating") meta.json]. If you're
    +    |  #[+a("/usage/saving-loading#models-generating") meta.json]. If you're
         |  training your own model and want to use one of spaCy's default components,
         |  you won't have to worry about finding and implementing it either – to use
         |  the default tagger, simply add #[code "tagger"] to the pipeline, and
         |  #[strong spaCy will know what to do].
     
    -
     +infobox("Important note")
         |  Because factories are #[strong resolved on initialisation] of the
         |  #[code Language] class, it's #[strong not possible] to add them to the
         |  pipeline afterwards, e.g. by modifying #[code nlp.pipeline]. This only
         |  works with individual component functions. To use factories, you need to
         |  create a new #[code Language] object, or generate a
    -    |  #[+a("/docs/usage/saving-loading#models-generating") model package] with
    +    |  #[+a("/usage/training#models-generating") model package] with
         |  a custom pipeline.
     
    -+aside("Real-world examples")
    -    |  To see real-world examples of pipeline factories and components in action,
    -    |  you can have a look at the source of spaCy's built-in components, e.g.
    -    |  the #[+api("tagger") #[code Tagger]], #[+api("parser") #[code Parser]] or
    -    |  #[+api("entityrecognizer") #[code EntityRecongnizer]].
    -
    -+h(2, "example1") Example: Custom sentence segmentation logic
    -
    -p
    -    |  Let's say you want to implement custom logic to improve spaCy's sentence
    -    |  boundary detection. Currently, sentence segmentation is based on the
    -    |  dependency parse, which doesn't always produce ideal results. The custom
    -    |  logic should therefore be applied #[strong after] tokenization, but
    -    |  #[strong before] the dependency parsing – this way, the parser can also
    -    |  take advantage of the sentence boundaries.
    -
    -+code.
    -    def sbd_component(doc):
    -        for i, token in enumerate(doc[:-2]):
    -            # define sentence start if period + titlecase token
    -            if token.text == '.' and doc[i+1].is_title:
    -                doc[i+1].sent_start = True
    -        return doc
    -
    -p
    -    |  In this case, we simply want to add the component to the existing
    -    |  pipeline of the English model. We can do this by inserting it at index 0
    -    |  of #[code nlp.pipeline]:
    -
    -+code.
    -    nlp = spacy.load('en')
    -    nlp.pipeline.insert(0, sbd_component)
    -
    -p
    -    |  When you call #[code nlp] on some text, spaCy will tokenize it to create
    -    |  a #[code Doc] object, and first call #[code sbd_component] on it, followed
    -    |  by the model's default pipeline.
    -
    -+h(2, "example2") Example: Sentiment model
    -
    -p
    -    |  Let's say you have trained your own document sentiment model on English
    -    |  text. After tokenization, you want spaCy to first execute the
    -    |  #[strong default tensorizer], followed by a custom
    -    |  #[strong sentiment component] that adds a #[code .sentiment]
    -    |  property to the #[code Doc], containing your model's sentiment precition.
    -
    -p
    -    |  Your component class will have a #[code from_disk()] method that spaCy
    -    |  calls to load the model data. When called, the component will compute
    -    |  the sentiment score, add it to the #[code Doc] and return the modified
    -    |  document. Optionally, the component can include an #[code update()] method
    -    |  to allow training the model.
    -
    -+code.
    -    import pickle
    -    from pathlib import Path
    -
    -    class SentimentComponent(object):
    -        def __init__(self, vocab):
    -            self.weights = None
    -
    -        def __call__(self, doc):
    -            doc.sentiment = sum(self.weights*doc.vector) # set sentiment property
    -            return doc
    -
    -        def from_disk(self, path): # path = model path + factory ID ('sentiment')
    -            self.weights = pickle.load(Path(path) / 'weights.bin') # load weights
    -            return self
    -
    -        def update(self, doc, gold): # update weights – allows training!
    -            prediction = sum(self.weights*doc.vector)
    -            self.weights -= 0.001*doc.vector*(prediction-gold.sentiment)
    -
    -p
    -    |  The factory will initialise the component with the #[code Vocab] object.
    -    |  To be able to add it to your model's pipeline as #[code 'sentiment'],
    -    |  it also needs to be registered via
    -    |  #[+api("spacy#set_factory") #[code set_factory()]].
    -
    -+code.
    -    def sentiment_factory(vocab):
    -        component = SentimentComponent(vocab) # initialise component
    -        return component
    -
    -    spacy.set_factory('sentiment', sentiment_factory)
    -
    -p
    -    |  The above code should be #[strong shipped with your model]. You can use
    -    |  the #[+api("cli#package") #[code package]] command to create all required
    -    |  files and directories. The model package will include an
    -    |  #[+src(gh("spacy-dev-resources", "templates/model/en_model_name/__init__.py")) __init__.py]
    -    |  with a #[code load()] method, that will initialise the language class with
    -    |  the model's pipeline and call the #[code from_disk()] method to load
    -    |  the model data.
    -
    -p
    -    |  In the model package's meta.json, specify the language class and pipeline
    -    |  IDs:
    -
    -+code("meta.json (excerpt)", "json").
    -    {
    -        "name": "sentiment_model",
    -        "lang": "en",
    -        "version": "1.0.0",
    -        "spacy_version": ">=2.0.0,<3.0.0",
    -        "pipeline": ["tensorizer", "sentiment"]
    -    }
    -
    -p
    -    |  When you load your new model, spaCy will call the model's #[code load()]
    -    |  method. This will return a #[code Language] object with a pipeline
    -    |  containing the default tensorizer, and the sentiment component returned
    -    |  by your custom #[code "sentiment"] factory.
    -
    -+code.
    -    nlp = spacy.load('en_sentiment_model')
    -    doc = nlp(u'I love pizza')
    -    assert doc.sentiment
    -
    -+infobox("Saving and loading models")
    -    |  For more information and a detailed guide on how to package your model,
    -    |  see the documentation on
    -    |  #[+a("/docs/usage/saving-loading#models") saving and loading models].
    -
    -+h(2, "disabling") Disabling pipeline components
    ++h(3, "disabling") Disabling pipeline components
     
     p
         |  If you don't need a particular component of the pipeline – for
    diff --git a/website/usage/_processing-pipelines/_serialization.jade b/website/usage/_processing-pipelines/_serialization.jade
    new file mode 100644
    index 000000000..e29cbc558
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_serialization.jade
    @@ -0,0 +1,38 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > SERIALIZATION
    +
    +include ../_spacy-101/_serialization
    +
    ++infobox("Important note")
    +    |  In spaCy v2.0, the API for saving and loading has changed to only use the
    +    |  four methods listed above consistently across objects and classes. For an
    +    |  overview of the changes, see #[+a("/usage/v2#incompat") this table]
    +    |  and the notes on #[+a("/usage/v2#migrating-saving-loading") migrating].
    +
    ++h(3, "example-doc") Example: Saving and loading a document
    +
    +p
    +    |  For simplicity, let's assume you've
    +    |  #[+a("/usage/entity-recognition#setting") added custom entities] to
    +    |  a #[code Doc], either manually, or by using a
    +    |  #[+a("/usage/rule-based-matching#on_match") match pattern]. You can
    +    |  save it locally by calling #[+api("doc#to_disk") #[code Doc.to_disk()]],
    +    |  and load it again via #[+api("doc#from_disk") #[code Doc.from_disk()]].
    +    |  This will overwrite the existing object and return it.
    +
    ++code.
    +    import spacy
    +    from spacy.tokens import Span
    +
    +    text = u'Netflix is hiring a new VP of global policy'
    +
    +    nlp = spacy.load('en')
    +    doc = nlp(text)
    +    assert len(doc.ents) == 0 # Doc has no entities
    +    doc.ents += ((Span(doc, 0, 1, label=doc.vocab.strings[u'ORG'])) # add entity
    +    doc.to_disk('/path/to/doc') # save Doc to disk
    +
    +    new_doc = nlp(text)
    +    assert len(new_doc.ents) == 0 # new Doc has no entities
    +    new_doc = new_doc.from_disk('path/to/doc') # load from disk and overwrite
    +    assert len(new_doc.ents) == 1 # entity is now recognised!
    +    assert [(ent.text, ent.label_) for ent in new_doc.ents] == [(u'Netflix', u'ORG')]
    diff --git a/website/usage/_processing-pipelines/_user-hooks.jade b/website/usage/_processing-pipelines/_user-hooks.jade
    new file mode 100644
    index 000000000..e7dce53fe
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_user-hooks.jade
    @@ -0,0 +1,61 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > ATTRIBUTE HOOKS
    +
    +p
    +    |  Hooks let you customize some of the behaviours of the #[code Doc],
    +    |  #[code Span] or #[code Token] objects by adding a component to the
    +    |  pipeline. For instance, to customize the
    +    |  #[+api("doc#similarity") #[code Doc.similarity]] method, you can add a
    +    |  component that sets a custom function to
    +    |  #[code doc.user_hooks['similarity']]. The built-in #[code Doc.similarity]
    +    |  method will check the #[code user_hooks] dict, and delegate to your
    +    |  function if you've set one. Similar results can be achieved by setting
    +    |  functions to #[code Doc.user_span_hooks] and #[code Doc.user_token_hooks].
    +
    ++code("Polymorphic similarity example").
    +    span.similarity(doc)
    +    token.similarity(span)
    +    doc1.similarity(doc2)
    +
    +p
    +    |  By default, this just averages the vectors for each document, and
    +    |  computes their cosine. Obviously, spaCy should make it easy for you to
    +    |  install your own similarity model. This introduces a tricky design
    +    |  challenge. The current solution is to add three more dicts to the
    +    |  #[code Doc] object:
    +
    ++aside("Implementation note")
    +    |  The hooks live on the #[code Doc] object because the #[code Span] and
    +    |  #[code Token] objects are created lazily, and don't own any data. They
    +    |  just proxy to their parent #[code Doc]. This turns out to be convenient
    +    |  here — we only have to worry about installing hooks in one place.
    +
    ++table(["Name", "Description"])
    +    +row
    +        +cell #[code user_hooks]
    +        +cell Customise behaviour of #[code doc.vector], #[code doc.has_vector], #[code doc.vector_norm] or #[code doc.sents]
    +
    +    +row
    +        +cell #[code user_token_hooks]
    +        +cell Customise behaviour of #[code token.similarity], #[code token.vector], #[code token.has_vector], #[code token.vector_norm] or #[code token.conjuncts]
    +
    +    +row
    +        +cell #[code user_span_hooks]
    +        +cell Customise behaviour of #[code span.similarity], #[code span.vector], #[code span.has_vector], #[code span.vector_norm] or #[code span.root]
    +
    +p
    +    |  To sum up, here's an example of hooking in custom #[code .similarity()]
    +    |  methods:
    +
    ++code("Add custom similarity hooks").
    +    class SimilarityModel(object):
    +        def __init__(self, model):
    +            self._model = model
    +
    +        def __call__(self, doc):
    +            doc.user_hooks['similarity'] = self.similarity
    +            doc.user_span_hooks['similarity'] = self.similarity
    +            doc.user_token_hooks['similarity'] = self.similarity
    +
    +        def similarity(self, obj1, obj2):
    +            y = self._model([obj1.vector, obj2.vector])
    +            return float(y[0])
    diff --git a/website/docs/usage/_spacy-101/_architecture.jade b/website/usage/_spacy-101/_architecture.jade
    similarity index 83%
    rename from website/docs/usage/_spacy-101/_architecture.jade
    rename to website/usage/_spacy-101/_architecture.jade
    index c5a85f0b0..c9b299036 100644
    --- a/website/docs/usage/_spacy-101/_architecture.jade
    +++ b/website/usage/_spacy-101/_architecture.jade
    @@ -20,18 +20,12 @@ p
         |  returning an #[strong annotated document]. It also orchestrates training
         |  and serialization.
     
    -+image
    -    include ../../../assets/img/docs/architecture.svg
    -    .u-text-right
    -        +button("/assets/img/docs/architecture.svg", false, "secondary").u-text-tag View large graphic
    ++graphic("/assets/img/architecture.svg")
    +    include ../../assets/img/architecture.svg
    +
    ++h(3, "architecture-containers") Container objects
     
     +table(["Name", "Description"])
    -    +row
    -        +cell #[+api("language") #[code Language]]
    -        +cell
    -            |  A text-processing pipeline. Usually you'll load this once per
    -            |  process as #[code nlp] and pass the instance around your application.
    -
         +row
             +cell #[+api("doc") #[code Doc]]
             +cell A container for accessing linguistic annotations.
    @@ -53,43 +47,25 @@ p
                 |  opposed to a word token. It therefore has no part-of-speech tag,
                 |  dependency parse etc.
     
    -    +row
    -        +cell #[+api("vocab") #[code Vocab]]
    -        +cell
    -            |  A lookup table for the vocabulary that allows you to access
    -            |  #[code Lexeme] objects.
    -
    -    +row
    -        +cell #[code Morphology]
    -        +cell
    -            |  Assign linguistic features like lemmas, noun case, verb tense etc.
    -            |  based on the word and its part-of-speech tag.
    -
    -    +row
    -        +cell #[+api("stringstore") #[code StringStore]]
    -        +cell Map strings to and from hash values.
    -
    -    +row
    -        +cell #[+api("tokenizer") #[code Tokenizer]]
    -        +cell
    -            |  Segment text, and create #[code Doc] objects with the discovered
    -            |  segment boundaries.
    -
    -    +row
    -        +cell #[code Lemmatizer]
    -        +cell
    -            |  Determine the base forms of words.
    -
    -    +row
    -        +cell #[+api("matcher") #[code Matcher]]
    -        +cell
    -            |  Match sequences of tokens, based on pattern rules, similar to
    -            |  regular expressions.
    -
    -
    -+h(3, "architecture-pipeline") Pipeline components
    ++h(3, "architecture-pipeline") Processing pipeline
     
     +table(["Name", "Description"])
    +    +row
    +        +cell #[+api("language") #[code Language]]
    +        +cell
    +            |  A text-processing pipeline. Usually you'll load this once per
    +            |  process as #[code nlp] and pass the instance around your application.
    +
    +    +row
    +        +cell #[+api("pipe") #[code Pipe]]
    +        +cell Base class for processing pipeline components.
    +
    +    +row
    +        +cell #[+api("tensorizer") #[code Tensorizer]]
    +        +cell
    +            |  Add tensors with position-sensitive meaning representations to
    +            |  #[code Doc] objects.
    +
         +row
             +cell #[+api("tagger") #[code Tagger]]
             +cell Annotate part-of-speech tags on #[code Doc] objects.
    @@ -104,16 +80,54 @@ p
                 |  Annotate named entities, e.g. persons or products, on #[code Doc]
                 |  objects.
     
    +    +row
    +        +cell #[+api("textcategorizer") #[code TextCategorizer]]
    +        +cell  Assigning categories or labels to #[code Doc] objects.
    +
    +    +row
    +        +cell #[+api("tokenizer") #[code Tokenizer]]
    +        +cell
    +            |  Segment text, and create #[code Doc] objects with the discovered
    +            |  segment boundaries.
    +
    +    +row
    +        +cell #[+api("lemmatizer") #[code Lemmatizer]]
    +        +cell
    +            |  Determine the base forms of words.
    +
    +    +row
    +        +cell #[code Morphology]
    +        +cell
    +            |  Assign linguistic features like lemmas, noun case, verb tense etc.
    +            |  based on the word and its part-of-speech tag.
    +
    +    +row
    +        +cell #[+api("matcher") #[code Matcher]]
    +        +cell
    +            |  Match sequences of tokens, based on pattern rules, similar to
    +            |  regular expressions.
    +
    +    +row
    +        +cell #[+api("phrasematcher") #[code PhraseMatcher]]
    +        +cell Match sequences of tokens based on phrases.
    +
    +
     +h(3, "architecture-other") Other classes
     
     +table(["Name", "Description"])
         +row
    -        +cell #[+api("vectors") #[code Vectors]]
    -        +cell Container class for vector data keyed by string.
    +        +cell #[+api("vocab") #[code Vocab]]
    +        +cell
    +            |  A lookup table for the vocabulary that allows you to access
    +            |  #[code Lexeme] objects.
     
         +row
    -        +cell #[+api("binder") #[code Binder]]
    -        +cell Container class for serializing collections of #[code Doc] objects.
    +        +cell #[+api("stringstore") #[code StringStore]]
    +        +cell Map strings to and from hash values.
    +
    +    +row
    +        +cell #[+api("vectors") #[code Vectors]]
    +        +cell Container class for vector data keyed by string.
     
         +row
             +cell #[+api("goldparse") #[code GoldParse]]
    @@ -124,3 +138,7 @@ p
             +cell
                 |  An annotated corpus, using the JSON file format. Manages
                 |  annotations for tagging, dependency parsing and NER.
    +
    +    +row
    +        +cell #[+api("binder") #[code Binder]]
    +        +cell Container class for serializing collections of #[code Doc] objects.
    diff --git a/website/usage/_spacy-101/_community-faq.jade b/website/usage/_spacy-101/_community-faq.jade
    new file mode 100644
    index 000000000..f91248bfd
    --- /dev/null
    +++ b/website/usage/_spacy-101/_community-faq.jade
    @@ -0,0 +1,141 @@
    +//- 💫 DOCS > USAGE > SPACY 101 > COMMUNITY & FAQ
    +
    +p
    +    |  We're very happy to see the spaCy community grow and include a mix of
    +    |  people from all kinds of different backgrounds – computational
    +    |  linguistics, data science, deep learning, research and more. If you'd
    +    |  like to get involved, below are some answers to the most important
    +    |  questions and resources for further reading.
    +
    ++h(3, "faq-help-code") Help, my code isn't working!
    +
    +p
    +    |  Bugs suck, and we're doing our best to continuously improve the tests
    +    |  and fix bugs as soon as possible. Before you submit an issue, do a
    +    |  quick search and check if the problem has already been reported. If
    +    |  you're having installation or loading problems, make sure to also check
    +    |  out the #[+a("/usage/#troubleshooting") troubleshooting guide]. Help
    +    |  with spaCy is available via the following platforms:
    +
    ++aside("How do I know if something is a bug?")
    +    |  Of course, it's always hard to know for sure, so don't worry – we're not
    +    |  going to be mad if a bug report turns out to be a typo in your
    +    |  code. As a simple rule, any C-level error without a Python traceback,
    +    |  like a #[strong segmentation fault] or #[strong memory error],
    +    |  is #[strong always] a spaCy bug.#[br]#[br]
    +    |  Because models are statistical, their performance will never be
    +    |  #[em perfect]. However, if you come across
    +    |  #[strong patterns that might indicate an underlying issue], please do
    +    |  file a report. Similarly, we also care about behaviours that
    +    |  #[strong contradict our docs].
    +
    ++table(["Platform", "Purpose"])
    +    +row
    +        +cell #[+a("https://stackoverflow.com/questions/tagged/spacy") StackOverflow]
    +        +cell
    +            |  #[strong Usage questions] and everything related to problems with
    +            |  your specific code. The StackOverflow community is much larger
    +            |  than ours, so if your problem can be solved by others, you'll
    +            |  receive help much quicker.
    +
    +    +row
    +        +cell #[+a("https://gitter.im/" + SOCIAL.gitter) Gitter chat]
    +        +cell
    +            |  #[strong General discussion] about spaCy, meeting other community
    +            |  members and exchanging #[strong tips, tricks and best practices].
    +            |  If we're working on experimental models and features, we usually
    +            |  share them on Gitter first.
    +
    +    +row
    +        +cell #[+a(gh("spaCy") + "/issues") GitHub issue tracker]
    +        +cell
    +            |  #[strong Bug reports] and #[strong improvement suggestions], i.e.
    +            |  everything that's likely spaCy's fault. This also includes
    +            |  problems with the models beyond statistical imprecisions, like
    +            |  patterns that point to a bug.
    +
    ++infobox
    +    |  Please understand that we won't be able to provide individual support via
    +    |  email. We also believe that help is much more valuable if it's shared
    +    |  publicly, so that #[strong more people can benefit from it]. If you come
    +    |  across an issue and you think you might be able to help, consider posting
    +    |  a quick update with your solution. No matter how simple, it can easily
    +    |  save someone a lot of time and headache – and the next time you need help,
    +    |  they might repay the favour.
    +
    ++h(3, "faq-contributing") How can I contribute to spaCy?
    +
    +p
    +    |  You don't have to be an NLP expert or Python pro to contribute, and we're
    +    |  happy to help you get started. If you're new to spaCy, a good place to
    +    |  start is the
    +    |  #[+a(gh("spaCy") + '/issues?q=is%3Aissue+is%3Aopen+label%3A"help+wanted+%28easy%29"') #[code help wanted (easy)] label]
    +    |  on GitHub, which we use to tag bugs and feature requests that are easy
    +    |  and self-contained. We also appreciate contributions to the docs – whether
    +    |  it's fixing a typo, improving an example or adding additional explanations.
    +    |  You'll find a "Suggest edits" link at the bottom of each page that points
    +    |  you to the source.
    +
    +p
    +    |  Another way of getting involved is to help us improve the
    +    |  #[+a("/usage/adding-languages#language-data") language data] –
    +    |  especially if you happen to speak one of the languages currently in
    +    |  #[+a("/usage/models#languages") alpha support]. Even
    +    |  adding simple tokenizer exceptions, stop words or lemmatizer data
    +    |  can make a big difference. It will also make it easier for us to provide
    +    |  a statistical model for the language in the future. Submitting a test
    +    |  that documents a bug or performance issue, or covers functionality that's
    +    |  especially important for your application is also very helpful. This way,
    +    |  you'll also make sure we never accidentally introduce regressions to the
    +    |  parts of the library that you care about the most.
    +
    +p
    +    strong
    +        |  For more details on the types of contributions we're looking for, the
    +        |  code conventions and other useful tips, make sure to check out the
    +        |  #[+a(gh("spaCy", "CONTRIBUTING.md")) contributing guidelines].
    +
    ++infobox("Code of Conduct")
    +    |  spaCy adheres to the
    +    |  #[+a("http://contributor-covenant.org/version/1/4/") Contributor Covenant Code of Conduct].
    +    |  By participating, you are expected to uphold this code.
    +
    ++h(3, "faq-project-with-spacy")
    +    |  I've built something cool with spaCy – how can I get the word out?
    +
    +p
    +    |  First, congrats – we'd love to check it out! When you share your
    +    |  project on Twitter, don't forget to tag
    +    |  #[+a("https://twitter.com/" + SOCIAL.twitter) @#{SOCIAL.twitter}] so we
    +    |  don't miss it. If you think your project would be a good fit for the
    +    |  #[+a("/usage/resources") resources], #[strong feel free to submit it!]
    +    |  Tutorials are also incredibly valuable to other users and a great way to
    +    |  get exposure. So we strongly encourage #[strong writing up your experiences],
    +    |  or sharing your code and some tips and tricks on your blog. Since our
    +    |  website is open-source, you can add your project or tutorial by making a
    +    |  pull request on GitHub.
    +
    ++aside("Contributing to spacy.io")
    +    |  All showcase and tutorial links are stored in a
    +    |  #[+a(gh("spaCy", "website/usage/_data.json")) JSON file], so you
    +    |  won't even have to edit any markup. For more info on how to submit
    +    |  your project, see the
    +    |  #[+a(gh("spaCy", "CONTRIBUTING.md#submitting-a-project-to-the-showcase")) contributing guidelines]
    +    |  and our #[+a(gh("spaCy", "website")) website docs].
    +
    +p
    +    |  If you would like to use the spaCy logo on your site, please get in touch
    +    |  and ask us first. However, if you want to show support and tell others
    +    |  that your project is using spaCy, you can grab one of our
    +    |  #[strong spaCy badges] here:
    +
    +- SPACY_BADGES =  ["built%20with-spaCy-09a3d5.svg", "made%20with%20❤%20and-spaCy-09a3d5.svg", "spaCy-v2-09a3d5.svg"]
    ++quickstart([{id: "badge", input_style: "check", options: SPACY_BADGES.map(function(badge, i) { return {id: i, title: "", checked: (i == 0) ? true : false}}) }], false, false, true)
    +    .c-code-block(data-qs-results)
    +        for badge, i in SPACY_BADGES
    +            - var url = "https://img.shields.io/badge/" + badge
    +            +code(false, "text", false, false, "star").o-no-block(data-qs-badge=i)=url
    +            +code(false, "text", false, false, "code").o-no-block(data-qs-badge=i).
    +                <a href="#{SITE_URL}"><img src="#{url}" height="20"></a>
    +            +code(false, "text", false, false, "markdown").o-no-block(data-qs-badge=i).
    +                [![spaCy](#{url})](#{SITE_URL})
    diff --git a/website/docs/usage/_spacy-101/_language-data.jade b/website/usage/_spacy-101/_language-data.jade
    similarity index 86%
    rename from website/docs/usage/_spacy-101/_language-data.jade
    rename to website/usage/_spacy-101/_language-data.jade
    index 1f75b47e8..628152524 100644
    --- a/website/docs/usage/_spacy-101/_language-data.jade
    +++ b/website/usage/_spacy-101/_language-data.jade
    @@ -5,7 +5,7 @@ p
         |  #[strong exceptions and special cases], especially amongst the most
         |  common words. Some of these exceptions are shared across languages, while
         |  others are #[strong entirely specific] – usually so specific that they need
    -    |  to be hard-coded. The #[+src(gh("spaCy", "spacy/lang")) lang] module
    +    |  to be hard-coded. The #[+src(gh("spaCy", "spacy/lang")) #[code lang]] module
         |  contains all language-specific data, organised in simple Python files.
         |  This makes the data easy to update and extend.
     
    @@ -27,15 +27,13 @@ p
         nlp_en = English() # includes English data
         nlp_de = German() # includes German data
     
    -+image
    -    include ../../../assets/img/docs/language_data.svg
    -    .u-text-right
    -        +button("/assets/img/docs/language_data.svg", false, "secondary").u-text-tag View large graphic
    ++graphic("/assets/img/language_data.svg")
    +    include ../../assets/img/language_data.svg
     
     +table(["Name", "Description"])
         +row
             +cell #[strong Stop words]#[br]
    -            |  #[+src(gh("spacy-dev-resources", "templates/new_language/stop_words.py")) stop_words.py]
    +            |  #[+src(gh("spacy-dev-resources", "templates/new_language/stop_words.py")) #[code stop_words.py]]
             +cell
                 |  List of most common words of a language that are often useful to
                 |  filter out, for example "and" or "I". Matching tokens will
    @@ -43,21 +41,21 @@ p
     
         +row
             +cell #[strong Tokenizer exceptions]#[br]
    -            |  #[+src(gh("spacy-dev-resources", "templates/new_language/tokenizer_exceptions.py")) tokenizer_exceptions.py]
    +            |  #[+src(gh("spacy-dev-resources", "templates/new_language/tokenizer_exceptions.py")) #[code tokenizer_exceptions.py]]
             +cell
                 |  Special-case rules for the tokenizer, for example, contractions
                 |  like "can't" and abbreviations with punctuation, like "U.K.".
     
         +row
             +cell #[strong Norm exceptions]
    -            |  #[+src(gh("spaCy", "spacy/lang/norm_exceptions.py")) norm_exceptions.py]
    +            |  #[+src(gh("spaCy", "spacy/lang/norm_exceptions.py")) #[code norm_exceptions.py]]
             +cell
                 |  Special-case rules for normalising tokens to improve the model's
                 |  predictions, for example on American vs. British spelling.
     
         +row
             +cell #[strong Punctuation rules]
    -            |  #[+src(gh("spaCy", "spacy/lang/punctuation.py")) punctuation.py]
    +            |  #[+src(gh("spaCy", "spacy/lang/punctuation.py")) #[code punctuation.py]]
             +cell
                 |  Regular expressions for splitting tokens, e.g. on punctuation or
                 |  special characters like emoji. Includes rules for prefixes,
    @@ -65,14 +63,14 @@ p
     
         +row
             +cell #[strong Character classes]
    -            |  #[+src(gh("spaCy", "spacy/lang/char_classes.py")) char_classes.py]
    +            |  #[+src(gh("spaCy", "spacy/lang/char_classes.py")) #[code char_classes.py]]
             +cell
                 |  Character classes to be used in regular expressions, for example,
                 |  latin characters, quotes, hyphens or icons.
     
         +row
             +cell #[strong Lexical attributes]
    -            |  #[+src(gh("spacy-dev-resources", "templates/new_language/lex_attrs.py")) lex_attrs.py]
    +            |  #[+src(gh("spacy-dev-resources", "templates/new_language/lex_attrs.py")) #[code lex_attrs.py]]
             +cell
                 |  Custom functions for setting lexical attributes on tokens, e.g.
                 |  #[code like_num], which includes language-specific words like "ten"
    @@ -80,22 +78,22 @@ p
     
         +row
             +cell #[strong Syntax iterators]
    -            |  #[+src(gh("spaCy", "spacy/lang/en/syntax_iterators.py")) syntax_iterators.py]
    +            |  #[+src(gh("spaCy", "spacy/lang/en/syntax_iterators.py")) #[code syntax_iterators.py]]
             +cell
                 |  Functions that compute views of a #[code Doc] object based on its
                 |  syntax. At the moment, only used for
    -            |  #[+a("/docs/usage/dependency-parse#noun-chunks") noun chunks].
    +            |  #[+a("/usage/linguistic-features#noun-chunks") noun chunks].
     
         +row
             +cell #[strong Lemmatizer]
    -            |  #[+src(gh("spacy-dev-resources", "templates/new_language/lemmatizer.py")) lemmatizer.py]
    +            |  #[+src(gh("spacy-dev-resources", "templates/new_language/lemmatizer.py")) #[code lemmatizer.py]]
             +cell
                 |  Lemmatization rules or a lookup-based lemmatization table to
                 |  assign base forms, for example "be" for "was".
     
         +row
             +cell #[strong Tag map]#[br]
    -            |  #[+src(gh("spacy-dev-resources", "templates/new_language/tag_map.py")) tag_map.py]
    +            |  #[+src(gh("spacy-dev-resources", "templates/new_language/tag_map.py")) #[code tag_map.py]]
             +cell
                 |  Dictionary mapping strings in your tag set to
                 |  #[+a("http://universaldependencies.org/u/pos/all.html") Universal Dependencies]
    @@ -103,7 +101,7 @@ p
     
         +row
             +cell #[strong Morph rules]
    -            |  #[+src(gh("spaCy", "spacy/lang/en/morph_rules.py")) morph_rules.py]
    +            |  #[+src(gh("spaCy", "spacy/lang/en/morph_rules.py")) #[code morph_rules.py]]
             +cell
                 |  Exception rules for morphological analysis of irregular words like
                 |  personal pronouns.
    diff --git a/website/docs/usage/lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
    similarity index 82%
    rename from website/docs/usage/lightning-tour.jade
    rename to website/usage/_spacy-101/_lightning-tour.jade
    index 2b0cf0880..061ec7758 100644
    --- a/website/docs/usage/lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -1,13 +1,11 @@
    -//- 💫 DOCS > USAGE > LIGHTNING TOUR
    -
    -include ../../_includes/_mixins
    +//- 💫 DOCS > USAGE > SPACY 101 > LIGHTNING TOUR
     
     p
         |  The following examples and code snippets give you an overview of spaCy's
         |  functionality and its usage. If you're new to spaCy, make sure to check
    -    |  out the #[+a("/docs/usage/spacy-101") spaCy 101 guide].
    +    |  out the #[+a("/usage/spacy-101") spaCy 101 guide].
     
    -+h(2, "models") Install models and process text
    ++h(3, "lightning-tour-models") Install models and process text
     
     +code(false, "bash").
         spacy download en
    @@ -23,10 +21,10 @@ p
     
     +infobox
         |  #[strong API:] #[+api("spacy#load") #[code spacy.load()]]
    -    |  #[strong Usage:] #[+a("/docs/usage/models") Models],
    -    |  #[+a("/docs/usage/spacy-101") spaCy 101]
    +    |  #[strong Usage:] #[+a("/usage/models") Models],
    +    |  #[+a("/usage/spacy-101") spaCy 101]
     
    -+h(2, "examples-tokens-sentences") Get tokens, noun chunks & sentences
    ++h(3, "lightning-tour-tokens-sentences") Get tokens, noun chunks & sentences
         +tag-model("dependency parse")
     
     +code.
    @@ -45,9 +43,9 @@ p
     
     +infobox
         |  #[strong API:] #[+api("doc") #[code Doc]], #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/docs/usage/spacy-101") spaCy 101]
    +    |  #[strong Usage:] #[+a("/usage/spacy-101") spaCy 101]
     
    -+h(2, "examples-pos-tags") Get part-of-speech tags and flags
    ++h(3, "lightning-tour-pos-tags") Get part-of-speech tags and flags
         +tag-model("tagger")
     
     +code.
    @@ -66,9 +64,9 @@ p
     
     +infobox
         |  #[strong API:] #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/docs/usage/pos-tagging") Part-of-speech tagging]
    +    |  #[strong Usage:] #[+a("/usage/linguistic-features#pos-tagging") Part-of-speech tagging]
     
    -+h(2, "examples-hashes") Use hash values for any string
    ++h(3, "lightning-tour-hashes") Use hash values for any string
     
     +code.
         doc = nlp(u'I love coffee')
    @@ -86,9 +84,9 @@ p
     
     +infobox
         |  #[strong API:] #[+api("stringstore") #[code stringstore]]
    -    |  #[strong Usage:] #[+a("/docs/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
    +    |  #[strong Usage:] #[+a("/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
     
    -+h(2, "examples-entities") Recongnise and update named entities
    ++h(3, "lightning-tour-entities") Recongnise and update named entities
         +tag-model("NER")
     
     +code.
    @@ -103,9 +101,9 @@ p
         assert ents == [(0, 7, u'ORG')]
     
     +infobox
    -    |  #[strong Usage:] #[+a("/docs/usage/entity-recognition") Named entity recognition]
    +    |  #[strong Usage:] #[+a("/usage/linguistic-features#named-entities") Named entity recognition]
     
    -+h(2, "displacy") Visualize a dependency parse and named entities in your browser
    ++h(3, "lightning-tour-displacy") Visualize a dependency parse and named entities in your browser
         +tag-model("dependency parse", "NER")
     
     +aside
    @@ -156,9 +154,9 @@ p
     
     +infobox
         |  #[strong API:] #[+api("displacy") #[code displacy]]
    -    |  #[strong Usage:] #[+a("/docs/usage/visualizers") Visualizers]
    +    |  #[strong Usage:] #[+a("/usage/visualizers") Visualizers]
     
    -+h(2, "examples-word-vectors") Get word vectors and similarity
    ++h(3, "lightning-tour-word-vectors") Get word vectors and similarity
         +tag-model("word vectors")
     
     +code.
    @@ -171,9 +169,9 @@ p
         assert apple.has_vector, banana.has_vector, pasta.has_vector, hippo.has_vector
     
     +infobox
    -    |  #[strong Usage:] #[+a("/docs/usage/word-vectors-similarities") Word vectors and similarity]
    +    |  #[strong Usage:] #[+a("/usage/vectors-similarity") Word vectors and similarity]
     
    -+h(2, "examples-serialization") Simple and efficient serialization
    ++h(3, "lightning-tour-serialization") Simple and efficient serialization
     
     +code.
         import spacy
    @@ -190,9 +188,9 @@ p
     +infobox
         |  #[strong API:] #[+api("language") #[code Language]],
         |  #[+api("doc") #[code Doc]]
    -    |  #[strong Usage:] #[+a("/docs/usage/saving-loading") Saving and loading]
    +    |  #[strong Usage:] #[+a("/usage/models#saving-loading") Saving and loading models]
     
    -+h(2, "rule-matcher") Match text with token rules
    ++h(3, "lightning-tour-rule-matcher") Match text with token rules
     
     +code.
         import spacy
    @@ -212,9 +210,9 @@ p
     
     +infobox
         |  #[strong API:] #[+api("matcher") #[code Matcher]]
    -    |  #[strong Usage:] #[+a("/docs/usage/rule-based-matching") Rule-based matching]
    +    |  #[strong Usage:] #[+a("/usage/linguistic-features#rule-based-matching") Rule-based matching]
     
    -+h(2, "multi-threaded") Multi-threaded generator
    ++h(3, "lightning-tour-multi-threaded") Multi-threaded generator
     
     +code.
         texts = [u'One document.', u'...', u'Lots of documents']
    @@ -227,9 +225,9 @@ p
     
     +infobox
         |  #[strong API:] #[+api("doc") #[code Doc]]
    -    |  #[strong Usage:] #[+a("/docs/usage/production-usage") Production usage]
    +    |  #[strong Usage:] #[+a("/usage/processing-pipelines#multithreading") Processing pipelines]
     
    -+h(2, "examples-dependencies") Get syntactic dependencies
    ++h(3, "lightning-tour-dependencies") Get syntactic dependencies
         +tag-model("dependency parse")
     
     +code.
    @@ -243,9 +241,9 @@ p
     
     +infobox
         |  #[strong API:] #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/docs/usage/dependency-parse") Using the dependency parse]
    +    |  #[strong Usage:] #[+a("/usage/linguistic-features#dependency-parse") Using the dependency parse]
     
    -+h(2, "examples-numpy-arrays") Export to numpy arrays
    ++h(3, "lightning-tour-numpy-arrays") Export to numpy arrays
     
     +code.
         from spacy.attrs import ORTH, LIKE_URL, IS_OOV
    @@ -258,7 +256,7 @@ p
         assert doc[0].like_url == doc_array[0, 1]
         assert list(doc_array[:, 1]) == [t.like_url for t in doc]
     
    -+h(2, "examples-inline") Calculate inline markup on original string
    ++h(3, "lightning-tour-inline") Calculate inline markup on original string
     
     +code.
         def put_spans_around_tokens(doc, get_classes):
    diff --git a/website/docs/usage/_spacy-101/_named-entities.jade b/website/usage/_spacy-101/_named-entities.jade
    similarity index 90%
    rename from website/docs/usage/_spacy-101/_named-entities.jade
    rename to website/usage/_spacy-101/_named-entities.jade
    index a3c539564..d9c595e6a 100644
    --- a/website/docs/usage/_spacy-101/_named-entities.jade
    +++ b/website/usage/_spacy-101/_named-entities.jade
    @@ -3,7 +3,7 @@
     p
         |  A named entity is a "real-world object" that's assigned a name – for
         |  example, a person, a country, a product or a book title. spaCy can
    -    |  #[strong recognise] #[+a("/docs/api/annotation#named-entities") various types]
    +    |  #[strong recognise] #[+a("/api/annotation#named-entities") various types]
         |  of named entities in a document, by asking the model for a
         |  #[strong prediction]. Because models are statistical and strongly depend
         |  on the examples they were trained on, this doesn't always work
    @@ -32,7 +32,7 @@ p
         +annotation-row(["$1 billion", 44, 54, "MONEY", "Monetary values, including unit."], style)
     
     p
    -    |  Using spaCy's built-in #[+a("/docs/usage/visualizers") displaCy visualizer],
    +    |  Using spaCy's built-in #[+a("/usage/visualizers") displaCy visualizer],
         |  here's what our example sentence and its named entities look like:
     
     +codepen("2f2ad1408ff79fc6a326ea3aedbb353b", 160)
    diff --git a/website/docs/usage/_spacy-101/_pipelines.jade b/website/usage/_spacy-101/_pipelines.jade
    similarity index 89%
    rename from website/docs/usage/_spacy-101/_pipelines.jade
    rename to website/usage/_spacy-101/_pipelines.jade
    index c21c9f97c..4e9cd8aeb 100644
    --- a/website/docs/usage/_spacy-101/_pipelines.jade
    +++ b/website/usage/_spacy-101/_pipelines.jade
    @@ -5,15 +5,13 @@ p
         |  produce a #[code Doc] object. The #[code Doc] is then processed in several
         |  different steps – this is also referred to as the
         |  #[strong processing pipeline]. The pipeline used by the
    -    |  #[+a("/docs/usage/models") default models] consists of a
    +    |  #[+a("/models") default models] consists of a
         |  tensorizer, a tagger, a parser and an entity recognizer. Each pipeline
         |  component returns the processed #[code Doc], which is then passed on to
         |  the next component.
     
    -+image
    -    include ../../../assets/img/docs/pipeline.svg
    -    .u-text-right
    -        +button("/assets/img/docs/pipeline.svg", false, "secondary").u-text-tag View large graphic
    ++graphic("/assets/img/pipeline.svg")
    +    include ../../assets/img/pipeline.svg
     
     +aside
         |  #[strong Name:] ID of the pipeline component.#[br]
    @@ -30,7 +28,7 @@ p
     
         +row("divider")
             +cell tensorizer
    -        +cell #[code TokenVectorEncoder]
    +        +cell #[+api("tensorizer") Tensorizer]
             +cell #[code Doc.tensor]
             +cell Create feature representation tensor for #[code Doc].
     
    @@ -54,6 +52,12 @@ p
             +cell #[code Doc.ents], #[code Doc[i].ent_iob], #[code Doc[i].ent_type]
             +cell Detect and label named entities.
     
    +    +row
    +        +cell textcat
    +        +cell #[+api("textcategorizer") #[code TextCategorizer]]
    +        +cell #[code Doc.cats]
    +        +cell Assign document labels.
    +
     p
         |  The processing pipeline always #[strong depends on the statistical model]
         |  and its capabilities. For example, a pipeline can only include an entity
    diff --git a/website/docs/usage/_spacy-101/_pos-deps.jade b/website/usage/_spacy-101/_pos-deps.jade
    similarity index 95%
    rename from website/docs/usage/_spacy-101/_pos-deps.jade
    rename to website/usage/_spacy-101/_pos-deps.jade
    index 52a7fdd3c..a8f7f04b5 100644
    --- a/website/docs/usage/_spacy-101/_pos-deps.jade
    +++ b/website/usage/_spacy-101/_pos-deps.jade
    @@ -1,7 +1,7 @@
     //- 💫 DOCS > USAGE > SPACY 101 > POS TAGGING AND DEPENDENCY PARSING
     
     p
    -    |  After tokenization, spaCy can also #[strong parse] and #[strong tag] a
    +    |  After tokenization, spaCy can #[strong parse] and #[strong tag] a
         |  given #[code Doc]. This is where the statistical model comes in, which
         |  enables spaCy to #[strong make a prediction] of which tag or label most
         |  likely applies in this context. A model consists of binary data and is
    @@ -56,7 +56,7 @@ p
         |  singular present".
     
     p
    -    |  Using spaCy's built-in #[+a("/docs/usage/visualizers") displaCy visualizer],
    +    |  Using spaCy's built-in #[+a("/usage/visualizers") displaCy visualizer],
         |  here's what our example sentence and its dependencies look like:
     
     +codepen("030d1e4dfa6256cad8fdd59e6aefecbe", 460)
    diff --git a/website/docs/usage/_spacy-101/_serialization.jade b/website/usage/_spacy-101/_serialization.jade
    similarity index 100%
    rename from website/docs/usage/_spacy-101/_serialization.jade
    rename to website/usage/_spacy-101/_serialization.jade
    diff --git a/website/docs/usage/_spacy-101/_similarity.jade b/website/usage/_spacy-101/_similarity.jade
    similarity index 100%
    rename from website/docs/usage/_spacy-101/_similarity.jade
    rename to website/usage/_spacy-101/_similarity.jade
    diff --git a/website/docs/usage/_spacy-101/_tokenization.jade b/website/usage/_spacy-101/_tokenization.jade
    similarity index 90%
    rename from website/docs/usage/_spacy-101/_tokenization.jade
    rename to website/usage/_spacy-101/_tokenization.jade
    index d6911387c..602209ec8 100644
    --- a/website/docs/usage/_spacy-101/_tokenization.jade
    +++ b/website/usage/_spacy-101/_tokenization.jade
    @@ -49,14 +49,12 @@ p
         |  #[strong Infix:] Character(s) in between, e.g.
         |  #[code -], #[code --], #[code /], #[code …].#[br]
     
    -+image
    -    include ../../../assets/img/docs/tokenization.svg
    -    .u-text-right
    -        +button("/assets/img/docs/tokenization.svg", false, "secondary").u-text-tag View large graphic
    ++graphic("/assets/img/tokenization.svg")
    +    include ../../assets/img/tokenization.svg
     
     p
         |  While punctuation rules are usually pretty general, tokenizer exceptions
         |  strongly depend on the specifics of the individual language. This is
    -    |  why each #[+a("/docs/api/language-models") available language] has its
    +    |  why each #[+a("/models/#languages") available language] has its
         |  own subclass like #[code English] or #[code German], that loads in lists
         |  of hard-coded data and exception rules.
    diff --git a/website/docs/usage/_spacy-101/_training.jade b/website/usage/_spacy-101/_training.jade
    similarity index 94%
    rename from website/docs/usage/_spacy-101/_training.jade
    rename to website/usage/_spacy-101/_training.jade
    index 9b283c0eb..5d97a86df 100644
    --- a/website/docs/usage/_spacy-101/_training.jade
    +++ b/website/usage/_spacy-101/_training.jade
    @@ -24,10 +24,8 @@ p
         |  #[strong Gradient:] Gradient of the loss function calculating the
         |  difference between input and expected output.
     
    -+image
    -    include ../../../assets/img/docs/training.svg
    -    .u-text-right
    -        +button("/assets/img/docs/training.svg", false, "secondary").u-text-tag View large graphic
    ++graphic("/assets/img/training.svg")
    +    include ../../assets/img/training.svg
     
     p
         |  When training a model, we don't just want it to memorise our examples –
    diff --git a/website/docs/usage/_spacy-101/_vocab.jade b/website/usage/_spacy-101/_vocab.jade
    similarity index 96%
    rename from website/docs/usage/_spacy-101/_vocab.jade
    rename to website/usage/_spacy-101/_vocab.jade
    index 3063262d5..185e634fe 100644
    --- a/website/docs/usage/_spacy-101/_vocab.jade
    +++ b/website/usage/_spacy-101/_vocab.jade
    @@ -19,10 +19,8 @@ p
         |  #[strong StringStore]: The dictionary mapping hash values to strings, for
         |  example #[code 3197928453018144401] → "coffee".
     
    -+image
    -    include ../../../assets/img/docs/vocab_stringstore.svg
    -    .u-text-right
    -        +button("/assets/img/docs/vocab_stringstore.svg", false, "secondary").u-text-tag View large graphic
    ++graphic("/assets/img/vocab_stringstore.svg")
    +    include ../../assets/img/vocab_stringstore.svg
     
     p
         |  If you process lots of documents containing the word "coffee" in all
    diff --git a/website/docs/usage/_spacy-101/_word-vectors.jade b/website/usage/_spacy-101/_word-vectors.jade
    similarity index 98%
    rename from website/docs/usage/_spacy-101/_word-vectors.jade
    rename to website/usage/_spacy-101/_word-vectors.jade
    index cbb9d06f2..bb9add8a6 100644
    --- a/website/docs/usage/_spacy-101/_word-vectors.jade
    +++ b/website/usage/_spacy-101/_word-vectors.jade
    @@ -5,7 +5,7 @@ p
         |  embeddings", multi-dimensional meaning representations of a word. Word
         |  vectors can be generated using an algorithm like
         |  #[+a("https://en.wikipedia.org/wiki/Word2vec") word2vec]. Most of spaCy's
    -    |  #[+a("/docs/usage/models") default models] come with
    +    |  #[+a("/models") default models] come with
         |  #[strong 300-dimensional vectors] that look like this:
     
     +code("banana.vector", false, false, 250).
    @@ -148,5 +148,5 @@ p
     p
         |  If your application will benefit from a large vocabulary with more
         |  vectors, you should consider using one of the
    -    |  #[+a("/docs/usage/models#available") larger models] instead of the default,
    +    |  #[+a("/models") larger models] instead of the default,
         |  smaller ones, which usually come with a clipped vocabulary.
    diff --git a/website/docs/usage/training.jade b/website/usage/_training/_basics.jade
    similarity index 89%
    rename from website/docs/usage/training.jade
    rename to website/usage/_training/_basics.jade
    index c1a7c1835..05e67c2c1 100644
    --- a/website/docs/usage/training.jade
    +++ b/website/usage/_training/_basics.jade
    @@ -1,14 +1,6 @@
    -include ../../_includes/_mixins
    +//- 💫 DOCS > USAGE > TRAINING > BASICS
     
    -p
    -    |  This guide describes how to train new statistical models for spaCy's
    -    |  part-of-speech tagger, named entity recognizer and dependency parser.
    -    |  Once the model is trained, you can then
    -    |  #[+a("/docs/usage/saving-loading") save and load] it.
    -
    -+h(2, "101") Training 101
    -
    -include _spacy-101/_training
    +include ../_spacy-101/_training
     
     +h(3, "training-data") How do I get training data?
     
    @@ -50,7 +42,7 @@ p
     
     p
         |  Alternatively, the
    -    |  #[+a("/docs/usage/rule-based-matching#example3") rule-based matcher]
    +    |  #[+a("/usage/linguistic-features#rule-based-matching") rule-based matcher]
         |  can be a useful tool to extract tokens or combinations of tokens, as
         |  well as their start and end index in a document. In this case, we'll
         |  extract mentions of Google and assume they're an #[code ORG].
    @@ -73,7 +65,7 @@ p
         |  #[strong what you want the model to learn]. While there are some entity
         |  annotations that are more or less universally correct – like Canada being
         |  a geopolitical entity – your application may have its very own definition
    -    |  of the #[+a("/docs/api/annotation#named-entities") NER annotation scheme].
    +    |  of the #[+a("/api/annotation#named-entities") NER annotation scheme].
     
     +code.
         train_data = [
    @@ -84,7 +76,7 @@ p
             ("Google rebrands its business apps", [(0, 6, "ORG")]),
             ("look what i found on google! 😂", [(21, 27, "PRODUCT")])]
     
    -+h(2) Training with annotations
    ++h(3, "annotations") Training with annotations
     
     p
         |  The #[+api("goldparse") #[code GoldParse]] object collects the annotated
    @@ -103,7 +95,7 @@ p
     p
         |  Using the #[code Doc] and its gold-standard annotations, the model can be
         |  updated to learn a sentence of three words with their assigned
    -    |  part-of-speech tags. The #[+a("/docs/usage/adding-languages#tag-map") tag map]
    +    |  part-of-speech tags. The #[+a("/usage/adding-languages#tag-map") tag map]
         |  is part of the vocabulary and defines the annotation scheme. If you're
         |  training a new language model, this will let you map the tags present in
         |  the treebank you train on to spaCy's tag scheme.
    @@ -115,7 +107,7 @@ p
     p
         |  The same goes for named entities. The letters added before the labels
         |  refer to the tags of the
    -    |  #[+a("/docs/usage/entity-recognition#updating-biluo") BILUO scheme] –
    +    |  #[+a("/usage/linguistic-features#updating-biluo") BILUO scheme] –
         |  #[code O] is a token outside an entity, #[code U] an single entity unit,
         |  #[code B] the beginning of an entity, #[code I] a token inside an entity
         |  and #[code L] the last token of an entity.
    @@ -130,10 +122,8 @@ p
         |  #[strong Update]: Update the model's weights.#[br]
         |  #[strong ]
     
    -+image
    -    include ../../assets/img/docs/training-loop.svg
    -    .u-text-right
    -        +button("/assets/img/docs/training-loop.svg", false, "secondary").u-text-tag View large graphic
    ++graphic("/assets/img/training-loop.svg")
    +    include ../../assets/img/training-loop.svg
     
     p
         |  Of course, it's not enough to only show a model a single example once.
    @@ -192,11 +182,7 @@ p
     
     +infobox
         |  For the #[strong full example and more details], see the usage guide on
    -    |  #[+a("/docs/usage/training-ner") training the named entity recognizer],
    +    |  #[+a("/usage/training#ner") training the named entity recognizer],
         |  or the runnable
         |  #[+src(gh("spaCy", "examples/training/train_ner.py")) training script]
         |  on GitHub.
    -
    -+h(2) Examples
    -
    -+under-construction
    diff --git a/website/usage/_training/_ner.jade b/website/usage/_training/_ner.jade
    new file mode 100644
    index 000000000..ff3101c8f
    --- /dev/null
    +++ b/website/usage/_training/_ner.jade
    @@ -0,0 +1,61 @@
    +//- 💫 DOCS > USAGE > TRAINING > NER
    +
    +p
    +    |  All #[+a("/models") spaCy models] support online learning, so
    +    |  you can update a pre-trained model with new examples. To update the
    +    |  model, you first need to create an instance of
    +    |  #[+api("goldparse") #[code GoldParse]], with the entity labels
    +    |  you want to learn. You'll usually need to provide many examples to
    +    |  meaningfully improve the system — a few hundred is a good start, although
    +    |  more is better.
    +
    +p
    +    |  You should avoid iterating over the same few examples multiple times, or
    +    |  the model is likely to "forget" how to annotate other examples. If you
    +    |  iterate over the same few examples, you're effectively changing the loss
    +    |  function. The optimizer will find a way to minimize the loss on your
    +    |  examples, without regard for the consequences on the examples it's no
    +    |  longer paying attention to. One way to avoid this
    +    |  #[+a("https://explosion.ai/blog/pseudo-rehearsal-catastrophic-forgetting", true) "catastrophic forgetting" problem]
    +    |  is to "remind"
    +    |  the model of other examples by augmenting your annotations with sentences
    +    |  annotated with entities automatically recognised by the original model.
    +    |  Ultimately, this is an empirical process: you'll need to
    +    |  #[strong experiment on your own data] to find a solution that works best
    +    |  for you.
    +
    ++h(3, "example-new-entity-type") Example: Training an additional entity type
    +
    +p
    +    |  This script shows how to add a new entity type to an existing pre-trained
    +    |  NER model. To keep the example short and simple, only a few sentences are
    +    |  provided as examples. In practice, you'll need many more — a few hundred
    +    |  would be a good start. You will also likely need to mix in examples of
    +    |  other entity types, which might be obtained by running the entity
    +    |  recognizer over unlabelled sentences, and adding their annotations to the
    +    |  training set.
    +
    +p
    +    |  The actual training is performed by looping over the examples, and
    +    |  calling #[+api("language#update") #[code nlp.update()]]. The
    +    |  #[code update] method steps through the words of the input. At each word,
    +    |  it makes a prediction. It then consults the annotations provided on the
    +    |  #[+api("goldparse") #[code GoldParse]] instance, to see whether it was
    +    |  right. If it was wrong, it adjusts its weights so that the correct
    +    |  action will score higher next time.
    +
    ++github("spacy", "examples/training/train_new_entity_type.py")
    +
    ++h(3, "example-ner-from-scratch") Example: Training an NER system from scratch
    +
    +p
    +    |  This example is written to be self-contained and reasonably transparent.
    +    |  To achieve that, it duplicates some of spaCy's internal functionality.
    +    |  Specifically, in this example, we don't use spaCy's built-in
    +    |  #[+api("language") #[code Language]] class to wire together the
    +    |  #[+api("vocab") #[code Vocab]], #[+api("tokenizer") #[code Tokenizer]]
    +    |  and #[+api("entityrecognizer") #[code EntityRecognizer]]. Instead, we
    +    |  write our own simle #[code Pipeline] class, so that it's easier to see
    +    |  how the pieces interact.
    +
    ++github("spacy", "examples/training/train_ner_standalone.py")
    diff --git a/website/docs/usage/saving-loading.jade b/website/usage/_training/_saving-loading.jade
    similarity index 70%
    rename from website/docs/usage/saving-loading.jade
    rename to website/usage/_training/_saving-loading.jade
    index de7e4ed33..e6e54385c 100644
    --- a/website/docs/usage/saving-loading.jade
    +++ b/website/usage/_training/_saving-loading.jade
    @@ -1,45 +1,4 @@
    -include ../../_includes/_mixins
    -
    -+h(2, "101") Serialization 101
    -
    -include _spacy-101/_serialization
    -
    -+infobox("Important note")
    -    |  In spaCy v2.0, the API for saving and loading has changed to only use the
    -    |  four methods listed above consistently across objects and classes. For an
    -    |  overview of the changes, see #[+a("/docs/usage/v2#incompat") this table]
    -    |  and the notes on #[+a("/docs/usage/v2#migrating-saving-loading") migrating].
    -
    -+h(3, "example-doc") Example: Saving and loading a document
    -
    -p
    -    |  For simplicity, let's assume you've
    -    |  #[+a("/docs/usage/entity-recognition#setting") added custom entities] to
    -    |  a #[code Doc], either manually, or by using a
    -    |  #[+a("/docs/usage/rule-based-matching#on_match") match pattern]. You can
    -    |  save it locally by calling #[+api("doc#to_disk") #[code Doc.to_disk()]],
    -    |  and load it again via #[+api("doc#from_disk") #[code Doc.from_disk()]].
    -    |  This will overwrite the existing object and return it.
    -
    -+code.
    -    import spacy
    -    from spacy.tokens import Span
    -
    -    text = u'Netflix is hiring a new VP of global policy'
    -
    -    nlp = spacy.load('en')
    -    doc = nlp(text)
    -    assert len(doc.ents) == 0 # Doc has no entities
    -    doc.ents += ((Span(doc, 0, 1, label=doc.vocab.strings[u'ORG'])) # add entity
    -    doc.to_disk('/path/to/doc') # save Doc to disk
    -
    -    new_doc = nlp(text)
    -    assert len(new_doc.ents) == 0 # new Doc has no entities
    -    new_doc = new_doc.from_disk('path/to/doc') # load from disk and overwrite
    -    assert len(new_doc.ents) == 1 # entity is now recognised!
    -    assert [(ent.text, ent.label_) for ent in new_doc.ents] == [(u'Netflix', u'ORG')]
    -
    -+h(2, "models") Saving models
    +//- 💫 DOCS > USAGE > TRAINING > SAVING & LOADING
     
     p
         |  After training your model, you'll usually want to save its state, and load
    @@ -55,6 +14,7 @@ p
         |  will be written out. To make the model more convenient to deploy, we
         |  recommend wrapping it as a Python package.
     
    +
     +h(3, "models-generating") Generating a model package
     
     +infobox("Important note")
    @@ -105,13 +65,14 @@ p
         |  need to be named according to the naming conventions of
         |  #[code lang_name] and #[code lang_name-version].
     
    +
     +h(3, "models-custom") Customising the model setup
     
     p
         |  The meta.json includes the model details, like name, requirements and
         |  license, and lets you customise how the model should be initialised and
         |  loaded. You can define the language data to be loaded and the
    -    |  #[+a("/docs/usage/language-processing-pipeline") processing pipeline] to
    +    |  #[+a("/usage/processing-pipelines") processing pipeline] to
         |  execute.
     
     +table(["Setting", "Type", "Description"])
    @@ -126,7 +87,7 @@ p
             +cell
                 |  A list of strings mapping to the IDs of pipeline factories to
                 |  apply in that order. If not set, spaCy's
    -            |  #[+a("/docs/usage/language-processing/pipelines") default pipeline]
    +            |  #[+a("/usage/processing-pipelines") default pipeline]
                 |  will be used.
     
     p
    @@ -135,7 +96,7 @@ p
         |  #[code Language] object with the loaded pipeline and data. If your model
         |  requires custom pipeline components, you should
         |  #[strong ship then with your model] and register their
    -    |  #[+a("/docs/usage/language-processing-pipeline#creating-factory") factories]
    +    |  #[+a("/usage/processing-pipelines#creating-factory") factories]
         |  via  #[+api("spacy#set_factory") #[code set_factory()]].
     
     +aside-code("Factory example").
    @@ -152,7 +113,7 @@ p
     +infobox("Custom models with pipeline components")
         |  For more details and an example of how to package a sentiment model
         |  with a custom pipeline component, see the usage guide on
    -    |  #[+a("/docs/usage/language-processing-pipeline#example2") language processing pipelines].
    +    |  #[+a("/usage/processing-pipelines#example2") language processing pipelines].
     
     +h(3, "models-building") Building the model package
     
    @@ -176,7 +137,7 @@ p
         |  You can then load the model via its name, #[code en_example_model], or
         |  import it directly as a module and then call its #[code load()] method.
     
    -+h(2, "loading") Loading a custom model package
    ++h(3, "loading") Loading a custom model package
     
     p
         |  To load a model from a data directory, you can use
    @@ -209,3 +170,38 @@ p
     
         +code-new nlp = English().from_disk('/path/to/data')
         +code-old nlp = spacy.load('en', path='/path/to/data')
    +
    ++h(3, "example-training-spacy") Example: How we're training and packaging models for spaCy
    +
    +p
    +    |  Publishing a new version of spaCy often means re-training all available
    +    |  models – currently, that's #{MODEL_COUNT} models for #{MODEL_LANG_COUNT}
    +    |  languages. To make this run smoothly, we're using an automated build
    +    |  process and a #[+api("cli#train") #[code spacy train]] template that
    +    |  looks like this:
    +
    ++code(false, "bash", "$", false, false, true).
    +    spacy train {lang} {models_dir}/{name} {train_data} {dev_data} -m meta/{name}.json -V {version} -g {gpu_id} -n {n_epoch} -ns {n_sents}
    +
    ++aside-code("meta.json template", "json").
    +    {
    +        "lang": "en",
    +        "name": "core_web_sm",
    +        "license":"CC BY-SA 3.0",
    +        "author":"Explosion AI",
    +        "url":"https://explosion.ai",
    +        "email":"contact@explosion.ai",
    +        "sources": ["OntoNotes 5", "Common Crawl"],
    +        "description":"English multi-task CNN trained on OntoNotes, with GloVe vectors trained on common crawl. Assigns word vectors, context-specific token vectors, POS tags, dependency parse and named entities."
    +    }
    +
    +p In a directory #[code meta], we keep #[code meta.json] templates for the individual models, containing all relevant information that doesn't change across versions, like the name, description, author info and training data sources. When we train the model, we pass in the file to the meta template as the #[code --meta] argument, and specify the current model version as the #[code --version] argument.
    +
    +p On each epoch, the model is saved out with a #[code meta.json] using our template and added properties, like the #[code pipeline], #[code accuracy] scores and the #[code spacy_version] used to train the model. After training completion, the best model is selected automatically and packaged using the #[+api("cli#package") #[code package]] command. Since a full meta file is already present on the trained model, no further setup is required to build a valid model package.
    +
    ++code(false, "bash").
    +    spacy package -f {best_model} dist/
    +    cd dist/{model_name}
    +    python setup.py sdist
    +
    +p This process allows us to quickly trigger the model training and build process for all available models and languages, and generate the correct meta data automatically.
    diff --git a/website/usage/_training/_similarity.jade b/website/usage/_training/_similarity.jade
    new file mode 100644
    index 000000000..eb7991c37
    --- /dev/null
    +++ b/website/usage/_training/_similarity.jade
    @@ -0,0 +1,3 @@
    +//- 💫 DOCS > USAGE > TRAINING > SIMILARITY
    +
    ++under-construction
    diff --git a/website/usage/_training/_tagger-parser.jade b/website/usage/_training/_tagger-parser.jade
    new file mode 100644
    index 000000000..4011464c7
    --- /dev/null
    +++ b/website/usage/_training/_tagger-parser.jade
    @@ -0,0 +1,3 @@
    +//- 💫 DOCS > USAGE > TRAINING > TAGGER & PARSER
    +
    ++under-construction
    diff --git a/website/usage/_training/_textcat.jade b/website/usage/_training/_textcat.jade
    new file mode 100644
    index 000000000..5c90519db
    --- /dev/null
    +++ b/website/usage/_training/_textcat.jade
    @@ -0,0 +1,13 @@
    +//- 💫 DOCS > USAGE > TRAINING > TEXT CLASSIFICATION
    +
    ++under-construction
    +
    ++h(3, "example-textcat") Example: Training spaCy's text classifier
    +    +tag-new(2)
    +
    +p
    +    |  This example shows how to use and train spaCy's new
    +    |  #[+api("textcategorizer") #[code TextCategorizer]] pipeline component
    +    |  on IMDB movie reviews.
    +
    ++github("spacy", "examples/training/train_textcat.py")
    diff --git a/website/usage/_vectors-similarity/_basics.jade b/website/usage/_vectors-similarity/_basics.jade
    new file mode 100644
    index 000000000..b8f8d834c
    --- /dev/null
    +++ b/website/usage/_vectors-similarity/_basics.jade
    @@ -0,0 +1,15 @@
    +//- 💫 DOCS > USAGE > VECTORS & SIMILARITY > BASICS
    +
    ++aside("Training word vectors")
    +    |  Dense, real valued vectors representing distributional similarity
    +    |  information are now a cornerstone of practical NLP. The most common way
    +    |  to train these vectors is the #[+a("https://en.wikipedia.org/wiki/Word2vec") word2vec]
    +    |  family of algorithms. The default
    +    |  #[+a("/models/en") English model] installs
    +    |  300-dimensional vectors trained on the
    +    |  #[+a("http://commoncrawl.org") Common Crawl] corpus.
    +    |  If you need to train a word2vec model, we recommend the implementation in
    +    |  the Python library #[+a("https://radimrehurek.com/gensim/") Gensim].
    +
    +include ../_spacy-101/_similarity
    +include ../_spacy-101/_word-vectors
    diff --git a/website/usage/_vectors-similarity/_custom.jade b/website/usage/_vectors-similarity/_custom.jade
    new file mode 100644
    index 000000000..da4be39fd
    --- /dev/null
    +++ b/website/usage/_vectors-similarity/_custom.jade
    @@ -0,0 +1,91 @@
    +//- 💫 DOCS > USAGE > VECTORS & SIMILARITY > CUSTOM VECTORS
    +
    +p
    +    |  By default, #[+api("token#vector") #[code Token.vector]] returns the
    +    |  vector for its underlying #[+api("lexeme") #[code Lexeme]], while
    +    |  #[+api("doc#vector") #[code Doc.vector]] and
    +    |  #[+api("span#vector") #[code Span.vector]] return an average of the
    +    |  vectors of their tokens. You can customize these
    +    |  behaviours by modifying the #[code doc.user_hooks],
    +    |  #[code doc.user_span_hooks] and #[code doc.user_token_hooks]
    +    |  dictionaries.
    +
    ++infobox
    +    |  For more details on #[strong adding hooks] and #[strong overwriting] the
    +    |  built-in #[code Doc], #[code Span] and #[code Token] methods, see the
    +    |  usage guide on #[+a("/usage/processing-pipelines#user-hooks") user hooks].
    +
    ++h(3, "custom-vectors-add") Adding vectors
    +    +tag-new(2)
    +
    +p
    +    |  The new #[+api("vectors") #[code Vectors]] class makes it easy to add
    +    |  your own vectors to spaCy. Just like the #[+api("vocab") #[code Vocab]],
    +    |  it is initialised with a #[+api("stringstore") #[code StringStore]] or
    +    |  a list of strings.
    +
    ++code("Adding vectors one-by-one").
    +    from spacy.strings import StringStore
    +    from spacy.vectors import Vectors
    +
    +    vector_data = {'dog': numpy.random.uniform(-1, 1, (300,)),
    +                   'cat': numpy.random.uniform(-1, 1, (300,)),
    +                   'orange': numpy.random.uniform(-1, 1, (300,))}
    +
    +    vectors = Vectors(StringStore(), 300)
    +    for word, vector in vector_data.items():
    +        vectors.add(word, vector)
    +
    +p
    +    |  You can also add the vector values directly on initialisation:
    +
    ++code("Adding vectors on initialisation").
    +    from spacy.vectors import Vectors
    +
    +    vector_table = numpy.zeros((3, 300), dtype='f')
    +    vectors = Vectors([u'dog', u'cat', u'orange'], vector_table)
    +
    ++h(3, "custom-loading-glove") Loading GloVe vectors
    +    +tag-new(2)
    +
    +p
    +    |  spaCy comes with built-in support for loading
    +    |  #[+a("https://nlp.stanford.edu/projects/glove/") GloVe] vectors from
    +    |  a directory. The #[+api("vectors#from_glove") #[code Vectors.from_glove]]
    +    |  method assumes a binary format, the vocab provided in a
    +    |  #[code vocab.txt], and the naming scheme of
    +    |  #[code vectors.{size}.[fd].bin]. For example:
    +
    ++aside-code("Directory structure", "yaml").
    +    └── vectors
    +        ├── vectors.128.f.bin  # vectors file
    +        └── vocab.txt          # vocabulary
    +
    ++table(["File name", "Dimensions", "Data type"])
    +    +row
    +        +cell #[code vectors.128.f.bin]
    +        +cell 128
    +        +cell float32
    +
    +    +row
    +        +cell #[code vectors.300.d.bin]
    +        +cell 300
    +        +cell float64 (double)
    +
    ++code.
    +    from spacy.vectors import Vectors
    +
    +    vectors = Vectors([], 128)
    +    vectors.from_glove('/path/to/vectors')
    +
    ++h(3, "custom-loading-other") Loading other vectors
    +    +tag-new(2)
    +
    +p
    +    |  You can also choose to load in vectors from other sources, like the
    +    |  #[+a("https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md") fastText vectors]
    +    |  for 294 languages, trained on Wikipedia. After reading in the file,
    +    |  the vectors are added to the #[code Vocab] using the
    +    |  #[+api("vocab#set_vector") #[code set_vector]] method.
    +
    ++github("spacy", "examples/vectors_fast_text.py")
    diff --git a/website/usage/_vectors-similarity/_gpu.jade b/website/usage/_vectors-similarity/_gpu.jade
    new file mode 100644
    index 000000000..9f1201da9
    --- /dev/null
    +++ b/website/usage/_vectors-similarity/_gpu.jade
    @@ -0,0 +1,30 @@
    +//- 💫 DOCS > USAGE > VECTORS & SIMILARITY > GPU
    +
    +p
    +    |  If you're using a GPU, it's much more efficient to keep the word vectors
    +    |  on the device. You can do that by setting the
    +    |  #[+api("vectors#attributes") #[code Vectors.data]] attribute to a
    +    |  #[code cupy.ndarray] object if you're using spaCy
    +    |  or #[+a("https://chainer.org") Chainer], or a
    +    |  #[code torch.Tensor] object if you're using
    +    |  #[+a("http://pytorch.org") PyTorch]. The #[code data] object just needs
    +    |  to support #[code __iter__] and #[code __getitem__], so if you're using
    +    |  another library such as #[+a("https://www.tensorflow.org") TensorFlow],
    +    |  you could also create a wrapper for your vectors data.
    +
    ++code("spaCy, Thinc or Chainer").
    +    import cupy.cuda
    +    from spacy.vectors import Vectors
    +
    +    vector_table = numpy.zeros((3, 300), dtype='f')
    +    vectors = Vectors([u'dog', u'cat', u'orange'], vector_table)
    +    with cupy.cuda.Device(0):
    +        vectors.data = cupy.asarray(vectors.data)
    +
    ++code("PyTorch").
    +    import torch
    +    from spacy.vectors import Vectors
    +
    +    vector_table = numpy.zeros((3, 300), dtype='f')
    +    vectors = Vectors([u'dog', u'cat', u'orange'], vector_table)
    +    vectors.data = torch.Tensor(vectors.data).cuda(0)
    diff --git a/website/docs/usage/word-vectors-similarities.jade b/website/usage/_vectors-similarity/_in-context.jade
    similarity index 72%
    rename from website/docs/usage/word-vectors-similarities.jade
    rename to website/usage/_vectors-similarity/_in-context.jade
    index 937fbfbd0..d8e864d9d 100644
    --- a/website/docs/usage/word-vectors-similarities.jade
    +++ b/website/usage/_vectors-similarity/_in-context.jade
    @@ -1,34 +1,11 @@
    -//- 💫 DOCS > USAGE > WORD VECTORS & SIMILARITIES
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  Dense, real valued vectors representing distributional similarity
    -    |  information are now a cornerstone of practical NLP. The most common way
    -    |  to train these vectors is the #[+a("https://en.wikipedia.org/wiki/Word2vec") word2vec]
    -    |  family of algorithms. The default
    -    |  #[+a("/docs/usage/models#available") English model] installs
    -    |  300-dimensional vectors trained on the
    -    |  #[+a("http://commoncrawl.org") Common Crawl] corpus.
    -
    -+aside("Tip: Training a word2vec model")
    -    |  If you need to train a word2vec model, we recommend the implementation in
    -    |  the Python library #[+a("https://radimrehurek.com/gensim/") Gensim].
    -
    -+h(2, "101") Similarity and word vectors 101
    -    +tag-model("vectors")
    -
    -include _spacy-101/_similarity
    -include _spacy-101/_word-vectors
    -
    -+h(2, "similarity-context") Similarities in context
    +//- 💫 DOCS > USAGE > VECTORS & SIMILARITY > IN CONTEXT
     
     p
         |  Aside from spaCy's built-in word vectors, which were trained on a lot of
         |  text with a wide vocabulary, the parsing, tagging and NER models also
         |  rely on vector representations of the #[strong meanings of words in context].
         |  As the first component of the
    -    |  #[+a("/docs/usage/language-processing-pipeline") processing pipeline], the
    +    |  #[+a("/usage/processing-pipelines") processing pipeline], the
         |  tensorizer encodes a document's internal meaning representations as an
         |  array of floats, also called a tensor. This allows spaCy to make a
         |  reasonable guess at a word's meaning, based on its surrounding words.
    @@ -117,8 +94,8 @@ p
                 nlp(u"man dog bites"), nlp(u"dog man bites")]
     
         for doc in docs:
    -    for other_doc in docs:
    -        print(doc.similarity(other_doc))
    +        for other_doc in docs:
    +            print(doc.similarity(other_doc))
     
     p
         |  Interestingly, "man bites dog" and "man dog bites" are seen as slightly
    @@ -143,17 +120,3 @@ p
                     +cell.u-text-center #[code=cell.toFixed(2)]
                         |  #[+procon(cell < 0.7 ? "con" : cell != 1 ? "pro" : "neutral")]
             - counter++
    -
    -+h(2, "custom") Customising word vectors
    -
    -+under-construction
    -
    -p
    -    |  By default, #[+api("token#vector") #[code Token.vector]] returns the
    -    |  vector for its underlying #[+api("lexeme") #[code Lexeme]], while
    -    |  #[+api("doc#vector") #[code Doc.vector]] and
    -    |  #[+api("span#vector") #[code Span.vector]] return an average of the
    -    |  vectors of their tokens. You can customize these
    -    |  behaviours by modifying the #[code doc.user_hooks],
    -    |  #[code doc.user_span_hooks] and #[code doc.user_token_hooks]
    -    |  dictionaries.
    diff --git a/website/usage/adding-languages.jade b/website/usage/adding-languages.jade
    new file mode 100644
    index 000000000..0690c8738
    --- /dev/null
    +++ b/website/usage/adding-languages.jade
    @@ -0,0 +1,59 @@
    +//- 💫 DOCS > USAGE > ADDING LANGUAGES
    +
    +include ../_includes/_mixins
    +
    ++aside("Working on spaCy's source")
    +    |  To add a new language to spaCy, you'll need to
    +    |  #[strong modify the library's code]. The easiest way to do this is to
    +    |  clone the #[+src(gh("spaCy")) repository] and #[strong build spaCy from source].
    +    |  For more information on this, see the #[+a("/usage") installation guide].
    +    |  Unlike spaCy's core, which is mostly written in Cython, all language
    +    |  data is stored in regular Python files. This means that you won't have to
    +    |  rebuild anything in between – you can simply make edits and reload spaCy
    +    |  to test them.
    +
    ++grid.o-no-block
    +    +grid-col("half")
    +        p
    +            |  Obviously, there are lots of ways you can organise your code when
    +            |  you implement your own language data. This guide will focus on
    +            |  how it's done within spaCy. For full language support, you'll
    +            |  need to create a #[code Language] subclass, define custom
    +            |  #[strong language data], like a stop list and tokenizer
    +            |  exceptions and test the new tokenizer. Once the language is set
    +            |  up, you can #[strong build the vocabulary], including word
    +            |  frequencies, Brown clusters and word vectors. Finally, you can
    +            |  #[strong train the tagger and parser], and save the model to a
    +            |  directory.
    +
    +        p
    +            |  For some languages, you may also want to develop a solution for
    +            |  lemmatization and morphological analysis.
    +
    +    +table-of-contents
    +        +item #[+a("#101") Language data 101]
    +        +item #[+a("#language-subclass") The Language subclass]
    +        +item #[+a("#stop-words") Stop words]
    +        +item #[+a("#tokenizer-exceptions") Tokenizer exceptions]
    +        +item #[+a("#norm-exceptions") Norm exceptions]
    +        +item #[+a("#lex-attrs") Lexical attributes]
    +        +item #[+a("#syntax-iterators") Syntax iterators]
    +        +item #[+a("#lemmatizer") Lemmatizer]
    +        +item #[+a("#tag-map") Tag map]
    +        +item #[+a("#morph-rules") Morph rules]
    +        +item #[+a("#testing") Testing the language]
    +        +item #[+a("#vocabulary") Building the vocabulary]
    +        +item #[+a("#training") Training]
    +
    ++section("language-data")
    +    +h(2, "language-data") Language data
    +    include _spacy-101/_language-data
    +    include _adding-languages/_language-data
    +
    ++section("testing")
    +    +h(2, "testing") Testing the new language
    +    include _adding-languages/_testing
    +
    ++section("training")
    +    +h(2, "training") Training a language model
    +    include _adding-languages/_training
    diff --git a/website/usage/deep-learning.jade b/website/usage/deep-learning.jade
    new file mode 100644
    index 000000000..4c33c0572
    --- /dev/null
    +++ b/website/usage/deep-learning.jade
    @@ -0,0 +1,29 @@
    +//- 💫 DOCS > USAGE > DEEP LEARNING
    +
    +include ../_includes/_mixins
    ++section
    +    +under-construction
    +
    ++section("pre-processing")
    +    +h(2, "pre-processing") Pre-processing text for deep learning
    +    include _deep-learning/_pre-processing
    +
    ++section("thinc")
    +    +h(2, "thinc") spaCy and Thinc
    +    include _deep-learning/_thinc
    +
    ++section("tensorflow-keras")
    +    +h(2, "tensorflow-keras") Using spaCy with TensorFlow / Keras
    +    include _deep-learning/_tensorflow-keras
    +
    ++section("scikit-learn")
    +    +h(2, "scikit-learn") Using spaCy with scikit-learn
    +    include _deep-learning/_scikit-learn
    +
    ++section("pytorch")
    +    +h(2, "pytorch") Using spaCy with PyTorch
    +    include _deep-learning/_pytorch
    +
    ++section("dynet")
    +    +h(2, "dynet") Using spaCy with DyNet
    +    include _deep-learning/_dynet
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    new file mode 100644
    index 000000000..75d05e339
    --- /dev/null
    +++ b/website/usage/examples.jade
    @@ -0,0 +1,73 @@
    +//- 💫 DOCS > USAGE > EXAMPLES
    +
    +include ../_includes/_mixins
    +
    ++section("matching")
    +    +h(3, "matcher") Using spaCy's rule-based matcher
    +
    +    p
    +        |  This example shows how to use spaCy's rule-based
    +        |  #[+api("matcher") #[code Matcher]] to find and label entities across
    +        |  documents.
    +
    +    +github("spacy", "examples/matcher_example.py")
    +
    +    +h(3, "phrase-matcher") Using spaCy's phrase matcher
    +        +tag-new(2)
    +
    +    p
    +        |  This example shows how to use the new
    +        |  #[+api("phrasematcher") #[code PhraseMatcher]] to efficiently find
    +        |  entities from a large terminology list.
    +
    +    +github("spacy", "examples/phrase_matcher.py")
    +
    ++section("training")
    +    +h(3, "new-entity-type") Training an additional entity type
    +
    +    p
    +        |  This script shows how to add a new entity type to an existing
    +        |  pre-trained NER model. To keep the example short and simple, only
    +        |  four sentences are provided as examples. In practice, you'll need
    +        |  many more — a few hundred would be a good start.
    +
    +    +github("spacy", "examples/training/train_new_entity_type.py")
    +
    +    +h(3, "ner-standalone") Training an NER system from scratch
    +
    +    p
    +        |  This example is written to be self-contained and reasonably
    +        |  transparent. To achieve that, it duplicates some of spaCy's internal
    +        |  functionality.
    +
    +    +github("spacy", "examples/training/train_ner_standalone.py")
    +
    +    +h(3, "textcat") Training spaCy's text classifier
    +        +tag-new(2)
    +
    +    p
    +        |  This example shows how to use and train spaCy's new
    +        |  #[+api("textcategorizer") #[code TextCategorizer]] pipeline component
    +        |  on IMDB movie reviews.
    +
    +    +github("spacy", "examples/training/train_textcat.py")
    +
    ++section("deep-learning")
    +    +h(3, "keras") Text classification with Keras
    +
    +    p
    +        |  In this example, we're using spaCy to pre-process text for use with
    +        |  a #[+a("https://keras.io") Keras] text classification model.
    +
    +    +github("spacy", "examples/deep_learning_keras.py")
    +
    +    +h(3, "keras-parikh-entailment") A decomposable attention model for Natural Language Inference
    +
    +    p
    +        |  This example contains an implementation of the entailment prediction
    +        |  model described by #[+a("https://arxiv.org/pdf/1606.01933.pdf") Parikh et al. (2016)].
    +        |  The model is notable for its competitive performance with very few
    +        |  parameters, and was implemented using #[+a("https://keras.io") Keras]
    +        |  and spaCy.
    +
    +    +github("spacy", "examples/keras_parikh_entailment/__main__.py", "examples/keras_parikh_entailment")
    diff --git a/website/usage/facts-figures.jade b/website/usage/facts-figures.jade
    new file mode 100644
    index 000000000..b6a548121
    --- /dev/null
    +++ b/website/usage/facts-figures.jade
    @@ -0,0 +1,32 @@
    +//- 💫 DOCS > USAGE > FACTS & FIGURES
    +
    +include ../_includes/_mixins
    +
    ++section("comparison")
    +    +h(2, "comparison") Feature comparison
    +    include _facts-figures/_feature-comparison
    +
    ++section("benchmarks")
    +    +h(2, "benchmarks") Benchmarks
    +    include _facts-figures/_benchmarks
    +
    +
    ++section("powered-by")
    +    +h(2, "powered-by") Powered by spaCy
    +
    +    p
    +        |  Here's an overview of other tools and libraries that are using spaCy
    +        |  behind the scenes.
    +
    +    +grid
    +        +card("torchtext", "https://github.com/pytorch/text", "PyTorch", "github")
    +            |  PyTorch's NLP datasets and loaders use spaCy for pre-processing
    +            |  and tokenization.
    +
    +        +card("allennlp", "https://github.com/allenai/allennlp", "Allen Institute for Artificial Intelligence", "github")
    +            |  The open-source NLP research library based on PyTorch uses spaCy
    +            |  for pre-processing and tokenization.
    +
    ++section("other-libraries")
    +    +h(2, "other-libraries") spaCy and other libraries
    +    include _facts-figures/_other-libraries
    diff --git a/website/usage/index.jade b/website/usage/index.jade
    new file mode 100644
    index 000000000..495a9863b
    --- /dev/null
    +++ b/website/usage/index.jade
    @@ -0,0 +1,27 @@
    +//- 💫 DOCS > USAGE
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  spaCy is compatible with #[strong 64-bit CPython 2.6+∕3.3+] and
    +    |  runs on #[strong Unix/Linux], #[strong macOS/OS X] and
    +    |  #[strong Windows]. The latest spaCy releases are
    +    |  available over #[+a("https://pypi.python.org/pypi/spacy") pip] (source
    +    |  packages only) and #[+a("https://anaconda.org/conda-forge/spacy") conda].
    +    |  Installation requires a working build environment. See notes on
    +    |  #[a(href="#source-ubuntu") Ubuntu], #[a(href="#source-osx") macOS/OS X]
    +    |  and #[a(href="#source-windows") Windows] for details.
    +
    ++section("quickstart")
    +    include _install/_quickstart
    +
    ++section("instructions")
    +    +h(2, "installation") Installation instructions
    +    include _install/_instructions
    +
    ++section("troubleshooting")
    +    +h(2, "troubleshooting") Troubleshooting guide
    +    include _install/_troubleshooting
    +
    ++section("changelog")
    +    include _install/_changelog
    diff --git a/website/usage/linguistic-features.jade b/website/usage/linguistic-features.jade
    new file mode 100644
    index 000000000..ef8783471
    --- /dev/null
    +++ b/website/usage/linguistic-features.jade
    @@ -0,0 +1,38 @@
    +//- 💫 DOCS > USAGE > LINGUISTIC FEATURES
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  Processing raw text intelligently is difficult: most words are rare, and
    +    |  it's common for words that look completely different to mean almost the
    +    |  same thing. The same words in a different order can mean something
    +    |  completely different. Even splitting text into useful word-like units can
    +    |  be difficult in many languages. While it's possible to solve some
    +    |  problems starting from only the raw characters, it's usually better to
    +    |  use linguistic knowledge to add useful information. That's exactly what
    +    |  spaCy is designed to do: you put in raw text, and get back a
    +    |  #[+api("doc") #[code Doc]] object, that comes with a variety of
    +    |  annotations.
    +
    ++section("pos-tagging")
    +    +h(2, "pos-tagging") Part-of-speech tagging
    +        +tag-model("tagger", "dependency parse")
    +    include _linguistic-features/_pos-tagging
    +
    ++section("dependency-parse")
    +    +h(2, "dependency-parse") Dependency parsing
    +        +tag-model("dependency parse")
    +    include _linguistic-features/_dependency-parse
    +
    ++section("named-entities")
    +    +h(2, "named-entities") Named Entities
    +        +tag-model("named entities")
    +    include _linguistic-features/_named-entities
    +
    ++section("tokenization")
    +    +h(2, "tokenization") Tokenization
    +    include _linguistic-features/_tokenization
    +
    ++section("rule-based-matching")
    +    +h(2, "rule-based-matching") Rule-based matching
    +    include _linguistic-features/_rule-based-matching
    diff --git a/website/usage/models.jade b/website/usage/models.jade
    new file mode 100644
    index 000000000..11a0901f4
    --- /dev/null
    +++ b/website/usage/models.jade
    @@ -0,0 +1,37 @@
    +//- 💫 DOCS > USAGE > MODELS
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  As of v1.7.0, models for spaCy can be installed as #[strong Python packages].
    +    |  This means that they're a component of your application, just like any
    +    |  other module. They're versioned and can be defined as a dependency in your
    +    |  #[code requirements.txt]. Models can be installed from a download URL or
    +    |  a local directory, manually or via #[+a("https://pypi.python.org/pypi/pip") pip].
    +    |  Their data can be located anywhere on your file system.
    +
    ++aside("Important note")
    +    |  If you're upgrading to spaCy v1.7.x or v2.x, you need to
    +    |  #[strong download the new models]. If you've trained statistical models
    +    |  that use spaCy's annotations, you should #[strong retrain your models]
    +    |  after updating spaCy. If you don't retrain, you may suffer train/test
    +    |  skew, which might decrease your accuracy.
    +
    ++section("quickstart")
    +    include _models/_quickstart
    +
    ++section("available")
    +    +h(2, "available") Available models
    +    include _models/_available-models
    +
    ++section("install")
    +    +h(2, "download") Installing and using models
    +    include _models/_install
    +
    ++section("languages")
    +    +h(2, "languages") Language support
    +    include _models/_languages
    +
    ++section("production")
    +    +h(2, "production") Using models in production
    +    include _models/_production
    diff --git a/website/usage/processing-pipelines.jade b/website/usage/processing-pipelines.jade
    new file mode 100644
    index 000000000..0bb96780e
    --- /dev/null
    +++ b/website/usage/processing-pipelines.jade
    @@ -0,0 +1,25 @@
    +//- 💫 DOCS > USAGE > PIPELINE
    +
    +include ../_includes/_mixins
    +
    +include _spacy-101/_pipelines
    +
    ++section("pipelines")
    +    +h(2, "pipelines") How pipelines work
    +    include _processing-pipelines/_pipelines
    +
    ++section("examples")
    +    +h(2, "examples") Examples
    +    include _processing-pipelines/_examples
    +
    ++section("multithreading")
    +    +h(2, "multithreading") Multi-threading
    +    include _processing-pipelines/_multithreading
    +
    ++section("user-hooks")
    +    +h(2, "user-hooks") User hooks
    +    include _processing-pipelines/_user-hooks
    +
    ++section("serialization")
    +    +h(2, "serialization") Serialization
    +    include _processing-pipelines/_serialization
    diff --git a/website/usage/resources.jade b/website/usage/resources.jade
    new file mode 100644
    index 000000000..33a2a45aa
    --- /dev/null
    +++ b/website/usage/resources.jade
    @@ -0,0 +1,125 @@
    +//- 💫 DOCS > USAGE > RESOURCES
    +
    +include ../_includes/_mixins
    +
    ++aside("Contribute to this page")
    +    |  Have you built something cool with spaCy or come across a paper, book or
    +    |  course that should be featured here?
    +    |  #[a(href="mailto:#{EMAIL}") Let us know!]
    +
    ++section("libraries")
    +    +h(2, "libraries") Third-party libraries
    +
    +    +grid
    +        +card("neuralcoref", "https://github.com/huggingface/neuralcoref", "Hugging Face", "github")
    +            |  State-of-the-art coreference resolution based on neural nets
    +            |  and spaCy
    +
    +        +card("rasa_nlu", "https://github.com/golastmile/rasa_nlu", "LastMile", "github")
    +            |  High level APIs for building your own language parser using
    +            |  existing NLP and ML libraries.
    +
    +        +card("textacy", "https://github.com/chartbeat-labs/textacy", "Burton DeWilde", "github")
    +            |  Higher-level NLP built on spaCy.
    +
    +        +card("spacyr", "https://github.com/kbenoit/spacyr", "Kenneth Benoit", "github")
    +            |  An R wrapper for spaCy.
    +
    +        +card("spacy_api", "https://github.com/kootenpv/spacy_api", "Pascal van Kooten", "github")
    +            |  Server/client to load models in a separate, dedicated process.
    +
    +        +card("spacy-api-docker", "https://github.com/jgontrum/spacy-api-docker", "Johannes Gontrum", "github")
    +            |  spaCy accessed by a REST API, wrapped in a Docker container.
    +
    +        +card("spacy-nlp-zeromq", "https://github.com/pasupulaphani/spacy-nlp-docker", "Phaninder Pasupula", "github")
    +            |  Docker image exposing spaCy with ZeroMQ bindings.
    +
    +        +card("spacy-nlp", "https://github.com/kengz/spacy-nlp", "Wah Loon Keng", "github")
    +            |  Expose spaCy NLP text parsing to Node.js (and other languages)
    +            |  via Socket.IO.
    +
    +    .u-text-right
    +        +button("https://github.com/search?o=desc&q=spacy&s=stars&type=Repositories&utf8=%E2%9C%93", false, "primary", "small") See more projects on GitHub
    +
    ++section("demos")
    +    +h(2, "demos") Demos & Visualizations
    +
    +    +grid
    +        +card("Neural coref", "https://huggingface.co/coref/", "Hugging Face")
    +            +image("/assets/img/resources/neuralcoref.jpg").o-block-small
    +            |  State-of-the-art coreference resolution based on neural nets
    +            |  and spaCy.
    +
    +        +card("sense2vec", "https://demos.explosion.ai/sense2vec", "Matthew Honnibal and Ines Montani")
    +            +image("/assets/img/resources/sense2vec.jpg").o-block-small
    +            |  Semantic analysis of the Reddit hivemind using sense2vec and spaCy.
    +
    +        +card("displaCy", "https://demos.explosion.ai/displacy", "Ines Montani")
    +            +image("/assets/img/resources/displacy.jpg").o-block-small
    +            |  An open-source NLP visualiser for the modern web.
    +
    +        +card("displaCy ENT", "https://demos.explosion.ai/displacy-ent", "Ines Montani")
    +            +image("/assets/img/resources/displacy-ent.jpg").o-block-small
    +            |  An open-source named entity visualiser for the modern web.
    +
    ++section("books")
    +    +h(2, "books") Books & Courses
    +
    +    +grid
    +        +card("Natural Language Processing Fundamentals in Python", "https://www.datacamp.com/courses/natural-language-processing-fundamentals-in-python", "Katharine Jarmul (Datacamp, 2017)", "course")
    +            |  An interactive online course on everything you need to know about
    +            |  Natural Language Processing in Python, featuring spaCy and NLTK.
    +
    +        +card("Introduction to Machine Learning with Python: A Guide for Data Scientists", "https://books.google.com/books?id=vbQlDQAAQBAJ", "Andreas C. Müller and Sarah Guido (O'Reilly, 2016)", "book")
    +            |  Andreas is a lead developer of Scikit-Learn, and Sarah is a lead
    +            |  data scientist at Mashable. We're proud to get a mention.
    +
    +        +card("Text Analytics with Python", "https://www.amazon.com/Text-Analytics-Python-Real-World-Actionable/dp/148422387X", "Dipanjan Sarkar (Apress / Springer, 2016)", "book")
    +            |  A Practical Real-World Approach to Gaining Actionable Insights
    +            |  from your Data
    +
    ++section("notebooks")
    +    +h(2, "notebooks") Jupyter notebooks
    +
    +    +grid
    +        +card("Modern NLP in Python", gh("spacy-notebooks", "notebooks/conference_notebooks/modern_nlp_in_python.ipynb"), "Patrick Harrison", "jupyter")
    +            |  Introduction to NLP in Python using spaCy and Gensim. Presented
    +            |  at PyData DC 2016.
    +
    +        +card("Advanced Text Analysis", gh("spacy-notebooks", "notebooks/conference_notebooks/advanced_text_analysis.ipynb"), "Jonathan Reeve", "jupyter")
    +            |  Advanced Text Analysis with spaCy and Scikit-Learn. Presented at
    +            |  NYU during NYCDH Week 2017.
    +
    +    .u-text-right
    +        +button(gh("spacy-notebooks"), false, "primary", "small") See more notebooks on GitHub
    +
    ++section("research")
    +    +h(2, "research") Research systems
    +
    +    p Researchers are using spaCy to build ambitious, next-generation text processing technologies. spaCy is particularly popular amongst the biomedical NLP community, who are working on extracting knowledge from the huge volume of literature in their field.
    +
    +    +grid
    +        +card(false, "https://www.semanticscholar.org/paper/Choosing-an-NLP-Library-for-Analyzing-Software-Doc-Omran-Treude/72f280e47e91b30af24205fa24d53247605aa591", "Fouad Nasser A. Al Omran et al. (2017)", "book", "third")
    +            |  Choosing an NLP Library for Analyzing Software Documentation: A
    +            |  Systematic Literature Review and a Series of Experiments
    +
    +        +card(false, "https://www.semanticscholar.org/paper/Mixing-Dirichlet-Topic-Models-and-Word-Embeddings-Moody/bf8116e06f7b498c6abfbf97aeb67d0838c08609", "Christopher E. Moody (2016)", "book", "third")
    +            |  Mixing Dirichlet Topic Models and Word Embeddings to Make lda2vec
    +
    +        +card(false, "https://www.semanticscholar.org/paper/Refactoring-the-Genia-Event-Extraction-Shared-Task-Kim-Wang/06d94b64a7bd2d3433f57caddad5084435d6a91f", "Jin-Dong Kim et al. (2016)", "book", "third")
    +            |  Refactoring the Genia Event Extraction Shared Task Toward a
    +            |  General Framework for IE-Driven KB Development
    +
    +        +card(false, "https://www.semanticscholar.org/paper/Predicting-Pre-click-Quality-for-Native-Zhou-Redi/564985430ff2fbc3a9daa9c2af8997b7f5046da8", "Ke Zhou et al. (2016)", "book", "third")
    +            |  Predicting Pre-click Quality for Native Advertisements
    +
    +        +card(false, "https://www.semanticscholar.org/paper/Threat-detection-in-online-discussions-Wester-%C3%98vrelid/f4150e2fb4d8646ebc2ea84f1a86afa1b593239b", "Aksel Wester et al. (2016)", "book", "third")
    +            |  Threat detection in online discussions
    +
    +        +card(false, "https://www.semanticscholar.org/paper/Distributional-semantics-for-understanding-spoken-Korpusik-Huang/5f55c5535e80d3e5ed7f1f0b89531e32725faff5", "Mandy Korpusik et al. (2016)", "book", "third")
    +            |  Distributional semantics for understanding spoken meal
    +            |  descriptions
    +
    +    .u-text-right
    +        +button("https://scholar.google.com/scholar?scisbd=2&q=spacy&hl=en&as_sdt=1,5&as_vis=1", false, "primary", "small")
    +            |  See 200+ papers on Google Scholar
    diff --git a/website/usage/spacy-101.jade b/website/usage/spacy-101.jade
    new file mode 100644
    index 000000000..3b75202f7
    --- /dev/null
    +++ b/website/usage/spacy-101.jade
    @@ -0,0 +1,300 @@
    +//- 💫 DOCS > USAGE > SPACY 101
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  Whether you're new to spaCy, or just want to brush up on some
    +    |  NLP basics and implementation details – this page should have you covered.
    +    |  Each section will explain one of spaCy's features in simple terms and
    +    |  with examples or illustrations. Some sections will also reappear across
    +    |  the usage guides as a quick introduction.
    +
    ++aside("Help us improve the docs")
    +    |  Did you spot a mistake or come across explanations that
    +    |  are unclear? We always appreciate improvement
    +    |  #[+a(gh("spaCy") + "/issues") suggestions] or
    +    |  #[+a(gh("spaCy") + "/pulls") pull requests]. You can find a "Suggest
    +    |  edits" link at the bottom of each page that points you to the source.
    +
    ++h(2, "whats-spacy") What's spaCy?
    +
    ++grid.o-no-block
    +    +grid-col("half")
    +        p
    +            |  spaCy is a #[strong free, open-source library] for advanced
    +            |  #[strong Natural Language Processing] (NLP) in Python.
    +
    +        p
    +            |  If you're working with a lot of text, you'll eventually want to
    +            |  know more about it. For example, what's it about? What do the
    +            |  words mean in context? Who is doing what to whom? What companies
    +            |  and products are mentioned? Which texts are similar to each other?
    +
    +        p
    +            |  spaCy is designed specifically for #[strong production use] and
    +            |  helps you build applications that process and "understand"
    +            |  large volumes of text. It can be used to build
    +            |  #[strong information extraction] or
    +            |  #[strong natural language understanding] systems, or to
    +            |  pre-process text for #[strong deep learning].
    +
    +    +table-of-contents
    +        +item #[+a("#features") Features]
    +        +item #[+a("#annotations") Linguistic annotations]
    +        +item #[+a("#annotations-token") Tokenization]
    +        +item #[+a("#annotations-pos-deps") POS tags and dependencies]
    +        +item #[+a("#annotations-ner") Named entities]
    +        +item #[+a("#vectors-similarity") Word vectors and similarity]
    +        +item #[+a("#pipelines") Pipelines]
    +        +item #[+a("#vocab") Vocab, hashes and lexemes]
    +        +item #[+a("#serialization") Serialization]
    +        +item #[+a("#training") Training]
    +        +item #[+a("#language-data") Language data]
    +        +item #[+a("#lightning-tour") Lightning tour]
    +        +item #[+a("#architecture") Architecture]
    +        +item #[+a("#community") Community & FAQ]
    +
    ++h(3, "what-spacy-isnt") What spaCy isn't
    +
    ++list
    +    +item #[strong spaCy is not a platform or "an API"].
    +        |  Unlike a platform, spaCy does not provide a software as a service, or
    +        |  a web application. It's an open-source library designed to help you
    +        |  build NLP applications, not a consumable service.
    +    +item #[strong spaCy is not an out-of-the-box chat bot engine].
    +        |  While spaCy can be used to power conversational applications, it's
    +        |  not designed specifically for chat bots, and only provides the
    +        |  underlying text processing capabilities.
    +    +item #[strong spaCy is not research software].
    +        |  It's built on the latest research, but it's designed to get
    +        |  things done. This leads to fairly different design decisions than
    +        |  #[+a("https://github./nltk/nltk") NLTK]
    +        |  or #[+a("https://stanfordnlp.github.io/CoreNLP/") CoreNLP], which were
    +        |  created as platforms for teaching and research. The main difference
    +        |  is that spaCy is integrated and opinionated. spaCy tries to avoid asking
    +        |  the user to choose between multiple algorithms that deliver equivalent
    +        |  functionality. Keeping the menu small lets spaCy deliver generally better
    +        |  performance and developer experience.
    +    +item #[strong spaCy is not a company].
    +        |  It's an open-source library. Our company publishing spaCy and other
    +        |  software is called #[+a(COMPANY_URL, true) Explosion AI].
    +
    ++section("features")
    +    +h(2, "features") Features
    +
    +    p
    +        |  In the documentation, you'll come across mentions of spaCy's
    +        |  features and capabilities. Some of them refer to linguistic concepts,
    +        |  while others are related to more general machine learning
    +        |  functionality.
    +
    +    +aside
    +        |  If one of spaCy's functionalities #[strong needs a model], it means
    +        |  that you need to have one of the available
    +        |  #[+a("/models") statistical models] installed. Models are used
    +        |  to #[strong predict] linguistic annotations – for example, if a word
    +        |  is a verb or a noun.
    +
    +    +table(["Name", "Description", "Needs model"])
    +        +row
    +            +cell #[strong Tokenization]
    +            +cell Segmenting text into words, punctuations marks etc.
    +            +cell #[+procon("con")]
    +
    +        +row
    +            +cell #[strong Part-of-speech] (POS) #[strong Tagging]
    +            +cell Assigning word types to tokens, like verb or noun.
    +            +cell #[+procon("pro")]
    +
    +        +row
    +            +cell #[strong Dependency Parsing]
    +            +cell
    +                |  Assigning syntactic dependency labels, describing the
    +                |  relations between individual tokens, like subject or object.
    +            +cell #[+procon("pro")]
    +
    +        +row
    +            +cell #[strong Lemmatization]
    +            +cell
    +                |  Assigning the base forms of words. For example, the lemma of
    +                |  "was" is "be", and the lemma of "rats" is "rat".
    +            +cell #[+procon("pro")]
    +
    +        +row
    +            +cell #[strong Sentence Boundary Detection] (SBD)
    +            +cell Finding and segmenting individual sentences.
    +            +cell #[+procon("pro")]
    +
    +        +row
    +            +cell #[strong Named Entity Recongition] (NER)
    +            +cell
    +                |  Labelling named "real-world" objects, like persons, companies
    +                |  or locations.
    +            +cell #[+procon("pro")]
    +
    +        +row
    +            +cell #[strong Similarity]
    +            +cell
    +                |  Comparing words, text spans and documents and how similar
    +                |  they are to each other.
    +            +cell #[+procon("pro")]
    +
    +        +row
    +            +cell #[strong Text Classification]
    +            +cell
    +                |  Assigning categories or labels to a whole document, or parts
    +                |  of a document.
    +            +cell #[+procon("pro")]
    +
    +        +row
    +            +cell #[strong Rule-based Matching]
    +            +cell
    +                |  Finding sequences of tokens based on their texts and
    +                |  linguistic annotations, similar to regular expressions.
    +            +cell #[+procon("con")]
    +
    +        +row
    +            +cell #[strong Training]
    +            +cell Updating and improving a statistical model's predictions.
    +            +cell #[+procon("neutral")]
    +
    +        +row
    +            +cell #[strong Serialization]
    +            +cell Saving objects to files or byte strings.
    +            +cell #[+procon("neutral")]
    +
    +    +h(2, "annotations") Linguistic annotations
    +
    +    p
    +        |  spaCy provides a variety of linguistic annotations to give you
    +        |  #[strong insights into a text's grammatical structure]. This
    +        |  includes the word types, like the parts of speech, and how the words
    +        |  are related to each other. For example, if you're analysing text, it
    +        |  makes a huge difference whether a noun is the subject of a sentence,
    +        |  or the object – or whether "google" is used as a verb, or refers to
    +        |  the website or company in a specific context.
    +
    +    p
    +        |  Once you've downloaded and installed a #[+a("/usage/models") model],
    +        |  you can load it via #[+api("spacy#load") #[code spacy.load()]]. This will
    +        |  return a #[code Language] object contaning all components and data needed
    +        |  to process text. We usually call it #[code nlp]. Calling the #[code nlp]
    +        |  object on a string of text will return a processed #[code Doc]:
    +
    +    +code.
    +        import spacy
    +
    +        nlp = spacy.load('en')
    +        doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion')
    +
    +    p
    +        |  Even though a #[code Doc] is processed – e.g. split into individual words
    +        |  and annotated – it still holds #[strong all information of the original text],
    +        |  like whitespace characters. You can always get the offset of a token into the
    +        |  original string, or reconstruct the original by joining the tokens and their
    +        |  trailing whitespace. This way, you'll never lose any information
    +        |  when processing text with spaCy.
    +
    +    +h(3, "annotations-token") Tokenization
    +
    +    include _spacy-101/_tokenization
    +
    +    +infobox
    +        |  To learn more about how spaCy's tokenization rules work in detail,
    +        |  how to #[strong customise and replace] the default tokenizer and how to
    +        |  #[strong add language-specific data], see the usage guides on
    +        |  #[+a("/usage/adding-languages") adding languages] and
    +        |  #[+a("/usage/linguistic-features#tokenization") customising the tokenizer].
    +
    +    +h(3, "annotations-pos-deps") Part-of-speech tags and dependencies
    +        +tag-model("dependency parse")
    +
    +    include _spacy-101/_pos-deps
    +
    +    +infobox
    +        |  To learn more about #[strong part-of-speech tagging] and rule-based
    +        |  morphology, and how to #[strong navigate and use the parse tree]
    +        |  effectively, see the usage guides on
    +        |  #[+a("/usage/linguistic-features#pos-tagging") part-of-speech tagging] and
    +        |  #[+a("/usage/linguistic-features#dependency-parse") using the dependency parse].
    +
    +    +h(3, "annotations-ner") Named Entities
    +        +tag-model("named entities")
    +
    +    include _spacy-101/_named-entities
    +
    +    +infobox
    +        |  To learn more about entity recognition in spaCy, how to
    +        |  #[strong add your own entities] to a document and how to
    +        |  #[strong train and update] the entity predictions of a model, see the
    +        |  usage guides on
    +        |  #[+a("/usage/linguistic-features#named-entities") named entity recognition] and
    +        |  #[+a("/usage/training#ner") training the named entity recognizer].
    +
    +    +h(2, "vectors-similarity") Word vectors and similarity
    +        +tag-model("vectors")
    +
    +    include _spacy-101/_similarity
    +
    +    include _spacy-101/_word-vectors
    +
    +    +infobox
    +        |  To learn more about word vectors, how to #[strong customise them] and
    +        |  how to load #[strong your own vectors] into spaCy, see the usage
    +        |  guide on
    +        |  #[+a("/usage/vectors-similarity") using word vectors and semantic similarities].
    +
    +    +h(2, "pipelines") Pipelines
    +
    +    include _spacy-101/_pipelines
    +
    +    +infobox
    +        |  To learn more about #[strong how processing pipelines work] in detail,
    +        |  how to enable and disable their components, and how to
    +        |  #[strong create your own], see the usage guide on
    +        |  #[+a("/usage/processing-pipelines") language processing pipelines].
    +
    +    +h(2, "vocab") Vocab, hashes and lexemes
    +
    +    include _spacy-101/_vocab
    +
    +    +h(2, "serialization") Serialization
    +
    +    include _spacy-101/_serialization
    +
    +    +infobox
    +        |  To learn more about how to #[strong save and load your own models],
    +        |  see the usage guide on
    +        |  #[+a("/usage/training#saving-loading") saving and loading].
    +
    +    +h(2, "training") Training
    +
    +    include _spacy-101/_training
    +
    +    +infobox
    +        |  To learn more about #[strong training and updating] models, how to create
    +        |  training data and how to improve spaCy's named entity recognition models,
    +        |  see the usage guides on #[+a("/usage/training") training].
    +
    +    +h(2, "language-data") Language data
    +
    +    include _spacy-101/_language-data
    +
    +    +infobox
    +        |  To learn more about the individual components of the language data and
    +        |  how to #[strong add a new language] to spaCy in preparation for training
    +        |  a language model, see the usage guide on
    +        |  #[+a("/usage/adding-languages") adding languages].
    +
    +
    ++section("lightning-tour")
    +    +h(2, "lightning-tour") Lightning tour
    +    include _spacy-101/_lightning-tour
    +
    ++section("architecture")
    +    +h(2, "architecture") Architecture
    +    include _spacy-101/_architecture
    +
    ++section("community-faq")
    +    +h(2, "community") Community & FAQ
    +    include _spacy-101/_community-faq
    diff --git a/website/usage/text-classification.jade b/website/usage/text-classification.jade
    new file mode 100644
    index 000000000..8a0e93450
    --- /dev/null
    +++ b/website/usage/text-classification.jade
    @@ -0,0 +1,9 @@
    +//- 💫 DOCS > USAGE > TEXT CLASSIFICATION
    +
    +include ../_includes/_mixins
    +
    ++under-construction
    +
    ++h(2, "example") Example
    +
    ++github("spacy", "examples/training/train_textcat.py")
    diff --git a/website/usage/training.jade b/website/usage/training.jade
    new file mode 100644
    index 000000000..8f15668c4
    --- /dev/null
    +++ b/website/usage/training.jade
    @@ -0,0 +1,33 @@
    +//- 💫 DOCS > USAGE > TRAINING
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  This guide describes how to train new statistical models for spaCy's
    +    |  part-of-speech tagger, named entity recognizer and dependency parser.
    +    |  Once the model is trained, you can then
    +    |  #[+a("/usage/models#saving-loading") save and load] it.
    +
    ++section("basics")
    +    +h(2, "basics") Training basics
    +    include _training/_basics
    +
    ++section("ner")
    +    +h(2, "ner") Training the named entity recognizer
    +    include _training/_ner
    +
    ++section("tagger-parser")
    +    +h(2, "tagger-parser") Training the tagger and parser
    +    include _training/_tagger-parser
    +
    ++section("similarity")
    +    +h(2, "similarity") Training a similarity model
    +    include _training/_similarity
    +
    ++section("textcat")
    +    +h(2, "textcat") Training a text classification model
    +    include _training/_textcat
    +
    ++section("saving-loading")
    +    +h(2, "saving-loading") Saving and loading models
    +    include _training/_saving-loading
    diff --git a/website/usage/v2.jade b/website/usage/v2.jade
    new file mode 100644
    index 000000000..8737c0b76
    --- /dev/null
    +++ b/website/usage/v2.jade
    @@ -0,0 +1,520 @@
    +//- 💫 DOCS > USAGE > WHAT'S NEW IN V2.0
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  We're very excited to finally introduce spaCy v2.0! On this page, you'll
    +    |  find a summary of the new features, information on the backwards
    +    |  incompatibilities, including a handy overview of what's been renamed or
    +    |  deprecated. To help you make the most of v2.0, we also
    +    |  #[strong re-wrote almost all of the usage guides and API docs], and added
    +    |  more real-world examples. If you're new to spaCy, or just want to brush
    +    |  up on some NLP basics and the details of the library, check out
    +    |  the #[+a("/usage/spacy-101") spaCy 101 guide] that explains the most
    +    |  important concepts with examples and illustrations.
    +
    ++h(2, "summary") Summary
    +
    ++grid.o-no-block
    +    +grid-col("half")
    +
    +        p This release features
    +            |  entirely new #[strong deep learning-powered models] for spaCy's tagger,
    +            |  parser and entity recognizer. The new models are #[strong 20x smaller]
    +            |  than the linear models that have powered spaCy until now: from 300 MB to
    +            |  only 15 MB.
    +
    +        p
    +            |  We've also made several usability improvements that are
    +            |  particularly helpful for #[strong production deployments]. spaCy
    +            |  v2 now fully supports the Pickle protocol, making it easy to use
    +            |  spaCy with #[+a("https://spark.apache.org/") Apache Spark]. The
    +            |  string-to-integer mapping is #[strong no longer stateful], making
    +            |  it easy to reconcile annotations made in different processes.
    +            |  Models are smaller and use less memory, and the APIs for serialization
    +            |  are now much more consistent.
    +
    +    +table-of-contents
    +        +item #[+a("#summary") Summary]
    +        +item #[+a("#features") New features]
    +        +item #[+a("#features-models") Neural network models]
    +        +item #[+a("#features-pipelines") Improved processing pipelines]
    +        +item #[+a("#features-text-classification") Text classification]
    +        +item #[+a("#features-hash-ids") Hash values instead of integer IDs]
    +        +item #[+a("#features-serializer") Saving, loading and serialization]
    +        +item #[+a("#features-displacy") displaCy visualizer]
    +        +item #[+a("#features-language") Language data and lazy loading]
    +        +item #[+a("#features-matcher") Revised matcher API and phrase matcher]
    +        +item #[+a("#incompat") Backwards incompatibilities]
    +        +item #[+a("#migrating") Migrating from spaCy v1.x]
    +        +item #[+a("#benchmarks") Benchmarks]
    +
    +p
    +    |  The main usability improvements you'll notice in spaCy v2.0 are around
    +    |  #[strong defining, training and loading your own models] and components.
    +    |  The new neural network models make it much easier to train a model from
    +    |  scratch, or update an existing model with a few examples. In v1.x, the
    +    |  statistical models depended on the state of the #[code Vocab]. If you
    +    |  taught the model a new word, you would have to save and load a lot of
    +    |  data — otherwise the model wouldn't correctly recall the features of your
    +    |  new example. That's no longer the case.
    +
    +p
    +    |  Due to some clever use of hashing, the statistical models
    +    |  #[strong never change size], even as they learn new vocabulary items.
    +    |  The whole pipeline is also now fully differentiable. Even if you don't
    +    |  have explicitly annotated data, you can update spaCy using all the
    +    |  #[strong latest deep learning tricks] like adversarial training, noise
    +    |  contrastive estimation or reinforcement learning.
    +
    ++section("features")
    +    +h(2, "features") New features
    +
    +    p
    +        |  This section contains an overview of the most important
    +        |  #[strong new features and improvements]. The #[+a("/api") API docs]
    +        |  include additional  deprecation notes. New methods and functions that
    +        |  were introduced in this version are marked with a #[+tag-new(2)] tag.
    +
    +    +h(3, "features-models") Convolutional neural network models
    +
    +    +aside-code("Example", "bash").
    +        spacy download en # default English model
    +        spacy download de # default German model
    +        spacy download fr # default French model
    +        spacy download es # default Spanish model
    +        spacy download xx_ent_wiki_sm # multi-language NER
    +
    +    p
    +        |  spaCy v2.0 features new neural models for tagging,
    +        |  parsing and entity recognition. The models have
    +        |  been designed and implemented from scratch specifically for spaCy, to
    +        |  give you an unmatched balance of speed, size and accuracy. The new
    +        |  models are #[strong 10× smaller], #[strong 20% more accurate],
    +        |  and #[strong just as fast] as the previous generation.
    +        |  #[strong GPU usage] is now supported via
    +        |  #[+a("http://chainer.org") Chainer]'s CuPy module.
    +
    +    +infobox
    +        |  #[+label-inline Usage:] #[+a("/models") Models directory],
    +        |  #[+a("/usage/#gpu") Using spaCy with GPU]
    +
    +    +h(3, "features-pipelines") Improved processing pipelines
    +
    +    +aside-code("Example").
    +        # Modify an existing pipeline
    +        nlp = spacy.load('en')
    +        nlp.pipeline.append(my_component)
    +
    +        # Register a factory to create a component
    +        spacy.set_factory('my_factory', my_factory)
    +        nlp = Language(pipeline=['my_factory', mycomponent])
    +
    +    p
    +        |  It's now much easier to #[strong customise the pipeline] with your own
    +        |  components, functions that receive a #[code Doc] object, modify and
    +        |  return it. If your component is stateful, you can define and register a
    +        |  factory which receives the shared #[code Vocab] object and returns a
    +        |  component. spaCy's default components can be added to your pipeline by
    +        |  using their string IDs. This way, you won't have to worry about finding
    +        |  and implementing them – simply add #[code "tagger"] to the pipeline,
    +        |  and spaCy will know what to do.
    +
    +    +image
    +        include ../assets/img/pipeline.svg
    +
    +    +infobox
    +        |  #[+label-inline API:] #[+api("language") #[code Language]]
    +        |  #[+label-inline Usage:] #[+a("/usage/language-processing-pipeline") Processing text]
    +
    +    +h(3, "features-text-classification") Text classification
    +
    +    +aside-code("Example").
    +        from spacy.lang.en import English
    +        nlp = English(pipeline=['tensorizer', 'tagger', 'textcat'])
    +
    +    p
    +        |  spaCy v2.0 lets you add text categorization models to spaCy pipelines.
    +        |  The model supports classification with multiple, non-mutually exclusive
    +        |  labels – so multiple labels can apply at once. You can change the model
    +        |  architecture rather easily, but by default, the #[code TextCategorizer]
    +        |  class uses a convolutional neural network to assign position-sensitive
    +        |  vectors to each word in the document.
    +
    +    +infobox
    +        |  #[+label-inline API:] #[+api("textcategorizer") #[code TextCategorizer]],
    +        |  #[+api("doc#attributes") #[code Doc.cats]],
    +        |  #[+api("goldparse#attributes") #[code GoldParse.cats]]#[br]
    +        |  #[+label-inline Usage:] #[+a("/usage/text-classification") Text classification]
    +
    +    +h(3, "features-hash-ids") Hash values instead of integer IDs
    +
    +    +aside-code("Example").
    +        doc = nlp(u'I love coffee')
    +        assert doc.vocab.strings[u'coffee'] == 3197928453018144401
    +        assert doc.vocab.strings[3197928453018144401] == u'coffee'
    +
    +        beer_hash = doc.vocab.strings.add(u'beer')
    +        assert doc.vocab.strings[u'beer'] == beer_hash
    +        assert doc.vocab.strings[beer_hash] == u'beer'
    +
    +    p
    +        |  The #[+api("stringstore") #[code StringStore]] now resolves all strings
    +        |  to hash values instead of integer IDs. This means that the string-to-int
    +        |  mapping #[strong no longer depends on the vocabulary state], making a lot
    +        |  of workflows much simpler, especially during training. Unlike integer IDs
    +        |  in spaCy v1.x, hash values will #[strong always match] – even across
    +        |  models. Strings can now be added explicitly using the new
    +        |  #[+api("stringstore#add") #[code Stringstore.add]] method. A token's hash
    +        |  is available via #[code token.orth].
    +
    +    +infobox
    +        |  #[+label-inline API:] #[+api("stringstore") #[code StringStore]]
    +        |  #[+label-inline Usage:] #[+a("/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
    +
    +    +h(3, "features-serializer") Saving, loading and serialization
    +
    +    +aside-code("Example").
    +        nlp = spacy.load('en') # shortcut link
    +        nlp = spacy.load('en_core_web_sm') # package
    +        nlp = spacy.load('/path/to/en') # unicode path
    +        nlp = spacy.load(Path('/path/to/en')) # pathlib Path
    +
    +        nlp.to_disk('/path/to/nlp')
    +        nlp = English().from_disk('/path/to/nlp')
    +
    +    p
    +        |  spay's serialization API has been made consistent across classes and
    +        |  objects. All container classes, i.e. #[code Language], #[code Doc],
    +        |  #[code Vocab] and #[code StringStore] now have a #[code to_bytes()],
    +        |  #[code from_bytes()], #[code to_disk()] and #[code from_disk()] method
    +        |  that supports the Pickle protocol.
    +
    +    p
    +        |  The improved #[code spacy.load] makes loading models easier and more
    +        |  transparent. You can load a model by supplying its
    +        |  #[+a("/usage/models#usage") shortcut link], the name of an installed
    +        |  #[+a("/usage/saving-loading#generating") model package] or a path.
    +        |  The #[code Language] class to initialise will be determined based on the
    +        |  model's settings. For a blank language, you can import the class directly,
    +        |  e.g. #[code from spacy.lang.en import English].
    +
    +    +infobox
    +        |  #[+label-inline API:] #[+api("spacy#load") #[code spacy.load]], #[+api("binder") #[code Binder]]
    +        |  #[+label-inline Usage:] #[+a("/usage/saving-loading") Saving and loading]
    +
    +    +h(3, "features-displacy") displaCy visualizer with Jupyter support
    +
    +    +aside-code("Example").
    +        from spacy import displacy
    +        doc = nlp(u'This is a sentence about Facebook.')
    +        displacy.serve(doc, style='dep') # run the web server
    +        html = displacy.render(doc, style='ent') # generate HTML
    +
    +    p
    +        |  Our popular dependency and named entity visualizers are now an official
    +        |  part of the spaCy library. displaCy can run a simple web server, or
    +        |  generate raw HTML markup or SVG files to be exported. You can pass in one
    +        |  or more docs, and customise the style. displaCy also auto-detects whether
    +        |  you're running #[+a("https://jupyter.org") Jupyter] and will render the
    +        |  visualizations in your notebook.
    +
    +    +infobox
    +        |  #[+label-inline API:] #[+api("displacy") #[code displacy]]
    +        |  #[+label-inline Usage:] #[+a("/usage/visualizers") Visualizing spaCy]
    +
    +    +h(3, "features-language") Improved language data and lazy loading
    +
    +    p
    +        |  Language-specfic data now lives in its own submodule, #[code spacy.lang].
    +        |  Languages are lazy-loaded, i.e. only loaded when you import a
    +        |  #[code Language] class, or load a model that initialises one. This allows
    +        |  languages to contain more custom data, e.g. lemmatizer lookup tables, or
    +        |  complex regular expressions. The language data has also been tidied up
    +        |  and simplified. spaCy now also supports simple lookup-based lemmatization.
    +
    +    +infobox
    +        |  #[+label-inline API:] #[+api("language") #[code Language]]
    +        |  #[+label-inline Code:] #[+src(gh("spaCy", "spacy/lang")) #[code spacy/lang]]
    +        |  #[+label-inline Usage:] #[+a("/usage/adding-languages") Adding languages]
    +
    +    +h(3, "features-matcher") Revised matcher API and phrase matcher
    +
    +    +aside-code("Example").
    +        from spacy.matcher import Matcher, PhraseMatcher
    +
    +        matcher = Matcher(nlp.vocab)
    +        matcher.add('HEARTS', None, [{'ORTH': '❤️', 'OP': '+'}])
    +
    +        phrasematcher = PhraseMatcher(nlp.vocab)
    +        phrasematcher.add('OBAMA', None, nlp(u"Barack Obama"))
    +
    +    p
    +        |  Patterns can now be added to the matcher by calling
    +        |  #[+api("matcher-add") #[code matcher.add()]] with a match ID, an optional
    +        |  callback function to be invoked on each match, and one or more patterns.
    +        |  This allows you to write powerful, pattern-specific logic using only one
    +        |  matcher. For example, you might only want to merge some entity types,
    +        |  and set custom flags for other matched patterns. The new
    +        |  #[+api("phrasematcher") #[code PhraseMatcher]] lets you efficiently
    +        |  match very large terminology lists using #[code Doc] objects as match
    +        |  patterns.
    +
    +    +infobox
    +        |  #[+label-inline API:] #[+api("matcher") #[code Matcher]],
    +        |  #[+api("phrasematcher") #[code PhraseMatcher]]
    +        |  #[+label-inline Usage:] #[+a("/usage/rule-based-matching") Rule-based matching]
    +
    ++section("incompat")
    +    +h(2, "incompat") Backwards incompatibilities
    +
    +    +table(["Old", "New"])
    +        +row
    +            +cell
    +                |  #[code spacy.en]
    +                |  #[code spacy.xx]
    +            +cell
    +                |  #[code spacy.lang.en]
    +                |  #[code spacy.lang.xx]
    +
    +        +row
    +            +cell #[code orth]
    +            +cell #[code lang.xx.lex_attrs]
    +
    +        +row
    +            +cell #[code syntax.iterators]
    +            +cell #[code lang.xx.syntax_iterators]
    +
    +        +row
    +            +cell #[code Language.save_to_directory]
    +            +cell #[+api("language#to_disk") #[code Language.to_disk]]
    +
    +        +row
    +            +cell #[code Language.create_make_doc]
    +            +cell #[+api("language#attributes") #[code Language.tokenizer]]
    +
    +        +row
    +            +cell
    +                |  #[code Vocab.load]
    +                |  #[code Vocab.load_lexemes]
    +            +cell
    +                |  #[+api("vocab#from_disk") #[code Vocab.from_disk]]
    +                |  #[+api("vocab#from_bytes") #[code Vocab.from_bytes]]
    +
    +        +row
    +            +cell
    +                |  #[code Vocab.dump]
    +            +cell
    +                |  #[+api("vocab#to_disk") #[code Vocab.to_disk]]#[br]
    +                |  #[+api("vocab#to_bytes") #[code Vocab.to_bytes]]
    +
    +        +row
    +            +cell
    +                |  #[code Vocab.load_vectors]
    +                |  #[code Vocab.load_vectors_from_bin_loc]
    +            +cell
    +                |  #[+api("vectors#from_disk") #[code Vectors.from_disk]]
    +                |  #[+api("vectors#from_bytes") #[code Vectors.from_bytes]]
    +
    +        +row
    +            +cell
    +                |  #[code Vocab.dump_vectors]
    +            +cell
    +                |  #[+api("vectors#to_disk") #[code Vectors.to_disk]]
    +                |  #[+api("vectors#to_bytes") #[code Vectors.to_bytes]]
    +
    +        +row
    +            +cell
    +                |  #[code StringStore.load]
    +            +cell
    +                |  #[+api("stringstore#from_disk") #[code StringStore.from_disk]]
    +                |  #[+api("stringstore#from_bytes") #[code StringStore.from_bytes]]
    +
    +        +row
    +            +cell
    +                |  #[code StringStore.dump]
    +            +cell
    +                |  #[+api("stringstore#to_disk") #[code StringStore.to_disk]]
    +                |  #[+api("stringstore#to_bytes") #[code StringStore.to_bytes]]
    +
    +        +row
    +            +cell #[code Tokenizer.load]
    +            +cell
    +                |  #[+api("tokenizer#from_disk") #[code Tokenizer.from_disk]]
    +                |  #[+api("tokenizer#from_bytes") #[code Tokenizer.from_bytes]]
    +
    +        +row
    +            +cell #[code Tagger.load]
    +            +cell
    +                |  #[+api("tagger#from_disk") #[code Tagger.from_disk]]
    +                |  #[+api("tagger#from_bytes") #[code Tagger.from_bytes]]
    +
    +        +row
    +            +cell #[code DependencyParser.load]
    +            +cell
    +                |  #[+api("dependencyparser#from_disk") #[code DependencyParser.from_disk]]
    +                |  #[+api("dependencyparser#from_bytes") #[code DependencyParser.from_bytes]]
    +
    +        +row
    +            +cell #[code EntityRecognizer.load]
    +            +cell
    +                |  #[+api("entityrecognizer#from_disk") #[code EntityRecognizer.from_disk]]
    +                |  #[+api("entityrecognizer#from_bytes") #[code EntityRecognizer.from_bytes]]
    +
    +        +row
    +            +cell #[code Matcher.load]
    +            +cell -
    +
    +        +row
    +            +cell
    +                |  #[code Matcher.add_pattern]
    +                |  #[code Matcher.add_entity]
    +            +cell #[+api("matcher#add") #[code Matcher.add]]
    +
    +        +row
    +            +cell #[code Matcher.get_entity]
    +            +cell #[+api("matcher#get") #[code Matcher.get]]
    +
    +        +row
    +            +cell #[code Matcher.has_entity]
    +            +cell #[+api("matcher#contains") #[code Matcher.__contains__]]
    +
    +        +row
    +            +cell #[code Doc.read_bytes]
    +            +cell #[+api("binder") #[code Binder]]
    +
    +        +row
    +            +cell #[code Token.is_ancestor_of]
    +            +cell #[+api("token#is_ancestor") #[code Token.is_ancestor]]
    +
    +        +row
    +            +cell #[code cli.model]
    +            +cell -
    +
    ++section("migrating")
    +    +h(2, "migrating") Migrating from spaCy 1.x
    +
    +    p
    +        |  Because we'e made so many architectural changes to the library, we've
    +        |  tried to #[strong keep breaking changes to a minimum]. A lot of projects
    +        |  follow the philosophy that if you're going to break anything, you may as
    +        |  well break everything. We think migration is easier if there's a logic to
    +        |  what has changed.
    +
    +    p
    +        |  We've therefore followed a policy of avoiding breaking changes to the
    +        |  #[code Doc], #[code Span] and #[code Token] objects. This way, you can
    +        |  focus on only migrating the code that does training, loading and
    +        |  serialization — in other words, code that works with the #[code nlp]
    +        |  object directly. Code that uses the annotations should continue to work.
    +
    +    +infobox("Important note")
    +        |  If you've trained your own models, keep in mind that your train and
    +        |  runtime inputs must match. This means you'll have to
    +        |  #[strong retrain your models] with spaCy v2.0.
    +
    +    +h(3, "migrating-saving-loading") Saving, loading and serialization
    +
    +    p
    +        |  Double-check all calls to #[code spacy.load()] and make sure they don't
    +        |  use the #[code path] keyword argument. If you're only loading in binary
    +        |  data and not a model package that can construct its own #[code Language]
    +        |  class and pipeline, you should now use the
    +        |  #[+api("language#from_disk") #[code Language.from_disk()]] method.
    +
    +    +code-new.
    +        nlp = spacy.load('/model')
    +        nlp = English().from_disk('/model/data')
    +    +code-old nlp = spacy.load('en', path='/model')
    +
    +    p
    +        |  Review all other code that writes state to disk or bytes.
    +        |  All containers, now share the same, consistent API for saving and
    +        |  loading. Replace saving with #[code to_disk()] or #[code to_bytes()], and
    +        |  loading with #[code from_disk()] and #[code from_bytes()].
    +
    +    +code-new.
    +        nlp.to_disk('/model')
    +        nlp.vocab.to_disk('/vocab')
    +
    +    +code-old.
    +        nlp.save_to_directory('/model')
    +        nlp.vocab.dump('/vocab')
    +
    +    p
    +        |  If you've trained models with input from v1.x, you'll need to
    +        |  #[strong retrain them] with spaCy v2.0. All previous models will not
    +        |  be compatible with the new version.
    +
    +    +h(3, "migrating-strings") Strings and hash values
    +
    +    p
    +        |  The change from integer IDs to hash values may not actually affect your
    +        |  code very much. However, if you're adding strings to the vocab manually,
    +        |  you now need to call #[+api("stringstore#add") #[code StringStore.add()]]
    +        |  explicitly. You can also now be sure that the string-to-hash mapping will
    +        |  always match across vocabularies.
    +
    +    +code-new.
    +        nlp.vocab.strings.add(u'coffee')
    +        nlp.vocab.strings[u'coffee']       # 3197928453018144401
    +        other_nlp.vocab.strings[u'coffee'] # 3197928453018144401
    +
    +    +code-old.
    +        nlp.vocab.strings[u'coffee']       # 3672
    +        other_nlp.vocab.strings[u'coffee'] # 40259
    +
    +    +h(3, "migrating-languages") Processing pipelines and language data
    +
    +    p
    +        |  If you're importing language data or #[code Language] classes, make sure
    +        |  to change your import statements to import from #[code spacy.lang]. If
    +        |  you've added your own custom language, it needs to be moved to
    +        |  #[code spacy/lang/xx] and adjusted accordingly.
    +
    +    +code-new from spacy.lang.en import English
    +    +code-old from spacy.en import English
    +
    +    p
    +        |  If you've been using custom pipeline components, check out the new
    +        |  guide on #[+a("/usage/language-processing-pipelines") processing pipelines].
    +        |  Appending functions to the pipeline still works – but you might be able
    +        |  to make this more convenient by registering "component factories".
    +        |  Components of the processing pipeline can now be disabled by passing a
    +        |  list of their names to the #[code disable] keyword argument on loading
    +        |  or processing.
    +
    +    +code-new.
    +        nlp = spacy.load('en', disable=['tagger', 'ner'])
    +        doc = nlp(u"I don't want parsed", disable=['parser'])
    +    +code-old.
    +        nlp = spacy.load('en', tagger=False, entity=False)
    +        doc = nlp(u"I don't want parsed", parse=False)
    +
    +    +h(3, "migrating-matcher") Adding patterns and callbacks to the matcher
    +
    +    p
    +        |  If you're using the matcher, you can now add patterns in one step. This
    +        |  should be easy to update – simply merge the ID, callback and patterns
    +        |  into one call to #[+api("matcher#add") #[code Matcher.add()]].
    +
    +    +code-new.
    +        matcher.add('GoogleNow', merge_phrases, [{ORTH: 'Google'}, {ORTH: 'Now'}])
    +
    +    +code-old.
    +        matcher.add_entity('GoogleNow', on_match=merge_phrases)
    +        matcher.add_pattern('GoogleNow', [{ORTH: 'Google'}, {ORTH: 'Now'}])
    +
    +    p
    +        |  If you've been using #[strong acceptor functions], you'll need to move
    +        |  this logic into the
    +        |  #[+a("/usage/rule-based-matching#on_match") #[code on_match] callbacks].
    +        |  The callback function is invoked on every match and will give you access to
    +        |  the doc, the index of the current match and all total matches. This lets
    +        |  you both accept or reject the match, and define the actions to be
    +        |  triggered.
    +
    ++section("benchmarks")
    +    +h(2, "benchmarks") Benchmarks
    +
    +    include _facts-figures/_benchmarks-models
    diff --git a/website/usage/vectors-similarity.jade b/website/usage/vectors-similarity.jade
    new file mode 100644
    index 000000000..1e1139b20
    --- /dev/null
    +++ b/website/usage/vectors-similarity.jade
    @@ -0,0 +1,18 @@
    +//- 💫 DOCS > USAGE > WORD VECTORS & SIMILARITIES
    +
    +include ../_includes/_mixins
    +
    ++section("basics")
    +    include _vectors-similarity/_basics
    +
    ++section("in-context")
    +    +h(2, "in-context") Similarities in context
    +    include _vectors-similarity/_in-context
    +
    ++section("custom")
    +    +h(2, "custom") Customising word vectors
    +    include _vectors-similarity/_custom
    +
    ++section("gpu")
    +    +h(2, "gpu") Storing vectors on a GPU
    +    include _vectors-similarity/_gpu
    diff --git a/website/docs/usage/visualizers.jade b/website/usage/visualizers.jade
    similarity index 97%
    rename from website/docs/usage/visualizers.jade
    rename to website/usage/visualizers.jade
    index 96a6bd49f..39d34aea6 100644
    --- a/website/docs/usage/visualizers.jade
    +++ b/website/usage/visualizers.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > USAGE > VISUALIZERS
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p
         |  As of v2.0, our popular visualizers, #[+a(DEMOS_URL + "/displacy") displaCy]
    @@ -19,8 +19,8 @@ p
         |  #[+a("#jupyter") ready to be rendered and exported].
     
     +aside("What about the old visualizers?")
    -    |  Our JavaScript-based visualizers #[+src(gh("displacy")) displacy.js] and
    -    |  #[+src(gh("displacy-ent")) displacy-ent.js] will still be available on
    +    |  Our JavaScript-based visualizers #[+src(gh("displacy")) #[code displacy.js]] and
    +    |  #[+src(gh("displacy-ent")) #[code displacy-ent.js]] will still be available on
         |  GitHub. If you're looking to implement web-based visualizations, we
         |  generally recommend using those instead of spaCy's built-in
         |  #[code displacy] module. It'll allow your application to perform all
    @@ -148,7 +148,7 @@ p
         |  will render whichever spans and labels it receives. This makes it
         |  especially easy to work with custom entity types. By default, displaCy
         |  comes with colours for all
    -    |  #[+a("/docs/api/annotation#named-entities") entity types supported by spaCy].
    +    |  #[+a("/api/annotation#named-entities") entity types supported by spaCy].
         |  If you're using custom entity types, you can use the #[code colors]
         |  setting to add your own colours for them.
     
    @@ -274,7 +274,7 @@ p
         |  #[code jupyter] keyword argument – e.g. to return raw HTML in a notebook,
         |  or to force Jupyter rendering if auto-detection fails.
     
    -+image("/assets/img/docs/displacy_jupyter.jpg", 700, false, "Example of using the displaCy dependency and named entity visualizer in a Jupyter notebook")
    ++image("/assets/img/displacy_jupyter.jpg", 700, false, "Example of using the displaCy dependency and named entity visualizer in a Jupyter notebook")
     
     p
         |  Internally, displaCy imports #[code display] and #[code HTML] from
    
    From 808f7ee417a0aa9d6828eec12297472ba1eddab3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:27:22 +0200
    Subject: [PATCH 172/649] Update API documentation
    
    ---
     website/api/_annotation/_biluo.jade           |  43 ++
     .../api/_annotation/_dep-labels.jade          |   0
     .../api/_annotation/_named-entities.jade      |   0
     .../{docs => }/api/_annotation/_pos-tags.jade |   0
     website/api/_architecture/_cython.jade        | 115 ++++++
     website/api/_architecture/_nn-model.jade      | 141 +++++++
     website/{docs => }/api/_data.json             | 127 +++---
     .../api/cli.jade => api/_top-level/_cli.jade} | 122 +++---
     website/api/_top-level/_compat.jade           |  91 ++++
     .../_top-level/_displacy.jade}                |  24 +-
     .../spacy.jade => api/_top-level/_spacy.jade} |  64 ++-
     .../util.jade => api/_top-level/_util.jade}   |  62 ++-
     website/api/annotation.jade                   | 131 ++++++
     website/{docs => }/api/binder.jade            |   2 +-
     website/api/dependencyparser.jade             |   5 +
     website/{docs => }/api/doc.jade               |  48 ++-
     website/api/entityrecognizer.jade             |   5 +
     website/{docs => }/api/goldcorpus.jade        |   6 +-
     website/{docs => }/api/goldparse.jade         |  14 +-
     website/api/index.jade                        |  14 +
     website/{docs => }/api/language.jade          |  42 +-
     website/api/lemmatizer.jade                   |   5 +
     website/{docs => }/api/lexeme.jade            |  14 +-
     website/{docs => }/api/matcher.jade           |  23 +-
     website/api/phrasematcher.jade                | 181 ++++++++
     website/api/pipe.jade                         | 390 ++++++++++++++++++
     website/{docs => }/api/span.jade              |  32 +-
     website/{docs => }/api/stringstore.jade       |  22 +-
     website/api/tagger.jade                       |   5 +
     website/api/tensorizer.jade                   |   5 +
     website/api/textcategorizer.jade              |  19 +
     website/{docs => }/api/token.jade             |  45 +-
     website/{docs => }/api/tokenizer.jade         |  16 +-
     website/api/top-level.jade                    |  24 ++
     website/api/vectors.jade                      | 333 +++++++++++++++
     website/{docs => }/api/vocab.jade             | 131 +++++-
     website/docs/api/annotation.jade              | 156 -------
     website/docs/api/dependencyparser.jade        | 111 -----
     website/docs/api/entityrecognizer.jade        | 109 -----
     website/docs/api/index.jade                   | 241 -----------
     website/docs/api/language-models.jade         |  93 -----
     website/docs/api/tagger.jade                  |  93 -----
     website/docs/api/tensorizer.jade              |   7 -
     website/docs/api/textcategorizer.jade         |  21 -
     website/docs/api/vectors.jade                 |   7 -
     website/usage/_models/_languages.jade         |  72 ++++
     46 files changed, 2070 insertions(+), 1141 deletions(-)
     create mode 100644 website/api/_annotation/_biluo.jade
     rename website/{docs => }/api/_annotation/_dep-labels.jade (100%)
     rename website/{docs => }/api/_annotation/_named-entities.jade (100%)
     rename website/{docs => }/api/_annotation/_pos-tags.jade (100%)
     create mode 100644 website/api/_architecture/_cython.jade
     create mode 100644 website/api/_architecture/_nn-model.jade
     rename website/{docs => }/api/_data.json (55%)
     rename website/{docs/api/cli.jade => api/_top-level/_cli.jade} (74%)
     create mode 100644 website/api/_top-level/_compat.jade
     rename website/{docs/api/displacy.jade => api/_top-level/_displacy.jade} (91%)
     rename website/{docs/api/spacy.jade => api/_top-level/_spacy.jade} (72%)
     rename website/{docs/api/util.jade => api/_top-level/_util.jade} (87%)
     create mode 100644 website/api/annotation.jade
     rename website/{docs => }/api/binder.jade (79%)
     create mode 100644 website/api/dependencyparser.jade
     rename website/{docs => }/api/doc.jade (97%)
     create mode 100644 website/api/entityrecognizer.jade
     rename website/{docs => }/api/goldcorpus.jade (71%)
     rename website/{docs => }/api/goldparse.jade (95%)
     create mode 100644 website/api/index.jade
     rename website/{docs => }/api/language.jade (92%)
     create mode 100644 website/api/lemmatizer.jade
     rename website/{docs => }/api/lexeme.jade (98%)
     rename website/{docs => }/api/matcher.jade (96%)
     create mode 100644 website/api/phrasematcher.jade
     create mode 100644 website/api/pipe.jade
     rename website/{docs => }/api/span.jade (97%)
     rename website/{docs => }/api/stringstore.jade (96%)
     create mode 100644 website/api/tagger.jade
     create mode 100644 website/api/tensorizer.jade
     create mode 100644 website/api/textcategorizer.jade
     rename website/{docs => }/api/token.jade (96%)
     rename website/{docs => }/api/tokenizer.jade (96%)
     create mode 100644 website/api/top-level.jade
     create mode 100644 website/api/vectors.jade
     rename website/{docs => }/api/vocab.jade (66%)
     delete mode 100644 website/docs/api/annotation.jade
     delete mode 100644 website/docs/api/dependencyparser.jade
     delete mode 100644 website/docs/api/entityrecognizer.jade
     delete mode 100644 website/docs/api/index.jade
     delete mode 100644 website/docs/api/language-models.jade
     delete mode 100644 website/docs/api/tagger.jade
     delete mode 100644 website/docs/api/tensorizer.jade
     delete mode 100644 website/docs/api/textcategorizer.jade
     delete mode 100644 website/docs/api/vectors.jade
     create mode 100644 website/usage/_models/_languages.jade
    
    diff --git a/website/api/_annotation/_biluo.jade b/website/api/_annotation/_biluo.jade
    new file mode 100644
    index 000000000..dc6168732
    --- /dev/null
    +++ b/website/api/_annotation/_biluo.jade
    @@ -0,0 +1,43 @@
    +//- 💫 DOCS > API > ANNOTATION > BILUO
    +
    ++table([ "Tag", "Description" ])
    +    +row
    +        +cell #[code #[span.u-color-theme B] EGIN]
    +        +cell The first token of a multi-token entity.
    +
    +    +row
    +        +cell #[code #[span.u-color-theme I] N]
    +        +cell An inner token of a multi-token entity.
    +
    +    +row
    +        +cell #[code #[span.u-color-theme L] AST]
    +        +cell The final token of a multi-token entity.
    +
    +    +row
    +        +cell #[code #[span.u-color-theme U] NIT]
    +        +cell A single-token entity.
    +
    +    +row
    +        +cell #[code #[span.u-color-theme O] UT]
    +        +cell A non-entity token.
    +
    ++aside("Why BILUO, not IOB?")
    +    |  There are several coding schemes for encoding entity annotations as
    +    |  token tags.  These coding schemes are equally expressive, but not
    +    |  necessarily equally learnable.
    +    |  #[+a("http://www.aclweb.org/anthology/W09-1119") Ratinov and Roth]
    +    |  showed that the minimal #[strong Begin], #[strong In], #[strong Out]
    +    |  scheme was more difficult to learn than the #[strong BILUO] scheme that
    +    |  we use, which explicitly marks boundary tokens.
    +
    +p
    +    |  spaCy translates the character offsets into this scheme, in order to
    +    |  decide the cost of each action given the current state of the entity
    +    |  recogniser. The costs are then used to calculate the gradient of the
    +    |  loss, to train the model. The exact algorithm is a pastiche of
    +    |  well-known methods, and is not currently described in any single
    +    |  publication. The model is a greedy transition-based parser guided by a
    +    |  linear model whose weights are learned using the averaged perceptron
    +    |  loss, via the #[+a("http://www.aclweb.org/anthology/C12-1059") dynamic oracle]
    +    |  imitation learning strategy. The transition system is equivalent to the
    +    |  BILOU tagging scheme.
    diff --git a/website/docs/api/_annotation/_dep-labels.jade b/website/api/_annotation/_dep-labels.jade
    similarity index 100%
    rename from website/docs/api/_annotation/_dep-labels.jade
    rename to website/api/_annotation/_dep-labels.jade
    diff --git a/website/docs/api/_annotation/_named-entities.jade b/website/api/_annotation/_named-entities.jade
    similarity index 100%
    rename from website/docs/api/_annotation/_named-entities.jade
    rename to website/api/_annotation/_named-entities.jade
    diff --git a/website/docs/api/_annotation/_pos-tags.jade b/website/api/_annotation/_pos-tags.jade
    similarity index 100%
    rename from website/docs/api/_annotation/_pos-tags.jade
    rename to website/api/_annotation/_pos-tags.jade
    diff --git a/website/api/_architecture/_cython.jade b/website/api/_architecture/_cython.jade
    new file mode 100644
    index 000000000..84b98b824
    --- /dev/null
    +++ b/website/api/_architecture/_cython.jade
    @@ -0,0 +1,115 @@
    +//- 💫 DOCS > API > ARCHITECTURE > CYTHON
    +
    ++aside("What's Cython?")
    +    |  #[+a("http://cython.org/") Cython] is a language for writing
    +    |  C extensions for Python. Most Python code is also valid Cython, but
    +    |  you can add type declarations to get efficient memory-managed code
    +    |  just like C or C++.
    +
    +p
    +    |  spaCy's core data structures are implemented as
    +    |  #[+a("http://cython.org/") Cython] #[code cdef] classes. Memory is
    +    |  managed through the #[+a(gh("cymem")) #[code cymem]]
    +    |  #[code cymem.Pool] class, which allows you
    +    |  to allocate memory which will be freed when the #[code Pool] object
    +    |  is garbage collected. This means you usually don't have to worry
    +    |  about freeing memory. You just have to decide which Python object
    +    |  owns the memory, and make it own the #[code Pool]. When that object
    +    |  goes out of scope, the memory will be freed. You do have to take
    +    |  care that no pointers outlive the object that owns them — but this
    +    |  is generally quite easy.
    +
    +p
    +    |  All Cython modules should have the #[code # cython: infer_types=True]
    +    |  compiler directive at the top of the file. This makes the code much
    +    |  cleaner, as it avoids the need for many type declarations. If
    +    |  possible, you should prefer to declare your functions #[code nogil],
    +    |  even if you don't especially care about multi-threading. The reason
    +    |  is that #[code nogil] functions help the Cython compiler reason about
    +    |  your code quite a lot — you're telling the compiler that no Python
    +    |  dynamics are possible. This lets many errors be raised, and ensures
    +    |  your function will run at C speed.
    +
    +
    +p
    +    |  Cython gives you many choices of sequences: you could have a Python
    +    |  list, a numpy array, a memory view, a C++ vector, or a pointer.
    +    |  Pointers are preferred, because they are fastest, have the most
    +    |  explicit semantics, and let the compiler check your code more
    +    |  strictly. C++ vectors are also great — but you should only use them
    +    |  internally in functions. It's less friendly to accept a vector as an
    +    |  argument, because that asks the user to do much more work. Here's
    +    |  how to get a pointer from a numpy array, memory view or vector:
    +
    ++code.
    +    cdef void get_pointers(np.ndarray[int, mode='c'] numpy_array, vector[int] cpp_vector, int[::1] memory_view) nogil:
    +    pointer1 = <int*>numpy_array.data
    +    pointer2 = cpp_vector.data()
    +    pointer3 = &memory_view[0]
    +
    +p
    +    |  Both C arrays and C++ vectors reassure the compiler that no Python
    +    |  operations are possible on your variable. This is a big advantage:
    +    |  it lets the Cython compiler raise many more errors for you.
    +
    +p
    +    |  When getting a pointer from a numpy array or memoryview, take care
    +    |  that the data is actually stored in C-contiguous order — otherwise
    +    |  you'll get a pointer to nonsense. The type-declarations in the code
    +    |  above should generate runtime errors if buffers with incorrect
    +    |  memory layouts are passed in. To iterate over the array, the
    +    |  following style is preferred:
    +
    ++code.
    +    cdef int c_total(const int* int_array, int length) nogil:
    +        total = 0
    +        for item in int_array[:length]:
    +            total += item
    +        return total
    +
    +p
    +    |  If this is confusing, consider that the compiler couldn't deal with
    +    |  #[code for item in int_array:] — there's no length attached to a raw
    +    |  pointer, so how could we figure out where to stop? The length is
    +    |  provided in the slice notation as a solution to this. Note that we
    +    |  don't have to declare the type of #[code item] in the code above —
    +    |  the compiler can easily infer it. This gives us tidy code that looks
    +    |  quite like Python, but is exactly as fast as C — because we've made
    +    |  sure the compilation to C is trivial.
    +
    +p
    +    |  Your functions cannot be declared #[code nogil] if they need to
    +    |  create Python objects or call Python functions. This is perfectly
    +    |  okay — you shouldn't torture your code just to get #[code nogil]
    +    |  functions. However, if your function isn't #[code nogil], you should
    +    |  compile your module with #[code cython -a --cplus my_module.pyx] and
    +    |  open the resulting #[code my_module.html] file in a browser. This
    +    |  will let you see how Cython is compiling your code. Calls into the
    +    |  Python run-time will be in bright yellow. This lets you easily see
    +    |  whether Cython is able to correctly type your code, or whether there
    +    |  are unexpected problems.
    +
    +p
    +    |  Working in Cython is very rewarding once you're over the initial
    +    |  learning curve. As with C and C++, the first way you write something
    +    |  in Cython will often be the performance-optimal approach. In
    +    |  contrast, Python optimisation generally requires a lot of
    +    |  experimentation. Is it faster to have an #[code if item in my_dict]
    +    |  check, or to use #[code .get()]? What about
    +    |  #[code try]/#[code except]? Does this numpy operation create a copy?
    +    |  There's no way to guess the answers to these questions, and you'll
    +    |  usually be dissatisfied with your results — so there's no way to
    +    |  know when to stop this process. In the worst case, you'll make a
    +    |  mess that invites the next reader to try their luck too. This is
    +    |  like one of those
    +    |  #[+a("http://www.wemjournal.org/article/S1080-6032%2809%2970088-2/abstract") volcanic gas-traps],
    +    |  where the rescuers keep passing out from low oxygen, causing
    +    |  another rescuer to follow — only to succumb themselves. In short,
    +    |  just say no to optimizing your Python. If it's not fast enough the
    +    |  first time, just switch to Cython.
    +
    ++infobox("Resources")
    +    +list.o-no-block
    +        +item #[+a("http://docs.cython.org/en/latest/") Official Cython documentation] (cython.org)
    +        +item #[+a("https://explosion.ai/blog/writing-c-in-cython", true) Writing C in Cython] (explosion.ai)
    +        +item #[+a("https://explosion.ai/blog/multithreading-with-cython") Multi-threading spaCy’s parser and named entity recogniser] (explosion.ai)
    diff --git a/website/api/_architecture/_nn-model.jade b/website/api/_architecture/_nn-model.jade
    new file mode 100644
    index 000000000..8080af2ec
    --- /dev/null
    +++ b/website/api/_architecture/_nn-model.jade
    @@ -0,0 +1,141 @@
    +//- 💫 DOCS > API > ARCHITECTURE > NN MODEL ARCHITECTURE
    +
    +p
    +    |  The parsing model is a blend of recent results. The two recent
    +    |  inspirations have been the work of Eli Klipperwasser and Yoav Goldberg at
    +    |  Bar Ilan#[+fn(1)], and the SyntaxNet team from Google. The foundation of
    +    |  the parser is still based on the work of Joakim Nivre#[+fn(2)], who
    +    |  introduced the transition-based framework#[+fn(3)], the arc-eager
    +    |  transition system, and the imitation learning objective. The model is
    +    |  implemented using #[+a(gh("thinc")) Thinc], spaCy's machine learning
    +    |  library. We first predict context-sensitive vectors for each word in the
    +    |  input:
    +
    ++code.
    +    (embed_lower | embed_prefix | embed_suffix | embed_shape)
    +        >> Maxout(token_width)
    +        >> convolution ** 4
    +
    +p
    +    |  This convolutional layer is shared between the tagger, parser and NER,
    +    |  and will also be shared by the future neural lemmatizer. Because the
    +    |  parser shares these layers with the tagger, the parser does not require
    +    |  tag features. I got this trick from David Weiss's "Stack Combination"
    +    |  paper#[+fn(4)].
    +
    +p
    +    |  To boost the representation, the tagger actually predicts a "super tag"
    +    |  with POS, morphology and dependency label#[+fn(5)]. The tagger predicts
    +    |  these supertags by adding a softmax layer onto the convolutional layer –
    +    |  so, we're teaching the convolutional layer to give us a representation
    +    |  that's one affine transform from this informative lexical information.
    +    |  This is obviously good for the parser (which backprops to the
    +    |  convolutions too). The parser model makes a state vector by concatenating
    +    |  the vector representations for its context tokens.  The current context
    +    |  tokens:
    +
    ++table
    +    +row
    +        +cell #[code S0], #[code S1], #[code S2]
    +        +cell Top three words on the stack.
    +
    +    +row
    +        +cell #[code B0], #[code B1]
    +        +cell First two words of the buffer.
    +
    +    +row
    +        +cell.u-nowrap
    +            |  #[code S0L1], #[code S1L1], #[code S2L1], #[code B0L1],
    +            |  #[code B1L1]#[br]
    +            |  #[code S0L2], #[code S1L2], #[code S2L2], #[code B0L2],
    +            |  #[code B1L2]
    +        +cell
    +            |  Leftmost and second leftmost children of #[code S0], #[code S1],
    +            |  #[code S2], #[code B0] and #[code B1].
    +
    +    +row
    +        +cell.u-nowrap
    +            |  #[code S0R1], #[code S1R1], #[code S2R1], #[code B0R1],
    +            |  #[code B1R1]#[br]
    +            |  #[code S0R2], #[code S1R2], #[code S2R2], #[code B0R2],
    +            |  #[code B1R2]
    +        +cell
    +            |  Rightmost and second rightmost children of #[code S0], #[code S1],
    +            |  #[code S2], #[code B0] and #[code B1].
    +
    +p
    +    |  This makes the state vector quite long: #[code 13*T], where #[code T] is
    +    |  the token vector width (128 is working well). Fortunately, there's a way
    +    |  to structure the computation to save some expense (and make it more
    +    |  GPU-friendly).
    +
    +p
    +    |  The parser typically visits #[code 2*N] states for a sentence of length
    +    |  #[code N] (although it may visit more, if it back-tracks with a
    +    |  non-monotonic transition#[+fn(4)]). A naive implementation would require
    +    |  #[code 2*N (B, 13*T) @ (13*T, H)] matrix multiplications for a batch of
    +    |  size #[code B]. We can instead perform one #[code (B*N, T) @ (T, 13*H)]
    +    |  multiplication, to pre-compute the hidden weights for each positional
    +    |  feature with respect to the words in the batch. (Note that our token
    +    |  vectors come from the CNN — so we can't play this trick over the
    +    |  vocabulary. That's how Stanford's NN parser#[+fn(3)] works — and why its
    +    |  model is so big.)
    +
    +p
    +    |  This pre-computation strategy allows a nice compromise between
    +    |  GPU-friendliness and implementation simplicity. The CNN and the wide
    +    |  lower layer are computed on the GPU, and then the precomputed hidden
    +    |  weights are moved to the CPU, before we start the transition-based
    +    |  parsing process. This makes a lot of things much easier. We don't have to
    +    |  worry about variable-length batch sizes, and we don't have to implement
    +    |  the dynamic oracle in CUDA to train.
    +
    +p
    +    |  Currently the parser's loss function is multilabel log loss#[+fn(6)], as
    +    |  the dynamic oracle allows multiple states to be 0 cost. This is defined
    +    |  as follows, where #[code gZ] is the sum of the scores assigned to gold
    +    |  classes:
    +
    ++code.
    +    (exp(score) / Z) - (exp(score) / gZ)
    +
    ++bibliography
    +    +item
    +        |  #[+a("https://www.semanticscholar.org/paper/Simple-and-Accurate-Dependency-Parsing-Using-Bidir-Kiperwasser-Goldberg/3cf31ecb2724b5088783d7c96a5fc0d5604cbf41") Simple and Accurate Dependency Parsing Using Bidirectional LSTM Feature Representations]
    +        br
    +        |  Eliyahu Kiperwasser, Yoav Goldberg. (2016)
    +
    +    +item
    +        |  #[+a("https://www.semanticscholar.org/paper/A-Dynamic-Oracle-for-Arc-Eager-Dependency-Parsing-Goldberg-Nivre/22697256ec19ecc3e14fcfc63624a44cf9c22df4") A Dynamic Oracle for Arc-Eager Dependency Parsing]
    +        br
    +        |  Yoav Goldberg, Joakim Nivre (2012)
    +
    +    +item
    +        |  #[+a("https://explosion.ai/blog/parsing-english-in-python") Parsing English in 500 Lines of Python]
    +        br
    +        |  Matthew Honnibal (2013)
    +
    +    +item
    +        |  #[+a("https://www.semanticscholar.org/paper/Stack-propagation-Improved-Representation-Learning-Zhang-Weiss/0c133f79b23e8c680891d2e49a66f0e3d37f1466") Stack-propagation: Improved Representation Learning for Syntax]
    +        br
    +        |  Yuan Zhang, David Weiss (2016)
    +
    +    +item
    +        |  #[+a("https://www.semanticscholar.org/paper/Deep-multi-task-learning-with-low-level-tasks-supe-S%C3%B8gaard-Goldberg/03ad06583c9721855ccd82c3d969a01360218d86") Deep multi-task learning with low level tasks supervised at lower layers]
    +        br
    +        |  Anders Søgaard, Yoav Goldberg (2016)
    +
    +    +item
    +        |  #[+a("https://www.semanticscholar.org/paper/An-Improved-Non-monotonic-Transition-System-for-De-Honnibal-Johnson/4094cee47ade13b77b5ab4d2e6cb9dd2b8a2917c") An Improved Non-monotonic Transition System for Dependency Parsing]
    +        br
    +        |  Matthew Honnibal, Mark Johnson (2015)
    +
    +    +item
    +        |  #[+a("http://cs.stanford.edu/people/danqi/papers/emnlp2014.pdf") A Fast and Accurate Dependency Parser using Neural Networks]
    +        br
    +        |  Danqi Cheng, Christopher D. Manning (2014)
    +
    +    +item
    +        |  #[+a("https://www.semanticscholar.org/paper/Parsing-the-Wall-Street-Journal-using-a-Lexical-Fu-Riezler-King/0ad07862a91cd59b7eb5de38267e47725a62b8b2") Parsing the Wall Street Journal using a Lexical-Functional Grammar and Discriminative Estimation Techniques]
    +        br
    +        |  Stefan Riezler et al. (2002)
    diff --git a/website/docs/api/_data.json b/website/api/_data.json
    similarity index 55%
    rename from website/docs/api/_data.json
    rename to website/api/_data.json
    index e413f200c..83b98f1fa 100644
    --- a/website/docs/api/_data.json
    +++ b/website/api/_data.json
    @@ -1,29 +1,32 @@
     {
         "sidebar": {
    -        "Introduction": {
    -            "Facts & Figures": "./",
    -            "Languages": "language-models",
    -            "Annotation Specs": "annotation"
    +        "Overview": {
    +            "Architecture": "./",
    +            "Annotation Specs": "annotation",
    +            "Functions": "top-level"
             },
    -        "Top-level": {
    -            "spacy": "spacy",
    -            "displacy": "displacy",
    -            "Utility Functions": "util",
    -            "Command line": "cli"
    -        },
    -        "Classes": {
    +        "Containers": {
                 "Doc": "doc",
                 "Token": "token",
                 "Span": "span",
    +            "Lexeme": "lexeme"
    +        },
    +
    +        "Pipeline": {
                 "Language": "language",
    -            "Tokenizer": "tokenizer",
    +            "Pipe": "pipe",
                 "Tensorizer": "tensorizer",
                 "Tagger": "tagger",
                 "DependencyParser": "dependencyparser",
                 "EntityRecognizer": "entityrecognizer",
                 "TextCategorizer": "textcategorizer",
    +            "Tokenizer": "tokenizer",
    +            "Lemmatizer": "lemmatizer",
                 "Matcher": "matcher",
    -            "Lexeme": "lexeme",
    +            "PhraseMatcher": "phrasematcher"
    +        },
    +
    +        "Other": {
                 "Vocab": "vocab",
                 "StringStore": "stringstore",
                 "Vectors": "vectors",
    @@ -34,52 +37,37 @@
         },
     
         "index": {
    -        "title": "Facts & Figures",
    -        "next": "language-models"
    +        "title": "Architecture",
    +        "next": "annotation",
    +        "menu": {
    +            "Basics": "basics",
    +            "Neural Network Model": "nn-model",
    +            "Cython Conventions": "cython"
    +        }
         },
     
    -    "language-models": {
    -        "title": "Languages",
    -        "next": "philosophy"
    -    },
    -
    -    "philosophy": {
    -        "title": "Philosophy"
    -    },
    -
    -    "spacy": {
    -        "title": "spaCy top-level functions",
    -        "source": "spacy/__init__.py",
    -        "next": "displacy"
    -    },
    -
    -    "displacy": {
    -        "title": "displaCy",
    -        "tag": "module",
    -        "source": "spacy/displacy",
    -        "next": "util"
    -    },
    -
    -    "util": {
    -        "title": "Utility Functions",
    -        "source": "spacy/util.py",
    -        "next": "cli"
    -    },
    -
    -    "cli": {
    -        "title": "Command Line Interface",
    -        "source": "spacy/cli"
    +    "top-level": {
    +        "title": "Top-level Functions",
    +        "menu": {
    +            "spacy": "spacy",
    +            "displacy": "displacy",
    +            "Utility Functions": "util",
    +            "Compatibility": "compat",
    +            "Command Line": "cli"
    +        }
         },
     
         "language": {
             "title": "Language",
             "tag": "class",
    +        "teaser": "A text-processing pipeline.",
             "source": "spacy/language.py"
         },
     
         "doc": {
             "title": "Doc",
             "tag": "class",
    +        "teaser": "A container for accessing linguistic annotations.",
             "source": "spacy/tokens/doc.pyx"
         },
     
    @@ -103,6 +91,7 @@
     
         "vocab": {
             "title": "Vocab",
    +        "teaser": "A storage class for vocabulary and other data shared across a language.",
             "tag": "class",
             "source": "spacy/vocab.pyx"
         },
    @@ -115,10 +104,27 @@
     
         "matcher": {
             "title": "Matcher",
    +        "teaser": "Match sequences of tokens, based on pattern rules.",
             "tag": "class",
             "source": "spacy/matcher.pyx"
         },
     
    +    "phrasematcher": {
    +        "title": "PhraseMatcher",
    +        "teaser": "Match sequences of tokens, based on documents.",
    +        "tag": "class",
    +        "tag_new": 2,
    +        "source": "spacy/matcher.pyx"
    +    },
    +
    +    "pipe": {
    +        "title": "Pipe",
    +        "teaser": "Abstract base class defining the API for pipeline components.",
    +        "tag": "class",
    +        "tag_new": 2,
    +        "source": "spacy/pipeline.pyx"
    +    },
    +
         "dependenyparser": {
             "title": "DependencyParser",
             "tag": "class",
    @@ -127,18 +133,22 @@
     
         "entityrecognizer": {
             "title": "EntityRecognizer",
    +        "teaser": "Annotate named entities on documents.",
             "tag": "class",
             "source": "spacy/pipeline.pyx"
         },
     
         "textcategorizer": {
             "title": "TextCategorizer",
    +        "teaser": "Add text categorization models to spaCy pipelines.",
             "tag": "class",
    +        "tag_new": 2,
             "source": "spacy/pipeline.pyx"
         },
     
         "dependencyparser": {
             "title": "DependencyParser",
    +        "teaser": "Annotate syntactic dependencies on documents.",
             "tag": "class",
             "source": "spacy/pipeline.pyx"
         },
    @@ -149,15 +159,23 @@
             "source": "spacy/tokenizer.pyx"
         },
     
    +    "lemmatizer": {
    +        "title": "Lemmatizer",
    +        "tag": "class"
    +    },
    +
         "tagger": {
             "title": "Tagger",
    +        "teaser": "Annotate part-of-speech tags on documents.",
             "tag": "class",
             "source": "spacy/pipeline.pyx"
         },
     
         "tensorizer": {
             "title": "Tensorizer",
    +        "teaser": "Add a tensor with position-sensitive meaning representations to a document.",
             "tag": "class",
    +        "tag_new": 2,
             "source": "spacy/pipeline.pyx"
         },
     
    @@ -169,23 +187,38 @@
     
         "goldcorpus": {
             "title": "GoldCorpus",
    +        "teaser": "An annotated corpus, using the JSON file format.",
             "tag": "class",
    +        "tag_new": 2,
             "source": "spacy/gold.pyx"
         },
     
         "binder": {
             "title": "Binder",
             "tag": "class",
    +        "tag_new": 2,
             "source": "spacy/tokens/binder.pyx"
         },
     
         "vectors": {
             "title": "Vectors",
    +        "teaser": "Store, save and load word vectors.",
             "tag": "class",
    +        "tag_new": 2,
             "source": "spacy/vectors.pyx"
         },
     
         "annotation": {
    -        "title": "Annotation Specifications"
    +        "title": "Annotation Specifications",
    +        "teaser": "Schemes used for labels, tags and training data.",
    +        "menu": {
    +            "Tokenization": "tokenization",
    +            "Sentence Boundaries": "sbd",
    +            "POS Tagging": "pos-tagging",
    +            "Lemmatization": "lemmatization",
    +            "Dependencies": "dependency-parsing",
    +            "Named Entities": "named-entities",
    +            "Training Data": "training"
    +        }
         }
     }
    diff --git a/website/docs/api/cli.jade b/website/api/_top-level/_cli.jade
    similarity index 74%
    rename from website/docs/api/cli.jade
    rename to website/api/_top-level/_cli.jade
    index 26aa1f883..52884988e 100644
    --- a/website/docs/api/cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -1,26 +1,17 @@
    -//- 💫 DOCS > USAGE > COMMAND LINE INTERFACE
    -
    -include ../../_includes/_mixins
    +//- 💫 DOCS > API > TOP-LEVEL > COMMAND LINE INTERFACE
     
     p
         |  As of v1.7.0, spaCy comes with new command line helpers to download and
         |  link models and show useful debugging information. For a list of available
         |  commands, type #[code spacy --help].
     
    -+infobox("⚠️ Deprecation note")
    -    |  As of spaCy 2.0, the #[code model] command to initialise a model data
    -    |  directory is deprecated. The command was only necessary because previous
    -    |  versions of spaCy expected a model directory to already be set up. This
    -    |  has since been changed, so you can use the #[+api("cli#train") #[code train]]
    -    |  command straight away.
    -
    -+h(2, "download") Download
    ++h(3, "download") Download
     
     p
    -    |  Download #[+a("/docs/usage/models") models] for spaCy. The downloader finds the
    +    |  Download #[+a("/usage/models") models] for spaCy. The downloader finds the
         |  best-matching compatible version, uses pip to download the model as a
         |  package and automatically creates a
    -    |  #[+a("/docs/usage/models#usage") shortcut link] to load the model by name.
    +    |  #[+a("/usage/models#usage") shortcut link] to load the model by name.
         |  Direct downloads don't perform any compatibility checks and require the
         |  model name to be specified with its version (e.g., #[code en_core_web_sm-1.2.0]).
     
    @@ -49,15 +40,15 @@ p
         |  detailed messages in case things go wrong. It's #[strong not recommended]
         |  to use this command as part of an automated process. If you know which
         |  model your project needs, you should consider a
    -    |  #[+a("/docs/usage/models#download-pip") direct download via pip], or
    +    |  #[+a("/usage/models#download-pip") direct download via pip], or
         |  uploading the model to a local PyPi installation and fetching it straight
         |  from there. This will also allow you to add it as a versioned package
         |  dependency to your project.
     
    -+h(2, "link") Link
    ++h(3, "link") Link
     
     p
    -    |  Create a #[+a("/docs/usage/models#usage") shortcut link] for a model,
    +    |  Create a #[+a("/usage/models#usage") shortcut link] for a model,
         |  either a Python package or a local directory. This will let you load
         |  models from any location using a custom name via
         |  #[+api("spacy#load") #[code spacy.load()]].
    @@ -95,7 +86,7 @@ p
             +cell flag
             +cell Show help message and available arguments.
     
    -+h(2, "info") Info
    ++h(3, "info") Info
     
     p
         |  Print information about your spaCy installation, models and local setup,
    @@ -122,15 +113,15 @@ p
             +cell flag
             +cell Show help message and available arguments.
     
    -+h(2, "convert") Convert
    ++h(3, "convert") Convert
     
     p
    -    |  Convert files into spaCy's #[+a("/docs/api/annotation#json-input") JSON format]
    +    |  Convert files into spaCy's #[+a("/api/annotation#json-input") JSON format]
         |  for use with the #[code train] command and other experiment management
         |  functions. The right converter is chosen based on the file extension of
         |  the input file. Currently only supports #[code .conllu].
     
    -+code(false, "bash", "$").
    ++code(false, "bash", "$", false, false, true).
         spacy convert [input_file] [output_dir] [--n-sents] [--morphology]
     
     +table(["Argument", "Type", "Description"])
    @@ -159,14 +150,18 @@ p
             +cell flag
             +cell Show help message and available arguments.
     
    -+h(2, "train") Train
    ++h(3, "train") Train
     
     p
         |  Train a model. Expects data in spaCy's
    -    |  #[+a("/docs/api/annotation#json-input") JSON format].
    +    |  #[+a("/api/annotation#json-input") JSON format]. On each epoch, a model
    +    |  will be saved out to the directory. Accuracy scores and model details
    +    |  will be added to a #[+a("/usage/training#models-generating") #[code meta.json]]
    +    |  to allow packaging the model using the
    +    |  #[+api("cli#package") #[code package]] command.
     
    -+code(false, "bash", "$").
    -    spacy train [lang] [output_dir] [train_data] [dev_data] [--n-iter] [--n-sents] [--use-gpu] [--no-tagger] [--no-parser] [--no-entities]
    ++code(false, "bash", "$", false, false, true).
    +    spacy train [lang] [output_dir] [train_data] [dev_data] [--n-iter] [--n-sents] [--use-gpu] [--meta-path] [--vectors] [--no-tagger] [--no-parser] [--no-entities] [--gold-preproc]
     
     +table(["Argument", "Type", "Description"])
         +row
    @@ -204,6 +199,27 @@ p
             +cell option
             +cell Use GPU.
     
    +    +row
    +        +cell #[code --vectors], #[code -v]
    +        +cell option
    +        +cell Model to load vectors from.
    +
    +    +row
    +        +cell #[code --meta-path], #[code -m]
    +        +cell option
    +        +cell
    +            |  #[+tag-new(2)] Optional path to model
    +            |  #[+a("/usage/training#models-generating") #[code meta.json]].
    +            |  All relevant properties like #[code lang], #[code pipeline] and
    +            |  #[code spacy_version] will be overwritten.
    +
    +    +row
    +        +cell #[code --version], #[code -V]
    +        +cell option
    +        +cell
    +            |  Model version. Will be written out to the model's
    +            |  #[code meta.json] after training.
    +
         +row
             +cell #[code --no-tagger], #[code -T]
             +cell flag
    @@ -219,12 +235,18 @@ p
             +cell flag
             +cell Don't train NER.
     
    +    +row
    +        +cell #[code --gold-preproc], #[code -G]
    +        +cell flag
    +        +cell Use gold preprocessing.
    +
         +row
             +cell #[code --help], #[code -h]
             +cell flag
             +cell Show help message and available arguments.
     
    -+h(3, "train-hyperparams") Environment variables for hyperparameters
    ++h(4, "train-hyperparams") Environment variables for hyperparameters
    +    +tag-new(2)
     
     p
         |  spaCy lets you set hyperparameters for training via environment variables.
    @@ -236,98 +258,96 @@ p
     +code(false, "bash").
         parser_hidden_depth=2 parser_maxout_pieces=1 train-parser
     
    -+under-construction
    -
     +table(["Name", "Description", "Default"])
         +row
             +cell #[code dropout_from]
    -        +cell
    +        +cell Initial dropout rate.
             +cell #[code 0.2]
     
         +row
             +cell #[code dropout_to]
    -        +cell
    +        +cell Final dropout rate.
             +cell #[code 0.2]
     
         +row
             +cell #[code dropout_decay]
    -        +cell
    +        +cell Rate of dropout change.
             +cell #[code 0.0]
     
         +row
             +cell #[code batch_from]
    -        +cell
    +        +cell Initial batch size.
             +cell #[code 1]
     
         +row
             +cell #[code batch_to]
    -        +cell
    +        +cell Final batch size.
             +cell #[code 64]
     
         +row
             +cell #[code batch_compound]
    -        +cell
    +        +cell Rate of batch size acceleration.
             +cell #[code 1.001]
     
         +row
             +cell #[code token_vector_width]
    -        +cell
    +        +cell Width of embedding tables and convolutional layers.
             +cell #[code 128]
     
         +row
             +cell #[code embed_size]
    -        +cell
    +        +cell Number of rows in embedding tables.
             +cell #[code 7500]
     
         +row
             +cell #[code parser_maxout_pieces]
    -        +cell
    +        +cell Number of pieces in the parser's and NER's first maxout layer.
             +cell #[code 2]
     
         +row
             +cell #[code parser_hidden_depth]
    -        +cell
    +        +cell Number of hidden layers in the parser and NER.
             +cell #[code 1]
     
         +row
             +cell #[code hidden_width]
    -        +cell
    +        +cell Size of the parser's and NER's hidden layers.
             +cell #[code 128]
     
         +row
             +cell #[code learn_rate]
    -        +cell
    +        +cell Learning rate.
             +cell #[code 0.001]
     
         +row
             +cell #[code optimizer_B1]
    -        +cell
    +        +cell Momentum for the Adam solver.
             +cell #[code 0.9]
     
         +row
             +cell #[code optimizer_B2]
    -        +cell
    +        +cell Adagrad-momentum for the Adam solver.
             +cell #[code 0.999]
     
         +row
             +cell #[code optimizer_eps]
    -        +cell
    +        +cell Epsylon value for the Adam solver.
             +cell #[code 1e-08]
     
         +row
             +cell #[code L2_penalty]
    -        +cell
    +        +cell L2 regularisation penalty.
             +cell #[code 1e-06]
     
         +row
             +cell #[code grad_norm_clip]
    -        +cell
    +        +cell Gradient L2 norm constraint.
             +cell #[code 1.0]
     
    -+h(2, "package") Package
    ++h(3, "package") Package
     
     p
    -    |  Generate a #[+a("/docs/usage/saving-loading#generating") model Python package]
    +    |  Generate a #[+a("/usage/training#models-generating") model Python package]
         |  from an existing model data directory. All data files are copied over.
         |  If the path to a meta.json is supplied, or a meta.json is found in the
         |  input directory, this file is used. Otherwise, the data can be entered
    @@ -336,8 +356,8 @@ p
         |  sure you're always using the latest versions. This means you need to be
         |  connected to the internet to use this command.
     
    -+code(false, "bash", "$").
    -    spacy package [input_dir] [output_dir] [--meta] [--force]
    ++code(false, "bash", "$", false, false, true).
    +    spacy package [input_dir] [output_dir] [--meta-path] [--create-meta] [--force]
     
     +table(["Argument", "Type", "Description"])
         +row
    @@ -353,14 +373,14 @@ p
         +row
             +cell #[code --meta-path], #[code -m]
             +cell option
    -        +cell Path to meta.json file (optional).
    +        +cell #[+tag-new(2)] Path to meta.json file (optional).
     
         +row
             +cell #[code --create-meta], #[code -c]
             +cell flag
             +cell
    -            |  Create a meta.json file on the command line, even if one already
    -            |  exists in the directory.
    +            |  #[+tag-new(2)] Create a meta.json file on the command line, even
    +            |  if one already exists in the directory.
     
         +row
             +cell #[code --force], #[code -f]
    diff --git a/website/api/_top-level/_compat.jade b/website/api/_top-level/_compat.jade
    new file mode 100644
    index 000000000..dfd42c55f
    --- /dev/null
    +++ b/website/api/_top-level/_compat.jade
    @@ -0,0 +1,91 @@
    +//- 💫 DOCS > API > TOP-LEVEL > COMPATIBILITY
    +
    +p
    +    |  All Python code is written in an
    +    |  #[strong intersection of Python 2 and Python 3]. This is easy in Cython,
    +    |  but somewhat ugly in Python. Logic that deals with Python or platform
    +    |  compatibility only lives in #[code spacy.compat]. To distinguish them from
    +    |  the builtin functions, replacement functions are suffixed with an
    +    |  undersocre, e.e #[code unicode_]. For specific checks, spaCy uses the
    +    |  #[code six] and #[code ftfy] packages.
    +
    ++aside-code("Example").
    +    from spacy.compat import unicode_, json_dumps
    +
    +    compatible_unicode = unicode_('hello world')
    +    compatible_json = json_dumps({'key': 'value'})
    +
    ++table(["Name", "Python 2", "Python 3"])
    +    +row
    +        +cell #[code compat.bytes_]
    +        +cell #[code str]
    +        +cell #[code bytes]
    +
    +    +row
    +        +cell #[code compat.unicode_]
    +        +cell #[code unicode]
    +        +cell #[code str]
    +
    +    +row
    +        +cell #[code compat.basestring_]
    +        +cell #[code basestring]
    +        +cell #[code str]
    +
    +    +row
    +        +cell #[code compat.input_]
    +        +cell #[code raw_input]
    +        +cell #[code input]
    +
    +    +row
    +        +cell #[code compat.json_dumps]
    +        +cell #[code ujson.dumps] with #[code .decode('utf8')]
    +        +cell #[code ujson.dumps]
    +
    +    +row
    +        +cell #[code compat.path2str]
    +        +cell #[code str(path)] with #[code .decode('utf8')]
    +        +cell #[code str(path)]
    +
    ++h(3, "is_config") compat.is_config
    +    +tag function
    +
    +p
    +    |  Check if a specific configuration of Python version and operating system
    +    |  matches the user's setup. Mostly used to display targeted error messages.
    +
    ++aside-code("Example").
    +    from spacy.compat import is_config
    +
    +    if is_config(python2=True, windows=True):
    +        print("You are using Python 2 on Windows.")
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code python2]
    +        +cell bool
    +        +cell spaCy is executed with Python 2.x.
    +
    +    +row
    +        +cell #[code python3]
    +        +cell bool
    +        +cell spaCy is executed with Python 3.x.
    +
    +    +row
    +        +cell #[code windows]
    +        +cell bool
    +        +cell spaCy is executed on Windows.
    +
    +    +row
    +        +cell #[code linux]
    +        +cell bool
    +        +cell spaCy is executed on Linux.
    +
    +    +row
    +        +cell #[code osx]
    +        +cell bool
    +        +cell spaCy is executed on OS X or macOS.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell Whether the specified configuration matches the user's platform.
    diff --git a/website/docs/api/displacy.jade b/website/api/_top-level/_displacy.jade
    similarity index 91%
    rename from website/docs/api/displacy.jade
    rename to website/api/_top-level/_displacy.jade
    index 59fcca3ca..a3d7240d6 100644
    --- a/website/docs/api/displacy.jade
    +++ b/website/api/_top-level/_displacy.jade
    @@ -1,14 +1,12 @@
    -//- 💫 DOCS > API > DISPLACY
    -
    -include ../../_includes/_mixins
    +//- 💫 DOCS > API > TOP-LEVEL > DISPLACY
     
     p
         |  As of v2.0, spaCy comes with a built-in visualization suite. For more
         |  info and examples, see the usage guide on
    -    |  #[+a("/docs/usage/visualizers") visualizing spaCy].
    +    |  #[+a("/usage/visualizers") visualizing spaCy].
     
     
    -+h(2, "serve") displacy.serve
    ++h(3, "displacy.serve") displacy.serve
         +tag method
         +tag-new(2)
     
    @@ -60,7 +58,7 @@ p
             +cell bool
             +cell
                 |  Don't parse #[code Doc] and instead, expect a dict or list of
    -            |  dicts. #[+a("/docs/usage/visualizers#manual-usage") See here]
    +            |  dicts. #[+a("/usage/visualizers#manual-usage") See here]
                 |  for formats and examples.
             +cell #[code False]
     
    @@ -70,7 +68,7 @@ p
             +cell Port to serve visualization.
             +cell #[code 5000]
     
    -+h(2, "render") displacy.render
    ++h(3, "displacy.render") displacy.render
         +tag method
         +tag-new(2)
     
    @@ -127,24 +125,24 @@ p Render a dependency parse tree or named entity visualization.
             +cell bool
             +cell
                 |  Don't parse #[code Doc] and instead, expect a dict or list of
    -            |  dicts. #[+a("/docs/usage/visualizers#manual-usage") See here]
    +            |  dicts. #[+a("/usage/visualizers#manual-usage") See here]
                 |  for formats and examples.
             +cell #[code False]
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell unicode
             +cell Rendered HTML markup.
             +cell
     
    -+h(2, "options") Visualizer options
    ++h(3, "displacy_options") Visualizer options
     
     p
         |  The #[code options] argument lets you specify additional settings for
         |  each visualizer. If a setting is not present in the options, the default
         |  value will be used.
     
    -+h(3, "options-dep") Dependency Visualizer options
    ++h(4, "options-dep") Dependency Visualizer options
     
     +aside-code("Example").
         options = {'compact': True, 'color': 'blue'}
    @@ -219,7 +217,7 @@ p
             +cell Distance between words in px.
             +cell #[code 175] / #[code 85] (compact)
     
    -+h(3, "options-ent") Named Entity Visualizer options
    ++h(4, "displacy_options-ent") Named Entity Visualizer options
     
     +aside-code("Example").
         options = {'ents': ['PERSON', 'ORG', 'PRODUCT'],
    @@ -244,6 +242,6 @@ p
     
     p
         |  By default, displaCy comes with colours for all
    -    |  #[+a("/docs/api/annotation#named-entities") entity types supported by spaCy].
    +    |  #[+a("/api/annotation#named-entities") entity types supported by spaCy].
         |  If you're using custom entity types, you can use the #[code colors]
         |  setting to add your own colours for them.
    diff --git a/website/docs/api/spacy.jade b/website/api/_top-level/_spacy.jade
    similarity index 72%
    rename from website/docs/api/spacy.jade
    rename to website/api/_top-level/_spacy.jade
    index a45307378..c14f62f7e 100644
    --- a/website/docs/api/spacy.jade
    +++ b/website/api/_top-level/_spacy.jade
    @@ -1,15 +1,13 @@
    -//- 💫 DOCS > API > SPACY
    +//- 💫 DOCS > API > TOP-LEVEL > SPACY
     
    -include ../../_includes/_mixins
    -
    -+h(2, "load") spacy.load
    ++h(3, "spacy.load") spacy.load
         +tag function
         +tag-model
     
     p
    -    |  Load a model via its #[+a("/docs/usage/models#usage") shortcut link],
    +    |  Load a model via its #[+a("/usage/models#usage") shortcut link],
         |  the name of an installed
    -    |  #[+a("/docs/usage/saving-loading#generating") model package], a unicode
    +    |  #[+a("/usage/training#models-generating") model package], a unicode
         |  path or a #[code Path]-like object. spaCy will try resolving the load
         |  argument in this order. If a model is loaded from a shortcut link or
         |  package name, spaCy will assume it's a Python package and import it and
    @@ -38,25 +36,57 @@ p
             +cell list
             +cell
                 |  Names of pipeline components to
    -            |  #[+a("/docs/usage/language-processing-pipeline#disabling") disable].
    +            |  #[+a("/usage/processing-pipelines#disabling") disable].
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Language]
             +cell A #[code Language] object with the loaded model.
     
    -+infobox("⚠️ Deprecation note")
    ++infobox("Deprecation note", "⚠️")
         .o-block
             |  As of spaCy 2.0, the #[code path] keyword argument is deprecated. spaCy
             |  will also raise an error if no model could be loaded and never just
             |  return an empty #[code Language] object. If you need a blank language,
    -        |  you need to import it explicitly (#[code from spacy.lang.en import English])
    -        |  or use #[+api("util#get_lang_class") #[code util.get_lang_class]].
    +        |  you can use the new function #[+api("spacy#blank") #[code spacy.blank()]]
    +        |  or import the class explicitly, e.g.
    +        |  #[code from spacy.lang.en import English].
     
         +code-new nlp = spacy.load('/model')
         +code-old nlp = spacy.load('en', path='/model')
     
    -+h(2, "info") spacy.info
    ++h(3, "spacy.blank") spacy.blank
    +    +tag function
    +    +tag-new(2)
    +
    +p
    +    |  Create a blank model of a given language class. This function is the
    +    |  twin of #[code spacy.load()].
    +
    ++aside-code("Example").
    +    nlp_en = spacy.blank('en')
    +    nlp_de = spacy.blank('de')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell ISO code of the language class to load.
    +
    +    +row
    +        +cell #[code disable]
    +        +cell list
    +        +cell
    +            |  Names of pipeline components to
    +            |  #[+a("/usage/processing-pipelines#disabling") disable].
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Language]
    +        +cell An empty #[code Language] object of the appropriate subclass.
    +
    +
    ++h(4, "spacy.info") spacy.info
         +tag function
     
     p
    @@ -83,13 +113,13 @@ p
             +cell Print information as Markdown.
     
     
    -+h(2, "explain") spacy.explain
    ++h(3, "spacy.explain") spacy.explain
         +tag function
     
     p
         |  Get a description for a given POS tag, dependency label or entity type.
         |  For a list of available terms, see
    -    |  #[+src(gh("spacy", "spacy/glossary.py")) glossary.py].
    +    |  #[+src(gh("spacy", "spacy/glossary.py")) #[code glossary.py]].
     
     +aside-code("Example").
         spacy.explain('NORP')
    @@ -107,18 +137,18 @@ p
             +cell unicode
             +cell Term to explain.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell unicode
             +cell The explanation, or #[code None] if not found in the glossary.
     
    -+h(2, "set_factory") spacy.set_factory
    ++h(3, "spacy.set_factory") spacy.set_factory
         +tag function
         +tag-new(2)
     
     p
         |  Set a factory that returns a custom
    -    |  #[+a("/docs/usage/language-processing-pipeline") processing pipeline]
    +    |  #[+a("/usage/processing-pipelines") processing pipeline]
         |  component. Factories are useful for creating stateful components, especially ones which depend on shared data.
     
     +aside-code("Example").
    diff --git a/website/docs/api/util.jade b/website/api/_top-level/_util.jade
    similarity index 87%
    rename from website/docs/api/util.jade
    rename to website/api/_top-level/_util.jade
    index 2127446df..1770a111e 100644
    --- a/website/docs/api/util.jade
    +++ b/website/api/_top-level/_util.jade
    @@ -1,10 +1,8 @@
    -//- 💫 DOCS > API > UTIL
    -
    -include ../../_includes/_mixins
    +//- 💫 DOCS > API > TOP-LEVEL > UTIL
     
     p
         |  spaCy comes with a small collection of utility functions located in
    -    |  #[+src(gh("spaCy", "spacy/util.py")) spacy/util.py].
    +    |  #[+src(gh("spaCy", "spacy/util.py")) #[code spacy/util.py]].
         |  Because utility functions are mostly intended for
         |  #[strong internal use within spaCy], their behaviour may change with
         |  future releases. The functions documented on this page should be safe
    @@ -12,7 +10,7 @@ p
         |  recommend having additional tests in place if your application depends on
         |  any of spaCy's utilities.
     
    -+h(2, "get_data_path") util.get_data_path
    ++h(3, "util.get_data_path") util.get_data_path
         +tag function
     
     p
    @@ -25,12 +23,12 @@ p
             +cell bool
             +cell Only return path if it exists, otherwise return #[code None].
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Path] / #[code None]
             +cell Data path or #[code None].
     
    -+h(2, "set_data_path") util.set_data_path
    ++h(3, "util.set_data_path") util.set_data_path
         +tag function
     
     p
    @@ -47,12 +45,12 @@ p
             +cell unicode or #[code Path]
             +cell Path to new data directory.
     
    -+h(2, "get_lang_class") util.get_lang_class
    ++h(3, "util.get_lang_class") util.get_lang_class
         +tag function
     
     p
         |  Import and load a #[code Language] class. Allows lazy-loading
    -    |  #[+a("/docs/usage/adding-languages") language data] and importing
    +    |  #[+a("/usage/adding-languages") language data] and importing
         |  languages using the two-letter language code.
     
     +aside-code("Example").
    @@ -67,12 +65,12 @@ p
             +cell unicode
             +cell Two-letter language code, e.g. #[code 'en'].
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Language]
             +cell Language class.
     
    -+h(2, "load_model") util.load_model
    ++h(3, "util.load_model") util.load_model
         +tag function
         +tag-new(2)
     
    @@ -101,12 +99,12 @@ p
             +cell -
             +cell Specific overrides, like pipeline components to disable.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Language]
             +cell #[code Language] class with the loaded model.
     
    -+h(2, "load_model_from_path") util.load_model_from_path
    ++h(3, "util.load_model_from_path") util.load_model_from_path
         +tag function
         +tag-new(2)
     
    @@ -139,18 +137,18 @@ p
             +cell -
             +cell Specific overrides, like pipeline components to disable.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Language]
             +cell #[code Language] class with the loaded model.
     
    -+h(2, "load_model_from_init_py") util.load_model_from_init_py
    ++h(3, "util.load_model_from_init_py") util.load_model_from_init_py
         +tag function
         +tag-new(2)
     
     p
         |  A helper function to use in the #[code load()] method of a model package's
    -    |  #[+src(gh("spacy-dev-resources", "templates/model/en_model_name/__init__.py")) __init__.py].
    +    |  #[+src(gh("spacy-dev-resources", "templates/model/en_model_name/__init__.py")) #[code __init__.py]].
     
     +aside-code("Example").
         from spacy.util import load_model_from_init_py
    @@ -169,12 +167,12 @@ p
             +cell -
             +cell Specific overrides, like pipeline components to disable.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Language]
             +cell #[code Language] class with the loaded model.
     
    -+h(2, "get_model_meta") util.get_model_meta
    ++h(3, "util.get_model_meta") util.get_model_meta
         +tag function
         +tag-new(2)
     
    @@ -190,17 +188,17 @@ p
             +cell unicode or #[code Path]
             +cell Path to model directory.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell dict
             +cell The model's meta data.
     
    -+h(2, "is_package") util.is_package
    ++h(3, "util.is_package") util.is_package
         +tag function
     
     p
         |  Check if string maps to a package installed via pip. Mainly used to
    -    |  validate #[+a("/docs/usage/models") model packages].
    +    |  validate #[+a("/usage/models") model packages].
     
     +aside-code("Example").
         util.is_package('en_core_web_sm') # True
    @@ -212,18 +210,18 @@ p
             +cell unicode
             +cell Name of package.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code bool]
             +cell #[code True] if installed package, #[code False] if not.
     
    -+h(2, "get_package_path") util.get_package_path
    ++h(3, "util.get_package_path") util.get_package_path
         +tag function
         +tag-new(2)
     
     p
         |  Get path to an installed package. Mainly used to resolve the location of
    -    |  #[+a("/docs/usage/models") model packages]. Currently imports the package
    +    |  #[+a("/usage/models") model packages]. Currently imports the package
         |  to find its path.
     
     +aside-code("Example").
    @@ -236,12 +234,12 @@ p
             +cell unicode
             +cell Name of installed package.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Path]
             +cell Path to model package directory.
     
    -+h(2, "is_in_jupyter") util.is_in_jupyter
    ++h(3, "util.is_in_jupyter") util.is_in_jupyter
         +tag function
         +tag-new(2)
     
    @@ -257,17 +255,17 @@ p
             return display(HTML(html))
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell #[code True] if in Jupyter, #[code False] if not.
     
    -+h(2, "update_exc") util.update_exc
    ++h(3, "util.update_exc") util.update_exc
         +tag function
     
     p
         |  Update, validate and overwrite
    -    |  #[+a("/docs/usage/adding-languages#tokenizer-exceptions") tokenizer exceptions].
    +    |  #[+a("/usage/adding-languages#tokenizer-exceptions") tokenizer exceptions].
         |  Used to combine global  exceptions with custom, language-specific
         |  exceptions. Will raise an error if key doesn't match #[code ORTH] values.
     
    @@ -288,20 +286,20 @@ p
             +cell dicts
             +cell Exception dictionaries to add to the base exceptions, in order.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell dict
             +cell Combined tokenizer exceptions.
     
     
    -+h(2, "prints") util.prints
    ++h(3, "util.prints") util.prints
         +tag function
         +tag-new(2)
     
     p
         |  Print a formatted, text-wrapped message with optional title. If a text
         |  argument is a #[code Path], it's converted to a string. Should only
    -    |  be used for interactive components like the #[+api("cli") cli].
    +    |  be used for interactive components like the command-line interface.
     
     +aside-code("Example").
         data_path = Path('/some/path')
    diff --git a/website/api/annotation.jade b/website/api/annotation.jade
    new file mode 100644
    index 000000000..efada23d7
    --- /dev/null
    +++ b/website/api/annotation.jade
    @@ -0,0 +1,131 @@
    +//- 💫 DOCS > API > ANNOTATION SPECS
    +
    +include ../_includes/_mixins
    +
    +p This document describes the target annotations spaCy is trained to predict.
    +
    +
    ++section("tokenization")
    +    +h(2, "tokenization") Tokenization
    +
    +    p
    +        |  Tokenization standards are based on the
    +        |  #[+a("https://catalog.ldc.upenn.edu/LDC2013T19") OntoNotes 5] corpus.
    +        |  The tokenizer differs from most by including tokens for significant
    +        |  whitespace. Any sequence of whitespace characters beyond a single space
    +        |  (#[code ' ']) is included as a token.
    +
    +    +aside-code("Example").
    +        from spacy.lang.en import English
    +        nlp = English()
    +        tokens = nlp('Some\nspaces  and\ttab characters')
    +        tokens_text = [t.text for t in tokens]
    +        assert tokens_text == ['Some', '\n', 'spaces', ' ', 'and',
    +                            '\t', 'tab', 'characters']
    +
    +    p
    +        |  The whitespace tokens are useful for much the same reason punctuation is
    +        |  – it's often an important delimiter in the text. By preserving it in the
    +        |  token output, we are able to maintain a simple alignment between the
    +        |  tokens and the original string, and we ensure that no information is
    +        |  lost during processing.
    +
    ++section("sbd")
    +    +h(2, "sentence-boundary") Sentence boundary detection
    +
    +    p
    +        |  Sentence boundaries are calculated from the syntactic parse tree, so
    +        |  features such as punctuation and capitalisation play an important but
    +        |  non-decisive role in determining the sentence boundaries. Usually this
    +        |  means that the sentence boundaries will at least coincide with clause
    +        |  boundaries, even given poorly punctuated text.
    +
    ++section("pos-tagging")
    +    +h(2, "pos-tagging") Part-of-speech Tagging
    +
    +    +aside("Tip: Understanding tags")
    +        |  You can also use #[code spacy.explain()] to get the description for the
    +        |  string representation of a tag. For example,
    +        |  #[code spacy.explain("RB")] will return "adverb".
    +
    +    include _annotation/_pos-tags
    +
    ++section("lemmatization")
    +    +h(2, "lemmatization") Lemmatization
    +
    +    p A "lemma" is the uninflected form of a word. In English, this means:
    +
    +    +list
    +        +item #[strong Adjectives]: The form like "happy", not "happier" or "happiest"
    +        +item #[strong Adverbs]: The form like "badly", not "worse" or "worst"
    +        +item #[strong Nouns]: The form like "dog", not "dogs"; like "child", not "children"
    +        +item #[strong Verbs]: The form like "write", not "writes", "writing", "wrote" or "written"
    +
    +    p
    +        |  The lemmatization data is taken from
    +        |  #[+a("https://wordnet.princeton.edu") WordNet]. However, we also add a
    +        |  special case for pronouns: all pronouns are lemmatized to the special
    +        |  token #[code -PRON-].
    +
    +    +infobox("About spaCy's custom pronoun lemma")
    +        |  Unlike verbs and common nouns, there's no clear base form of a personal
    +        |  pronoun. Should the lemma of "me" be "I", or should we normalize person
    +        |  as well, giving "it" — or maybe "he"? spaCy's solution is to introduce a
    +        |  novel symbol, #[code -PRON-], which is used as the lemma for
    +        |  all personal pronouns.
    +
    ++section("dependency-parsing")
    +    +h(2, "dependency-parsing") Syntactic Dependency Parsing
    +
    +    +aside("Tip: Understanding labels")
    +        |  You can also use #[code spacy.explain()] to get the description for the
    +        |  string representation of a label. For example,
    +        |  #[code spacy.explain("prt")] will return "particle".
    +
    +    include _annotation/_dep-labels
    +
    ++section("named-entities")
    +    +h(2, "named-entities") Named Entity Recognition
    +
    +    +aside("Tip: Understanding entity types")
    +        |  You can also use #[code spacy.explain()] to get the description for the
    +        |  string representation of an entity label. For example,
    +        |  #[code spacy.explain("LANGUAGE")] will return "any named language".
    +
    +    include _annotation/_named-entities
    +
    +    +h(3, "biluo") BILUO Scheme
    +
    +    include _annotation/_biluo
    +
    ++section("training")
    +    +h(2, "json-input") JSON input format for training
    +
    +    +under-construction
    +
    +    p spaCy takes training data in the following format:
    +
    +    +code("Example structure").
    +        doc: {
    +            id: string,
    +            paragraphs: [{
    +                raw: string,
    +                sents: [int],
    +                tokens: [{
    +                    start: int,
    +                    tag: string,
    +                    head: int,
    +                    dep: string
    +                }],
    +                ner: [{
    +                    start: int,
    +                    end: int,
    +                    label: string
    +                }],
    +                brackets: [{
    +                    start: int,
    +                    end: int,
    +                    label: string
    +                }]
    +            }]
    +        }
    diff --git a/website/docs/api/binder.jade b/website/api/binder.jade
    similarity index 79%
    rename from website/docs/api/binder.jade
    rename to website/api/binder.jade
    index 0dea1b339..e47cb597d 100644
    --- a/website/docs/api/binder.jade
    +++ b/website/api/binder.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > API > BINDER
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p A container class for serializing collections of #[code Doc] objects.
     
    diff --git a/website/api/dependencyparser.jade b/website/api/dependencyparser.jade
    new file mode 100644
    index 000000000..ca56d6816
    --- /dev/null
    +++ b/website/api/dependencyparser.jade
    @@ -0,0 +1,5 @@
    +//- 💫 DOCS > API > DEPENDENCYPARSER
    +
    +include ../_includes/_mixins
    +
    +!=partial("pipe", { subclass: "DependencyParser", short: "parser", pipeline_id: "parser" })
    diff --git a/website/docs/api/doc.jade b/website/api/doc.jade
    similarity index 97%
    rename from website/docs/api/doc.jade
    rename to website/api/doc.jade
    index 7fbbcce97..85932c605 100644
    --- a/website/docs/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -1,8 +1,6 @@
     //- 💫 DOCS > API > DOC
     
    -include ../../_includes/_mixins
    -
    -p A container for accessing linguistic annotations.
    +include ../_includes/_mixins
     
     p
         |  A #[code Doc] is a sequence of #[+api("token") #[code Token]] objects.
    @@ -47,7 +45,7 @@ p
                 |  subsequent space. Must have the same length as #[code words], if
                 |  specified. Defaults to a sequence of #[code True].
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell The newly constructed object.
    @@ -73,7 +71,7 @@ p
             +cell int
             +cell The index of the token.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell The token at #[code doc[i]].
    @@ -96,7 +94,7 @@ p
             +cell tuple
             +cell The slice of the document to get.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Span]
             +cell The span at #[code doc[start : end]].
    @@ -120,7 +118,7 @@ p
         |  from Cython.
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell A #[code Token] object.
    @@ -135,7 +133,7 @@ p Get the number of tokens in the document.
         assert len(doc) == 7
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The number of tokens in the document.
    @@ -172,7 +170,7 @@ p Create a #[code Span] object from the slice #[code doc.text[start : end]].
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A meaning representation of the span.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Span]
             +cell The newly constructed object.
    @@ -200,7 +198,7 @@ p
                 |  The object to compare with. By default, accepts #[code Doc],
                 |  #[code Span], #[code Token] and #[code Lexeme] objects.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell float
             +cell A scalar similarity score. Higher is more similar.
    @@ -226,7 +224,7 @@ p
             +cell int
             +cell The attribute ID
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell dict
             +cell A dictionary mapping attributes to integer counts.
    @@ -251,7 +249,7 @@ p
             +cell list
             +cell A list of attribute ID ints.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']]
             +cell
    @@ -285,7 +283,7 @@ p
             +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']]
             +cell The attribute values to load.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell Itself.
    @@ -326,7 +324,7 @@ p Loads state from a directory. Modifies the object in place and returns it.
                 |  A path to a directory. Paths may be either strings or
                 |  #[code Path]-like objects.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell The modified #[code Doc] object.
    @@ -341,7 +339,7 @@ p Serialize, i.e. export the document contents to a binary string.
         doc_bytes = doc.to_bytes()
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bytes
             +cell
    @@ -367,7 +365,7 @@ p Deserialize, i.e. import the document contents from a binary string.
             +cell bytes
             +cell The string to load from.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell The #[code Doc] object.
    @@ -378,7 +376,7 @@ p Deserialize, i.e. import the document contents from a binary string.
     p
         |  Retokenize the document, such that the span at
         |  #[code doc.text[start_idx : end_idx]] is merged into a single token. If
    -    |  #[code start_idx] and #[end_idx] do not mark start and end token
    +    |  #[code start_idx] and #[code end_idx] do not mark start and end token
         |  boundaries, the document remains unchanged.
     
     +aside-code("Example").
    @@ -405,7 +403,7 @@ p
                 |  attributes are inherited from the syntactic root token of
                 |  the span.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell
    @@ -440,7 +438,7 @@ p
             +cell bool
             +cell Don't include arcs or modifiers.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell dict
             +cell Parse tree as dict.
    @@ -462,7 +460,7 @@ p
         assert ents[0].text == 'Mr. Best'
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Span]
             +cell Entities in the document.
    @@ -485,7 +483,7 @@ p
         assert chunks[1].text == "another phrase"
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Span]
             +cell Noun chunks in the document.
    @@ -507,7 +505,7 @@ p
         assert [s.root.text for s in sents] == ["is", "'s"]
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Span]
             +cell Sentences in the document.
    @@ -525,7 +523,7 @@ p
         assert doc.has_vector
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether the document has a vector data attached.
    @@ -544,7 +542,7 @@ p
         assert doc.vector.shape == (300,)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A 1D numpy array representing the document's semantics.
    @@ -564,7 +562,7 @@ p
         assert doc1.vector_norm != doc2.vector_norm
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell float
             +cell The L2 norm of the vector representation.
    diff --git a/website/api/entityrecognizer.jade b/website/api/entityrecognizer.jade
    new file mode 100644
    index 000000000..aff33bde7
    --- /dev/null
    +++ b/website/api/entityrecognizer.jade
    @@ -0,0 +1,5 @@
    +//- 💫 DOCS > API > ENTITYRECOGNIZER
    +
    +include ../_includes/_mixins
    +
    +!=partial("pipe", { subclass: "EntityRecognizer", short: "ner", pipeline_id: "ner" })
    diff --git a/website/docs/api/goldcorpus.jade b/website/api/goldcorpus.jade
    similarity index 71%
    rename from website/docs/api/goldcorpus.jade
    rename to website/api/goldcorpus.jade
    index 3b3d92823..0f7105f65 100644
    --- a/website/docs/api/goldcorpus.jade
    +++ b/website/api/goldcorpus.jade
    @@ -1,14 +1,12 @@
     //- 💫 DOCS > API > GOLDCORPUS
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p
    -    |  An annotated corpus, using the JSON file format. Manages annotations for
    -    |  tagging, dependency parsing and NER.
    +    |  This class manages annotations for tagging, dependency parsing and NER.
     
     +h(2, "init") GoldCorpus.__init__
         +tag method
    -    +tag-new(2)
     
     p Create a #[code GoldCorpus].
     
    diff --git a/website/docs/api/goldparse.jade b/website/api/goldparse.jade
    similarity index 95%
    rename from website/docs/api/goldparse.jade
    rename to website/api/goldparse.jade
    index 03118343d..c27badee9 100644
    --- a/website/docs/api/goldparse.jade
    +++ b/website/api/goldparse.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > API > GOLDPARSE
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p Collection for training annotations.
     
    @@ -40,7 +40,7 @@ p Create a #[code GoldParse].
             +cell iterable
             +cell A sequence of named entity annotations, either as BILUO tag strings, or as #[code (start_char, end_char, label)] tuples, representing the entity positions.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code GoldParse]
             +cell The newly constructed object.
    @@ -51,7 +51,7 @@ p Create a #[code GoldParse].
     p Get the number of gold-standard tokens.
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The number of gold-standard tokens.
    @@ -64,7 +64,7 @@ p
         |  tree.
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether annotations form projective tree.
    @@ -119,7 +119,7 @@ p
     
     p
         |  Encode labelled spans into per-token tags, using the
    -    |  #[+a("/docs/api/annotation#biluo") BILUO scheme] (Begin/In/Last/Unit/Out).
    +    |  #[+a("/api/annotation#biluo") BILUO scheme] (Begin/In/Last/Unit/Out).
     
     p
         |  Returns a list of unicode strings, describing the tags. Each tag string
    @@ -157,11 +157,11 @@ p
                 |  and #[code end] should be character-offset integers denoting the
                 |  slice into the original string.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell list
             +cell
                 |  Unicode strings, describing the
    -            |  #[+a("/docs/api/annotation#biluo") BILUO] tags.
    +            |  #[+a("/api/annotation#biluo") BILUO] tags.
     
     
    diff --git a/website/api/index.jade b/website/api/index.jade
    new file mode 100644
    index 000000000..8035c9ff5
    --- /dev/null
    +++ b/website/api/index.jade
    @@ -0,0 +1,14 @@
    +//- 💫 DOCS > API > ARCHITECTURE
    +
    +include ../_includes/_mixins
    +
    ++section("basics")
    +    include ../usage/_spacy-101/_architecture
    +
    ++section("nn-model")
    +    +h(2, "nn-model") Neural network model architecture
    +    include _architecture/_nn-model
    +
    ++section("cython")
    +    +h(2, "cython") Cython conventions
    +    include _architecture/_cython
    diff --git a/website/docs/api/language.jade b/website/api/language.jade
    similarity index 92%
    rename from website/docs/api/language.jade
    rename to website/api/language.jade
    index 69665ee9d..617c81599 100644
    --- a/website/docs/api/language.jade
    +++ b/website/api/language.jade
    @@ -1,10 +1,10 @@
     //- 💫 DOCS > API > LANGUAGE
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p
    -    |  A text-processing pipeline. Usually you'll load this once per process,
    -    |  and pass the instance around your application.
    +    |  Usually you'll load this once per process as #[code nlp] and pass the
    +    |  instance around your application.
     
     +h(2, "init") Language.__init__
         +tag method
    @@ -49,7 +49,7 @@ p Initialise a #[code Language] object.
                 |  Custom meta data for the #[code Language] class. Is written to by
                 |  models to add model meta data.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Language]
             +cell The newly constructed object.
    @@ -77,14 +77,14 @@ p
             +cell list
             +cell
                 |  Names of pipeline components to
    -            |  #[+a("/docs/usage/language-processing-pipeline#disabling") disable].
    +            |  #[+a("/usage/processing-pipelines#disabling") disable].
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell A container for accessing the annotations.
     
    -+infobox("⚠️ Deprecation note")
    ++infobox("Deprecation note", "⚠️")
         .o-block
             |  Pipeline components to prevent from being loaded can now be added as
             |  a list to #[code disable], instead of specifying one keyword argument
    @@ -136,9 +136,9 @@ p
             +cell list
             +cell
                 |  Names of pipeline components to
    -            |  #[+a("/docs/usage/language-processing-pipeline#disabling") disable].
    +            |  #[+a("/usage/processing-pipelines#disabling") disable].
     
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Doc]
             +cell Documents in the order of the original text.
    @@ -175,7 +175,7 @@ p Update the models in the pipeline.
             +cell callable
             +cell An optimizer.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell dict
             +cell Results from the update.
    @@ -200,7 +200,7 @@ p
             +cell -
             +cell Config parameters.
     
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell tuple
             +cell An optimizer.
    @@ -242,7 +242,7 @@ p
             +cell iterable
             +cell Tuples of #[code Doc] and #[code GoldParse] objects.
     
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell tuple
             +cell Tuples of #[code Doc] and #[code GoldParse] objects.
    @@ -271,7 +271,7 @@ p
             +cell list
             +cell
                 |  Names of pipeline components to
    -            |  #[+a("/docs/usage/language-processing-pipeline#disabling") disable]
    +            |  #[+a("/usage/processing-pipelines#disabling") disable]
                 |  and prevent from being saved.
     
     +h(2, "from_disk") Language.from_disk
    @@ -300,14 +300,14 @@ p
             +cell list
             +cell
                 |  Names of pipeline components to
    -            |  #[+a("/docs/usage/language-processing-pipeline#disabling") disable].
    +            |  #[+a("/usage/processing-pipelines#disabling") disable].
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Language]
             +cell The modified #[code Language] object.
     
    -+infobox("⚠️ Deprecation note")
    ++infobox("Deprecation note", "⚠️")
         .o-block
             |  As of spaCy v2.0, the #[code save_to_directory] method has been
             |  renamed to #[code to_disk], to improve consistency across classes.
    @@ -332,10 +332,10 @@ p Serialize the current state to a binary string.
             +cell list
             +cell
                 |  Names of pipeline components to
    -            |  #[+a("/docs/usage/language-processing-pipeline#disabling") disable]
    +            |  #[+a("/usage/processing-pipelines#disabling") disable]
                 |  and prevent from being serialized.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bytes
             +cell The serialized form of the #[code Language] object.
    @@ -362,14 +362,14 @@ p Load state from a binary string.
             +cell list
             +cell
                 |  Names of pipeline components to
    -            |  #[+a("/docs/usage/language-processing-pipeline#disabling") disable].
    +            |  #[+a("/usage/processing-pipelines#disabling") disable].
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Language]
             +cell The #[code Language] object.
     
    -+infobox("⚠️ Deprecation note")
    ++infobox("Deprecation note", "⚠️")
         .o-block
             |  Pipeline components to prevent from being loaded can now be added as
             |  a list to #[code disable], instead of specifying one keyword argument
    diff --git a/website/api/lemmatizer.jade b/website/api/lemmatizer.jade
    new file mode 100644
    index 000000000..9699395b1
    --- /dev/null
    +++ b/website/api/lemmatizer.jade
    @@ -0,0 +1,5 @@
    +//- 💫 DOCS > API > LEMMATIZER
    +
    +include ../_includes/_mixins
    +
    ++under-construction
    diff --git a/website/docs/api/lexeme.jade b/website/api/lexeme.jade
    similarity index 98%
    rename from website/docs/api/lexeme.jade
    rename to website/api/lexeme.jade
    index 6e3f68493..dddefd2d7 100644
    --- a/website/docs/api/lexeme.jade
    +++ b/website/api/lexeme.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > API > LEXEME
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p
         |  An entry in the vocabulary. A #[code Lexeme] has no string context – it's
    @@ -24,7 +24,7 @@ p Create a #[code Lexeme] object.
             +cell int
             +cell The orth id of the lexeme.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Lexeme]
             +cell The newly constructed object.
    @@ -65,7 +65,7 @@ p Check the value of a boolean flag.
             +cell int
             +cell The attribute ID of the flag to query.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell The value of the flag.
    @@ -91,7 +91,7 @@ p Compute a semantic similarity estimate. Defaults to cosine over vectors.
                 |  The object to compare with. By default, accepts #[code Doc],
                 |  #[code Span], #[code Token] and #[code Lexeme] objects.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell float
             +cell A scalar similarity score. Higher is more similar.
    @@ -110,7 +110,7 @@ p
         assert apple.has_vector
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether the lexeme has a vector data attached.
    @@ -127,7 +127,7 @@ p A real-valued meaning representation.
         assert apple.vector.shape == (300,)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A 1D numpy array representing the lexeme's semantics.
    @@ -146,7 +146,7 @@ p The L2 norm of the lexeme's vector representation.
         assert apple.vector_norm != pasta.vector_norm
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell float
             +cell The L2 norm of the vector representation.
    diff --git a/website/docs/api/matcher.jade b/website/api/matcher.jade
    similarity index 96%
    rename from website/docs/api/matcher.jade
    rename to website/api/matcher.jade
    index 95819e553..35aba4cba 100644
    --- a/website/docs/api/matcher.jade
    +++ b/website/api/matcher.jade
    @@ -1,10 +1,8 @@
     //- 💫 DOCS > API > MATCHER
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
    -p Match sequences of tokens, based on pattern rules.
    -
    -+infobox("⚠️ Deprecation note")
    ++infobox("Deprecation note", "⚠️")
         |  As of spaCy 2.0, #[code Matcher.add_pattern] and #[code Matcher.add_entity]
         |  are deprecated and have been replaced with a simpler
         |  #[+api("matcher#add") #[code Matcher.add]] that lets you add a list of
    @@ -39,7 +37,7 @@ p Create the rule-based #[code Matcher].
             +cell dict
             +cell Patterns to add to the matcher, keyed by ID.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Matcher]
             +cell The newly constructed object.
    @@ -64,7 +62,7 @@ p Find all token sequences matching the supplied patterns on the #[code Doc].
             +cell #[code Doc]
             +cell The document to match over.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell list
             +cell
    @@ -81,7 +79,7 @@ p Find all token sequences matching the supplied patterns on the #[code Doc].
         |  actions per pattern within the same matcher. For example, you might only
         |  want to merge some entity types, and set custom flags for other matched
         |  patterns. For more details and examples, see the usage guide on
    -    |  #[+a("/docs/usage/rule-based-matching") rule-based matching].
    +    |  #[+a("/usage/linguistic-features#rule-based-matching") rule-based matching].
     
     +h(2, "pipe") Matcher.pipe
         +tag method
    @@ -113,7 +111,7 @@ p Match a stream of documents, yielding them in turn.
                 |  parallel, if the #[code Matcher] implementation supports
                 |  multi-threading.
     
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Doc]
             +cell Documents, in order.
    @@ -134,7 +132,7 @@ p
         assert len(matcher) == 1
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The number of rules.
    @@ -156,7 +154,8 @@ p Check whether the matcher contains rules for a match ID.
             +cell #[code key]
             +cell unicode
             +cell The match ID.
    -    +footrow
    +
    +    +row("foot")
             +cell returns
             +cell int
             +cell Whether the matcher contains rules for this match ID.
    @@ -203,7 +202,7 @@ p
                 |  Match pattern. A pattern consists of a list of dicts, where each
                 |  dict describes a token.
     
    -+infobox("⚠️ Deprecation note")
    ++infobox("Deprecation note", "⚠️")
         .o-block
             |  As of spaCy 2.0, #[code Matcher.add_pattern] and #[code Matcher.add_entity]
             |  are deprecated and have been replaced with a simpler
    @@ -257,7 +256,7 @@ p
             +cell unicode
             +cell The ID of the match rule.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell tuple
             +cell The rule, as an #[code (on_match, patterns)] tuple.
    diff --git a/website/api/phrasematcher.jade b/website/api/phrasematcher.jade
    new file mode 100644
    index 000000000..5c49a03d5
    --- /dev/null
    +++ b/website/api/phrasematcher.jade
    @@ -0,0 +1,181 @@
    +//- 💫 DOCS > API > PHRASEMATCHER
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  The #[code PhraseMatcher] lets you efficiently match large terminology
    +    |  lists. While the #[+api("matcher") #[code Matcher]] lets you match
    +    |  squences based on lists of token descriptions, the #[code PhraseMatcher]
    +    |  accepts match patterns in the form of #[code Doc] objects.
    +
    ++h(2, "init") PhraseMatcher.__init__
    +    +tag method
    +
    +p Create the rule-based #[code PhraseMatcher].
    +
    ++aside-code("Example").
    +    from spacy.matcher import PhraseMatcher
    +    matcher = Matcher(nlp.vocab, max_length=6)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code vocab]
    +        +cell #[code Vocab]
    +        +cell
    +            |  The vocabulary object, which must be shared with the documents
    +            |  the matcher will operate on.
    +
    +    +row
    +        +cell #[code max_length]
    +        +cell int
    +        +cell Mamimum length of a phrase pattern to add.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code PhraseMatcher]
    +        +cell The newly constructed object.
    +
    ++h(2, "call") PhraseMatcher.__call__
    +    +tag method
    +
    +p Find all token sequences matching the supplied patterns on the #[code Doc].
    +
    ++aside-code("Example").
    +    from spacy.matcher import Matcher
    +
    +    matcher = Matcher(nlp.vocab)
    +    matcher.add('OBAMA', None, nlp(u"Barack Obama"))
    +    doc = nlp(u"Barack Obama lifts America one last time in emotional farewell")
    +    matches = matcher(doc)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code doc]
    +        +cell #[code Doc]
    +        +cell The document to match over.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell list
    +        +cell
    +            |  A list of #[code (match_id, start, end)] tuples, describing the
    +            |  matches. A match tuple describes a span #[code doc[start:end]].
    +            |  The #[code match_id] is the ID of the added match pattern.
    +
    ++h(2, "pipe") PhraseMatcher.pipe
    +    +tag method
    +
    +p Match a stream of documents, yielding them in turn.
    +
    ++aside-code("Example").
    +    from spacy.matcher import PhraseMatcher
    +    matcher = PhraseMatcher(nlp.vocab)
    +    for doc in matcher.pipe(texts, batch_size=50, n_threads=4):
    +        pass
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code docs]
    +        +cell iterable
    +        +cell A stream of documents.
    +
    +    +row
    +        +cell #[code batch_size]
    +        +cell int
    +        +cell The number of documents to accumulate into a working set.
    +
    +    +row
    +        +cell #[code n_threads]
    +        +cell int
    +        +cell
    +            |  The number of threads with which to work on the buffer in
    +            |  parallel, if the #[code PhraseMatcher] implementation supports
    +            |  multi-threading.
    +
    +    +row("foot")
    +        +cell yields
    +        +cell #[code Doc]
    +        +cell Documents, in order.
    +
    ++h(2, "len") PhraseMatcher.__len__
    +    +tag method
    +
    +p
    +    |  Get the number of rules added to the matcher. Note that this only returns
    +    |  the number of rules (identical with the number of IDs), not the number
    +    |  of individual patterns.
    +
    ++aside-code("Example").
    +    matcher = PhraseMatcher(nlp.vocab)
    +    assert len(matcher) == 0
    +    matcher.add('OBAMA', None, nlp(u"Barack Obama"))
    +    assert len(matcher) == 1
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell int
    +        +cell The number of rules.
    +
    ++h(2, "contains") PhraseMatcher.__contains__
    +    +tag method
    +
    +p Check whether the matcher contains rules for a match ID.
    +
    ++aside-code("Example").
    +    matcher = PhraseMatcher(nlp.vocab)
    +    assert len(matcher) == 0
    +    matcher.add('OBAMA', None, nlp(u"Barack Obama"))
    +    assert len(matcher) == 1
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code key]
    +        +cell unicode
    +        +cell The match ID.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell int
    +        +cell Whether the matcher contains rules for this match ID.
    +
    ++h(2, "add") PhraseMatcher.add
    +    +tag method
    +
    +p
    +    |  Add a rule to the matcher, consisting of an ID key, one or more patterns, and
    +    |  a callback function to act on the matches. The callback function will
    +    |  receive the arguments #[code matcher], #[code doc], #[code i] and
    +    |  #[code matches]. If a pattern already exists for the given ID, the
    +    |  patterns will be extended. An #[code on_match] callback will be
    +    |  overwritten.
    +
    ++aside-code("Example").
    +    def on_match(matcher, doc, id, matches):
    +        print('Matched!', matches)
    +
    +    matcher = PhraseMatcher(nlp.vocab)
    +    matcher.add('OBAMA', on_match, nlp(u"Barack Obama"))
    +    matcher.add('HEALTH', on_match, nlp(u"health care reform"),
    +                                    nlp(u"healthcare reform"))
    +    doc = nlp(u"Barack Obama urges Congress to find courage to defend his healthcare reforms")
    +    matches = matcher(doc)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code match_id]
    +        +cell unicode
    +        +cell An ID for the thing you're matching.
    +
    +    +row
    +        +cell #[code on_match]
    +        +cell callable or #[code None]
    +        +cell
    +            |  Callback function to act on matches. Takes the arguments
    +            |  #[code matcher], #[code doc], #[code i] and #[code matches].
    +
    +    +row
    +        +cell #[code *docs]
    +        +cell list
    +        +cell
    +            |  #[code Doc] objects of the phrases to match.
    diff --git a/website/api/pipe.jade b/website/api/pipe.jade
    new file mode 100644
    index 000000000..66bdbcc62
    --- /dev/null
    +++ b/website/api/pipe.jade
    @@ -0,0 +1,390 @@
    +//- 💫 DOCS > API > PIPE
    +
    +include ../_includes/_mixins
    +
    +//- This page can be used as a template for all other classes that inherit
    +//-  from `Pipe`.
    +
    +if subclass
    +    +infobox
    +        |  This class is a subclass of #[+api("pipe") #[code Pipe]] and
    +        |  follows the same API. The pipeline component is available in the
    +        |  #[+a("/usage/processing-pipelines") processing pipeline] via the ID
    +        |  #[code "#{pipeline_id}"].
    +
    +else
    +    p
    +        |  This class is not instantiated directly. Components inherit from it,
    +        |  and it defines the interface that components should follow to
    +        |  function as components in a spaCy analysis pipeline.
    +
    +- CLASSNAME = subclass || 'Pipe'
    +- VARNAME = short || CLASSNAME.toLowerCase()
    +
    +
    ++h(2, "model") #{CLASSNAME}.Model
    +    +tag classmethod
    +
    +p
    +    |  Initialise a model for the pipe. The model should implement the
    +    |  #[code thinc.neural.Model] API. Wrappers are available for
    +    |  #[+a("/usage/deep-learning") most major machine learning libraries].
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code **kwargs]
    +        +cell -
    +        +cell Parameters for initialising the model
    +
    +    +row("foot")
    +        +cell returns
    +        +cell object
    +        +cell The initialised model.
    +
    ++h(2, "init") #{CLASSNAME}.__init__
    +    +tag method
    +
    +p Create a new pipeline instance.
    +
    ++aside-code("Example").
    +    from spacy.pipeline import #{CLASSNAME}
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code vocab]
    +        +cell #[code Vocab]
    +        +cell The shared vocabulary.
    +
    +    +row
    +        +cell #[code model]
    +        +cell #[code thinc.neural.Model] or #[code True]
    +        +cell
    +            |  The model powering the pipeline component. If no model is
    +            |  supplied, the model is created when you call
    +            |  #[code begin_training], #[code from_disk] or #[code from_bytes].
    +
    +    +row
    +        +cell #[code **cfg]
    +        +cell -
    +        +cell Configuration parameters.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code=CLASSNAME]
    +        +cell The newly constructed object.
    +
    ++h(2, "call") #{CLASSNAME}.__call__
    +    +tag method
    +
    +p
    +    |  Apply the pipe to one document. The document is modified in place, and
    +    |  returned. Both #[code #{CLASSNAME}.__call__] and
    +    |  #[code #{CLASSNAME}.pipe] should delegate to the
    +    |  #[code #{CLASSNAME}.predict] and #[code #{CLASSNAME}.set_annotations]
    +    |  methods.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    doc = nlp(u"This is a sentence.")
    +    processed = #{VARNAME}(doc)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code doc]
    +        +cell #[code Doc]
    +        +cell The document to process.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Doc]
    +        +cell The processed document.
    +
    ++h(2, "pipe") #{CLASSNAME}.pipe
    +    +tag method
    +
    +p
    +    |  Apply the pipe to a stream of documents. Both
    +    |  #[code #{CLASSNAME}.__call__] and #[code #{CLASSNAME}.pipe] should
    +    |  delegate to the #[code #{CLASSNAME}.predict] and
    +    |  #[code #{CLASSNAME}.set_annotations] methods.
    +
    ++aside-code("Example").
    +    texts = [u'One doc', u'...', u'Lots of docs']
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    for doc in #{VARNAME}.pipe(texts, batch_size=50):
    +        pass
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code stream]
    +        +cell iterable
    +        +cell A stream of documents.
    +
    +    +row
    +        +cell #[code batch_size]
    +        +cell int
    +        +cell The number of texts to buffer. Defaults to #[code 128].
    +
    +    +row
    +        +cell #[code n_threads]
    +        +cell int
    +        +cell
    +            |  The number of worker threads to use. If #[code -1], OpenMP will
    +            |  decide how many to use at run time. Default is #[code -1].
    +
    +    +row("foot")
    +        +cell yields
    +        +cell #[code Doc]
    +        +cell Processed documents in the order of the original text.
    +
    ++h(2, "predict") #{CLASSNAME}.predict
    +    +tag method
    +
    +p
    +    |  Apply the pipeline's model to a batch of docs, without modifying them.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    scores = #{VARNAME}.predict([doc1, doc2])
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code docs]
    +        +cell iterable
    +        +cell The documents to predict.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell -
    +        +cell Scores from the model.
    +
    ++h(2, "set_annotations") #{CLASSNAME}.set_annotations
    +    +tag method
    +
    +p
    +    |  Modify a batch of documents, using pre-computed scores.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    scores = #{VARNAME}.predict([doc1, doc2])
    +    #{VARNAME}.set_annotations([doc1, doc2], scores)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code docs]
    +        +cell iterable
    +        +cell The documents to modify.
    +
    +    +row
    +        +cell #[code scores]
    +        +cell -
    +        +cell The scores to set, produced by #[code #{CLASSNAME}.predict].
    +
    ++h(2, "update") #{CLASSNAME}.update
    +    +tag method
    +
    +p
    +    |  Learn from a batch of documents and gold-standard information, updating
    +    |  the pipe's model. Delegates to #[code #{CLASSNAME}.predict] and
    +    |  #[code #{CLASSNAME}.get_loss].
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    losses = {}
    +    optimizer = nlp.begin_training()
    +    #{VARNAME}.update([doc1, doc2], [gold1, gold2], losses=losses, sgd=optimizer)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code docs]
    +        +cell iterable
    +        +cell A batch of documents to learn from.
    +
    +    +row
    +        +cell #[code golds]
    +        +cell iterable
    +        +cell The gold-standard data. Must have the same length as #[code docs].
    +
    +    +row
    +        +cell #[code drop]
    +        +cell int
    +        +cell The dropout rate.
    +
    +    +row
    +        +cell #[code sgd]
    +        +cell callable
    +        +cell
    +            |  The optimizer. Should take two arguments #[code weights] and
    +            |  #[code gradient], and an optional ID.
    +
    +    +row
    +        +cell #[code losses]
    +        +cell dict
    +        +cell
    +            |  Optional record of the loss during training. The value keyed by
    +            |  the model's name is updated.
    +
    ++h(2, "get_loss") #{CLASSNAME}.get_loss
    +    +tag method
    +
    +p
    +    |  Find the loss and gradient of loss for the batch of documents and their
    +    |  predicted scores.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    scores = #{VARNAME}.predict([doc1, doc2])
    +    loss, d_loss = #{VARNAME}.get_loss([doc1, doc2], [gold1, gold2], scores)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code docs]
    +        +cell iterable
    +        +cell The batch of documents.
    +
    +    +row
    +        +cell #[code golds]
    +        +cell iterable
    +        +cell The gold-standard data. Must have the same length as #[code docs].
    +
    +    +row
    +        +cell #[code scores]
    +        +cell -
    +        +cell Scores representing the model's predictions.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell tuple
    +        +cell The loss and the gradient, i.e. #[code (loss, gradient)].
    +
    ++h(2, "begin_training") #{CLASSNAME}.begin_training
    +    +tag method
    +
    +p
    +    |  Initialize the pipe for training, using data exampes if available. If no
    +    |  model has been initialized yet, the model is added.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    nlp.pipeline.append(#{VARNAME})
    +    #{VARNAME}.begin_training(pipeline=nlp.pipeline)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code gold_tuples]
    +        +cell iterable
    +        +cell
    +            |  Optional gold-standard annotations from which to construct
    +            |  #[+api("goldparse") #[code GoldParse]] objects.
    +
    +    +row
    +        +cell #[code pipeline]
    +        +cell list
    +        +cell
    +            |  Optional list of #[+api("pipe") #[code Pipe]] components that
    +            |  this component is part of.
    +
    ++h(2, "use_params") #{CLASSNAME}.use_params
    +    +tag method
    +    +tag contextmanager
    +
    +p Modify the pipe's model, to use the given parameter values.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    with #{VARNAME}.use_params():
    +        #{VARNAME}.to_disk('/best_model')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code params]
    +        +cell -
    +        +cell
    +            |  The parameter values to use in the model. At the end of the
    +            |  context, the original parameters are restored.
    +
    ++h(2, "to_disk") #{CLASSNAME}.to_disk
    +    +tag method
    +
    +p Serialize the pipe to disk.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    #{VARNAME}.to_disk('/path/to/#{VARNAME}')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code path]
    +        +cell unicode or #[code Path]
    +        +cell
    +            |  A path to a directory, which will be created if it doesn't exist.
    +            |  Paths may be either strings or #[code Path]-like objects.
    +
    ++h(2, "from_disk") #{CLASSNAME}.from_disk
    +    +tag method
    +
    +p Load the pipe from disk. Modifies the object in place and returns it.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    #{VARNAME}.from_disk('/path/to/#{VARNAME}')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code path]
    +        +cell unicode or #[code Path]
    +        +cell
    +            |  A path to a directory. Paths may be either strings or
    +            |  #[code Path]-like objects.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code=CLASSNAME]
    +        +cell The modified #[code=CLASSNAME] object.
    +
    ++h(2, "to_bytes") #{CLASSNAME}.to_bytes
    +    +tag method
    +
    ++aside-code("example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    #{VARNAME}_bytes = #{VARNAME}.to_bytes()
    +
    +p Serialize the pipe to a bytestring.
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code **exclude]
    +        +cell -
    +        +cell Named attributes to prevent from being serialized.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bytes
    +        +cell The serialized form of the #[code=CLASSNAME] object.
    +
    ++h(2, "from_bytes") #{CLASSNAME}.from_bytes
    +    +tag method
    +
    +p Load the pipe from a bytestring. Modifies the object in place and returns it.
    +
    ++aside-code("Example").
    +    #{VARNAME}_bytes = #{VARNAME}.to_bytes()
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    #{VARNAME}.from_bytes(#{VARNAME}_bytes)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code bytes_data]
    +        +cell bytes
    +        +cell The data to load from.
    +
    +    +row
    +        +cell #[code **exclude]
    +        +cell -
    +        +cell Named attributes to prevent from being loaded.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code=CLASSNAME]
    +        +cell The #[code=CLASSNAME] object.
    diff --git a/website/docs/api/span.jade b/website/api/span.jade
    similarity index 97%
    rename from website/docs/api/span.jade
    rename to website/api/span.jade
    index 72821ab04..067e709f0 100644
    --- a/website/docs/api/span.jade
    +++ b/website/api/span.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > API > SPAN
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p A slice from a #[+api("doc") #[code Doc]] object.
     
    @@ -40,7 +40,7 @@ p Create a Span object from the #[code slice doc[start : end]].
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A meaning representation of the span.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Span]
             +cell The newly constructed object.
    @@ -61,7 +61,7 @@ p Get a #[code Token] object.
             +cell int
             +cell The index of the token within the span.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell The token at #[code span[i]].
    @@ -79,7 +79,7 @@ p Get a #[code Span] object.
             +cell tuple
             +cell The slice of the span to get.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Span]
             +cell The span at #[code span[start : end]].
    @@ -95,7 +95,7 @@ p Iterate over #[code Token] objects.
         assert [t.text for t in span] == ['it', 'back', '!']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell A #[code Token] object.
    @@ -111,7 +111,7 @@ p Get the number of tokens in the span.
         assert len(span) == 3
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The number of tokens in the span.
    @@ -140,7 +140,7 @@ p
                 |  The object to compare with. By default, accepts #[code Doc],
                 |  #[code Span], #[code Token] and #[code Lexeme] objects.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell float
             +cell A scalar similarity score. Higher is more similar.
    @@ -167,7 +167,7 @@ p
             +cell list
             +cell A list of attribute ID ints.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[long, ndim=2]]
             +cell
    @@ -194,7 +194,7 @@ p Retokenize the document, such that the span is merged into a single token.
                 |  Attributes to assign to the merged token. By default, attributes
                 |  are inherited from the syntactic root token of the span.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell The newly merged token.
    @@ -216,7 +216,7 @@ p
         assert new_york.root.text == 'York'
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell The root token.
    @@ -233,7 +233,7 @@ p Tokens that are to the left of the span, whose head is within the span.
         assert lefts == [u'New']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell A left-child of a token of the span.
    @@ -250,7 +250,7 @@ p Tokens that are to the right of the span, whose head is within the span.
         assert rights == [u'in']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell A right-child of a token of the span.
    @@ -267,7 +267,7 @@ p Tokens that descend from tokens in the span, but fall outside it.
         assert subtree == [u'Give', u'it', u'back', u'!']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell A descendant of a token within the span.
    @@ -285,7 +285,7 @@ p
         assert doc[1:].has_vector
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether the span has a vector data attached.
    @@ -304,7 +304,7 @@ p
         assert doc[1:].vector.shape == (300,)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A 1D numpy array representing the span's semantics.
    @@ -323,7 +323,7 @@ p
         assert doc[1:].vector_norm != doc[2:].vector_norm
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell float
             +cell The L2 norm of the vector representation.
    diff --git a/website/docs/api/stringstore.jade b/website/api/stringstore.jade
    similarity index 96%
    rename from website/docs/api/stringstore.jade
    rename to website/api/stringstore.jade
    index c17fb1db9..9d03404cc 100644
    --- a/website/docs/api/stringstore.jade
    +++ b/website/api/stringstore.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > API > STRINGSTORE
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p
         |  Look up strings by 64-bit hashes. As of v2.0, spaCy uses hash values
    @@ -23,7 +23,7 @@ p
             +cell iterable
             +cell A sequence of unicode strings to add to the store.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code StringStore]
             +cell The newly constructed object.
    @@ -38,7 +38,7 @@ p Get the number of strings in the store.
         assert len(stringstore) == 2
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The number of strings in the store.
    @@ -60,7 +60,7 @@ p Retrieve a string from a given hash, or vice versa.
             +cell bytes, unicode or uint64
             +cell The value to encode.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell unicode or int
             +cell The value to be retrieved.
    @@ -81,7 +81,7 @@ p Check whether a string is in the store.
             +cell unicode
             +cell The string to check.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether the store contains the string.
    @@ -100,7 +100,7 @@ p
         assert all_strings == [u'apple', u'orange']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell unicode
             +cell A string in the store.
    @@ -125,7 +125,7 @@ p Add a string to the #[code StringStore].
             +cell unicode
             +cell The string to add.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell uint64
             +cell The string's hash value.
    @@ -166,7 +166,7 @@ p Loads state from a directory. Modifies the object in place and returns it.
                 |  A path to a directory. Paths may be either strings or
                 |  #[code Path]-like objects.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code StringStore]
             +cell The modified #[code StringStore] object.
    @@ -185,7 +185,7 @@ p Serialize the current state to a binary string.
             +cell -
             +cell Named attributes to prevent from being serialized.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bytes
             +cell The serialized form of the #[code StringStore] object.
    @@ -211,7 +211,7 @@ p Load state from a binary string.
             +cell -
             +cell Named attributes to prevent from being loaded.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code StringStore]
             +cell The #[code StringStore] object.
    @@ -233,7 +233,7 @@ p Get a 64-bit hash for a given string.
             +cell unicode
             +cell The string to hash.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell uint64
             +cell The hash.
    diff --git a/website/api/tagger.jade b/website/api/tagger.jade
    new file mode 100644
    index 000000000..4c8ce916f
    --- /dev/null
    +++ b/website/api/tagger.jade
    @@ -0,0 +1,5 @@
    +//- 💫 DOCS > API > TAGGER
    +
    +include ../_includes/_mixins
    +
    +!=partial("pipe", { subclass: "Tagger", pipeline_id: "tagger" })
    diff --git a/website/api/tensorizer.jade b/website/api/tensorizer.jade
    new file mode 100644
    index 000000000..b54e20514
    --- /dev/null
    +++ b/website/api/tensorizer.jade
    @@ -0,0 +1,5 @@
    +//- 💫 DOCS > API > TENSORIZER
    +
    +include ../_includes/_mixins
    +
    +!=partial("pipe", { subclass: "Tensorizer", pipeline_id: "tensorizer" })
    diff --git a/website/api/textcategorizer.jade b/website/api/textcategorizer.jade
    new file mode 100644
    index 000000000..2d550f699
    --- /dev/null
    +++ b/website/api/textcategorizer.jade
    @@ -0,0 +1,19 @@
    +//- 💫 DOCS > API > TEXTCATEGORIZER
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  The model supports classification with multiple, non-mutually exclusive
    +    |  labels. You can change the model architecture rather easily, but by
    +    |  default, the #[code TextCategorizer] class uses a convolutional
    +    |  neural network to assign position-sensitive vectors to each word in the
    +    |  document. This step is similar to the #[+api("tensorizer") #[code Tensorizer]]
    +    |  component, but the #[code TextCategorizer] uses its own CNN model, to
    +    |  avoid sharing weights with the other pipeline components. The document
    +    |  tensor is then
    +    |  summarized by concatenating max and mean pooling, and a multilayer
    +    |  perceptron is used to predict an output vector of length #[code nr_class],
    +    |  before a logistic activation is applied elementwise. The value of each
    +    |  output neuron is the probability that some class is present.
    +
    +!=partial("pipe", { subclass: "TextCategorizer", short: "textcat", pipeline_id: "textcat" })
    diff --git a/website/docs/api/token.jade b/website/api/token.jade
    similarity index 96%
    rename from website/docs/api/token.jade
    rename to website/api/token.jade
    index db445d09b..4eebc262c 100644
    --- a/website/docs/api/token.jade
    +++ b/website/api/token.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > API > TOKEN
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p An individual token — i.e. a word, punctuation symbol, whitespace, etc.
     
    @@ -30,7 +30,7 @@ p Construct a #[code Token] object.
             +cell int
             +cell The index of the token within the document.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell The newly constructed object.
    @@ -46,7 +46,7 @@ p The number of unicode characters in the token, i.e. #[code token.text].
         assert len(token) == 4
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The number of unicode characters in the token.
    @@ -68,7 +68,7 @@ p Check the value of a boolean flag.
             +cell int
             +cell The attribute ID of the flag to check.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether the flag is set.
    @@ -93,7 +93,7 @@ p Compute a semantic similarity estimate. Defaults to cosine over vectors.
                 |  The object to compare with. By default, accepts #[code Doc],
                 |  #[code Span], #[code Token] and #[code Lexeme] objects.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell float
             +cell A scalar similarity score. Higher is more similar.
    @@ -114,7 +114,7 @@ p Get a neighboring token.
             +cell int
             +cell The relative position of the token to get. Defaults to #[code 1].
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell The token at position #[code self.doc[self.i+i]].
    @@ -139,7 +139,7 @@ p
             +cell #[code Token]
             +cell Another token.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether this token is the ancestor of the descendant.
    @@ -158,7 +158,7 @@ p The rightmost token of this token's syntactic descendants.
         assert [t.text for t in he_ancestors] == [u'pleaded']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell
    @@ -177,7 +177,7 @@ p A sequence of coordinated tokens, including the token itself.
         assert [t.text for t in apples_conjuncts] == [u'oranges']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell A coordinated token.
    @@ -194,7 +194,7 @@ p A sequence of the token's immediate syntactic children.
         assert [t.text for t in give_children] == [u'it', u'back', u'!']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell A child token such that #[code child.head==self].
    @@ -211,7 +211,7 @@ p A sequence of all the token's syntactic descendents.
         assert [t.text for t in give_subtree] == [u'Give', u'it', u'back', u'!']
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Token]
             +cell A descendant token such that #[code self.is_ancestor(descendant)].
    @@ -230,7 +230,7 @@ p
         assert apples.has_vector
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether the token has a vector data attached.
    @@ -248,7 +248,7 @@ p A real-valued meaning representation.
         assert apples.vector.shape == (300,)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A 1D numpy array representing the token's semantics.
    @@ -268,7 +268,7 @@ p The L2 norm of the token's vector representation.
         assert apples.vector_norm != pasta.vector_norm
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell float
             +cell The L2 norm of the vector representation.
    @@ -280,20 +280,29 @@ p The L2 norm of the token's vector representation.
             +cell #[code text]
             +cell unicode
             +cell Verbatim text content.
    +
         +row
             +cell #[code text_with_ws]
             +cell unicode
             +cell Text content, with trailing space character if present.
     
    -    +row
    -        +cell #[code whitespace]
    -        +cell int
    -        +cell Trailing space character if present.
         +row
             +cell #[code whitespace_]
             +cell unicode
             +cell Trailing space character if present.
     
    +    +row
    +        +cell #[code orth]
    +        +cell int
    +        +cell ID of the verbatim text content.
    +
    +    +row
    +        +cell #[code orth_]
    +        +cell unicode
    +        +cell
    +            |  Verbatim text content (identical to #[code Token.text]). Existst
    +            |  mostly for consistency with the other attributes.
    +
         +row
             +cell #[code vocab]
             +cell #[code Vocab]
    diff --git a/website/docs/api/tokenizer.jade b/website/api/tokenizer.jade
    similarity index 96%
    rename from website/docs/api/tokenizer.jade
    rename to website/api/tokenizer.jade
    index 196f886b7..7a8a34838 100644
    --- a/website/docs/api/tokenizer.jade
    +++ b/website/api/tokenizer.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > API > TOKENIZER
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p
         |  Segment text, and create #[code Doc] objects with the discovered segment
    @@ -57,7 +57,7 @@ p Create a #[code Tokenizer], to create #[code Doc] objects given unicode text.
             +cell callable
             +cell A boolean function matching strings to be recognised as tokens.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Tokenizer]
             +cell The newly constructed object.
    @@ -77,7 +77,7 @@ p Tokenize a string.
             +cell unicode
             +cell The string to tokenize.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell A container for linguistic annotations.
    @@ -110,7 +110,7 @@ p Tokenize a stream of texts.
                 |  The number of threads to use, if the implementation supports
                 |  multi-threading. The default tokenizer is single-threaded.
     
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Doc]
             +cell A sequence of Doc objects, in order.
    @@ -126,7 +126,7 @@ p Find internal split points of the string.
             +cell unicode
             +cell The string to split.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell list
             +cell
    @@ -147,7 +147,7 @@ p
             +cell unicode
             +cell The string to segment.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The length of the prefix if present, otherwise #[code None].
    @@ -165,7 +165,7 @@ p
             +cell unicode
             +cell The string to segment.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int / #[code None]
             +cell The length of the suffix if present, otherwise #[code None].
    @@ -176,7 +176,7 @@ p
     p
         |  Add a special-case tokenization rule. This mechanism is also used to add
         |  custom tokenizer exceptions to the language data. See the usage guide
    -    |  on #[+a("/docs/usage/adding-languages#tokenizer-exceptions") adding languages]
    +    |  on #[+a("/usage/adding-languages#tokenizer-exceptions") adding languages]
         |  for more details and examples.
     
     +aside-code("Example").
    diff --git a/website/api/top-level.jade b/website/api/top-level.jade
    new file mode 100644
    index 000000000..46d2e8750
    --- /dev/null
    +++ b/website/api/top-level.jade
    @@ -0,0 +1,24 @@
    +//- 💫 DOCS > API > TOP-LEVEL
    +
    +include ../_includes/_mixins
    +
    ++section("spacy")
    +    //-+h(2, "spacy") spaCy
    +    //- spacy/__init__.py
    +    include _top-level/_spacy
    +
    ++section("displacy")
    +    +h(2, "displacy", "spacy/displacy") displaCy
    +    include _top-level/_displacy
    +
    ++section("util")
    +    +h(2, "util", "spacy/util.py") Utility functions
    +    include _top-level/_util
    +
    ++section("compat")
    +    +h(2, "compat", "spacy/compaty.py") Compatibility functions
    +    include _top-level/_compat
    +
    ++section("cli", "spacy/cli")
    +    +h(2, "cli") Command line
    +    include _top-level/_cli
    diff --git a/website/api/vectors.jade b/website/api/vectors.jade
    new file mode 100644
    index 000000000..a58736506
    --- /dev/null
    +++ b/website/api/vectors.jade
    @@ -0,0 +1,333 @@
    +//- 💫 DOCS > API > VECTORS
    +
    +include ../_includes/_mixins
    +
    +p
    +    |  Vectors data is kept in the #[code Vectors.data] attribute, which should
    +    |  be an instance of #[code numpy.ndarray] (for CPU vectors) or
    +    |  #[code cupy.ndarray] (for GPU vectors).
    +
    ++h(2, "init") Vectors.__init__
    +    +tag method
    +
    +p
    +    |  Create a new vector store. To keep the vector table empty, pass
    +    |  #[code data_or_width=0]. You can also create the vector table and add
    +    |  vectors one by one, or set the vector values directly on initialisation.
    +
    ++aside-code("Example").
    +    from spacy.vectors import Vectors
    +    from spacy.strings import StringStore
    +
    +    empty_vectors = Vectors(StringStore())
    +
    +    vectors = Vectors([u'cat'], 300)
    +    vectors[u'cat'] = numpy.random.uniform(-1, 1, (300,))
    +
    +    vector_table = numpy.zeros((3, 300), dtype='f')
    +    vectors = Vectors(StringStore(), vector_table)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code strings]
    +        +cell #[code StringStore] or list
    +        +cell
    +            |  List of strings, or a #[+api("stringstore") #[code StringStore]]
    +            |  that maps strings to hash values, and vice versa.
    +
    +    +row
    +        +cell #[code data_or_width]
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] or int
    +        +cell Vector data or number of dimensions.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Vectors]
    +        +cell The newly created object.
    +
    ++h(2, "getitem") Vectors.__getitem__
    +    +tag method
    +
    +p
    +    |  Get a vector by key. If key is a string, it is hashed to an integer ID
    +    |  using the #[code Vectors.strings] table. If the integer key is not found
    +    |  in the table, a #[code KeyError] is raised.
    +
    ++aside-code("Example").
    +    vectors = Vectors(StringStore(), 300)
    +    vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,)))
    +    cat_vector = vectors[u'cat']
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code key]
    +        +cell unicode / int
    +        +cell The key to get the vector for.
    +
    +    +row
    +        +cell returns
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +        +cell The vector for the key.
    +
    ++h(2, "setitem") Vectors.__setitem__
    +    +tag method
    +
    +p
    +    |  Set a vector for the given key. If key is a string, it is hashed to an
    +    |  integer ID using the #[code Vectors.strings] table.
    +
    ++aside-code("Example").
    +    vectors = Vectors(StringStore(), 300)
    +    vectors[u'cat'] = numpy.random.uniform(-1, 1, (300,))
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code key]
    +        +cell unicode / int
    +        +cell The key to set the vector for.
    +
    +    +row
    +        +cell #[code vector]
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +        +cell The vector to set.
    +
    ++h(2, "iter") Vectors.__iter__
    +    +tag method
    +
    +p Yield vectors from the table.
    +
    ++aside-code("Example").
    +    vector_table = numpy.zeros((3, 300), dtype='f')
    +    vectors = Vectors(StringStore(), vector_table)
    +    for vector in vectors:
    +        print(vector)
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell yields
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +        +cell A vector from the table.
    +
    ++h(2, "len") Vectors.__len__
    +    +tag method
    +
    +p Return the number of vectors that have been assigned.
    +
    ++aside-code("Example").
    +    vector_table = numpy.zeros((3, 300), dtype='f')
    +    vectors = Vectors(StringStore(), vector_table)
    +    assert len(vectors) == 3
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell int
    +        +cell The number of vectors in the data.
    +
    ++h(2, "contains") Vectors.__contains__
    +    +tag method
    +
    +p
    +    |  Check whether a key has a vector entry in the table. If key is a string,
    +    |  it is hashed to an integer ID using the #[code Vectors.strings] table.
    +
    ++aside-code("Example").
    +    vectors = Vectors(StringStore(), 300)
    +    vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,)))
    +    assert u'cat' in vectors
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code key]
    +        +cell unicode / int
    +        +cell The key to check.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell Whether the key has a vector entry.
    +
    ++h(2, "add") Vectors.add
    +    +tag method
    +
    +p
    +    |  Add a key to the table, optionally setting a vector value as well. If
    +    |  key is a string, it is hashed to an integer ID using the
    +    |  #[code Vectors.strings] table.
    +
    ++aside-code("Example").
    +    vectors = Vectors(StringStore(), 300)
    +    vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,)))
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code key]
    +        +cell unicode / int
    +        +cell The key to add.
    +
    +    +row
    +        +cell #[code vector]
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +        +cell An optional vector to add.
    +
    ++h(2, "items") Vectors.items
    +    +tag method
    +
    +p Iterate over #[code (string key, vector)] pairs, in order.
    +
    ++aside-code("Example").
    +    vectors = Vectors(StringStore(), 300)
    +    vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,)))
    +    for key, vector in vectors.items():
    +        print(key, vector)
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell yields
    +        +cell tuple
    +        +cell #[code (string key, vector)] pairs, in order.
    +
    ++h(2, "shape") Vectors.shape
    +    +tag property
    +
    +p
    +    |  Get #[code (rows, dims)] tuples of number of rows and number of
    +    |  dimensions in the vector table.
    +
    ++aside-code("Example").
    +    vectors = Vectors(StringStore(), 300)
    +    vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,)))
    +    rows, dims = vectors.shape
    +    assert rows == 1
    +    assert dims == 300
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell tuple
    +        +cell #[code (rows, dims)] pairs.
    +
    ++h(2, "from_glove") Vectors.from_glove
    +    +tag method
    +
    +p
    +    |  Load #[+a("https://nlp.stanford.edu/projects/glove/") GloVe] vectors from
    +    |  a directory. Assumes binary format, that the vocab is in a
    +    |  #[code vocab.txt], and that vectors are named
    +    |  #[code vectors.{size}.[fd].bin], e.g. #[code vectors.128.f.bin] for 128d
    +    |  float32 vectors, #[code vectors.300.d.bin] for 300d float64 (double)
    +    |  vectors, etc. By default GloVe outputs 64-bit vectors.
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code path]
    +        +cell unicode / #[code Path]
    +        +cell The path to load the GloVe vectors from.
    +
    ++h(2, "to_disk") Vectors.to_disk
    +    +tag method
    +
    +p Save the current state to a directory.
    +
    ++aside-code("Example").
    +    vectors.to_disk('/path/to/vectors')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code path]
    +        +cell unicode or #[code Path]
    +        +cell
    +            |  A path to a directory, which will be created if it doesn't exist.
    +            |  Paths may be either strings or #[code Path]-like objects.
    +
    ++h(2, "from_disk") Vectors.from_disk
    +    +tag method
    +
    +p Loads state from a directory. Modifies the object in place and returns it.
    +
    ++aside-code("Example").
    +    vectors = Vectors(StringStore())
    +    vectors.from_disk('/path/to/vectors')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code path]
    +        +cell unicode or #[code Path]
    +        +cell
    +            |  A path to a directory. Paths may be either strings or
    +            |  #[code Path]-like objects.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Vectors]
    +        +cell The modified #[code Vectors] object.
    +
    ++h(2, "to_bytes") Vectors.to_bytes
    +    +tag method
    +
    +p Serialize the current state to a binary string.
    +
    ++aside-code("Example").
    +    vectors_bytes = vectors.to_bytes()
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code **exclude]
    +        +cell -
    +        +cell Named attributes to prevent from being serialized.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bytes
    +        +cell The serialized form of the #[code Vectors] object.
    +
    ++h(2, "from_bytes") Vectors.from_bytes
    +    +tag method
    +
    +p Load state from a binary string.
    +
    ++aside-code("Example").
    +    fron spacy.vectors import Vectors
    +    vectors_bytes = vectors.to_bytes()
    +    new_vectors = Vectors(StringStore())
    +    new_vectors.from_bytes(vectors_bytes)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code bytes_data]
    +        +cell bytes
    +        +cell The data to load from.
    +
    +    +row
    +        +cell #[code **exclude]
    +        +cell -
    +        +cell Named attributes to prevent from being loaded.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Vectors]
    +        +cell The #[code Vectors] object.
    +
    ++h(2, "attributes") Attributes
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code data]
    +        +cell #[code numpy.ndarray] / #[code cupy.ndarray]
    +        +cell
    +            |  Stored vectors data. #[code numpy] is used for CPU vectors,
    +            |  #[code cupy] for GPU vectors.
    +
    +    +row
    +        +cell #[code key2row]
    +        +cell dict
    +        +cell
    +            |  Dictionary mapping word hashes to rows in the
    +            |  #[code Vectors.data] table.
    +
    +    +row
    +        +cell #[code keys]
    +        +cell #[code numpy.ndarray]
    +        +cell
    +            |  Array keeping the keys in order, such that
    +            |  #[code keys[vectors.key2row[key]] == key]
    diff --git a/website/docs/api/vocab.jade b/website/api/vocab.jade
    similarity index 66%
    rename from website/docs/api/vocab.jade
    rename to website/api/vocab.jade
    index 4d3e0828a..6faefc064 100644
    --- a/website/docs/api/vocab.jade
    +++ b/website/api/vocab.jade
    @@ -1,17 +1,22 @@
     //- 💫 DOCS > API > VOCAB
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p
    -    |  A lookup table that allows you to access #[code Lexeme] objects. The
    -    |  #[code Vocab] instance also provides access to the #[code StringStore],
    -    |  and owns underlying C-data that is shared between #[code Doc] objects.
    +    |  The #[code Vocab] object provides a lookup table that allows you to
    +    |  access #[+api("lexeme") #[code Lexeme]] objects, as well as the
    +    |  #[+api("stringstore") #[code StringStore]]. It also owns underlying
    +    |  C-data that is shared between #[code Doc] objects.
     
     +h(2, "init") Vocab.__init__
         +tag method
     
     p Create the vocabulary.
     
    ++aside-code("Example").
    +    from spacy.vocab import Vocab
    +    vocab = Vocab(strings=[u'hello', u'world'])
    +
     +table(["Name", "Type", "Description"])
         +row
             +cell #[code lex_attr_getters]
    @@ -39,7 +44,7 @@ p Create the vocabulary.
                 |  A #[+api("stringstore") #[code StringStore]] that maps
                 |  strings to hash values, and vice versa, or a list of strings.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Vocab]
             +cell The newly constructed object.
    @@ -54,7 +59,7 @@ p Get the current number of lexemes in the vocabulary.
         assert len(nlp.vocab) > 0
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The number of lexems in the vocabulary.
    @@ -76,7 +81,7 @@ p
             +cell int / unicode
             +cell The hash value of a word, or its unicode string.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Lexeme]
             +cell The lexeme indicated by the given ID.
    @@ -90,7 +95,7 @@ p Iterate over the lexemes in the vocabulary.
         stop_words = (lex for lex in nlp.vocab if lex.is_stop)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell #[code Lexeme]
             +cell An entry in the vocabulary.
    @@ -115,7 +120,7 @@ p
             +cell unicode
             +cell The ID string.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bool
             +cell Whether the string has an entry in the vocabulary.
    @@ -152,11 +157,100 @@ p
                 |  which the flag will be stored. If #[code -1], the lowest
                 |  available bit will be chosen.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell int
             +cell The integer ID by which the flag value can be checked.
     
    ++h(2, "add_flag") Vocab.clear_vectors
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Drop the current vector table. Because all vectors must be the same
    +    |  width, you have to call this to change the size of the vectors.
    +
    ++aside-code("Example").
    +    nlp.vocab.clear_vectors(new_dim=300)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code new_dim]
    +        +cell int
    +        +cell
    +            |  Number of dimensions of the new vectors. If #[code None], size
    +            |  is not changed.
    +
    ++h(2, "add_flag") Vocab.get_vector
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Retrieve a vector for a word in the vocabulary. Words can be looked up
    +    |  by string or hash value. If no vectors data is loaded, a
    +    |  #[code ValueError] is raised.
    +
    ++aside-code("Example").
    +    nlp.vocab.get_vector(u'apple')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code orth]
    +        +cell int / unicode
    +        +cell The hash value of a word, or its unicode string.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +        +cell
    +            |  A word vector. Size and shape are determined by the
    +            |  #[code Vocab.vectors] instance.
    +
    ++h(2, "add_flag") Vocab.set_vector
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Set a vector for a word in the vocabulary. Words can be referenced by
    +    |  by string or hash value.
    +
    ++aside-code("Example").
    +    nlp.vocab.set_vector(u'apple', array([...]))
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code orth]
    +        +cell int / unicode
    +        +cell The hash value of a word, or its unicode string.
    +
    +    +row
    +        +cell #[code vector]
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +        +cell The vector to set.
    +
    ++h(2, "add_flag") Vocab.has_vector
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Check whether a word has a vector. Returns #[code False] if no vectors
    +    |  are loaded. Words can be looked up by string or hash value.
    +
    ++aside-code("Example").
    +    if nlp.vocab.has_vector(u'apple'):
    +        vector = nlp.vocab.get_vector(u'apple')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code orth]
    +        +cell int / unicode
    +        +cell The hash value of a word, or its unicode string.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell Whether the word has a vector.
    +
     +h(2, "to_disk") Vocab.to_disk
         +tag method
         +tag-new(2)
    @@ -192,7 +286,7 @@ p Loads state from a directory. Modifies the object in place and returns it.
                 |  A path to a directory. Paths may be either strings or
                 |  #[code Path]-like objects.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Vocab]
             +cell The modified #[code Vocab] object.
    @@ -211,7 +305,7 @@ p Serialize the current state to a binary string.
             +cell -
             +cell Named attributes to prevent from being serialized.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell bytes
             +cell The serialized form of the #[code Vocab] object.
    @@ -238,7 +332,7 @@ p Load state from a binary string.
             +cell -
             +cell Named attributes to prevent from being loaded.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Vocab]
             +cell The #[code Vocab] object.
    @@ -256,3 +350,14 @@ p Load state from a binary string.
             +cell #[code strings]
             +cell #[code StringStore]
             +cell A table managing the string-to-int mapping.
    +
    +    +row
    +        +cell #[code vectors]
    +            +tag-new(2)
    +        +cell #[code Vectors]
    +        +cell A table associating word IDs to word vectors.
    +
    +    +row
    +        +cell #[code vectors_length]
    +        +cell int
    +        +cell Number of dimensions for each word vector.
    diff --git a/website/docs/api/annotation.jade b/website/docs/api/annotation.jade
    deleted file mode 100644
    index ce18878b7..000000000
    --- a/website/docs/api/annotation.jade
    +++ /dev/null
    @@ -1,156 +0,0 @@
    -//- 💫 DOCS > API > ANNOTATION SPECS
    -
    -include ../../_includes/_mixins
    -
    -p This document describes the target annotations spaCy is trained to predict.
    -
    -+h(2, "tokenization") Tokenization
    -
    -p
    -    |  Tokenization standards are based on the
    -    |  #[+a("https://catalog.ldc.upenn.edu/LDC2013T19") OntoNotes 5] corpus.
    -    |  The tokenizer differs from most by including tokens for significant
    -    |  whitespace. Any sequence of whitespace characters beyond a single space
    -    |  (#[code ' ']) is included as a token.
    -
    -+aside-code("Example").
    -    from spacy.lang.en import English
    -    nlp = English()
    -    tokens = nlp('Some\nspaces  and\ttab characters')
    -    tokens_text = [t.text for t in tokens]
    -    assert tokens_text == ['Some', '\n', 'spaces', ' ', 'and',
    -                           '\t', 'tab', 'characters']
    -
    -p
    -    |  The whitespace tokens are useful for much the same reason punctuation is
    -    |  – it's often an important delimiter in the text. By preserving it in the
    -    |  token output, we are able to maintain a simple alignment between the
    -    |  tokens and the original string, and we ensure that no information is
    -    |  lost during processing.
    -
    -+h(2, "sentence-boundary") Sentence boundary detection
    -
    -p
    -    |  Sentence boundaries are calculated from the syntactic parse tree, so
    -    |  features such as punctuation and capitalisation play an important but
    -    |  non-decisive role in determining the sentence boundaries. Usually this
    -    |  means that the sentence boundaries will at least coincide with clause
    -    |  boundaries, even given poorly punctuated text.
    -
    -+h(2, "pos-tagging") Part-of-speech Tagging
    -
    -+aside("Tip: Understanding tags")
    -    |  You can also use #[code spacy.explain()] to get the description for the
    -    |  string representation of a tag. For example,
    -    |  #[code spacy.explain("RB")] will return "adverb".
    -
    -include _annotation/_pos-tags
    -
    -+h(2, "lemmatization") Lemmatization
    -
    -p A "lemma" is the uninflected form of a word. In English, this means:
    -
    -+list
    -    +item #[strong Adjectives]: The form like "happy", not "happier" or "happiest"
    -    +item #[strong Adverbs]: The form like "badly", not "worse" or "worst"
    -    +item #[strong Nouns]: The form like "dog", not "dogs"; like "child", not "children"
    -    +item #[strong Verbs]: The form like "write", not "writes", "writing", "wrote" or "written"
    -
    -p
    -    |  The lemmatization data is taken from
    -    |  #[+a("https://wordnet.princeton.edu") WordNet]. However, we also add a
    -    |  special case for pronouns: all pronouns are lemmatized to the special
    -    |  token #[code -PRON-].
    -
    -+infobox("About spaCy's custom pronoun lemma")
    -    |  Unlike verbs and common nouns, there's no clear base form of a personal
    -    |  pronoun. Should the lemma of "me" be "I", or should we normalize person
    -    |  as well, giving "it" — or maybe "he"? spaCy's solution is to introduce a
    -    |  novel symbol, #[code -PRON-], which is used as the lemma for
    -    |  all personal pronouns.
    -
    -+h(2, "dependency-parsing") Syntactic Dependency Parsing
    -
    -+aside("Tip: Understanding labels")
    -    |  You can also use #[code spacy.explain()] to get the description for the
    -    |  string representation of a label. For example,
    -    |  #[code spacy.explain("prt")] will return "particle".
    -
    -include _annotation/_dep-labels
    -
    -+h(2, "named-entities") Named Entity Recognition
    -
    -+aside("Tip: Understanding entity types")
    -    |  You can also use #[code spacy.explain()] to get the description for the
    -    |  string representation of an entity label. For example,
    -    |  #[code spacy.explain("LANGUAGE")] will return "any named language".
    -
    -include _annotation/_named-entities
    -
    -+h(3, "biluo") BILUO Scheme
    -
    -p
    -    |  spaCy translates character offsets into the BILUO scheme, in order to
    -    |  decide the cost of each action given the current state of the entity
    -    |  recognizer. The costs are then used to calculate the gradient of the
    -    |  loss, to train the model.
    -
    -+aside("Why BILUO, not IOB?")
    -    |  There are several coding schemes for encoding entity annotations as
    -    |  token tags.  These coding schemes are equally expressive, but not
    -    |  necessarily equally learnable.
    -    |  #[+a("http://www.aclweb.org/anthology/W09-1119") Ratinov and Roth]
    -    |  showed that the minimal #[strong Begin], #[strong In], #[strong Out]
    -    |  scheme was more difficult to learn than the #[strong BILUO] scheme that
    -    |  we use, which explicitly marks boundary tokens.
    -
    -+table([ "Tag", "Description" ])
    -    +row
    -        +cell #[code #[span.u-color-theme B] EGIN]
    -        +cell The first token of a multi-token entity.
    -
    -    +row
    -        +cell #[code #[span.u-color-theme I] N]
    -        +cell An inner token of a multi-token entity.
    -
    -    +row
    -        +cell #[code #[span.u-color-theme L] AST]
    -        +cell The final token of a multi-token entity.
    -
    -    +row
    -        +cell #[code #[span.u-color-theme U] NIT]
    -        +cell A single-token entity.
    -
    -    +row
    -        +cell #[code #[span.u-color-theme O] UT]
    -        +cell A non-entity token.
    -
    -+h(2, "json-input") JSON input format for training
    -
    -p
    -    |  spaCy takes training data in the following format:
    -
    -+code("Example structure").
    -    doc: {
    -        id: string,
    -        paragraphs: [{
    -            raw: string,
    -            sents: [int],
    -            tokens: [{
    -                start: int,
    -                tag: string,
    -                head: int,
    -                dep: string
    -            }],
    -            ner: [{
    -                start: int,
    -                end: int,
    -                label: string
    -            }],
    -            brackets: [{
    -                start: int,
    -                end: int,
    -                label: string
    -            }]
    -        }]
    -    }
    diff --git a/website/docs/api/dependencyparser.jade b/website/docs/api/dependencyparser.jade
    deleted file mode 100644
    index a1a7e0b36..000000000
    --- a/website/docs/api/dependencyparser.jade
    +++ /dev/null
    @@ -1,111 +0,0 @@
    -//- 💫 DOCS > API > DEPENDENCYPARSER
    -
    -include ../../_includes/_mixins
    -
    -p Annotate syntactic dependencies on #[code Doc] objects.
    -
    -+under-construction
    -
    -+h(2, "init") DependencyParser.__init__
    -    +tag method
    -
    -p Create a #[code DependencyParser].
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code vocab]
    -        +cell #[code Vocab]
    -        +cell The vocabulary. Must be shared with documents to be processed.
    -
    -    +row
    -        +cell #[code model]
    -        +cell #[thinc.linear.AveragedPerceptron]
    -        +cell The statistical model.
    -
    -    +footrow
    -        +cell returns
    -        +cell #[code DependencyParser]
    -        +cell The newly constructed object.
    -
    -+h(2, "call") DependencyParser.__call__
    -    +tag method
    -
    -p
    -    |  Apply the dependency parser, setting the heads and dependency relations
    -    |  onto the #[code Doc] object.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The document to be processed.
    -
    -    +footrow
    -        +cell returns
    -        +cell #[code None]
    -        +cell -
    -
    -+h(2, "pipe") DependencyParser.pipe
    -    +tag method
    -
    -p Process a stream of documents.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code stream]
    -        +cell -
    -        +cell The sequence of documents to process.
    -
    -    +row
    -        +cell #[code batch_size]
    -        +cell int
    -        +cell The number of documents to accumulate into a working set.
    -
    -    +row
    -        +cell #[code n_threads]
    -        +cell int
    -        +cell
    -            |  The number of threads with which to work on the buffer in
    -            |  parallel.
    -
    -    +footrow
    -        +cell yields
    -        +cell #[code Doc]
    -        +cell Documents, in order.
    -
    -+h(2, "update") DependencyParser.update
    -    +tag method
    -
    -p Update the statistical model.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The example document for the update.
    -
    -    +row
    -        +cell #[code gold]
    -        +cell #[code GoldParse]
    -        +cell The gold-standard annotations, to calculate the loss.
    -
    -    +footrow
    -        +cell returns
    -        +cell int
    -        +cell The loss on this example.
    -
    -+h(2, "step_through") DependencyParser.step_through
    -    +tag method
    -
    -p Set up a stepwise state, to introspect and control the transition sequence.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The document to step through.
    -
    -    +footrow
    -        +cell returns
    -        +cell #[code StepwiseState]
    -        +cell A state object, to step through the annotation process.
    diff --git a/website/docs/api/entityrecognizer.jade b/website/docs/api/entityrecognizer.jade
    deleted file mode 100644
    index e3775b7f4..000000000
    --- a/website/docs/api/entityrecognizer.jade
    +++ /dev/null
    @@ -1,109 +0,0 @@
    -//- 💫 DOCS > API > ENTITYRECOGNIZER
    -
    -include ../../_includes/_mixins
    -
    -p Annotate named entities on #[code Doc] objects.
    -
    -+under-construction
    -
    -+h(2, "init") EntityRecognizer.__init__
    -    +tag method
    -
    -p Create an #[code EntityRecognizer].
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code vocab]
    -        +cell #[code Vocab]
    -        +cell The vocabulary. Must be shared with documents to be processed.
    -
    -    +row
    -        +cell #[code model]
    -        +cell #[thinc.linear.AveragedPerceptron]
    -        +cell The statistical model.
    -
    -    +footrow
    -        +cell returns
    -        +cell #[code EntityRecognizer]
    -        +cell The newly constructed object.
    -
    -+h(2, "call") EntityRecognizer.__call__
    -    +tag method
    -
    -p Apply the entity recognizer, setting the NER tags onto the #[code Doc] object.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The document to be processed.
    -
    -    +footrow
    -        +cell returns
    -        +cell #[code None]
    -        +cell -
    -
    -+h(2, "pipe") EntityRecognizer.pipe
    -    +tag method
    -
    -p Process a stream of documents.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code stream]
    -        +cell -
    -        +cell The sequence of documents to process.
    -
    -    +row
    -        +cell #[code batch_size]
    -        +cell int
    -        +cell The number of documents to accumulate into a working set.
    -
    -    +row
    -        +cell #[code n_threads]
    -        +cell int
    -        +cell
    -            |  The number of threads with which to work on the buffer in
    -            |  parallel.
    -
    -    +footrow
    -        +cell yields
    -        +cell #[code Doc]
    -        +cell Documents, in order.
    -
    -+h(2, "update") EntityRecognizer.update
    -    +tag method
    -
    -p Update the statistical model.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The example document for the update.
    -
    -    +row
    -        +cell #[code gold]
    -        +cell #[code GoldParse]
    -        +cell The gold-standard annotations, to calculate the loss.
    -
    -    +footrow
    -        +cell returns
    -        +cell int
    -        +cell The loss on this example.
    -
    -+h(2, "step_through") EntityRecognizer.step_through
    -    +tag method
    -
    -p Set up a stepwise state, to introspect and control the transition sequence.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The document to step through.
    -
    -    +footrow
    -        +cell returns
    -        +cell #[code StepwiseState]
    -        +cell A state object, to step through the annotation process.
    diff --git a/website/docs/api/index.jade b/website/docs/api/index.jade
    deleted file mode 100644
    index f92080975..000000000
    --- a/website/docs/api/index.jade
    +++ /dev/null
    @@ -1,241 +0,0 @@
    -//- 💫 DOCS > API > FACTS & FIGURES
    -
    -include ../../_includes/_mixins
    -
    -+under-construction
    -
    -+h(2, "comparison") Feature comparison
    -
    -p
    -    |  Here's a quick comparison of the functionalities offered by spaCy,
    -    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet],
    -    |  #[+a("http://www.nltk.org/py-modindex.html") NLTK] and
    -    |  #[+a("http://stanfordnlp.github.io/CoreNLP/") CoreNLP].
    -
    -+table([ "", "spaCy", "SyntaxNet", "NLTK", "CoreNLP"])
    -    +row
    -        +cell Easy installation
    -        each icon in [ "pro", "con", "pro", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Python API
    -        each icon in [ "pro", "con", "pro", "con" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Multi-language support
    -        each icon in [ "neutral", "pro", "pro", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Tokenization
    -        each icon in [ "pro", "pro", "pro", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Part-of-speech tagging
    -        each icon in [ "pro", "pro", "pro", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Sentence segmentation
    -        each icon in [ "pro", "pro", "pro", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Dependency parsing
    -        each icon in [ "pro", "pro", "con", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Entity Recognition
    -        each icon in [ "pro", "con", "pro", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Integrated word vectors
    -        each icon in [ "pro", "con", "con", "con" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Sentiment analysis
    -        each icon in [ "pro", "con", "pro", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Coreference resolution
    -        each icon in [ "con", "con", "con", "pro" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -+h(2, "benchmarks") Benchmarks
    -
    -p
    -    |  Two peer-reviewed papers in 2015 confirm that spaCy offers the
    -    |  #[strong fastest syntactic parser in the world] and that
    -    |  #[strong its accuracy is within 1% of the best] available. The few
    -    |  systems that are more accurate are 20× slower or more.
    -
    -+aside("About the evaluation")
    -    |  The first of the evaluations was published by #[strong Yahoo! Labs] and
    -    |  #[strong Emory University], as part of a survey of current parsing
    -    |  technologies #[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") (Choi et al., 2015)].
    -    |  Their results and subsequent discussions helped us develop a novel
    -    |  psychologically-motivated technique to improve spaCy's accuracy, which
    -    |  we published in joint work with Macquarie University
    -    |  #[+a("https://aclweb.org/anthology/D/D15/D15-1162.pdf") (Honnibal and Johnson, 2015)].
    -
    -+table([ "System", "Language", "Accuracy", "Speed (wps)"])
    -    +row
    -        each data in [ "spaCy", "Cython", "91.8", "13,963" ]
    -            +cell #[strong=data]
    -    +row
    -        each data in [ "ClearNLP", "Java", "91.7", "10,271" ]
    -            +cell=data
    -
    -    +row
    -        each data in [ "CoreNLP", "Java", "89.6", "8,602"]
    -            +cell=data
    -
    -    +row
    -        each data in [ "MATE", "Java", "92.5", "550"]
    -            +cell=data
    -
    -    +row
    -        each data in [ "Turbo", "C++", "92.4", "349" ]
    -            +cell=data
    -
    -+h(3, "parse-accuracy") Parse accuracy
    -
    -p
    -    |  In 2016, Google released their
    -    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet]
    -    |  library, setting a new state of the art for syntactic dependency parsing
    -    |  accuracy. SyntaxNet's algorithm is very similar to spaCy's. The main
    -    |  difference is that SyntaxNet uses a neural network while spaCy uses a
    -    |  sparse linear model.
    -
    -+aside("Methodology")
    -    |  #[+a("http://arxiv.org/abs/1603.06042") Andor et al. (2016)] chose
    -    |  slightly different experimental conditions from
    -    |  #[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") Choi et al. (2015)],
    -    |  so the two accuracy tables here do not present directly comparable
    -    |  figures. We have only evaluated spaCy in the "News" condition following
    -    |  the SyntaxNet methodology. We don't yet have benchmark figures for the
    -    |  "Web" and "Questions" conditions.
    -
    -+table([ "System", "News", "Web", "Questions" ])
    -    +row
    -        +cell spaCy
    -        each data in [ 92.8, "n/a", "n/a" ]
    -            +cell=data
    -
    -    +row
    -        +cell #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") Parsey McParseface]
    -        each data in [ 94.15, 89.08, 94.77 ]
    -            +cell=data
    -
    -    +row
    -        +cell #[+a("http://www.cs.cmu.edu/~ark/TurboParser/") Martins et al. (2013)]
    -        each data in [ 93.10, 88.23, 94.21 ]
    -            +cell=data
    -
    -    +row
    -        +cell #[+a("http://research.google.com/pubs/archive/38148.pdf") Zhang and McDonald (2014)]
    -        each data in [ 93.32, 88.65, 93.37 ]
    -            +cell=data
    -
    -    +row
    -        +cell #[+a("http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43800.pdf") Weiss et al. (2015)]
    -        each data in [ 93.91, 89.29, 94.17 ]
    -            +cell=data
    -
    -    +row
    -        +cell #[strong #[+a("http://arxiv.org/abs/1603.06042") Andor et al. (2016)]]
    -        each data in [ 94.44, 90.17, 95.40 ]
    -            +cell #[strong=data]
    -
    -+h(3, "speed-comparison") Detailed speed comparison
    -
    -p
    -    |  Here we compare the per-document processing time of various spaCy
    -    |  functionalities against other NLP libraries. We show both absolute
    -    |  timings (in ms) and relative performance (normalized to spaCy). Lower is
    -    |  better.
    -
    -+aside("Methodology")
    -    |  #[strong Set up:] 100,000 plain-text documents were streamed from an
    -    |  SQLite3 database, and processed with an NLP library, to one of three
    -    |  levels of detail — tokenization, tagging, or parsing. The tasks are
    -    |  additive: to parse the text you have to tokenize and tag it. The
    -    |  pre-processing was not subtracted from the times — I report the time
    -    |  required for the pipeline to complete. I report mean times per document,
    -    |  in milliseconds.#[br]#[br]
    -    |  #[strong Hardware]: Intel i7-3770 (2012)#[br]
    -    |  #[strong Implementation]: #[+src(gh("spacy-benchmarks")) spacy-benchmarks]
    -
    -+table
    -    +row.u-text-label.u-text-center
    -        th.c-table__head-cell
    -        th.c-table__head-cell(colspan="3") Absolute (ms per doc)
    -        th.c-table__head-cell(colspan="3") Relative (to spaCy)
    -
    -    +row
    -        each column in ["System", "Tokenize", "Tag", "Parse", "Tokenize", "Tag", "Parse"]
    -            th.c-table__head-cell.u-text-label=column
    -
    -    +row
    -        +cell #[strong spaCy]
    -        each data in [ "0.2ms", "1ms", "19ms"]
    -            +cell #[strong=data]
    -
    -        each data in [ "1x", "1x", "1x" ]
    -            +cell=data
    -
    -    +row
    -        each data in [ "CoreNLP", "2ms", "10ms", "49ms", "10x", "10x", "2.6x"]
    -            +cell=data
    -    +row
    -        each data in [ "ZPar", "1ms", "8ms", "850ms", "5x", "8x", "44.7x" ]
    -            +cell=data
    -    +row
    -        each data in [ "NLTK", "4ms", "443ms", "n/a", "20x", "443x", "n/a" ]
    -            +cell=data
    -
    -+h(3, "ner") Named entity comparison
    -
    -p
    -    |  #[+a("https://aclweb.org/anthology/W/W16/W16-2703.pdf") Jiang et al. (2016)]
    -    |  present several detailed comparisons of the named entity recognition
    -    |  models provided by spaCy, CoreNLP, NLTK and LingPipe. Here we show their
    -    |  evaluation of person, location and organization accuracy on Wikipedia.
    -
    -+aside("Methodology")
    -    |  Making a meaningful comparison of different named entity recognition
    -    |  systems is tricky.  Systems are often trained on different data, which
    -    |  usually have slight differences in annotation style. For instance, some
    -    |  corpora include titles as part of person names, while others don't.
    -    |  These trivial differences in convention can distort comparisons
    -    |  significantly. Jiang et al.'s #[em partial overlap] metric goes a long
    -    |  way to solving this problem.
    -
    -+table([ "System", "Precision", "Recall", "F-measure" ])
    -    +row
    -        +cell spaCy
    -        each data in [ 0.7240, 0.6514, 0.6858 ]
    -            +cell=data
    -
    -    +row
    -        +cell #[strong CoreNLP]
    -        each data in [ 0.7914, 0.7327, 0.7609 ]
    -            +cell #[strong=data]
    -
    -    +row
    -        +cell NLTK
    -        each data in [ 0.5136, 0.6532, 0.5750 ]
    -            +cell=data
    -
    -    +row
    -        +cell LingPipe
    -        each data in [ 0.5412, 0.5357, 0.5384 ]
    -            +cell=data
    diff --git a/website/docs/api/language-models.jade b/website/docs/api/language-models.jade
    deleted file mode 100644
    index c6943b410..000000000
    --- a/website/docs/api/language-models.jade
    +++ /dev/null
    @@ -1,93 +0,0 @@
    -//- 💫 DOCS > API > LANGUAGE MODELS
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  spaCy currently provides models for the following languages and
    -    |  capabilities:
    -
    -
    -+aside-code("Download language models", "bash").
    -    spacy download en
    -    spacy download de
    -    spacy download fr
    -
    -+table([ "Language", "Token", "SBD", "Lemma", "POS", "NER", "Dep", "Vector", "Sentiment"])
    -    +row
    -        +cell English #[code en]
    -        each icon in [ "pro", "pro", "pro", "pro", "pro", "pro", "pro", "con" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell German #[code de]
    -        each icon in [ "pro", "pro", "con", "pro", "pro", "pro", "pro", "con" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell French #[code fr]
    -        each icon in [ "pro", "con", "con", "pro", "con", "pro", "pro", "con" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -    +row
    -        +cell Spanish #[code es]
    -        each icon in [ "pro", "pro", "con", "pro", "pro", "pro", "pro", "con" ]
    -            +cell.u-text-center #[+procon(icon)]
    -
    -p
    -    +button("/docs/usage/models", true, "primary") See available models
    -
    -+h(2, "alpha-support") Alpha tokenization support
    -
    -p
    -    |  Work has started on the following languages. You can help by
    -    |  #[+a("/docs/usage/adding-languages#language-data") improving the existing language data]
    -    |  and extending the tokenization patterns.
    -
    -+aside("Usage note")
    -    |  Note that the alpha languages don't yet come with a language model. In
    -    |  order to use them, you have to import them directly:
    -
    -    +code.o-no-block.
    -        from spacy.lang.fi import Finnish
    -        nlp = Finnish()
    -        doc = nlp(u'Ilmatyynyalukseni on täynnä ankeriaita')
    -
    -+infobox("Dependencies")
    -    |  Some language tokenizers require external dependencies. To use #[strong Chinese],
    -    |  you need to have #[+a("https://github.com/fxsjy/jieba") Jieba] installed.
    -    |  The #[strong Japanese] tokenizer requires
    -    |  #[+a("https://github.com/mocobeta/janome") Janome].
    -
    -+table([ "Language", "Code", "Source" ])
    -    each language, code in { it: "Italian", pt: "Portuguese", nl: "Dutch", sv: "Swedish", fi: "Finnish", nb: "Norwegian Bokmål", da: "Danish", hu: "Hungarian", pl: "Polish", bn: "Bengali", he: "Hebrew", zh: "Chinese", ja: "Japanese" }
    -        +row
    -            +cell #{language}
    -            +cell #[code=code]
    -            +cell
    -                +src(gh("spaCy", "spacy/lang/" + code)) lang/#{code}
    -
    -+h(2, "multi-language") Multi-language support
    -    +tag-new(2)
    -
    -p
    -    |  As of v2.0, spaCy supports models trained on more than one language. This
    -    |  is especially useful for named entity recognition. The language ID used
    -    |  for multi-language or language-neutral models is #[code xx]. The
    -    |  language class, a generic subclass containing only the base language data,
    -    |  can be found in #[+src(gh("spaCy", "spacy/lang/xx")) lang/xx].
    -
    -p
    -    |  To load your model with the neutral, multi-language class, simply set
    -    |  #[code "language": "xx"] in your
    -    |  #[+a("/docs/usage/saving-loading#models-generating") model package]'s
    -    |  meta.json. You can also import the class directly, or call
    -    |  #[+api("util#get_lang_class") #[code util.get_lang_class()]] for
    -    |  lazy-loading.
    -
    -+code("Standard import").
    -    from spacy.lang.xx import MultiLanguage
    -    nlp = MultiLanguage()
    -
    -+code("With lazy-loading").
    -    from spacy.util import get_lang_class
    -    nlp = get_lang_class('xx')
    diff --git a/website/docs/api/tagger.jade b/website/docs/api/tagger.jade
    deleted file mode 100644
    index c41de6a4e..000000000
    --- a/website/docs/api/tagger.jade
    +++ /dev/null
    @@ -1,93 +0,0 @@
    -//- 💫 DOCS > API > TAGGER
    -
    -include ../../_includes/_mixins
    -
    -p Annotate part-of-speech tags on #[code Doc] objects.
    -
    -+under-construction
    -
    -+h(2, "init") Tagger.__init__
    -    +tag method
    -
    -p Create a #[code Tagger].
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code vocab]
    -        +cell #[code Vocab]
    -        +cell The vocabulary. Must be shared with documents to be processed.
    -
    -    +row
    -        +cell #[code model]
    -        +cell #[thinc.linear.AveragedPerceptron]
    -        +cell The statistical model.
    -
    -    +footrow
    -        +cell returns
    -        +cell #[code Tagger]
    -        +cell The newly constructed object.
    -
    -+h(2, "call") Tagger.__call__
    -    +tag method
    -
    -p Apply the tagger, setting the POS tags onto the #[code Doc] object.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The tokens to be tagged.
    -
    -    +footrow
    -        +cell returns
    -        +cell #[code None]
    -        +cell -
    -
    -+h(2, "pipe") Tagger.pipe
    -    +tag method
    -
    -p Tag a stream of documents.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code stream]
    -        +cell -
    -        +cell The sequence of documents to tag.
    -
    -    +row
    -        +cell #[code batch_size]
    -        +cell int
    -        +cell The number of documents to accumulate into a working set.
    -
    -    +row
    -        +cell #[code n_threads]
    -        +cell int
    -        +cell
    -            |  The number of threads with which to work on the buffer in
    -            |  parallel.
    -
    -    +footrow
    -        +cell yields
    -        +cell #[code Doc]
    -        +cell Documents, in order.
    -
    -+h(2, "update") Tagger.update
    -    +tag method
    -
    -p Update the statistical model, with tags supplied for the given document.
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The example document for the update.
    -
    -    +row
    -        +cell #[code gold]
    -        +cell #[code GoldParse]
    -        +cell Manager for the gold-standard tags.
    -
    -    +footrow
    -        +cell returns
    -        +cell int
    -        +cell Number of tags predicted correctly.
    diff --git a/website/docs/api/tensorizer.jade b/website/docs/api/tensorizer.jade
    deleted file mode 100644
    index 9abd6793b..000000000
    --- a/website/docs/api/tensorizer.jade
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -//- 💫 DOCS > API > TENSORIZER
    -
    -include ../../_includes/_mixins
    -
    -p Add a tensor with position-sensitive meaning representations to a #[code Doc].
    -
    -+under-construction
    diff --git a/website/docs/api/textcategorizer.jade b/website/docs/api/textcategorizer.jade
    deleted file mode 100644
    index 926d957f7..000000000
    --- a/website/docs/api/textcategorizer.jade
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -//- 💫 DOCS > API > TEXTCATEGORIZER
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  Add text categorization models to spaCy pipelines. The model supports
    -    |  classification with multiple, non-mutually exclusive labels.
    -
    -p
    -    |  You can change the model architecture rather easily, but by default, the
    -    |  #[code TextCategorizer] class uses a convolutional neural network to
    -    |  assign position-sensitive vectors to each word in the document. This step
    -    |  is similar to the #[+api("tensorizer") #[code Tensorizer]] component, but the
    -    |  #[code TextCategorizer] uses its own CNN model, to avoid sharing weights
    -    |  with the other pipeline components. The document tensor is then
    -    |  summarized by concatenating max and mean pooling, and a multilayer
    -    |  perceptron is used to predict an output vector of length #[code nr_class],
    -    |  before a logistic activation is applied elementwise. The value of each
    -    |  output neuron is the probability that some class is present.
    -
    -+under-construction
    diff --git a/website/docs/api/vectors.jade b/website/docs/api/vectors.jade
    deleted file mode 100644
    index ef9aa2b52..000000000
    --- a/website/docs/api/vectors.jade
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -//- 💫 DOCS > API > VECTORS
    -
    -include ../../_includes/_mixins
    -
    -p A container class for vector data keyed by string.
    -
    -+under-construction
    diff --git a/website/usage/_models/_languages.jade b/website/usage/_models/_languages.jade
    new file mode 100644
    index 000000000..abdad01ad
    --- /dev/null
    +++ b/website/usage/_models/_languages.jade
    @@ -0,0 +1,72 @@
    +//- 💫 DOCS > USAGE > MODELS > LANGUAGE SUPPORT
    +
    +p spaCy currently provides models for the following languages:
    +
    ++table(["Language", "Code", "Language data", "Models"])
    +    for models, code in MODELS
    +        - var count = Object.keys(models).length
    +        +row
    +            +cell=LANGUAGES[code]
    +            +cell #[code=code]
    +            +cell
    +                +src(gh("spaCy", "spacy/lang/" + code)) #[code lang/#{code}]
    +            +cell
    +                +a("/models/" + code) #{count} #{(count == 1) ? "model" : "models"}
    +
    ++h(3, "alpha-support") Alpha tokenization support
    +
    +p
    +    |  Work has started on the following languages. You can help by
    +    |  #[+a("/usage/adding-languages#language-data") improving the existing language data]
    +    |  and extending the tokenization patterns.
    +
    ++aside("Usage note")
    +    |  Note that the alpha languages don't yet come with a language model. In
    +    |  order to use them, you have to import them directly, or use
    +    |  #[+api("spacy#blank") #[code spacy.blank]]:
    +
    +    +code.o-no-block.
    +        from spacy.lang.fi import Finnish
    +        nlp = Finnish()  # use directly
    +        nlp = spacy.blank('fi')  # blank instance
    +
    ++table(["Language", "Code", "Language data"])
    +    for lang, code in LANGUAGES
    +        if !Object.keys(MODELS).includes(code)
    +            +row
    +                +cell #{LANGUAGES[code]}
    +                +cell #[code=code]
    +                +cell
    +                    +src(gh("spaCy", "spacy/lang/" + code)) #[code lang/#{code}]
    +
    ++infobox("Dependencies")
    +    |  Some language tokenizers require external dependencies. To use #[strong Chinese],
    +    |  you need to have #[+a("https://github.com/fxsjy/jieba") Jieba] installed.
    +    |  The #[strong Japanese] tokenizer requires
    +    |  #[+a("https://github.com/mocobeta/janome") Janome].
    +
    ++h(3, "multi-language") Multi-language support
    +    +tag-new(2)
    +
    +p
    +    |  As of v2.0, spaCy supports models trained on more than one language. This
    +    |  is especially useful for named entity recognition. The language ID used
    +    |  for multi-language or language-neutral models is #[code xx]. The
    +    |  language class, a generic subclass containing only the base language data,
    +    |  can be found in #[+src(gh("spaCy", "spacy/lang/xx")) #[code lang/xx]].
    +
    +p
    +    |  To load your model with the neutral, multi-language class, simply set
    +    |  #[code "language": "xx"] in your
    +    |  #[+a("/usage/training#models-generating") model package]'s
    +    |  meta.json. You can also import the class directly, or call
    +    |  #[+api("util#get_lang_class") #[code util.get_lang_class()]] for
    +    |  lazy-loading.
    +
    ++code("Standard import").
    +    from spacy.lang.xx import MultiLanguage
    +    nlp = MultiLanguage()
    +
    ++code("With lazy-loading").
    +    from spacy.util import get_lang_class
    +    nlp = get_lang_class('xx')
    
    From 22dd929b65d62cdeb1fd65ceb9b304e15b7b90d9 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:28:03 +0200
    Subject: [PATCH 173/649] Add models documentation
    
    ---
     .gitignore                |  2 +-
     website/models/_data.json | 95 +++++++++++++++++++++++++++++++++++++
     website/models/de.jade    |  6 +++
     website/models/en.jade    |  6 +++
     website/models/es.jade    |  6 +++
     website/models/fr.jade    |  6 +++
     website/models/index.jade | 98 +++++++++++++++++++++++++++++++++++++++
     website/models/xx.jade    |  6 +++
     8 files changed, 224 insertions(+), 1 deletion(-)
     create mode 100644 website/models/_data.json
     create mode 100644 website/models/de.jade
     create mode 100644 website/models/en.jade
     create mode 100644 website/models/es.jade
     create mode 100644 website/models/fr.jade
     create mode 100644 website/models/index.jade
     create mode 100644 website/models/xx.jade
    
    diff --git a/.gitignore b/.gitignore
    index cb0a8e84e..572eea92d 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -1,7 +1,7 @@
     # spaCy
     spacy/data/
     corpora/
    -models/
    +/models/
     keys/
     
     # Website
    diff --git a/website/models/_data.json b/website/models/_data.json
    new file mode 100644
    index 000000000..cc26b9bc9
    --- /dev/null
    +++ b/website/models/_data.json
    @@ -0,0 +1,95 @@
    +{
    +    "sidebar": {
    +        "Models": {
    +            "Overview": "./"
    +        },
    +
    +        "Language models": {
    +            "English": "en",
    +            "German": "de",
    +            "Spanish": "es",
    +            "French": "fr",
    +            "Multi-Language": "xx"
    +        }
    +    },
    +
    +    "index": {
    +        "title": "Models Overview",
    +        "teaser": "Downloadable statistical models for spaCy to predict and assign linguistic features.",
    +        "quickstart": true,
    +        "menu": {
    +            "Quickstart": "quickstart",
    +            "Installation": "install",
    +            "Naming Conventions": "conventions"
    +        }
    +    },
    +
    +    "MODELS": {
    +        "en": ["en_core_web_sm", "en_core_web_lg", "en_vectors_web_lg"],
    +        "de": ["de_dep_news_sm"],
    +        "es": ["es_core_web_sm"],
    +        "fr": [],
    +        "xx": ["xx_ent_wiki_sm"]
    +    },
    +
    +    "MODEL_META": {
    +        "core": "Vocabulary, syntax, entities, vectors",
    +        "dep": "Vocabulary, syntax",
    +        "ent": "Named entities",
    +        "vectors": "Word vectors",
    +        "web": "written text (blogs, news, comments)",
    +        "news": "written text (news, media)",
    +        "wiki": "Wikipedia",
    +        "uas": "Unlabelled dependencies",
    +        "las": "Labelled dependencies",
    +        "tags_acc": "Part-of-speech tags",
    +        "ents_f": "Entities (F-score)",
    +        "pipeline": "Processing pipeline components in order",
    +        "sources": "Sources of training data"
    +    },
    +
    +    "MODEL_LICENSES": {
    +        "CC BY-SA": "https://creativecommons.org/licenses/by-sa/3.0/",
    +        "CC BY-SA 3.0": "https://creativecommons.org/licenses/by-sa/3.0/",
    +        "CC BY-NC": "https://creativecommons.org/licenses/by-nc/3.0/",
    +        "CC BY-NC 3.0": "https://creativecommons.org/licenses/by-nc/3.0/"
    +    },
    +
    +    "MODEL_ACCURACY": {
    +        "uas": "UAS",
    +        "las": "LAS",
    +        "tags_acc": "POS",
    +        "ents_f": "NER F"
    +    },
    +
    +    "LANGUAGES": {
    +        "en": "English",
    +        "de": "German",
    +        "fr": "French",
    +        "es": "Spanish",
    +        "it": "Italian",
    +        "pt": "Portuguese",
    +        "nl": "Dutch",
    +        "sv": "Swedish",
    +        "fi": "Finnish",
    +        "nb": "Norwegian Bokmål",
    +        "da": "Danish",
    +        "hu": "Hungarian",
    +        "pl": "Polish",
    +        "he": "Hebrew",
    +        "bn": "Bengali",
    +        "id": "Indonesian",
    +        "th": "Thai",
    +        "zh": "Chinese",
    +        "ja": "Japanese",
    +        "xx": "Multi-language"
    +    },
    +
    +    "EXAMPLE_SENTENCES": {
    +        "en": "This is a sentence.",
    +        "de": "Dies ist ein Satz.",
    +        "fr": "C'est une phrase.",
    +        "es": "Esto es una frase.",
    +        "xx": "This is a sentence about Facebook."
    +    }
    +}
    diff --git a/website/models/de.jade b/website/models/de.jade
    new file mode 100644
    index 000000000..113290b7a
    --- /dev/null
    +++ b/website/models/de.jade
    @@ -0,0 +1,6 @@
    +//- 💫 DOCS > MODELS > DE
    +
    +include ../_includes/_mixins
    +
    +//- This is a placeholder. The page is rendered via the template at
    +//- /_includes/_page-model.jade.
    diff --git a/website/models/en.jade b/website/models/en.jade
    new file mode 100644
    index 000000000..4f400662b
    --- /dev/null
    +++ b/website/models/en.jade
    @@ -0,0 +1,6 @@
    +//- 💫 DOCS > MODELS > EN
    +
    +include ../_includes/_mixins
    +
    +//- This is a placeholder. The page is rendered via the template at
    +//- /_includes/_page-model.jade.
    diff --git a/website/models/es.jade b/website/models/es.jade
    new file mode 100644
    index 000000000..7aad72e81
    --- /dev/null
    +++ b/website/models/es.jade
    @@ -0,0 +1,6 @@
    +//- 💫 DOCS > MODELS > ES
    +
    +include ../_includes/_mixins
    +
    +//- This is a placeholder. The page is rendered via the template at
    +//- /_includes/_page-model.jade.
    diff --git a/website/models/fr.jade b/website/models/fr.jade
    new file mode 100644
    index 000000000..1b3cc3fde
    --- /dev/null
    +++ b/website/models/fr.jade
    @@ -0,0 +1,6 @@
    +//- 💫 DOCS > MODELS > FR
    +
    +include ../_includes/_mixins
    +
    +//- This is a placeholder. The page is rendered via the template at
    +//- /_includes/_page-model.jade.
    diff --git a/website/models/index.jade b/website/models/index.jade
    new file mode 100644
    index 000000000..8f9aae739
    --- /dev/null
    +++ b/website/models/index.jade
    @@ -0,0 +1,98 @@
    +//- 💫 DOCS > MODELS
    +
    +include ../_includes/_mixins
    +
    ++section("quickstart")
    +    p
    +        |  spaCy v2.0 features new neural models for #[strong tagging],
    +        |  #[strong parsing] and #[strong entity recognition]. The models have
    +        |  been designed and implemented from scratch specifically for spaCy, to
    +        |  give you an unmatched balance of speed, size and accuracy. A novel
    +        |  bloom embedding strategy with subword features is used to support
    +        |  huge vocabularies in tiny tables. Convolutional layers with residual
    +        |  connections, layer normalization and maxout non-linearity are used,
    +        |  giving much better efficiency than the standard BiLSTM solution. For
    +        |  more details, see the notes on the
    +        |  #[+a("/api/#nn-models") model architecture].
    +
    +    p
    +        |  The parser and NER use an imitation learning objective to
    +        |  deliver #[strong accuracy in-line with the latest research systems],
    +        |  even when  evaluated from raw text. With these innovations, spaCy
    +        |  v2.0's models are #[strong 10× smaller],
    +        |  #[strong 20% more accurate], and #[strong just as fast] as the
    +        |  previous generation.
    +
    +    include ../usage/_models/_quickstart
    +
    ++section("install")
    +    +h(2, "install") Installation & Usage
    +
    +    include ../usage/_models/_install-basics
    +
    +    +infobox
    +        |  For more details on how to use models with spaCy, see the
    +        |  #[+a("/usage/models") usage guide on models].
    +
    ++section("conventions")
    +    +h(2, "model-naming") Model naming conventions
    +
    +    p
    +        |  In general, spaCy expects all model packages to follow the naming
    +        |  convention of #[code [lang]_[name]]. For spaCy's models, we also
    +        |  chose to divide the name into three components:
    +
    +    +table
    +        +row
    +            +cell #[+label Type]
    +            +cell
    +                |  Model capabilities (e.g. #[code core] for general-purpose
    +                |  model with vocabulary, syntax, entities and word vectors, or
    +                |  #[code depent] for only vocab, syntax and entities).
    +        +row
    +            +cell #[+label Genre]
    +            +cell
    +                |  Type of text the model is trained on, e.g. #[code web] or
    +                |  #[code news].
    +        +row
    +            +cell #[+label Size]
    +            +cell Model size indicator, #[code sm], #[code md] or #[code lg].
    +
    +    p
    +        |  For example, #[code en_core_web_sm] is a small English model trained
    +        |  on written web text (blogs, news, comments), that includes
    +        |  vocabulary, vectors, syntax and entities.
    +
    +    +h(3, "model-versioning") Model versioning
    +
    +    p
    +        |  Additionally, the model versioning reflects both the compatibility
    +        |  with spaCy, as well as the major and minor model version. A model
    +        |  version #[code a.b.c] translates to:
    +
    +    +table
    +        +row
    +            +cell #[code a]
    +            +cell
    +                |  #[strong spaCy major version]. For example, #[code 2] for
    +                |  spaCy v2.x.
    +        +row
    +            +cell #[code b]
    +            +cell
    +                |  #[strong Model major version]. Models with a different major
    +                |  version can't be loaded by the same code. For example,
    +                |  changing the width of the model, adding hidden layers or
    +                |  changing the activation changes the model major version.
    +        +row
    +            +cell #[code c]
    +            +cell
    +                |  #[strong Model minor version]. Same model structure, but
    +                |  different parameter values, e.g. from being trained on
    +                |  different data, for different numbers of iterations, etc.
    +
    +    p
    +        |  For a detailed compatibility overview, see the
    +        |  #[+a(gh("spacy-models", "compatibility.json")) #[code compatibility.json]]
    +        |  in the models repository. This is also the source of spaCy's internal
    +        |  compatibility check, performed when you run the
    +        |  #[+api("cli#download") #[code download]] command.
    diff --git a/website/models/xx.jade b/website/models/xx.jade
    new file mode 100644
    index 000000000..8967f38fa
    --- /dev/null
    +++ b/website/models/xx.jade
    @@ -0,0 +1,6 @@
    +//- 💫 DOCS > MODELS > XX
    +
    +include ../_includes/_mixins
    +
    +//- This is a placeholder. The page is rendered via the template at
    +//- /_includes/_page-model.jade.
    
    From 319fac14fe979375faf5fb93db5efbc3c6d0a64c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:28:18 +0200
    Subject: [PATCH 174/649] Update global config and landing page
    
    ---
     website/_data.json |  49 +++++++----
     website/_harp.json |  80 ++++--------------
     website/index.jade | 199 ++++++++++++++++++++++-----------------------
     3 files changed, 145 insertions(+), 183 deletions(-)
    
    diff --git a/website/_data.json b/website/_data.json
    index 525c70d80..53543b2d0 100644
    --- a/website/_data.json
    +++ b/website/_data.json
    @@ -3,24 +3,22 @@
             "landing": true,
             "logos": [
                 {
    -                "quora": [ "https://www.quora.com", 150 ],
    -                "chartbeat": [ "https://chartbeat.com", 200 ],
    -                "duedil": [ "https://www.duedil.com", 150 ],
    -                "stitchfix": [ "https://www.stitchfix.com", 190 ]
    +                "airbnb": [ "https://www.airbnb.com", 150, 45],
    +                "quora": [ "https://www.quora.com", 120, 34 ],
    +                "retriever": [ "https://www.retriever.no", 150, 33 ],
    +                "stitchfix": [ "https://www.stitchfix.com", 150, 18 ]
                 },
                 {
    -                "wayblazer": [ "http://wayblazer.com", 200 ],
    -                "indico": [ "https://indico.io", 150 ],
    -                "chattermill": [ "https://chattermill.io", 175 ],
    -                "turi": [ "https://turi.com", 150 ],
    -                "kip": [ "http://kipthis.com", 70 ]
    -            },
    +                "chartbeat": [ "https://chartbeat.com", 180, 25 ],
    +                "allenai": [ "https://allenai.org", 220, 37 ]
    +            }
    +        ],
    +        "features": [
                 {
    -                "socrata": [ "https://www.socrata.com", 150 ],
    -                "cytora": [ "http://www.cytora.com", 125 ],
    -                "signaln": [ "http://signaln.com", 150 ],
    -                "wonderflow": [ "http://www.wonderflow.co", 200 ],
    -                "synapsify": [ "http://www.gosynapsify.com", 150 ]
    +                "thoughtworks": ["https://www.thoughtworks.com/radar/tools", 150, 28],
    +                "wapo": ["https://www.washingtonpost.com/news/wonk/wp/2016/05/18/googles-new-artificial-intelligence-cant-understand-these-sentences-can-you/", 100, 77],
    +                "venturebeat": ["https://venturebeat.com/2017/01/27/4-ai-startups-that-analyze-customer-reviews/", 150, 19],
    +                "microsoft": ["https://www.microsoft.com/developerblog/2016/09/13/training-a-classifier-for-relation-extraction-from-medical-literature/", 130, 28]
                 }
             ]
         },
    @@ -34,7 +32,24 @@
             "landing": true
         },
     
    -    "announcement" : {
    -        "title": "Important Announcement"
    +    "styleguide": {
    +        "title": "Styleguide",
    +        "sidebar": {
    +            "Styleguide": { "": "styleguide" },
    +            "Resources": {
    +                "Website Source": "https://github.com/explosion/spacy/tree/master/website",
    +                "Contributing Guide": "https://github.com/explosion/spaCy/blob/master/CONTRIBUTING.md"
    +            }
    +        },
    +        "menu": {
    +            "Introduction": "intro",
    +            "Logo": "logo",
    +            "Colors": "colors",
    +            "Typography": "typography",
    +            "Elements": "elements",
    +            "Components": "components",
    +            "Embeds": "embeds",
    +            "Markup Reference": "markup"
    +        }
         }
     }
    diff --git a/website/_harp.json b/website/_harp.json
    index 1c27426f4..55035c32f 100644
    --- a/website/_harp.json
    +++ b/website/_harp.json
    @@ -11,12 +11,9 @@
             "COMPANY": "Explosion AI",
             "COMPANY_URL": "https://explosion.ai",
             "DEMOS_URL": "https://demos.explosion.ai",
    +        "MODELS_REPO": "explosion/spacy-models",
     
    -        "SPACY_VERSION": "1.8",
    -        "LATEST_NEWS": {
    -            "url": "https://github.com/explosion/spaCy/releases/tag/v2.0.0-alpha",
    -            "title": "Test spaCy v2.0.0 alpha!"
    -        },
    +        "SPACY_VERSION": "2.0",
     
             "SOCIAL": {
                 "twitter": "spacy_io",
    @@ -27,25 +24,23 @@
             },
     
             "NAVIGATION": {
    -            "Home": "/",
    -            "Usage": "/docs/usage",
    -            "Reference": "/docs/api",
    -            "Demos": "/docs/usage/showcase",
    -            "Blog": "https://explosion.ai/blog"
    +            "Usage": "/usage",
    +            "Models": "/models",
    +            "API": "/api"
             },
     
             "FOOTER": {
                 "spaCy": {
    -                "Usage": "/docs/usage",
    -                "API Reference": "/docs/api",
    -                "Tutorials": "/docs/usage/tutorials",
    -                "Showcase": "/docs/usage/showcase"
    +                "Usage": "/usage",
    +                "Models": "/models",
    +                "API Reference": "/api",
    +                "Resources": "/usage/resources"
                 },
                 "Support": {
                     "Issue Tracker": "https://github.com/explosion/spaCy/issues",
                     "StackOverflow": "http://stackoverflow.com/questions/tagged/spacy",
    -                "Reddit usergroup": "https://www.reddit.com/r/spacynlp/",
    -                "Gitter chat": "https://gitter.im/explosion/spaCy"
    +                "Reddit Usergroup": "https://www.reddit.com/r/spacynlp/",
    +                "Gitter Chat": "https://gitter.im/explosion/spaCy"
                 },
                 "Connect": {
                     "Twitter": "https://twitter.com/spacy_io",
    @@ -74,21 +69,11 @@
                     {"id": "venv", "title": "virtualenv", "help": "Use a virtual environment and install spaCy into a user directory" },
                     {"id": "gpu", "title": "GPU", "help": "Run spaCy on GPU to make it faster. Requires an NVDIA graphics card with CUDA 2+. See section below for more info."}]
                 },
    -            { "id": "model", "title": "Models", "multiple": true, "options": [
    -                { "id": "en", "title": "English", "meta": "50MB" },
    -                { "id": "de", "title": "German", "meta": "645MB" },
    -                { "id": "fr", "title": "French", "meta": "1.33GB" },
    -                { "id": "es", "title": "Spanish", "meta": "377MB"}]
    -            }
    +            { "id": "model", "title": "Models", "multiple": true }
             ],
     
             "QUICKSTART_MODELS": [
    -            { "id": "lang", "title": "Language", "options": [
    -                { "id": "en", "title": "English", "checked": true },
    -                { "id": "de", "title": "German" },
    -                { "id": "fr", "title": "French" },
    -                { "id": "es", "title": "Spanish" }]
    -            },
    +            { "id": "lang", "title": "Language"},
                 { "id": "load", "title": "Loading style", "options": [
                     { "id": "spacy", "title": "Use spacy.load()", "checked": true, "help": "Use spaCy's built-in loader to load the model by name." },
                     {  "id": "module", "title": "Import as module", "help": "Import the model explicitly as a Python module." }]
    @@ -98,50 +83,15 @@
                 }
             ],
     
    -        "MODELS": {
    -            "en": [
    -                { "id": "en_core_web_sm", "lang": "English", "feats": [1, 1, 1, 1], "size": "50 MB", "license": "CC BY-SA", "def": true },
    -                { "id": "en_core_web_md", "lang": "English", "feats": [1, 1, 1, 1], "size": "1 GB", "license": "CC BY-SA" },
    -                { "id": "en_depent_web_md", "lang": "English", "feats": [1, 1, 1, 0], "size": "328 MB", "license": "CC BY-SA" },
    -                { "id": "en_vectors_glove_md", "lang": "English", "feats": [1, 0, 0, 1], "size": "727 MB", "license": "CC BY-SA" }
    -            ],
    -            "de": [
    -                { "id": "de_core_news_md", "lang": "German", "feats": [1, 1, 1, 1], "size": "645 MB", "license": "CC BY-SA" }
    -            ],
    -            "fr": [
    -                { "id": "fr_depvec_web_lg", "lang": "French", "feats": [1, 1, 0, 1], "size": "1.33 GB", "license": "CC BY-NC" }
    -            ],
    -            "es": [
    -                { "id": "es_core_web_md", "lang": "Spanish", "feats": [1, 1, 1, 1], "size": "377 MB", "license": "CC BY-SA"}
    -            ]
    -        },
    -
    -        "EXAMPLE_SENTENCES": {
    -            "en": "This is a sentence.",
    -            "de": "Dies ist ein Satz.",
    -            "fr": "C'est une phrase.",
    -            "es": "Esto es una frase."
    -        },
    -
             "ALPHA": true,
    -        "V_CSS": "1.6",
    -        "V_JS": "1.2",
    +        "V_CSS": "2.0",
    +        "V_JS": "2.0",
             "DEFAULT_SYNTAX": "python",
             "ANALYTICS": "UA-58931649-1",
             "MAILCHIMP": {
                 "user": "spacy.us12",
                 "id": "83b0498b1e7fa3c91ce68c3f1",
                 "list": "89ad33e698"
    -        },
    -        "BADGES": {
    -            "pipy": {
    -                "badge": "https://img.shields.io/pypi/v/spacy.svg?style=flat-square",
    -                "link": "https://pypi.python.org/pypi/spacy"
    -            },
    -            "conda": {
    -                "badge": "https://anaconda.org/conda-forge/spacy/badges/version.svg",
    -                "link": "https://anaconda.org/conda-forge/spacy"
    -            }
             }
         }
     }
    diff --git a/website/index.jade b/website/index.jade
    index 9336d5c34..0155ab295 100644
    --- a/website/index.jade
    +++ b/website/index.jade
    @@ -8,61 +8,48 @@ include _includes/_mixins
             | Natural Language#[br]
             | Processing
     
    -    h2.c-landing__title.o-block.u-heading-1
    -        | in Python
    +    h2.c-landing__title.o-block.u-heading-3
    +        span.u-text-label.u-text-label--light in Python
     
    -    +landing-badge(gh("spaCy") + "/releases/tag/v2.0.0-alpha", "v2alpha", "Try spaCy v2.0.0 alpha!")
    ++grid.o-content.c-landing__blocks
    +    +grid-col("third").c-landing__card.o-card.o-grid.o-grid--space
    +        +h(3) Fastest in the world
    +        p
    +            |  spaCy excels at large-scale information extraction tasks.
    +            |  It's written from the ground up in carefully memory-managed
    +            |  Cython. Independent research has confirmed that spaCy is
    +            |  the fastest in the world.  If your application needs to
    +            |  process entire web dumps, spaCy is the library you want to
    +            |  be using.
     
    -    +grid.o-content
    -        +grid-col("third").o-card
    -            +h(2) Fastest in the world
    -            p
    -                |  spaCy excels at large-scale information extraction tasks.
    -                |  It's written from the ground up in carefully memory-managed
    -                |  Cython. Independent research has confirmed that spaCy is
    -                |  the fastest in the world.  If your application needs to
    -                |  process entire web dumps, spaCy is the library you want to
    -                |  be using.
    +        +button("/usage/facts-figures", true, "primary")
    +            |  Facts & figures
     
    -            +button("/docs/api", true, "primary")
    -                |  Facts & figures
    +    +grid-col("third").c-landing__card.o-card.o-grid.o-grid--space
    +        +h(3) Get things done
    +        p
    +            |  spaCy is designed to help you do real work — to build real
    +            |  products, or gather real insights. The library respects
    +            |  your time, and tries to avoid wasting it. It's easy to
    +            |  install, and its API is simple and productive. We like to
    +            |  think of spaCy as the Ruby on Rails of Natural Language
    +            |  Processing.
     
    -        +grid-col("third").o-card
    -            +h(2) Get things done
    -            p
    -                |  spaCy is designed to help you do real work — to build real
    -                |  products, or gather real insights. The library respects
    -                |  your time, and tries to avoid wasting it. It's easy to
    -                |  install, and its API is simple and productive. I like to
    -                |  think of spaCy as the Ruby on Rails of Natural Language
    -                |  Processing.
    +        +button("/usage", true, "primary")
    +            |  Get started
     
    -            +button("/docs/usage", true, "primary")
    -                |  Get started
    +    +grid-col("third").c-landing__card.o-card.o-grid.o-grid--space
    +        +h(3) Deep learning
    +        p
    +            |  spaCy is the best way to prepare text for deep learning.
    +            |  It interoperates seamlessly with TensorFlow, PyTorch,
    +            |  scikit-learn, Gensim and the
    +            |  rest of Python's awesome AI ecosystem. spaCy helps you
    +            |  connect the statistical models trained by these libraries
    +            |  to the rest of your application.
     
    -        +grid-col("third").o-card
    -            +h(2) Deep learning
    -            p
    -                |  spaCy is the best way to prepare text for deep learning.
    -                |  It interoperates seamlessly with
    -                |  #[+a("https://www.tensorflow.org") TensorFlow],
    -                |  #[+a("https://keras.io") Keras],
    -                |  #[+a("http://scikit-learn.org") Scikit-Learn],
    -                |  #[+a("https://radimrehurek.com/gensim") Gensim] and the
    -                |  rest of Python's awesome AI ecosystem. spaCy helps you
    -                |  connect the statistical models trained by these libraries
    -                |  to the rest of your application.
    -
    -            +button("/docs/usage/deep-learning", true, "primary")
    -                |  Read more
    -
    -.o-inline-list.o-block.u-border-bottom.u-text-small.u-text-center.u-padding-small
    -    +a(gh("spaCy") + "/releases")
    -        strong.u-text-label.u-color-subtle #[+icon("code", 18)] Latest release:
    -        |  v#{SPACY_VERSION}
    -
    -    if LATEST_NEWS
    -        +a(LATEST_NEWS.url) #[+tag.o-icon New!] #{LATEST_NEWS.title}
    +        +button("/usage/deep-learning", true, "primary")
    +            |  Read more
     
     .o-content
         +grid
    @@ -92,67 +79,77 @@ include _includes/_mixins
                 +h(2) Features
                 +list
                     +item Non-destructive #[strong tokenization]
    -                +item Syntax-driven sentence segmentation
    +                +item Support for #[strong #{LANG_COUNT}+ languages]
    +                +item #[strong #{MODEL_COUNT} statistical models] for #{MODEL_LANG_COUNT} languages
                     +item Pre-trained #[strong word vectors]
    +                +item Easy #[strong deep learning] integration
                     +item Part-of-speech tagging
                     +item #[strong Named entity] recognition
                     +item Labelled dependency parsing
    +                +item Syntax-driven sentence segmentation
    +                +item Built in #[strong visualizers] for syntax and NER
                     +item Convenient string-to-hash mapping
                     +item Export to numpy data arrays
    -                +item GIL-free #[strong multi-threading]
                     +item Efficient binary serialization
    -                +item Easy #[strong deep learning] integration
    -                +item Statistical models for #[strong English] and #[strong German]
    +                +item Easy #[strong model packaging] and deployment
                     +item State-of-the-art speed
                     +item Robust, rigorously evaluated accuracy
     
    ++landing-banner("Convolutional neural network models", "New in v2.0")
    +    p
    +        |  spaCy v2.0 features new neural models for #[strong tagging],
    +        |  #[strong parsing] and #[strong entity recognition]. The models have
    +        |  been designed and implemented from scratch specifically for spaCy, to
    +        |  give you an unmatched balance of speed, size and accuracy. A novel
    +        |  bloom embedding strategy with subword features is used to support
    +        |  huge vocabularies in tiny tables. Convolutional layers with residual
    +        |  connections, layer normalization and maxout non-linearity are used,
    +        |  giving much better efficiency than the standard BiLSTM solution.
    +        |  Finally, the parser and NER use an imitation learning objective to
    +        |  deliver accuracy in-line with the latest research systems,
    +        |  even when  evaluated from raw text. With these innovations, spaCy
    +        |  v2.0's models are #[strong 10× smaller],
    +        |  #[strong 20% more accurate], and #[strong just as fast] as the
    +        |  previous generation.
    +
    +    .o-block-small.u-text-right
    +        +button("/models", true, "secondary-light") Download models
    +
    ++landing-logos("spaCy is trusted by", logos)
    +    +button(gh("spacy") + "/stargazers", false, "secondary", "small")
    +        |  and many more
    +
    ++landing-logos("Featured on", features).o-block-small
    +
    ++landing-banner("Prodigy: Radically efficient machine teaching", "From the makers of spaCy")
    +    p
    +        |  Prodigy is an #[strong annotation tool] so efficient that data scientists can
    +        |  do the annotation themselves, enabling a new level of rapid
    +        |  iteration. Whether you're working on entity recognition, intent
    +        |  detection or image classification, Prodigy can help you
    +        |  #[strong train and evaluate] your models faster. Stream in your own examples or
    +        |  real-world data from live APIs, update your model in real-time and
    +        |  chain models together to build more complex systems.
    +
    +    .o-block-small.u-text-right
    +        +button("https://prodi.gy", true, "secondary-light") Try it out
    +
    +.o-content
    +    +grid
    +        +grid-col("half")
    +            +h(2) Benchmarks
    +
    +            p
    +                |  In 2015, independent researchers from Emory University and
    +                |  Yahoo! Labs showed that spaCy offered the
    +                |  #[strong fastest syntactic parser in the world] and that its
    +                |  accuracy was #[strong within 1% of the best] available
    +                |  (#[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") Choi et al., 2015]).
    +                |  spaCy v2.0, released in 2017, is more accurate than any of
    +                |  the systems Choi et al. evaluated.
    +
                 .o-inline-list
    -                +button("/docs/usage/lightning-tour", true, "secondary")
    -                    | See examples
    +                +button("/usage/facts-figures#benchmarks", true, "secondary") See details
     
    -    .o-block.u-text-center.u-padding
    -        h3.u-text-label.u-color-subtle.o-block spaCy is trusted by
    -
    -        each row in logos
    -            +grid("center").o-inline-list
    -                each details, name in row
    -                    +a(details[0])
    -                        img(src="/assets/img/logos/#{name}.png" alt=name width=(details[1] || 150)).u-padding-small
    -
    -.u-pattern.u-padding
    -    +grid.o-card.o-content
    -        +grid-col("quarter")
    -            img(src="/assets/img/profile_matt.png" width="280")
    -
    -        +grid-col("three-quarters")
    -            +h(2) What's spaCy all about?
    -
    -            p
    -                |  By 2014, I'd been publishing NLP research for about 10
    -                |  years. During that time, I saw a huge gap open between the
    -                |  technology that Google-sized companies could take to market,
    -                |  and what was available to everyone else. This was especially
    -                |  clear when companies started trying to use my research. Like
    -                |  most researchers, my work was free to read, but expensive to
    -                |  apply. You could run my code, but its requirements were
    -                |  narrow. My code's mission in life was to print results
    -                |  tables for my papers — it was good at this job, and bad at
    -                |  all others.
    -
    -            p
    -                |  spaCy's #[+a("/docs/api/philosophy") mission] is to make
    -                |  cutting-edge NLP practical and commonly available.  That's
    -                |  why I left academia in 2014, to build a production-quality
    -                |  open-source NLP library. It's why
    -                |  #[+a("https://twitter.com/_inesmontani") Ines] joined the
    -                |  project in 2015, to build visualisations, demos and
    -                |  annotation tools that make NLP technologies less abstract
    -                |  and easier to use. Together, we've founded
    -                |  #[+a(COMPANY_URL, true) Explosion AI], to develop data packs
    -                |  you can drop into spaCy to extend its capabilities. If
    -                |  you're processing Hindi insurance claims, you need a model
    -                |  for that. We can build it for you.
    -
    -            .o-block
    -                +a("https://twitter.com/honnibal")
    -                    +svg("graphics", "matt-signature", 60, 45).u-color-theme
    +        +grid-col("half")
    +            include usage/_facts-figures/_benchmarks-choi-2015
    
    From 23019d1daa9768f222cd2e94467451eb61eb885a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:28:24 +0200
    Subject: [PATCH 175/649] Add styleguide
    
    ---
     website/styleguide.jade | 623 ++++++++++++++++++++++++++++++++++++++++
     1 file changed, 623 insertions(+)
     create mode 100644 website/styleguide.jade
    
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    new file mode 100644
    index 000000000..107f7e2e6
    --- /dev/null
    +++ b/website/styleguide.jade
    @@ -0,0 +1,623 @@
    +//- 💫 STYLEGUIDE
    +
    +include _includes/_mixins
    +
    ++section("intro")
    +    p
    +        |  This styleguide is loosely based on the concept and principles of
    +        |  #[+a("http://bradfrost.com/blog/post/atomic-web-design/") Atomic Design].
    +        |  The templates consist of small elements (atoms) which are combined
    +        |  and connected to form larger molecules and full components. The site
    +        |  is compiled using #[+a("http://harpjs.com/") Harp], a static web
    +        |  server with built-in preprocessing. Templates are written entirely in
    +        |  #[+a("http://jade-lang.com") Jade] (aka. Pug), a clean,
    +        |  whitespace-sensitive templating  language that compiles to HTML.
    +        |  CSS is written in #[+a("http://sass-lang.com") Sass] and preprocessed
    +        |  via Harp, JavaScript is written in ES6 syntax and compiled using
    +        |  #[+a("https://babeljs.io") Babel].
    +
    ++section("logo")
    +    +h(2, "logo", "website/assets/img/logo.svg") Logo
    +
    +    p
    +        |  If you would like to use the spaCy logo on your site, please get in
    +        |  touch and ask us first. However, if you want to show support and tell
    +        |  others that your project is using spaCy, you can grab one of our
    +        |  #[+a("/usage/spacy-101#faq-project-with-spacy") spaCy badges].
    +
    +    +grid
    +        each color in [["#09a3d5", "#fff"], ["#fff", "#09a3d5"]]
    +            +grid-col("half").o-box.u-text-center.u-padding-medium(style="background: #{color[1]}; color: #{color[0]}")
    +                +icon("spacy", 338, 108)(style="max-width: 100%")
    +
    ++section("colors")
    +    +h(2, "colors", "website/assets/css/_variables.sass") Colors
    +
    +    +grid
    +        each color, label in {"dark": "#1a1e23", "medium": "#45505e", "light": "#dddddd", "faint": "#f6f6f6", "blue": "#09a3d5", "dark blue": "#077ea4", "green": "#05b083", "dark green": "#047e5e"}
    +            +grid-col("quarter").u-text-small.o-card
    +                div(style="height: 75px; background: #{color}; border-top-left-radius: 6px; border-top-right-radius: 6px")
    +                .u-text-center.u-padding-medium
    +                    +label=label
    +                    code=color
    +
    +        each pattern in ["blue", "green"]
    +            +grid-col("half").u-text-small.o-card
    +                div(style="background: url('/assets/img/pattern_#{pattern}.jpg') center/100% repeat; height: 125px; border-top-left-radius: 6px; border-top-right-radius: 6px")
    +                .u-text-center.u-padding-medium
    +                    +label #{pattern} pattern
    +                    .u-text-tiny.u-color-subtle by #[+a("https://dribbble.com/kemal").u-color-dark Kemal Şanlı]
    +
    ++section("typography")
    +    +h(2, "typography") Typography
    +
    +    +aside-code("Usage", "jade").
    +        +h(2) Headline two
    +        +h(3, "some-id") Headline three
    +
    +    p
    +        |  Headlines are set in
    +        |  #[+a("http://cargocollective.com/hanken/HK-Grotesk-Open-Source-Font") HK Grotesk]
    +        |  by Hanken Design. All other body text and code uses the best-matching
    +        |  default system font to provide a "native" reading experience.
    +
    +    each heading in [0, 1, 2, 3, 4, 5]
    +        .o-block-small(class="u-heading-" + heading) Heading #{heading}
    +    +label Label
    +
    ++section("elements")
    +    +h(2, "elements", "website/_includes/_mixins.jade") Elements
    +
    +    p
    +        |  The site comes with a collection of simple content elements,
    +        |  implemented as mixins. These elements can be used individually, or as
    +        |  part of larger components.
    +
    +    +h(3, "text-links") Special text & links
    +
    +    +aside-code("Usage", "jade").
    +        +api("token") #[code Token]
    +        +src("https://github.com") GitHub source
    +        +help("Help text here")
    +        +fn(1, "bibliography")
    +
    +    p
    +        |  Special link styles are implemented as mixins and can be used to
    +        |  mark links to the API documentation, or links to source code.
    +        |  Additionally a "help" icon can be added to provide more information
    +        |  via a tooltip.
    +
    +    p.o-inline-list
    +        +a("#") Link
    +        code Inline Code
    +        +api("token") #[code Token]
    +        +src(gh("spacy")) Source
    +        span.u-color-dark.u-nowrap Help #[+help("Help text here")]
    +        span Footnote#[+fn(1, "", "This marks a footnote and can link to a section")]
    +
    +    +h(3, "buttons") Buttons
    +
    +    +aside-code("Usage", "jade").
    +        +button("https://spacy.io", true, "secondary")
    +        +button("https://spacy.io", true, "primary", "small")
    +
    +    p
    +        |  Link buttons come in two variants, #[code primary] and
    +        |  #[code secondary] and two sizes, with an optional #[code small] size
    +        |  modifier.Since they're mostly used as enhanced links, the buttons are
    +        |  implemented as styled links instead of native button elements.
    +
    +    p.o-inline-list
    +        +button("#", false, "primary") Primary
    +        +button("#", false, "secondary") Secondary
    +        +button("#", false, "primary", "small") Primary small
    +        +button("#", false, "secondary", "small") Secondary small
    +
    +    +h(3, "tags") Tags
    +
    +    +aside-code("Usage", "jade").
    +        +tag I'm a tag
    +        +tag-new(2)
    +        +tag-model("Named entities")
    +
    +    p
    +        |  Tags can be used together with headlines, or next to properties
    +        |  across the documentation, and combined with tooltips to provide
    +        |  additional information. The #[code +tag-new] mixin takes a version
    +        |  number and can mark new features. Using the mixin, visibility of this
    +        |  tag can be toggled once the feature isn't considered new anymore.
    +        |  The #[code +tag-model] mixin takes a description of model
    +        |  capabilities and can be used to mark features that require a
    +        |  respective model to be installed.
    +
    +    p.o-inline-list
    +        +tag I'm a tag
    +        +tag-new(2)
    +        +tag-model("Named entities")
    +
    +    +h(3, "icons", "website/_includes/_svg.jade") Icons
    +
    +    +aside-code("Usage", "jade").
    +        +icon("github", 18)
    +
    +    p
    +        |  Icons are implemented via a SVG sprite and can be included as a
    +        |  mixin, using their name and an optional size value in #[code px].
    +
    +    +infobox.u-text-center
    +        each icon in ["code", "arrow-right", "book", "circle", "chat", "star", "help", "accept", "reject", "markdown", "course", "github", "jupyter"]
    +            .u-inline-block.u-padding-small.u-color-dark(data-tooltip=icon data-tooltip-style="code" aria-label=icon)
    +                +icon(icon, 20)
    +
    ++section("components")
    +    +h(2, "components", "website/_includes/_mixins.jade") Components
    +
    +    p
    +        |  The site uses a collection of Jade mixins to make it easy to use
    +        |  complex content elements across templates and blog posts. To read
    +        |  more about the concept of modular markup components, check out our
    +        |  #[+a("https://explosion.ai/blog/modular-markup", true) blog post] on
    +        |  the subject.
    +
    +    +h(3, "grid") Grid
    +
    +    +aside-code("Usage", "jade").
    +        +grid
    +            +grid-col("half") Half
    +            +grid-col("half") Half
    +
    +    p
    +        |  For now, the grid is still implemented as a standard #[code flexbox]
    +        |  grid, although it may be refactored to use CSS #[code grid] going
    +        |  forward. The grid supports up to four columns and collapses on
    +        |  small screens.
    +
    +    +grid
    +        each count, label in {"full": 1, "half": 2, "third": 3, "quarter": 4}
    +            each _ in Array(count)
    +                +grid-col(label).o-box.u-text-center.u-text-label.u-color-dark=label
    +
    +    +h(3, "table") Table
    +
    +    +aside-code("Usage", "jade").
    +        +table(["Header 1", "Header 2"])
    +            +row
    +                +cell Cell
    +                +cell Cell
    +
    +    p
    +        |  Tables are used to present data and API documentation. If a list of
    +        |  headings is specified, those will be rendered as the table header.
    +        |  An optional #[code +row("foot")] can be used to mark a footer row
    +        |  with a distinct style, for example to visualise the return values
    +        |  of a documented function.
    +
    +    - var table_cols = ["Header 1", "Header 2", "Header 3"]
    +    +table(table_cols)
    +        each row, i in Array(4)
    +            +row((i == 3) ? "foot" : null)
    +                each col, j in table_cols
    +                    +cell
    +                        if i == 3 && j == 0
    +                            |  Footer
    +
    +                        else
    +                            |  Row #{i + 1}, cell #{j + 1}
    +
    +    +h(3, "list") List
    +
    +    +aside-code("Usage", "jade").
    +        +list("numbers", 3)
    +            +item List item
    +            +item List item
    +
    +    p
    +        |  Lists are available as bulleted, numbered, lettered and lower roman.
    +        |  Optionally, a start index can be defined as the second argument
    +        |  on ordered lists.
    +
    +    +grid
    +        +list
    +            +item I am a bulleted list
    +            +item I have nice bullets
    +            +item Lorem ipsum dolor
    +            +item consectetur adipiscing elit
    +
    +        +list("numbers")
    +            +item I am an ordered list
    +            +item I have nice numbers
    +            +item Lorem ipsum dolor
    +            +item consectetur adipiscing elit
    +
    +        +list("numbers", 10)
    +            +item I am an numbered list
    +            +item with a custom start number
    +            +item Lorem ipsum dolor
    +            +item consectetur adipiscing elit
    +
    +        +list("letters")
    +            +item I am an ordered list
    +            +item I have uppercase letters
    +            +item Lorem ipsum dolor
    +            +item consectetur adipiscing elit
    +
    +        +list("letters", 18)
    +            +item I am an ordered list
    +            +item with a custom start letter
    +            +item Lorem ipsum dolor
    +            +item consectetur adipiscing elit
    +
    +        +list("roman")
    +            +item I am an ordered list
    +            +item I have roman numerals
    +            +item Lorem ipsum dolor
    +            +item consectetur adipiscing elit
    +
    +    +h(3, "code") Code
    +
    +    +aside-code("Usage", "jade").
    +        +code("Label", "python").
    +            import spacy
    +            nlp = spacy.load('en')
    +            doc = nlp(u"This is a sentence.")
    +
    +    p
    +        |  Code blocks use the #[+a("http://prismjs.com/") Prism] syntax
    +        |  highlighter with a custom theme. The language can be set individually
    +        |  on each block, and defaults to Python. An optional label can be
    +        |  added as the first argument, which is displayed above the block.
    +        |  When using the #[code +code] mixin, don't forget to append a period
    +        |  #[code .] to the mixin call. This tells Jade to interpret the
    +        |  indented block as plain text and preserve whitespace.
    +
    +    +code("Using spaCy").
    +        import spacy
    +        nlp = spacy.load('en')
    +        doc = nlp(u"This is a sentence.")
    +
    +    +h(3, "aside") Aside
    +
    +    +aside-code("Usage", "jade").
    +        +aside("Title") This is an aside
    +        +aside-code("Title", "python").
    +            nlp = spacy.load('en')
    +
    +    p
    +        |  Asides can be used to display additional notes and content in the
    +        |  right-hand column. Two mixins are available: #[code +aside] for
    +        |  regular text with an optional title, #[code +aside-code], which
    +        |  roughly mimicks the #[code +code] component. Visually, asides are
    +        |  moved to the side on the X-axis, and displayed at the same level
    +        |  they were inserted. On small screens, they collapse and are rendered
    +        |  in their original position, in between the text.
    +
    +    +h(3, "infobox") Infobox
    +
    +    +aside-code("Usage", "jade").
    +        +infobox("Label") This is text.
    +        +infobox("Label", "⚠️") This is text.
    +
    +    p
    +        |  Infoboxes can be used to add notes, updates, warnings or additional
    +        |  information to a page or section. Semantically, they're implemented
    +        |  and interpreted as an #[code aside] element. Since infobox titles
    +        |  are especially nice with emoji, an emoji can be specified as the
    +        |  second argument for optimal rendering and spacing.
    +
    +    +infobox("Infobox label") Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque enim ante, pretium a orci eget, varius dignissim augue. Nam eu dictum mauris, id tincidunt nisi. Integer commodo pellentesque tincidunt.
    +
    +    +infobox("Infobox label with emoji", "⚠️") Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque enim ante, pretium a orci eget, varius dignissim augue. Nam eu dictum mauris, id tincidunt nisi. Integer commodo pellentesque tincidunt.
    +
    +    +h(3, "card") Card
    +
    +    +aside-code("Usage", "jade").
    +        +grid
    +            +card("Title", "https://", "Author", "github")
    +                |  Card content goes here
    +    p
    +        |  Cards can be used to present external content and links, like GitHub
    +        |  projects, websites, books or articles. They can take an optional
    +        |  value for the content author and icon, which is displayed in the
    +        |  corner. The content supplied via an indented block can also include
    +        |  formatting or other elements like images. Under the hood, cards are
    +        |  styled grid columns and should therefore always be used as children
    +        |  of #[code +grid].
    +
    +    +grid
    +        +card("spaCy", "https://github.com/explosion/spaCy", "Explosion AI", "github")
    +            |  An open-source library for industrial-strength Natural Language
    +            |  Processing in Python.
    +
    +        +card("Prodigy", "https://prodi.gy", "Explosion AI", "star")
    +            |  A new annotation tool for radically efficient machine teaching,
    +            |  powered by active learning.
    +
    ++section("embeds")
    +    +h(2, "embeds") Embeds
    +
    +    p
    +        |  The framework also allows embedding content from selected sites via
    +        |  mixins, usually styled wrappers for the respective embed codes.
    +
    +    +h(3, "codepen") CodePen
    +
    +    p
    +        |  #[+a("https://codepen.io") CodePen] is a platform to share and
    +        |  collaborate on front-end code. It comes with a powerful live editor,
    +        |  and is mostly used on this site to present visualizations created by
    +        |  spaCy's built-in visualizers. Embeds use a
    +        |  #[+a("https://blog.codepen.io/documentation/pro-features/unlimited-embed-themes/") custom theme]
    +        |  and are included using a mixin that takes the pen ID, and an optional
    +        |  height to prevent content reflow on load.
    +
    +    +aside-code("Usage", "jade").
    +        +codepen("2f2ad1408ff79fc6a326ea3aedbb353b", 160)
    +
    +    +codepen("2f2ad1408ff79fc6a326ea3aedbb353b", 160)
    +
    +    +h(3, "github") GitHub
    +
    +    p
    +        |  GitHub only allows native embedding of Gists, but Gists are only
    +        |  available for users, not organisations. So in order to be able to
    +        |  embed examples from spaCy's #[+src(gh("spacy", "examples")) examples],
    +        |  we ended up developing our own micro library. A #[code data-gh-embed]
    +        |  attribute on the code block, set via the mixin, specifies the file
    +        |  to load. The script then fetches the raw text via the GitHub API and
    +        |  renders it in the container. This way, the example previews on the
    +        |  site are always in sync with the examples in the repository.
    +
    +    +aside-code("Usage", "jade").
    +        +github("spacy", "examples/training/train_textcat.py")
    +
    +    +github("spacy", "examples/training/train_textcat.py")
    +
    ++section("markup")
    +    +h(2, "markup") Markup reference
    +
    +    p
    +        |  The spaCy website is implemented
    +        |  in #[+a("https://www.jade-lang.org") Jade (aka Pug)], and is built or
    +        |  served by #[+a("(https://harpjs.com") Harp]. Jade is an extensible
    +        |  templating language with a readable syntax, that compiles to HTML.
    +        |  The website source makes extensive use of Jade mixins, so that the
    +        |  design system is abstracted away from the content you're writing. You
    +        |  can read more about our approach in our blog post,
    +        |  #[+a("https://explosion.ai/blog/modular-markup", true) "Rebuilding a Website with Modular Markup"].
    +
    +    +code("Viewing the site locally", "bash").
    +        sudo npm install --global harp
    +        git clone #{gh("spacy")}
    +        cd spacy/website
    +        harp server --port 9000
    +
    +    +h(3, "jade") Jade conventions
    +
    +    p
    +        |  Jade/Pug is a whitespace-sensitive markup language that compiles to
    +        |  HTML. Indentation is used to nest elements, and for template logic,
    +        |  like #[code if], #[code else] or #[code for], mainly used to iterate
    +        |  over objects and arrays in the meta data. It also allows inline
    +        |  JavaScript expressions.
    +
    +    +grid.o-no-block
    +        +grid-col("half")
    +            +code("Input", "jade").
    +                ul#some-id
    +                    for item in ['a', 'b', 'c']
    +                        li.test=item.toUpperCase()
    +                            if item == 'a'
    +                                |  🎉
    +
    +        +grid-col("half")
    +            +code("Output", "markup").
    +                <ul id="some-id">
    +                    <li class="test">A 🎉<li>
    +                    <li class="test">B<li>
    +                    <li class="test">C<li>
    +                </ul>
    +
    +    p
    +        |  For an overview of Harp and Jade, see
    +        |  #[+a("https://ines.io/blog/the-ultimate-guide-static-websites-harp-jade") this blog post].
    +        |  For more info on the Jade/Pug syntax, check out their
    +        |  #[+a("https://pugjs.org") documentation]. In the spacy.io source, we
    +        |  use 4 spaces to indent and hard-wrap at 80 characters.
    +
    +    +code(false, "jade").
    +        p This is a very short paragraph. It stays inline.
    +
    +        p
    +            |  This is a much longer paragraph. It's hard-wrapped at 80 characters to
    +            |  make it easier to read on GitHub and in editors that do not have soft
    +            |  wrapping enabled. To prevent Jade from interpreting each line as a new
    +            |  element, it's prefixed with a pipe and two spaces. This ensures that no
    +            |  spaces are dropped – for example, if your editor strips out trailing
    +            |  whitespace by default. Inline links are added using the inline syntax,
    +            |  like this: #[+a("https://google.com") Google].
    +
    +    +aside("Plain HTML elements used")
    +        +list.o-no-block
    +            +item #[code p]: Regular paragraph.
    +            +item #[code code]: Inline #[code code].
    +            +item #[code em]: #[em Italicized] text.
    +            +item #[code strong]: #[strong Bold] text.
    +
    +    p
    +        |  Note that for external links, #[code +a("...")] is used instead
    +        |  of #[code a(href="...")] – it's a mixin that takes care of adding all
    +        |  required attributes. If possible, always use a mixin instead of
    +        |  regular HTML elements. With a few exceptions for practical reasons,
    +        |  class names and other HTML attributes should
    +        |  #[strong only live in mixins] and not in the site content.
    +
    +    +infobox("Mixins documentation")
    +        |  For a more detailed overview and API documentation of the available
    +        |  mixins and their arguments, see the source of the
    +        |  #[+src(gh("spacy", "website/_includes/_mixins.jade")) #[code _includes/_mixins.jade]]
    +        |  file.
    +
    +    +h(3, "directory-structure") Directory structure
    +
    +    p
    +        |  Each section is represented by its own subdirectory, containing a
    +        |  #[code _data.json] to store its meta information. All #[code .jade]
    +        |  files that are not prefixed with an underscore are later converted to
    +        |  #[code .html]. Site assets like images, styles, fonts and scripts are
    +        |  loaded from a directory #[code assets]. Global variables like titles,
    +        |  navigations, URLs and other settings are defined in the global
    +        |  #[code _harp.json].
    +
    +    +code("website", "yaml").
    +        ├── _includes         # layout partials, shared mixins, functions
    +        ├── api
    +        |   ├── _data.json    # meta data for API section
    +        |   └── ...           # other pages and partials
    +        ├── assets
    +        |   ├── css           # Sass styles, will be converted to CSS
    +        |   ├── fonts         # web fonts
    +        |   ├── img           # images and icons
    +        |   └── js            # scripts, custom and third-party
    +        ├── models
    +        |   ├── _data.json    # model meta data and meta for models section
    +        |   └── ...           # other pages and partials
    +        ├── usage
    +        |   ├── _data.json    # meta data for usage section
    +        |   └── ...           # other pages and partials
    +        ├── _data.json        # meta data for pages in the root
    +        ├── _harp.json        # global site configuration and variables
    +        ├── _layout.jade      # global layout
    +        ├── 404.jade          # 404 page
    +        └── index.jade        # landing page
    +
    +    +h(3, "data-structure") Data structure
    +
    +    p
    +        |  While all page content lives in the #[code .jade] files, article meta
    +        |  (page titles, sidebars etc.) is stored as JSON. Each folder contains
    +        |  a #[code _data.json] with all required meta for its files. Meta
    +        |  information is keyed by the page's filename or slug, and becomes
    +        |  available to the templates as variables. The #[code menu] specifies
    +        |  the sub-navigation in the sidebar and maps titles to section IDs.
    +
    +    +code(false, "json").
    +        "resources": {
    +            "title": "Resources",
    +            "teaser": "Libraries, demos, books, courses and research systems featuring spaCy.",
    +            "menu": {
    +                "Third-party libraries": "libraries",
    +                "Demos & Visualizations": "demos",
    +                "Books & Courses": "books",
    +                "Jupyter Notebooks": "notebooks",
    +                "Research": "research"
    +            }
    +        }
    +
    +    p
    +        |  Long pages with multiple sections are often split into separate
    +        |  partials that live in their own subdirectory. Those partials can be
    +        |  included on the page, and if needed, across the site to avoid content
    +        |  duplication. Partials and partial directories are prefixed with an
    +        |  underscore #[code _] to prevent Harp from building them as separate
    +        |  files.
    +
    +    +code("spacy-101.jade", "jade").
    +        +section("architecture")
    +            +h(2, "architecture") Architecture
    +            include _spacy-101/_architecture
    +
    +    +h(3, "model-data", "website/models/_data.json") Model data
    +
    +    p
    +        |  The new #[+a("/models") models directory] uses the GitHub API to
    +        |  fetch meta information from the latest
    +        |  #[+a(gh("spacy-models") + "/releases") model releases]. This ensures
    +        |  that the website is always up to date. However, some details, like
    +        |  human-readable descriptions and the list of available models and
    +        |  languages, is stored in the static CMS and used across the site.
    +        |  This info only lives in one place, #[code models/_data.json].
    +        |  Wherever possible, the model info is generated dynamically – for
    +        |  example, in installation examples, quickstart widgets and even in the
    +        |  total model and language count on the landing page.
    +
    +    p
    +        |  The following data is stored and made available in the global scope:
    +
    +    +table(["Variable", "Description", "Example"])
    +        +row
    +            +cell #[code LANGUAGES]
    +            +cell All languages supported by spaCy, code mapped to name.
    +            +cell
    +                +code(false, "json").o-no-block "en": "English"
    +
    +        +row
    +            +cell #[code MODELS]
    +            +cell Model names (without version). Language codes mapped to list of names.
    +            +cell
    +                +code(false, "json").o-no-block "xx": ["xx_ent_wiki_sm"]
    +
    +        +row
    +            +cell #[code MODEL_META]
    +            +cell Description for model name components and meta data, ID mapped to string.
    +            +cell
    +                +code(false, "json").o-no-block "vectors": "Word vectors",
    +
    +        +row
    +            +cell #[code MODEL_LICENSES]
    +            +cell License types mapped to license URL.
    +            +cell
    +                +code(false, "json").o-no-block "CC BY-SA 3.0": "http://..."
    +
    +        +row
    +            +cell #[code MODEL_ACCURACY]
    +            +cell Display labels for accuracy keys.
    +            +cell
    +                +code(false, "json").o-no-block "ents_f": "NER F"
    +
    +        +row
    +            +cell #[code EXAMPLE_SENTENCES]
    +            +cell Example sentences for different languages.
    +            +cell
    +                +code(false, "json").o-no-block "es": "Esto es una frase."
    +
    +    +h(3, "functions", "website/_includes/_functions.jade") Template functions
    +
    +    p
    +        |  Jade allows you to implement any custom logic as inline JavaScript
    +        |  expressions. Reusable functions are organised in a
    +        |  #[code _functions.jade], which is included via the mixins file and
    +        |  makes them accessible on each page. However, most functions deal
    +        |  with internals only, e.g. prefixing class names in mixins or
    +        |  converting paths and links.
    +
    +    +h(4, "gh") gh
    +        +tag function
    +
    +    p
    +        |  Since GitHub links can be long and tricky, this function takes care
    +        |  generating them automatically for spaCy and all repositories owned
    +        |  by the #[+a(gh())=SOCIAL.github] organisation.
    +
    +    +aside-code("Example", "jade").
    +        +a(gh("spacy", "spacy/language.py")) This is a link
    +
    +    +table(["Name", "Type", "Description"])
    +        +row
    +            +cell #[code repo]
    +            +cell String
    +            +cell Name of the repository, e.g. #[code "spacy"].
    +
    +        +row
    +            +cell #[code filepath]
    +            +cell String
    +            +cell Logical path to the file, relative to the repository root.
    +
    +        +row
    +            +cell #[code branch]
    +            +cell String
    +            +cell Optional branch. Defaults to #[code "master"].
    +
    +        +row("foot")
    +            +cell returns
    +            +cell String
    +            +cell The full GitHub link to the file.
    
    From b24fbd8aad5075af611a3f5dc624da57ba4d6983 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:54:33 +0200
    Subject: [PATCH 176/649] Fix titles for social cards
    
    ---
     website/_layout.jade | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/website/_layout.jade b/website/_layout.jade
    index 31c6ce6c3..49a025d96 100644
    --- a/website/_layout.jade
    +++ b/website/_layout.jade
    @@ -3,6 +3,7 @@
     include _includes/_mixins
     
     - title = IS_MODELS ? LANGUAGES[current.source] || title : title
    +- social_title = (SECTION == "index") ? SITENAME + " - " + SLOGAN : title + " - " + SITENAME
     - social_img = SITE_URL + "/assets/img/social/preview_" + (preview || ALPHA ? "alpha" : "default") + ".jpg"
     
     doctype html
    @@ -26,13 +27,13 @@ html(lang="en")
         meta(property="og:type" content="website")
         meta(property="og:site_name" content=sitename)
         meta(property="og:url" content="#{SITE_URL}/#{current.path.join('/')}")
    -    meta(property="og:title" content="#{title} - spaCy")
    +    meta(property="og:title" content=social_title)
         meta(property="og:description" content=description)
         meta(property="og:image" content=social_img)
     
         meta(name="twitter:card" content="summary_large_image")
         meta(name="twitter:site" content="@" + SOCIAL.twitter)
    -    meta(name="twitter:title" content="#{title} - spaCy")
    +    meta(name="twitter:title" content=social_title)
         meta(name="twitter:description" content=description)
         meta(name="twitter:image" content=social_img)
     
    
    From b0dfa059db69ecbbd5134779f86de1c72c2580d4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 15:19:55 +0200
    Subject: [PATCH 177/649] Update docs link in about.py
    
    ---
     spacy/about.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/about.py b/spacy/about.py
    index 0ae019946..b8b1dbbf6 100644
    --- a/spacy/about.py
    +++ b/spacy/about.py
    @@ -11,7 +11,7 @@ __email__ = 'contact@explosion.ai'
     __license__ = 'MIT'
     __release__ = False
     
    -__docs_models__ = 'https://spacy.io/docs/usage/models'
    +__docs_models__ = 'https://alpha.spacy.io/usage/models'
     __download_url__ = 'https://github.com/explosion/spacy-models/releases/download'
     __compatibility__ = 'https://raw.githubusercontent.com/explosion/spacy-models/master/compatibility.json'
     __shortcuts__ = 'https://raw.githubusercontent.com/explosion/spacy-models/master/shortcuts.json'
    
    From e49cd7aeaf81ed12490d82b8a65ca93088ec916e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 15:22:19 +0200
    Subject: [PATCH 178/649] Move import into load to avoid circular imports
    
    ---
     spacy/__init__.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/__init__.py b/spacy/__init__.py
    index 1cb7c0cbd..9acc566ad 100644
    --- a/spacy/__init__.py
    +++ b/spacy/__init__.py
    @@ -3,12 +3,12 @@ from __future__ import unicode_literals
     
     from .cli.info import info as cli_info
     from .glossary import explain
    -from .deprecated import resolve_load_name
     from .about import __version__
     from . import util
     
     
     def load(name, **overrides):
    +    from .deprecated import resolve_load_name
         name = resolve_load_name(name, **overrides)
         return util.load_model(name, **overrides)
     
    
    From 5fb057b5754d1c4aa41c2d0c82f37bf89edd99ed Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 15:45:07 +0200
    Subject: [PATCH 179/649] Fix secondary font stack
    
    ---
     website/assets/css/_variables.sass | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/assets/css/_variables.sass b/website/assets/css/_variables.sass
    index 4fafbfca5..fbceb5a6f 100644
    --- a/website/assets/css/_variables.sass
    +++ b/website/assets/css/_variables.sass
    @@ -21,7 +21,7 @@ $headings: (1: 4.4, 2: 3.4, 3: 2.6, 4: 2.2, 5: 1.8)
     //  Fonts
     
     $font-primary: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default
    -$font-secondary: "HK Grotesk" !default
    +$font-secondary: "HK Grotesk", Roboto, Helvetica, Arial, sans-serif !default
     $font-code: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default
     
     // Colors
    
    From 02586a52431865a165439098bff8482cae96397a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 09:14:34 -0500
    Subject: [PATCH 180/649] Add timing to spacy evaluate command
    
    ---
     spacy/__init__.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/__init__.py b/spacy/__init__.py
    index 1cb7c0cbd..58a2f10a6 100644
    --- a/spacy/__init__.py
    +++ b/spacy/__init__.py
    @@ -4,7 +4,7 @@ from __future__ import unicode_literals
     from .cli.info import info as cli_info
     from .glossary import explain
     from .deprecated import resolve_load_name
    -from .about import __version__
    +#from .about import __version__
     from . import util
     
     
    
    From 96da86b3e5d3a515f0f8db57ef1704750233ff38 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 09:14:57 -0500
    Subject: [PATCH 181/649] Add support for verbose flag to Language
    
    ---
     spacy/language.py | 6 ++++--
     1 file changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 701b5c140..c49c64b1d 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -388,7 +388,7 @@ class Language(object):
             self._optimizer.device = device
             return self._optimizer
     
    -    def evaluate(self, docs_golds):
    +    def evaluate(self, docs_golds, verbose=False):
             scorer = Scorer()
             docs, golds = zip(*docs_golds)
             docs = list(docs)
    @@ -401,7 +401,9 @@ class Language(object):
                     docs = list(pipe.pipe(docs))
             assert len(docs) == len(golds)
             for doc, gold in zip(docs, golds):
    -            scorer.score(doc, gold)
    +            if verbose:
    +                print(doc)
    +            scorer.score(doc, gold, verbose=verbose)
             return scorer
     
         @contextmanager
    
    From a44c4c3a5b91dcf85681df57865942a888485a65 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 09:15:35 -0500
    Subject: [PATCH 182/649] Add timer to evaluate
    
    ---
     spacy/cli/evaluate.py | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index 209660529..f409821b1 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -32,18 +32,25 @@ numpy.random.seed(0)
         model=("Model name or path", "positional", None, str),
         data_path=("Location of JSON-formatted evaluation data", "positional", None, str),
         gold_preproc=("Use gold preprocessing", "flag", "G", bool),
    +    gpu_id=("Use GPU", "option", "g", int),
     )
    -def evaluate(cmd, model, data_path, gold_preproc=False):
    +def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False):
         """
         Train a model. Expects data in spaCy's JSON format.
         """
    +    util.use_gpu(gpu_id)
         util.set_env_log(True)
         data_path = util.ensure_path(data_path)
         if not data_path.exists():
             prints(data_path, title="Evaluation data not found", exits=1)
         corpus = GoldCorpus(data_path, data_path)
         nlp = util.load_model(model)
    -    scorer = nlp.evaluate(list(corpus.dev_docs(nlp, gold_preproc=gold_preproc)))
    +    dev_docs = list(corpus.dev_docs(nlp, gold_preproc=gold_preproc))
    +    begin = timer()
    +    scorer = nlp.evaluate(dev_docs, verbose=False)
    +    end = timer()
    +    nwords = sum(len(doc_gold[0]) for doc_gold in dev_docs)
    +    print('Time', end-begin, 'words', nwords, 'w.p.s', nwords/(end-begin))
         print_results(scorer)
     
     
    
    From 338e1fda0effda0b749926c38dec6f19a2dd6b6f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 09:41:05 -0500
    Subject: [PATCH 183/649] Unbreak merge artefact
    
    ---
     spacy/__init__.py | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/__init__.py b/spacy/__init__.py
    index 25af17361..ba2479106 100644
    --- a/spacy/__init__.py
    +++ b/spacy/__init__.py
    @@ -3,7 +3,6 @@ from __future__ import unicode_literals
     
     from .cli.info import info as cli_info
     from .glossary import explain
    -<<<<<<< HEAD
     from .deprecated import resolve_load_name
     #from .about import __version__
     from .about import __version__
    
    From e514d6aa0a0fe82a2ebc9cf4d867532769dcb26a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 18:39:57 +0200
    Subject: [PATCH 184/649] Import thinc modules more explicitly, to avoid cycles
    
    ---
     spacy/_ml.py | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 62fc7543f..77d6e0615 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -1,10 +1,12 @@
     import ujson
     from thinc.api import add, layerize, chain, clone, concatenate, with_flatten
    -from thinc.neural import Model, Maxout, Softmax, Affine
    +from thinc.neural._classes.model import Model
    +from thinc.neural._classes.maxout import Maxout
    +from thinc.neural._classes.softmax import Softmax
    +from thinc.neural._classes.affine import Affine
     from thinc.neural._classes.hash_embed import HashEmbed
     from thinc.neural.ops import NumpyOps, CupyOps
     from thinc.neural.util import get_array_module
    -import thinc.extra.load_nlp
     import random
     import cytoolz
     
    @@ -13,7 +15,7 @@ from thinc.neural._classes.static_vectors import StaticVectors
     from thinc.neural._classes.batchnorm import BatchNorm as BN
     from thinc.neural._classes.layernorm import LayerNorm as LN
     from thinc.neural._classes.resnet import Residual
    -from thinc.neural import ReLu
    +from thinc.neural._classes.relu import ReLu
     from thinc.neural._classes.selu import SELU
     from thinc import describe
     from thinc.describe import Dimension, Synapses, Biases, Gradient
    @@ -23,6 +25,7 @@ from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool
     from thinc.neural._classes.attention import ParametricAttention
     from thinc.linear.linear import LinearModel
     from thinc.api import uniqued, wrap, flatten_add_lengths, noop
    +import thinc.extra.load_nlp
     
     
     from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER
    
    From cbb1fbef80a15fe2f8415cd698d9f8b78c48ef04 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 18:38:55 +0200
    Subject: [PATCH 185/649] Update train_ner_standalone example
    
    ---
     examples/training/train_ner_standalone.py | 19 +++++++------------
     1 file changed, 7 insertions(+), 12 deletions(-)
    
    diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py
    index 6cca56c69..e4fb1d1e8 100644
    --- a/examples/training/train_ner_standalone.py
    +++ b/examples/training/train_ner_standalone.py
    @@ -20,9 +20,10 @@ import plac
     from pathlib import Path
     import random
     import json
    +import tqdm
    +
     from thinc.neural.optimizers import Adam
     from thinc.neural.ops import NumpyOps
    -import tqdm
     
     from spacy.vocab import Vocab
     from spacy.pipeline import TokenVectorEncoder, NeuralEntityRecognizer
    @@ -35,6 +36,7 @@ from spacy.gold import minibatch
     from spacy.scorer import Scorer
     import spacy.util
     
    +
     try:
         unicode
     except NameError:
    @@ -55,20 +57,17 @@ def init_vocab():
     
     
     class Pipeline(object):
    -    def __init__(self, vocab=None, tokenizer=None, tensorizer=None, entity=None):
    +    def __init__(self, vocab=None, tokenizer=None, entity=None):
             if vocab is None:
                 vocab = init_vocab()
             if tokenizer is None:
                 tokenizer = Tokenizer(vocab, {}, None, None, None)
    -        if tensorizer is None:
    -            tensorizer = TokenVectorEncoder(vocab)
             if entity is None:
                 entity = NeuralEntityRecognizer(vocab)
             self.vocab = vocab
             self.tokenizer = tokenizer
    -        self.tensorizer = tensorizer
             self.entity = entity
    -        self.pipeline = [tensorizer, self.entity]
    +        self.pipeline = [self.entity]
     
         def begin_training(self):
             for model in self.pipeline:
    @@ -102,10 +101,8 @@ class Pipeline(object):
             golds = [self.make_gold(input_, annot) for input_, annot in
                      zip(inputs, annots)]
     
    -        tensors, bp_tensors = self.tensorizer.update(docs, golds, drop=drop)
    -        d_tensors = self.entity.update((docs, tensors), golds, drop=drop,
    -                                      sgd=sgd, losses=losses)
    -        bp_tensors(d_tensors, sgd=sgd)
    +        self.entity.update(docs, golds, drop=drop,
    +                           sgd=sgd, losses=losses)
             return losses
     
         def evaluate(self, examples):
    @@ -123,7 +120,6 @@ class Pipeline(object):
             elif not path.is_dir():
                 raise IOError("Can't save pipeline to %s\nNot a directory" % path)
             self.vocab.to_disk(path / 'vocab')
    -        self.tensorizer.to_disk(path / 'tensorizer')
             self.entity.to_disk(path / 'ner')
     
         def from_disk(self, path):
    @@ -133,7 +129,6 @@ class Pipeline(object):
             if not path.is_dir():
                 raise IOError("Cannot load pipeline from %s\nNot a directory" % path)
             self.vocab = self.vocab.from_disk(path / 'vocab')
    -        self.tensorizer = self.tensorizer.from_disk(path / 'tensorizer')
             self.entity = self.entity.from_disk(path / 'ner')
     
     
    
    From 4a59f6358cfb1926f363b5c094ce5d9d47608928 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 19:21:26 +0200
    Subject: [PATCH 186/649] Fix thinc imports
    
    ---
     spacy/pipeline.pyx         | 6 ++++--
     spacy/syntax/nn_parser.pyx | 5 ++++-
     spacy/tests/test_misc.py   | 3 ++-
     3 files changed, 10 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 1a12107b7..f6ee257d8 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -4,7 +4,6 @@
     from __future__ import unicode_literals
     
     from thinc.api import chain, layerize, with_getitem
    -from thinc.neural import Model, Softmax
     import numpy
     cimport numpy as np
     import cytoolz
    @@ -14,7 +13,10 @@ import ujson
     import msgpack
     
     from thinc.api import add, layerize, chain, clone, concatenate, with_flatten
    -from thinc.neural import Model, Maxout, Softmax, Affine
    +from thinc.neural._classes.model import Model
    +from thinc.neural._classes.maxout import Maxout
    +from thinc.neural._classes.softmax import Softmax
    +from thinc.neural._classes.affine import Affine
     from thinc.neural._classes.hash_embed import HashEmbed
     from thinc.neural.util import to_categorical
     
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 1efdc4474..4043d6dd3 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -38,7 +38,10 @@ from preshed.maps cimport MapStruct
     from preshed.maps cimport map_get
     
     from thinc.api import layerize, chain, noop, clone, with_flatten
    -from thinc.neural import Model, Affine, ReLu, Maxout
    +from thinc.neural._classes.model import Model
    +from thinc.neural._classes.affine import Affine
    +from thinc.neural._classes.relu import ReLu
    +from thinc.neural._classes.maxout import Maxout
     from thinc.neural._classes.batchnorm import BatchNorm as BN
     from thinc.neural._classes.selu import SELU
     from thinc.neural._classes.layernorm import LayerNorm
    diff --git a/spacy/tests/test_misc.py b/spacy/tests/test_misc.py
    index 80b859c70..762ea4c08 100644
    --- a/spacy/tests/test_misc.py
    +++ b/spacy/tests/test_misc.py
    @@ -9,7 +9,8 @@ from .util import get_doc
     
     from pathlib import Path
     import pytest
    -from thinc.neural import Maxout, Softmax
    +from thinc.neural._classes.maxout import Maxout
    +from thinc.neural._classes.softmax import Softmax
     from thinc.api import chain
     
     
    
    From 80a2fb619316b205d3688c608e8027f69bb387a2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 19:40:39 +0200
    Subject: [PATCH 187/649] Update visualizers docs and add submenu
    
    ---
     website/usage/_data.json                 |  10 +-
     website/usage/_visualizers/_dep.jade     |  62 ++++
     website/usage/_visualizers/_ent.jade     |  80 +++++
     website/usage/_visualizers/_html.jade    | 162 +++++++++
     website/usage/_visualizers/_jupyter.jade |  36 ++
     website/usage/visualizers.jade           | 424 +++--------------------
     6 files changed, 393 insertions(+), 381 deletions(-)
     create mode 100644 website/usage/_visualizers/_dep.jade
     create mode 100644 website/usage/_visualizers/_ent.jade
     create mode 100644 website/usage/_visualizers/_html.jade
     create mode 100644 website/usage/_visualizers/_jupyter.jade
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index 3c37ee4d1..b34304ed6 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -167,7 +167,15 @@
     
         "visualizers": {
             "title": "Visualizers",
    -        "next": "resources"
    +        "tag_new": 2,
    +        "teaser": "Visualize dependencies and entities in your browser and notebook, or export HTML.",
    +        "next": "resources",
    +        "menu": {
    +            "Dependencies": "dep",
    +            "Entities": "ent",
    +            "Jupyter Notebooks": "jupyter",
    +            "Rendering HTML": "html"
    +        }
         },
     
         "resources": {
    diff --git a/website/usage/_visualizers/_dep.jade b/website/usage/_visualizers/_dep.jade
    new file mode 100644
    index 000000000..b028ba4cf
    --- /dev/null
    +++ b/website/usage/_visualizers/_dep.jade
    @@ -0,0 +1,62 @@
    +//- 💫 DOCS > USAGE > VISUALIZERS > DEPENDENCIES
    +
    +p
    +    |  The dependency visualizer, #[code dep], shows part-of-speech tags
    +    |  and syntactic dependencies.
    +
    ++code("Dependency example").
    +    import spacy
    +    from spacy import displacy
    +
    +    nlp = spacy.load('en')
    +    doc = nlp(u'This is a sentence.')
    +    displacy.serve(doc, style='dep')
    +
    ++codepen("f0e85b64d469d6617251d8241716d55f", 370)
    +
    +p
    +    |  The argument #[code options] lets you specify a dictionary of settings
    +    |  to customise the layout, for example:
    +
    ++aside("Important note")
    +    |  There's currently a known issue with the #[code compact] mode for
    +    |  sentences with short arrows and long dependency labels, that causes labels
    +    |  longer than the arrow to wrap. So if you come across this problem,
    +    |  especially when using custom labels, you'll have to increase the
    +    |  #[code distance] setting in the #[code options] to allow longer arcs.
    +
    ++table(["Name", "Type", "Description", "Default"])
    +    +row
    +        +cell #[code compact]
    +        +cell bool
    +        +cell "Compact mode" with square arrows that takes up less space.
    +        +cell #[code False]
    +
    +    +row
    +        +cell #[code color]
    +        +cell unicode
    +        +cell Text color (HEX, RGB or color names).
    +        +cell #[code '#000000']
    +
    +    +row
    +        +cell #[code bg]
    +        +cell unicode
    +        +cell Background color (HEX, RGB or color names).
    +        +cell #[code '#ffffff']
    +
    +    +row
    +        +cell #[code font]
    +        +cell unicode
    +        +cell Font name or font family for all text.
    +        +cell #[code 'Arial']
    +
    +p
    +    |  For a list of all available options, see the
    +    |  #[+api("displacy#options") #[code displacy] API documentation].
    +
    ++aside-code("Options example").
    +    options = {'compact': True, 'bg': '#09a3d5',
    +               'color': 'white', 'font': 'Source Sans Pro'}
    +    displacy.serve(doc, style='dep', options=options)
    +
    ++codepen("39c02c893a84794353de77a605d817fd", 360)
    diff --git a/website/usage/_visualizers/_ent.jade b/website/usage/_visualizers/_ent.jade
    new file mode 100644
    index 000000000..e9174cc55
    --- /dev/null
    +++ b/website/usage/_visualizers/_ent.jade
    @@ -0,0 +1,80 @@
    +//- 💫 DOCS > USAGE > VISUALIZERS > ENTITIES
    +
    +p
    +    |  The entity visualizer, #[code ent], highlights named entities and
    +    |  their labels in a text.
    +
    ++code("Named Entity example").
    +    import spacy
    +    from spacy import displacy
    +
    +    text = """But Google is starting from behind. The company made a late push
    +    into hardware, and Apple’s Siri, available on iPhones, and Amazon’s Alexa
    +    software, which runs on its Echo and Dot devices, have clear leads in
    +    consumer adoption."""
    +
    +    nlp = spacy.load('custom_ner_model')
    +    doc = nlp(text)
    +    displacy.serve(doc, style='ent')
    +
    ++codepen("a73f8b68f9af3157855962b283b364e4", 345)
    +
    +p The entity visualizer lets you customise the following #[code options]:
    +
    ++table(["Name", "Type", "Description", "Default"])
    +    +row
    +        +cell #[code ents]
    +        +cell list
    +        +cell
    +            |  Entity types to highlight (#[code None] for all types).
    +        +cell #[code None]
    +
    +    +row
    +        +cell #[code colors]
    +        +cell dict
    +        +cell
    +            |  Color overrides. Entity types in lowercase should be mapped to
    +            |  color names or values.
    +        +cell #[code {}]
    +
    +p
    +    |  If you specify a list of #[code ents], only those entity types will be
    +    |  rendered – for example, you can choose to display #[code PERSON] entities.
    +    |  Internally, the visualizer knows nothing about available entity types and
    +    |  will render whichever spans and labels it receives. This makes it
    +    |  especially easy to work with custom entity types. By default, displaCy
    +    |  comes with colours for all
    +    |  #[+a("/api/annotation#named-entities") entity types supported by spaCy].
    +    |  If you're using custom entity types, you can use the #[code colors]
    +    |  setting to add your own colours for them.
    +
    ++aside-code("Options example").
    +    colors = {'ORG': 'linear-gradient(90deg, #aa9cfc, #fc9ce7)'}
    +    options = {'ents': ['ORG'], 'colors': colors}
    +    displacy.serve(doc, style='ent', options=options)
    +
    ++codepen("f42ec690762b6f007022a7acd6d0c7d4", 300)
    +
    +p
    +    |  The above example uses a little trick: Since the background colour values
    +    |  are added as the #[code background] style attribute, you can use any
    +    |  #[+a("https://tympanus.net/codrops/css_reference/background/") valid background value]
    +    |  or shorthand — including gradients and even images!
    +
    ++h(3, "ent-titles") Adding titles to documents
    +
    +p
    +    |  Rendering several large documents on one page can easily become confusing.
    +    |  To add a headline to each visualization, you can add a #[code title] to
    +    |  its #[code user_data]. User data is never touched or modified by spaCy.
    +
    ++code.
    +    doc = nlp(u'This is a sentence about Google.')
    +    doc.user_data['title'] = 'This is a title'
    +    displacy.serve(doc, style='ent')
    +
    +p
    +    |  This feature is espeically handy if you're using displaCy to compare
    +    |  performance at different stages of a process, e.g. during training. Here
    +    |  you could use the title for a brief description of the text example and
    +    |  the number of iterations.
    diff --git a/website/usage/_visualizers/_html.jade b/website/usage/_visualizers/_html.jade
    new file mode 100644
    index 000000000..701d4b683
    --- /dev/null
    +++ b/website/usage/_visualizers/_html.jade
    @@ -0,0 +1,162 @@
    +//- 💫 DOCS > USAGE > VISUALIZERS > HTML
    +
    +p
    +    |  If you don't need the web server and just want to generate the markup
    +    |  – for example, to export it to a file or serve it in a custom
    +    |  way – you can use #[+api("displacy#render") #[code displacy.render]].
    +    |  It works the same way, but returns a string containing the markup.
    +
    ++code("Example").
    +    import spacy
    +    from spacy import displacy
    +
    +    nlp = spacy.load('en')
    +    doc1 = nlp(u'This is a sentence.')
    +    doc2 = nlp(u'This is another sentence.')
    +    html = displacy.render([doc1, doc2], style='dep', page=True)
    +
    +p
    +    |  #[code page=True] renders the markup wrapped as a full HTML page.
    +    |  For minified and more compact HTML markup, you can set #[code minify=True].
    +    |  If you're rendering a dependency parse, you can also export it as an
    +    |  #[code .svg] file.
    +
    ++aside("What's SVG?")
    +    |  Unlike other image formats, the SVG (Scalable Vector Graphics) uses XML
    +    |  markup that's easy to manipulate
    +    |  #[+a("https://www.smashingmagazine.com/2014/11/styling-and-animating-svgs-with-css/") using CSS] or
    +    |  #[+a("https://css-tricks.com/smil-is-dead-long-live-smil-a-guide-to-alternatives-to-smil-features/") JavaScript].
    +    |  Essentially, SVG lets you design with code, which makes it a perfect fit
    +    |  for visualizing dependency trees. SVGs can be embedded online in an
    +    |  #[code <img>] tag, or inlined in an HTML document. They're also
    +    |  pretty easy to #[+a("https://convertio.co/image-converter/") convert].
    +
    ++code.
    +    svg = displacy.render(doc, style='dep')
    +    output_path = Path('/images/sentence.svg')
    +    output_path.open('w', encoding='utf-8').write(svg)
    +
    ++infobox("Important note")
    +    |  Since each visualization is generated as a separate SVG, exporting
    +    |  #[code .svg] files only works if you're rendering #[strong one single doc]
    +    |  at a time. (This makes sense – after all, each visualization should be
    +    |  a standalone graphic.) So instead of rendering all #[code Doc]s at one,
    +    |  loop over them and export them separately.
    +
    +
    ++h(3, "examples-export-svg") Example: Export SVG graphics of dependency parses
    +
    ++code("Example").
    +    import spacy
    +    from spacy import displacy
    +    from pathlib import Path
    +
    +    nlp = spacy.load('en')
    +    sentences = ["This is an example.", "This is another one."]
    +    for sent in sentences:
    +        doc = nlp(sentence)
    +        svg = displacy.render(doc, style='dep')
    +        file_name = '-'.join([w.text for w in doc if not w.is_punct]) + '.svg'
    +        output_path = Path('/images/' + file_name)
    +        output_path.open('w', encoding='utf-8').write(svg)
    +
    +p
    +    |  The above code will generate the dependency visualizations and them to
    +    |  two files, #[code This-is-an-example.svg] and #[code This-is-another-one.svg].
    +
    +
    ++h(3, "manual-usage") Rendering data manually
    +
    +p
    +    |  You can also use displaCy to manually render data. This can be useful if
    +    |  you want to visualize output from other libraries, like
    +    |  #[+a("http://www.nltk.org") NLTK] or
    +    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet].
    +    |  Simply convert the dependency parse or recognised entities to displaCy's
    +    |  format and set #[code manual=True] on either #[code render()] or
    +    |  #[code serve()].
    +
    ++aside-code("Example").
    +    ex = [{'text': 'But Google is starting from behind.',
    +           'ents': [{'start': 4, 'end': 10, 'label': 'ORG'}],
    +           'title': None}]
    +    html = displacy.render(ex, style='ent', manual=True)
    +
    ++code("DEP input").
    +    {
    +        'words': [
    +            {'text': 'This', 'tag': 'DT'},
    +            {'text': 'is', 'tag': 'VBZ'},
    +            {'text': 'a', 'tag': 'DT'},
    +            {'text': 'sentence', 'tag': 'NN'}],
    +        'arcs': [
    +            {'start': 0, 'end': 1, 'label': 'nsubj', 'dir': 'left'},
    +            {'start': 2, 'end': 3, 'label': 'det', 'dir': 'left'},
    +            {'start': 1, 'end': 3, 'label': 'attr', 'dir': 'right'}]
    +    }
    +
    ++code("ENT input").
    +    {
    +        'text': 'But Google is starting from behind.',
    +        'ents': [{'start': 4, 'end': 10, 'label': 'ORG'}],
    +        'title': None
    +    }
    +
    ++h(3, "webapp") Using displaCy in a web application
    +
    +p
    +    |  If you want to use the visualizers as part of a web application, for
    +    |  example to create something like our
    +    |  #[+a(DEMOS_URL + "/displacy") online demo], it's not recommended to
    +    |  simply wrap and serve the displaCy renderer. Instead, you should only
    +    |  rely on the server to perform spaCy's processing capabilities, and use
    +    |  #[+a(gh("displacy")) displaCy.js] to render the JSON-formatted output.
    +
    ++aside("Why not return the HTML by the server?")
    +    |  It's certainly possible to just have your server return the markup.
    +    |  But outputting raw, unsanitised HTML is risky and makes your app vulnerable to
    +    |  #[+a("https://en.wikipedia.org/wiki/Cross-site_scripting") cross-site scripting]
    +    |  (XSS). All your user needs to do is find a way to make spaCy return text
    +    |  like #[code <script src="malicious-code.js"><script>], which
    +    |  is pretty easy in NER mode. Instead of relying on the server to render
    +    |  and sanitise HTML, you can do this on the client in JavaScript.
    +    |  displaCy.js creates the markup as DOM nodes and will never insert raw
    +    |  HTML.
    +
    +p
    +    |  The #[code parse_deps] function takes a #[code Doc] object and returns
    +    |  a dictionary in a format that can be rendered by displaCy.
    +
    ++code("Example").
    +    import spacy
    +    from spacy import displacy
    +
    +    nlp = spacy.load('en')
    +
    +    def displacy_service(text):
    +        doc = nlp(text)
    +        return displacy.parse_deps(doc)
    +
    +p
    +    |  Using a library like #[+a("https://falconframework.org/") Falcon] or
    +    |  #[+a("http://www.hug.rest/") Hug], you can easily turn the above code
    +    |  into a simple REST API that receives a text and returns a JSON-formatted
    +    |  parse. In your front-end, include #[+a(gh("displacy")) displacy.js] and
    +    |  initialise it with the API URL and the ID or query selector of the
    +    |  container to render the visualisation in, e.g. #[code '#displacy'] for
    +    |  #[code <div id="displacy">].
    +
    ++code("script.js", "javascript").
    +    var displacy = new displaCy('http://localhost:8080', {
    +        container: '#displacy'
    +    })
    +
    +    function parse(text) {
    +        displacy.parse(text);
    +    }
    +
    +p
    +    |  When you call #[code parse()], it will make a request to your API,
    +    |  receive the JSON-formatted parse and render it in your container. To
    +    |  create an interactive experience, you could trigger this function by
    +    |  a button and read the text from an #[code <input>] field.
    diff --git a/website/usage/_visualizers/_jupyter.jade b/website/usage/_visualizers/_jupyter.jade
    new file mode 100644
    index 000000000..f7227e4d1
    --- /dev/null
    +++ b/website/usage/_visualizers/_jupyter.jade
    @@ -0,0 +1,36 @@
    +//- 💫 DOCS > USAGE > VISUALIZERS > JUPYTER
    +
    +p
    +    |  displaCy is able to detect whether you're working in a
    +    |  #[+a("https://jupyter.org") Jupyter] notebook, and will return markup
    +    |  that can be rendered in a cell straight away. When you export your
    +    |  notebook, the visualizations will be included as HTML.
    +
    ++code("Jupyter Example").
    +    # don't forget to install a model, e.g.: spacy download en
    +    import spacy
    +    from spacy import displacy
    +
    +    doc = nlp(u'Rats are various medium-sized, long-tailed rodents.')
    +    displacy.render(doc, style='dep')
    +
    +    doc2 = nlp(LONG_NEWS_ARTICLE)
    +    displacy.render(doc2, style='ent')
    +
    ++aside("Enabling or disabling Jupyter mode")
    +    |  To explicitly enable or disable "Jupyter mode", you can use the
    +    |  #[code jupyter] keyword argument – e.g. to return raw HTML in a notebook,
    +    |  or to force Jupyter rendering if auto-detection fails.
    +
    ++image("/assets/img/displacy_jupyter.jpg", 700, false, "Example of using the displaCy dependency and named entity visualizer in a Jupyter notebook")
    +
    +p
    +    |  Internally, displaCy imports #[code display] and #[code HTML] from
    +    |  #[code IPython.core.display] and returns a Jupyter HTML object. If you
    +    |  were doing it manually, it'd look like this:
    +
    ++code.
    +    from IPython.core.display import display, HTML
    +
    +    html = displacy.render(doc, style='dep')
    +    return display(HTML(html))
    diff --git a/website/usage/visualizers.jade b/website/usage/visualizers.jade
    index 39d34aea6..a092404ac 100644
    --- a/website/usage/visualizers.jade
    +++ b/website/usage/visualizers.jade
    @@ -2,383 +2,47 @@
     
     include ../_includes/_mixins
     
    -p
    -    |  As of v2.0, our popular visualizers, #[+a(DEMOS_URL + "/displacy") displaCy]
    -    |  and #[+a(DEMOS_URL + "/displacy-ent") displaCy #[sup ENT]] are finally an
    -    |  official part of the library. Visualizing a dependency parse or named
    -    |  entities in a text is not only a fun NLP demo – it can also be incredibly
    -    |  helpful in speeding up development and debugging your code and training
    -    |  process. Instead of printing a list of dependency labels or entity spans,
    -    |  you can simply pass your #[code Doc] objects to #[code displacy] and view
    -    |  the visualizations in your browser, or export them as HTML files or
    -    |  vector graphics.
    -
    -p
    -    |  If you're running a #[+a("https://jupyter.org") Jupyter] notebook,
    -    |  displaCy will detect this and return the markup in a format
    -    |  #[+a("#jupyter") ready to be rendered and exported].
    -
    -+aside("What about the old visualizers?")
    -    |  Our JavaScript-based visualizers #[+src(gh("displacy")) #[code displacy.js]] and
    -    |  #[+src(gh("displacy-ent")) #[code displacy-ent.js]] will still be available on
    -    |  GitHub. If you're looking to implement web-based visualizations, we
    -    |  generally recommend using those instead of spaCy's built-in
    -    |  #[code displacy] module. It'll allow your application to perform all
    -    |  rendering on the client and only rely on the server for the text
    -    |  processing. The generated markup is also more compatible with modern web
    -    |  standards.
    -
    -+h(2, "getting-started") Getting started
    -    +tag-new(2)
    -
    -p
    -    |  The quickest way visualize  #[code Doc] is to use
    -    |  #[+api("displacy#serve") #[code displacy.serve]]. This will spin up a
    -    |  simple web server and let you view the result straight from your browser.
    -    |  displaCy can either take a single #[code Doc] or a list of #[code Doc]
    -    |  objects as its first argument. This lets you construct them however you
    -    |  like – using any model or modifications you like.
    -
    -+h(3, "dep") Visualizing the dependency parse
    -
    -p
    -    |  The dependency visualizer, #[code dep], shows part-of-speech tags
    -    |  and syntactic dependencies.
    -
    -+code("Dependency example").
    -    import spacy
    -    from spacy import displacy
    -
    -    nlp = spacy.load('en')
    -    doc = nlp(u'This is a sentence.')
    -    displacy.serve(doc, style='dep')
    -
    -+codepen("f0e85b64d469d6617251d8241716d55f", 370)
    -
    -p
    -    |  The argument #[code options] lets you specify a dictionary of settings
    -    |  to customise the layout, for example:
    -
    -+aside("Important note")
    -    |  There's currently a known issue with the #[code compact] mode for
    -    |  sentences with short arrows and long dependency labels, that causes labels
    -    |  longer than the arrow to wrap. So if you come across this problem,
    -    |  especially when using custom labels, you'll have to increase the
    -    |  #[code distance] setting in the #[code options] to allow longer arcs.
    -
    -+table(["Name", "Type", "Description", "Default"])
    -    +row
    -        +cell #[code compact]
    -        +cell bool
    -        +cell "Compact mode" with square arrows that takes up less space.
    -        +cell #[code False]
    -
    -    +row
    -        +cell #[code color]
    -        +cell unicode
    -        +cell Text color (HEX, RGB or color names).
    -        +cell #[code '#000000']
    -
    -    +row
    -        +cell #[code bg]
    -        +cell unicode
    -        +cell Background color (HEX, RGB or color names).
    -        +cell #[code '#ffffff']
    -
    -    +row
    -        +cell #[code font]
    -        +cell unicode
    -        +cell Font name or font family for all text.
    -        +cell #[code 'Arial']
    -
    -p
    -    |  For a list of all available options, see the
    -    |  #[+api("displacy#options") #[code displacy] API documentation].
    -
    -+aside-code("Options example").
    -    options = {'compact': True, 'bg': '#09a3d5',
    -               'color': 'white', 'font': 'Source Sans Pro'}
    -    displacy.serve(doc, style='dep', options=options)
    -
    -+codepen("39c02c893a84794353de77a605d817fd", 360)
    -
    -+h(3, "ent") Visualizing the entity recognizer
    -
    -p
    -    |  The entity visualizer, #[code ent], highlights named entities and
    -    |  their labels in a text.
    -
    -+code("Named Entity example").
    -    import spacy
    -    from spacy import displacy
    -
    -    text = """But Google is starting from behind. The company made a late push
    -    into hardware, and Apple’s Siri, available on iPhones, and Amazon’s Alexa
    -    software, which runs on its Echo and Dot devices, have clear leads in
    -    consumer adoption."""
    -
    -    nlp = spacy.load('custom_ner_model')
    -    doc = nlp(text)
    -    displacy.serve(doc, style='ent')
    -
    -+codepen("a73f8b68f9af3157855962b283b364e4", 345)
    -
    -p The entity visualizer lets you customise the following #[code options]:
    -
    -+table(["Name", "Type", "Description", "Default"])
    -    +row
    -        +cell #[code ents]
    -        +cell list
    -        +cell
    -            |  Entity types to highlight (#[code None] for all types).
    -        +cell #[code None]
    -
    -    +row
    -        +cell #[code colors]
    -        +cell dict
    -        +cell
    -            |  Color overrides. Entity types in lowercase should be mapped to
    -            |  color names or values.
    -        +cell #[code {}]
    -
    -p
    -    |  If you specify a list of #[code ents], only those entity types will be
    -    |  rendered – for example, you can choose to display #[code PERSON] entities.
    -    |  Internally, the visualizer knows nothing about available entity types and
    -    |  will render whichever spans and labels it receives. This makes it
    -    |  especially easy to work with custom entity types. By default, displaCy
    -    |  comes with colours for all
    -    |  #[+a("/api/annotation#named-entities") entity types supported by spaCy].
    -    |  If you're using custom entity types, you can use the #[code colors]
    -    |  setting to add your own colours for them.
    -
    -+aside-code("Options example").
    -    colors = {'ORG': 'linear-gradient(90deg, #aa9cfc, #fc9ce7)'}
    -    options = {'ents': ['ORG'], 'colors': colors}
    -    displacy.serve(doc, style='ent', options=options)
    -
    -+codepen("f42ec690762b6f007022a7acd6d0c7d4", 300)
    -
    -p
    -    |  The above example uses a little trick: Since the background colour values
    -    |  are added as the #[code background] style attribute, you can use any
    -    |  #[+a("https://tympanus.net/codrops/css_reference/background/") valid background value]
    -    |  or shorthand — including gradients and even images!
    -
    -+h(3, "ent-titles") Adding titles to documents
    -
    -p
    -    |  Rendering several large documents on one page can easily become confusing.
    -    |  To add a headline to each visualization, you can add a #[code title] to
    -    |  its #[code user_data]. User data is never touched or modified by spaCy.
    -
    -+code.
    -    doc = nlp(u'This is a sentence about Google.')
    -    doc.user_data['title'] = 'This is a title'
    -    displacy.serve(doc, style='ent')
    -
    -p
    -    |  This feature is espeically handy if you're using displaCy to compare
    -    |  performance at different stages of a process, e.g. during training. Here
    -    |  you could use the title for a brief description of the text example and
    -    |  the number of iterations.
    -
    -+h(2, "render") Rendering visualizations
    -
    -p
    -    |  If you don't need the web server and just want to generate the markup
    -    |  – for example, to export it to a file or serve it in a custom
    -    |  way – you can use #[+api("displacy#render") #[code displacy.render]].
    -    |  It works the same way, but returns a string containing the markup.
    -
    -+code("Example").
    -    import spacy
    -    from spacy import displacy
    -
    -    nlp = spacy.load('en')
    -    doc1 = nlp(u'This is a sentence.')
    -    doc2 = nlp(u'This is another sentence.')
    -    html = displacy.render([doc1, doc2], style='dep', page=True)
    -
    -p
    -    |  #[code page=True] renders the markup wrapped as a full HTML page.
    -    |  For minified and more compact HTML markup, you can set #[code minify=True].
    -    |  If you're rendering a dependency parse, you can also export it as an
    -    |  #[code .svg] file.
    -
    -+aside("What's SVG?")
    -    |  Unlike other image formats, the SVG (Scalable Vector Graphics) uses XML
    -    |  markup that's easy to manipulate
    -    |  #[+a("https://www.smashingmagazine.com/2014/11/styling-and-animating-svgs-with-css/") using CSS] or
    -    |  #[+a("https://css-tricks.com/smil-is-dead-long-live-smil-a-guide-to-alternatives-to-smil-features/") JavaScript].
    -    |  Essentially, SVG lets you design with code, which makes it a perfect fit
    -    |  for visualizing dependency trees. SVGs can be embedded online in an
    -    |  #[code <img>] tag, or inlined in an HTML document. They're also
    -    |  pretty easy to #[+a("https://convertio.co/image-converter/") convert].
    -
    -+code.
    -    svg = displacy.render(doc, style='dep')
    -    output_path = Path('/images/sentence.svg')
    -    output_path.open('w', encoding='utf-8').write(svg)
    -
    -+infobox("Important note")
    -    |  Since each visualization is generated as a separate SVG, exporting
    -    |  #[code .svg] files only works if you're rendering #[strong one single doc]
    -    |  at a time. (This makes sense – after all, each visualization should be
    -    |  a standalone graphic.) So instead of rendering all #[code Doc]s at one,
    -    |  loop over them and export them separately.
    -
    -
    -+h(3, "examples-export-svg") Example: Export SVG graphics of dependency parses
    -
    -+code("Example").
    -    import spacy
    -    from spacy import displacy
    -    from pathlib import Path
    -
    -    nlp = spacy.load('en')
    -    sentences = ["This is an example.", "This is another one."]
    -    for sent in sentences:
    -        doc = nlp(sentence)
    -        svg = displacy.render(doc, style='dep')
    -        file_name = '-'.join([w.text for w in doc if not w.is_punct]) + '.svg'
    -        output_path = Path('/images/' + file_name)
    -        output_path.open('w', encoding='utf-8').write(svg)
    -
    -p
    -    |  The above code will generate the dependency visualizations and them to
    -    |  two files, #[code This-is-an-example.svg] and #[code This-is-another-one.svg].
    -
    -
    -+h(2, "jupyter") Using displaCy in Jupyter notebooks
    -
    -p
    -    |  displaCy is able to detect whether you're working in a
    -    |  #[+a("https://jupyter.org") Jupyter] notebook, and will return markup
    -    |  that can be rendered in a cell straight away. When you export your
    -    |  notebook, the visualizations will be included as HTML.
    -
    -+code("Jupyter Example").
    -    # don't forget to install a model, e.g.: spacy download en
    -    import spacy
    -    from spacy import displacy
    -
    -    doc = nlp(u'Rats are various medium-sized, long-tailed rodents.')
    -    displacy.render(doc, style='dep')
    -
    -    doc2 = nlp(LONG_NEWS_ARTICLE)
    -    displacy.render(doc2, style='ent')
    -
    -+aside("Enabling or disabling Jupyter mode")
    -    |  To explicitly enable or disable "Jupyter mode", you can use the
    -    |  #[code jupyter] keyword argument – e.g. to return raw HTML in a notebook,
    -    |  or to force Jupyter rendering if auto-detection fails.
    -
    -+image("/assets/img/displacy_jupyter.jpg", 700, false, "Example of using the displaCy dependency and named entity visualizer in a Jupyter notebook")
    -
    -p
    -    |  Internally, displaCy imports #[code display] and #[code HTML] from
    -    |  #[code IPython.core.display] and returns a Jupyter HTML object. If you
    -    |  were doing it manually, it'd look like this:
    -
    -+code.
    -    from IPython.core.display import display, HTML
    -
    -    html = displacy.render(doc, style='dep')
    -    return display(HTML(html))
    -
    -+h(2, "manual-usage") Rendering data manually
    -
    -p
    -    |  You can also use displaCy to manually render data. This can be useful if
    -    |  you want to visualize output from other libraries, like
    -    |  #[+a("http://www.nltk.org") NLTK] or
    -    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet].
    -    |  Simply convert the dependency parse or recognised entities to displaCy's
    -    |  format and set #[code manual=True] on either #[code render()] or
    -    |  #[code serve()].
    -
    -+aside-code("Example").
    -    ex = [{'text': 'But Google is starting from behind.',
    -           'ents': [{'start': 4, 'end': 10, 'label': 'ORG'}],
    -           'title': None}]
    -    html = displacy.render(ex, style='ent', manual=True)
    -
    -+code("DEP input").
    -    {
    -        'words': [
    -            {'text': 'This', 'tag': 'DT'},
    -            {'text': 'is', 'tag': 'VBZ'},
    -            {'text': 'a', 'tag': 'DT'},
    -            {'text': 'sentence', 'tag': 'NN'}],
    -        'arcs': [
    -            {'start': 0, 'end': 1, 'label': 'nsubj', 'dir': 'left'},
    -            {'start': 2, 'end': 3, 'label': 'det', 'dir': 'left'},
    -            {'start': 1, 'end': 3, 'label': 'attr', 'dir': 'right'}]
    -    }
    -
    -+code("ENT input").
    -    {
    -        'text': 'But Google is starting from behind.',
    -        'ents': [{'start': 4, 'end': 10, 'label': 'ORG'}],
    -        'title': None
    -    }
    -
    -+h(2, "webapp") Using displaCy in a web application
    -
    -p
    -    |  If you want to use the visualizers as part of a web application, for
    -    |  example to create something like our
    -    |  #[+a(DEMOS_URL + "/displacy") online demo], it's not recommended to
    -    |  simply wrap and serve the displaCy renderer. Instead, you should only
    -    |  rely on the server to perform spaCy's processing capabilities, and use
    -    |  #[+a(gh("displacy")) displaCy.js] to render the JSON-formatted output.
    -
    -+aside("Why not return the HTML by the server?")
    -    |  It's certainly possible to just have your server return the markup.
    -    |  But outputting raw, unsanitised HTML is risky and makes your app vulnerable to
    -    |  #[+a("https://en.wikipedia.org/wiki/Cross-site_scripting") cross-site scripting]
    -    |  (XSS). All your user needs to do is find a way to make spaCy return text
    -    |  like #[code <script src="malicious-code.js"><script>], which
    -    |  is pretty easy in NER mode. Instead of relying on the server to render
    -    |  and sanitise HTML, you can do this on the client in JavaScript.
    -    |  displaCy.js creates the markup as DOM nodes and will never insert raw
    -    |  HTML.
    -
    -p
    -    |  The #[code parse_deps] function takes a #[code Doc] object and returns
    -    |  a dictionary in a format that can be rendered by displaCy.
    -
    -+code("Example").
    -    import spacy
    -    from spacy import displacy
    -
    -    nlp = spacy.load('en')
    -
    -    def displacy_service(text):
    -        doc = nlp(text)
    -        return displacy.parse_deps(doc)
    -
    -p
    -    |  Using a library like #[+a("https://falconframework.org/") Falcon] or
    -    |  #[+a("http://www.hug.rest/") Hug], you can easily turn the above code
    -    |  into a simple REST API that receives a text and returns a JSON-formatted
    -    |  parse. In your front-end, include #[+a(gh("displacy")) displacy.js] and
    -    |  initialise it with the API URL and the ID or query selector of the
    -    |  container to render the visualisation in, e.g. #[code '#displacy'] for
    -    |  #[code <div id="displacy">].
    -
    -+code("script.js", "javascript").
    -    var displacy = new displaCy('http://localhost:8080', {
    -        container: '#displacy'
    -    })
    -
    -    function parse(text) {
    -        displacy.parse(text);
    -    }
    -
    -p
    -    |  When you call #[code parse()], it will make a request to your API,
    -    |  receive the JSON-formatted parse and render it in your container. To
    -    |  create an interactive experience, you could trigger this function by
    -    |  a button and read the text from an #[code <input>] field.
    ++section
    +    p
    +        |  As of v2.0, our popular visualizers, #[+a(DEMOS_URL + "/displacy") displaCy]
    +        |  and #[+a(DEMOS_URL + "/displacy-ent") displaCy #[sup ENT]] are finally an
    +        |  official part of the library. Visualizing a dependency parse or named
    +        |  entities in a text is not only a fun NLP demo – it can also be incredibly
    +        |  helpful in speeding up development and debugging your code and training
    +        |  process. If you're running a #[+a("https://jupyter.org") Jupyter] notebook,
    +        |  displaCy will detect this and return the markup in a format
    +        |  #[+a("#jupyter") ready to be rendered and exported].
    +
    +    +aside("What about the old visualizers?")
    +        |  Our JavaScript-based visualizers #[+src(gh("displacy")) #[code displacy.js]] and
    +        |  #[+src(gh("displacy-ent")) #[code displacy-ent.js]] will still be available on
    +        |  GitHub. If you're looking to implement web-based visualizations, we
    +        |  generally recommend using those instead of spaCy's built-in
    +        |  #[code displacy] module. It'll allow your application to perform all
    +        |  rendering on the client and only rely on the server for the text
    +        |  processing. The generated markup is also more compatible with modern web
    +        |  standards.
    +
    +    p
    +        |  The quickest way visualize  #[code Doc] is to use
    +        |  #[+api("displacy#serve") #[code displacy.serve]]. This will spin up a
    +        |  simple web server and let you view the result straight from your browser.
    +        |  displaCy can either take a single #[code Doc] or a list of #[code Doc]
    +        |  objects as its first argument. This lets you construct them however you
    +        |  like – using any model or modifications you like.
    +
    ++section("dep")
    +    +h(2, "dep") Visualizing the dependency parse
    +    include _visualizers/_dep
    +
    ++section("ent")
    +    +h(2, "ent") Visualizing the entity recognizer
    +    include _visualizers/_ent
    +
    ++section("jupyter")
    +    +h(2, "jupyter") Using displaCy in Jupyter notebooks
    +    include _visualizers/_jupyter
    +
    ++section("html")
    +    +h(2, "html") Rendering HTML
    +    include _visualizers/_html
    
    From 5454b20cd7dbb41da577578e55274e556db00a4c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 20:07:17 +0200
    Subject: [PATCH 188/649] Update thinc imports for 6.9
    
    ---
     spacy/_ml.py               | 31 +++++++++++++------------------
     spacy/pipeline.pyx         | 18 ++++++++----------
     spacy/syntax/nn_parser.pyx | 10 +++-------
     3 files changed, 24 insertions(+), 35 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 77d6e0615..47f5c545e 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -1,33 +1,28 @@
     import ujson
    +from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU
    +from thinc.i2v import HashEmbed, StaticVectors
    +from thinc.t2t import ExtractWindow, ParametricAttention
    +from thinc.t2v import Pooling, max_pool, mean_pool, sum_pool
    +from thinc.misc import Residual
    +from thinc.misc import BatchNorm as BN
    +from thinc.misc import LayerNorm as LN
    +
     from thinc.api import add, layerize, chain, clone, concatenate, with_flatten
    -from thinc.neural._classes.model import Model
    -from thinc.neural._classes.maxout import Maxout
    -from thinc.neural._classes.softmax import Softmax
    -from thinc.neural._classes.affine import Affine
    -from thinc.neural._classes.hash_embed import HashEmbed
    +from thinc.api import FeatureExtracter, with_getitem
    +from thinc.api import uniqued, wrap, flatten_add_lengths, noop
    +
    +from thinc.linear.linear import LinearModel
     from thinc.neural.ops import NumpyOps, CupyOps
     from thinc.neural.util import get_array_module
    +
     import random
     import cytoolz
     
    -from thinc.neural._classes.convolution import ExtractWindow
    -from thinc.neural._classes.static_vectors import StaticVectors
    -from thinc.neural._classes.batchnorm import BatchNorm as BN
    -from thinc.neural._classes.layernorm import LayerNorm as LN
    -from thinc.neural._classes.resnet import Residual
    -from thinc.neural._classes.relu import ReLu
    -from thinc.neural._classes.selu import SELU
     from thinc import describe
     from thinc.describe import Dimension, Synapses, Biases, Gradient
     from thinc.neural._classes.affine import _set_dimensions_if_needed
    -from thinc.api import FeatureExtracter, with_getitem
    -from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool
    -from thinc.neural._classes.attention import ParametricAttention
    -from thinc.linear.linear import LinearModel
    -from thinc.api import uniqued, wrap, flatten_add_lengths, noop
     import thinc.extra.load_nlp
     
    -
     from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER
     from .tokens.doc import Doc
     from . import util
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index f6ee257d8..8d935335c 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -13,20 +13,18 @@ import ujson
     import msgpack
     
     from thinc.api import add, layerize, chain, clone, concatenate, with_flatten
    -from thinc.neural._classes.model import Model
    -from thinc.neural._classes.maxout import Maxout
    -from thinc.neural._classes.softmax import Softmax
    -from thinc.neural._classes.affine import Affine
    -from thinc.neural._classes.hash_embed import HashEmbed
    +from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU
    +from thinc.i2v import HashEmbed
    +from thinc.t2v import Pooling, max_pool, mean_pool, sum_pool
    +from thinc.t2t import ExtractWindow, ParametricAttention
    +from thinc.misc import Residual
    +from thinc.misc import BatchNorm as BN
    +from thinc.misc import LayerNorm as LN
    +
     from thinc.neural.util import to_categorical
     
    -from thinc.neural.pooling import Pooling, max_pool, mean_pool
     from thinc.neural._classes.difference import Siamese, CauchySimilarity
     
    -from thinc.neural._classes.convolution import ExtractWindow
    -from thinc.neural._classes.resnet import Residual
    -from thinc.neural._classes.batchnorm import BatchNorm as BN
    -
     from .tokens.doc cimport Doc
     from .syntax.parser cimport Parser as LinearParser
     from .syntax.nn_parser cimport Parser as NeuralParser
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 4043d6dd3..459c94463 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -38,13 +38,9 @@ from preshed.maps cimport MapStruct
     from preshed.maps cimport map_get
     
     from thinc.api import layerize, chain, noop, clone, with_flatten
    -from thinc.neural._classes.model import Model
    -from thinc.neural._classes.affine import Affine
    -from thinc.neural._classes.relu import ReLu
    -from thinc.neural._classes.maxout import Maxout
    -from thinc.neural._classes.batchnorm import BatchNorm as BN
    -from thinc.neural._classes.selu import SELU
    -from thinc.neural._classes.layernorm import LayerNorm
    +from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU
    +from thinc.misc import LayerNorm
    +
     from thinc.neural.ops import NumpyOps, CupyOps
     from thinc.neural.util import get_array_module
     
    
    From 5cbefcba1743701a4d895123178a885454cf6c45 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 20:29:58 +0200
    Subject: [PATCH 189/649] Set backwards compatibility flag
    
    ---
     spacy/_ml.py | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 47f5c545e..3b96a69b5 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -30,6 +30,10 @@ from . import util
     import numpy
     import io
     
    +# TODO: Unset this once we don't want to support models previous models.
    +import thinc.neural._classes.layernorm
    +thinc.neural._classes.layernorm.set_compat_six_eight(True)
    +
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
     @layerize
    
    From 252299ca2a518ea2d6e1e04208bce516e9d1ef59 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 21:29:43 +0200
    Subject: [PATCH 190/649] Add sdist command
    
    ---
     fabfile.py | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/fabfile.py b/fabfile.py
    index cfa80ead5..02a2110d9 100644
    --- a/fabfile.py
    +++ b/fabfile.py
    @@ -32,6 +32,10 @@ def make():
                 local('pip install -r requirements.txt')
                 local('python setup.py build_ext --inplace')
     
    +def sdist():
    +    with virtualenv(VENV_DIR):
    +        with lcd(path.dirname(__file__)):
    +            local('python setup.py sdist')
     
     def clean():
         with lcd(path.dirname(__file__)):
    
    From c69b0836a0f8a10f9bc56517ffb0d8abe1918b10 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 21:31:41 +0200
    Subject: [PATCH 191/649] Fix fabfile
    
    ---
     fabfile.py | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/fabfile.py b/fabfile.py
    index 02a2110d9..2894fe477 100644
    --- a/fabfile.py
    +++ b/fabfile.py
    @@ -14,6 +14,7 @@ VENV_DIR = path.join(PWD, ENV)
     def env(lang='python2.7'):
         if path.exists(VENV_DIR):
             local('rm -rf {env}'.format(env=VENV_DIR))
    +    local('pip install virtualenv')
         local('python -m virtualenv -p {lang} {env}'.format(lang=lang, env=VENV_DIR))
     
     
    
    From 2eb0fe4957f4b827e85e41b811f832c1970567d6 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 21:40:04 +0200
    Subject: [PATCH 192/649] Fix setup.py
    
    ---
     setup.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/setup.py b/setup.py
    index 8943d7a2e..23b4f9581 100755
    --- a/setup.py
    +++ b/setup.py
    @@ -195,7 +195,7 @@ def setup_package():
                     'murmurhash>=0.28,<0.29',
                     'cymem>=1.30,<1.32',
                     'preshed>=1.0.0,<2.0.0',
    -                'thinc>=6.8.2,<6.9.0',
    +                'thinc>=6.9.0,<6.10.0',
                     'plac<1.0.0,>=0.9.6',
                     'six',
                     'pathlib',
    
    From 32b9f3d1a671f2a8aeb6f07cf897ec069cf4e06a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 22:17:31 +0200
    Subject: [PATCH 193/649] Require new thinc
    
    ---
     requirements.txt | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/requirements.txt b/requirements.txt
    index 7fa5d72d3..0b46b38d5 100644
    --- a/requirements.txt
    +++ b/requirements.txt
    @@ -3,7 +3,7 @@ pathlib
     numpy>=1.7
     cymem>=1.30,<1.32
     preshed>=1.0.0,<2.0.0
    -thinc>=6.8.2,<6.9.0
    +thinc>=6.9.0,<6.10.0
     murmurhash>=0.28,<0.29
     plac<1.0.0,>=0.9.6
     six
    
    From f24c2e3a8af785dd11b8d0a994732174290d688b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 22:47:31 +0200
    Subject: [PATCH 194/649] Fix evaluate for non-GPU
    
    ---
     spacy/cli/evaluate.py | 2 +-
     spacy/util.py         | 5 ++++-
     2 files changed, 5 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index f409821b1..d9be95fae 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -39,7 +39,7 @@ def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False):
         Train a model. Expects data in spaCy's JSON format.
         """
         util.use_gpu(gpu_id)
    -    util.set_env_log(True)
    +    util.set_env_log(False)
         data_path = util.ensure_path(data_path)
         if not data_path.exists():
             prints(data_path, title="Evaluation data not found", exits=1)
    diff --git a/spacy/util.py b/spacy/util.py
    index 911970831..e1a721a12 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -563,7 +563,10 @@ def minify_html(html):
     
     
     def use_gpu(gpu_id):
    -    import cupy.cuda.device
    +    try:
    +        import cupy.cuda.device
    +    except ImportError:
    +        return None
         from thinc.neural.ops import CupyOps
         device = cupy.cuda.device.Device(gpu_id)
         device.use()
    
    From 73ac0aa0b560e3b719ebafe3b5dbbdf27eb18616 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:03:15 +0200
    Subject: [PATCH 195/649] Update spacy evaluate and add displaCy option
    
    ---
     spacy/cli/evaluate.py | 45 ++++++++++++++++++++++++++++++-------------
     1 file changed, 32 insertions(+), 13 deletions(-)
    
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index d9be95fae..42e077dc2 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -33,16 +33,23 @@ numpy.random.seed(0)
         data_path=("Location of JSON-formatted evaluation data", "positional", None, str),
         gold_preproc=("Use gold preprocessing", "flag", "G", bool),
         gpu_id=("Use GPU", "option", "g", int),
    +    displacy_path=("Directory to output rendered parses as HTML", "option", "dp", str),
    +    displacy_limit=("Limit of parses to render as HTML", "option", "dl", int)
     )
    -def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False):
    +def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False,
    +             displacy_path=None, displacy_limit=25):
         """
    -    Train a model. Expects data in spaCy's JSON format.
    +    Evaluate a model. To render a sample of parses in a HTML file, set an output
    +    directory as the displacy_path argument.
         """
         util.use_gpu(gpu_id)
         util.set_env_log(False)
         data_path = util.ensure_path(data_path)
    +    displacy_path = util.ensure_path(displacy_path)
         if not data_path.exists():
             prints(data_path, title="Evaluation data not found", exits=1)
    +    if displacy_path and not displacy_path.exists():
    +        prints(displacy_path, title="Visualization output directory not found", exits=1)
         corpus = GoldCorpus(data_path, data_path)
         nlp = util.load_model(model)
         dev_docs = list(corpus.dev_docs(nlp, gold_preproc=gold_preproc))
    @@ -50,18 +57,27 @@ def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False):
         scorer = nlp.evaluate(dev_docs, verbose=False)
         end = timer()
         nwords = sum(len(doc_gold[0]) for doc_gold in dev_docs)
    -    print('Time', end-begin, 'words', nwords, 'w.p.s', nwords/(end-begin))
    -    print_results(scorer)
    +    print_results(scorer, time=end - begin, words=nwords,
    +                  wps=nwords / (end - begin))
    +    if displacy_path:
    +        docs, golds = zip(*dev_docs)
    +        render_deps = 'parser' in nlp.meta.get('pipeline', [])
    +        render_ents = 'ner' in nlp.meta.get('pipeline', [])
    +        render_parses(docs, displacy_path, model_name=model, limit=displacy_limit,
    +                      deps=render_deps, ents=render_ents)
    +        prints(displacy_path, title="Generated %s parses as HTML" % displacy_limit)
     
     
    -def _render_parses(i, to_render):
    -    to_render[0].user_data['title'] = "Batch %d" % i
    -    with Path('/tmp/entities.html').open('w') as file_:
    -        html = displacy.render(to_render[:5], style='ent', page=True)
    -        file_.write(html)
    -    with Path('/tmp/parses.html').open('w') as file_:
    -        html = displacy.render(to_render[:5], style='dep', page=True)
    -        file_.write(html)
    +def render_parses(docs, output_path, model_name='', limit=250, deps=True, ents=True):
    +    docs[0].user_data['title'] = model_name
    +    if ents:
    +        with (output_path / 'entities.html').open('w') as file_:
    +            html = displacy.render(docs[:limit], style='ent', page=True)
    +            file_.write(html)
    +    if deps:
    +        with (output_path / 'parses.html').open('w') as file_:
    +            html = displacy.render(docs[:limit], style='dep', page=True, options={'compact': True})
    +            file_.write(html)
     
     
     def print_progress(itn, losses, dev_scores, wps=0.0):
    @@ -88,8 +104,11 @@ def print_progress(itn, losses, dev_scores, wps=0.0):
         print(tpl.format(itn, **scores))
     
     
    -def print_results(scorer):
    +def print_results(scorer, time, words, wps):
         results = {
    +        'Time': '%.2f s' % time,
    +        'Words': words,
    +        'Words/s': '%.0f' % wps,
             'TOK': '%.2f' % scorer.token_acc,
             'POS': '%.2f' % scorer.tags_acc,
             'UAS': '%.2f' % scorer.uas,
    
    From bfb512f45a14b6f436cace5dab536871171e4ba8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:18:41 +0200
    Subject: [PATCH 196/649] Add website package.json and fix gitignore
    
    ---
     .gitignore           |  2 --
     website/package.json | 20 ++++++++++++++++++++
     2 files changed, 20 insertions(+), 2 deletions(-)
     create mode 100644 website/package.json
    
    diff --git a/.gitignore b/.gitignore
    index 572eea92d..14097dfcd 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -7,8 +7,6 @@ keys/
     # Website
     website/www/
     website/_deploy.sh
    -website/package.json
    -website/announcement.jade
     website/.gitignore
     
     # Cython / C extensions
    diff --git a/website/package.json b/website/package.json
    new file mode 100644
    index 000000000..c86aca222
    --- /dev/null
    +++ b/website/package.json
    @@ -0,0 +1,20 @@
    +{
    +  "name": "spacy.io",
    +  "private": true,
    +  "version": "2.0.0",
    +  "description": "spacy.io website",
    +  "author": "Explosion AI",
    +  "license": "MIT",
    +  "devDependencies": {
    +    "babel-cli": "^6.14.0",
    +    "harp": "^0.24.0",
    +    "uglify-js": "^2.7.3"
    +  },
    +  "dependencies": {},
    +  "scripts": {
    +    "compile": "NODE_ENV=deploy harp compile",
    +    "compile_js": "babel www/assets/js/main.js --out-file www/assets/js/main.js --presets=es2015",
    +    "uglify": "uglifyjs www/assets/js/main.js --output www/assets/js/main.js",
    +    "build": "npm run compile && npm run compile_js && npm run uglify"
    +  }
    +}
    
    From 464f14019d11ff3417fc9a522b810080ee406fe2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:18:47 +0200
    Subject: [PATCH 197/649] Fix typos
    
    ---
     website/styleguide.jade | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    index 107f7e2e6..42e70ed73 100644
    --- a/website/styleguide.jade
    +++ b/website/styleguide.jade
    @@ -141,7 +141,7 @@ include _includes/_mixins
             +icon("github", 18)
     
         p
    -        |  Icons are implemented via a SVG sprite and can be included as a
    +        |  Icons are implemented via an SVG sprite and can be included as a
             |  mixin, using their name and an optional size value in #[code px].
     
         +infobox.u-text-center
    @@ -560,7 +560,7 @@ include _includes/_mixins
                 +cell #[code MODEL_META]
                 +cell Description for model name components and meta data, ID mapped to string.
                 +cell
    -                +code(false, "json").o-no-block "vectors": "Word vectors",
    +                +code(false, "json").o-no-block "vectors": "Word vectors"
     
             +row
                 +cell #[code MODEL_LICENSES]
    
    From 15ec7ddd0984f2180d0d4bfe7c2b3f4dfcfc772c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:19:03 +0200
    Subject: [PATCH 198/649] Add docs for new spacy evaluate command
    
    ---
     website/api/_top-level/_cli.jade | 53 ++++++++++++++++++++++++++++++++
     1 file changed, 53 insertions(+)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index 52884988e..f59d5afdd 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -344,6 +344,59 @@ p
             +cell Gradient L2 norm constraint.
             +cell #[code 1.0]
     
    ++h(3, "evaluate") Evaluate
    +    +tag-new(2)
    +
    +p
    +    |  Evaluate a model's accuracy and speed on JSON-formatted annotated data.
    +    |  Will print the results and optionally export
    +    |  #[+a("/usage/visualizers") displaCy visualizations] of a sample set of
    +    |  parses to #[code .html] files. Visualizations for the dependency parse
    +    |  and NER will be exported as separate files if the respective component
    +    |  is present in the model's pipeline.
    +
    ++code(false, "bash", "$", false, false, true).
    +    spacy evaluate [model] [data_path] [--displacy-path] [--displacy-limit] [--gpu-id] [--gold-preproc]
    +
    ++table(["Argument", "Type", "Description"])
    +    +row
    +        +cell #[code model]
    +        +cell positional
    +        +cell
    +            |  Model to evaluate. Can be a package or shortcut link name, or a
    +            |  path to a model data directory.
    +
    +    +row
    +        +cell #[code data_path]
    +        +cell positional
    +        +cell Location of JSON-formatted evaluation data.
    +
    +    +row
    +        +cell #[code --displacy-path], #[code -dp]
    +        +cell option
    +        +cell
    +            |  Directory to output rendered parses as HTML. If not set, no
    +            |  visualizations will be generated.
    +
    +    +row
    +        +cell #[code --displacy-limit], #[code -dl]
    +        +cell option
    +        +cell
    +            |  Number of parses to generate per file. Defaults to #[code 25].
    +            |  Keep in mind that a significantly higher number might cause the
    +            |  #[code .html] files to render slowly.
    +
    +    +row
    +        +cell #[code --gpu-id], #[code -g]
    +        +cell option
    +        +cell GPU to use, if any. Defaults to #[code -1] for CPU.
    +
    +    +row
    +        +cell #[code --gold-preproc], #[code -G]
    +        +cell flag
    +        +cell Use gold preprocessing.
    +
    +
     +h(3, "package") Package
     
     p
    
    From 36ff525ff59239e5bf81c569622c918811d4266a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:37:15 +0200
    Subject: [PATCH 199/649] Add NER P and NER R scores to model overview
    
    ---
     website/_includes/_page_models.jade | 2 +-
     website/models/_data.json           | 6 +++++-
     2 files changed, 6 insertions(+), 2 deletions(-)
    
    diff --git a/website/_includes/_page_models.jade b/website/_includes/_page_models.jade
    index 6370f1b94..c5bd799f0 100644
    --- a/website/_includes/_page_models.jade
    +++ b/website/_includes/_page_models.jade
    @@ -60,7 +60,7 @@ for id in CURRENT_MODELS
                 +grid.o-no-block
                     +grid-col("third")
                         +h(4) Accuracy
    -                    +table.o-no-block
    +                    +table.o-block-small
                             for label, field in MODEL_ACCURACY
                                 +row(style="display: none")
                                     +cell.u-nowrap
    diff --git a/website/models/_data.json b/website/models/_data.json
    index cc26b9bc9..b2898be8a 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -44,6 +44,8 @@
             "las": "Labelled dependencies",
             "tags_acc": "Part-of-speech tags",
             "ents_f": "Entities (F-score)",
    +        "ents_p": "Entities (precision)",
    +        "ents_r": "Entities (recall)",
             "pipeline": "Processing pipeline components in order",
             "sources": "Sources of training data"
         },
    @@ -59,7 +61,9 @@
             "uas": "UAS",
             "las": "LAS",
             "tags_acc": "POS",
    -        "ents_f": "NER F"
    +        "ents_f": "NER F",
    +        "ents_p": "NER P",
    +        "ents_r": "NER R"
         },
     
         "LANGUAGES": {
    
    From af75b742083798347c279a840abb0535643c920d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 20:47:10 -0500
    Subject: [PATCH 200/649] Unset LayerNorm backwards compat hack
    
    ---
     spacy/_ml.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 3b96a69b5..dc458d6ac 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -31,8 +31,8 @@ import numpy
     import io
     
     # TODO: Unset this once we don't want to support models previous models.
    -import thinc.neural._classes.layernorm
    -thinc.neural._classes.layernorm.set_compat_six_eight(True)
    +#import thinc.neural._classes.layernorm
    +#thinc.neural._classes.layernorm.set_compat_six_eight(True)
     
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
    
    From 33cf9cecdd047282682c3ff91bd495ca79f89b32 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 13:34:03 +0200
    Subject: [PATCH 201/649] Port over changes from #1386
    
    ---
     website/usage/_facts-figures/_benchmarks.jade         | 2 +-
     website/usage/_facts-figures/_feature-comparison.jade | 2 +-
     website/usage/_visualizers/_html.jade                 | 2 +-
     3 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/website/usage/_facts-figures/_benchmarks.jade b/website/usage/_facts-figures/_benchmarks.jade
    index fa0e26763..f69eb5406 100644
    --- a/website/usage/_facts-figures/_benchmarks.jade
    +++ b/website/usage/_facts-figures/_benchmarks.jade
    @@ -74,7 +74,7 @@ p
     
         +row
             +cell
    -            +a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet Parsey McParseface
    +            +a("https://github.com/tensorflow/models/tree/master/research/syntaxnet") SyntaxNet Parsey McParseface
             +cell 2016
             +cell neural
             +cell.u-text-right 94.15
    diff --git a/website/usage/_facts-figures/_feature-comparison.jade b/website/usage/_facts-figures/_feature-comparison.jade
    index 92ac69050..c8fa5ffbe 100644
    --- a/website/usage/_facts-figures/_feature-comparison.jade
    +++ b/website/usage/_facts-figures/_feature-comparison.jade
    @@ -2,7 +2,7 @@
     
     p
         |  Here's a quick comparison of the functionalities offered by spaCy,
    -    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet],
    +    |  #[+a("https://github.com/tensorflow/models/tree/master/research/syntaxnet") SyntaxNet],
         |  #[+a("http://www.nltk.org/py-modindex.html") NLTK] and
         |  #[+a("http://stanfordnlp.github.io/CoreNLP/") CoreNLP].
     
    diff --git a/website/usage/_visualizers/_html.jade b/website/usage/_visualizers/_html.jade
    index 701d4b683..595192442 100644
    --- a/website/usage/_visualizers/_html.jade
    +++ b/website/usage/_visualizers/_html.jade
    @@ -71,7 +71,7 @@ p
         |  You can also use displaCy to manually render data. This can be useful if
         |  you want to visualize output from other libraries, like
         |  #[+a("http://www.nltk.org") NLTK] or
    -    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet].
    +    |  #[+a("https://github.com/tensorflow/models/tree/master/research/syntaxnet") SyntaxNet].
         |  Simply convert the dependency parse or recognised entities to displaCy's
         |  format and set #[code manual=True] on either #[code render()] or
         |  #[code serve()].
    
    From 774f5732bdab210381fffce8c06adca9fc0152e5 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 14:55:15 +0200
    Subject: [PATCH 202/649] Fix dimensionality of textcat when no vectors
     available
    
    ---
     spacy/_ml.py | 25 ++++++++++++++++---------
     1 file changed, 16 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index dc458d6ac..b02bd27d9 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -570,6 +570,7 @@ def foreach(layer, drop_factor=1.0):
     
     def build_text_classifier(nr_class, width=64, **cfg):
         nr_vector = cfg.get('nr_vector', 5000)
    +    pretrained_dims = cfg.get('pretrained_dims', 0)
         with Model.define_operators({'>>': chain, '+': add, '|': concatenate,
                                      '**': clone}):
             if cfg.get('low_data'):
    @@ -577,7 +578,7 @@ def build_text_classifier(nr_class, width=64, **cfg):
                     SpacyVectors
                     >> flatten_add_lengths
                     >> with_getitem(0,
    -                    Affine(width, 300)
    +                    Affine(width, pretrained_dims)
                     )
                     >> ParametricAttention(width)
                     >> Pooling(sum_pool)
    @@ -604,16 +605,22 @@ def build_text_classifier(nr_class, width=64, **cfg):
                 )
             )
     
    -        static_vectors = (
    -            SpacyVectors
    -            >> with_flatten(Affine(width, 300))
    -        )
    -
    -        cnn_model = (
    +        if pretrained_dims:
    +            static_vectors = (
    +                SpacyVectors
    +                >> with_flatten(Affine(width, pretrained_dims))
    +            )
                 # TODO Make concatenate support lists
    -            concatenate_lists(trained_vectors, static_vectors)
    +            vectors = concatenate_lists(trained_vectors, static_vectors)
    +            vectors_width = width*2
    +        else:
    +            vectors = trained_vectors
    +            vectors_width = width
    +            static_vectors = None
    +        cnn_model = (
    +            vectors
                 >> with_flatten(
    -                LN(Maxout(width, width*2))
    +                LN(Maxout(width, vectors_width))
                     >> Residual(
                         (ExtractWindow(nW=1) >> zero_init(Maxout(width, width*3)))
                     ) ** 2, pad=2
    
    From 79a94bc166bfdd73a11b4e10a4717df22d171025 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 14:55:30 +0200
    Subject: [PATCH 203/649] Update textcat exampe
    
    ---
     examples/training/train_textcat.py | 6 +++++-
     1 file changed, 5 insertions(+), 1 deletion(-)
    
    diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py
    index eefae111f..7eb356100 100644
    --- a/examples/training/train_textcat.py
    +++ b/examples/training/train_textcat.py
    @@ -1,3 +1,7 @@
    +'''Train a multi-label convolutional neural network text classifier,
    +using the spacy.pipeline.TextCategorizer component. The model is then added
    +to spacy.pipeline, and predictions are available at `doc.cats`.
    +'''
     from __future__ import unicode_literals
     import plac
     import random
    @@ -31,7 +35,7 @@ def train_textcat(tokenizer, textcat,
             train_data = tqdm.tqdm(train_data, leave=False) # Progress bar
             for batch in minibatch(train_data, size=batch_sizes):
                 docs, golds = zip(*batch)
    -            textcat.update((docs, None), golds, sgd=optimizer, drop=0.2,
    +            textcat.update(docs, golds, sgd=optimizer, drop=0.2,
                     losses=losses)
             with textcat.model.use_params(optimizer.averages):
                 scores = evaluate(tokenizer, textcat, dev_texts, dev_cats)
    
    From db05d4d5823c05208880eda92d99e7ba2de3ddd4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 14:56:16 +0200
    Subject: [PATCH 204/649] Add test for #1380. Passes without fix?
    
    ---
     spacy/tests/regression/test_issue1380.py | 13 +++++++++++++
     1 file changed, 13 insertions(+)
     create mode 100644 spacy/tests/regression/test_issue1380.py
    
    diff --git a/spacy/tests/regression/test_issue1380.py b/spacy/tests/regression/test_issue1380.py
    new file mode 100644
    index 000000000..d9cfe1bd2
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1380.py
    @@ -0,0 +1,13 @@
    +import pytest
    +
    +from ...language import Language
    +
    +def test_issue1380_empty_string():
    +    nlp = Language()
    +    doc = nlp('')
    +    assert len(doc) == 0
    +
    +@pytest.mark.models('en')
    +def test_issue1380_en(EN):
    +    doc = EN('')
    +    assert len(doc) == 0
    
    From 39798b0172eab604873280aa8a429c3bf78c0c78 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 15:12:09 +0200
    Subject: [PATCH 205/649] Uncomment layernorm adjustment hack
    
    ---
     spacy/_ml.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index b02bd27d9..bbd3e2b3c 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -31,8 +31,8 @@ import numpy
     import io
     
     # TODO: Unset this once we don't want to support models previous models.
    -#import thinc.neural._classes.layernorm
    -#thinc.neural._classes.layernorm.set_compat_six_eight(True)
    +import thinc.neural._classes.layernorm
    +thinc.neural._classes.layernorm.set_compat_six_eight(True)
     
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
    
    From f1b86dff8cef8802f5493bad4331d23e016dca7c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 15:12:28 +0200
    Subject: [PATCH 206/649] Update textcat example
    
    ---
     examples/training/train_textcat.py | 17 ++++++++++++-----
     1 file changed, 12 insertions(+), 5 deletions(-)
    
    diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py
    index 7eb356100..6018827a4 100644
    --- a/examples/training/train_textcat.py
    +++ b/examples/training/train_textcat.py
    @@ -16,6 +16,11 @@ from spacy.gold import GoldParse, minibatch
     from spacy.util import compounding
     from spacy.pipeline import TextCategorizer
     
    +# TODO: Remove this once we're not supporting models trained with thinc <6.9.0
    +import thinc.neural._classes.layernorm
    +thinc.neural._classes.layernorm.set_compat_six_eight(False)
    +
    +
     
     def train_textcat(tokenizer, textcat,
                       train_texts, train_cats, dev_texts, dev_cats,
    @@ -28,12 +33,13 @@ def train_textcat(tokenizer, textcat,
         train_docs = [tokenizer(text) for text in train_texts]
         train_gold = [GoldParse(doc, cats=cats) for doc, cats in
                       zip(train_docs, train_cats)]
    -    train_data = zip(train_docs, train_gold)
    +    train_data = list(zip(train_docs, train_gold))
         batch_sizes = compounding(4., 128., 1.001)
         for i in range(n_iter):
             losses = {}
    -        train_data = tqdm.tqdm(train_data, leave=False) # Progress bar
    -        for batch in minibatch(train_data, size=batch_sizes):
    +        # Progress bar and minibatching
    +        batches = minibatch(tqdm.tqdm(train_data, leave=False), size=batch_sizes)
    +        for batch in batches:
                 docs, golds = zip(*batch)
                 textcat.update(docs, golds, sgd=optimizer, drop=0.2,
                     losses=losses)
    @@ -65,12 +71,13 @@ def evaluate(tokenizer, textcat, texts, cats):
         return {'textcat_p': precis, 'textcat_r': recall, 'textcat_f': fscore}  
     
     
    -def load_data():
    +def load_data(limit=0):
         # Partition off part of the train data --- avoid running experiments
         # against test.
         train_data, _ = thinc.extra.datasets.imdb()
     
         random.shuffle(train_data)
    +    train_data = train_data[-limit:]
     
         texts, labels = zip(*train_data)
         cats = [(['POSITIVE'] if y else []) for y in labels]
    @@ -90,7 +97,7 @@ def main(model_loc=None):
         textcat = TextCategorizer(tokenizer.vocab, labels=['POSITIVE'])
     
         print("Load IMDB data")
    -    (train_texts, train_cats), (dev_texts, dev_cats) = load_data()
    +    (train_texts, train_cats), (dev_texts, dev_cats) = load_data(limit=1000)
     
         print("Itn.\tLoss\tP\tR\tF")
         progress = '{i:d} {loss:.3f} {textcat_p:.3f} {textcat_r:.3f} {textcat_f:.3f}'
    
    From f8a0614527a656a50100fa784be23c698f706673 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 15:15:53 +0200
    Subject: [PATCH 207/649] Improve textcat model slightly
    
    ---
     spacy/_ml.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index bbd3e2b3c..e882c954e 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -622,7 +622,7 @@ def build_text_classifier(nr_class, width=64, **cfg):
                 >> with_flatten(
                     LN(Maxout(width, vectors_width))
                     >> Residual(
    -                    (ExtractWindow(nW=1) >> zero_init(Maxout(width, width*3)))
    +                    (ExtractWindow(nW=1) >> LN(Maxout(width, width*3)))
                     ) ** 2, pad=2
                 )
                 >> flatten_add_lengths
    
    From bd8e84998a7bf4706c18f9b3099a84d4a2ba6a52 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 16:07:30 +0200
    Subject: [PATCH 208/649] Add nO attribute to TextCategorizer model
    
    ---
     spacy/_ml.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index e882c954e..4a41339aa 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -642,7 +642,7 @@ def build_text_classifier(nr_class, width=64, **cfg):
                 >> zero_init(Affine(nr_class, nr_class*2, drop_factor=0.0))
                 >> logistic
             )
    -
    +    model.nO = nr_class
         model.lsuv = False
         return model
     
    
    From bb13aa4bf3b7cb10ac93cc36486e8d0d1fddc43c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 16:12:06 +0200
    Subject: [PATCH 209/649] Fix typos in PhraseMatcher docs
    
    ---
     website/api/phrasematcher.jade | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/website/api/phrasematcher.jade b/website/api/phrasematcher.jade
    index 5c49a03d5..0f0959f28 100644
    --- a/website/api/phrasematcher.jade
    +++ b/website/api/phrasematcher.jade
    @@ -15,7 +15,7 @@ p Create the rule-based #[code PhraseMatcher].
     
     +aside-code("Example").
         from spacy.matcher import PhraseMatcher
    -    matcher = Matcher(nlp.vocab, max_length=6)
    +    matcher = PhraseMatcher(nlp.vocab, max_length=6)
     
     +table(["Name", "Type", "Description"])
         +row
    @@ -41,9 +41,9 @@ p Create the rule-based #[code PhraseMatcher].
     p Find all token sequences matching the supplied patterns on the #[code Doc].
     
     +aside-code("Example").
    -    from spacy.matcher import Matcher
    +    from spacy.matcher import PhraseMatcher
     
    -    matcher = Matcher(nlp.vocab)
    +    matcher = PhraseMatcher(nlp.vocab)
         matcher.add('OBAMA', None, nlp(u"Barack Obama"))
         doc = nlp(u"Barack Obama lifts America one last time in emotional farewell")
         matches = matcher(doc)
    
    From 40edb65ee751dfe4cf6e04ee59891266d8b14f30 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 16:36:50 +0200
    Subject: [PATCH 210/649] Make test work for Python 2.7
    
    ---
     spacy/tests/regression/test_issue1380.py | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/tests/regression/test_issue1380.py b/spacy/tests/regression/test_issue1380.py
    index d9cfe1bd2..b2d610954 100644
    --- a/spacy/tests/regression/test_issue1380.py
    +++ b/spacy/tests/regression/test_issue1380.py
    @@ -1,3 +1,4 @@
    +from __future__ import unicode_literals
     import pytest
     
     from ...language import Language
    
    From d90398643933999d734a09bc3637a8723d5de2c3 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 17:14:26 +0200
    Subject: [PATCH 211/649] Increment version
    
    ---
     spacy/about.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/about.py b/spacy/about.py
    index b8b1dbbf6..a8880d7ca 100644
    --- a/spacy/about.py
    +++ b/spacy/about.py
    @@ -3,13 +3,13 @@
     # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py
     
     __title__ = 'spacy-nightly'
    -__version__ = '2.0.0a15'
    +__version__ = '2.0.0a16'
     __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython'
     __uri__ = 'https://spacy.io'
     __author__ = 'Explosion AI'
     __email__ = 'contact@explosion.ai'
     __license__ = 'MIT'
    -__release__ = False
    +__release__ = True
     
     __docs_models__ = 'https://alpha.spacy.io/usage/models'
     __download_url__ = 'https://github.com/explosion/spacy-models/releases/download'
    
    From cc29e8b49717c76299e494ad98bf0e80d3363e2a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:00:37 +0200
    Subject: [PATCH 212/649] Add buildkite.yml for making sdists
    
    ---
     .buildkite/sdist.yml | 11 +++++++++++
     1 file changed, 11 insertions(+)
     create mode 100644 .buildkite/sdist.yml
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    new file mode 100644
    index 000000000..a3d8b2b68
    --- /dev/null
    +++ b/.buildkite/sdist.yml
    @@ -0,0 +1,11 @@
    +steps:
    +  -
    +    command:
    +      - "$HOME/.local/bin/fab env clean make test"
    +    label: ":dizzy: :python:"
    +    artifact_paths: "dist/*.tar.gz"
    +  - wait
    +  - trigger "spacy-sdist-against-models"
    +    label: ":spacy: :build:"
    +    env:
    +      SPACY_VERSION: "{$SPACY_VERSION}"
    
    From ff24b6d04a48bf0aa218052fa5e6cc28156e8fe1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:05:45 +0200
    Subject: [PATCH 213/649] Fix yml
    
    ---
     .buildkite/sdist.yml | 4 +---
     1 file changed, 1 insertion(+), 3 deletions(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index a3d8b2b68..01dc6f024 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,7 +1,5 @@
     steps:
    -  -
    -    command:
    -      - "$HOME/.local/bin/fab env clean make test"
    +  - command: "$HOME/.local/bin/fab env clean make test"
         label: ":dizzy: :python:"
         artifact_paths: "dist/*.tar.gz"
       - wait
    
    From 6304c5e14636b754f7bf6b7764d759d2bafb7cf7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:08:34 +0200
    Subject: [PATCH 214/649] Fix yml
    
    ---
     .buildkite/sdist.yml | 9 +++++----
     1 file changed, 5 insertions(+), 4 deletions(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index 01dc6f024..2cbbc54c4 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,9 +1,10 @@
     steps:
    -  - command: "$HOME/.local/bin/fab env clean make test"
    -    label: ":dizzy: :python:"
    -    artifact_paths: "dist/*.tar.gz"
    +  -
    +    command: "$HOME/.local/bin/fab env clean make test"
    +      label: ":dizzy: :python:"
    +      artifact_paths: "dist/*.tar.gz"
       - wait
    -  - trigger "spacy-sdist-against-models"
    +  - trigger: "spacy-sdist-against-models"
         label: ":spacy: :build:"
         env:
           SPACY_VERSION: "{$SPACY_VERSION}"
    
    From 71825f9737dd00b461e0fdefd0b38925389da5c0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:12:16 +0200
    Subject: [PATCH 215/649] Fix yml
    
    ---
     .buildkite/sdist.yml | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index 2cbbc54c4..e43153802 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,8 +1,8 @@
     steps:
       -
         command: "$HOME/.local/bin/fab env clean make test"
    -      label: ":dizzy: :python:"
    -      artifact_paths: "dist/*.tar.gz"
    +    label: ":dizzy: :python:"
    +    artifact_paths: "dist/*.tar.gz"
       - wait
       - trigger: "spacy-sdist-against-models"
         label: ":spacy: :build:"
    
    From c4c7def9cef280b20818409846200c49f33afac2 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:14:33 +0200
    Subject: [PATCH 216/649] Fix yml
    
    ---
     .buildkite/sdist.yml | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index e43153802..0f80fd9c8 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -6,5 +6,6 @@ steps:
       - wait
       - trigger: "spacy-sdist-against-models"
         label: ":spacy: :build:"
    -    env:
    -      SPACY_VERSION: "{$SPACY_VERSION}"
    +    build:
    +      env:
    +        SPACY_VERSION: "{$SPACY_VERSION}"
    
    From e3c93f87a4c17c1a9db9bf85fd77255d2a5ddc6f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:18:07 +0200
    Subject: [PATCH 217/649] Update sdist
    
    ---
     .buildkite/sdist.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index 0f80fd9c8..7776429c5 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,6 +1,6 @@
     steps:
       -
    -    command: "$HOME/.local/bin/fab env clean make test"
    +    command: "fab env clean make test"
         label: ":dizzy: :python:"
         artifact_paths: "dist/*.tar.gz"
       - wait
    
    From 5560c46a593363b6d8c51bbbf575a6b2e562ed4d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:29:41 +0200
    Subject: [PATCH 218/649] Update buildkite
    
    ---
     .buildkite/sdist.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index 7776429c5..f5e0fca35 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,6 +1,6 @@
     steps:
       -
    -    command: "fab env clean make test"
    +    command: "fab env clean make test sdist"
         label: ":dizzy: :python:"
         artifact_paths: "dist/*.tar.gz"
       - wait
    
    From b621a2e9646f54b396f2c6439022e40e00e074e6 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 18:37:27 +0200
    Subject: [PATCH 219/649] Fix build emoji
    
    ---
     .buildkite/sdist.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index f5e0fca35..9b94e3752 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -5,7 +5,7 @@ steps:
         artifact_paths: "dist/*.tar.gz"
       - wait
       - trigger: "spacy-sdist-against-models"
    -    label: ":spacy: :build:"
    +    label: ":dizzy: :hammer:"
         build:
           env:
             SPACY_VERSION: "{$SPACY_VERSION}"
    
    From 92066b04d6401207d8b0fad4d121eca06a7210c5 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 19:55:34 -0500
    Subject: [PATCH 220/649] Fix Embed and HistoryFeatures
    
    ---
     spacy/_ml.py | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 6df10b6b2..6ebccd69a 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -231,6 +231,8 @@ class Embed(Model):
     
         def __init__(self, nO, nV=None, **kwargs):
             Model.__init__(self, **kwargs)
    +        if 'name' in kwargs:
    +            self.name = kwargs['name']
             self.column = kwargs.get('column', 0)
             self.nO = nO
             self.nV = nV
    @@ -238,12 +240,12 @@ class Embed(Model):
         def predict(self, ids):
             if ids.ndim == 2:
                 ids = ids[:, self.column]
    -        return self._embed(ids)
    +        return self.ops.xp.ascontiguousarray(self.vectors[ids])
     
         def begin_update(self, ids, drop=0.):
             if ids.ndim == 2:
                 ids = ids[:, self.column]
    -        vectors = self.vectors[ids]
    +        vectors = self.ops.xp.ascontiguousarray(self.vectors[ids])
             def backprop_embed(d_vectors, sgd=None):
                 n_vectors = d_vectors.shape[0]
                 self.ops.scatter_add(self.d_vectors, ids, d_vectors)
    @@ -255,7 +257,8 @@ class Embed(Model):
     
     def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
         '''Wrap a model, adding features representing action history.'''
    -    embed_tables = [Embed(nr_dim, nr_class, column=i) for i in range(hist_size)]
    +    embed_tables = [Embed(nr_dim, nr_class, column=i, name='embed%d')
    +                    for i in range(hist_size)]
         embed = concatenate(*embed_tables)
         ops = embed.ops
         def add_history_fwd(vectors_hists, drop=0.):
    
    From 943af4423a9b3f0eced972c420ae023d8e3a1dd4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 20:06:05 -0500
    Subject: [PATCH 221/649] Make depth setting in parser work again
    
    ---
     spacy/syntax/nn_parser.pyx | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 016807e87..422b0fdc7 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -277,6 +277,7 @@ cdef class Parser:
                     upper = chain(
                         HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE, nr_dim=HIST_DIMS),
                         Maxout(hidden_width, hidden_width+HIST_SIZE*HIST_DIMS),
    +                    clone(Maxout(hidden_width, hidden_width), depth-2),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    @@ -286,7 +287,7 @@ cdef class Parser:
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    - 
    +
             # TODO: This is an unfortunate hack atm!
             # Used to set input dimensions in network.
             lower.begin_training(lower.ops.allocate((500, token_vector_width)))
    
    From dcdfa071aaf983adae5b3fb39336a2b1102970ab Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 20:06:52 -0500
    Subject: [PATCH 222/649] Disable LayerNorm hack
    
    ---
     spacy/_ml.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 1f78de9a9..6223715b5 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -32,7 +32,7 @@ import io
     
     # TODO: Unset this once we don't want to support models previous models.
     import thinc.neural._classes.layernorm
    -thinc.neural._classes.layernorm.set_compat_six_eight(True)
    +thinc.neural._classes.layernorm.set_compat_six_eight(False)
     
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
    
    From fd4baff475e9cb5ce24b380ec8d75ab28b48962f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 08:12:27 -0500
    Subject: [PATCH 223/649] Update tests
    
    ---
     spacy/tests/lang/en/test_lemmatizer.py  |  1 -
     spacy/tests/lang/en/test_models.py      | 13 +++++++------
     spacy/tests/regression/test_issue429.py |  1 -
     3 files changed, 7 insertions(+), 8 deletions(-)
    
    diff --git a/spacy/tests/lang/en/test_lemmatizer.py b/spacy/tests/lang/en/test_lemmatizer.py
    index 00f02ccb4..ecde87bed 100644
    --- a/spacy/tests/lang/en/test_lemmatizer.py
    +++ b/spacy/tests/lang/en/test_lemmatizer.py
    @@ -57,7 +57,6 @@ def test_en_lemmatizer_punct(en_lemmatizer):
     def test_en_lemmatizer_lemma_assignment(EN):
         text = "Bananas in pyjamas are geese."
         doc = EN.make_doc(text)
    -    EN.tensorizer(doc)
         assert all(t.lemma_ == '' for t in doc)
         EN.tagger(doc)
         assert all(t.lemma_ != '' for t in doc)
    diff --git a/spacy/tests/lang/en/test_models.py b/spacy/tests/lang/en/test_models.py
    index 4b1cf1f91..ab318213c 100644
    --- a/spacy/tests/lang/en/test_models.py
    +++ b/spacy/tests/lang/en/test_models.py
    @@ -52,12 +52,13 @@ def test_en_models_vectors(example):
         # this isn't a perfect test since this could in principle fail
         # in a sane model as well,
         # but that's very unlikely and a good indicator if something is wrong
    -    vector0 = example[0].vector
    -    vector1 = example[1].vector
    -    vector2 = example[2].vector
    -    assert not numpy.array_equal(vector0,vector1)
    -    assert not numpy.array_equal(vector0,vector2)
    -    assert not numpy.array_equal(vector1,vector2)
    +    if example.vocab.vectors_length:
    +        vector0 = example[0].vector
    +        vector1 = example[1].vector
    +        vector2 = example[2].vector
    +        assert not numpy.array_equal(vector0,vector1)
    +        assert not numpy.array_equal(vector0,vector2)
    +        assert not numpy.array_equal(vector1,vector2)
     
     
     @pytest.mark.xfail
    diff --git a/spacy/tests/regression/test_issue429.py b/spacy/tests/regression/test_issue429.py
    index 1baa9a1db..df8d6d3fc 100644
    --- a/spacy/tests/regression/test_issue429.py
    +++ b/spacy/tests/regression/test_issue429.py
    @@ -19,7 +19,6 @@ def test_issue429(EN):
         matcher = Matcher(EN.vocab)
         matcher.add('TEST', merge_phrases, [{'ORTH': 'a'}])
         doc = EN.make_doc('a b c')
    -    EN.tensorizer(doc)
         EN.tagger(doc)
         matcher(doc)
         EN.entity(doc)
    
    From 5743b06e36c92fdb541c0a02d1a4b3850676418f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 08:12:50 -0500
    Subject: [PATCH 224/649] Wrap model saving in try/except
    
    ---
     spacy/cli/train.py | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index a22db6abc..064f053a1 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -114,9 +114,12 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0,
                 print_progress(i, losses, scorer.scores)
         finally:
             print("Saving model...")
    -        with (output_path / 'model-final.pickle').open('wb') as file_:
    -            with nlp.use_params(optimizer.averages):
    -                dill.dump(nlp, file_, -1)
    +        try:
    +            with (output_path / 'model-final.pickle').open('wb') as file_:
    +                with nlp.use_params(optimizer.averages):
    +                    dill.dump(nlp, file_, -1)
    +        except:
    +            print("Error saving model")
     
     
     def _render_parses(i, to_render):
    
    From 056b08c0df19a3a079ce658455dd71dfaecc729e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 18:27:10 +0200
    Subject: [PATCH 225/649] Delete obsolete nn_text_class example
    
    ---
     examples/nn_text_class.py | 281 --------------------------------------
     1 file changed, 281 deletions(-)
     delete mode 100644 examples/nn_text_class.py
    
    diff --git a/examples/nn_text_class.py b/examples/nn_text_class.py
    deleted file mode 100644
    index 7b4a2fd57..000000000
    --- a/examples/nn_text_class.py
    +++ /dev/null
    @@ -1,281 +0,0 @@
    -"""This script expects something like a binary sentiment data set, such as
    - that available here: `http://www.cs.cornell.edu/people/pabo/movie-review-data/`
    -
    -It expects a directory structure like: `data_dir/train/{pos|neg}`
    - and `data_dir/test/{pos|neg}`. Put (say) 90% of the files in the former
    - and the remainder in the latter.
    -"""
    -
    -from __future__ import unicode_literals
    -from __future__ import print_function
    -from __future__ import division
    -
    -from collections import defaultdict
    -from pathlib import Path
    -import numpy
    -import plac
    -
    -import spacy.en
    -
    -
    -def read_data(nlp, data_dir):
    -    for subdir, label in (('pos', 1), ('neg', 0)):
    -        for filename in (data_dir / subdir).iterdir():
    -            text = filename.open().read()
    -            doc = nlp(text)
    -            if len(doc) >= 1:
    -                yield doc, label
    -
    -
    -def partition(examples, split_size):
    -    examples = list(examples)
    -    numpy.random.shuffle(examples)
    -    n_docs = len(examples)
    -    split = int(n_docs * split_size)
    -    return examples[:split], examples[split:]
    -
    -
    -def minibatch(data, bs=24):
    -    for i in range(0, len(data), bs):
    -        yield data[i:i+bs]
    -
    -
    -class Extractor(object):
    -    def __init__(self, nlp, vector_length, dropout=0.3):
    -        self.nlp = nlp
    -        self.dropout = dropout
    -        self.vector = numpy.zeros((vector_length, ))
    -
    -    def doc2bow(self, doc, dropout=None):
    -        if dropout is None:
    -            dropout = self.dropout
    -        bow = defaultdict(int)
    -        all_words = defaultdict(int)
    -        for word in doc:
    -            if numpy.random.random() >= dropout and not word.is_punct:
    -                bow[word.lower] += 1
    -            all_words[word.lower] += 1
    -        if sum(bow.values()) >= 1:
    -            return bow
    -        else:
    -            return all_words
    -
    -    def bow2vec(self, bow, E):
    -        self.vector.fill(0)
    -        n = 0
    -        for orth_id, freq in bow.items():
    -            self.vector += self.nlp.vocab[self.nlp.vocab.strings[orth_id]].vector * freq
    -            # Apply the fine-tuning we've learned
    -            if orth_id < E.shape[0]:
    -                self.vector += E[orth_id] * freq
    -            n += freq
    -        return self.vector / n
    -
    -
    -class NeuralNetwork(object):
    -    def __init__(self, depth, width, n_classes, n_vocab, extracter, optimizer):
    -        self.depth = depth
    -        self.width = width
    -        self.n_classes = n_classes
    -        self.weights = Params.random(depth, width, width, n_classes, n_vocab)
    -        self.doc2bow = extracter.doc2bow
    -        self.bow2vec = extracter.bow2vec
    -        self.optimizer = optimizer
    -        self._gradient = Params.zero(depth, width, width, n_classes, n_vocab)
    -        self._activity = numpy.zeros((depth, width))
    -
    -    def train(self, batch):
    -        activity = self._activity
    -        gradient = self._gradient
    -        activity.fill(0)
    -        gradient.data.fill(0)
    -        loss = 0
    -        word_freqs = defaultdict(int)
    -        for doc, label in batch:
    -            word_ids = self.doc2bow(doc)
    -            vector = self.bow2vec(word_ids, self.weights.E)
    -            self.forward(activity, vector)
    -            loss += self.backprop(vector, gradient, activity, word_ids, label)
    -            for w, freq in word_ids.items():
    -                word_freqs[w] += freq
    -        self.optimizer(self.weights, gradient, len(batch), word_freqs)
    -        return loss
    -
    -    def predict(self, doc):
    -        actv = self._activity
    -        actv.fill(0)
    -        W = self.weights.W
    -        b = self.weights.b
    -        E = self.weights.E
    -        
    -        vector = self.bow2vec(self.doc2bow(doc, dropout=0.0), E)
    -        self.forward(actv, vector)
    -        return numpy.argmax(softmax(actv[-1], W[-1], b[-1]))
    -
    -    def forward(self, actv, in_):
    -        actv.fill(0)
    -        W = self.weights.W; b = self.weights.b
    -        actv[0] = relu(in_, W[0], b[0])
    -        for i in range(1, self.depth):
    -            actv[i] = relu(actv[i-1], W[i], b[i])
    -
    -    def backprop(self, input_vector, gradient, activity, ids, label):
    -        W = self.weights.W
    -        b = self.weights.b
    -
    -        target = numpy.zeros(self.n_classes)
    -        target[label] = 1.0
    -        pred = softmax(activity[-1], W[-1], b[-1])
    -        delta = pred - target
    -
    -        for i in range(self.depth, 0, -1):
    -            gradient.b[i] += delta
    -            gradient.W[i] += numpy.outer(delta, activity[i-1])
    -            delta = d_relu(activity[i-1]) * W[i].T.dot(delta)
    -
    -        gradient.b[0] += delta
    -        gradient.W[0] += numpy.outer(delta, input_vector)
    -        tuning = W[0].T.dot(delta).reshape((self.width,)) / len(ids)
    -        for w, freq in ids.items():
    -            if w < gradient.E.shape[0]:
    -                gradient.E[w] += tuning * freq
    -        return -sum(target * numpy.log(pred))
    -
    -
    -def softmax(actvn, W, b):
    -    w = W.dot(actvn) + b
    -    ew = numpy.exp(w - max(w))
    -    return (ew / sum(ew)).ravel()
    -
    -
    -def relu(actvn, W, b):
    -    x = W.dot(actvn) + b
    -    return x * (x > 0)
    -
    -
    -def d_relu(x):
    -    return x > 0
    -
    -
    -class Adagrad(object):
    -    def __init__(self, lr, rho):
    -        self.eps = 1e-3
    -        # initial learning rate
    -        self.learning_rate = lr
    -        self.rho = rho
    -        # stores sum of squared gradients 
    -        #self.h = numpy.zeros(self.dim)
    -        #self._curr_rate = numpy.zeros(self.h.shape)
    -        self.h = None
    -        self._curr_rate = None
    -    
    -    def __call__(self, weights, gradient, batch_size, word_freqs):
    -        if self.h is None:
    -            self.h = numpy.zeros(gradient.data.shape)
    -            self._curr_rate = numpy.zeros(gradient.data.shape)
    -        self.L2_penalty(gradient, weights, word_freqs)
    -        update = self.rescale(gradient.data / batch_size)
    -        weights.data -= update
    -
    -    def rescale(self, gradient):
    -        if self.h is None:
    -            self.h = numpy.zeros(gradient.data.shape)
    -            self._curr_rate = numpy.zeros(gradient.data.shape)
    -        self._curr_rate.fill(0)
    -        self.h += gradient ** 2
    -        self._curr_rate = self.learning_rate / (numpy.sqrt(self.h) + self.eps)
    -        return self._curr_rate * gradient
    -
    -    def L2_penalty(self, gradient, weights, word_freqs):
    -        # L2 Regularization
    -        for i in range(len(weights.W)):
    -            gradient.W[i] += weights.W[i] * self.rho
    -            gradient.b[i] += weights.b[i] * self.rho
    -        for w, freq in word_freqs.items():
    -            if w < gradient.E.shape[0]:
    -                gradient.E[w] += weights.E[w] * self.rho
    -
    -
    -class Params(object):
    -    @classmethod
    -    def zero(cls, depth, n_embed, n_hidden, n_labels, n_vocab):
    -        return cls(depth, n_embed, n_hidden, n_labels, n_vocab, lambda x: numpy.zeros((x,)))
    -
    -    @classmethod
    -    def random(cls, depth, nE, nH, nL, nV):
    -        return cls(depth, nE, nH, nL, nV, lambda x: (numpy.random.rand(x) * 2 - 1) * 0.08)
    -
    -    def __init__(self, depth, n_embed, n_hidden, n_labels, n_vocab, initializer):
    -        nE = n_embed; nH = n_hidden; nL = n_labels; nV = n_vocab
    -        n_weights = sum([
    -            (nE * nH) + nH, 
    -            (nH * nH  + nH) * depth,
    -            (nH * nL) + nL,
    -            (nV * nE)
    -        ])
    -        self.data = initializer(n_weights)
    -        self.W = []
    -        self.b = []
    -        i = self._add_layer(0, nE, nH)
    -        for _ in range(1, depth):
    -            i = self._add_layer(i, nH, nH)
    -        i = self._add_layer(i, nL, nH)
    -        self.E = self.data[i : i + (nV * nE)].reshape((nV, nE))
    -        self.E.fill(0)
    -
    -    def _add_layer(self, start, x, y):
    -        end = start + (x * y)
    -        self.W.append(self.data[start : end].reshape((x, y)))
    -        self.b.append(self.data[end : end + x].reshape((x, )))
    -        return end + x
    -
    -
    -@plac.annotations(
    -    data_dir=("Data directory", "positional", None, Path),
    -    n_iter=("Number of iterations (epochs)", "option", "i", int),
    -    width=("Size of hidden layers", "option", "H", int),
    -    depth=("Depth", "option", "d", int),
    -    dropout=("Drop-out rate", "option", "r", float),
    -    rho=("Regularization penalty", "option", "p", float),
    -    eta=("Learning rate", "option", "e", float),
    -    batch_size=("Batch size", "option", "b", int),
    -    vocab_size=("Number of words to fine-tune", "option", "w", int),
    -)
    -def main(data_dir, depth=3, width=300, n_iter=5, vocab_size=40000,
    -         batch_size=24, dropout=0.3, rho=1e-5, eta=0.005):
    -    n_classes = 2
    -    print("Loading")
    -    nlp = spacy.en.English(parser=False)
    -    train_data, dev_data = partition(read_data(nlp, data_dir / 'train'), 0.8)
    -    print("Begin training")
    -    extracter = Extractor(nlp, width, dropout=0.3)
    -    optimizer = Adagrad(eta, rho)
    -    model = NeuralNetwork(depth, width, n_classes, vocab_size, extracter, optimizer)
    -    prev_best = 0
    -    best_weights = None
    -    for epoch in range(n_iter):
    -        numpy.random.shuffle(train_data)
    -        train_loss = 0.0
    -        for batch in minibatch(train_data, bs=batch_size):
    -            train_loss += model.train(batch)
    -        n_correct = sum(model.predict(x) == y for x, y in dev_data)
    -        print(epoch, train_loss, n_correct / len(dev_data))
    -        if n_correct >= prev_best:
    -            best_weights = model.weights.data.copy()
    -            prev_best = n_correct
    -
    -    model.weights.data = best_weights
    -    print("Evaluating")
    -    eval_data = list(read_data(nlp, data_dir / 'test'))
    -    n_correct = sum(model.predict(x) == y for x, y in eval_data)
    -    print(n_correct / len(eval_data))
    - 
    -
    -
    -if __name__ == '__main__':
    -    #import cProfile
    -    #import pstats
    -    #cProfile.runctx("main(Path('data/aclImdb'))", globals(), locals(), "Profile.prof")
    -    #s = pstats.Stats("Profile.prof")
    -    #s.strip_dirs().sort_stats("time").print_stats(100)
    -    plac.call(main)
    
    From 563f46f026054a73289bca64d7d6cbc2cca07150 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 18:43:02 -0500
    Subject: [PATCH 226/649] Fix multi-label support for text classification
    
    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.
    ---
     examples/training/train_textcat.py | 17 +++++++++--------
     spacy/gold.pyx                     | 13 ++++++++-----
     spacy/pipeline.pyx                 |  9 +++++++--
     3 files changed, 24 insertions(+), 15 deletions(-)
    
    diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py
    index 6018827a4..4d07ed26a 100644
    --- a/examples/training/train_textcat.py
    +++ b/examples/training/train_textcat.py
    @@ -21,7 +21,6 @@ import thinc.neural._classes.layernorm
     thinc.neural._classes.layernorm.set_compat_six_eight(False)
     
     
    -
     def train_textcat(tokenizer, textcat,
                       train_texts, train_cats, dev_texts, dev_cats,
                       n_iter=20):
    @@ -57,18 +56,20 @@ def evaluate(tokenizer, textcat, texts, cats):
         for i, doc in enumerate(textcat.pipe(docs)):
             gold = cats[i]
             for label, score in doc.cats.items():
    -            if score >= 0.5 and label in gold:
    +            if label not in gold:
    +                continue
    +            if score >= 0.5 and gold[label] >= 0.5:
                     tp += 1.
    -            elif score >= 0.5 and label not in gold:
    +            elif score >= 0.5 and gold[label] < 0.5:
                     fp += 1.
    -            elif score < 0.5 and label not in gold:
    +            elif score < 0.5 and gold[label] < 0.5:
                     tn += 1
    -            if score < 0.5 and label in gold:
    +            elif score < 0.5 and gold[label] >= 0.5:
                     fn += 1
         precis = tp / (tp + fp)
         recall = tp / (tp + fn)
         fscore = 2 * (precis * recall) / (precis + recall)
    -    return {'textcat_p': precis, 'textcat_r': recall, 'textcat_f': fscore}  
    +    return {'textcat_p': precis, 'textcat_r': recall, 'textcat_f': fscore}
     
     
     def load_data(limit=0):
    @@ -80,7 +81,7 @@ def load_data(limit=0):
         train_data = train_data[-limit:]
     
         texts, labels = zip(*train_data)
    -    cats = [(['POSITIVE'] if y else []) for y in labels]
    +    cats = [{'POSITIVE': bool(y)} for y in labels]
     
         split = int(len(train_data) * 0.8)
     
    @@ -97,7 +98,7 @@ def main(model_loc=None):
         textcat = TextCategorizer(tokenizer.vocab, labels=['POSITIVE'])
     
         print("Load IMDB data")
    -    (train_texts, train_cats), (dev_texts, dev_cats) = load_data(limit=1000)
    +    (train_texts, train_cats), (dev_texts, dev_cats) = load_data(limit=2000)
     
         print("Itn.\tLoss\tP\tR\tF")
         progress = '{i:d} {loss:.3f} {textcat_p:.3f} {textcat_r:.3f} {textcat_f:.3f}'
    diff --git a/spacy/gold.pyx b/spacy/gold.pyx
    index fc8d6622b..2512c179f 100644
    --- a/spacy/gold.pyx
    +++ b/spacy/gold.pyx
    @@ -387,7 +387,7 @@ cdef class GoldParse:
     
         def __init__(self, doc, annot_tuples=None, words=None, tags=None, heads=None,
                      deps=None, entities=None, make_projective=False,
    -                 cats=tuple()):
    +                 cats=None):
             """Create a GoldParse.
     
             doc (Doc): The document the annotations refer to.
    @@ -398,12 +398,15 @@ cdef class GoldParse:
             entities (iterable): A sequence of named entity annotations, either as
                 BILUO tag strings, or as `(start_char, end_char, label)` tuples,
                 representing the entity positions.
    -        cats (iterable): A sequence of labels for text classification. Each
    -            label may be a string or an int, or a `(start_char, end_char, label)`
    +        cats (dict): Labels for text classification. Each key in the dictionary
    +            may be a string or an int, or a `(start_char, end_char, label)`
                 tuple, indicating that the label is applied to only part of the
                 document (usually a sentence). Unlike entity annotations, label
                 annotations can overlap, i.e. a single word can be covered by
    -            multiple labelled spans.
    +            multiple labelled spans. The TextCategorizer component expects
    +            true examples of a label to have the value 1.0, and negative examples
    +            of a label to have the value 0.0. Labels not in the dictionary are
    +            treated as missing -- the gradient for those labels will be zero.
             RETURNS (GoldParse): The newly constructed object.
             """
             if words is None:
    @@ -434,7 +437,7 @@ cdef class GoldParse:
             self.c.sent_start = self.mem.alloc(len(doc), sizeof(int))
             self.c.ner = self.mem.alloc(len(doc), sizeof(Transition))
     
    -        self.cats = list(cats)
    +        self.cats = {} if cats is None else dict(cats)
             self.words = [None] * len(doc)
             self.tags = [None] * len(doc)
             self.heads = [None] * len(doc)
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 8d935335c..c39976630 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -551,7 +551,6 @@ class NeuralLabeller(NeuralTagger):
                         label = self.make_label(i, words, tags, heads, deps, ents)
                         if label is not None and label not in self.labels:
                             self.labels[label] = len(self.labels)
    -        print(len(self.labels))
             if self.model is True:
                 token_vector_width = util.env_opt('token_vector_width')
                 self.model = chain(
    @@ -720,11 +719,17 @@ class TextCategorizer(BaseThincComponent):
     
         def get_loss(self, docs, golds, scores):
             truths = numpy.zeros((len(golds), len(self.labels)), dtype='f')
    +        not_missing = numpy.ones((len(golds), len(self.labels)), dtype='f')
             for i, gold in enumerate(golds):
                 for j, label in enumerate(self.labels):
    -                truths[i, j] = label in gold.cats
    +                if label in gold.cats:
    +                    truths[i, j] = gold.cats[label]
    +                else:
    +                    not_missing[i, j] = 0.
             truths = self.model.ops.asarray(truths)
    +        not_missing = self.model.ops.asarray(not_missing)
             d_scores = (scores-truths) / scores.shape[0]
    +        d_scores *= not_missing
             mean_square_error = ((scores-truths)**2).sum(axis=1).mean()
             return mean_square_error, d_scores
     
    
    From e25ffcb11f349c1f411d6d51280146eb5f72126a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 19:38:13 -0500
    Subject: [PATCH 227/649] Move history size under feature flags
    
    ---
     spacy/syntax/nn_parser.pyx | 31 ++++++++++++++++---------------
     1 file changed, 16 insertions(+), 15 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 422b0fdc7..b57e8b466 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -68,14 +68,10 @@ from ..gold cimport GoldParse
     from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG
     from . import _beam_utils
     
    -USE_HISTORY = True
    -HIST_SIZE = 8 # Max 8
    -HIST_DIMS = 8
     
     def get_templates(*args, **kwargs):
         return []
     
    -USE_FTRL = True
     DEBUG = False
     def set_debug(val):
         global DEBUG
    @@ -248,6 +244,8 @@ cdef class Parser:
             hidden_width = util.env_opt('hidden_width', hidden_width)
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2)
             embed_size = util.env_opt('embed_size', 7000)
    +        hist_size = util.env_opt('history_feats', cfg.get('history_feats', 0))
    +        hist_width = util.env_opt('history_width', cfg.get('history_width', 0))
             tok2vec = Tok2Vec(token_vector_width, embed_size,
                               pretrained_dims=cfg.get('pretrained_dims', 0))
             tok2vec = chain(tok2vec, flatten)
    @@ -263,20 +261,21 @@ cdef class Parser:
     
             with Model.use_device('cpu'):
                 if depth == 0:
    -                if USE_HISTORY:
    +                if hist_size:
                         upper = chain(
    -                        HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE,
    -                                        nr_dim=HIST_DIMS),
    -                        zero_init(Affine(nr_class, nr_class+HIST_SIZE*HIST_DIMS,
    +                        HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    +                                        nr_dim=hist_width),
    +                        zero_init(Affine(nr_class, nr_class+hist_size*hist_size,
                                               drop_factor=0.0)))
                         upper.is_noop = False
                     else:
                         upper = chain()
                         upper.is_noop = True
    -            elif USE_HISTORY:
    +            elif hist_size:
                     upper = chain(
    -                    HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE, nr_dim=HIST_DIMS),
    -                    Maxout(hidden_width, hidden_width+HIST_SIZE*HIST_DIMS),
    +                    HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    +                                    nr_dim=hist_width),
    +                    Maxout(hidden_width, hidden_width+hist_size*hist_width),
                         clone(Maxout(hidden_width, hidden_width), depth-2),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
    @@ -296,7 +295,9 @@ cdef class Parser:
                 'depth': depth,
                 'token_vector_width': token_vector_width,
                 'hidden_width': hidden_width,
    -            'maxout_pieces': parser_maxout_pieces
    +            'maxout_pieces': parser_maxout_pieces,
    +            'hist_size': hist_size,
    +            'hist_width': hist_width
             }
             return (tok2vec, lower, upper), cfg
     
    @@ -369,7 +370,7 @@ cdef class Parser:
                 _cleanup(beam)
                 return output
     
    -    def pipe(self, docs, int batch_size=1000, int n_threads=2,
    +    def pipe(self, docs, int batch_size=256, int n_threads=2,
                  beam_width=None, beam_density=None):
             """
             Process a stream of documents.
    @@ -454,7 +455,7 @@ cdef class Parser:
                         hists.append([st.get_hist(j+1) for j in range(8)])
                     hists = numpy.asarray(hists)
                     vectors = state2vec(token_ids[:next_step.size()])
    -                if USE_HISTORY:
    +                if self.cfg.get('hist_size'):
                         scores = vec2scores((vectors, hists))
                     else:
                         scores = vec2scores(vectors)
    @@ -577,7 +578,7 @@ cdef class Parser:
                     mask = vec2scores.ops.get_dropout_mask(vector.shape, drop)
                     vector *= mask
                 hists = numpy.asarray([st.history for st in states], dtype='i')
    -            if USE_HISTORY:
    +            if self.cfg.get('hist_size', 0):
                     scores, bp_scores = vec2scores.begin_update((vector, hists), drop=drop)
                 else:
                     scores, bp_scores = vec2scores.begin_update(vector, drop=drop)
    
    From fc06b0a33357352c99c5b1e41789c15920daac73 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 21:52:28 -0500
    Subject: [PATCH 228/649] Fix training when hist_size==0
    
    ---
     spacy/_ml.py | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 6223715b5..d6e745f22 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -257,6 +257,8 @@ class Embed(Model):
     
     def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
         '''Wrap a model, adding features representing action history.'''
    +    if hist_size == 0:
    +        return layerize(noop())
         embed_tables = [Embed(nr_dim, nr_class, column=i, name='embed%d')
                         for i in range(hist_size)]
         embed = concatenate(*embed_tables)
    
    From ca1276477289b570249967d595f232225df90184 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 21:53:29 -0500
    Subject: [PATCH 229/649] Enable history features for beam parser
    
    ---
     spacy/syntax/_beam_utils.pyx | 11 ++++++++---
     spacy/syntax/nn_parser.pyx   | 11 +++++++++--
     2 files changed, 17 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx
    index a26900f6b..da4efefbc 100644
    --- a/spacy/syntax/_beam_utils.pyx
    +++ b/spacy/syntax/_beam_utils.pyx
    @@ -21,6 +21,7 @@ cdef int _transition_state(void* _dest, void* _src, class_t clas, void* _moves)
         moves = _moves
         dest.clone(src)
         moves[clas].do(dest.c, moves[clas].label)
    +    dest.c.push_hist(clas)
     
     
     cdef int _check_final_state(void* _state, void* extra_args) except -1:
    @@ -148,8 +149,8 @@ def get_token_ids(states, int n_tokens):
     nr_update = 0
     def update_beam(TransitionSystem moves, int nr_feature, int max_steps,
                     states, golds,
    -                state2vec, vec2scores, 
    -                int width, float density,
    +                state2vec, vec2scores,
    +                int width, float density, int hist_feats,
                     losses=None, drop=0.):
         global nr_update
         cdef MaxViolation violn
    @@ -180,7 +181,11 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps,
             # Now that we have our flat list of states, feed them through the model
             token_ids = get_token_ids(states, nr_feature)
             vectors, bp_vectors = state2vec.begin_update(token_ids, drop=drop)
    -        scores, bp_scores = vec2scores.begin_update(vectors, drop=drop)
    +        if hist_feats:
    +            hists = numpy.asarray([st.history[:hist_feats] for st in states], dtype='i')
    +            scores, bp_scores = vec2scores.begin_update((vectors, hists), drop=drop)
    +        else:
    +            scores, bp_scores = vec2scores.begin_update(vectors, drop=drop)
     
             # Store the callbacks for the backward pass
             backprops.append((token_ids, bp_vectors, bp_scores))
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index b57e8b466..9a071ae14 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -505,7 +505,12 @@ cdef class Parser:
                             states.append(stcls)
                     token_ids = self.get_token_ids(states)
                     vectors = state2vec(token_ids)
    -                scores = vec2scores(vectors)
    +                if self.cfg.get('hist_size', 0):
    +                    hists = numpy.asarray([st.history[:self.cfg['hist_size']]
    +                                           for st in states], dtype='i')
    +                    scores = vec2scores(vectors, drop=drop)
    +                else:
    +                    scores = vec2scores(vectors, drop=drop)
                     j = 0
                     c_scores = scores.data
                     for i in range(beam.size):
    @@ -537,6 +542,7 @@ cdef class Parser:
             guess = arg_maxout_if_valid(scores, is_valid, nr_class, nr_piece)
             action = self.moves.c[guess]
             action.do(state, action.label)
    +        state.push_hist(guess)
     
             free(is_valid)
             free(scores)
    @@ -634,7 +640,7 @@ cdef class Parser:
             states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500,
                                             states, golds,
                                             state2vec, vec2scores,
    -                                        width, density,
    +                                        width, density, self.cfg.get('hist_size', 0),
                                             drop=drop, losses=losses)
             backprop_lower = []
             cdef float batch_size = len(docs)
    @@ -967,6 +973,7 @@ cdef int _transition_state(void* _dest, void* _src, class_t clas, void* _moves)
         moves = _moves
         dest.clone(src)
         moves[clas].do(dest.c, moves[clas].label)
    +    dest.c.push_hist(clas)
     
     
     cdef int _check_final_state(void* _state, void* extra_args) except -1:
    
    From 363aa47b40b281d40ee9bfc187a8ba9b964ac913 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 21:53:49 -0500
    Subject: [PATCH 230/649] Clean up dead parsing code
    
    ---
     spacy/syntax/nn_parser.pyx  |  2 --
     spacy/syntax/stateclass.pyx | 24 ------------------------
     2 files changed, 26 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 9a071ae14..e2c2b41c7 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -529,8 +529,6 @@ cdef class Parser:
                 const float* feat_weights,
                 int nr_class, int nr_feat, int nr_piece) nogil:
             '''This only works with no hidden layers -- fast but inaccurate'''
    -        #for i in cython.parallel.prange(next_step.size(), num_threads=4, nogil=True):
    -        #    self._parse_step(next_step[i], feat_weights, nr_class, nr_feat)
             token_ids = calloc(nr_feat, sizeof(int))
             scores = calloc(nr_class * nr_piece, sizeof(float))
             is_valid = calloc(nr_class, sizeof(int))
    diff --git a/spacy/syntax/stateclass.pyx b/spacy/syntax/stateclass.pyx
    index 9c179820c..ddd1f558c 100644
    --- a/spacy/syntax/stateclass.pyx
    +++ b/spacy/syntax/stateclass.pyx
    @@ -62,27 +62,3 @@ cdef class StateClass:
             n0 = words[self.B(0)]
             n1 = words[self.B(1)]
             return ' '.join((third, second, top, '|', n0, n1))
    -
    -    @classmethod
    -    def nr_context_tokens(cls):
    -        return 13
    -
    -    def set_context_tokens(self, int[::1] output):
    -        output[0] = self.B(0)
    -        output[1] = self.B(1)
    -        output[2] = self.S(0)
    -        output[3] = self.S(1)
    -        output[4] = self.S(2)
    -        output[5] = self.L(self.S(0), 1)
    -        output[6] = self.L(self.S(0), 2)
    -        output[6] = self.R(self.S(0), 1)
    -        output[7] = self.L(self.B(0), 1)
    -        output[8] = self.R(self.S(0), 2)
    -        output[9] = self.L(self.S(1), 1)
    -        output[10] = self.L(self.S(1), 2)
    -        output[11] = self.R(self.S(1), 1)
    -        output[12] = self.R(self.S(1), 2)
    -
    -        for i in range(13):
    -            if output[i] != -1:
    -                output[i] += self.c.offset
    
    From b0618def8d5e03d24e732432d858a34f1301b314 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 21:54:12 -0500
    Subject: [PATCH 231/649] Add support for 2-token state option
    
    ---
     spacy/syntax/_state.pxd | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd
    index f4fa49286..50146401e 100644
    --- a/spacy/syntax/_state.pxd
    +++ b/spacy/syntax/_state.pxd
    @@ -93,6 +93,9 @@ cdef cppclass StateC:
             free(this.shifted - PADDING)
     
         void set_context_tokens(int* ids, int n) nogil:
    +        if n == 2:
    +            ids[0] = this.B(0)
    +            ids[1] = this.S(0)
             if n == 8:
                 ids[0] = this.B(0)
                 ids[1] = this.B(1)
    
    From 3db0a32fd651d7d8bd99f9a73eeae1124875a85e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 22:21:30 -0500
    Subject: [PATCH 232/649] Fix dropout for history features
    
    ---
     spacy/_ml.py | 10 ++++++++--
     1 file changed, 8 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index d6e745f22..7761e6d11 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -217,6 +217,7 @@ class PrecomputableMaxouts(Model):
     from thinc import describe
     from thinc.neural._classes.embed import _uniform_init
     
    +
     @describe.attributes(
         nV=describe.Dimension("Number of vectors"),
         nO=describe.Dimension("Size of output"),
    @@ -240,12 +241,12 @@ class Embed(Model):
         def predict(self, ids):
             if ids.ndim == 2:
                 ids = ids[:, self.column]
    -        return self.ops.xp.ascontiguousarray(self.vectors[ids])
    +        return self.ops.xp.ascontiguousarray(self.vectors[ids], dtype='f')
     
         def begin_update(self, ids, drop=0.):
             if ids.ndim == 2:
                 ids = ids[:, self.column]
    -        vectors = self.ops.xp.ascontiguousarray(self.vectors[ids])
    +        vectors = self.ops.xp.ascontiguousarray(self.vectors[ids], dtype='f')
             def backprop_embed(d_vectors, sgd=None):
                 n_vectors = d_vectors.shape[0]
                 self.ops.scatter_add(self.d_vectors, ids, d_vectors)
    @@ -267,8 +268,13 @@ def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
             vectors, hist_ids = vectors_hists
             hist_feats, bp_hists = embed.begin_update(hist_ids)
             outputs = ops.xp.hstack((vectors, hist_feats))
    +        mask = ops.get_dropout_mask(outputs.shape, drop)
    +        if mask is not None:
    +            outputs *= mask
     
             def add_history_bwd(d_outputs, sgd=None):
    +            if mask is not None:
    +                d_outputs *= mask
                 d_vectors = d_outputs[:, :vectors.shape[1]]
                 d_hists = d_outputs[:, vectors.shape[1]:]
                 bp_hists(d_hists, sgd=sgd)
    
    From 555d8c8bffc8a3b31c0f3396b02fcf45cba4bd96 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 22:21:50 -0500
    Subject: [PATCH 233/649] Fix beam history features
    
    ---
     spacy/syntax/nn_parser.pyx | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index e2c2b41c7..2b244bb70 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -508,9 +508,9 @@ cdef class Parser:
                     if self.cfg.get('hist_size', 0):
                         hists = numpy.asarray([st.history[:self.cfg['hist_size']]
                                                for st in states], dtype='i')
    -                    scores = vec2scores(vectors, drop=drop)
    +                    scores = vec2scores((vectors, hists))
                     else:
    -                    scores = vec2scores(vectors, drop=drop)
    +                    scores = vec2scores(vectors)
                     j = 0
                     c_scores = scores.data
                     for i in range(beam.size):
    @@ -723,7 +723,7 @@ cdef class Parser:
                                            lower, stream, drop=0.0)
             return (tokvecs, bp_tokvecs), state2vec, upper
     
    -    nr_feature = 8
    +    nr_feature = 2
     
         def get_token_ids(self, states):
             cdef StateClass state
    
    From 21d11936fea53d9b67a2ae306a4825cdd15fcc6c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 06:08:50 -0500
    Subject: [PATCH 234/649] Fix significant train/test skew error in history
     feats
    
    ---
     spacy/syntax/nn_parser.pyx | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 2b244bb70..3bca59b60 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -684,6 +684,7 @@ cdef class Parser:
                     while state.B(0) < start and not state.is_final():
                         action = self.moves.c[oracle_actions.pop(0)]
                         action.do(state.c, action.label)
    +                    state.c.push_hist(action.clas)
                         n_moves += 1
                     has_gold = self.moves.has_gold(gold, start=start,
                                                    end=start+max_length)
    
    From fbba7c517ece539f9b1c24df4f545b56189def72 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 06:09:18 -0500
    Subject: [PATCH 235/649] Pass dropout through to embed tables
    
    ---
     spacy/_ml.py | 7 +------
     1 file changed, 1 insertion(+), 6 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 7761e6d11..f79c5668a 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -266,15 +266,10 @@ def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
         ops = embed.ops
         def add_history_fwd(vectors_hists, drop=0.):
             vectors, hist_ids = vectors_hists
    -        hist_feats, bp_hists = embed.begin_update(hist_ids)
    +        hist_feats, bp_hists = embed.begin_update(hist_ids, drop=drop)
             outputs = ops.xp.hstack((vectors, hist_feats))
    -        mask = ops.get_dropout_mask(outputs.shape, drop)
    -        if mask is not None:
    -            outputs *= mask
     
             def add_history_bwd(d_outputs, sgd=None):
    -            if mask is not None:
    -                d_outputs *= mask
                 d_vectors = d_outputs[:, :vectors.shape[1]]
                 d_hists = d_outputs[:, vectors.shape[1]:]
                 bp_hists(d_hists, sgd=sgd)
    
    From 5c750a9c2f5c69e16c7c6c5e90d10870d0210e29 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 06:10:13 -0500
    Subject: [PATCH 236/649] Reserve 0 for 'missing' in history features
    
    ---
     spacy/_ml.py            | 2 ++
     spacy/syntax/_state.pxd | 2 +-
     2 files changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index f79c5668a..898d6ab49 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -231,6 +231,8 @@ class Embed(Model):
         name = 'embed'
     
         def __init__(self, nO, nV=None, **kwargs):
    +        if nV is not None:
    +            nV += 1
             Model.__init__(self, **kwargs)
             if 'name' in kwargs:
                 self.name = kwargs['name']
    diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd
    index 50146401e..1864b22b3 100644
    --- a/spacy/syntax/_state.pxd
    +++ b/spacy/syntax/_state.pxd
    @@ -297,7 +297,7 @@ cdef cppclass StateC:
                  + hash64(&this._hist, sizeof(RingBufferC), 1)
     
         void push_hist(int act) nogil:
    -        ring_push(&this._hist, act)
    +        ring_push(&this._hist, act+1)
     
         int get_hist(int i) nogil:
             return ring_get(&this._hist, i)
    
    From c66399d8ae1e65580491fa7b0873fea1f8aeca0c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 06:20:05 -0500
    Subject: [PATCH 237/649] Fix depth definition with history features
    
    ---
     spacy/syntax/nn_parser.pyx | 24 +++++++++++++-----------
     1 file changed, 13 insertions(+), 11 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 3bca59b60..f9c8c0c14 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -246,6 +246,9 @@ cdef class Parser:
             embed_size = util.env_opt('embed_size', 7000)
             hist_size = util.env_opt('history_feats', cfg.get('history_feats', 0))
             hist_width = util.env_opt('history_width', cfg.get('history_width', 0))
    +        if hist_size >= 1 and depth == 0:
    +            raise ValueError("Inconsistent hyper-params: "
    +                "history_feats >= 1 but parser_hidden_depth==0")
             tok2vec = Tok2Vec(token_vector_width, embed_size,
                               pretrained_dims=cfg.get('pretrained_dims', 0))
             tok2vec = chain(tok2vec, flatten)
    @@ -261,16 +264,15 @@ cdef class Parser:
     
             with Model.use_device('cpu'):
                 if depth == 0:
    -                if hist_size:
    -                    upper = chain(
    -                        HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    -                                        nr_dim=hist_width),
    -                        zero_init(Affine(nr_class, nr_class+hist_size*hist_size,
    -                                          drop_factor=0.0)))
    -                    upper.is_noop = False
    -                else:
    -                    upper = chain()
    -                    upper.is_noop = True
    +                upper = chain()
    +                upper.is_noop = True
    +            elif hist_size and depth == 1:
    +                upper = chain(
    +                    HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    +                                    nr_dim=hist_width),
    +                    zero_init(Affine(nr_class, hidden_width+hist_size*hist_width,
    +                                     drop_factor=0.0)))
    +                upper.is_noop = False
                 elif hist_size:
                     upper = chain(
                         HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    @@ -282,7 +284,7 @@ cdef class Parser:
                     upper.is_noop = False
                 else:
                     upper = chain(
    -                    Maxout(hidden_width, hidden_width),
    +                    clone(Maxout(hidden_width, hidden_width), depth-1),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    
    From 96a4e79d13a17c179684a53efb95dec982d53c77 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 6 Oct 2017 18:22:10 +0200
    Subject: [PATCH 238/649] Fix PhraseMatcher example
    
    ---
     website/api/phrasematcher.jade | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/api/phrasematcher.jade b/website/api/phrasematcher.jade
    index 0f0959f28..223ec11f9 100644
    --- a/website/api/phrasematcher.jade
    +++ b/website/api/phrasematcher.jade
    @@ -124,9 +124,9 @@ p Check whether the matcher contains rules for a match ID.
     
     +aside-code("Example").
         matcher = PhraseMatcher(nlp.vocab)
    -    assert len(matcher) == 0
    +    assert 'OBAMA' not in matcher
         matcher.add('OBAMA', None, nlp(u"Barack Obama"))
    -    assert len(matcher) == 1
    +    assert 'OBAMA' in matcher
     
     +table(["Name", "Type", "Description"])
         +row
    
    From 16ba6aa8a66b69eeeef482dc3247bc46e938aec7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 13:17:31 -0500
    Subject: [PATCH 239/649] Fix parser config serialization
    
    ---
     spacy/syntax/nn_parser.pyx | 23 ++++++++++++-----------
     1 file changed, 12 insertions(+), 11 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f9c8c0c14..9ae53b103 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -238,14 +238,15 @@ cdef class Parser:
         Base class of the DependencyParser and EntityRecognizer.
         """
         @classmethod
    -    def Model(cls, nr_class, token_vector_width=128, hidden_width=200, depth=1, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', depth)
    -        token_vector_width = util.env_opt('token_vector_width', token_vector_width)
    -        hidden_width = util.env_opt('hidden_width', hidden_width)
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2)
    -        embed_size = util.env_opt('embed_size', 7000)
    -        hist_size = util.env_opt('history_feats', cfg.get('history_feats', 0))
    -        hist_width = util.env_opt('history_width', cfg.get('history_width', 0))
    +    def Model(cls, nr_class, **cfg):
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('parser_hidden_depth', 1))
    +        token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
    +        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('parser_maxout_pieces', 3))
    +        embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
    +        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
    +        hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
    +        print("Create parser model", locals())
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    @@ -277,14 +278,14 @@ cdef class Parser:
                     upper = chain(
                         HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
                                         nr_dim=hist_width),
    -                    Maxout(hidden_width, hidden_width+hist_size*hist_width),
    -                    clone(Maxout(hidden_width, hidden_width), depth-2),
    +                    LayerNorm(Maxout(hidden_width, hidden_width+hist_size*hist_width)),
    +                    clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-2),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
                 else:
                     upper = chain(
    -                    clone(Maxout(hidden_width, hidden_width), depth-1),
    +                    clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-1),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    
    From f4c9a98166feacc788f2d93e834ae2cf3e0332d2 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 13:17:47 -0500
    Subject: [PATCH 240/649] Fix spacy evaluate command on non-GPU
    
    ---
     spacy/cli/evaluate.py | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index 42e077dc2..29e30b7d2 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -42,7 +42,8 @@ def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False,
         Evaluate a model. To render a sample of parses in a HTML file, set an output
         directory as the displacy_path argument.
         """
    -    util.use_gpu(gpu_id)
    +    if gpu_id >= 0:
    +        util.use_gpu(gpu_id)
         util.set_env_log(False)
         data_path = util.ensure_path(data_path)
         displacy_path = util.ensure_path(displacy_path)
    
    From 8e731009fea6afa67862c6293248fac244836d70 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 13:50:52 -0500
    Subject: [PATCH 241/649] Fix parser config serialization
    
    ---
     spacy/syntax/nn_parser.pyx | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 9ae53b103..bb1ec1b4a 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,10 +239,10 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('parser_hidden_depth', 1))
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
             token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
             hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200))
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('parser_maxout_pieces', 3))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 3))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
             hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
             hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
    @@ -295,7 +295,7 @@ cdef class Parser:
             lower.begin_training(lower.ops.allocate((500, token_vector_width)))
             cfg = {
                 'nr_class': nr_class,
    -            'depth': depth,
    +            'hidden_depth': depth,
                 'token_vector_width': token_vector_width,
                 'hidden_width': hidden_width,
                 'maxout_pieces': parser_maxout_pieces,
    @@ -727,7 +727,7 @@ cdef class Parser:
                                            lower, stream, drop=0.0)
             return (tokvecs, bp_tokvecs), state2vec, upper
     
    -    nr_feature = 2
    +    nr_feature = 8
     
         def get_token_ids(self, states):
             cdef StateClass state
    
    From 3468d535ad2ae0074683600c8b1dadaad89ca1cb Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 6 Oct 2017 21:39:06 +0200
    Subject: [PATCH 242/649] Update model benchmarks
    
    ---
     .../_facts-figures/_benchmarks-models.jade    | 26 +++++++++++++++++--
     1 file changed, 24 insertions(+), 2 deletions(-)
    
    diff --git a/website/usage/_facts-figures/_benchmarks-models.jade b/website/usage/_facts-figures/_benchmarks-models.jade
    index 208e7da48..d8f9713b2 100644
    --- a/website/usage/_facts-figures/_benchmarks-models.jade
    +++ b/website/usage/_facts-figures/_benchmarks-models.jade
    @@ -6,14 +6,14 @@ p
         |  end-to-end from raw text, with no "gold standard" pre-processing, over
         |  text from a mix of genres where possible.
     
    -+under-construction
    -
     +aside("Methodology")
         |  The evaluation was conducted on raw text with no gold standard
         |  information. The parser, tagger and entity recognizer were trained on the
         |  #[+a("https://www.gabormelli.com/RKB/OntoNotes_Corpus") OntoNotes 5]
         |  corpus, the word vectors on #[+a("http://commoncrawl.org") Common Crawl].
     
    ++h(4, "benchmarks-models-english") English
    +
     +table(["Model", "spaCy", "Type", "UAS", "NER F", "POS", "WPS", "Size"])
         +row
             +cell #[+a("/models/en#en_core_web_sm") #[code en_core_web_sm]] 2.0.0a5
    @@ -46,3 +46,25 @@ p
             +cell #[code en_core_web_md] 1.2.1
             each data in ["1.x", "linear", 90.6, 81.4, 96.7, "18.8k", "1 GB"]
                 +cell.u-text-right=data
    +
    ++h(4, "benchmarks-models-spanish") Spanish
    +
    ++table(["Model", "spaCy", "Type", "UAS", "NER F", "POS", "WPS", "Size"])
    +    +row
    +        +cell #[+a("/models/es#es_core_web_sm") #[code es_core_web_sm]] 2.0.0a0
    +        +cell.u-text-right 2.x
    +        +cell.u-text-right neural
    +        +cell.u-text-right #[strong 90.1]
    +        +cell.u-text-right 89.0
    +        +cell.u-text-right #[strong 96.7]
    +        +cell.u-text-right #[em n/a]
    +        +cell.u-text-right #[strong 36 MB]
    +
    +    +row("divider")
    +        +cell #[code es_core_web_md] 1.1.0
    +        each data in ["1.x", "linear", 87.5]
    +            +cell.u-text-right=data
    +        +cell #[strong 94.2]
    +        +cell #[strong 96.7]
    +        +cell.u-text-right #[em n/a]
    +        +cell.u-text-right 377 MB
    
    From 8be46d766e1b5c97abe44793ca0e278ac0b3657c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 16:19:02 -0500
    Subject: [PATCH 243/649] Remove print statement
    
    ---
     spacy/syntax/nn_parser.pyx | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index bb1ec1b4a..b5f218d75 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -246,7 +246,6 @@ cdef class Parser:
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
             hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
             hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
    -        print("Create parser model", locals())
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    
    From 212c8f071180c9ce134a74b85603e48c14199595 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 00:25:54 +0200
    Subject: [PATCH 244/649] Implement new Language methods and pipeline API
    
    ---
     spacy/language.py | 260 ++++++++++++++++++++++++++--------------------
     spacy/util.py     |   6 +-
     2 files changed, 150 insertions(+), 116 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index c49c64b1d..91644aec0 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -70,59 +70,7 @@ class BaseDefaults(object):
                              prefix_search=prefix_search, suffix_search=suffix_search,
                              infix_finditer=infix_finditer, token_match=token_match)
     
    -    @classmethod
    -    def create_tagger(cls, nlp=None, **cfg):
    -        if nlp is None:
    -            return NeuralTagger(cls.create_vocab(nlp), **cfg)
    -        else:
    -            return NeuralTagger(nlp.vocab, **cfg)
    -
    -    @classmethod
    -    def create_parser(cls, nlp=None, **cfg):
    -        if nlp is None:
    -            return NeuralDependencyParser(cls.create_vocab(nlp), **cfg)
    -        else:
    -            return NeuralDependencyParser(nlp.vocab, **cfg)
    -
    -    @classmethod
    -    def create_entity(cls, nlp=None, **cfg):
    -        if nlp is None:
    -            return NeuralEntityRecognizer(cls.create_vocab(nlp), **cfg)
    -        else:
    -            return NeuralEntityRecognizer(nlp.vocab, **cfg)
    -
    -    @classmethod
    -    def create_pipeline(cls, nlp=None, disable=tuple()):
    -        meta = nlp.meta if nlp is not None else {}
    -        # Resolve strings, like "cnn", "lstm", etc
    -        pipeline = []
    -        for entry in meta.get('pipeline', []):
    -            if entry in disable or getattr(entry, 'name', entry) in disable:
    -                continue
    -            factory = cls.Defaults.factories[entry]
    -            pipeline.append(factory(nlp, **meta.get(entry, {})))
    -        return pipeline
    -
    -    factories = {
    -        'make_doc': create_tokenizer,
    -        'tensorizer': lambda nlp, **cfg: [TokenVectorEncoder(nlp.vocab, **cfg)],
    -        'tagger': lambda nlp, **cfg: [NeuralTagger(nlp.vocab, **cfg)],
    -        'parser': lambda nlp, **cfg: [
    -            NeuralDependencyParser(nlp.vocab, **cfg),
    -            nonproj.deprojectivize],
    -        'ner': lambda nlp, **cfg: [NeuralEntityRecognizer(nlp.vocab, **cfg)],
    -        'similarity': lambda nlp, **cfg: [SimilarityHook(nlp.vocab, **cfg)],
    -        'textcat': lambda nlp, **cfg: [TextCategorizer(nlp.vocab, **cfg)],
    -        # Temporary compatibility -- delete after pivot
    -        'token_vectors': lambda nlp, **cfg: [TokenVectorEncoder(nlp.vocab, **cfg)],
    -        'tags': lambda nlp, **cfg: [NeuralTagger(nlp.vocab, **cfg)],
    -        'dependencies': lambda nlp, **cfg: [
    -            NeuralDependencyParser(nlp.vocab, **cfg),
    -            nonproj.deprojectivize,
    -        ],
    -        'entities': lambda nlp, **cfg: [NeuralEntityRecognizer(nlp.vocab, **cfg)],
    -    }
    -
    +    pipe_names = ['tensorizer', 'tagger', 'parser', 'ner']
         token_match = TOKEN_MATCH
         prefixes = tuple(TOKENIZER_PREFIXES)
         suffixes = tuple(TOKENIZER_SUFFIXES)
    @@ -152,8 +100,17 @@ class Language(object):
         Defaults = BaseDefaults
         lang = None
     
    -    def __init__(self, vocab=True, make_doc=True, pipeline=None,
    -                 meta={}, disable=tuple(), **kwargs):
    +    factories = {
    +        'tokenizer': lambda nlp: nlp.Defaults.create_tokenizer(nlp),
    +        'tensorizer': lambda nlp, **cfg: TokenVectorEncoder(nlp.vocab, **cfg),
    +        'tagger': lambda nlp, **cfg: NeuralTagger(nlp.vocab, **cfg),
    +        'parser': lambda nlp, **cfg: NeuralDependencyParser(nlp.vocab, **cfg),  # nonproj.deprojectivize,
    +        'ner': lambda nlp, **cfg: NeuralEntityRecognizer(nlp.vocab, **cfg),
    +        'similarity': lambda nlp, **cfg: SimilarityHook(nlp.vocab, **cfg),
    +        'textcat': lambda nlp, **cfg: TextCategorizer(nlp.vocab, **cfg)
    +    }
    +
    +    def __init__(self, vocab=True, make_doc=True, meta={}, **kwargs):
             """Initialise a Language object.
     
             vocab (Vocab): A `Vocab` object. If `True`, a vocab is created via
    @@ -179,28 +136,7 @@ class Language(object):
                 factory = self.Defaults.create_tokenizer
                 make_doc = factory(self, **meta.get('tokenizer', {}))
             self.tokenizer = make_doc
    -        if pipeline is True:
    -            self.pipeline = self.Defaults.create_pipeline(self, disable)
    -        elif pipeline:
    -            # Careful not to do getattr(p, 'name', None) here
    -            # If we had disable=[None], we'd disable everything!
    -            self.pipeline = [p for p in pipeline
    -                             if p not in disable
    -                             and getattr(p, 'name', p) not in disable]
    -            # Resolve strings, like "cnn", "lstm", etc
    -            for i, entry in enumerate(self.pipeline):
    -                if entry in self.Defaults.factories:
    -                    factory = self.Defaults.factories[entry]
    -                    self.pipeline[i] = factory(self, **meta.get(entry, {}))
    -        else:
    -            self.pipeline = []
    -        flat_list = []
    -        for pipe in self.pipeline:
    -            if isinstance(pipe, list):
    -                flat_list.extend(pipe)
    -            else:
    -                flat_list.append(pipe)
    -        self.pipeline = flat_list
    +        self.pipeline = []
             self._optimizer = None
     
         @property
    @@ -214,11 +150,7 @@ class Language(object):
             self._meta.setdefault('email', '')
             self._meta.setdefault('url', '')
             self._meta.setdefault('license', '')
    -        pipeline = []
    -        for component in self.pipeline:
    -            if hasattr(component, 'name'):
    -                pipeline.append(component.name)
    -        self._meta['pipeline'] = pipeline
    +        self._meta['pipeline'] = self.pipe_names
             return self._meta
     
         @meta.setter
    @@ -228,31 +160,133 @@ class Language(object):
         # Conveniences to access pipeline components
         @property
         def tensorizer(self):
    -        return self.get_component('tensorizer')
    +        return self.get_pipe('tensorizer')
     
         @property
         def tagger(self):
    -        return self.get_component('tagger')
    +        return self.get_pipe('tagger')
     
         @property
         def parser(self):
    -        return self.get_component('parser')
    +        return self.get_pipe('parser')
     
         @property
         def entity(self):
    -        return self.get_component('ner')
    +        return self.get_pipe('ner')
     
         @property
         def matcher(self):
    -        return self.get_component('matcher')
    +        return self.get_pipe('matcher')
     
    -    def get_component(self, name):
    -        if self.pipeline in (True, None):
    -            return None
    -        for proc in self.pipeline:
    -            if hasattr(proc, 'name') and proc.name.endswith(name):
    -                return proc
    -        return None
    +    @property
    +    def pipe_names(self):
    +        """Get names of available pipeline components.
    +
    +        RETURNS (list): List of component name strings, in order.
    +        """
    +        return [pipe_name for pipe_name, _ in self.pipeline]
    +
    +    def get_pipe(self, name):
    +        """Get a pipeline component for a given component name.
    +
    +        name (unicode): Name of pipeline component to get.
    +        RETURNS (callable): The pipeline component.
    +        """
    +        for pipe_name, component in self.pipeline:
    +            if pipe_name == name:
    +                return component
    +        msg = "No component '{}' found in pipeline. Available names: {}"
    +        raise KeyError(msg.format(name, self.pipe_names))
    +
    +    def create_pipe(self, name, config=dict()):
    +        """Create a pipeline component from a factory.
    +
    +        name (unicode): Factory name to look up in `Language.factories`.
    +        RETURNS (callable): Pipeline component.
    +        """
    +        if name not in self.factories:
    +            raise KeyError("Can't find factory for '{}'.".format(name))
    +        factory = self.factories[name]
    +        return factory(self, **config)
    +
    +    def add_pipe(self, component, name=None, before=None, after=None,
    +                 first=None, last=None):
    +        """Add a component to the processing pipeline. Valid components are
    +        callables that take a `Doc` object, modify it and return it. Only one of
    +        before, after, first or last can be set. Default behaviour is "last".
    +
    +        component (callable): The pipeline component.
    +        name (unicode): Name of pipeline component. Overwrites existing
    +            component.name attribute if available. If no name is set and
    +            the component exposes no name attribute, component.__name__ is
    +            used. An error is raised if the name already exists in the pipeline.
    +        before (unicode): Component name to insert component directly before.
    +        after (unicode): Component name to insert component directly after.
    +        first (bool): Insert component first / not first in the pipeline.
    +        last (bool): Insert component last / not last in the pipeline.
    +
    +        EXAMPLE:
    +            >>> nlp.add_pipe(component, before='ner')
    +            >>> nlp.add_pipe(component, name='custom_name', last=True)
    +        """
    +        if name is None:
    +            name = getattr(component, 'name', component.__name__)
    +        if name in self.pipe_names:
    +            raise ValueError("'{}' already exists in pipeline.".format(name))
    +        if sum([bool(before), bool(after), bool(first), bool(last)]) >= 2:
    +            msg = ("Invalid constraints. You can only set one of the "
    +                   "following: before, after, first, last.")
    +            raise ValueError(msg)
    +        pipe = (name, component)
    +        if last or not any([first, before, after]):
    +            self.pipeline.append(pipe)
    +        elif first:
    +            self.pipeline.insert(0, pipe)
    +        elif before and before in self.pipe_names:
    +            self.pipeline.insert(self.pipe_names.index(before), pipe)
    +        elif after and after in self.pipe_names:
    +            self.pipeline.insert(self.pipe_names.index(after), pipe)
    +        else:
    +            msg = "Can't find '{}' in pipeline. Available names: {}"
    +            unfound = before or after
    +            raise ValueError(msg.format(unfound, self.pipe_names))
    +
    +    def replace_pipe(self, name, component):
    +        """Replace a component in the pipeline.
    +
    +        name (unicode): Name of the component to replace.
    +        component (callable): Pipeline component.
    +        """
    +        if name not in self.pipe_names:
    +            msg = "Can't find '{}' in pipeline. Available names: {}"
    +            raise ValueError(msg.format(name, self.pipe_names))
    +        self.pipeline[self.pipe_names.index(name)] = (name, component)
    +
    +    def rename_pipe(self, old_name, new_name):
    +        """Rename a pipeline component.
    +
    +        old_name (unicode): Name of the component to rename.
    +        new_name (unicode): New name of the component.
    +        """
    +        if old_name not in self.pipe_names:
    +            msg = "Can't find '{}' in pipeline. Available names: {}"
    +            raise ValueError(msg.format(old_name, self.pipe_names))
    +        if new_name in self.pipe_names:
    +            msg = "'{}' already exists in pipeline. Existing names: {}"
    +            raise ValueError(msg.format(new_name, self.pipe_names))
    +        i = self.pipe_names.index(old_name)
    +        self.pipeline[i] = (new_name, self.pipeline[i][1])
    +
    +    def remove_pipe(self, name):
    +        """Remove a component from the pipeline.
    +
    +        name (unicode): Name of the component to remove.
    +        RETURNS (tuple): A (name, component) tuple of the removed component.
    +        """
    +        if name not in self.pipe_names:
    +            msg = "Can't find '{}' in pipeline. Available names: {}"
    +            raise ValueError(msg.format(name, self.pipe_names))
    +        return self.pipeline.pop(self.pipe_names.index(name))
     
         def __call__(self, text, disable=[]):
             """'Apply the pipeline to some text. The text can span multiple sentences,
    @@ -269,8 +303,7 @@ class Language(object):
                 ('An', 'NN')
             """
             doc = self.make_doc(text)
    -        for proc in self.pipeline:
    -            name = getattr(proc, 'name', None)
    +        for name, proc in self.pipeline:
                 if name in disable:
                     continue
                 doc = proc(doc)
    @@ -308,7 +341,7 @@ class Language(object):
                 grads[key] = (W, dW)
             pipes = list(self.pipeline)
             random.shuffle(pipes)
    -        for proc in pipes:
    +        for name, proc in pipes:
                 if not hasattr(proc, 'update'):
                     continue
                 proc.update(docs, golds, drop=drop, sgd=get_grads, losses=losses)
    @@ -322,7 +355,7 @@ class Language(object):
             docs_golds (iterable): Tuples of `Doc` and `GoldParse` objects.
             YIELDS (tuple): Tuples of preprocessed `Doc` and `GoldParse` objects.
             """
    -        for proc in self.pipeline:
    +        for name, proc in self.pipeline:
                 if hasattr(proc, 'preprocess_gold'):
                     docs_golds = proc.preprocess_gold(docs_golds)
             for doc, gold in docs_golds:
    @@ -371,7 +404,7 @@ class Language(object):
             else:
                 device = None
             link_vectors_to_models(self.vocab)
    -        for proc in self.pipeline:
    +        for name, proc in self.pipeline:
                 if hasattr(proc, 'begin_training'):
                     context = proc.begin_training(get_gold_tuples(),
                                                   pipeline=self.pipeline)
    @@ -393,7 +426,7 @@ class Language(object):
             docs, golds = zip(*docs_golds)
             docs = list(docs)
             golds = list(golds)
    -        for pipe in self.pipeline:
    +        for name, pipe in self.pipeline:
                 if not hasattr(pipe, 'pipe'):
                     for doc in docs:
                         pipe(doc)
    @@ -419,7 +452,7 @@ class Language(object):
                 >>> with nlp.use_params(optimizer.averages):
                 >>>     nlp.to_disk('/tmp/checkpoint')
             """
    -        contexts = [pipe.use_params(params) for pipe
    +        contexts = [pipe.use_params(params) for name, pipe
                         in self.pipeline if hasattr(pipe, 'use_params')]
             # TODO: Having trouble with contextlib
             # Workaround: these aren't actually context managers atm.
    @@ -466,8 +499,7 @@ class Language(object):
                     yield (doc, context)
                 return
             docs = (self.make_doc(text) for text in texts)
    -        for proc in self.pipeline:
    -            name = getattr(proc, 'name', None)
    +        for name, proc in self.pipeline:
                 if name in disable:
                     continue
                 if hasattr(proc, 'pipe'):
    @@ -495,14 +527,14 @@ class Language(object):
                 ('tokenizer', lambda p: self.tokenizer.to_disk(p, vocab=False)),
                 ('meta.json', lambda p: p.open('w').write(json_dumps(self.meta)))
             ))
    -        for proc in self.pipeline:
    +        for name, proc in self.pipeline:
                 if not hasattr(proc, 'name'):
                     continue
    -            if proc.name in disable:
    +            if name in disable:
                     continue
                 if not hasattr(proc, 'to_disk'):
                     continue
    -            serializers[proc.name] = lambda p, proc=proc: proc.to_disk(p, vocab=False)
    +            serializers[name] = lambda p, proc=proc: proc.to_disk(p, vocab=False)
             serializers['vocab'] = lambda p: self.vocab.to_disk(p)
             util.to_disk(path, serializers, {p: False for p in disable})
     
    @@ -526,14 +558,12 @@ class Language(object):
                 ('tokenizer', lambda p: self.tokenizer.from_disk(p, vocab=False)),
                 ('meta.json', lambda p: p.open('w').write(json_dumps(self.meta)))
             ))
    -        for proc in self.pipeline:
    -            if not hasattr(proc, 'name'):
    -                continue
    -            if proc.name in disable:
    +        for name, proc in self.pipeline:
    +            if name in disable:
                     continue
                 if not hasattr(proc, 'to_disk'):
                     continue
    -            deserializers[proc.name] = lambda p, proc=proc: proc.from_disk(p, vocab=False)
    +            deserializers[name] = lambda p, proc=proc: proc.from_disk(p, vocab=False)
             exclude = {p: False for p in disable}
             if not (path / 'vocab').exists():
                 exclude['vocab'] = True
    @@ -552,8 +582,8 @@ class Language(object):
                 ('tokenizer', lambda: self.tokenizer.to_bytes(vocab=False)),
                 ('meta', lambda: ujson.dumps(self.meta))
             ))
    -        for i, proc in enumerate(self.pipeline):
    -            if getattr(proc, 'name', None) in disable:
    +        for i, (name, proc) in enumerate(self.pipeline):
    +            if name in disable:
                     continue
                 if not hasattr(proc, 'to_bytes'):
                     continue
    @@ -572,8 +602,8 @@ class Language(object):
                 ('tokenizer', lambda b: self.tokenizer.from_bytes(b, vocab=False)),
                 ('meta', lambda b: self.meta.update(ujson.loads(b)))
             ))
    -        for i, proc in enumerate(self.pipeline):
    -            if getattr(proc, 'name', None) in disable:
    +        for i, (name, proc) in enumerate(self.pipeline):
    +            if name in disable:
                     continue
                 if not hasattr(proc, 'from_bytes'):
                     continue
    diff --git a/spacy/util.py b/spacy/util.py
    index e1a721a12..9e9c4fa42 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -135,7 +135,11 @@ def load_model_from_path(model_path, meta=False, **overrides):
         if not meta:
             meta = get_model_meta(model_path)
         cls = get_lang_class(meta['lang'])
    -    nlp = cls(pipeline=meta.get('pipeline', True), meta=meta, **overrides)
    +    nlp = cls(meta=meta, **overrides)
    +    for name in meta.get('pipeline', []):
    +        config = meta.get('pipeline_args', {}).get(name, {})
    +        component = nlp.create_pipe(name, config=config)
    +        nlp.add_pipe(component, name=name)
         return nlp.from_disk(model_path)
     
     
    
    From 2586b61b15fa04d91ec4a2919729ab70e9a6b26b Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 00:26:05 +0200
    Subject: [PATCH 245/649] Fix formatting, tidy up and remove unused imports
    
    ---
     spacy/language.py | 23 ++++++++---------------
     1 file changed, 8 insertions(+), 15 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 91644aec0..7a409133a 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -1,12 +1,9 @@
     # coding: utf8
     from __future__ import absolute_import, unicode_literals
     from contextlib import contextmanager
    -import dill
     
    -import numpy
     from thinc.neural import Model
    -from thinc.neural.ops import NumpyOps, CupyOps
    -from thinc.neural.optimizers import Adam, SGD
    +from thinc.neural.optimizers import Adam
     import random
     import ujson
     from collections import OrderedDict
    @@ -17,24 +14,20 @@ from .vocab import Vocab
     from .tagger import Tagger
     from .lemmatizer import Lemmatizer
     from .syntax.parser import get_templates
    -from .syntax import nonproj
     
    -from .pipeline import NeuralDependencyParser, EntityRecognizer
    -from .pipeline import TokenVectorEncoder, NeuralTagger, NeuralEntityRecognizer
    -from .pipeline import NeuralLabeller
    -from .pipeline import SimilarityHook
    -from .pipeline import TextCategorizer
    -from . import about
    +from .pipeline import NeuralDependencyParser, TokenVectorEncoder, NeuralTagger
    +from .pipeline import NeuralEntityRecognizer, SimilarityHook, TextCategorizer
     
     from .compat import json_dumps, izip
    +from .scorer import Scorer
    +from ._ml import link_vectors_to_models
     from .attrs import IS_STOP
     from .lang.punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES
     from .lang.tokenizer_exceptions import TOKEN_MATCH
     from .lang.tag_map import TAG_MAP
     from .lang.lex_attrs import LEX_ATTRS
     from . import util
    -from .scorer import Scorer
    -from ._ml import link_vectors_to_models
    +from . import about
     
     
     class BaseDefaults(object):
    @@ -289,7 +282,7 @@ class Language(object):
             return self.pipeline.pop(self.pipe_names.index(name))
     
         def __call__(self, text, disable=[]):
    -        """'Apply the pipeline to some text. The text can span multiple sentences,
    +        """Apply the pipeline to some text. The text can span multiple sentences,
             and can contain arbtrary whitespace. Alignment into the original string
             is preserved.
     
    @@ -387,7 +380,7 @@ class Language(object):
     
             get_gold_tuples (function): Function returning gold data
             **cfg: Config parameters.
    -        returns: An optimizer
    +        RETURNS: An optimizer
             """
             # Populate vocab
             if get_gold_tuples is not None:
    
    From b39409173e4143b6053892475c1adf6010176060 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 00:29:08 +0200
    Subject: [PATCH 246/649] Add disable option and True/False/None values for
     pipeline
    
    ---
     spacy/util.py | 15 +++++++++++----
     1 file changed, 11 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index 9e9c4fa42..50ebc036b 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -136,10 +136,17 @@ def load_model_from_path(model_path, meta=False, **overrides):
             meta = get_model_meta(model_path)
         cls = get_lang_class(meta['lang'])
         nlp = cls(meta=meta, **overrides)
    -    for name in meta.get('pipeline', []):
    -        config = meta.get('pipeline_args', {}).get(name, {})
    -        component = nlp.create_pipe(name, config=config)
    -        nlp.add_pipe(component, name=name)
    +    pipeline = meta.get('pipeline', [])
    +    disable = overrides.get('disable', [])
    +    if pipeline is True:
    +        pipeline = nlp.Defaults.pipe_names
    +    elif pipeline in (False, None):
    +        pipeline = []
    +    for name in pipeline:
    +        if name not in disable:
    +            config = meta.get('pipeline_args', {}).get(name, {})
    +            component = nlp.create_pipe(name, config=config)
    +            nlp.add_pipe(component, name=name)
         return nlp.from_disk(model_path)
     
     
    
    From 61a503a61195c465328fcf0f283ce64f923b5c55 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 00:38:51 +0200
    Subject: [PATCH 247/649] Fix parser test
    
    ---
     spacy/tests/conftest.py | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py
    index b33a7c008..28b5f4ab9 100644
    --- a/spacy/tests/conftest.py
    +++ b/spacy/tests/conftest.py
    @@ -58,8 +58,9 @@ def en_vocab():
     
     
     @pytest.fixture
    -def en_parser():
    -    return util.get_lang_class('en').Defaults.create_parser()
    +def en_parser(en_vocab):
    +    nlp = util.get_lang_class('en')(en_vocab)
    +    return nlp.create_pipe('parser')
     
     
     @pytest.fixture
    
    From e43530269c77a39d7b9460d5730db5707c439285 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 01:04:50 +0200
    Subject: [PATCH 248/649] Update docstrings
    
    ---
     spacy/language.py | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 7a409133a..a3152aea3 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -195,6 +195,7 @@ class Language(object):
             """Create a pipeline component from a factory.
     
             name (unicode): Factory name to look up in `Language.factories`.
    +        config (dict): Configuration parameters to initialise component.
             RETURNS (callable): Pipeline component.
             """
             if name not in self.factories:
    @@ -274,7 +275,7 @@ class Language(object):
             """Remove a component from the pipeline.
     
             name (unicode): Name of the component to remove.
    -        RETURNS (tuple): A (name, component) tuple of the removed component.
    +        RETURNS (tuple): A `(name, component)` tuple of the removed component.
             """
             if name not in self.pipe_names:
                 msg = "Can't find '{}' in pipeline. Available names: {}"
    
    From 3a65a0c970ec235d7e5b306924a90e8552c6568c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 01:48:23 +0200
    Subject: [PATCH 249/649] Start adding tests for new pipeline management
    
    ---
     spacy/tests/pipeline/__init__.py      |  0
     spacy/tests/pipeline/test_add_pipe.py | 43 +++++++++++++++++++++++++++
     2 files changed, 43 insertions(+)
     create mode 100644 spacy/tests/pipeline/__init__.py
     create mode 100644 spacy/tests/pipeline/test_add_pipe.py
    
    diff --git a/spacy/tests/pipeline/__init__.py b/spacy/tests/pipeline/__init__.py
    new file mode 100644
    index 000000000..e69de29bb
    diff --git a/spacy/tests/pipeline/test_add_pipe.py b/spacy/tests/pipeline/test_add_pipe.py
    new file mode 100644
    index 000000000..13fb4acaf
    --- /dev/null
    +++ b/spacy/tests/pipeline/test_add_pipe.py
    @@ -0,0 +1,43 @@
    +from __future__ import unicode_literals
    +import pytest
    +
    +from ... import language
    +from ...language import Language
    +
    +@pytest.fixture
    +def nlp():
    +    return Language()
    +
    +@pytest.fixture
    +def name():
    +    return 'parser'
    +
    +def new_pipe(doc):
    +    return doc
    +
    +
    +def test_add_pipe_no_name(nlp):
    +    nlp.add_pipe(new_pipe)
    +    assert 'new_pipe' in nlp.pipe_names
    +
    +def test_add_pipe_duplicate_name(nlp):
    +    nlp.add_pipe(new_pipe, name='duplicate_name')
    +    with pytest.raises(ValueError):
    +        nlp.add_pipe(new_pipe, name='duplicate_name')
    +
    +
    +def test_add_pipe_first(nlp, name):
    +    nlp.add_pipe(new_pipe, name=name, first=True)
    +    assert nlp.pipeline[0][0] == name
    +
    +
    +def test_add_pipe_last(nlp, name):
    +    nlp.add_pipe(lambda doc: doc, name='lambda_pipe')
    +    nlp.add_pipe(new_pipe, name=name, last=True)
    +    assert nlp.pipeline[0][0] != name
    +    assert nlp.pipeline[-1][0] == name
    +
    +
    +def test_cant_add_pipe_first_and_last(nlp):
    +    with pytest.raises(ValueError):
    +        nlp.add_pipe(new_pipe, first=True, last=True)
    
    From 0384f0821817014972b5bf8f062d94cd6ea22c2b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 02:00:47 +0200
    Subject: [PATCH 250/649] Trigger nonproj.deprojectivize as a postprocess
    
    ---
     spacy/language.py          |  2 +-
     spacy/pipeline.pyx         | 14 ++++++++++++++
     spacy/syntax/nn_parser.pyx |  8 ++++++++
     3 files changed, 23 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index a3152aea3..d40aee3ca 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -97,7 +97,7 @@ class Language(object):
             'tokenizer': lambda nlp: nlp.Defaults.create_tokenizer(nlp),
             'tensorizer': lambda nlp, **cfg: TokenVectorEncoder(nlp.vocab, **cfg),
             'tagger': lambda nlp, **cfg: NeuralTagger(nlp.vocab, **cfg),
    -        'parser': lambda nlp, **cfg: NeuralDependencyParser(nlp.vocab, **cfg),  # nonproj.deprojectivize,
    +        'parser': lambda nlp, **cfg: NeuralDependencyParser(nlp.vocab, **cfg),
             'ner': lambda nlp, **cfg: NeuralEntityRecognizer(nlp.vocab, **cfg),
             'similarity': lambda nlp, **cfg: SimilarityHook(nlp.vocab, **cfg),
             'textcat': lambda nlp, **cfg: TextCategorizer(nlp.vocab, **cfg)
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 8d935335c..4d9adc609 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -28,6 +28,7 @@ from thinc.neural._classes.difference import Siamese, CauchySimilarity
     from .tokens.doc cimport Doc
     from .syntax.parser cimport Parser as LinearParser
     from .syntax.nn_parser cimport Parser as NeuralParser
    +from .syntax import nonproj
     from .syntax.parser import get_templates as get_feature_templates
     from .syntax.beam_parser cimport BeamParser
     from .syntax.ner cimport BiluoPushDown
    @@ -773,11 +774,19 @@ cdef class DependencyParser(LinearParser):
             if isinstance(label, basestring):
                 label = self.vocab.strings[label]
     
    +    @property
    +    def postprocesses(self):
    +        return [nonproj.deprojectivize]
    +
     
     cdef class NeuralDependencyParser(NeuralParser):
         name = 'parser'
         TransitionSystem = ArcEager
     
    +    @property
    +    def postprocesses(self):
    +        return [nonproj.deprojectivize]
    +
         def init_multitask_objectives(self, gold_tuples, pipeline, **cfg):
             for target in []:
                 labeller = NeuralLabeller(self.vocab, target=target)
    @@ -818,6 +827,11 @@ cdef class BeamDependencyParser(BeamParser):
             if isinstance(label, basestring):
                 label = self.vocab.strings[label]
     
    +    @property
    +    def postprocesses(self):
    +        return [nonproj.deprojectivize]
    +
    +
     
     __all__ = ['Tagger', 'DependencyParser', 'EntityRecognizer', 'BeamDependencyParser',
                'BeamEntityRecognizer', 'TokenVectorEnoder']
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 459c94463..f2c72a639 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -739,6 +739,14 @@ cdef class Parser:
                 for i in range(doc.length):
                     doc.c[i] = state.c._sent[i]
                 self.moves.finalize_doc(doc)
    +            for hook in self.postprocesses:
    +                for doc in docs:
    +                    hook(doc)
    +
    +    @property
    +    def postprocesses(self):
    +        # Available for subclasses, e.g. to deprojectivize
    +        return []
     
         def add_label(self, label):
             for action in self.moves.action_types:
    
    From b38a8f4a943306a4a978e9b40fea9f5f2d7193e7 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 02:06:21 +0200
    Subject: [PATCH 251/649] Fix and update pipe methods tests
    
    ---
     spacy/tests/pipeline/test_add_pipe.py     | 43 ------------
     spacy/tests/pipeline/test_pipe_methods.py | 84 +++++++++++++++++++++++
     2 files changed, 84 insertions(+), 43 deletions(-)
     delete mode 100644 spacy/tests/pipeline/test_add_pipe.py
     create mode 100644 spacy/tests/pipeline/test_pipe_methods.py
    
    diff --git a/spacy/tests/pipeline/test_add_pipe.py b/spacy/tests/pipeline/test_add_pipe.py
    deleted file mode 100644
    index 13fb4acaf..000000000
    --- a/spacy/tests/pipeline/test_add_pipe.py
    +++ /dev/null
    @@ -1,43 +0,0 @@
    -from __future__ import unicode_literals
    -import pytest
    -
    -from ... import language
    -from ...language import Language
    -
    -@pytest.fixture
    -def nlp():
    -    return Language()
    -
    -@pytest.fixture
    -def name():
    -    return 'parser'
    -
    -def new_pipe(doc):
    -    return doc
    -
    -
    -def test_add_pipe_no_name(nlp):
    -    nlp.add_pipe(new_pipe)
    -    assert 'new_pipe' in nlp.pipe_names
    -
    -def test_add_pipe_duplicate_name(nlp):
    -    nlp.add_pipe(new_pipe, name='duplicate_name')
    -    with pytest.raises(ValueError):
    -        nlp.add_pipe(new_pipe, name='duplicate_name')
    -
    -
    -def test_add_pipe_first(nlp, name):
    -    nlp.add_pipe(new_pipe, name=name, first=True)
    -    assert nlp.pipeline[0][0] == name
    -
    -
    -def test_add_pipe_last(nlp, name):
    -    nlp.add_pipe(lambda doc: doc, name='lambda_pipe')
    -    nlp.add_pipe(new_pipe, name=name, last=True)
    -    assert nlp.pipeline[0][0] != name
    -    assert nlp.pipeline[-1][0] == name
    -
    -
    -def test_cant_add_pipe_first_and_last(nlp):
    -    with pytest.raises(ValueError):
    -        nlp.add_pipe(new_pipe, first=True, last=True)
    diff --git a/spacy/tests/pipeline/test_pipe_methods.py b/spacy/tests/pipeline/test_pipe_methods.py
    new file mode 100644
    index 000000000..5ec78aefb
    --- /dev/null
    +++ b/spacy/tests/pipeline/test_pipe_methods.py
    @@ -0,0 +1,84 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +import pytest
    +
    +from ...language import Language
    +
    +
    +@pytest.fixture
    +def nlp():
    +    return Language()
    +
    +
    +def new_pipe(doc):
    +    return doc
    +
    +
    +def test_add_pipe_no_name(nlp):
    +    nlp.add_pipe(new_pipe)
    +    assert 'new_pipe' in nlp.pipe_names
    +
    +
    +def test_add_pipe_duplicate_name(nlp):
    +    nlp.add_pipe(new_pipe, name='duplicate_name')
    +    with pytest.raises(ValueError):
    +        nlp.add_pipe(new_pipe, name='duplicate_name')
    +
    +
    +@pytest.mark.parametrize('name', ['parser'])
    +def test_add_pipe_first(nlp, name):
    +    nlp.add_pipe(new_pipe, name=name, first=True)
    +    assert nlp.pipeline[0][0] == name
    +
    +
    +@pytest.mark.parametrize('name1,name2', [('parser', 'lambda_pipe')])
    +def test_add_pipe_last(nlp, name1, name2):
    +    nlp.add_pipe(lambda doc: doc, name=name2)
    +    nlp.add_pipe(new_pipe, name=name1, last=True)
    +    assert nlp.pipeline[0][0] != name1
    +    assert nlp.pipeline[-1][0] == name1
    +
    +
    +def test_cant_add_pipe_first_and_last(nlp):
    +    with pytest.raises(ValueError):
    +        nlp.add_pipe(new_pipe, first=True, last=True)
    +
    +
    +@pytest.mark.parametrize('name', ['my_component'])
    +def test_get_pipe(nlp, name):
    +    with pytest.raises(KeyError):
    +        nlp.get_pipe(name)
    +    nlp.add_pipe(new_pipe, name=name)
    +    assert nlp.get_pipe(name) == new_pipe
    +
    +
    +@pytest.mark.parametrize('name,replacement', [('my_component', lambda doc: doc)])
    +def test_replace_pipe(nlp, name, replacement):
    +    with pytest.raises(ValueError):
    +        nlp.replace_pipe(name, new_pipe)
    +    nlp.add_pipe(new_pipe, name=name)
    +    nlp.replace_pipe(name, replacement)
    +    assert nlp.get_pipe(name) != new_pipe
    +    assert nlp.get_pipe(name) == replacement
    +
    +
    +@pytest.mark.parametrize('old_name,new_name', [('old_pipe', 'new_pipe')])
    +def test_rename_pipe(nlp, old_name, new_name):
    +    with pytest.raises(ValueError):
    +        nlp.rename_pipe(old_name, new_name)
    +    nlp.add_pipe(new_pipe, name=old_name)
    +    nlp.rename_pipe(old_name, new_name)
    +    assert nlp.pipeline[0][0] == new_name
    +
    +
    +@pytest.mark.parametrize('name', ['my_component'])
    +def test_remove_pipe(nlp, name):
    +    with pytest.raises(ValueError):
    +        nlp.remove_pipe(name)
    +    nlp.add_pipe(new_pipe, name=name)
    +    assert len(nlp.pipeline) == 1
    +    removed_name, removed_component = nlp.remove_pipe(name)
    +    assert not len(nlp.pipeline)
    +    assert removed_name == name
    +    assert removed_component == new_pipe
    
    From 0adadcb3f04e2ecb98b5ca5de1afba2ba7208d23 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 02:15:15 +0200
    Subject: [PATCH 252/649] Fix beam parse model test
    
    ---
     spacy/tests/parser/test_beam_parse.py | 15 ++++++++-------
     1 file changed, 8 insertions(+), 7 deletions(-)
    
    diff --git a/spacy/tests/parser/test_beam_parse.py b/spacy/tests/parser/test_beam_parse.py
    index da5f43d5e..dd77c6805 100644
    --- a/spacy/tests/parser/test_beam_parse.py
    +++ b/spacy/tests/parser/test_beam_parse.py
    @@ -1,10 +1,11 @@
    -import spacy
    +# coding: utf8
    +from __future__ import unicode_literals
    +
     import pytest
     
    -@pytest.mark.models
    -def test_beam_parse():
    -    nlp = spacy.load('en_core_web_sm')
    -    doc = nlp(u'Australia is a country', disable=['ner'])
    -    ents = nlp.entity(doc, beam_width=2)
    -    print(ents)
     
    +@pytest.mark.models('en')
    +def test_beam_parse(EN):
    +    doc = EN(u'Australia is a country', disable=['ner'])
    +    ents = EN.entity(doc, beam_width=2)
    +    print(ents)
    
    From e370332fb1fe8cb179f0fbbbfd79b7251df8781c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 03:00:20 +0200
    Subject: [PATCH 253/649] Update Language API docs
    
    ---
     website/api/language.jade | 229 +++++++++++++++++++++++++++++++++++---
     1 file changed, 216 insertions(+), 13 deletions(-)
    
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 617c81599..89807fabe 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -4,7 +4,14 @@ include ../_includes/_mixins
     
     p
         |  Usually you'll load this once per process as #[code nlp] and pass the
    -    |  instance around your application.
    +    |  instance around your application. The #[code Language] class is created
    +    |  when you call #[+api("spacy#load") #[code spacy.load()]] and contains
    +    |  the shared vocabulary and #[+a("/usage/adding-languages") language data],
    +    |  optional model data loaded from a #[+a("/models") model package] or
    +    |  a path, and a #[+a("/usage/processing-pipelines") processing pipeline]
    +    |  containing components like the tagger or parser that are called on a
    +    |  document in order. You can also add your own processing pipeline
    +    |  components that take a #[code Doc] object, modify it and return it.
     
     +h(2, "init") Language.__init__
         +tag method
    @@ -12,9 +19,9 @@ p
     p Initialise a #[code Language] object.
     
     +aside-code("Example").
    +    from spacy.vocab import Vocab
         from spacy.language import Language
    -    nlp = Language(pipeline=['token_vectors', 'tags',
    -                             'dependencies'])
    +    nlp = Language(Vocab())
     
         from spacy.lang.en import English
         nlp = English()
    @@ -34,14 +41,6 @@ p Initialise a #[code Language] object.
                 |  A function that takes text and returns a #[code Doc] object.
                 |  Usually a #[code Tokenizer].
     
    -    +row
    -        +cell #[code pipeline]
    -        +cell list
    -        +cell
    -            |  A list of annotation processes or IDs of annotation, processes,
    -            |  e.g. a #[code Tagger] object, or #[code 'tagger']. IDs are looked
    -            |  up in #[code Language.Defaults.factories].
    -
         +row
             +cell #[code meta]
             +cell dict
    @@ -54,6 +53,23 @@ p Initialise a #[code Language] object.
             +cell #[code Language]
             +cell The newly constructed object.
     
    ++infobox("Deprecation note", "⚠️")
    +    .o-block
    +        |  To make the processing pipelines and their components more
    +        |  transparent, the #[code pipeline] and #[code disable] arguments on
    +        |  initialisation are now deprecated. Instead, pipeline components can
    +        |  now be added, removed and rearranged using the new #[code Language]
    +        |  methods, for example #[+api("language#add_pipe") #[code add_pipe]] or
    +        |  #[+api("language#create_pipe") #[code create_pipe]]. This is also how
    +        |  #[+api("spacy#load") #[code spacy.load()]] creates the
    +        |  #[code Language] instance it returns.
    +
    +    +code-new.
    +        nlp = English()
    +        parser = nlp.create_pipe('parser')
    +        nlp.add_pipe(parser)
    +    +code-old nlp = English(pipeline=['parser'])
    +
     +h(2, "call") Language.__call__
         +tag method
     
    @@ -235,7 +251,6 @@ p
         |  Can be called before training to pre-process gold data. By default, it
         |  handles nonprojectivity and adds missing tags to the tag map.
     
    -
     +table(["Name", "Type", "Description"])
         +row
             +cell #[code docs_golds]
    @@ -247,6 +262,177 @@ p
             +cell tuple
             +cell Tuples of #[code Doc] and #[code GoldParse] objects.
     
    ++h(2, "create_pipe") Language.create_pipe
    +    +tag method
    +    +tag-new(2)
    +
    +p Create a pipeline component from a factory.
    +
    ++aside-code("Example").
    +    parser = nlp.create_pipe('parser')
    +    nlp.add_pipe(parser)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell
    +            |  Factory name to look up in
    +            |  #[+api("language#class-attributes") #[code Language.factories]].
    +
    +    +row
    +        +cell #[code config]
    +        +cell dict
    +        +cell Configuration parameters to initialise component.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell callable
    +        +cell The pipeline component.
    +
    ++h(2, "add_pipe") Language.add_pipe
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Add a component to the processing pipeline. Valid components are
    +    |  callables that take a #[code Doc] object, modify it and return it. Only
    +    |  one of #[code before], #[code after], #[code first] or #[code last] can
    +    |  be set. Default behaviour is #[code last=True].
    +
    ++aside-code("Example").
    +    def component(doc):
    +        # modify Doc and return it
    +        return doc
    +
    +    nlp.add_pipe(component, before='ner')
    +    nlp.add_pipe(component, name='custom_name', last=True)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code component]
    +        +cell callable
    +        +cell The pipeline component.
    +
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell
    +            |  Name of pipeline component. Overwrites existing
    +            |  #[code component.name] attribute if available. If no #[code name]
    +            |  is set and the component exposes no name attribute,
    +            |  #[code component.__name__] is used. An error is raised if the
    +            |  name already exists in the pipeline.
    +
    +    +row
    +        +cell #[code before]
    +        +cell unicode
    +        +cell Component name to insert component directly before.
    +
    +    +row
    +        +cell #[code after]
    +        +cell unicode
    +        +cell Component name to insert component directly after:
    +
    +    +row
    +        +cell #[code first]
    +        +cell bool
    +        +cell Insert component first / not first in the pipeline.
    +
    +    +row
    +        +cell #[code last]
    +        +cell bool
    +        +cell Insert component last / not last in the pipeline.
    +
    ++h(2, "get_pipe") Language.get_pipe
    +    +tag method
    +    +tag-new(2)
    +
    +p Get a pipeline component for a given component name.
    +
    ++aside-code("Example").
    +    parser = nlp.get_pipe('parser')
    +    custom_component = nlp.get_pipe('custom_component')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the pipeline component to get.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell callable
    +        +cell The pipeline component.
    +
    ++h(2, "replace_pipe") Language.replace_pipe
    +    +tag method
    +    +tag-new(2)
    +
    +p Replace a component in the pipeline.
    +
    ++aside-code("Example").
    +    nlp.replace_pipe('parser', my_custom_parser)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the component to replace.
    +
    +    +row
    +        +cell #[code component]
    +        +cell callable
    +        +cell The pipeline component to inser.
    +
    +
    ++h(2, "rename_pipe") Language.rename_pipe
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Rename a component in the pipeline. Useful to create custom names for
    +    |  pre-defined and pre-loaded components. To change the default name of
    +    |  a component added to the pipeline, you can also use the #[code name]
    +    |  argument on #[+api("language#add_pipe") #[code add_pipe]].
    +
    ++aside-code("Example").
    +    nlp.rename_pipe('parser', 'spacy_parser')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code old_name]
    +        +cell unicode
    +        +cell Name of the component to rename.
    +
    +    +row
    +        +cell #[code new_name]
    +        +cell unicode
    +        +cell New name of the component.
    +
    ++h(2, "remove_pipe") Language.remove_pipe
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Remove a component from the pipeline. Returns the removed component name
    +    |  and component function.
    +
    ++aside-code("Example").
    +    name, component = nlp.remove_pipe('parser')
    +    assert name == 'parser'
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the component to remove.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell tuple
    +        +cell A #[code (name, component)] tuple of the removed component.
    +
     +h(2, "to_disk") Language.to_disk
         +tag method
         +tag-new(2)
    @@ -399,7 +585,15 @@ p Load state from a binary string.
         +row
             +cell #[code pipeline]
             +cell list
    -        +cell Sequence of annotation functions.
    +        +cell
    +            |  List of #[code (name, component)] tuples describing the current
    +            |  processing pipeline, in order.
    +
    +    +row
    +        +cell #[code pipe_names]
    +            +tag-new(2)
    +        +cell list
    +        +cell List of pipeline component names, in order.
     
         +row
             +cell #[code meta]
    @@ -424,3 +618,12 @@ p Load state from a binary string.
             +cell
                 |  Two-letter language ID, i.e.
                 |  #[+a("https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes") ISO code].
    +
    +    +row
    +        +cell #[code factories]
    +            +tag-new(2)
    +        +cell dict
    +        +cell
    +            |  Factories that create pre-defined pipeline components, e.g. the
    +            |  tagger, parser or entity recognizer, keyed by their component
    +            |  name.
    
    From ed8e0085b0b6aae9501bb87be365366b88816be4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 03:06:55 +0200
    Subject: [PATCH 254/649] Update docs for spacy.load()
    
    ---
     website/api/_top-level/_spacy.jade | 14 ++++++++++++++
     1 file changed, 14 insertions(+)
    
    diff --git a/website/api/_top-level/_spacy.jade b/website/api/_top-level/_spacy.jade
    index c14f62f7e..2b523f846 100644
    --- a/website/api/_top-level/_spacy.jade
    +++ b/website/api/_top-level/_spacy.jade
    @@ -43,6 +43,20 @@ p
             +cell #[code Language]
             +cell A #[code Language] object with the loaded model.
     
    +p
    +    |  Essentially, #[code spacy.load()] is a convenience wrapper that reads
    +    |  the language ID and pipeline components from a model's #[code meta.json],
    +    |  initialises the #[code Language] class, loads in the model data and
    +    |  returns it.
    +
    ++code("Abstract example").
    +    cls = util.get_lang_class(lang)         #  get Language class for ID, e.g. 'en'
    +    nlp = cls()                             #  initialise the Language class
    +    for name in pipeline:
    +        component = nlp.create_pipe(name)   #  create each pipeline component
    +        nlp.add_pipe(component)             #  add component to pipeline
    +    nlp.from_disk(model_data_path)          #  load in model data
    +
     +infobox("Deprecation note", "⚠️")
         .o-block
             |  As of spaCy 2.0, the #[code path] keyword argument is deprecated. spaCy
    
    From 3b67eabfea28f817f646a892ed4aec4644a46aee Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 03:36:15 +0200
    Subject: [PATCH 255/649] Allow empty dictionaries to match any token in
     Matcher
    
    Often patterns need to match "any token". A clean way to denote this
    is with the empty dict {}: this sets no constraints on the token,
    so should always match.
    
    The problem was that having attributes length==0 was used as an
    end-of-array signal, so the matcher didn't handle this case correctly.
    
    This patch compiles empty token spec dicts into a constraint
    NULL_ATTR==0. The NULL_ATTR attribute, 0, is always set to 0 on the
    lexeme -- so this always matches.
    ---
     spacy/matcher.pyx           |  8 ++++++--
     spacy/tests/test_matcher.py | 14 ++++++++++++++
     2 files changed, 20 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 3bc6f859c..8893b2fed 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -17,7 +17,7 @@ from libcpp.pair cimport pair
     from murmurhash.mrmr cimport hash64
     from libc.stdint cimport int32_t
     
    -from .attrs cimport ID, ENT_TYPE
    +from .attrs cimport ID, NULL_ATTR, ENT_TYPE
     from . import attrs
     from .tokens.doc cimport get_token_attr
     from .tokens.doc cimport Doc
    @@ -142,6 +142,10 @@ def _convert_strings(token_specs, string_store):
         tokens = []
         op = ONE
         for spec in token_specs:
    +        if not spec:
    +            # Signifier for 'any token'
    +            tokens.append((ONE, [(NULL_ATTR, 0)]))
    +            continue
             token = []
             ops = (ONE,)
             for attr, value in spec.items():
    @@ -295,7 +299,7 @@ cdef class Matcher:
             """Find all token sequences matching the supplied patterns on the `Doc`.
     
             doc (Doc): The document to match over.
    -        RETURNS (list): A list of `(key, label_id, start, end)` tuples,
    +        RETURNS (list): A list of `(key, start, end)` tuples,
                 describing the matches. A match tuple describes a span
                 `doc[start:end]`. The `label_id` and `key` are both integers.
             """
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index 1b9f92519..b36c67d8c 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -98,6 +98,20 @@ def test_matcher_match_multi(matcher):
                                 (doc.vocab.strings['Java'], 5, 6)]
     
     
    +def test_matcher_empty_dict(en_vocab):
    +    '''Test matcher allows empty token specs, meaning match on any token.'''
    +    matcher = Matcher(en_vocab)
    +    abc = ["a", "b", "c"]
    +    doc = get_doc(matcher.vocab, abc)
    +    matcher.add('A.C', None, [{'ORTH': 'a'}, {}, {'ORTH': 'c'}])
    +    matches = matcher(doc)
    +    assert len(matches) == 1
    +    assert matches[0][1:] == (0, 3)
    +    matcher.add('A.', None, [{'ORTH': 'a'}, {}])
    +    matches = matcher(doc)
    +    assert matches[0][1:] == (0, 2)
    + 
    +
     def test_matcher_phrase_matcher(en_vocab):
         words = ["Google", "Now"]
         doc = get_doc(en_vocab, words)
    
    From 58dfde7c0227958972dc37a71d878d605b87ffa1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 04:54:57 +0200
    Subject: [PATCH 256/649] Remove redundante deprecation note
    
    ---
     website/api/language.jade | 17 -----------------
     1 file changed, 17 deletions(-)
    
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 89807fabe..500d6c411 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -53,23 +53,6 @@ p Initialise a #[code Language] object.
             +cell #[code Language]
             +cell The newly constructed object.
     
    -+infobox("Deprecation note", "⚠️")
    -    .o-block
    -        |  To make the processing pipelines and their components more
    -        |  transparent, the #[code pipeline] and #[code disable] arguments on
    -        |  initialisation are now deprecated. Instead, pipeline components can
    -        |  now be added, removed and rearranged using the new #[code Language]
    -        |  methods, for example #[+api("language#add_pipe") #[code add_pipe]] or
    -        |  #[+api("language#create_pipe") #[code create_pipe]]. This is also how
    -        |  #[+api("spacy#load") #[code spacy.load()]] creates the
    -        |  #[code Language] instance it returns.
    -
    -    +code-new.
    -        nlp = English()
    -        parser = nlp.create_pipe('parser')
    -        nlp.add_pipe(parser)
    -    +code-old nlp = English(pipeline=['parser'])
    -
     +h(2, "call") Language.__call__
         +tag method
     
    
    From feaf353051f1163454a05c78b074c0a37b1329af Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 14:05:59 +0200
    Subject: [PATCH 257/649] Update processing pipelines usage docs
    
    ---
     .../_processing-pipelines/_pipelines.jade     | 195 +++++-------------
     1 file changed, 52 insertions(+), 143 deletions(-)
    
    diff --git a/website/usage/_processing-pipelines/_pipelines.jade b/website/usage/_processing-pipelines/_pipelines.jade
    index d09ed4ead..3c1c28af1 100644
    --- a/website/usage/_processing-pipelines/_pipelines.jade
    +++ b/website/usage/_processing-pipelines/_pipelines.jade
    @@ -11,7 +11,7 @@ p
     
     p
         |  When you load a model, spaCy first consults the model's
    -    |  #[+a("/usage/saving-loading#models-generating") meta.json]. The
    +    |  #[+a("/usage/saving-loading#models-generating") #[code meta.json]]. The
         |  meta typically includes the model details, the ID of a language class,
         |  and an optional list of pipeline components. spaCy then does the
         |  following:
    @@ -21,24 +21,26 @@ p
             "name": "example_model",
             "lang": "en"
             "description": "Example model for spaCy",
    -        "pipeline": ["tensorizer", "tagger"]
    +        "pipeline": ["tagger", "parser"]
         }
     
     +list("numbers")
    -    +item
    -        |  Look up #[strong pipeline IDs] in the available
    -        |  #[strong pipeline factories].
    -    +item
    -        |  Initialise the #[strong pipeline components] by calling their
    -        |  factories with the #[code Vocab] as an argument. This gives each
    -        |  factory and component access to the pipeline's shared data, like
    -        |  strings, morphology and annotation scheme.
         +item
             |  Load the #[strong language class and data] for the given ID via
    -        |  #[+api("util.get_lang_class") #[code get_lang_class]].
    +        |  #[+api("util.get_lang_class") #[code get_lang_class]] and initialise
    +        |  it. The #[code Language] class contains the shared vocabulary,
    +        |  tokenization rules and the language-specific annotation scheme.
         +item
    -        |  Pass the path to the #[strong model data] to the #[code Language]
    -        |  class and return it.
    +        |  Iterate over the #[strong pipeline names] and create each component
    +        |  using #[+api("language#create_pipe") #[code create_pipe]], which
    +        |  looks them up in #[code Language.factories].
    +    +item
    +        |  Add each pipeline component to the pipeline in order, using
    +        |  #[+api("language#add_pipe") #[code add_pipe]].
    +    +item
    +        |  Make the #[strong model data] available to the #[code Language] class
    +        |  by calling #[+api("language#from_disk") #[code from_disk]] with the
    +        |  path to the model data ditectory.
     
     p
         |  So when you call this...
    @@ -47,12 +49,12 @@ p
         nlp = spacy.load('en')
     
     p
    -    | ... the model tells spaCy to use the pipeline
    +    | ... the model tells spaCy to use the language #[code "en"] and the pipeline
         |  #[code.u-break ["tensorizer", "tagger", "parser", "ner"]]. spaCy will
    -    |  then look up each string in its internal factories registry and
    -    |  initialise the individual components. It'll then load
    -    |  #[code spacy.lang.en.English], pass it the path to the model's data
    -    |  directory, and return it for you to use as the #[code nlp] object.
    +    |  then initialise #[code spacy.lang.en.English], and create each pipeline
    +    |  component and add it to the processing pipeline. It'll then load in the
    +    |  model's data from its data ditectory and return the modified
    +    |  #[code Language] class for you to use as the #[code nlp] object.
     
     p
         |  Fundamentally, a #[+a("/models") spaCy model] consists of three
    @@ -73,9 +75,12 @@ p
         pipeline = ['tensorizer', 'tagger', 'parser', 'ner']
         data_path = 'path/to/en_core_web_sm/en_core_web_sm-2.0.0'
     
    -    cls = spacy.util.get_lang_class(lang)  # 1. get Language instance, e.g. English()
    -    nlp = cls(pipeline=pipeline)           # 2. initialise it with the pipeline
    -    nlp.from_disk(model_data_path)         # 3. load in the binary data
    +    cls = spacy.util.get_lang_class(lang)   # 1. get Language instance, e.g. English()
    +    nlp = cls()                             # 2. initialise it
    +    for name in pipeline:
    +        component = nlp.create_pipe(name)   # 3. create the pipeline components
    +        nlp.add_pipe(component)             # 4. add the component to the pipeline
    +    nlp.from_disk(model_data_path)          # 5. load in the binary data
     
     p
         |  When you call #[code nlp] on a text, spaCy will #[strong tokenize] it and
    @@ -87,124 +92,23 @@ p
         |  document, which is then processed by the component next in the pipeline.
     
     +code("The pipeline under the hood").
    -    doc = nlp.make_doc(u'This is a sentence')
    -    for proc in nlp.pipeline:
    -        doc = proc(doc)
    -
    -+h(3, "creating") Creating pipeline components and factories
    +    doc = nlp.make_doc(u'This is a sentence')   # create a Doc from raw text
    +    for name, proc in nlp.pipeline:             # iterate over components in order
    +        doc = proc(doc)                         # apply each component
     
     p
    -    |  spaCy lets you customise the pipeline with your own components. Components
    -    |  are functions that receive a #[code Doc] object, modify and return it.
    -    |  If your component is stateful, you'll want to create a new one for each
    -    |  pipeline. You can do that by defining and registering a factory which
    -    |  receives the shared #[code Vocab] object and returns a component.
    -
    -+h(4, "creating-component") Creating a  component
    -
    -p
    -    |  A component receives a #[code Doc] object and
    -    |  #[strong performs the actual processing] – for example, using the current
    -    |  weights to make a prediction and set some annotation on the document. By
    -    |  adding a component to the pipeline, you'll get access to the #[code Doc]
    -    |  at any point #[strong during] processing – instead of only being able to
    -    |  modify it afterwards.
    -
    -+aside-code("Example").
    -    def my_component(doc):
    -        # do something to the doc here
    -        return doc
    -
    -+table(["Argument", "Type", "Description"])
    -    +row
    -        +cell #[code doc]
    -        +cell #[code Doc]
    -        +cell The #[code Doc] object processed by the previous component.
    -
    -    +row("foot")
    -        +cell returns
    -        +cell #[code Doc]
    -        +cell The #[code Doc] object processed by this pipeline component.
    -
    -p
    -    |  When creating a new #[code Language] class, you can pass it a list of
    -    |  pipeline component functions to execute in that order. You can also
    -    |  add it to an existing pipeline by modifying #[code nlp.pipeline] – just
    -    |  be careful not to overwrite a pipeline or its components by accident!
    +    |  The current processing pipeline is available as #[code nlp.pipeline],
    +    |  which returns a list of #[code (name, component)] tuples, or
    +    |  #[code nlp.pipe_names], which only returns a list of human-readable
    +    |  component names.
     
     +code.
    -    # Create a new Language object with a pipeline
    -    from spacy.language import Language
    -    nlp = Language(pipeline=[my_component])
    +    nlp.pipeline
    +    # [('tagger', <spacy.pipeline.Tagger>), ('parser', <spacy.pipeline.DependencyParser>), ('ner', <spacy.pipeline.EntityRecognizer>)]
    +    nlp.pipe_names
    +    # ['tagger', 'parser', 'ner']
     
    -    # Modify an existing pipeline
    -    nlp = spacy.load('en')
    -    nlp.pipeline.append(my_component)
    -
    -+h(4, "creating-factory") Creating a factory
    -
    -p
    -    |  A factory is a #[strong function that returns a pipeline component].
    -    |  It's called with the #[code Vocab] object, to give it access to the
    -    |  shared data between components – for example, the strings, morphology,
    -    |  vectors or annotation scheme. Factories are useful for creating
    -    |  #[strong stateful components], especially ones which
    -    |  #[strong depend on shared data].
    -
    -+aside-code("Example").
    -    def my_factory(vocab):
    -        # load some state
    -        def my_component(doc):
    -            # process the doc
    -            return doc
    -        return my_component
    -
    -+table(["Argument", "Type", "Description"])
    -    +row
    -        +cell #[code vocab]
    -        +cell #[code Vocab]
    -        +cell
    -            |  Shared data between components, including strings, morphology,
    -            |  vectors etc.
    -
    -    +row("foot")
    -        +cell returns
    -        +cell callable
    -        +cell The pipeline component.
    -
    -p
    -    |  By creating a factory, you're essentially telling spaCy how to get the
    -    |  pipeline component #[strong once the vocab is available]. Factories need to
    -    |  be registered via #[+api("spacy#set_factory") #[code set_factory()]] and
    -    |  by assigning them a unique ID. This ID can be added to the pipeline as a
    -    |  string. When creating a pipeline, you're free to mix strings and
    -    |  callable components:
    -
    -+code.
    -    spacy.set_factory('my_factory', my_factory)
    -    nlp = Language(pipeline=['my_factory', my_other_component])
    -
    -p
    -    |  If spaCy comes across a string in the pipeline, it will try to resolve it
    -    |  by looking it up in the available factories. The factory will then be
    -    |  initialised with the #[code Vocab]. Providing factory names instead of
    -    |  callables also makes it easy to specify them in the model's
    -    |  #[+a("/usage/saving-loading#models-generating") meta.json]. If you're
    -    |  training your own model and want to use one of spaCy's default components,
    -    |  you won't have to worry about finding and implementing it either – to use
    -    |  the default tagger, simply add #[code "tagger"] to the pipeline, and
    -    |  #[strong spaCy will know what to do].
    -
    -+infobox("Important note")
    -    |  Because factories are #[strong resolved on initialisation] of the
    -    |  #[code Language] class, it's #[strong not possible] to add them to the
    -    |  pipeline afterwards, e.g. by modifying #[code nlp.pipeline]. This only
    -    |  works with individual component functions. To use factories, you need to
    -    |  create a new #[code Language] object, or generate a
    -    |  #[+a("/usage/training#models-generating") model package] with
    -    |  a custom pipeline.
    -
    -+h(3, "disabling") Disabling pipeline components
    ++h(3, "disabling") Disabling and modifying pipeline components
     
     p
         |  If you don't need a particular component of the pipeline – for
    @@ -217,16 +121,19 @@ p
     +code.
         nlp = spacy.load('en', disable['parser', 'tagger'])
         nlp = English().from_disk('/model', disable=['tensorizer', 'ner'])
    -    doc = nlp(u"I don't want parsed", disable=['parser'])
     
     p
    -    |  Note that you can't write directly to #[code nlp.pipeline], as this list
    -    |  holds the #[em actual components], not the IDs. However, if you know the
    -    |  order of the components, you can still slice the list:
    +    |  You can also use the #[+api("language#remove_pipe") #[code remove_pipe]]
    +    |  method to remove pipeline components from an existing pipeline, the
    +    |  #[+api("language#rename_pipe") #[code rename_pipe]] method to rename them,
    +    |  or the #[+api("language#replace_pipe") #[code replace_pipe]] method
    +    |  to replace them with a custom component entirely (more details on this
    +    |  in the section on #[+a("#custom-components") custom components].
     
     +code.
    -    nlp = spacy.load('en')
    -    nlp.pipeline = nlp.pipeline[:2] # only use the first two components
    +    nlp.remove_pipe('parser')
    +    nlp.rename_pipe('ner', 'entityrecognizer')
    +    nlp.replace_pipe('tagger', my_custom_tagger)
     
     +infobox("Important note: disabling pipeline components")
         .o-block
    @@ -234,12 +141,14 @@ p
             |  processing pipeline components, the #[code parser], #[code tagger]
             |  and #[code entity] keyword arguments have been replaced with
             |  #[code disable], which takes a list of pipeline component names.
    -        |  This lets you disable both default and custom components when loading
    +        |  This lets you disable pre-defined components when loading
             |  a model, or initialising a Language class via
             |  #[+api("language-from_disk") #[code from_disk]].
    +
         +code-new.
    -        nlp = spacy.load('en', disable=['tagger', 'ner'])
    -        doc = nlp(u"I don't want parsed", disable=['parser'])
    +        nlp = spacy.load('en', disable=['ner'])
    +        nlp.remove_pipe('parser')
    +        doc = nlp(u"I don't want parsed")
         +code-old.
             nlp = spacy.load('en', tagger=False, entity=False)
             doc = nlp(u"I don't want parsed", parse=False)
    
    From e22067e3b538e70e55cd20a6ffd4d0a2e64a2f26 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 07:10:10 -0500
    Subject: [PATCH 258/649] Document new hyper-parameters
    
    ---
     website/api/_top-level/_cli.jade | 10 ++++++++++
     1 file changed, 10 insertions(+)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index f59d5afdd..5c91b48e8 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -314,6 +314,16 @@ p
             +cell Size of the parser's and NER's hidden layers.
             +cell #[code 128]
     
    +    +row
    +        +cell #[code history_feats]
    +        +cell Number of previous action ID features for parser and NER
    +        +cell #[code 128]
    +
    +    +row
    +        +cell #[code history_width]
    +        +cell Number of embedding dimensions for each action ID
    +        +cell #[code 128]
    +
         +row
             +cell #[code learn_rate]
             +cell Learning rate.
    
    From 3d22ccf4954fabc5bbbdf766b6a3ad3a8609692d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 07:16:41 -0500
    Subject: [PATCH 259/649] Update default hyper-parameters
    
    ---
     spacy/syntax/nn_parser.pyx | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index b5f218d75..fdcf1d2d1 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,13 +239,13 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 2))
             token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
    -        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200))
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 3))
    +        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 128))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 1))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
    -        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
    -        hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
    +        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 4))
    +        hist_width = util.env_opt('history_width', cfg.get('hist_width', 16))
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    
    From 37f755897f3bb95355a04ccaf1a4af8e07b64794 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:04:09 +0200
    Subject: [PATCH 260/649] Update rule-based matching docs
    
    ---
     .../_rule-based-matching.jade                 | 162 ++++++++++++++----
     1 file changed, 125 insertions(+), 37 deletions(-)
    
    diff --git a/website/usage/_linguistic-features/_rule-based-matching.jade b/website/usage/_linguistic-features/_rule-based-matching.jade
    index 88a713ffc..c006f43c9 100644
    --- a/website/usage/_linguistic-features/_rule-based-matching.jade
    +++ b/website/usage/_linguistic-features/_rule-based-matching.jade
    @@ -75,6 +75,131 @@ p
         |  other pattern types. You shouldn't have to create different matchers for
         |  each of those processes.
     
    ++h(4, "adding-patterns-attributes") Available token attributes
    +
    +p
    +    |  The available token pattern keys are uppercase versions of the
    +    |  #[+api("token#attributes") #[code Token] attributes]. The most relevant
    +    |  ones for rule-based matching are:
    +
    ++table(["Attribute", "Description"])
    +    +row
    +        +cell #[code ORTH]
    +        +cell The exact verbatim text of a token.
    +
    +    +row
    +        +cell.u-nowrap #[code LOWER], #[code UPPER]
    +        +cell The lowercase, uppercase form of the token text.
    +
    +    +row
    +        +cell.u-nowrap #[code IS_ALPHA], #[code IS_ASCII], #[code IS_DIGIT]
    +        +cell
    +            |  Token text consists of alphanumeric characters, ASCII characters,
    +            |  digits.
    +
    +    +row
    +        +cell.u-nowrap #[code IS_LOWER], #[code IS_UPPER], #[code IS_TITLE]
    +        +cell Token text is in lowercase, uppercase, titlecase.
    +
    +    +row
    +        +cell.u-nowrap #[code IS_PUNCT], #[code IS_SPACE], #[code IS_STOP]
    +        +cell Token is punctuation, whitespace, stop word.
    +
    +    +row
    +        +cell.u-nowrap #[code LIKE_NUM], #[code LIKE_URL], #[code LIKE_EMAIL]
    +        +cell Token text resembles a number, URL, email.
    +
    +    +row
    +        +cell.u-nowrap
    +            |  #[code POS], #[code TAG], #[code DEP], #[code LEMMA],
    +            |  #[code SHAPE]
    +        +cell
    +            |  The token's simple and extended part-of-speech tag, dependency
    +            |  label, lemma, shape.
    +
    ++h(4, "adding-patterns-wildcard") Using wildcard token patterns
    +    +tag-new(2)
    +
    +p
    +    |  While the token attributes offer many options to write highly specific
    +    |  patterns, you can also use an empty dictionary, #[code {}] as a wildcard
    +    |  representing #[strong any token]. This is useful if you know the context
    +    |  of what you're trying to match, but very little about the specific token
    +    |  and its characters. For example, let's say you're trying to extract
    +    |  people's user names from your data. All you know is that they are listed
    +    |  as "User name: {username}". The name itself may contain any character,
    +    |  but no whitespace – so you'll know it will be handled as one token.
    +
    ++code.
    +    [{'ORTH': 'User'}, {'ORTH': 'name'}, {'ORTH': ':'}, {}]
    +
    ++h(4, "quantifiers") Using operators and quantifiers
    +
    +p
    +    |  The matcher also lets you use quantifiers, specified as the #[code 'OP']
    +    |  key. Quantifiers let you define sequences of tokens to be mached, e.g.
    +    |  one or more punctuation marks, or specify optional tokens. Note that there
    +    |  are no nested or scoped quantifiers – instead, you can build those
    +    |  behaviours with #[code on_match] callbacks.
    +
    ++aside("Problems with quantifiers")
    +    |  Using quantifiers may lead to unexpected results when matching
    +    |  variable-length patterns, for example if the next token would also be
    +    |  matched by the previous token. This problem should be resolved in a future
    +    |  release. For more information, see
    +    |  #[+a(gh("spaCy") + "/issues/864") this issue].
    +
    ++table([ "OP", "Description", "Example"])
    +    +row
    +        +cell #[code !]
    +        +cell match exactly 0 times
    +        +cell negation
    +
    +    +row
    +        +cell #[code *]
    +        +cell match 0 or more times
    +        +cell optional, variable number
    +
    +    +row
    +        +cell #[code +]
    +        +cell match 1 or more times
    +        +cell mandatory, variable number
    +
    +    +row
    +        +cell #[code ?]
    +        +cell match 0 or 1 times
    +        +cell optional, max one
    +
    ++h(3, "adding-phrase-patterns") Adding phrase patterns
    +
    +p
    +    |  If you need to match large terminology lists, you can also use the
    +    |  #[+api("phrasematcher") #[code PhraseMatcher]] and create
    +    |  #[+api("doc") #[code Doc]] objects instead of token patterns, which is
    +    |  much more efficient overall. The #[code Doc] patterns can contain single
    +    |  or multiple tokens.
    +
    ++code.
    +    import spacy
    +    from spacy.matcher import PhraseMatcher
    +
    +    nlp = spacy.load('en')
    +    matcher = PhraseMatcher(nlp.vocab)
    +    terminology_list = ['Barack Obama', 'Angela Merkel', 'Washington, D.C.']
    +    patterns = [nlp(text) for text in terminology_list]
    +    matcher.add('TerminologyList', None, *patterns)
    +
    +    doc = nlp(u"German Chancellor Angela Merkel and US President Barack Obama "
    +              u"converse in the Oval Office inside the White House in Washington, D.C.")
    +    matches = matcher(doc)
    +
    +p
    +    |  Since spaCy is used for processing both the patterns and the text to be
    +    |  matched, you won't have to worry about specific tokenization – for
    +    |  example, you can simply pass in #[code nlp(u"Washington, D.C.")] and
    +    |  won't have to write a complex token pattern covering the exact
    +    |  tokenization of the term.
    +
     +h(3, "on_match") Adding #[code on_match] rules
     
     p
    @@ -183,43 +308,6 @@ p
                 |  A list of #[code (match_id, start, end)] tuples, describing the
                 |  matches. A match tuple describes a span #[code doc[start:end]].
     
    -+h(3, "quantifiers") Using operators and quantifiers
    -
    -p
    -    |  The matcher also lets you use quantifiers, specified as the #[code 'OP']
    -    |  key. Quantifiers let you define sequences of tokens to be mached, e.g.
    -    |  one or more punctuation marks, or specify optional tokens. Note that there
    -    |  are no nested or scoped quantifiers – instead, you can build those
    -    |  behaviours with #[code on_match] callbacks.
    -
    -+aside("Problems with quantifiers")
    -    |  Using quantifiers may lead to unexpected results when matching
    -    |  variable-length patterns, for example if the next token would also be
    -    |  matched by the previous token. This problem should be resolved in a future
    -    |  release. For more information, see
    -    |  #[+a(gh("spaCy") + "/issues/864") this issue].
    -
    -+table([ "OP", "Description", "Example"])
    -    +row
    -        +cell #[code !]
    -        +cell match exactly 0 times
    -        +cell negation
    -
    -    +row
    -        +cell #[code *]
    -        +cell match 0 or more times
    -        +cell optional, variable number
    -
    -    +row
    -        +cell #[code +]
    -        +cell match 1 or more times
    -        +cell mandatory, variable number
    -
    -    +row
    -        +cell #[code ?]
    -        +cell match 0 or 1 times
    -        +cell optional, max one
    -
     +h(3, "example1") Example: Using linguistic annotations
     
     p
    
    From c970b4f226c76bbeea43d5c510577638bb523ddc Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:04:16 +0200
    Subject: [PATCH 261/649] Add missing token attribute
    
    ---
     website/api/token.jade | 7 +++++++
     1 file changed, 7 insertions(+)
    
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 4eebc262c..814a13310 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -464,6 +464,13 @@ p The L2 norm of the token's vector representation.
                 |  Is the token in lowercase? Equivalent to
                 |  #[code token.text.islower()].
     
    +    +row
    +        +cell #[code is_upper]
    +        +cell bool
    +        +cell
    +            |  Is the token in uppercase? Equivalent to
    +            |  #[code token.text.isupper()].
    +
         +row
             +cell #[code is_title]
             +cell bool
    
    From d70cf1915889bbc4463d353427fb1655a2e922a1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:06:38 +0200
    Subject: [PATCH 262/649] Fix formatting
    
    ---
     website/api/_top-level/_cli.jade | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index 5c91b48e8..3a4b4702a 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -316,12 +316,12 @@ p
     
         +row
             +cell #[code history_feats]
    -        +cell Number of previous action ID features for parser and NER
    +        +cell Number of previous action ID features for parser and NER.
             +cell #[code 128]
     
         +row
             +cell #[code history_width]
    -        +cell Number of embedding dimensions for each action ID
    +        +cell Number of embedding dimensions for each action ID.
             +cell #[code 128]
     
         +row
    
    From 743d1df1fe6474b6342ff7cfe73a988d89e679c6 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:27:28 +0200
    Subject: [PATCH 263/649] Update pipelines docs and add user hooks to custom
     components
    
    ---
     website/usage/_data.json                      |   7 +-
     .../_custom-components.jade                   | 151 ++++++++++++++++++
     .../_processing-pipelines/_user-hooks.jade    |  61 -------
     website/usage/processing-pipelines.jade       |  10 +-
     4 files changed, 157 insertions(+), 72 deletions(-)
     create mode 100644 website/usage/_processing-pipelines/_custom-components.jade
     delete mode 100644 website/usage/_processing-pipelines/_user-hooks.jade
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index b34304ed6..f77f7929c 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -103,11 +103,10 @@
             "title": "Language Processing Pipelines",
             "next": "vectors-similarity",
             "menu": {
    -            "How pipelines work": "pipelines",
    -            "Examples": "examples",
    +            "How Pipelines Work": "pipelines",
    +            "Custom Components": "custom-components",
                 "Multi-threading": "multithreading",
    -            "User Hooks": "user-hooks",
    -            "Serialization": "serialization"
    +            "Serialization": "serialization",
             }
         },
     
    diff --git a/website/usage/_processing-pipelines/_custom-components.jade b/website/usage/_processing-pipelines/_custom-components.jade
    new file mode 100644
    index 000000000..13f0cb85c
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_custom-components.jade
    @@ -0,0 +1,151 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > CUSTOM COMPONENTS
    +
    +p
    +    |  A component receives a #[code Doc] object and
    +    |  #[strong performs the actual processing] – for example, using the current
    +    |  weights to make a prediction and set some annotation on the document. By
    +    |  adding a component to the pipeline, you'll get access to the #[code Doc]
    +    |  at any point #[strong during] processing – instead of only being able to
    +    |  modify it afterwards.
    +
    ++aside-code("Example").
    +    def my_component(doc):
    +        # do something to the doc here
    +        return doc
    +
    ++table(["Argument", "Type", "Description"])
    +    +row
    +        +cell #[code doc]
    +        +cell #[code Doc]
    +        +cell The #[code Doc] object processed by the previous component.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Doc]
    +        +cell The #[code Doc] object processed by this pipeline component.
    +
    +p
    +    |  Custom components can be added to the pipeline using the
    +    |  #[+api("language#add_pipe") #[code add_pipe]] method. Optionally, you
    +    |  can either specify a component to add it before or after, tell spaCy
    +    |  to add it first or last in the pipeline, or define a custom name.
    +    |  If no name is set and no #[code name] attribute is present on your
    +    |  component, the function name, e.g. #[code component.__name__] is used.
    +
    ++code("Adding pipeline components").
    +    def my_component(doc):
    +        print("After tokenization, this doc has %s tokens." % len(doc))
    +        if len(doc) < 10:
    +            print("This is a pretty short document.")
    +        return doc
    +
    +    nlp = spacy.load('en')
    +    nlp.pipeline.add_pipe(my_component, name='print_info', first=True)
    +    print(nlp.pipe_names) # ['print_info', 'tagger', 'parser', 'ner']
    +    doc = nlp(u"This is a sentence.")
    +
    +p
    +    |  Of course, you can also wrap your component as a class to allow
    +    |  initialising it with custom settings and hold state within the component.
    +    |  This is useful for #[strong stateful components], especially ones which
    +    |  #[strong depend on shared data].
    +
    ++code.
    +    class MyComponent(object):
    +        name = 'print_info'
    +
    +        def __init__(vocab, short_limit=10):
    +            self.vocab = nlp.vocab
    +            self.short_limit = short_limit
    +
    +        def __call__(doc):
    +            if len(doc) < self.short_limit:
    +                print("This is a pretty short document.")
    +            return doc
    +
    +    my_component = MyComponent(nlp.vocab, short_limit=25)
    +    nlp.add_pipe(my_component, first=True)
    +
    ++h(3, "custom-components-attributes")
    +    |  Setting attributes on the #[code Doc], #[code Span] and #[code Token]
    +
    ++aside("Why ._?")
    +    |  Writing to a #[code ._] attribute instead of to the #[code Doc] directly
    +    |  keeps a clearer separation and makes it easier to ensure backwards
    +    |  compatibility. For example, if you've implemented your own #[code .coref]
    +    |  property and spaCy claims it one day, it'll break your code. Similarly,
    +    |  just by looking at the code, you'll immediately know what's built-in and
    +    |  what's custom – for example, #[code doc.sentiment] is spaCy, while
    +    |  #[code doc._.sent_score] isn't.
    +
    ++under-construction
    +
    ++h(3, "custom-components-user-hooks") Other user hooks
    +
    +p
    +    |  While it's generally recommended to use the #[code Doc._], #[code Span._]
    +    |  and #[code Token._] proxies to add your own custom attributes, spaCy
    +    |  offers a few exceptions to allow #[strong customising the built-in methods]
    +    |  like #[+api("doc#similarity") #[code Doc.similarity]] or
    +    |  #[+api("doc#vector") #[code Doc.vector]]. with your own hooks, which can
    +    |  rely on statistical models you train yourself. For instance, you can
    +    |  provide your own on-the-fly sentence segmentation algorithm or document
    +    |  similarity method.
    +
    +p
    +    |  Hooks let you customize some of the behaviours of the #[code Doc],
    +    |  #[code Span] or #[code Token] objects by adding a component to the
    +    |  pipeline. For instance, to customize the
    +    |  #[+api("doc#similarity") #[code Doc.similarity]] method, you can add a
    +    |  component that sets a custom function to
    +    |  #[code doc.user_hooks['similarity']]. The built-in #[code Doc.similarity]
    +    |  method will check the #[code user_hooks] dict, and delegate to your
    +    |  function if you've set one. Similar results can be achieved by setting
    +    |  functions to #[code Doc.user_span_hooks] and #[code Doc.user_token_hooks].
    +
    ++aside("Implementation note")
    +    |  The hooks live on the #[code Doc] object because the #[code Span] and
    +    |  #[code Token] objects are created lazily, and don't own any data. They
    +    |  just proxy to their parent #[code Doc]. This turns out to be convenient
    +    |  here — we only have to worry about installing hooks in one place.
    +
    ++table(["Name", "Customises"])
    +    +row
    +        +cell #[code user_hooks]
    +        +cell
    +            +api("doc#vector") #[code Doc.vector]
    +            +api("doc#has_vector") #[code Doc.has_vector]
    +            +api("doc#vector_norm") #[code Doc.vector_norm]
    +            +api("doc#sents") #[code Doc.sents]
    +
    +    +row
    +        +cell #[code user_token_hooks]
    +        +cell
    +            +api("token#similarity") #[code Token.similarity]
    +            +api("token#vector") #[code Token.vector]
    +            +api("token#has_vector") #[code Token.has_vector]
    +            +api("token#vector_norm") #[code Token.vector_norm]
    +            +api("token#conjuncts") #[code Token.conjuncts]
    +
    +    +row
    +        +cell #[code user_span_hooks]
    +        +cell
    +            +api("span#similarity") #[code Span.similarity]
    +            +api("span#vector") #[code Span.vector]
    +            +api("span#has_vector") #[code Span.has_vector]
    +            +api("span#vector_norm") #[code Span.vector_norm]
    +            +api("span#root") #[code Span.root]
    +
    ++code("Add custom similarity hooks").
    +    class SimilarityModel(object):
    +        def __init__(self, model):
    +            self._model = model
    +
    +        def __call__(self, doc):
    +            doc.user_hooks['similarity'] = self.similarity
    +            doc.user_span_hooks['similarity'] = self.similarity
    +            doc.user_token_hooks['similarity'] = self.similarity
    +
    +        def similarity(self, obj1, obj2):
    +            y = self._model([obj1.vector, obj2.vector])
    +            return float(y[0])
    diff --git a/website/usage/_processing-pipelines/_user-hooks.jade b/website/usage/_processing-pipelines/_user-hooks.jade
    deleted file mode 100644
    index e7dce53fe..000000000
    --- a/website/usage/_processing-pipelines/_user-hooks.jade
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -//- 💫 DOCS > USAGE > PROCESSING PIPELINES > ATTRIBUTE HOOKS
    -
    -p
    -    |  Hooks let you customize some of the behaviours of the #[code Doc],
    -    |  #[code Span] or #[code Token] objects by adding a component to the
    -    |  pipeline. For instance, to customize the
    -    |  #[+api("doc#similarity") #[code Doc.similarity]] method, you can add a
    -    |  component that sets a custom function to
    -    |  #[code doc.user_hooks['similarity']]. The built-in #[code Doc.similarity]
    -    |  method will check the #[code user_hooks] dict, and delegate to your
    -    |  function if you've set one. Similar results can be achieved by setting
    -    |  functions to #[code Doc.user_span_hooks] and #[code Doc.user_token_hooks].
    -
    -+code("Polymorphic similarity example").
    -    span.similarity(doc)
    -    token.similarity(span)
    -    doc1.similarity(doc2)
    -
    -p
    -    |  By default, this just averages the vectors for each document, and
    -    |  computes their cosine. Obviously, spaCy should make it easy for you to
    -    |  install your own similarity model. This introduces a tricky design
    -    |  challenge. The current solution is to add three more dicts to the
    -    |  #[code Doc] object:
    -
    -+aside("Implementation note")
    -    |  The hooks live on the #[code Doc] object because the #[code Span] and
    -    |  #[code Token] objects are created lazily, and don't own any data. They
    -    |  just proxy to their parent #[code Doc]. This turns out to be convenient
    -    |  here — we only have to worry about installing hooks in one place.
    -
    -+table(["Name", "Description"])
    -    +row
    -        +cell #[code user_hooks]
    -        +cell Customise behaviour of #[code doc.vector], #[code doc.has_vector], #[code doc.vector_norm] or #[code doc.sents]
    -
    -    +row
    -        +cell #[code user_token_hooks]
    -        +cell Customise behaviour of #[code token.similarity], #[code token.vector], #[code token.has_vector], #[code token.vector_norm] or #[code token.conjuncts]
    -
    -    +row
    -        +cell #[code user_span_hooks]
    -        +cell Customise behaviour of #[code span.similarity], #[code span.vector], #[code span.has_vector], #[code span.vector_norm] or #[code span.root]
    -
    -p
    -    |  To sum up, here's an example of hooking in custom #[code .similarity()]
    -    |  methods:
    -
    -+code("Add custom similarity hooks").
    -    class SimilarityModel(object):
    -        def __init__(self, model):
    -            self._model = model
    -
    -        def __call__(self, doc):
    -            doc.user_hooks['similarity'] = self.similarity
    -            doc.user_span_hooks['similarity'] = self.similarity
    -            doc.user_token_hooks['similarity'] = self.similarity
    -
    -        def similarity(self, obj1, obj2):
    -            y = self._model([obj1.vector, obj2.vector])
    -            return float(y[0])
    diff --git a/website/usage/processing-pipelines.jade b/website/usage/processing-pipelines.jade
    index 0bb96780e..0d0579883 100644
    --- a/website/usage/processing-pipelines.jade
    +++ b/website/usage/processing-pipelines.jade
    @@ -8,18 +8,14 @@ include _spacy-101/_pipelines
         +h(2, "pipelines") How pipelines work
         include _processing-pipelines/_pipelines
     
    -+section("examples")
    -    +h(2, "examples") Examples
    -    include _processing-pipelines/_examples
    ++section("custom-components")
    +    +h(2, "custom-components") Creating custom pipeline components
    +    include _processing-pipelines/_custom-components
     
     +section("multithreading")
         +h(2, "multithreading") Multi-threading
         include _processing-pipelines/_multithreading
     
    -+section("user-hooks")
    -    +h(2, "user-hooks") User hooks
    -    include _processing-pipelines/_user-hooks
    -
     +section("serialization")
         +h(2, "serialization") Serialization
         include _processing-pipelines/_serialization
    
    From ca6769fd4855e55365b70c3b6cbd32387aec6548 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:28:01 +0200
    Subject: [PATCH 264/649] Update spacy functions and remove removed set_factory
    
    ---
     website/api/_top-level/_spacy.jade | 38 ++----------------------------
     1 file changed, 2 insertions(+), 36 deletions(-)
    
    diff --git a/website/api/_top-level/_spacy.jade b/website/api/_top-level/_spacy.jade
    index 2b523f846..81ec744ad 100644
    --- a/website/api/_top-level/_spacy.jade
    +++ b/website/api/_top-level/_spacy.jade
    @@ -50,8 +50,8 @@ p
         |  returns it.
     
     +code("Abstract example").
    -    cls = util.get_lang_class(lang)         #  get Language class for ID, e.g. 'en'
    -    nlp = cls()                             #  initialise the Language class
    +    cls = util.get_lang_class(lang)         #  get language for ID, e.g. 'en'
    +    nlp = cls()                             #  initialise the language
         for name in pipeline:
             component = nlp.create_pipe(name)   #  create each pipeline component
             nlp.add_pipe(component)             #  add component to pipeline
    @@ -155,37 +155,3 @@ p
             +cell returns
             +cell unicode
             +cell The explanation, or #[code None] if not found in the glossary.
    -
    -+h(3, "spacy.set_factory") spacy.set_factory
    -    +tag function
    -    +tag-new(2)
    -
    -p
    -    |  Set a factory that returns a custom
    -    |  #[+a("/usage/processing-pipelines") processing pipeline]
    -    |  component. Factories are useful for creating stateful components, especially ones which depend on shared data.
    -
    -+aside-code("Example").
    -    def my_factory(vocab):
    -        def my_component(doc):
    -            return doc
    -        return my_component
    -
    -    spacy.set_factory('my_factory', my_factory)
    -    nlp = Language(pipeline=['my_factory'])
    -
    -+table(["Name", "Type", "Description"])
    -    +row
    -        +cell #[code factory_id]
    -        +cell unicode
    -        +cell
    -            |  Unique name of factory. If added to a new pipeline, spaCy will
    -            |  look up the factory for this ID and use it to create the
    -            |  component.
    -
    -    +row
    -        +cell #[code factory]
    -        +cell callable
    -        +cell
    -            |  Callable that takes a #[code Vocab] object and returns a pipeline
    -            |  component.
    
    From 1289129fd92da28a0d3f55acf65ec6287eea7086 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 18:00:14 +0200
    Subject: [PATCH 265/649] Add Underscore class
    
    ---
     spacy/tokens/underscore.py | 38 ++++++++++++++++++++++++++++++++++++++
     1 file changed, 38 insertions(+)
     create mode 100644 spacy/tokens/underscore.py
    
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    new file mode 100644
    index 000000000..8374f4bda
    --- /dev/null
    +++ b/spacy/tokens/underscore.py
    @@ -0,0 +1,38 @@
    +class Undercore(object):
    +    doc_extensions = {}
    +    span_extensions = {}
    +    token_extensions = {}
    +
    +    def __init__(self, obj, start=None, end=None):
    +        object.__setattr__(self, '_obj', obj)
    +        # Assumption is that for doc values, _start and _end will both be None
    +        # Span will set non-None values for _start and _end
    +        # Token will have _start be non-None, _end be None
    +        # This lets us key everything into the doc.user_data dictionary,
    +        # (see _get_key), and lets us use a single Underscore class.
    +        object.__setattr__(self, '_doc', obj.doc)
    +        object.__setattr__(self, '_start', start)
    +        object.__setattr__(self, '_end', start)
    +
    +    def __getattr__(self, name):
    +        if name not in self.__class__.extensions:
    +            raise AttributeError(name)
    +        default, method, getter, setter = self.__class__.extensions[name]
    +        if getter is not None:
    +            return getter(self._obj)
    +        elif method is not None:
    +            return method)
    +        else:
    +            return self._doc.user_data.get(self._get_key(name), default)
    +
    +    def __setattr__(self, name, value):
    +        if name not in self.__class__.extensions:
    +            raise AttributeError(name)
    +        default, method, getter, setter = self.__class__.extensions[name]
    +        if setter is not None:
    +            return setter(self._obj, value)
    +        else:
    +            self._doc.user_data[self._get_key(name)] = value
    +
    +    def _get_key(self, name):
    +        return ('._.', name, self._start, self._end)
    
    From 668a0ea64032dd5896e316db6e62454c7bb48fa0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 18:56:01 +0200
    Subject: [PATCH 266/649] Pass extensions into Underscore class
    
    ---
     spacy/tokens/doc.pyx       | 23 ++++++++++++++++++++++-
     spacy/tokens/span.pyx      | 19 +++++++++++++++++++
     spacy/tokens/token.pyx     | 19 +++++++++++++++++++
     spacy/tokens/underscore.py | 17 +++++++++--------
     4 files changed, 69 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index fcb5a16fa..329b1a0dd 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -30,7 +30,7 @@ from ..util import normalize_slice
     from ..compat import is_config
     from .. import about
     from .. import util
    -
    +from .underscore import Underscore
     
     DEF PADDING = 5
     
    @@ -64,6 +64,7 @@ cdef attr_t get_token_attr(const TokenC* token, attr_id_t feat_name) nogil:
         else:
             return Lexeme.get_struct_attr(token.lex, feat_name)
     
    +
     def _get_chunker(lang):
         try:
             cls = util.get_lang_class(lang)
    @@ -73,6 +74,7 @@ def _get_chunker(lang):
             return None
         return cls.Defaults.syntax_iterators.get(u'noun_chunks')
     
    +
     cdef class Doc:
         """A sequence of Token objects. Access sentences and named entities, export
         annotations to numpy arrays, losslessly serialize to compressed binary strings.
    @@ -87,6 +89,21 @@ cdef class Doc:
             >>> from spacy.tokens import Doc
             >>> doc = Doc(nlp.vocab, words=[u'hello', u'world', u'!'], spaces=[True, False, False])
         """
    +    @classmethod
    +    def set_extension(cls, name, default=None, method=None,
    +                      getter=None, setter=None):
    +        nr_defined = sum(t is not None for t in (default, getter, setter, method))
    +        assert nr_defined == 1
    +        Underscore.doc_extensions[name] = (default, method, getter, setter) 
    +
    +    @classmethod
    +    def get_extension(cls, name):
    +        return Underscore.doc_extensions.get(name)
    +
    +    @classmethod
    +    def has_extension(cls, name):
    +        return name in Underscore.doc_extensions
    +
         def __init__(self, Vocab vocab, words=None, spaces=None, orths_and_spaces=None):
             """Create a Doc object.
     
    @@ -159,6 +176,10 @@ cdef class Doc:
                 self.is_tagged = True
                 self.is_parsed = True
     
    +    @property
    +    def _(self):
    +        return Underscore(Underscore.doc_extensions, self)
    +
         def __getitem__(self, object i):
             """Get a `Token` or `Span` object.
     
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 7e29cccf4..389922518 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -17,10 +17,24 @@ from ..attrs cimport IS_PUNCT, IS_SPACE
     from ..lexeme cimport Lexeme
     from ..compat import is_config
     from .. import about
    +from .underscore import Underscore
     
     
     cdef class Span:
         """A slice from a Doc object."""
    +    @classmethod
    +    def set_extension(cls, name, default=None, method=None,
    +                      getter=None, setter=None):
    +        Underscore.span_extensions[name] = (default, method, getter, setter) 
    +
    +    @classmethod
    +    def get_extension(cls, name):
    +        return Underscore.span_extensions.get(name)
    +
    +    @classmethod
    +    def has_extension(cls, name):
    +        return name in Underscore.span_extensions
    +
         def __cinit__(self, Doc doc, int start, int end, attr_t label=0, vector=None,
                       vector_norm=None):
             """Create a `Span` object from the slice `doc[start : end]`.
    @@ -111,6 +125,11 @@ cdef class Span:
             for i in range(self.start, self.end):
                 yield self.doc[i]
     
    +    @property
    +    def _(self):
    +        return Underscore(Underscore.span_extensions, self,
    +                          start=self.start_char, end=self.end_char)
    +
         def merge(self, *args, **attributes):
             """Retokenize the document, such that the span is merged into a single
             token.
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index 7b11d6efa..c617b382e 100644
    --- a/spacy/tokens/token.pyx
    +++ b/spacy/tokens/token.pyx
    @@ -20,10 +20,24 @@ from ..attrs cimport ID, ORTH, NORM, LOWER, SHAPE, PREFIX, SUFFIX, LENGTH, CLUST
     from ..attrs cimport LEMMA, POS, TAG, DEP
     from ..compat import is_config
     from .. import about
    +from .underscore import Underscore
     
     
     cdef class Token:
         """An individual token – i.e. a word, punctuation symbol, whitespace, etc."""
    +    @classmethod
    +    def set_extension(cls, name, default=None, method=None,
    +                      getter=None, setter=None):
    +        Underscore.span_extensions[name] = (default, method, getter, setter) 
    +
    +    @classmethod
    +    def get_extension(cls, name):
    +        return Underscore.span_extensions.get(name)
    +
    +    @classmethod
    +    def has_extension(cls, name):
    +        return name in Underscore.span_extensions
    +
         def __cinit__(self, Vocab vocab, Doc doc, int offset):
             """Construct a `Token` object.
     
    @@ -87,6 +101,11 @@ cdef class Token:
             else:
                 raise ValueError(op)
     
    +    @property
    +    def _(self):
    +        return Underscore(Underscore.token_extensions, self,
    +                          start=self.idx, end=None)
    +
         cpdef bint check_flag(self, attr_id_t flag_id) except -1:
             """Check the value of a boolean flag.
     
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    index 8374f4bda..66c54d6d6 100644
    --- a/spacy/tokens/underscore.py
    +++ b/spacy/tokens/underscore.py
    @@ -1,9 +1,10 @@
    -class Undercore(object):
    +class Underscore(object):
         doc_extensions = {}
         span_extensions = {}
         token_extensions = {}
     
    -    def __init__(self, obj, start=None, end=None):
    +    def __init__(self, extensions, obj, start=None, end=None):
    +        object.__setattr__(self, '_extensions', extensions)
             object.__setattr__(self, '_obj', obj)
             # Assumption is that for doc values, _start and _end will both be None
             # Span will set non-None values for _start and _end
    @@ -12,23 +13,23 @@ class Undercore(object):
             # (see _get_key), and lets us use a single Underscore class.
             object.__setattr__(self, '_doc', obj.doc)
             object.__setattr__(self, '_start', start)
    -        object.__setattr__(self, '_end', start)
    +        object.__setattr__(self, '_end', end)
     
         def __getattr__(self, name):
    -        if name not in self.__class__.extensions:
    +        if name not in self._extensions:
                 raise AttributeError(name)
    -        default, method, getter, setter = self.__class__.extensions[name]
    +        default, method, getter, setter = self._extensions[name]
             if getter is not None:
                 return getter(self._obj)
             elif method is not None:
    -            return method)
    +            return method
             else:
                 return self._doc.user_data.get(self._get_key(name), default)
     
         def __setattr__(self, name, value):
    -        if name not in self.__class__.extensions:
    +        if name not in self._extensions:
                 raise AttributeError(name)
    -        default, method, getter, setter = self.__class__.extensions[name]
    +        default, method, getter, setter = self._extensions[name]
             if setter is not None:
                 return setter(self._obj, value)
             else:
    
    From 9bd81917397e558464e1dd86ab31f1b660279e62 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 18:56:19 +0200
    Subject: [PATCH 267/649] Add tests for Underscore
    
    ---
     spacy/tests/test_underscore.py | 50 ++++++++++++++++++++++++++++++++++
     1 file changed, 50 insertions(+)
     create mode 100644 spacy/tests/test_underscore.py
    
    diff --git a/spacy/tests/test_underscore.py b/spacy/tests/test_underscore.py
    new file mode 100644
    index 000000000..262098515
    --- /dev/null
    +++ b/spacy/tests/test_underscore.py
    @@ -0,0 +1,50 @@
    +from mock import Mock
    +from ..tokens.underscore import Underscore
    +
    +
    +def test_create_doc_underscore():
    +    doc = Mock()
    +    doc.doc = doc
    +    uscore = Underscore(Underscore.doc_extensions, doc)
    +    assert uscore._doc is doc
    +    assert uscore._start is None
    +    assert uscore._end is None
    +
    +def test_doc_underscore_getattr_setattr():
    +    doc = Mock()
    +    doc.doc = doc
    +    doc.user_data = {}
    +    Underscore.doc_extensions['hello'] = (False, None, None, None)
    +    doc._ = Underscore(Underscore.doc_extensions, doc)
    +    assert doc._.hello == False
    +    doc._.hello = True
    +    assert doc._.hello == True
    +
    +def test_create_span_underscore():
    +    span = Mock(doc=Mock(), start=0, end=2)
    +    uscore = Underscore(Underscore.span_extensions, span,
    +                        start=span.start, end=span.end)
    +    assert uscore._doc is span.doc
    +    assert uscore._start is span.start
    +    assert uscore._end is span.end
    +
    +def test_span_underscore_getter_setter():
    +    span = Mock(doc=Mock(), start=0, end=2)
    +    Underscore.span_extensions['hello'] = (None, None,
    +                                           lambda s: (s.start, 'hi'),
    +                                           lambda s, value: setattr(s, 'start',
    +                                                                    value))
    +    span._ = Underscore(Underscore.span_extensions, span,
    +                        start=span.start, end=span.end)
    + 
    +    assert span._.hello == (0, 'hi')
    +    span._.hello = 1
    +    assert span._.hello == (1, 'hi')
    +
    +
    +def test_token_underscore_method():
    +    token = Mock(doc=Mock(), idx=7, say_cheese=lambda: 'cheese')
    +    Underscore.token_extensions['hello'] = (None, token.say_cheese,
    +                                            None, None)
    +    token._ = Underscore(Underscore.token_extensions, token, start=token.idx)
    +    assert token._.hello() == 'cheese'
    
    From f2b590f67283678fc4521208729fd9c10caa3db0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 19:01:01 +0200
    Subject: [PATCH 268/649] Increment version
    
    ---
     spacy/about.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/about.py b/spacy/about.py
    index a8880d7ca..699b61aff 100644
    --- a/spacy/about.py
    +++ b/spacy/about.py
    @@ -3,13 +3,13 @@
     # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py
     
     __title__ = 'spacy-nightly'
    -__version__ = '2.0.0a16'
    +__version__ = '2.0.0a17'
     __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython'
     __uri__ = 'https://spacy.io'
     __author__ = 'Explosion AI'
     __email__ = 'contact@explosion.ai'
     __license__ = 'MIT'
    -__release__ = True
    +__release__ = False
     
     __docs_models__ = 'https://alpha.spacy.io/usage/models'
     __download_url__ = 'https://github.com/explosion/spacy-models/releases/download'
    
    From 92c5d78b422ad437eaac79f11edca7d2f6885e1e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 19:02:40 +0200
    Subject: [PATCH 269/649] Unhack NER.add_action
    
    ---
     spacy/syntax/ner.pyx | 46 +++++++++++++++++++++-----------------------
     1 file changed, 22 insertions(+), 24 deletions(-)
    
    diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx
    index d8c748099..5c4e42176 100644
    --- a/spacy/syntax/ner.pyx
    +++ b/spacy/syntax/ner.pyx
    @@ -219,30 +219,28 @@ cdef class BiluoPushDown(TransitionSystem):
                 raise Exception(move)
             return t
     
    -    #def add_action(self, int action, label_name):
    -    #    cdef attr_t label_id
    -    #    if not isinstance(label_name, (int, long)):
    -    #        label_id = self.strings.add(label_name)
    -    #    else:
    -    #        label_id = label_name
    -    #    if action == OUT and label_id != 0:
    -    #        return
    -    #    if action == MISSING or action == ISNT:
    -    #        return
    -    #    # Check we're not creating a move we already have, so that this is
    -    #    # idempotent
    -    #    for trans in self.c[:self.n_moves]:
    -    #        if trans.move == action and trans.label == label_id:
    -    #            return 0
    -    #    if self.n_moves >= self._size:
    -    #        self._size *= 2
    -    #        self.c = self.mem.realloc(self.c, self._size * sizeof(self.c[0]))
    -    #    self.c[self.n_moves] = self.init_transition(self.n_moves, action, label_id)
    -    #    assert self.c[self.n_moves].label == label_id
    -    #    self.n_moves += 1
    -    #    return 1
    -
    -
    +    def add_action(self, int action, label_name):
    +        cdef attr_t label_id
    +        if not isinstance(label_name, (int, long)):
    +            label_id = self.strings.add(label_name)
    +        else:
    +            label_id = label_name
    +        if action == OUT and label_id != 0:
    +            return
    +        if action == MISSING or action == ISNT:
    +            return
    +        # Check we're not creating a move we already have, so that this is
    +        # idempotent
    +        for trans in self.c[:self.n_moves]:
    +            if trans.move == action and trans.label == label_id:
    +                return 0
    +        if self.n_moves >= self._size:
    +            self._size *= 2
    +            self.c = self.mem.realloc(self.c, self._size * sizeof(self.c[0]))
    +        self.c[self.n_moves] = self.init_transition(self.n_moves, action, label_id)
    +        assert self.c[self.n_moves].label == label_id
    +        self.n_moves += 1
    +        return 1
     
         cdef int initialize_state(self, StateC* st) nogil:
             # This is especially necessary when we use limited training data.
    
    From d163115e91aaa6a0f73b05b05bcca9774d76bf7c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 21:00:43 -0500
    Subject: [PATCH 270/649] Add non-linearity after history features
    
    ---
     spacy/_ml.py | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 898d6ab49..23facb9fb 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -264,7 +264,8 @@ def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
             return layerize(noop())
         embed_tables = [Embed(nr_dim, nr_class, column=i, name='embed%d')
                         for i in range(hist_size)]
    -    embed = concatenate(*embed_tables)
    +    embed = chain(concatenate(*embed_tables),
    +                  LN(Maxout(hist_size*nr_dim, hist_size*nr_dim)))
         ops = embed.ops
         def add_history_fwd(vectors_hists, drop=0.):
             vectors, hist_ids = vectors_hists
    
    From 9d66a915da3c78346ebf6a47fac54dd5eb94c246 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 21:02:38 -0500
    Subject: [PATCH 271/649] Update training defaults
    
    ---
     spacy/cli/train.py | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index b27087056..80bb11798 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -78,11 +78,11 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
         # starts high and decays sharply, to force the optimizer to explore.
         # Batch size starts at 1 and grows, so that we make updates quickly
         # at the beginning of training.
    -    dropout_rates = util.decaying(util.env_opt('dropout_from', 0.2),
    -                                  util.env_opt('dropout_to', 0.2),
    -                                  util.env_opt('dropout_decay', 0.0))
    +    dropout_rates = util.decaying(util.env_opt('dropout_from', 0.6),
    +                                  util.env_opt('dropout_to', 0.1),
    +                                  util.env_opt('dropout_decay', 1e-5))
         batch_sizes = util.compounding(util.env_opt('batch_from', 1),
    -                                   util.env_opt('batch_to', 16),
    +                                   util.env_opt('batch_to', 4),
                                        util.env_opt('batch_compound', 1.001))
         corpus = GoldCorpus(train_path, dev_path, limit=n_sents)
         n_train_words = corpus.count_train()
    
    From 42b401d08b5b4b6968d2ed3e70e0a3c580b6c60b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 21:05:21 -0500
    Subject: [PATCH 272/649] Change default hidden depth to 1
    
    ---
     spacy/syntax/nn_parser.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index fdcf1d2d1..153f7a484 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,7 +239,7 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 2))
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
             token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
             hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 128))
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 1))
    
    From be4f0b64605b036f06fdd919253b719fdc88b5bb Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 02:08:12 -0500
    Subject: [PATCH 273/649] Update defaults
    
    ---
     spacy/cli/train.py | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 80bb11798..b27087056 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -78,11 +78,11 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
         # starts high and decays sharply, to force the optimizer to explore.
         # Batch size starts at 1 and grows, so that we make updates quickly
         # at the beginning of training.
    -    dropout_rates = util.decaying(util.env_opt('dropout_from', 0.6),
    -                                  util.env_opt('dropout_to', 0.1),
    -                                  util.env_opt('dropout_decay', 1e-5))
    +    dropout_rates = util.decaying(util.env_opt('dropout_from', 0.2),
    +                                  util.env_opt('dropout_to', 0.2),
    +                                  util.env_opt('dropout_decay', 0.0))
         batch_sizes = util.compounding(util.env_opt('batch_from', 1),
    -                                   util.env_opt('batch_to', 4),
    +                                   util.env_opt('batch_to', 16),
                                        util.env_opt('batch_compound', 1.001))
         corpus = GoldCorpus(train_path, dev_path, limit=n_sents)
         n_train_words = corpus.count_train()
    
    From 18063803de66a63e0583dd4fe1e3aa8938d561a4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 19:58:54 +0200
    Subject: [PATCH 274/649] Make TokenC.sent_tart an int, to allow ternary value
    
    ---
     spacy/structs.pxd | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/structs.pxd b/spacy/structs.pxd
    index 3c60cd87f..cfcadc3d0 100644
    --- a/spacy/structs.pxd
    +++ b/spacy/structs.pxd
    @@ -61,13 +61,13 @@ cdef struct TokenC:
         attr_t sense
         int head
         attr_t dep
    -    bint sent_start
     
         uint32_t l_kids
         uint32_t r_kids
         uint32_t l_edge
         uint32_t r_edge
     
    +    int sent_start
         int ent_iob
         attr_t ent_type # TODO: Is there a better way to do this? Multiple sources of truth..
         hash_t ent_id
    
    From 20309fb9dbda330d6b31371610fd5ac5e6663647 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 20:32:14 +0200
    Subject: [PATCH 275/649] Make history features default to zero
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 153f7a484..619431766 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -244,8 +244,8 @@ cdef class Parser:
             hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 128))
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 1))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
    -        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 4))
    -        hist_width = util.env_opt('history_width', cfg.get('hist_width', 16))
    +        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
    +        hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    
    From 7ae67ec6a16d5861e12b821bb6315c1d7f23ada2 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 23:50:20 +0200
    Subject: [PATCH 276/649] Add Span.as_doc method
    
    ---
     spacy/tokens/span.pyx | 24 ++++++++++++++++++++++++
     1 file changed, 24 insertions(+)
    
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 7e29cccf4..c6bb1a0bb 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -111,6 +111,30 @@ cdef class Span:
             for i in range(self.start, self.end):
                 yield self.doc[i]
     
    +    def as_doc(self):
    +        '''Create a Doc object view of the Span's data.
    +
    +        This is mostly useful for C-typed interfaces. 
    +        '''
    +        cdef Doc doc = Doc(self.doc.vocab)
    +        doc.length = self.end-self.start
    +        doc.c = &self.doc.c[self.start]
    +        doc.mem = self.doc.mem
    +        doc.is_parsed = self.doc.is_parsed
    +        doc.is_tagged = self.doc.is_tagged
    +        doc.noun_chunks_iterator = self.doc.noun_chunks_iterator
    +        doc.user_hooks = self.doc.user_hooks
    +        doc.user_span_hooks = self.doc.user_span_hooks
    +        doc.user_token_hooks = self.doc.user_token_hooks
    +        doc.vector = self.vector
    +        doc.vector_norm = self.vector_norm
    +        for key, value in self.doc.cats.items():
    +            if hasattr(key, '__len__') and len(key) == 3:
    +                cat_start, cat_end, cat_label = key
    +                if cat_start == self.start_char and cat_end == self.end_char:
    +                    doc.cats[cat_label] = value
    +        return doc
    +
         def merge(self, *args, **attributes):
             """Retokenize the document, such that the span is merged into a single
             token.
    
    From 080afd49240e4ebdf61321adeed2bd81f054600f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 23:51:58 +0200
    Subject: [PATCH 277/649] Add ternary value setting to Token.sent_start
    
    ---
     spacy/tokens/token.pyx | 12 ++++++++++--
     1 file changed, 10 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index 7b11d6efa..78ba920dd 100644
    --- a/spacy/tokens/token.pyx
    +++ b/spacy/tokens/token.pyx
    @@ -281,13 +281,21 @@ cdef class Token:
             def __get__(self):
                 return self.c.sent_start
     
    -        def __set__(self, bint value):
    +        def __set__(self, value):
                 if self.doc.is_parsed:
                     raise ValueError(
                         'Refusing to write to token.sent_start if its document is parsed, '
                         'because this may cause inconsistent state. '
                         'See https://github.com/spacy-io/spaCy/issues/235 for workarounds.')
    -            self.c.sent_start = value
    +            if value is None:
    +                self.c.sent_start = 0
    +            elif value is True:
    +                self.c.sent_start = 1
    +            elif value is False:
    +                self.c.sent_start = -1
    +            else:
    +                raise ValueError("Invalid value for token.sent_start -- must be one of "
    +                                 "None, True, False")
     
         property lefts:
             def __get__(self):
    
    From e938bce320bf9870024cd6ad3d9afc7ce47cc119 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 23:53:34 +0200
    Subject: [PATCH 278/649] Adjust parsing transition system to allow preset
     sentence segments.
    
    ---
     spacy/syntax/_state.pxd    | 4 +++-
     spacy/syntax/arc_eager.pyx | 8 +++++---
     spacy/tokens/doc.pyx       | 2 +-
     3 files changed, 9 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd
    index 1864b22b3..4675d887e 100644
    --- a/spacy/syntax/_state.pxd
    +++ b/spacy/syntax/_state.pxd
    @@ -307,6 +307,8 @@ cdef cppclass StateC:
                 this._stack[this._s_i] = this.B(0)
             this._s_i += 1
             this._b_i += 1
    +        if this.B_(0).sent_start == 1:
    +            this.set_break(this.B(0))
             if this._b_i > this._break:
                 this._break = -1
     
    @@ -383,7 +385,7 @@ cdef cppclass StateC:
     
         void set_break(int i) nogil:
             if 0 <= i < this.length:
    -            this._sent[i].sent_start = True
    +            this._sent[i].sent_start = 1
                 this._break = this._b_i
     
         void clone(const StateC* src) nogil:
    diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx
    index d1e1987d7..3a61e1f9d 100644
    --- a/spacy/syntax/arc_eager.pyx
    +++ b/spacy/syntax/arc_eager.pyx
    @@ -118,7 +118,7 @@ cdef bint _is_gold_root(const GoldParseC* gold, int word) nogil:
     cdef class Shift:
         @staticmethod
         cdef bint is_valid(const StateC* st, attr_t label) nogil:
    -        return st.buffer_length() >= 2 and not st.shifted[st.B(0)] and not st.B_(0).sent_start
    +        return st.buffer_length() >= 2 and not st.shifted[st.B(0)] and st.B_(0).sent_start != 1
     
         @staticmethod
         cdef int transition(StateC* st, attr_t label) nogil:
    @@ -178,7 +178,7 @@ cdef class Reduce:
     cdef class LeftArc:
         @staticmethod
         cdef bint is_valid(const StateC* st, attr_t label) nogil:
    -        return not st.B_(0).sent_start
    +        return st.B_(0).sent_start != 1
     
         @staticmethod
         cdef int transition(StateC* st, attr_t label) nogil:
    @@ -212,7 +212,7 @@ cdef class LeftArc:
     cdef class RightArc:
         @staticmethod
         cdef bint is_valid(const StateC* st, attr_t label) nogil:
    -        return not st.B_(0).sent_start
    +        return st.B_(0).sent_start != 1
     
         @staticmethod
         cdef int transition(StateC* st, attr_t label) nogil:
    @@ -248,6 +248,8 @@ cdef class Break:
                 return False
             elif st.stack_depth() < 1:
                 return False
    +        elif st.B_(0).l_edge < 0:
    +            return False
             else:
                 return True
     
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index fcb5a16fa..df75ab3ec 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -485,7 +485,7 @@ cdef class Doc:
                 cdef int i
                 start = 0
                 for i in range(1, self.length):
    -                if self.c[i].sent_start:
    +                if self.c[i].sent_start == 1:
                         yield Span(self, start, i)
                         start = i
                 if start != self.length:
    
    From 5a67efecccb91f68efbe7b14406a14c8151a2e9e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 00:02:23 +0200
    Subject: [PATCH 279/649] Add tests for sentence segmentation presetting
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 72 +++++++++++++++++++++++++++
     1 file changed, 72 insertions(+)
     create mode 100644 spacy/tests/parser/test_preset_sbd.py
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    new file mode 100644
    index 000000000..1b83567ad
    --- /dev/null
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -0,0 +1,72 @@
    +'''Test that the parser respects preset sentence boundaries.'''
    +import pytest
    +from thinc.neural.optimizers import Adam
    +from thinc.neural.ops import NumpyOps
    +
    +from ...attrs import NORM
    +from ...gold import GoldParse
    +from ...vocab import Vocab
    +from ...tokens import Doc
    +from ...pipeline import NeuralDependencyParser
    +
    +@pytest.fixture
    +def vocab():
    +    return Vocab(lex_attr_getters={NORM: lambda s: s})
    +
    +@pytest.fixture
    +def parser(vocab):
    +    parser = NeuralDependencyParser(vocab)
    +    parser.cfg['token_vector_width'] = 4
    +    parser.cfg['hidden_width'] = 32
    +    #parser.add_label('right')
    +    parser.add_label('left')
    +    parser.begin_training([], **parser.cfg)
    +    sgd = Adam(NumpyOps(), 0.001)
    +
    +    for i in range(10):
    +        losses = {}
    +        doc = Doc(vocab, words=['a', 'b', 'c', 'd'])
    +        gold = GoldParse(doc, heads=[1, 1, 3, 3],
    +                deps=['left', 'ROOT', 'left', 'ROOT'])
    +        parser.update([doc], [gold], sgd=sgd, losses=losses)
    +    return parser
    +
    +def test_no_sentences(parser):
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc = parser(doc)
    +    assert len(list(doc.sents)) == 2
    +
    +
    +def test_sents_1(parser):
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc[2].sent_start = True
    +    doc = parser(doc)
    +    assert len(list(doc.sents)) == 3
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc[1].sent_start = False
    +    doc[2].sent_start = True
    +    doc[3].sent_start = False
    +    doc = parser(doc)
    +    assert len(list(doc.sents)) == 2
    +
    +
    +def test_sents_1_2(parser):
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc[1].sent_start = True
    +    doc[2].sent_start = True
    +    doc = parser(doc)
    +    assert len(list(doc.sents)) == 3
    +
    +
    +def test_sents_1_3(parser):
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc[1].sent_start = True
    +    doc[3].sent_start = True
    +    doc = parser(doc)
    +    assert len(list(doc.sents)) == 4
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc[1].sent_start = True
    +    doc[2].sent_start = False
    +    doc[3].sent_start = True
    +    doc = parser(doc)
    +    assert len(list(doc.sents)) == 3
    
    From 4cc84b023427a7dcbe7fbb7909c67ee3cbc9cc19 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 00:02:45 +0200
    Subject: [PATCH 280/649] Prohibit Break when sent_start < 0
    
    ---
     spacy/syntax/arc_eager.pyx | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx
    index 3a61e1f9d..9770383d1 100644
    --- a/spacy/syntax/arc_eager.pyx
    +++ b/spacy/syntax/arc_eager.pyx
    @@ -250,6 +250,8 @@ cdef class Break:
                 return False
             elif st.B_(0).l_edge < 0:
                 return False
    +        elif st._sent[st.B_(0).l_edge].sent_start < 0:
    +            return False
             else:
                 return True
     
    
    From 02c2af7119790a8e0be15ae44e6e5bf6788cd0c4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 00:29:37 +0200
    Subject: [PATCH 281/649] Fix test
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index 1b83567ad..fa31486ea 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -41,7 +41,7 @@ def test_sents_1(parser):
         doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
         doc[2].sent_start = True
         doc = parser(doc)
    -    assert len(list(doc.sents)) == 3
    +    assert len(list(doc.sents)) >= 2
         doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
         doc[1].sent_start = False
         doc[2].sent_start = True
    
    From 81a64119dbc3d2fe40b532925b05d7880e6eeade Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 00:59:49 +0200
    Subject: [PATCH 282/649] Fix string-to-unicode problem
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index fa31486ea..77326f797 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -1,4 +1,5 @@
     '''Test that the parser respects preset sentence boundaries.'''
    +from __future__ import unicode_literals
     import pytest
     from thinc.neural.optimizers import Adam
     from thinc.neural.ops import NumpyOps
    
    From d43a83e37a6ccb0087db8f77c916761d81c94afa Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 03:35:40 +0200
    Subject: [PATCH 283/649] Allow parser.add_label for pretrained models
    
    ---
     spacy/syntax/nn_parser.pyx | 12 +++++++++++-
     1 file changed, 11 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 153f7a484..daebcac7b 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -51,7 +51,7 @@ from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune
     from .._ml import Residual, drop_layer, flatten
     from .._ml import link_vectors_to_models
     from .._ml import HistoryFeatures
    -from ..compat import json_dumps
    +from ..compat import json_dumps, copy_array
     
     from . import _parse_features
     from ._parse_features cimport CONTEXT_SIZE
    @@ -781,12 +781,22 @@ cdef class Parser:
                 self.moves.finalize_doc(doc)
     
         def add_label(self, label):
    +        resized = False
             for action in self.moves.action_types:
                 added = self.moves.add_action(action, label)
                 if added:
                     # Important that the labels be stored as a list! We need the
                     # order, or the model goes out of synch
                     self.cfg.setdefault('extra_labels', []).append(label)
    +                resized = True
    +        if self.model not in (True, False, None) and resized:
    +            # Weights are stored in (nr_out, nr_in) format, so we're basically
    +            # just adding rows here.
    +            smaller = self.model[-1]._layers[-1]
    +            larger = Affine(self.moves.n_moves, smaller.nI)
    +            copy_array(larger.W[:smaller.nO], smaller.W)
    +            copy_array(larger.b[:smaller.nO], smaller.b)
    +            self.model[-1]._layers[-1] = larger
     
         def begin_training(self, gold_tuples, pipeline=None, **cfg):
             if 'model' in cfg:
    
    From b2b8506f2c8b984864dabb0daeafa4e86c079231 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 03:35:57 +0200
    Subject: [PATCH 284/649] Remove whitespace
    
    ---
     spacy/_ml.py | 2 --
     1 file changed, 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 23facb9fb..62e0ceb9a 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -743,5 +743,3 @@ def concatenate_lists(*layers, **kwargs): # pragma: no cover
             return ys, concatenate_lists_bwd
         model = wrap(concatenate_lists_fwd, concat)
         return model
    -
    -
    
    From dde87e6b0d2de331e536d335ead00db5d181ee96 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 03:42:35 +0200
    Subject: [PATCH 285/649] Add tests for adding parser actions
    
    ---
     spacy/tests/parser/test_add_label.py | 68 ++++++++++++++++++++++++++++
     1 file changed, 68 insertions(+)
     create mode 100644 spacy/tests/parser/test_add_label.py
    
    diff --git a/spacy/tests/parser/test_add_label.py b/spacy/tests/parser/test_add_label.py
    new file mode 100644
    index 000000000..b89cca113
    --- /dev/null
    +++ b/spacy/tests/parser/test_add_label.py
    @@ -0,0 +1,68 @@
    +'''Test the ability to add a label to a (potentially trained) parsing model.'''
    +from __future__ import unicode_literals
    +import pytest
    +import numpy.random
    +from thinc.neural.optimizers import Adam
    +from thinc.neural.ops import NumpyOps
    +
    +from ...attrs import NORM
    +from ...gold import GoldParse
    +from ...vocab import Vocab
    +from ...tokens import Doc
    +from ...pipeline import NeuralDependencyParser
    +
    +numpy.random.seed(0)
    +
    +
    +@pytest.fixture
    +def vocab():
    +    return Vocab(lex_attr_getters={NORM: lambda s: s})
    +
    +
    +@pytest.fixture
    +def parser(vocab):
    +    parser = NeuralDependencyParser(vocab)
    +    parser.cfg['token_vector_width'] = 4
    +    parser.cfg['hidden_width'] = 6
    +    parser.cfg['hist_size'] = 0
    +    parser.add_label('left')
    +    parser.begin_training([], **parser.cfg)
    +    sgd = Adam(NumpyOps(), 0.001)
    +
    +    for i in range(30):
    +        losses = {}
    +        doc = Doc(vocab, words=['a', 'b', 'c', 'd'])
    +        gold = GoldParse(doc, heads=[1, 1, 3, 3],
    +                deps=['left', 'ROOT', 'left', 'ROOT'])
    +        parser.update([doc], [gold], sgd=sgd, losses=losses)
    +    return parser
    +
    +
    +def test_add_label(parser):
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc = parser(doc)
    +    assert doc[0].head.i == 1
    +    assert doc[0].dep_ == 'left'
    +    assert doc[1].head.i == 1
    +    assert doc[2].head.i == 3
    +    assert doc[2].head.i == 3
    +    parser.add_label('right')
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc = parser(doc)
    +    assert doc[0].head.i == 1
    +    assert doc[0].dep_ == 'left'
    +    assert doc[1].head.i == 1
    +    assert doc[2].head.i == 3
    +    assert doc[2].head.i == 3
    +    sgd = Adam(NumpyOps(), 0.001)
    +    for i in range(10):
    +        losses = {}
    +        doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +        gold = GoldParse(doc, heads=[1, 1, 3, 3],
    +                deps=['right', 'ROOT', 'left', 'ROOT'])
    +        parser.update([doc], [gold], sgd=sgd, losses=losses)
    +    doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    +    doc = parser(doc)
    +    assert doc[0].dep_ == 'right'
    +    assert doc[2].dep_ == 'left'
    + 
    
    From 6c79841c0dce58cff859dfd37c44824cd267d8ea Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 04:12:24 +0200
    Subject: [PATCH 286/649] Fix tests for history features
    
    ---
     spacy/tests/parser/test_neural_parser.py | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py
    index 8747b01ba..ae20cd5f0 100644
    --- a/spacy/tests/parser/test_neural_parser.py
    +++ b/spacy/tests/parser/test_neural_parser.py
    @@ -35,7 +35,8 @@ def parser(vocab, arc_eager):
     
     @pytest.fixture
     def model(arc_eager, tok2vec):
    -    return Parser.Model(arc_eager.n_moves, token_vector_width=tok2vec.nO)[0]
    +    return Parser.Model(arc_eager.n_moves, token_vector_width=tok2vec.nO,
    +                        hist_size=0)[0]
     
     @pytest.fixture
     def doc(vocab):
    @@ -51,7 +52,7 @@ def test_can_init_nn_parser(parser):
     
     
     def test_build_model(parser):
    -    parser.model = Parser.Model(parser.moves.n_moves)[0]
    +    parser.model = Parser.Model(parser.moves.n_moves, hist_size=0)[0]
         assert parser.model is not None
     
     
    
    From 2534cd57d7aa99f98cd4ea0f1aeab5404d0d493d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 08:59:35 +0200
    Subject: [PATCH 287/649] Add bandaid solution to the 'shadowing' problem in
     #864
    
    ---
     spacy/matcher.pyx           | 10 +++++++++-
     spacy/tests/test_matcher.py | 12 +++++++++++-
     2 files changed, 20 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 8893b2fed..41d7029f0 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -71,6 +71,11 @@ cdef enum action_t:
         ADVANCE_ZERO
         PANIC
     
    +# A "match expression" conists of one or more token patterns
    +# Each token pattern consists of a quantifier and 0+ (attr, value) pairs.
    +# A state is an (int, pattern pointer) pair, where the int is the start
    +# position, and the pattern pointer shows where we're up to
    +# in the pattern.
     
     cdef struct AttrValueC:
         attr_id_t attr
    @@ -130,7 +135,10 @@ cdef int get_action(const TokenPatternC* pattern, const TokenC* token) nogil:
         elif pattern.quantifier in (ONE, ZERO_ONE):
             return ACCEPT if (pattern+1).nr_attr == 0 else ADVANCE
         elif pattern.quantifier == ZERO_PLUS:
    -        return REPEAT
    +        # This is a bandaid over the 'shadowing' problem described here:
    +        # https://github.com/explosion/spaCy/issues/864
    +        next_action = get_action(pattern+1, token)
    +        return REPEAT if next_action is REJECT else next_action
         else:
             return PANIC
     
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index b36c67d8c..ce6f2d91e 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -111,7 +111,17 @@ def test_matcher_empty_dict(en_vocab):
         matches = matcher(doc)
         assert matches[0][1:] == (0, 2)
      
    -
    +def test_matcher_operator_shadow(en_vocab):
    +    matcher = Matcher(en_vocab)
    +    abc = ["a", "b", "c"]
    +    doc = get_doc(matcher.vocab, abc)
    +    matcher.add('A.C', None, [{'ORTH': 'a'},
    +                              {"IS_ALPHA": True, "OP": "+"},
    +                              {'ORTH': 'c'}])
    +    matches = matcher(doc)
    +    assert len(matches) == 1
    +    assert matches[0][1:] == (0, 3)
    + 
     def test_matcher_phrase_matcher(en_vocab):
         words = ["Google", "Now"]
         doc = get_doc(en_vocab, words)
    
    From 2ac8b5c6223483af59d279277769a1c7b055ee7e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 9 Oct 2017 14:36:20 +0200
    Subject: [PATCH 288/649] Add wrapper for before/after code examples
    
    ---
     website/_includes/_mixins.jade           | 4 ++++
     website/assets/css/_base/_utilities.sass | 6 ++++++
     2 files changed, 10 insertions(+)
    
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 4876c6b6b..68db1be57 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -149,6 +149,10 @@ mixin code(label, language, prompt, height, icon, wrap)
     
     //- Code blocks to display old/new versions
     
    +mixin code-compare()
    +    span.u-inline-block.u-padding-top.u-width-full
    +        block
    +
     mixin code-old()
         +code(false, false, false, false, "reject").o-block-small
             block
    diff --git a/website/assets/css/_base/_utilities.sass b/website/assets/css/_base/_utilities.sass
    index e2ba552b7..91a6251e6 100644
    --- a/website/assets/css/_base/_utilities.sass
    +++ b/website/assets/css/_base/_utilities.sass
    @@ -143,6 +143,9 @@
     
     //- Layout
     
    +.u-width-full
    +    width: 100%
    +
     .u-float-left
         float: left
         margin-right: 1rem
    @@ -166,6 +169,9 @@
     .u-padding-medium
         padding: 1.8rem
     
    +.u-padding-top
    +    padding-top: 2rem
    +
     .u-inline-block
         display: inline-block
     
    
    From 4d248ea920958943979850dc9e605cd172b7ee3a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 9 Oct 2017 14:36:30 +0200
    Subject: [PATCH 289/649] Fix spacing on bulleted lists
    
    ---
     website/assets/css/_components/_lists.sass | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/assets/css/_components/_lists.sass b/website/assets/css/_components/_lists.sass
    index 2a933c95e..553af6578 100644
    --- a/website/assets/css/_components/_lists.sass
    +++ b/website/assets/css/_components/_lists.sass
    @@ -25,7 +25,7 @@
             display: inline-block
             font-size: 0.6em
             font-weight: bold
    -        padding-right: 1.25rem
    +        padding-right: 1em
             margin-left: -3.75rem
             text-align: right
             width: 2.5rem
    
    From 6550d0547c03002e1d46cf2cf1aa396835bc7cde Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 9 Oct 2017 14:36:36 +0200
    Subject: [PATCH 290/649] Fix typo
    
    ---
     website/usage/_processing-pipelines/_serialization.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/usage/_processing-pipelines/_serialization.jade b/website/usage/_processing-pipelines/_serialization.jade
    index e29cbc558..111a5fbad 100644
    --- a/website/usage/_processing-pipelines/_serialization.jade
    +++ b/website/usage/_processing-pipelines/_serialization.jade
    @@ -21,7 +21,7 @@ p
     
     +code.
         import spacy
    -    from spacy.tokens import Span
    +    from spacy.tokens.span import Span
     
         text = u'Netflix is hiring a new VP of global policy'
     
    
    From 6c253db3fe879f229adce49f6b2541b8d5b97913 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 9 Oct 2017 14:36:56 +0200
    Subject: [PATCH 291/649] Add section for developing spaCy extensions
    
    ---
     website/usage/_data.json                             | 1 +
     website/usage/_processing-pipelines/_extensions.jade | 3 +++
     website/usage/processing-pipelines.jade              | 4 ++++
     3 files changed, 8 insertions(+)
     create mode 100644 website/usage/_processing-pipelines/_extensions.jade
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index f77f7929c..25165c3ee 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -107,6 +107,7 @@
                 "Custom Components": "custom-components",
                 "Multi-threading": "multithreading",
                 "Serialization": "serialization",
    +            "Developing Extensions": "extensions"
             }
         },
     
    diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
    new file mode 100644
    index 000000000..d512e0321
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_extensions.jade
    @@ -0,0 +1,3 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > DEVELOPING EXTENSIONS
    +
    ++under-construction
    diff --git a/website/usage/processing-pipelines.jade b/website/usage/processing-pipelines.jade
    index 0d0579883..346e0554d 100644
    --- a/website/usage/processing-pipelines.jade
    +++ b/website/usage/processing-pipelines.jade
    @@ -19,3 +19,7 @@ include _spacy-101/_pipelines
     +section("serialization")
         +h(2, "serialization") Serialization
         include _processing-pipelines/_serialization
    +
    ++section("extensions")
    +    +h(2, "extensions") Developing spaCy extensions
    +    include _processing-pipelines/_extensions
    
    From 0f41b25f60d1681edbb2ab74d4e23ccd45516b61 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 08:05:37 -0500
    Subject: [PATCH 292/649] Add speed benchmarks to metadata
    
    ---
     spacy/cli/train.py | 38 ++++++++++++++++++++++++++++++--------
     1 file changed, 30 insertions(+), 8 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index b27087056..e0d09c178 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -114,15 +114,33 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     nlp.to_disk(epoch_model_path)
                     nlp_loaded = lang_class(pipeline=pipeline)
                     nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
    -                scorer = nlp_loaded.evaluate(
    -                            list(corpus.dev_docs(
    +                dev_docs = list(corpus.dev_docs(
                                     nlp_loaded,
    -                                gold_preproc=gold_preproc)))
    +                                gold_preproc=gold_preproc))
    +                nwords = sum(len(doc_gold[0]) for doc_gold in dev_docs)
    +                start_time = timer()
    +                scorer = nlp_loaded.evaluate(dev_docs)
    +                end_time = timer()
    +                if use_gpu < 0:
    +                    gpu_wps = None
    +                    cpu_wps = nwords/(end_time-start_time)
    +                else:
    +                    gpu_wps = nwords/(end_time-start_time)
    +                    with Model.use_device('cpu'):
    +                        nlp_loaded = lang_class(pipeline=pipeline)
    +                        nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
    +                        dev_docs = list(corpus.dev_docs(
    +                                        nlp_loaded, gold_preproc=gold_preproc))
    +                        start_time = timer()
    +                        scorer = nlp_loaded.evaluate(dev_docs)
    +                        end_time = timer()
    +                        cpu_wps = nwords/(end_time-start_time)
                     acc_loc =(output_path / ('model%d' % i) / 'accuracy.json')
                     with acc_loc.open('w') as file_:
                         file_.write(json_dumps(scorer.scores))
                     meta_loc = output_path / ('model%d' % i) / 'meta.json'
                     meta['accuracy'] = scorer.scores
    +                meta['speed'] = {'nwords': nwords, 'cpu':cpu_wps, 'gpu': gpu_wps}
                     meta['lang'] = nlp.lang
                     meta['pipeline'] = pipeline
                     meta['spacy_version'] = '>=%s' % about.__version__
    @@ -132,7 +150,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     with meta_loc.open('w') as file_:
                         file_.write(json_dumps(meta))
                     util.set_env_log(True)
    -            print_progress(i, losses, scorer.scores)
    +            print_progress(i, losses, scorer.scores, cpu_wps=cpu_wps, gpu_wps=gpu_wps)
         finally:
             print("Saving model...")
             try:
    @@ -153,16 +171,18 @@ def _render_parses(i, to_render):
             file_.write(html)
     
     
    -def print_progress(itn, losses, dev_scores, wps=0.0):
    +def print_progress(itn, losses, dev_scores, cpu_wps=0.0, gpu_wps=0.0):
    +    print(locals())
         scores = {}
         for col in ['dep_loss', 'tag_loss', 'uas', 'tags_acc', 'token_acc',
    -                'ents_p', 'ents_r', 'ents_f', 'wps']:
    +                'ents_p', 'ents_r', 'ents_f', 'cpu_wps', 'gpu_wps']:
             scores[col] = 0.0
         scores['dep_loss'] = losses.get('parser', 0.0)
         scores['ner_loss'] = losses.get('ner', 0.0)
         scores['tag_loss'] = losses.get('tagger', 0.0)
         scores.update(dev_scores)
    -    scores['wps'] = wps
    +    scores['cpu_wps'] = cpu_wps
    +    scores['gpu_wps'] = gpu_wps or 0.0
         tpl = '\t'.join((
             '{:d}',
             '{dep_loss:.3f}',
    @@ -173,7 +193,9 @@ def print_progress(itn, losses, dev_scores, wps=0.0):
             '{ents_f:.3f}',
             '{tags_acc:.3f}',
             '{token_acc:.3f}',
    -        '{wps:.1f}'))
    +        '{cpu_wps:.1f}',
    +        '{gpu_wps:.1f}',
    +    ))
         print(tpl.format(itn, **scores))
     
     
    
    From 808d8740d6ed4162256d5ea5dd182a7cf92688a5 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 08:45:20 -0500
    Subject: [PATCH 293/649] Remove print statement
    
    ---
     spacy/cli/train.py | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index e0d09c178..b605f4e61 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -172,7 +172,6 @@ def _render_parses(i, to_render):
     
     
     def print_progress(itn, losses, dev_scores, cpu_wps=0.0, gpu_wps=0.0):
    -    print(locals())
         scores = {}
         for col in ['dep_loss', 'tag_loss', 'uas', 'tags_acc', 'token_acc',
                     'ents_p', 'ents_r', 'ents_f', 'cpu_wps', 'gpu_wps']:
    
    From 51d18937afacf3147b05a2108fcada77ef770813 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 02:21:28 +0200
    Subject: [PATCH 294/649] Partially apply doc/span/token into method
    
    We want methods to act like they're "bound" to the object, so that you can make your method conditional on the `doc`, `span` or `token` instance --- like, well, a method. We therefore partially apply the function, which works like this:
    
    ```
    def partial(unbound_method, constant_arg):
        def bound_method(*args, **kwargs):
            return unbound_method(constant_arg, *args, **kwargs)
        return bound_method
    ---
     spacy/tokens/underscore.py | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    index 66c54d6d6..0b10e7afe 100644
    --- a/spacy/tokens/underscore.py
    +++ b/spacy/tokens/underscore.py
    @@ -1,3 +1,5 @@
    +import functools
    +
     class Underscore(object):
         doc_extensions = {}
         span_extensions = {}
    @@ -22,7 +24,7 @@ class Underscore(object):
             if getter is not None:
                 return getter(self._obj)
             elif method is not None:
    -            return method
    +            return functools.partial(method, self._obj)
             else:
                 return self._doc.user_data.get(self._get_key(name), default)
     
    
    From 735d18654da9481a860c11c398abaa754e05f263 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 20:06:28 -0500
    Subject: [PATCH 295/649] Add NER converter for CoNLL 2003 data
    
    ---
     spacy/cli/convert.py             | 27 ++++++++++++++++-----------
     spacy/cli/converters/__init__.py |  1 +
     2 files changed, 17 insertions(+), 11 deletions(-)
    
    diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py
    index 89615bbe8..d9a812a15 100644
    --- a/spacy/cli/convert.py
    +++ b/spacy/cli/convert.py
    @@ -4,7 +4,7 @@ from __future__ import unicode_literals
     import plac
     from pathlib import Path
     
    -from .converters import conllu2json, iob2json
    +from .converters import conllu2json, iob2json, conll_ner2json
     from ..util import prints
     
     # Converters are matched by file extension. To add a converter, add a new entry
    @@ -12,9 +12,10 @@ from ..util import prints
     # from /converters.
     
     CONVERTERS = {
    -    '.conllu': conllu2json,
    -    '.conll': conllu2json,
    -    '.iob': iob2json,
    +    'conllu': conllu2json,
    +    'conll': conllu2json,
    +    'ner': conll_ner2json,
    +    'iob': iob2json,
     }
     
     
    @@ -22,9 +23,11 @@ CONVERTERS = {
         input_file=("input file", "positional", None, str),
         output_dir=("output directory for converted file", "positional", None, str),
         n_sents=("Number of sentences per doc", "option", "n", int),
    +    converter=("Name of converter (auto, iob, conllu or ner)", "option", "c", str),
         morphology=("Enable appending morphology to tags", "flag", "m", bool)
     )
    -def convert(cmd, input_file, output_dir, n_sents=1, morphology=False):
    +def convert(cmd, input_file, output_dir, n_sents=1, morphology=False,
    +            converter='auto'):
         """
         Convert files into JSON format for use with train command and other
         experiment management functions.
    @@ -35,9 +38,11 @@ def convert(cmd, input_file, output_dir, n_sents=1, morphology=False):
             prints(input_path, title="Input file not found", exits=1)
         if not output_path.exists():
             prints(output_path, title="Output directory not found", exits=1)
    -    file_ext = input_path.suffix
    -    if not file_ext in CONVERTERS:
    -        prints("Can't find converter for %s" % input_path.parts[-1],
    -               title="Unknown format", exits=1)
    -    CONVERTERS[file_ext](input_path, output_path,
    -            n_sents=n_sents, use_morphology=morphology)
    +    if converter == 'auto':
    +        converter = input_path.suffix[1:]
    +    if not converter in CONVERTERS:
    +            prints("Can't find converter for %s" % converter,
    +                title="Unknown format", exits=1)
    +    func = CONVERTERS[converter]
    +    func(input_path, output_path,
    +         n_sents=n_sents, use_morphology=morphology)
    diff --git a/spacy/cli/converters/__init__.py b/spacy/cli/converters/__init__.py
    index 9026d16c6..02b596d4d 100644
    --- a/spacy/cli/converters/__init__.py
    +++ b/spacy/cli/converters/__init__.py
    @@ -1,2 +1,3 @@
     from .conllu2json import conllu2json
     from .iob2json import iob2json
    +from .conll_ner2json import conll_ner2json
    
    From f0f2739ae3348f22d948351cdb143b14e6557056 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 03:57:58 +0200
    Subject: [PATCH 296/649] Add test for serialization issue raised in #1105
    
    ---
     spacy/tests/serialize/test_serialize_empty_model.py | 9 +++++++++
     1 file changed, 9 insertions(+)
     create mode 100644 spacy/tests/serialize/test_serialize_empty_model.py
    
    diff --git a/spacy/tests/serialize/test_serialize_empty_model.py b/spacy/tests/serialize/test_serialize_empty_model.py
    new file mode 100644
    index 000000000..b614a3648
    --- /dev/null
    +++ b/spacy/tests/serialize/test_serialize_empty_model.py
    @@ -0,0 +1,9 @@
    +import spacy
    +import spacy.lang.en
    +from spacy.pipeline import TextCategorizer
    +
    +def test_bytes_serialize_issue_1105():
    +    nlp = spacy.lang.en.English()
    +    tokenizer = nlp.tokenizer
    +    textcat = TextCategorizer(tokenizer.vocab, labels=['ENTITY', 'ACTION', 'MODIFIER'])
    +    textcat_bytes = textcat.to_bytes()
    
    From 8978212ee51b8b519cfd52766c769900a7618e89 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 03:58:12 +0200
    Subject: [PATCH 297/649] Patch serialization bug raised in #1105
    
    ---
     spacy/pipeline.pyx | 39 ++++++++++++++++++++++-----------------
     1 file changed, 22 insertions(+), 17 deletions(-)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index c39976630..9fe538f0c 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -157,11 +157,13 @@ class BaseThincComponent(object):
     
         def to_bytes(self, **exclude):
             """Serialize the pipe to a bytestring."""
    -        serialize = OrderedDict((
    -            ('cfg', lambda: json_dumps(self.cfg)),
    -            ('model', lambda: self.model.to_bytes()),
    -            ('vocab', lambda: self.vocab.to_bytes())
    -        ))
    +        serialize = OrderedDict()
    +        serialize['cfg'] = lambda: json_dumps(self.cfg)
    +        if self.model in (True, False, None):
    +            serialize['model'] = lambda: self.model
    +        else:
    +            serialize['model'] = self.model.to_bytes
    +        serialize['vocab'] = self.vocab.to_bytes
             return util.to_bytes(serialize, exclude)
     
         def from_bytes(self, bytes_data, **exclude):
    @@ -182,11 +184,11 @@ class BaseThincComponent(object):
     
         def to_disk(self, path, **exclude):
             """Serialize the pipe to disk."""
    -        serialize = OrderedDict((
    -            ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))),
    -            ('vocab', lambda p: self.vocab.to_disk(p)),
    -            ('model', lambda p: p.open('wb').write(self.model.to_bytes())),
    -        ))
    +        serialize = OrderedDict()
    +        serialize['cfg'] = lambda p: p.open('w').write(json_dumps(self.cfg))
    +        serialize['vocab'] = lambda p: self.vocab.to_disk(p)
    +        if self.model not in (None, True, False):
    +            serialize['model'] = lambda p: p.open('wb').write(self.model.to_bytes())
             util.to_disk(path, serialize, exclude)
     
         def from_disk(self, path, **exclude):
    @@ -437,13 +439,16 @@ class NeuralTagger(BaseThincComponent):
                 yield
     
         def to_bytes(self, **exclude):
    -        serialize = OrderedDict((
    -            ('model', lambda: self.model.to_bytes()),
    -            ('vocab', lambda: self.vocab.to_bytes()),
    -            ('tag_map', lambda: msgpack.dumps(self.vocab.morphology.tag_map,
    -                                             use_bin_type=True,
    -                                             encoding='utf8'))
    -        ))
    +        serialize = OrderedDict()
    +        if self.model in (None, True, False):
    +            serialize['model'] = lambda: self.model
    +        else:
    +            serialize['model'] = self.model.to_bytes
    +        serialize['vocab'] = self.vocab.to_bytes
    +
    +        serialize['tag_map'] = lambda: msgpack.dumps(self.vocab.morphology.tag_map,
    +                                                     use_bin_type=True,
    +                                                     encoding='utf8')
             return util.to_bytes(serialize, exclude)
     
         def from_bytes(self, bytes_data, **exclude):
    
    From 59c4f2749934bb4279b5fdf5301db709317771f2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:14:35 +0200
    Subject: [PATCH 298/649] Add get, set and has methods to Underscore
    
    ---
     spacy/tokens/underscore.py | 9 +++++++++
     1 file changed, 9 insertions(+)
    
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    index 0b10e7afe..6e782647b 100644
    --- a/spacy/tokens/underscore.py
    +++ b/spacy/tokens/underscore.py
    @@ -37,5 +37,14 @@ class Underscore(object):
             else:
                 self._doc.user_data[self._get_key(name)] = value
     
    +    def set(self, name, value):
    +        return self.__setattr__(name, value)
    +
    +    def get(self, name):
    +        return self.__getattr__(name)
    +
    +    def has(self, name):
    +        return name in self._extensions
    +
         def _get_key(self, name):
             return ('._.', name, self._start, self._end)
    
    From 3fc4fe61d2b4a11f681081023e9a26d587a61195 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:15:14 +0200
    Subject: [PATCH 299/649] Fix typo
    
    ---
     spacy/tokens/token.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index c617b382e..f56e7682f 100644
    --- a/spacy/tokens/token.pyx
    +++ b/spacy/tokens/token.pyx
    @@ -28,7 +28,7 @@ cdef class Token:
         @classmethod
         def set_extension(cls, name, default=None, method=None,
                           getter=None, setter=None):
    -        Underscore.span_extensions[name] = (default, method, getter, setter) 
    +        Underscore.token_extensions[name] = (default, method, getter, setter)
     
         @classmethod
         def get_extension(cls, name):
    @@ -285,7 +285,7 @@ cdef class Token:
             def __get__(self):
                 if 'vector_norm' in self.doc.user_token_hooks:
                     return self.doc.user_token_hooks['vector_norm'](self)
    -            vector = self.vector 
    +            vector = self.vector
                 return numpy.sqrt((vector ** 2).sum())
     
         property n_lefts:
    
    From b4fc6b203ca337bdac2f721bc3b950ca46a0d186 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:22:23 +0200
    Subject: [PATCH 300/649] Rename mixin
    
    ---
     website/_includes/_mixins.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 68db1be57..7666889b5 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -149,7 +149,7 @@ mixin code(label, language, prompt, height, icon, wrap)
     
     //- Code blocks to display old/new versions
     
    -mixin code-compare()
    +mixin code-wrapper()
         span.u-inline-block.u-padding-top.u-width-full
             block
     
    
    From 67350fa4962125a61240fd46d8146f1ca900310c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:23:05 +0200
    Subject: [PATCH 301/649] Use better logic for auto-generating component name
    
    Instances don't have __name__, so we try __class__.__name__ as well,
    before giving up and defaulting to repr(component).
    ---
     spacy/language.py | 9 ++++++++-
     1 file changed, 8 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index d40aee3ca..6d39fcd69 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -224,7 +224,14 @@ class Language(object):
                 >>> nlp.add_pipe(component, name='custom_name', last=True)
             """
             if name is None:
    -            name = getattr(component, 'name', component.__name__)
    +            if hasattr(component, 'name'):
    +                name = component.name
    +            elif hasattr(component, '__name__'):
    +                name = component.__name__
    +            elif hasattr(component, '__class__') and hasattr(component.__class__, '__name__'):
    +                name = component.__class__.__name__
    +            else:
    +                name = repr(component)
             if name in self.pipe_names:
                 raise ValueError("'{}' already exists in pipeline.".format(name))
             if sum([bool(before), bool(after), bool(first), bool(last)]) >= 2:
    
    From 43b70651fb6f49947c3135f33a6cb85ef0eaeb78 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:23:37 +0200
    Subject: [PATCH 302/649] Document extension methods on Doc, Token and Span
    
    set_extension, get_extension, has_extension
    ---
     website/api/doc.jade   | 103 +++++++++++++++++++++++++++++++++++++++++
     website/api/span.jade  | 103 +++++++++++++++++++++++++++++++++++++++++
     website/api/token.jade | 103 +++++++++++++++++++++++++++++++++++++++++
     3 files changed, 309 insertions(+)
    
    diff --git a/website/api/doc.jade b/website/api/doc.jade
    index 85932c605..9ba942e26 100644
    --- a/website/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -138,6 +138,109 @@ p Get the number of tokens in the document.
             +cell int
             +cell The number of tokens in the document.
     
    ++h(2, "set_extension") Doc.set_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p
    +    |  Define a custom attribute on the #[code Doc] which becomes available via
    +    |  #[code Doc._]. For details, see the documentation on
    +    |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
    +
    ++aside-code("Example").
    +    from spacy.tokens.doc import Doc
    +    city_getter = lambda doc: doc.text in ('New York', 'Paris', 'Berlin')
    +    Doc.set_extension('has_city', getter=city_getter)
    +    doc = nlp(u'I like New York')
    +    assert doc._.has_city
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell
    +            |  Name of the attribute to set by the extension. For example,
    +            |  #[code 'my_attr'] will be available as #[code doc._.my_attr].
    +
    +    +row
    +        +cell #[code default]
    +        +cell -
    +        +cell
    +            |  Optional default value of the attribute if no getter or method
    +            |  is defined.
    +
    +    +row
    +        +cell #[code method]
    +        +cell callable
    +        +cell
    +            |  Set a custom method on the object, for example
    +            |  #[code doc._.compare(other_doc)].
    +
    +    +row
    +        +cell #[code getter]
    +        +cell callable
    +        +cell
    +            |  Getter function that takes the object and returns an attribute
    +            |  value. Is called when the user accesses the #[code ._] attribute.
    +
    +    +row
    +        +cell #[code setter]
    +        +cell callable
    +        +cell
    +            |  Setter function that takes the #[code Doc] and a value, and
    +            |  modifies the object. Is called when the user writes to the
    +            |  #[code Doc._] attribute.
    +
    ++h(2, "get_extension") Doc.get_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p
    +    |  Look up a previously registered extension by name. Returns a 4-tuple
    +    |  #[code.u-break (default, method, getter, setter)] if the extension is
    +    |  registered. Raises a #[code KeyError] otherwise.
    +
    ++aside-code("Example").
    +    from spacy.tokens.doc import Doc
    +    Doc.set_extension('is_city', default=False)
    +    extension = Doc.get_extension('is_city')
    +    assert extension == (False, None, None, None)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the extension.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell tuple
    +        +cell
    +            |  A #[code.u-break (default, method, getter, setter)] tuple of the
    +            |  extension.
    +
    ++h(2, "has_extension") Doc.has_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p Check whether an extension has been registered on the #[code Doc] class.
    +
    ++aside-code("Example").
    +    from spacy.tokens.doc import Doc
    +    Doc.set_extension('is_city', default=False)
    +    assert Doc.has_extension('is_city')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the extension to check.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell Whether the extension has been registered.
    +
     +h(2, "char_span") Doc.char_span
         +tag method
         +tag-new(2)
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 067e709f0..6f3713203 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -116,6 +116,109 @@ p Get the number of tokens in the span.
             +cell int
             +cell The number of tokens in the span.
     
    ++h(2, "set_extension") Span.set_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p
    +    |  Define a custom attribute on the #[code Span] which becomes available via
    +    |  #[code Span._]. For details, see the documentation on
    +    |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
    +
    ++aside-code("Example").
    +    from spacy.tokens.span import Span
    +    city_getter = lambda span: span.text in ('New York', 'Paris', 'Berlin')
    +    Span.set_extension('has_city', getter=city_getter)
    +    doc = nlp(u'I like New York in Autumn')
    +    assert doc[1:4]._.has_city
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell
    +            |  Name of the attribute to set by the extension. For example,
    +            |  #[code 'my_attr'] will be available as #[code span._.my_attr].
    +
    +    +row
    +        +cell #[code default]
    +        +cell -
    +        +cell
    +            |  Optional default value of the attribute if no getter or method
    +            |  is defined.
    +
    +    +row
    +        +cell #[code method]
    +        +cell callable
    +        +cell
    +            |  Set a custom method on the object, for example
    +            |  #[code span._.compare(other_span)].
    +
    +    +row
    +        +cell #[code getter]
    +        +cell callable
    +        +cell
    +            |  Getter function that takes the object and returns an attribute
    +            |  value. Is called when the user accesses the #[code ._] attribute.
    +
    +    +row
    +        +cell #[code setter]
    +        +cell callable
    +        +cell
    +            |  Setter function that takes the #[code Span] and a value, and
    +            |  modifies the object. Is called when the user writes to the
    +            |  #[code Span._] attribute.
    +
    ++h(2, "get_extension") Span.get_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p
    +    |  Look up a previously registered extension by name. Returns a 4-tuple
    +    |  #[code.u-break (default, method, getter, setter)] if the extension is
    +    |  registered. Raises a #[code KeyError] otherwise.
    +
    ++aside-code("Example").
    +    from spacy.tokens.span import Span
    +    Span.set_extension('is_city', default=False)
    +    extension = Span.get_extension('is_city')
    +    assert extension == (False, None, None, None)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the extension.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell tuple
    +        +cell
    +            |  A #[code.u-break (default, method, getter, setter)] tuple of the
    +            |  extension.
    +
    ++h(2, "has_extension") Span.has_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p Check whether an extension has been registered on the #[code Span] class.
    +
    ++aside-code("Example").
    +    from spacy.tokens.span import Span
    +    Span.set_extension('is_city', default=False)
    +    assert Span.has_extension('is_city')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the extension to check.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell Whether the extension has been registered.
    +
     +h(2, "similarity") Span.similarity
         +tag method
         +tag-model("vectors")
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 814a13310..080fe11ee 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -51,6 +51,109 @@ p The number of unicode characters in the token, i.e. #[code token.text].
             +cell int
             +cell The number of unicode characters in the token.
     
    ++h(2, "set_extension") Token.set_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p
    +    |  Define a custom attribute on the #[code Token] which becomes available
    +    |  via #[code Token._]. For details, see the documentation on
    +    |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
    +
    ++aside-code("Example").
    +    from spacy.tokens.token import Token
    +    fruit_getter = lambda token: token.text in ('apple', 'pear', 'banana')
    +    Token.set_extension('is_fruit', getter=fruit_getter)
    +    doc = nlp(u'I have an apple')
    +    assert doc[3]._.is_fruit
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell
    +            |  Name of the attribute to set by the extension. For example,
    +            |  #[code 'my_attr'] will be available as #[code token._.my_attr].
    +
    +    +row
    +        +cell #[code default]
    +        +cell -
    +        +cell
    +            |  Optional default value of the attribute if no getter or method
    +            |  is defined.
    +
    +    +row
    +        +cell #[code method]
    +        +cell callable
    +        +cell
    +            |  Set a custom method on the object, for example
    +            |  #[code token._.compare(other_token)].
    +
    +    +row
    +        +cell #[code getter]
    +        +cell callable
    +        +cell
    +            |  Getter function that takes the object and returns an attribute
    +            |  value. Is called when the user accesses the #[code ._] attribute.
    +
    +    +row
    +        +cell #[code setter]
    +        +cell callable
    +        +cell
    +            |  Setter function that takes the #[code Token] and a value, and
    +            |  modifies the object. Is called when the user writes to the
    +            |  #[code Token._] attribute.
    +
    ++h(2, "get_extension") Token.get_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p
    +    |  Look up a previously registered extension by name. Returns a 4-tuple
    +    |  #[code.u-break (default, method, getter, setter)] if the extension is
    +    |  registered. Raises a #[code KeyError] otherwise.
    +
    ++aside-code("Example").
    +    from spacy.tokens.token import Token
    +    Token.set_extension('is_fruit', default=False)
    +    extension = Token.get_extension('is_fruit')
    +    assert extension == (False, None, None, None)
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the extension.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell tuple
    +        +cell
    +            |  A #[code.u-break (default, method, getter, setter)] tuple of the
    +            |  extension.
    +
    ++h(2, "has_extension") Token.has_extension
    +    +tag classmethod
    +    +tag-new(2)
    +
    +p Check whether an extension has been registered on the #[code Token] class.
    +
    ++aside-code("Example").
    +    from spacy.tokens.token import Token
    +    Token.set_extension('is_fruit', default=False)
    +    assert Token.has_extension('is_fruit')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the extension to check.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell Whether the extension has been registered.
    +
     +h(2, "check_flag") Token.check_flag
         +tag method
     
    
    From 3d5154811a92135f526e8167fa33799f1c178f19 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:24:22 +0200
    Subject: [PATCH 303/649] Fix typo
    
    ---
     website/usage/_visualizers/_html.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/usage/_visualizers/_html.jade b/website/usage/_visualizers/_html.jade
    index 595192442..648a6de80 100644
    --- a/website/usage/_visualizers/_html.jade
    +++ b/website/usage/_visualizers/_html.jade
    @@ -61,7 +61,7 @@ p
             output_path.open('w', encoding='utf-8').write(svg)
     
     p
    -    |  The above code will generate the dependency visualizations and them to
    +    |  The above code will generate the dependency visualizations as to
         |  two files, #[code This-is-an-example.svg] and #[code This-is-another-one.svg].
     
     
    
    From 7a592d01dc068c65bc88b14f8c617e76658d9212 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:24:39 +0200
    Subject: [PATCH 304/649] Update pipeline component usage docs
    
    ---
     website/usage/_data.json                      |   4 +-
     .../_custom-components.jade                   | 246 +++++++++++++++++-
     .../_processing-pipelines/_examples.jade      | 126 ---------
     .../_processing-pipelines/_extensions.jade    | 109 +++++++-
     website/usage/processing-pipelines.jade       |   8 +-
     5 files changed, 347 insertions(+), 146 deletions(-)
     delete mode 100644 website/usage/_processing-pipelines/_examples.jade
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index 25165c3ee..ccd14eee2 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -105,9 +105,9 @@
             "menu": {
                 "How Pipelines Work": "pipelines",
                 "Custom Components": "custom-components",
    +            "Developing Extensions": "extensions",
                 "Multi-threading": "multithreading",
    -            "Serialization": "serialization",
    -            "Developing Extensions": "extensions"
    +            "Serialization": "serialization"
             }
         },
     
    diff --git a/website/usage/_processing-pipelines/_custom-components.jade b/website/usage/_processing-pipelines/_custom-components.jade
    index 13f0cb85c..cfd1782f1 100644
    --- a/website/usage/_processing-pipelines/_custom-components.jade
    +++ b/website/usage/_processing-pipelines/_custom-components.jade
    @@ -1,12 +1,11 @@
     //- 💫 DOCS > USAGE > PROCESSING PIPELINES > CUSTOM COMPONENTS
     
     p
    -    |  A component receives a #[code Doc] object and
    -    |  #[strong performs the actual processing] – for example, using the current
    -    |  weights to make a prediction and set some annotation on the document. By
    -    |  adding a component to the pipeline, you'll get access to the #[code Doc]
    -    |  at any point #[strong during] processing – instead of only being able to
    -    |  modify it afterwards.
    +    |  A component receives a #[code Doc] object and can modify it – for example,
    +    |  by using the current weights to make a prediction and set some annotation
    +    |  on the document. By adding a component to the pipeline, you'll get access
    +    |  to the #[code Doc] at any point #[strong during processing] – instead of
    +    |  only being able to modify it afterwards.
     
     +aside-code("Example").
         def my_component(doc):
    @@ -27,10 +26,10 @@ p
     p
         |  Custom components can be added to the pipeline using the
         |  #[+api("language#add_pipe") #[code add_pipe]] method. Optionally, you
    -    |  can either specify a component to add it before or after, tell spaCy
    -    |  to add it first or last in the pipeline, or define a custom name.
    -    |  If no name is set and no #[code name] attribute is present on your
    -    |  component, the function name, e.g. #[code component.__name__] is used.
    +    |  can either specify a component to add it #[strong before or after], tell
    +    |  spaCy to add it #[strong first or last] in the pipeline, or define a
    +    |  #[strong custom name]. If no name is set and no #[code name] attribute
    +    |  is present on your component, the function name is used.
     
     +code("Adding pipeline components").
         def my_component(doc):
    @@ -67,7 +66,19 @@ p
         nlp.add_pipe(my_component, first=True)
     
     +h(3, "custom-components-attributes")
    -    |  Setting attributes on the #[code Doc], #[code Span] and #[code Token]
    +    |  Extension attributes on #[code Doc], #[code Span] and #[code Token]
    +    +tag-new(2)
    +
    +p
    +    |  As of v2.0, spaCy allows you to set any custom attributes and methods
    +    |  on the #[code Doc], #[code Span] and #[code Token], which become
    +    |  available as #[code Doc._], #[code Span._] and #[code Token._] – for
    +    |  example, #[code Token._.my_attr]. This lets you store additional
    +    |  information relevant to your application, add new features and
    +    |  functionality to spaCy, and implement your own models trained with other
    +    |  machine learning libraries. It also lets you take advantage of spaCy's
    +    |  data structures and the #[code Doc] object as the "single source of
    +    |  truth".
     
     +aside("Why ._?")
         |  Writing to a #[code ._] attribute instead of to the #[code Doc] directly
    @@ -78,9 +89,218 @@ p
         |  what's custom – for example, #[code doc.sentiment] is spaCy, while
         |  #[code doc._.sent_score] isn't.
     
    -+under-construction
    +p
    +    |  There are three main types of extensions, which can be defined using the
    +    |  #[+api("doc#set_extension") #[code Doc.set_extension]],
    +    |  #[+api("span#set_extension") #[code Span.set_extension]] and
    +    |  #[+api("token#set_extension") #[code Token.set_extension]] methods.
     
    -+h(3, "custom-components-user-hooks") Other user hooks
    ++list("numbers")
    +    +item #[strong Attribute extensions].
    +        |  Set a default value for an attribute, which can be overwritten
    +        |  manually at any time. Attribute extensions work like "normal"
    +        |  variables and are the quickest way to store arbitrary information
    +        |  on a #[code Doc], #[code Span] or #[code Token].
    +
    +        +code-wrapper
    +            +code.
    +                Doc.set_extension('hello', default=True)
    +                assert doc._.hello
    +                doc._.hello = False
    +
    +    +item #[strong Property extensions].
    +        |  Define a getter and an optional setter function. If no setter is
    +        |  provided, the extension is immutable. Since the getter and setter
    +        |  functions are only called when you #[em retrieve] the attribute,
    +        |  you can also access values of previously added attribute extensions.
    +        |  For example, a #[code Doc] getter can average over #[code Token]
    +        |   attributes. For #[code Span] extensions, you'll almost always want
    +        |  to use a property – otherwise, you'd have to write to
    +        |  #[em every possible] #[code Span] in the #[code Doc] to set up the
    +        |  values correctly.
    +
    +        +code-wrapper
    +            +code.
    +                Doc.set_extension('hello', getter=get_hello_value, setter=set_hello_value)
    +                assert doc._.hello
    +                doc._.hello = 'Hi!'
    +
    +    +item #[strong Method extensions].
    +        |  Assign a function that becomes available as an object method. Method
    +        |  extensions are always immutable. For more details and implementation
    +        |  ideas, see
    +        |  #[+a("/usage/examples#custom-components-attr-methods") these examples].
    +
    +        +code-wrapper
    +            +code.o-no-block.
    +                Doc.set_extension('hello', method=lambda doc, name: 'Hi {}!'.format(name))
    +                assert doc._.hello('Bob') == 'Hi Bob!'
    +
    +p
    +    |  Before you can access a custom extension, you need to register it using
    +    |  the #[code set_extension] method on the object you want
    +    |  to add it to, e.g. the #[code Doc]. Keep in mind that extensions are
    +    |  always #[strong added globally] and not just on a particular instance.
    +    |  If an attribute of the same name
    +    |  already exists, or if you're trying to access an attribute that hasn't
    +    |  been registered, spaCy will raise an #[code AttributeError].
    +
    ++code("Example").
    +    from spacy.tokens.token import Token
    +    from spacy.tokens.doc import Doc
    +    from spacy.tokens.span import Span
    +
    +    fruits = ['apple', 'pear', 'banana', 'orange', 'strawberry']
    +    is_fruit_getter = lambda token: token.text in fruits
    +    has_fruit_getter = lambda obj: any([t.text in fruits for t in obj])
    +
    +    Token.set_extension('is_fruit', getter=is_fruit_getter)
    +    Doc.set_extension('has_fruit', getter=has_fruit_getter)
    +    Span.set_extension('has_fruit', getter=has_fruit_getter)
    +
    ++aside-code("Usage example").
    +    doc = nlp(u"I have an apple and a melon")
    +    assert doc[3]._.is_fruit      # get Token attributes
    +    assert not doc[0]._.is_fruit
    +    assert doc._.has_fruit        # get Doc attributes
    +    assert doc[1:4]._.has_fruit   # get Span attributes
    +
    +p
    +    |  Once you've registered your custom attribute, you can also use the
    +    |  built-in #[code set], #[code get] and #[code has] methods to modify and
    +    |  retrieve the attributes. This is especially useful it you want to pass in
    +    |  a string instead of calling #[code doc._.my_attr].
    +
    ++table(["Method", "Description", "Valid for", "Example"])
    +    +row
    +        +cell #[code ._.set()]
    +        +cell Set a value for an attribute.
    +        +cell Attributes, mutable properties.
    +        +cell #[code.u-break token._.set('my_attr', True)]
    +
    +    +row
    +        +cell #[code ._.get()]
    +        +cell Get the value of an attribute.
    +        +cell Attributes, mutable properties, immutable properties, methods.
    +        +cell #[code.u-break my_attr = span._.get('my_attr')]
    +
    +    +row
    +        +cell #[code ._.has()]
    +        +cell Check if an attribute exists.
    +        +cell Attributes, mutable properties, immutable properties, methods.
    +        +cell #[code.u-break doc._.has('my_attr')]
    +
    ++infobox("How the ._ is implemented")
    +    |  Extension definitions – the defaults, methods, getters and setters you
    +    |  pass in to #[code set_extension] are stored in class attributes on the
    +    |  #[code Underscore] class. If you write to an extension attribute, e.g.
    +    |  #[code doc._.hello = True], the data is stored within the
    +    |  #[+api("doc#attributes") #[code Doc.user_data]] dictionary. To keep the
    +    |  underscore data separate from your other dictionary entries, the string
    +    |  #[code "._."] is placed before the name, in a tuple.
    +
    ++h(4, "component-example1") Example: Custom sentence segmentation logic
    +
    +p
    +    |  Let's say you want to implement custom logic to improve spaCy's sentence
    +    |  boundary detection. Currently, sentence segmentation is based on the
    +    |  dependency parse, which doesn't always produce ideal results. The custom
    +    |  logic should therefore be applied #[strong after] tokenization, but
    +    |  #[strong before] the dependency parsing – this way, the parser can also
    +    |  take advantage of the sentence boundaries.
    +
    ++code.
    +    def sbd_component(doc):
    +        for i, token in enumerate(doc[:-2]):
    +            # define sentence start if period + titlecase token
    +            if token.text == '.' and doc[i+1].is_title:
    +                doc[i+1].sent_start = True
    +        return doc
    +
    +    nlp = spacy.load('en')
    +    nlp.add_pipe(sbd_component, before='parser')  # insert before the parser
    +
    ++h(4, "component-example2")
    +    |  Example: Pipeline component for entity matching and tagging with
    +    |  custom attributes
    +
    +p
    +    |  This example shows how to create a spaCy extension that takes a
    +    |  terminology list (in this case, single- and multi-word company names),
    +    |  matches the occurences in a document, labels them as #[code ORG] entities,
    +    |  merges the tokens and sets custom #[code is_tech_org] and
    +    |  #[code has_tech_org] attributes. For efficient matching, the example uses
    +    |  the #[+api("phrasematcher") #[code PhraseMatcher]] which accepts
    +    |  #[code Doc] objects as match patterns and works well for large
    +    |  terminology lists. It also ensures your patterns will always match, even
    +    |  when you customise spaCy's tokenization rules. When you call #[code nlp]
    +    |  on a text, the custom pipeline component is applied to the #[code Doc]
    +
    ++github("spacy", "examples/pipeline/custom_component_entities.py", false, 500)
    +
    +p
    +    |  Wrapping this functionality in a
    +    |  pipeline component allows you to reuse the module with different
    +    |  settings, and have all pre-processing taken care of when you call
    +    |  #[code nlp] on your text and receive a #[code Doc] object.
    +
    ++h(4, "component-example3")
    +    |  Example: Pipeline component for GPE entities and country meta data via a
    +    |  REST API
    +
    +p
    +    |  This example shows the implementation of a pipeline component
    +    |  that fetches country meta data via the
    +    |  #[+a("https://restcountries.eu") REST Countries API] sets entity
    +    |  annotations for countries, merges entities into one token and
    +    |  sets custom attributes on the #[code Doc], #[code Span] and
    +    |  #[code Token] – for example, the capital, latitude/longitude coordinates
    +    |  and even the country flag.
    +
    ++github("spacy", "examples/pipeline/custom_component_countries_api.py", false, 500)
    +
    +p
    +    |  In this case, all data can be fetched on initialisation in one request.
    +    |  However, if you're working with text that contains incomplete country
    +    |  names, spelling mistakes or foreign-language versions, you could also
    +    |  implement a #[code like_country]-style getter function that makes a
    +    |  request to the search API endpoint and returns the best-matching
    +    |  result.
    +
    ++h(4, "custom-components-usage-ideas") Other usage ideas
    +
    ++list
    +    +item
    +        |  #[strong Adding new features and hooking in models]. For example,
    +        |  a sentiment analysis model, or your preferred solution for
    +        |  lemmatization or sentiment analysis. spaCy's built-in tagger,
    +        |  parser and entity recognizer respect annotations that were already
    +        |  set on the #[code Doc] in a previous step of the pipeline.
    +    +item
    +        |  #[strong Integrating other libraries and APIs]. For example, your
    +        |  pipeline component can write additional information and data
    +        |  directly to the #[code Doc] or #[code Token] as custom attributes,
    +        |  while making sure no information is lost in the process. This can
    +        |  be output generated by other libraries and models, or an external
    +        |  service with a REST API.
    +    +item
    +        |  #[strong Debugging and logging]. For example, a component which
    +        |  stores and/or exports relevant information about the current state
    +        |  of the processed document, and insert it at any point of your
    +        |  pipeline.
    +
    ++infobox("Developing third-party extensions")
    +    |  The new pipeline management and custom attributes finally make it easy
    +    |  to develop your own spaCy extensions and plugins and share them with
    +    |  others. Extensions can claim their own #[code ._] namespace and exist as
    +    |  standalone packages. If you're developing a tool or library and want to
    +    |  make it easy for others to use it with spaCy and add it to their
    +    |  pipeline, all you have to do is expose a function that takes a
    +    |  #[code Doc], modifies it and returns it. For more details and
    +    |  #[strong best practices], see the section on
    +    |  #[+a("#extensions") developing spaCy extensions].
    +
    ++h(3, "custom-components-user-hooks") User hooks
     
     p
         |  While it's generally recommended to use the #[code Doc._], #[code Span._]
    diff --git a/website/usage/_processing-pipelines/_examples.jade b/website/usage/_processing-pipelines/_examples.jade
    deleted file mode 100644
    index 616bed32c..000000000
    --- a/website/usage/_processing-pipelines/_examples.jade
    +++ /dev/null
    @@ -1,126 +0,0 @@
    -//- 💫 DOCS > USAGE > PROCESSING PIPELINES > EXAMPLES
    -
    -p
    -    |  To see real-world examples of pipeline factories and components in action,
    -    |  you can have a look at the source of spaCy's built-in components, e.g.
    -    |  the #[+api("tagger") #[code Tagger]], #[+api("parser") #[code Parser]] or
    -    |  #[+api("entityrecognizer") #[code EntityRecongnizer]].
    -
    -+h(3, "example1") Example: Custom sentence segmentation logic
    -
    -p
    -    |  Let's say you want to implement custom logic to improve spaCy's sentence
    -    |  boundary detection. Currently, sentence segmentation is based on the
    -    |  dependency parse, which doesn't always produce ideal results. The custom
    -    |  logic should therefore be applied #[strong after] tokenization, but
    -    |  #[strong before] the dependency parsing – this way, the parser can also
    -    |  take advantage of the sentence boundaries.
    -
    -+code.
    -    def sbd_component(doc):
    -        for i, token in enumerate(doc[:-2]):
    -            # define sentence start if period + titlecase token
    -            if token.text == '.' and doc[i+1].is_title:
    -                doc[i+1].sent_start = True
    -        return doc
    -
    -p
    -    |  In this case, we simply want to add the component to the existing
    -    |  pipeline of the English model. We can do this by inserting it at index 0
    -    |  of #[code nlp.pipeline]:
    -
    -+code.
    -    nlp = spacy.load('en')
    -    nlp.pipeline.insert(0, sbd_component)
    -
    -p
    -    |  When you call #[code nlp] on some text, spaCy will tokenize it to create
    -    |  a #[code Doc] object, and first call #[code sbd_component] on it, followed
    -    |  by the model's default pipeline.
    -
    -+h(3, "example2") Example: Sentiment model
    -
    -p
    -    |  Let's say you have trained your own document sentiment model on English
    -    |  text. After tokenization, you want spaCy to first execute the
    -    |  #[strong default tensorizer], followed by a custom
    -    |  #[strong sentiment component] that adds a #[code .sentiment]
    -    |  property to the #[code Doc], containing your model's sentiment precition.
    -
    -p
    -    |  Your component class will have a #[code from_disk()] method that spaCy
    -    |  calls to load the model data. When called, the component will compute
    -    |  the sentiment score, add it to the #[code Doc] and return the modified
    -    |  document. Optionally, the component can include an #[code update()] method
    -    |  to allow training the model.
    -
    -+code.
    -    import pickle
    -    from pathlib import Path
    -
    -    class SentimentComponent(object):
    -        def __init__(self, vocab):
    -            self.weights = None
    -
    -        def __call__(self, doc):
    -            doc.sentiment = sum(self.weights*doc.vector) # set sentiment property
    -            return doc
    -
    -        def from_disk(self, path): # path = model path + factory ID ('sentiment')
    -            self.weights = pickle.load(Path(path) / 'weights.bin') # load weights
    -            return self
    -
    -        def update(self, doc, gold): # update weights – allows training!
    -            prediction = sum(self.weights*doc.vector)
    -            self.weights -= 0.001*doc.vector*(prediction-gold.sentiment)
    -
    -p
    -    |  The factory will initialise the component with the #[code Vocab] object.
    -    |  To be able to add it to your model's pipeline as #[code 'sentiment'],
    -    |  it also needs to be registered via
    -    |  #[+api("spacy#set_factory") #[code set_factory()]].
    -
    -+code.
    -    def sentiment_factory(vocab):
    -        component = SentimentComponent(vocab) # initialise component
    -        return component
    -
    -    spacy.set_factory('sentiment', sentiment_factory)
    -
    -p
    -    |  The above code should be #[strong shipped with your model]. You can use
    -    |  the #[+api("cli#package") #[code package]] command to create all required
    -    |  files and directories. The model package will include an
    -    |  #[+src(gh("spacy-dev-resources", "templates/model/en_model_name/__init__.py")) #[code __init__.py]]
    -    |  with a #[code load()] method, that will initialise the language class with
    -    |  the model's pipeline and call the #[code from_disk()] method to load
    -    |  the model data.
    -
    -p
    -    |  In the model package's meta.json, specify the language class and pipeline
    -    |  IDs:
    -
    -+code("meta.json (excerpt)", "json").
    -    {
    -        "name": "sentiment_model",
    -        "lang": "en",
    -        "version": "1.0.0",
    -        "spacy_version": ">=2.0.0,<3.0.0",
    -        "pipeline": ["tensorizer", "sentiment"]
    -    }
    -
    -p
    -    |  When you load your new model, spaCy will call the model's #[code load()]
    -    |  method. This will return a #[code Language] object with a pipeline
    -    |  containing the default tensorizer, and the sentiment component returned
    -    |  by your custom #[code "sentiment"] factory.
    -
    -+code.
    -    nlp = spacy.load('en_sentiment_model')
    -    doc = nlp(u'I love pizza')
    -    assert doc.sentiment
    -
    -+infobox("Saving and loading models")
    -    |  For more information and a detailed guide on how to package your model,
    -    |  see the documentation on
    -    |  #[+a("/usage/training#saving-loading") saving and loading models].
    diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
    index d512e0321..a27ae6287 100644
    --- a/website/usage/_processing-pipelines/_extensions.jade
    +++ b/website/usage/_processing-pipelines/_extensions.jade
    @@ -1,3 +1,110 @@
     //- 💫 DOCS > USAGE > PROCESSING PIPELINES > DEVELOPING EXTENSIONS
     
    -+under-construction
    +p
    +    |  We're very excited about all the new possibilities for community
    +    |  extensions and plugins in spaCy v2.0, and we can't wait to see what
    +    |  you build with it! To get you started, here are a few tips, tricks and
    +    |  best practices:
    +
    ++list
    +    +item
    +        |  Make sure to choose a #[strong descriptive and specific name] for
    +        |  your pipeline component class, and set it as its #[code name]
    +        |  attribute. Avoid names that are too common or likely to clash with
    +        |  built-in or a user's other custom components. While it's fine to call
    +        |  your package "spacy_my_extension", avoid component names including
    +        |  "spacy", since this can easily lead to confusion.
    +
    +        +code-wrapper
    +            +code-new name = 'myapp_lemmatizer'
    +            +code-old name = 'lemmatizer'
    +
    +    +item
    +        |  When writing to #[code Doc], #[code Token] or #[code Span] objects,
    +        |  #[strong use getter functions] wherever possible, and avoid setting
    +        |  values explicitly. Tokens and spans don't own any data themselves,
    +        |  so you should provide a function that allows them to compute the
    +        |  values instead of writing static properties to individual objects.
    +
    +        +code-wrapper
    +            +code-new.
    +                is_fruit = lambda token: token.text in ('apple', 'orange')
    +                Token.set_extension('is_fruit', getter=is_fruit)
    +            +code-old.
    +                token._.set_extension('is_fruit', default=False)
    +                if token.text in ('apple', 'orange'):
    +                    token._.set('is_fruit', True)
    +
    +    +item
    +        |  Always add your custom attributes to the #[strong global] #[code Doc]
    +        |  #[code Token] or #[code Span] objects, not a particular instance of
    +        |  them. Add the attributes #[strong as early as possible], e.g. in
    +        |  your extension's #[code __init__] method or in the global scope of
    +        |  your module. This means that in the case of namespace collisions,
    +        |  the user will see an error immediately, not just when they run their
    +        |  pipeline.
    +
    +        +code-wrapper
    +            +code-new.
    +                from spacy.tokens.doc import Doc
    +                def __init__(attr='my_attr'):
    +                    Doc.set_extension(attr, getter=self.get_doc_attr)
    +            +code-old.
    +                def __call__(doc):
    +                    doc.set_extension('my_attr', getter=self.get_doc_attr)
    +
    +    +item
    +        |  If your extension is setting properties on the #[code Doc],
    +        |  #[code Token] or #[code Span], include an option to
    +        |  #[strong let the user to change those attribute names]. This makes
    +        |  it easier to avoid namespace collisions and accommodate users with
    +        |  different naming preferences. We recommend adding an #[code attrs]
    +        |  argument to the #[code __init__] method of your class so you can
    +        |  write the names to class attributes and reuse them across your
    +        |  component.
    +
    +        +code-wrapper
    +            +code-new Doc.set_extension(self.doc_attr, default='some value')
    +            +code-old Doc.set_extension('my_doc_attr', default='some value')
    +
    +    +item
    +        |  Ideally, extensions should be #[strong standalone packages] with
    +        |  spaCy and optionally, other packages specified as a dependency. They
    +        |  can freely assign to their own #[code ._] namespace, but should stick
    +        |  to that. If your extension's only job is to provide a better
    +        |  #[code .similarity] implementation, and your docs state this
    +        |  explicitly, there's no problem with writing to the
    +        |  #[+a("#custom-components-user-hooks") #[code user_hooks]], and
    +        |  overwriting spaCy's built-in method. However, a third-party
    +        |  extension should #[strong never silently overwrite built-ins], or
    +        |  attributes set by other extensions.
    +
    +    +item
    +        |  If you're looking to publish a model that depends on a custom
    +        |  pipeline component, you can either #[strong require it] in the model
    +        |  package's dependencies, or – if the component is specific and
    +        |  lightweight – choose to #[strong ship it with your model package]
    +        |  and add it to the #[code Language] instance returned by the
    +        |  model's #[code load()] method. For examples of this, check out the
    +        |  implementations of spaCy's
    +        |  #[+api("util#load_model_from_init_py") #[code load_model_from_init_py()]]
    +        |  and  #[+api("util#load_model_from_path") #[code load_model_from_path()]]
    +        |  utility functions.
    +
    +        +code-wrapper
    +            +code-new.
    +                nlp.add_pipe(my_custom_component)
    +                return nlp.from_disk(model_path)
    +
    +    +item
    +        |  Once you're ready to share your extension with others, make sure to
    +        |  #[strong add docs and installation instructions] (you can
    +        |  always link to this page for more info). Make it easy for others to
    +        |  install and use your extension, for example by uploading it to
    +        |  #[+a("https://pypi.python.org") PyPi]. If you're sharing your code on
    +        |  GitHub, don't forget to tag it
    +        |  with #[+a("https://github.com/search?q=topic%3Aspacy") #[code spacy]]
    +        |  and #[+a("https://github.com/search?q=topic%3Aspacy-pipeline") #[code spacy-pipeline]]
    +        |  to help people find it. If you post it on Twitter, feel free to tag
    +        |  #[+a("https://twitter.com/" + SOCIAL.twitter) @#{SOCIAL.twitter}]
    +        |  so we can check it out.
    diff --git a/website/usage/processing-pipelines.jade b/website/usage/processing-pipelines.jade
    index 346e0554d..045a32ddb 100644
    --- a/website/usage/processing-pipelines.jade
    +++ b/website/usage/processing-pipelines.jade
    @@ -12,6 +12,10 @@ include _spacy-101/_pipelines
         +h(2, "custom-components") Creating custom pipeline components
         include _processing-pipelines/_custom-components
     
    ++section("extensions")
    +    +h(2, "extensions") Developing spaCy extensions
    +    include _processing-pipelines/_extensions
    +
     +section("multithreading")
         +h(2, "multithreading") Multi-threading
         include _processing-pipelines/_multithreading
    @@ -19,7 +23,3 @@ include _spacy-101/_pipelines
     +section("serialization")
         +h(2, "serialization") Serialization
         include _processing-pipelines/_serialization
    -
    -+section("extensions")
    -    +h(2, "extensions") Developing spaCy extensions
    -    include _processing-pipelines/_extensions
    
    From 6679117000ffd8f872ea3b42e89d995bf4307fc4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:26:06 +0200
    Subject: [PATCH 305/649] Add pipeline component examples
    
    ---
     examples/pipeline/custom_attr_methods.py      |  53 +++++++++
     .../custom_component_countries_api.py         | 110 ++++++++++++++++++
     .../pipeline/custom_component_entities.py     |  87 ++++++++++++++
     website/usage/_data.json                      |   1 +
     website/usage/examples.jade                   |  38 ++++++
     5 files changed, 289 insertions(+)
     create mode 100644 examples/pipeline/custom_attr_methods.py
     create mode 100644 examples/pipeline/custom_component_countries_api.py
     create mode 100644 examples/pipeline/custom_component_entities.py
    
    diff --git a/examples/pipeline/custom_attr_methods.py b/examples/pipeline/custom_attr_methods.py
    new file mode 100644
    index 000000000..d99b612a7
    --- /dev/null
    +++ b/examples/pipeline/custom_attr_methods.py
    @@ -0,0 +1,53 @@
    +# coding: utf-8
    +"""This example contains several snippets of methods that can be set via custom
    +Doc, Token or Span attributes in spaCy v2.0. Attribute methods act like
    +they're "bound" to the object and are partially applied – i.e. the object
    +they're called on is passed in as the first argument."""
    +from __future__ import unicode_literals
    +
    +from spacy.lang.en import English
    +from spacy.tokens.doc import Doc
    +from spacy.tokens.span import Span
    +from spacy import displacy
    +from pathlib import Path
    +
    +
    +def to_html(doc, output='/tmp', style='dep'):
    +    """Doc method extension for saving the current state as a displaCy
    +    visualization.
    +    """
    +    # generate filename from first six non-punct tokens
    +    file_name = '-'.join([w.text for w in doc[:6] if not w.is_punct]) + '.html'
    +    output_path = Path(output) / file_name
    +    html = displacy.render(doc, style=style, page=True)  # render markup
    +    output_path.open('w', encoding='utf-8').write(html)  # save to file
    +    print('Saved HTML to {}'.format(output_path))
    +
    +
    +Doc.set_extension('to_html', method=to_html)
    +
    +nlp = English()
    +doc = nlp(u"This is a sentence about Apple.")
    +# add entity manually for demo purposes, to make it work without a model
    +doc.ents = [Span(doc, 5, 6, label=nlp.vocab.strings['ORG'])]
    +doc._.to_html(style='ent')
    +
    +
    +def overlap_tokens(doc, other_doc):
    +    """Get the tokens from the original Doc that are also in the comparison Doc.
    +    """
    +    overlap = []
    +    other_tokens = [token.text for token in other_doc]
    +    for token in doc:
    +        if token.text in other_tokens:
    +            overlap.append(token)
    +    return overlap
    +
    +
    +Doc.set_extension('overlap', method=overlap_tokens)
    +
    +nlp = English()
    +doc1 = nlp(u"Peach emoji is where it has always been.")
    +doc2 = nlp(u"Peach is the superior emoji.")
    +tokens = doc1._.overlap(doc2)
    +print(tokens)
    diff --git a/examples/pipeline/custom_component_countries_api.py b/examples/pipeline/custom_component_countries_api.py
    new file mode 100644
    index 000000000..5a2f3df18
    --- /dev/null
    +++ b/examples/pipeline/custom_component_countries_api.py
    @@ -0,0 +1,110 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +import requests
    +
    +from spacy.lang.en import English
    +from spacy.matcher import PhraseMatcher
    +from spacy.tokens.doc import Doc
    +from spacy.tokens.span import Span
    +from spacy.tokens.token import Token
    +
    +
    +class RESTCountriesComponent(object):
    +    """Example of a spaCy v2.0 pipeline component that requests all countries
    +    via the REST Countries API, merges country names into one token, assigns
    +    entity labels and sets attributes on country tokens, e.g. the capital and
    +    lat/lng coordinates. Can be extended with more details from the API.
    +
    +    REST Countries API: https://restcountries.eu
    +    API License: Mozilla Public License MPL 2.0
    +    """
    +    name = 'rest_countries' # component name, will show up in the pipeline
    +
    +    def __init__(self, nlp, label='GPE'):
    +        """Initialise the pipeline component. The shared nlp instance is used
    +        to initialise the matcher with the shared vocab, get the label ID and
    +        generate Doc objects as phrase match patterns.
    +        """
    +        # Make request once on initialisation and store the data
    +        r = requests.get('https://restcountries.eu/rest/v2/all')
    +        r.raise_for_status()  # make sure requests raises an error if it fails
    +        countries = r.json()
    +
    +        # Convert API response to dict keyed by country name for easy lookup
    +        # This could also be extended using the alternative and foreign language
    +        # names provided by the API
    +        self.countries = {c['name']: c for c in countries}
    +        self.label = nlp.vocab.strings[label]  # get entity label ID
    +
    +        # Set up the PhraseMatcher with Doc patterns for each country name
    +        patterns = [nlp(c) for c in self.countries.keys()]
    +        self.matcher = PhraseMatcher(nlp.vocab)
    +        self.matcher.add('COUNTRIES', None, *patterns)
    +
    +        # Register attribute on the Token. We'll be overwriting this based on
    +        # the matches, so we're only setting a default value, not a getter.
    +        # If no default value is set, it defaults to None.
    +        Token.set_extension('is_country', default=False)
    +        Token.set_extension('country_capital')
    +        Token.set_extension('country_latlng')
    +        Token.set_extension('country_flag')
    +
    +        # Register attributes on Doc and Span via a getter that checks if one of
    +        # the contained tokens is set to is_country == True.
    +        Doc.set_extension('has_country', getter=self.has_country)
    +        Span.set_extension('has_country', getter=self.has_country)
    +
    +
    +    def __call__(self, doc):
    +        """Apply the pipeline component on a Doc object and modify it if matches
    +        are found. Return the Doc, so it can be processed by the next component
    +        in the pipeline, if available.
    +        """
    +        matches = self.matcher(doc)
    +        spans = []  # keep the spans for later so we can merge them afterwards
    +        for _, start, end in matches:
    +            # Generate Span representing the entity & set label
    +            entity = Span(doc, start, end, label=self.label)
    +            spans.append(entity)
    +            # Set custom attribute on each token of the entity
    +            # Can be extended with other data returned by the API, like
    +            # currencies, country code, flag, calling code etc.
    +            for token in entity:
    +                token._.set('is_country', True)
    +                token._.set('country_capital', self.countries[entity.text]['capital'])
    +                token._.set('country_latlng', self.countries[entity.text]['latlng'])
    +                token._.set('country_flag', self.countries[entity.text]['flag'])
    +            # Overwrite doc.ents and add entity – be careful not to replace!
    +            doc.ents = list(doc.ents) + [entity]
    +        for span in spans:
    +            # Iterate over all spans and merge them into one token. This is done
    +            # after setting the entities – otherwise, it would cause mismatched
    +            # indices!
    +            span.merge()
    +        return doc  # don't forget to return the Doc!
    +
    +    def has_country(self, tokens):
    +        """Getter for Doc and Span attributes. Returns True if one of the tokens
    +        is a country. Since the getter is only called when we access the
    +        attribute, we can refer to the Token's 'is_country' attribute here,
    +        which is already set in the processing step."""
    +        return any([t._.get('is_country') for t in tokens])
    +
    +
    +# For simplicity, we start off with only the blank English Language class and
    +# no model or pre-defined pipeline loaded.
    +
    +nlp = English()
    +rest_countries = RESTCountriesComponent(nlp)  # initialise component
    +nlp.add_pipe(rest_countries) # add it to the pipeline
    +
    +doc = nlp(u"Some text about Colombia and the Czech Republic")
    +
    +print('Pipeline', nlp.pipe_names)  # pipeline contains component name
    +print('Doc has countries', doc._.has_country)  # Doc contains countries
    +for token in doc:
    +    if token._.is_country:
    +        print(token.text, token._.country_capital, token._.country_latlng,
    +              token._.country_flag)  # country data
    +print('Entities', [(e.text, e.label_) for e in doc.ents])  # all countries are entities
    diff --git a/examples/pipeline/custom_component_entities.py b/examples/pipeline/custom_component_entities.py
    new file mode 100644
    index 000000000..3f9163b83
    --- /dev/null
    +++ b/examples/pipeline/custom_component_entities.py
    @@ -0,0 +1,87 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +from spacy.lang.en import English
    +from spacy.matcher import PhraseMatcher
    +from spacy.tokens.doc import Doc
    +from spacy.tokens.span import Span
    +from spacy.tokens.token import Token
    +
    +
    +class TechCompanyRecognizer(object):
    +    """Example of a spaCy v2.0 pipeline component that sets entity annotations
    +    based on list of single or multiple-word company names. Companies are
    +    labelled as ORG and their spans are merged into one token. Additionally,
    +    ._.has_tech_org and ._.is_tech_org is set on the Doc/Span and Token
    +    respectively."""
    +    name = 'tech_companies'  # component name, will show up in the pipeline
    +
    +    def __init__(self, nlp, companies=tuple(), label='ORG'):
    +        """Initialise the pipeline component. The shared nlp instance is used
    +        to initialise the matcher with the shared vocab, get the label ID and
    +        generate Doc objects as phrase match patterns.
    +        """
    +        self.label = nlp.vocab.strings[label]  # get entity label ID
    +
    +        # Set up the PhraseMatcher – it can now take Doc objects as patterns,
    +        # so even if the list of companies is long, it's very efficient
    +        patterns = [nlp(org) for org in companies]
    +        self.matcher = PhraseMatcher(nlp.vocab)
    +        self.matcher.add('TECH_ORGS', None, *patterns)
    +
    +        # Register attribute on the Token. We'll be overwriting this based on
    +        # the matches, so we're only setting a default value, not a getter.
    +        Token.set_extension('is_tech_org', default=False)
    +
    +        # Register attributes on Doc and Span via a getter that checks if one of
    +        # the contained tokens is set to is_tech_org == True.
    +        Doc.set_extension('has_tech_org', getter=self.has_tech_org)
    +        Span.set_extension('has_tech_org', getter=self.has_tech_org)
    +
    +    def __call__(self, doc):
    +        """Apply the pipeline component on a Doc object and modify it if matches
    +        are found. Return the Doc, so it can be processed by the next component
    +        in the pipeline, if available.
    +        """
    +        matches = self.matcher(doc)
    +        spans = []  # keep the spans for later so we can merge them afterwards
    +        for _, start, end in matches:
    +            # Generate Span representing the entity & set label
    +            entity = Span(doc, start, end, label=self.label)
    +            spans.append(entity)
    +            # Set custom attribute on each token of the entity
    +            for token in entity:
    +                token._.set('is_tech_org', True)
    +            # Overwrite doc.ents and add entity – be careful not to replace!
    +            doc.ents = list(doc.ents) + [entity]
    +        for span in spans:
    +            # Iterate over all spans and merge them into one token. This is done
    +            # after setting the entities – otherwise, it would cause mismatched
    +            # indices!
    +            span.merge()
    +        return doc  # don't forget to return the Doc!
    +
    +    def has_tech_org(self, tokens):
    +        """Getter for Doc and Span attributes. Returns True if one of the tokens
    +        is a tech org. Since the getter is only called when we access the
    +        attribute, we can refer to the Token's 'is_tech_org' attribute here,
    +        which is already set in the processing step."""
    +        return any([t._.get('is_tech_org') for t in tokens])
    +
    +
    +# For simplicity, we start off with only the blank English Language class and
    +# no model or pre-defined pipeline loaded.
    +
    +nlp = English()
    +companies = ['Alphabet Inc.', 'Google', 'Netflix', 'Apple']  # etc.
    +component = TechCompanyRecognizer(nlp, companies)  # initialise component
    +nlp.add_pipe(component, last=True)  # add it to the pipeline as the last element
    +
    +doc = nlp(u"Alphabet Inc. is the company behind Google.")
    +
    +print('Pipeline', nlp.pipe_names)  # pipeline contains component name
    +print('Tokens', [t.text for t in doc])  # company names from the list are merged
    +print('Doc has_tech_org', doc._.has_tech_org)  # Doc contains tech orgs
    +print('Token 0 is_tech_org', doc[0]._.is_tech_org)  # "Alphabet Inc." is a tech org
    +print('Token 1 is_tech_org', doc[1]._.is_tech_org)  # "is" is not
    +print('Entities', [(e.text, e.label_) for e in doc.ents])  # all orgs are entities
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index ccd14eee2..06b0371ae 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -195,6 +195,7 @@
             "teaser": "Full code examples you can modify and run.",
             "next": "resources",
             "menu": {
    +            "Pipeline": "pipeline",
                 "Matching": "matching",
                 "Training": "training",
                 "Deep Learning": "deep-learning"
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 75d05e339..5dfeaf2a7 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -2,6 +2,44 @@
     
     include ../_includes/_mixins
     
    ++section("pipeline")
    +    +h(3, "custom-components-entities") Custom pipeline components and attribute extensions
    +        +tag-new(2)
    +
    +    p
    +        |  This example shows the implementation of a pipeline component
    +        |  that sets entity annotations based on a list of single or
    +        |  multiple-word company names, merges entities into one token and
    +        |  sets custom attributes on the #[code Doc], #[code Span] and
    +        |  #[code Token].
    +
    +    +github("spacy", "examples/pipeline/custom_component_entities.py")
    +
    +    +h(3, "custom-components-api")
    +        |  Custom pipeline components and attribute extensions via a REST API
    +        +tag-new(2)
    +
    +    p
    +        |  This example shows the implementation of a pipeline component
    +        |  that fetches country meta data via the
    +        |  #[+a("https://restcountries.eu") REST Countries API] sets entity
    +        |  annotations for countries, merges entities into one token and
    +        |  sets custom attributes on the #[code Doc], #[code Span] and
    +        |  #[code Token] – for example, the capital, latitude/longitude
    +        |  coordinates and the country flag.
    +
    +    +github("spacy", "examples/pipeline/custom_component_countries_api.py")
    +
    +    +h(3, "custom-components-attr-methods") Custom method extensions
    +        +tag-new(2)
    +
    +    p
    +        |  A collection of snippets showing examples of extensions adding
    +        |  custom methods to the #[code Doc], #[code Token] and
    +        |  #[code Span].
    +
    +    +github("spacy", "examples/pipeline/custom_attr_methods.py")
    +
     +section("matching")
         +h(3, "matcher") Using spaCy's rule-based matcher
     
    
    From 8265b90c839becc1efd3fe4192000c455788af90 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 21:55:20 -0500
    Subject: [PATCH 306/649] Update parser defaults
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 8f74721b1..a8a1d4334 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,10 +239,10 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 0))
             token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
             hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 128))
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 1))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 3))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
             hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
             hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
    
    From dce8afb9cfcc4dc3987fb70ea6cbaec5d08e6fe9 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 21:55:55 -0500
    Subject: [PATCH 307/649] Set prefix length to 3
    
    ---
     spacy/lang/lex_attrs.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/lang/lex_attrs.py b/spacy/lang/lex_attrs.py
    index d4beebd26..63695d8a1 100644
    --- a/spacy/lang/lex_attrs.py
    +++ b/spacy/lang/lex_attrs.py
    @@ -126,7 +126,7 @@ def word_shape(text):
     LEX_ATTRS = {
         attrs.LOWER: lambda string: string.lower(),
         attrs.NORM: lambda string: string.lower(),
    -    attrs.PREFIX: lambda string: string[0],
    +    attrs.PREFIX: lambda string: string[:3],
         attrs.SUFFIX: lambda string: string[-3:],
         attrs.CLUSTER: lambda string: 0,
         attrs.IS_ALPHA: lambda string: string.isalpha(),
    
    From a6352403982da4211cb83a80ae8bdee2fc861a7b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 22:03:26 -0500
    Subject: [PATCH 308/649] Add conll_ner2json converter
    
    ---
     spacy/cli/converters/conll_ner2json.py | 50 ++++++++++++++++++++++++++
     1 file changed, 50 insertions(+)
     create mode 100644 spacy/cli/converters/conll_ner2json.py
    
    diff --git a/spacy/cli/converters/conll_ner2json.py b/spacy/cli/converters/conll_ner2json.py
    new file mode 100644
    index 000000000..e3bd82e7e
    --- /dev/null
    +++ b/spacy/cli/converters/conll_ner2json.py
    @@ -0,0 +1,50 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +from ...compat import json_dumps, path2str
    +from ...util import prints
    +from ...gold import iob_to_biluo
    +
    +
    +def conll_ner2json(input_path, output_path, n_sents=10, use_morphology=False):
    +    """
    +    Convert files in the CoNLL-2003 NER format into JSON format for use with train cli.
    +    """
    +    docs = read_conll_ner(input_path)
    +
    +    output_filename = input_path.parts[-1].replace(".conll", "") + ".json"
    +    output_filename = input_path.parts[-1].replace(".conll", "") + ".json"
    +    output_file = output_path / output_filename
    +    with output_file.open('w', encoding='utf-8') as f:
    +        f.write(json_dumps(docs))
    +    prints("Created %d documents" % len(docs),
    +           title="Generated output file %s" % path2str(output_file))
    +
    +
    +def read_conll_ner(input_path):
    +    text = input_path.open('r', encoding='utf-8').read()
    +    i = 0
    +    delimit_docs = '-DOCSTART- -X- O O'
    +    output_docs = []
    +    for doc in text.strip().split(delimit_docs):
    +        doc = doc.strip()
    +        if not doc:
    +            continue
    +        output_doc = []
    +        for sent in doc.split('\n\n'):
    +            sent = sent.strip()
    +            if not sent:
    +                continue
    +            lines = [line.strip() for line in sent.split('\n') if line.strip()]
    +            words, tags, chunks, iob_ents = zip(*[line.split() for line in lines])
    +            biluo_ents = iob_to_biluo(iob_ents)
    +            output_doc.append({'tokens': [
    +                {'orth': w, 'tag': tag, 'ner': ent} for (w, tag, ent) in
    +                zip(words, tags, biluo_ents)
    +            ]})
    +        output_docs.append({
    +            'id': len(output_docs),
    +            'paragraphs': [{'sentences': output_doc}]
    +        })
    +        output_doc = []
    +    return output_docs
    
    From 9c96a6e1316e716858b2ceae2f9ff094ebf4a601 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 06:33:50 +0200
    Subject: [PATCH 309/649] Update pipelines section in v2 overview
    
    ---
     website/usage/v2.jade | 36 +++++++++++++++++++++---------------
     1 file changed, 21 insertions(+), 15 deletions(-)
    
    diff --git a/website/usage/v2.jade b/website/usage/v2.jade
    index 8737c0b76..148d8e4bf 100644
    --- a/website/usage/v2.jade
    +++ b/website/usage/v2.jade
    @@ -102,30 +102,36 @@ p
         +h(3, "features-pipelines") Improved processing pipelines
     
         +aside-code("Example").
    -        # Modify an existing pipeline
    -        nlp = spacy.load('en')
    -        nlp.pipeline.append(my_component)
    +        # Set custom attributes
    +        Doc.set_extension('my_attr', default=False)
    +        Token.set_extension('my_attr', getter=my_token_getter)
    +        assert doc._.my_attr, token._.my_attr
     
    -        # Register a factory to create a component
    -        spacy.set_factory('my_factory', my_factory)
    -        nlp = Language(pipeline=['my_factory', mycomponent])
    +        # Add components to the pipeline
    +        my_component = lambda doc: doc
    +        nlp.add_pipe(my_component)
     
         p
             |  It's now much easier to #[strong customise the pipeline] with your own
    -        |  components, functions that receive a #[code Doc] object, modify and
    -        |  return it. If your component is stateful, you can define and register a
    -        |  factory which receives the shared #[code Vocab] object and returns a
    -        |  component. spaCy's default components can be added to your pipeline by
    -        |  using their string IDs. This way, you won't have to worry about finding
    -        |  and implementing them – simply add #[code "tagger"] to the pipeline,
    -        |  and spaCy will know what to do.
    +        |  components: functions that receive a #[code Doc] object, modify and
    +        |  return it. Extensions let you write any
    +        |  #[strong attributes, properties and methods] to the #[code Doc],
    +        |  #[code Token] and #[code Span]. You can add data, implement new
    +        |  features, integrate other libraries with spaCy or plug in your own
    +        |  machine learning models.
     
         +image
             include ../assets/img/pipeline.svg
     
         +infobox
    -        |  #[+label-inline API:] #[+api("language") #[code Language]]
    -        |  #[+label-inline Usage:] #[+a("/usage/language-processing-pipeline") Processing text]
    +        |  #[+label-inline API:] #[+api("language") #[code Language]],
    +        |  #[+api("doc#set_extension") #[code Doc.set_extension]],
    +        |  #[+api("span#set_extension") #[code Span.set_extension]],
    +        |  #[+api("token#set_extension") #[code Token.set_extension]]
    +        |  #[+label-inline Usage:]
    +        |  #[+a("/usage/processing-pipelines") Processing pipelines]
    +        |  #[+label-inline Code:]
    +        |  #[+src("/usage/examples#section-pipeline") Pipeline examples]
     
         +h(3, "features-text-classification") Text classification
     
    
    From 19598ebfee025c5ebfe494ad497c984ca4e3194f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 06:38:11 +0200
    Subject: [PATCH 310/649] Update migration guide
    
    ---
     website/usage/v2.jade | 13 +++++++------
     1 file changed, 7 insertions(+), 6 deletions(-)
    
    diff --git a/website/usage/v2.jade b/website/usage/v2.jade
    index 148d8e4bf..66304c860 100644
    --- a/website/usage/v2.jade
    +++ b/website/usage/v2.jade
    @@ -484,15 +484,16 @@ p
         p
             |  If you've been using custom pipeline components, check out the new
             |  guide on #[+a("/usage/language-processing-pipelines") processing pipelines].
    -        |  Appending functions to the pipeline still works – but you might be able
    -        |  to make this more convenient by registering "component factories".
    -        |  Components of the processing pipeline can now be disabled by passing a
    -        |  list of their names to the #[code disable] keyword argument on loading
    -        |  or processing.
    +        |  Appending functions to the pipeline still works – but the
    +        |  #[+api("language#add_pipe") #[code add_pipe]] methods now makes this
    +        |  much more convenient. Components of the processing pipeline can now
    +        |  be disabled by passing a list of their names to the #[code disable]
    +        |  keyword argument on load, or by simply demoving them from the
    +        |  pipeline alltogether.
     
         +code-new.
             nlp = spacy.load('en', disable=['tagger', 'ner'])
    -        doc = nlp(u"I don't want parsed", disable=['parser'])
    +        nlp.remove_pipe('parser')
         +code-old.
             nlp = spacy.load('en', tagger=False, entity=False)
             doc = nlp(u"I don't want parsed", parse=False)
    
    From 97c9b5db8b6219d53967a136fa9fdd63bd06fca5 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 23:41:16 -0500
    Subject: [PATCH 311/649] Patch spacy.train for new pipeline management
    
    ---
     spacy/cli/train.py | 9 ++++++++-
     1 file changed, 8 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index b605f4e61..35ce4c43b 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -88,9 +88,11 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
         n_train_words = corpus.count_train()
     
         lang_class = util.get_lang_class(lang)
    -    nlp = lang_class(pipeline=pipeline)
    +    nlp = lang_class()
         if vectors:
             util.load_model(vectors, vocab=nlp.vocab)
    +    for name in pipeline:
    +        nlp.add_pipe(nlp.create_pipe(name), name=name)
         optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu)
         nlp._optimizer = None
     
    @@ -113,6 +115,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     epoch_model_path = output_path / ('model%d' % i)
                     nlp.to_disk(epoch_model_path)
                     nlp_loaded = lang_class(pipeline=pipeline)
    +                for name in pipeline:
    +                    nlp_loaded.add_pipe(nlp.create_pipe(name), name=name)
                     nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
                     dev_docs = list(corpus.dev_docs(
                                     nlp_loaded,
    @@ -128,6 +132,9 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                         gpu_wps = nwords/(end_time-start_time)
                         with Model.use_device('cpu'):
                             nlp_loaded = lang_class(pipeline=pipeline)
    +                        for name in pipeline:
    +                            nlp_loaded.add_pipe(nlp.create_pipe(name), name=name)
    +
                             nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
                             dev_docs = list(corpus.dev_docs(
                                             nlp_loaded, gold_preproc=gold_preproc))
    
    From 8143618497399543cbceb8c895cc071961094d43 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 19:32:54 +0200
    Subject: [PATCH 312/649] Set prefix length back to 1
    
    ---
     spacy/lang/lex_attrs.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/lang/lex_attrs.py b/spacy/lang/lex_attrs.py
    index 63695d8a1..d4beebd26 100644
    --- a/spacy/lang/lex_attrs.py
    +++ b/spacy/lang/lex_attrs.py
    @@ -126,7 +126,7 @@ def word_shape(text):
     LEX_ATTRS = {
         attrs.LOWER: lambda string: string.lower(),
         attrs.NORM: lambda string: string.lower(),
    -    attrs.PREFIX: lambda string: string[:3],
    +    attrs.PREFIX: lambda string: string[0],
         attrs.SUFFIX: lambda string: string[-3:],
         attrs.CLUSTER: lambda string: 0,
         attrs.IS_ALPHA: lambda string: string.isalpha(),
    
    From 5156074df17ee361e1d1444d48118886012b9911 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 12:51:20 -0500
    Subject: [PATCH 313/649] Make loading code more consistent in train command
    
    ---
     spacy/cli/train.py | 11 ++---------
     1 file changed, 2 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 35ce4c43b..05d035769 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -114,10 +114,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     util.set_env_log(False)
                     epoch_model_path = output_path / ('model%d' % i)
                     nlp.to_disk(epoch_model_path)
    -                nlp_loaded = lang_class(pipeline=pipeline)
    -                for name in pipeline:
    -                    nlp_loaded.add_pipe(nlp.create_pipe(name), name=name)
    -                nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
    +                nlp_loaded = util.load_model_from_path(epoch_model_path)
                     dev_docs = list(corpus.dev_docs(
                                     nlp_loaded,
                                     gold_preproc=gold_preproc))
    @@ -131,11 +128,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     else:
                         gpu_wps = nwords/(end_time-start_time)
                         with Model.use_device('cpu'):
    -                        nlp_loaded = lang_class(pipeline=pipeline)
    -                        for name in pipeline:
    -                            nlp_loaded.add_pipe(nlp.create_pipe(name), name=name)
    -
    -                        nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
    +                        nlp_loaded = util.load_model_from_path(epoch_model_path)
                             dev_docs = list(corpus.dev_docs(
                                             nlp_loaded, gold_preproc=gold_preproc))
                             start_time = timer()
    
    From 3065f12ef206d13db3544213266973dcc2b08aa3 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 22:57:31 +0200
    Subject: [PATCH 314/649] Make add parser label work for hidden_depth=0
    
    ---
     spacy/syntax/nn_parser.pyx | 19 ++++++++++++++-----
     1 file changed, 14 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index a8a1d4334..939414bd3 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -800,11 +800,20 @@ cdef class Parser:
             if self.model not in (True, False, None) and resized:
                 # Weights are stored in (nr_out, nr_in) format, so we're basically
                 # just adding rows here.
    -            smaller = self.model[-1]._layers[-1]
    -            larger = Affine(self.moves.n_moves, smaller.nI)
    -            copy_array(larger.W[:smaller.nO], smaller.W)
    -            copy_array(larger.b[:smaller.nO], smaller.b)
    -            self.model[-1]._layers[-1] = larger
    +            if self.model[-1].is_noop:
    +                smaller = self.model[1]
    +                dims = dict(self.model[1]._dims)
    +                dims['nO'] = self.moves.n_moves
    +                larger = self.model[1].__class__(**dims)
    +                copy_array(larger.W[:, :smaller.nO], smaller.W)
    +                copy_array(larger.b[:smaller.nO], smaller.b)
    +                self.model = (self.model[0], larger, self.model[2])
    +            else:
    +                smaller = self.model[-1]._layers[-1]
    +                larger = Affine(self.moves.n_moves, smaller.nI)
    +                copy_array(larger.W[:smaller.nO], smaller.W)
    +                copy_array(larger.b[:smaller.nO], smaller.b)
    +                self.model[-1]._layers[-1] = larger
     
         def begin_training(self, gold_tuples, pipeline=None, **cfg):
             if 'model' in cfg:
    
    From d84136b4a9eb716be5771ed5634be6fef4c740ef Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 22:57:41 +0200
    Subject: [PATCH 315/649] Update add label test
    
    ---
     spacy/tests/parser/test_add_label.py | 8 +++++---
     1 file changed, 5 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/tests/parser/test_add_label.py b/spacy/tests/parser/test_add_label.py
    index b89cca113..3fbfc96a6 100644
    --- a/spacy/tests/parser/test_add_label.py
    +++ b/spacy/tests/parser/test_add_label.py
    @@ -22,14 +22,14 @@ def vocab():
     @pytest.fixture
     def parser(vocab):
         parser = NeuralDependencyParser(vocab)
    -    parser.cfg['token_vector_width'] = 4
    -    parser.cfg['hidden_width'] = 6
    +    parser.cfg['token_vector_width'] = 8
    +    parser.cfg['hidden_width'] = 30
         parser.cfg['hist_size'] = 0
         parser.add_label('left')
         parser.begin_training([], **parser.cfg)
         sgd = Adam(NumpyOps(), 0.001)
     
    -    for i in range(30):
    +    for i in range(10):
             losses = {}
             doc = Doc(vocab, words=['a', 'b', 'c', 'd'])
             gold = GoldParse(doc, heads=[1, 1, 3, 3],
    @@ -37,6 +37,8 @@ def parser(vocab):
             parser.update([doc], [gold], sgd=sgd, losses=losses)
         return parser
     
    +def test_init_parser(parser):
    +    pass
     
     def test_add_label(parser):
         doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
    
    From 0c2343d73abc5410ddc51816e48e92c56d3c548c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 02:22:49 +0200
    Subject: [PATCH 316/649] Tidy up language data
    
    ---
     spacy/lang/bn/__init__.py  |  8 +++-----
     spacy/lang/da/__init__.py  |  1 -
     spacy/lang/de/__init__.py  |  1 -
     spacy/lang/en/__init__.py  |  1 -
     spacy/lang/es/__init__.py  |  1 -
     spacy/lang/fi/__init__.py  |  1 -
     spacy/lang/fr/__init__.py  |  1 -
     spacy/lang/he/__init__.py  |  1 -
     spacy/lang/hu/__init__.py  |  1 -
     spacy/lang/id/__init__.py  |  2 --
     spacy/lang/id/lex_attrs.py |  3 +--
     spacy/lang/it/__init__.py  |  1 -
     spacy/lang/nb/__init__.py  |  1 -
     spacy/lang/nl/__init__.py  |  1 -
     spacy/lang/pl/__init__.py  |  1 -
     spacy/lang/pt/__init__.py  |  1 -
     spacy/lang/sv/__init__.py  |  1 -
     spacy/lang/th/__init__.py  | 25 ++++++++++++++-----------
     spacy/lang/xx/__init__.py  |  1 -
     19 files changed, 18 insertions(+), 35 deletions(-)
    
    diff --git a/spacy/lang/bn/__init__.py b/spacy/lang/bn/__init__.py
    index c2cf12f12..1a76123ea 100644
    --- a/spacy/lang/bn/__init__.py
    +++ b/spacy/lang/bn/__init__.py
    @@ -16,12 +16,10 @@ from ...util import update_exc
     class BengaliDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'bn'
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    tag_map = TAG_MAP
    -    stop_words = STOP_WORDS
    -    lemma_rules = LEMMA_RULES
    -
    +    tag_map = dict(TAG_MAP)
    +    stop_words = set(STOP_WORDS)
    +    lemma_rules = dict(LEMMA_RULES)
         prefixes = tuple(TOKENIZER_PREFIXES)
         suffixes = tuple(TOKENIZER_SUFFIXES)
         infixes = tuple(TOKENIZER_INFIXES)
    diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py
    index 99babdc2c..b255a04b9 100644
    --- a/spacy/lang/da/__init__.py
    +++ b/spacy/lang/da/__init__.py
    @@ -15,7 +15,6 @@ class DanishDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'da'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/de/__init__.py b/spacy/lang/de/__init__.py
    index 1c64541e6..0ff707a06 100644
    --- a/spacy/lang/de/__init__.py
    +++ b/spacy/lang/de/__init__.py
    @@ -22,7 +22,6 @@ class GermanDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'de'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM],
                                              NORM_EXCEPTIONS, BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         infixes = tuple(TOKENIZER_INFIXES)
         tag_map = dict(TAG_MAP)
    diff --git a/spacy/lang/en/__init__.py b/spacy/lang/en/__init__.py
    index ec14fecd0..79d383b90 100644
    --- a/spacy/lang/en/__init__.py
    +++ b/spacy/lang/en/__init__.py
    @@ -23,7 +23,6 @@ class EnglishDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'en'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM],
                                              BASE_NORMS, NORM_EXCEPTIONS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         tag_map = dict(TAG_MAP)
         stop_words = set(STOP_WORDS)
    diff --git a/spacy/lang/es/__init__.py b/spacy/lang/es/__init__.py
    index 1e7f55be8..e64b88fad 100644
    --- a/spacy/lang/es/__init__.py
    +++ b/spacy/lang/es/__init__.py
    @@ -19,7 +19,6 @@ class SpanishDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'es'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         tag_map = dict(TAG_MAP)
         stop_words = set(STOP_WORDS)
    diff --git a/spacy/lang/fi/__init__.py b/spacy/lang/fi/__init__.py
    index 931ad5341..2eb40851b 100644
    --- a/spacy/lang/fi/__init__.py
    +++ b/spacy/lang/fi/__init__.py
    @@ -15,7 +15,6 @@ class FinnishDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'fi'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/fr/__init__.py b/spacy/lang/fr/__init__.py
    index 06dcf2d45..e2123c28f 100644
    --- a/spacy/lang/fr/__init__.py
    +++ b/spacy/lang/fr/__init__.py
    @@ -21,7 +21,6 @@ class FrenchDefaults(Language.Defaults):
         lex_attr_getters.update(LEX_ATTRS)
         lex_attr_getters[LANG] = lambda text: 'fr'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
         infixes = tuple(TOKENIZER_INFIXES)
    diff --git a/spacy/lang/he/__init__.py b/spacy/lang/he/__init__.py
    index a15dc9a05..b815b3273 100644
    --- a/spacy/lang/he/__init__.py
    +++ b/spacy/lang/he/__init__.py
    @@ -12,7 +12,6 @@ from ...util import update_exc
     class HebrewDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'he'
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/hu/__init__.py b/spacy/lang/hu/__init__.py
    index 0fe6a9f5c..9b6b63a81 100644
    --- a/spacy/lang/hu/__init__.py
    +++ b/spacy/lang/hu/__init__.py
    @@ -18,7 +18,6 @@ class HungarianDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'hu'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
         prefixes = tuple(TOKENIZER_PREFIXES)
    diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py
    index e0cfa941d..b4d020427 100644
    --- a/spacy/lang/id/__init__.py
    +++ b/spacy/lang/id/__init__.py
    @@ -19,9 +19,7 @@ from ...util import update_exc
     class IndonesianDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'id'
    -
         lex_attr_getters.update(LEX_ATTRS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
         prefixes = tuple(TOKENIZER_PREFIXES)
    diff --git a/spacy/lang/id/lex_attrs.py b/spacy/lang/id/lex_attrs.py
    index f6acd8508..fb6a31f99 100644
    --- a/spacy/lang/id/lex_attrs.py
    +++ b/spacy/lang/id/lex_attrs.py
    @@ -16,8 +16,7 @@ _num_words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
                   'sembilanbelas', 'duapuluh', 'seratus', 'seribu', 'sejuta',
                   'ribu', 'rb', 'juta', 'jt', 'miliar', 'biliun', 'triliun',
                   'kuadriliun', 'kuintiliun', 'sekstiliun', 'septiliun', 'oktiliun',
    -              'noniliun', 'desiliun',
    -              ]
    +              'noniliun', 'desiliun']
     
     
     def like_num(text):
    diff --git a/spacy/lang/it/__init__.py b/spacy/lang/it/__init__.py
    index 7cc717cb3..f6506038c 100644
    --- a/spacy/lang/it/__init__.py
    +++ b/spacy/lang/it/__init__.py
    @@ -16,7 +16,6 @@ class ItalianDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'it'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/nb/__init__.py b/spacy/lang/nb/__init__.py
    index c1b4af263..8804f7424 100644
    --- a/spacy/lang/nb/__init__.py
    +++ b/spacy/lang/nb/__init__.py
    @@ -16,7 +16,6 @@ class NorwegianDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'nb'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/nl/__init__.py b/spacy/lang/nl/__init__.py
    index 98df8d487..29cbb4617 100644
    --- a/spacy/lang/nl/__init__.py
    +++ b/spacy/lang/nl/__init__.py
    @@ -16,7 +16,6 @@ class DutchDefaults(Language.Defaults):
         lex_attr_getters.update(LEX_ATTRS)
         lex_attr_getters[LANG] = lambda text: 'nl'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/pl/__init__.py b/spacy/lang/pl/__init__.py
    index 38a240598..22e103246 100644
    --- a/spacy/lang/pl/__init__.py
    +++ b/spacy/lang/pl/__init__.py
    @@ -15,7 +15,6 @@ class PolishDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'pl'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/pt/__init__.py b/spacy/lang/pt/__init__.py
    index 67539034d..0baae7e7a 100644
    --- a/spacy/lang/pt/__init__.py
    +++ b/spacy/lang/pt/__init__.py
    @@ -19,7 +19,6 @@ class PortugueseDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'pt'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         lex_attr_getters.update(LEX_ATTRS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/sv/__init__.py b/spacy/lang/sv/__init__.py
    index 2d3a640c5..b21333fac 100644
    --- a/spacy/lang/sv/__init__.py
    +++ b/spacy/lang/sv/__init__.py
    @@ -18,7 +18,6 @@ class SwedishDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'sv'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py
    index b6bdb658f..e640fc4ef 100644
    --- a/spacy/lang/th/__init__.py
    +++ b/spacy/lang/th/__init__.py
    @@ -12,24 +12,27 @@ from ...language import Language
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    +
     class ThaiDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'th'
    -    tokenizer_exceptions = TOKENIZER_EXCEPTIONS
    +    tokenizer_exceptions = dict(TOKENIZER_EXCEPTIONS)
         tag_map = dict(TAG_MAP)
         stop_words = set(STOP_WORDS)
     
     
     class Thai(Language):
    -	lang = 'th'
    -	Defaults = ThaiDefaults
    -	def make_doc(self, text):
    -		try:
    -			from pythainlp.tokenize import word_tokenize
    -		except ImportError:
    -			raise ImportError("The Thai tokenizer requires the PyThaiNLP library: "
    -								"https://github.com/wannaphongcom/pythainlp/")
    -		words = [x for x in list(word_tokenize(text,"newmm"))]
    -		return Doc(self.vocab, words=words, spaces=[False]*len(words))
    +    lang = 'th'
    +    Defaults = ThaiDefaults
    +
    +    def make_doc(self, text):
    +        try:
    +            from pythainlp.tokenize import word_tokenize
    +        except ImportError:
    +            raise ImportError("The Thai tokenizer requires the PyThaiNLP library: "
    +                              "https://github.com/wannaphongcom/pythainlp/")
    +        words = [x for x in list(word_tokenize(text,"newmm"))]
    +        return Doc(self.vocab, words=words, spaces=[False]*len(words))
    +
     
     __all__ = ['Thai']
    diff --git a/spacy/lang/xx/__init__.py b/spacy/lang/xx/__init__.py
    index dc63ee33f..017f55ecc 100644
    --- a/spacy/lang/xx/__init__.py
    +++ b/spacy/lang/xx/__init__.py
    @@ -13,7 +13,6 @@ class MultiLanguageDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'xx'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
    -
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
     
     
    
    From 417d45f5d062078e1895f4521e868c5bece91a54 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 02:24:58 +0200
    Subject: [PATCH 317/649] Add lemmatizer data as variable on language data
    
    Don't create lookup lemmatizer within Language class and just pass in
    the data so it can be set on Token creation
    ---
     spacy/lang/de/__init__.py | 6 +-----
     spacy/lang/en/__init__.py | 3 ++-
     spacy/lang/es/__init__.py | 6 +-----
     spacy/lang/fr/__init__.py | 6 +-----
     spacy/lang/hu/__init__.py | 6 +-----
     spacy/lang/id/__init__.py | 6 +-----
     spacy/lang/it/__init__.py | 6 +-----
     spacy/lang/pt/__init__.py | 6 +-----
     spacy/lang/sv/__init__.py | 7 ++-----
     9 files changed, 11 insertions(+), 41 deletions(-)
    
    diff --git a/spacy/lang/de/__init__.py b/spacy/lang/de/__init__.py
    index 0ff707a06..e56bab844 100644
    --- a/spacy/lang/de/__init__.py
    +++ b/spacy/lang/de/__init__.py
    @@ -12,7 +12,6 @@ from .syntax_iterators import SYNTAX_ITERATORS
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ..norm_exceptions import BASE_NORMS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    @@ -27,10 +26,7 @@ class GermanDefaults(Language.Defaults):
         tag_map = dict(TAG_MAP)
         stop_words = set(STOP_WORDS)
         syntax_iterators = dict(SYNTAX_ITERATORS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class German(Language):
    diff --git a/spacy/lang/en/__init__.py b/spacy/lang/en/__init__.py
    index 79d383b90..fffac6467 100644
    --- a/spacy/lang/en/__init__.py
    +++ b/spacy/lang/en/__init__.py
    @@ -7,7 +7,7 @@ from .tag_map import TAG_MAP
     from .stop_words import STOP_WORDS
     from .lex_attrs import LEX_ATTRS
     from .morph_rules import MORPH_RULES
    -from .lemmatizer import LEMMA_RULES, LEMMA_INDEX, LEMMA_EXC
    +from .lemmatizer import LEMMA_RULES, LEMMA_INDEX, LEMMA_EXC, LOOKUP
     from .syntax_iterators import SYNTAX_ITERATORS
     
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
    @@ -30,6 +30,7 @@ class EnglishDefaults(Language.Defaults):
         lemma_rules = dict(LEMMA_RULES)
         lemma_index = dict(LEMMA_INDEX)
         lemma_exc = dict(LEMMA_EXC)
    +    lemma_lookup = dict(LOOKUP)
         syntax_iterators = dict(SYNTAX_ITERATORS)
     
     
    diff --git a/spacy/lang/es/__init__.py b/spacy/lang/es/__init__.py
    index e64b88fad..4246a0703 100644
    --- a/spacy/lang/es/__init__.py
    +++ b/spacy/lang/es/__init__.py
    @@ -10,7 +10,6 @@ from .syntax_iterators import SYNTAX_ITERATORS
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ..norm_exceptions import BASE_NORMS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    @@ -23,10 +22,7 @@ class SpanishDefaults(Language.Defaults):
         tag_map = dict(TAG_MAP)
         stop_words = set(STOP_WORDS)
         sytax_iterators = dict(SYNTAX_ITERATORS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Spanish(Language):
    diff --git a/spacy/lang/fr/__init__.py b/spacy/lang/fr/__init__.py
    index e2123c28f..0f2a60e3e 100644
    --- a/spacy/lang/fr/__init__.py
    +++ b/spacy/lang/fr/__init__.py
    @@ -11,7 +11,6 @@ from .syntax_iterators import SYNTAX_ITERATORS
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ..norm_exceptions import BASE_NORMS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    @@ -27,10 +26,7 @@ class FrenchDefaults(Language.Defaults):
         suffixes = tuple(TOKENIZER_SUFFIXES)
         token_match = TOKEN_MATCH
         syntax_iterators = dict(SYNTAX_ITERATORS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class French(Language):
    diff --git a/spacy/lang/hu/__init__.py b/spacy/lang/hu/__init__.py
    index 9b6b63a81..fd039a8eb 100644
    --- a/spacy/lang/hu/__init__.py
    +++ b/spacy/lang/hu/__init__.py
    @@ -9,7 +9,6 @@ from .lemmatizer import LOOKUP
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ..norm_exceptions import BASE_NORMS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    @@ -24,10 +23,7 @@ class HungarianDefaults(Language.Defaults):
         suffixes = tuple(TOKENIZER_SUFFIXES)
         infixes = tuple(TOKENIZER_INFIXES)
         token_match = TOKEN_MATCH
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Hungarian(Language):
    diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py
    index b4d020427..29fe86a01 100644
    --- a/spacy/lang/id/__init__.py
    +++ b/spacy/lang/id/__init__.py
    @@ -11,7 +11,6 @@ from .syntax_iterators import SYNTAX_ITERATORS
     
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG
     from ...util import update_exc
     
    @@ -26,10 +25,7 @@ class IndonesianDefaults(Language.Defaults):
         suffixes = tuple(TOKENIZER_SUFFIXES)
         infixes = tuple(TOKENIZER_INFIXES)
         syntax_iterators = dict(SYNTAX_ITERATORS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Indonesian(Language):
    diff --git a/spacy/lang/it/__init__.py b/spacy/lang/it/__init__.py
    index f6506038c..c19cb6d39 100644
    --- a/spacy/lang/it/__init__.py
    +++ b/spacy/lang/it/__init__.py
    @@ -7,7 +7,6 @@ from .lemmatizer import LOOKUP
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ..norm_exceptions import BASE_NORMS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    @@ -18,10 +17,7 @@ class ItalianDefaults(Language.Defaults):
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Italian(Language):
    diff --git a/spacy/lang/pt/__init__.py b/spacy/lang/pt/__init__.py
    index 0baae7e7a..6366a25c1 100644
    --- a/spacy/lang/pt/__init__.py
    +++ b/spacy/lang/pt/__init__.py
    @@ -9,7 +9,6 @@ from .lemmatizer import LOOKUP
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ..norm_exceptions import BASE_NORMS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    @@ -21,10 +20,7 @@ class PortugueseDefaults(Language.Defaults):
         lex_attr_getters.update(LEX_ATTRS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Portuguese(Language):
    diff --git a/spacy/lang/sv/__init__.py b/spacy/lang/sv/__init__.py
    index b21333fac..27da9024e 100644
    --- a/spacy/lang/sv/__init__.py
    +++ b/spacy/lang/sv/__init__.py
    @@ -9,7 +9,6 @@ from .lemmatizer import LEMMA_RULES, LOOKUP
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ..norm_exceptions import BASE_NORMS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    @@ -20,10 +19,8 @@ class SwedishDefaults(Language.Defaults):
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_rules = dict(LEMMA_RULES)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Swedish(Language):
    
    From 820bf850752962714a378b20de12ddbefe69f3e8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 02:25:13 +0200
    Subject: [PATCH 318/649] Move LookupLemmatizer to spacy.lemmatizer
    
    ---
     spacy/lemmatizer.py       | 15 +++++++++++++++
     spacy/lemmatizerlookup.py | 19 -------------------
     2 files changed, 15 insertions(+), 19 deletions(-)
     delete mode 100644 spacy/lemmatizerlookup.py
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 312c8db72..700c7b8ea 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -100,3 +100,18 @@ def lemmatize(string, index, exceptions, rules):
         if not forms:
             forms.append(string)
         return set(forms)
    +
    +
    +class LookupLemmatizer(Lemmatizer):
    +    @classmethod
    +    def load(cls, path, lookup):
    +        return cls(lookup or {})
    +
    +    def __init__(self, lookup):
    +        self.lookup = lookup
    +
    +    def __call__(self, string, univ_pos, morphology=None):
    +        try:
    +            return set([self.lookup[string]])
    +        except:
    +            return set([string])
    diff --git a/spacy/lemmatizerlookup.py b/spacy/lemmatizerlookup.py
    deleted file mode 100644
    index 0c0c693c1..000000000
    --- a/spacy/lemmatizerlookup.py
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -# coding: utf8
    -from __future__ import unicode_literals
    -
    -from .lemmatizer import Lemmatizer
    -
    -
    -class Lemmatizer(Lemmatizer):
    -    @classmethod
    -    def load(cls, path, lookup):
    -        return cls(lookup or {})
    -
    -    def __init__(self, lookup):
    -        self.lookup = lookup
    -
    -    def __call__(self, string, univ_pos, morphology=None):
    -        try:
    -            return set([self.lookup[string]])
    -        except:
    -            return set([string])
    \ No newline at end of file
    
    From f4ae6763b97a17b054bf41d2bfc50f1ced7d2a1f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 02:30:40 +0200
    Subject: [PATCH 319/649] Fix consistency of imports from spacy.tokens in
     examples
    
    ---
     examples/pipeline/custom_attr_methods.py                    | 3 +--
     examples/pipeline/custom_component_countries_api.py         | 4 +---
     examples/pipeline/custom_component_entities.py              | 4 +---
     website/api/doc.jade                                        | 6 +++---
     website/api/span.jade                                       | 6 +++---
     website/api/token.jade                                      | 6 +++---
     website/usage/_processing-pipelines/_custom-components.jade | 4 +---
     website/usage/_processing-pipelines/_extensions.jade        | 2 +-
     website/usage/_processing-pipelines/_serialization.jade     | 2 +-
     website/usage/_spacy-101/_lightning-tour.jade               | 2 +-
     10 files changed, 16 insertions(+), 23 deletions(-)
    
    diff --git a/examples/pipeline/custom_attr_methods.py b/examples/pipeline/custom_attr_methods.py
    index d99b612a7..9b1a8325d 100644
    --- a/examples/pipeline/custom_attr_methods.py
    +++ b/examples/pipeline/custom_attr_methods.py
    @@ -6,8 +6,7 @@ they're called on is passed in as the first argument."""
     from __future__ import unicode_literals
     
     from spacy.lang.en import English
    -from spacy.tokens.doc import Doc
    -from spacy.tokens.span import Span
    +from spacy.tokens import Doc, Span
     from spacy import displacy
     from pathlib import Path
     
    diff --git a/examples/pipeline/custom_component_countries_api.py b/examples/pipeline/custom_component_countries_api.py
    index 5a2f3df18..2554af967 100644
    --- a/examples/pipeline/custom_component_countries_api.py
    +++ b/examples/pipeline/custom_component_countries_api.py
    @@ -5,9 +5,7 @@ import requests
     
     from spacy.lang.en import English
     from spacy.matcher import PhraseMatcher
    -from spacy.tokens.doc import Doc
    -from spacy.tokens.span import Span
    -from spacy.tokens.token import Token
    +from spacy.tokens import Doc, Span, Token
     
     
     class RESTCountriesComponent(object):
    diff --git a/examples/pipeline/custom_component_entities.py b/examples/pipeline/custom_component_entities.py
    index 3f9163b83..a0d9c61ec 100644
    --- a/examples/pipeline/custom_component_entities.py
    +++ b/examples/pipeline/custom_component_entities.py
    @@ -3,9 +3,7 @@ from __future__ import unicode_literals
     
     from spacy.lang.en import English
     from spacy.matcher import PhraseMatcher
    -from spacy.tokens.doc import Doc
    -from spacy.tokens.span import Span
    -from spacy.tokens.token import Token
    +from spacy.tokens import Doc, Span, Token
     
     
     class TechCompanyRecognizer(object):
    diff --git a/website/api/doc.jade b/website/api/doc.jade
    index 9ba942e26..dce6b89e0 100644
    --- a/website/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -148,7 +148,7 @@ p
         |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
     
     +aside-code("Example").
    -    from spacy.tokens.doc import Doc
    +    from spacy.tokens import Doc
         city_getter = lambda doc: doc.text in ('New York', 'Paris', 'Berlin')
         Doc.set_extension('has_city', getter=city_getter)
         doc = nlp(u'I like New York')
    @@ -201,7 +201,7 @@ p
         |  registered. Raises a #[code KeyError] otherwise.
     
     +aside-code("Example").
    -    from spacy.tokens.doc import Doc
    +    from spacy.tokens import Doc
         Doc.set_extension('is_city', default=False)
         extension = Doc.get_extension('is_city')
         assert extension == (False, None, None, None)
    @@ -226,7 +226,7 @@ p
     p Check whether an extension has been registered on the #[code Doc] class.
     
     +aside-code("Example").
    -    from spacy.tokens.doc import Doc
    +    from spacy.tokens import Doc
         Doc.set_extension('is_city', default=False)
         assert Doc.has_extension('is_city')
     
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 6f3713203..6bff45a9b 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -126,7 +126,7 @@ p
         |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
     
     +aside-code("Example").
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Span
         city_getter = lambda span: span.text in ('New York', 'Paris', 'Berlin')
         Span.set_extension('has_city', getter=city_getter)
         doc = nlp(u'I like New York in Autumn')
    @@ -179,7 +179,7 @@ p
         |  registered. Raises a #[code KeyError] otherwise.
     
     +aside-code("Example").
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Span
         Span.set_extension('is_city', default=False)
         extension = Span.get_extension('is_city')
         assert extension == (False, None, None, None)
    @@ -204,7 +204,7 @@ p
     p Check whether an extension has been registered on the #[code Span] class.
     
     +aside-code("Example").
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Span
         Span.set_extension('is_city', default=False)
         assert Span.has_extension('is_city')
     
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 080fe11ee..465d44c66 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -61,7 +61,7 @@ p
         |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
     
     +aside-code("Example").
    -    from spacy.tokens.token import Token
    +    from spacy.tokens import Token
         fruit_getter = lambda token: token.text in ('apple', 'pear', 'banana')
         Token.set_extension('is_fruit', getter=fruit_getter)
         doc = nlp(u'I have an apple')
    @@ -114,7 +114,7 @@ p
         |  registered. Raises a #[code KeyError] otherwise.
     
     +aside-code("Example").
    -    from spacy.tokens.token import Token
    +    from spacy.tokens import Token
         Token.set_extension('is_fruit', default=False)
         extension = Token.get_extension('is_fruit')
         assert extension == (False, None, None, None)
    @@ -139,7 +139,7 @@ p
     p Check whether an extension has been registered on the #[code Token] class.
     
     +aside-code("Example").
    -    from spacy.tokens.token import Token
    +    from spacy.tokens import Token
         Token.set_extension('is_fruit', default=False)
         assert Token.has_extension('is_fruit')
     
    diff --git a/website/usage/_processing-pipelines/_custom-components.jade b/website/usage/_processing-pipelines/_custom-components.jade
    index cfd1782f1..ea3ea9b97 100644
    --- a/website/usage/_processing-pipelines/_custom-components.jade
    +++ b/website/usage/_processing-pipelines/_custom-components.jade
    @@ -146,9 +146,7 @@ p
         |  been registered, spaCy will raise an #[code AttributeError].
     
     +code("Example").
    -    from spacy.tokens.token import Token
    -    from spacy.tokens.doc import Doc
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Doc, Span, Token
     
         fruits = ['apple', 'pear', 'banana', 'orange', 'strawberry']
         is_fruit_getter = lambda token: token.text in fruits
    diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
    index a27ae6287..a1d8168e0 100644
    --- a/website/usage/_processing-pipelines/_extensions.jade
    +++ b/website/usage/_processing-pipelines/_extensions.jade
    @@ -46,7 +46,7 @@ p
     
             +code-wrapper
                 +code-new.
    -                from spacy.tokens.doc import Doc
    +                from spacy.tokens import Doc
                     def __init__(attr='my_attr'):
                         Doc.set_extension(attr, getter=self.get_doc_attr)
                 +code-old.
    diff --git a/website/usage/_processing-pipelines/_serialization.jade b/website/usage/_processing-pipelines/_serialization.jade
    index 111a5fbad..e29cbc558 100644
    --- a/website/usage/_processing-pipelines/_serialization.jade
    +++ b/website/usage/_processing-pipelines/_serialization.jade
    @@ -21,7 +21,7 @@ p
     
     +code.
         import spacy
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Span
     
         text = u'Netflix is hiring a new VP of global policy'
     
    diff --git a/website/usage/_spacy-101/_lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
    index 061ec7758..ecf57fbc2 100644
    --- a/website/usage/_spacy-101/_lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -175,7 +175,7 @@ p
     
     +code.
         import spacy
    -    from spacy.tokens.doc import Doc
    +    from spacy.tokens import Doc
         from spacy.vocab import Vocab
     
         nlp = spacy.load('en')
    
    From 2c118ab3a6b516fae87280dac69cb9c5d7caa5a9 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:21:23 +0200
    Subject: [PATCH 320/649] Add tests for Doc creation
    
    ---
     spacy/tests/doc/test_creation.py | 37 ++++++++++++++++++++++++++++++++
     1 file changed, 37 insertions(+)
     create mode 100644 spacy/tests/doc/test_creation.py
    
    diff --git a/spacy/tests/doc/test_creation.py b/spacy/tests/doc/test_creation.py
    new file mode 100644
    index 000000000..edadbf086
    --- /dev/null
    +++ b/spacy/tests/doc/test_creation.py
    @@ -0,0 +1,37 @@
    +'''Test Doc sets up tokens correctly.'''
    +from __future__ import unicode_literals
    +import pytest
    +
    +from ...vocab import Vocab
    +from ...tokens.doc import Doc
    +from ...lemmatizerlookup import Lemmatizer
    +
    +
    +@pytest.fixture
    +def lemmatizer():
    +    return Lemmatizer({'dogs': 'dog', 'boxen': 'box', 'mice': 'mouse'})
    +
    +
    +@pytest.fixture
    +def vocab(lemmatizer):
    +    return Vocab(lemmatizer=lemmatizer)
    +
    +
    +def test_empty_doc(vocab):
    +    doc = Doc(vocab)
    +    assert len(doc) == 0
    +
    +
    +def test_single_word(vocab):
    +    doc = Doc(vocab, words=['a'])
    +    assert doc.text == 'a '
    +    doc = Doc(vocab, words=['a'], spaces=[False])
    +    assert doc.text == 'a'
    +
    +
    +def test_lookup_lemmatization(vocab):
    +    doc = Doc(vocab, words=['dogs', 'dogses'])
    +    assert doc[0].text == 'dogs'
    +    assert doc[0].lemma_ == 'dog'
    +    assert doc[1].text == 'dogses'
    +    assert doc[1].lemma_ == 'dogses'
    
    From d528b6e36dd13d70238b085191f844728d8a7535 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:22:49 +0200
    Subject: [PATCH 321/649] Add assign_untagged method in Morphology
    
    ---
     spacy/morphology.pxd |  2 ++
     spacy/morphology.pyx | 14 ++++++++++----
     2 files changed, 12 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/morphology.pxd b/spacy/morphology.pxd
    index 922843d6d..be6711bfd 100644
    --- a/spacy/morphology.pxd
    +++ b/spacy/morphology.pxd
    @@ -35,6 +35,8 @@ cdef class Morphology:
         cdef RichTagC* rich_tags
         cdef PreshMapArray _cache
     
    +    cdef int assign_untagged(self, TokenC* token) except -1
    +
         cdef int assign_tag(self, TokenC* token, tag) except -1
     
         cdef int assign_tag_id(self, TokenC* token, int tag_id) except -1
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 5ee11c151..5a4399698 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -42,7 +42,7 @@ cdef class Morphology:
             self.tag_names = tuple(sorted(tag_map.keys()))
             self.reverse_index = {}
     
    -        self.rich_tags = self.mem.alloc(self.n_tags, sizeof(RichTagC))
    +        self.rich_tags = self.mem.alloc(self.n_tags+1, sizeof(RichTagC))
             for i, (tag_str, attrs) in enumerate(sorted(tag_map.items())):
                 self.tag_map[tag_str] = dict(attrs)
                 attrs = _normalize_props(attrs)
    @@ -52,6 +52,10 @@ cdef class Morphology:
                 self.rich_tags[i].morph = 0
                 self.rich_tags[i].pos = attrs[POS]
                 self.reverse_index[self.rich_tags[i].name] = i
    +        # Add a 'null' tag, which we can reference when assign morphology to
    +        # untagged tokens.
    +        self.rich_tags[self.n_tags].id = self.n_tags
    + 
             self._cache = PreshMapArray(self.n_tags)
             self.exc = {}
             if exc is not None:
    @@ -62,6 +66,10 @@ cdef class Morphology:
             return (Morphology, (self.strings, self.tag_map, self.lemmatizer,
                                  self.exc), None, None)
     
    +    cdef int assign_untagged(self, TokenC* token) except -1:
    +        '''Set morphological attributes on a token without a POS tag.'''
    +        token.lemma = self.lemmatize(0, token.lex.orth, {})
    +
         cdef int assign_tag(self, TokenC* token, tag) except -1:
             if isinstance(tag, basestring):
                 tag = self.strings.add(tag)
    @@ -72,7 +80,7 @@ cdef class Morphology:
                 token.tag = tag
     
         cdef int assign_tag_id(self, TokenC* token, int tag_id) except -1:
    -        if tag_id >= self.n_tags:
    +        if tag_id > self.n_tags:
                 raise ValueError("Unknown tag ID: %s" % tag_id)
             # TODO: It's pretty arbitrary to put this logic here. I guess the justification
             # is that this is where the specific word and the tag interact. Still,
    @@ -151,8 +159,6 @@ cdef class Morphology:
             cdef unicode py_string = self.strings[orth]
             if self.lemmatizer is None:
                 return self.strings.add(py_string.lower())
    -        if univ_pos not in (NOUN, VERB, ADJ, PUNCT):
    -            return self.strings.add(py_string.lower())
             cdef set lemma_strings
             cdef unicode lemma_string
             lemma_strings = self.lemmatizer(py_string, univ_pos, morphology)
    
    From c15d8278cb3c382a7453b1b33c10700a3f4f0766 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:23:23 +0200
    Subject: [PATCH 322/649] Avoid lemmatizing inappropriate tags in English
     lemmatizer
    
    ---
     spacy/lemmatizer.py | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 312c8db72..ff7666c37 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -24,6 +24,8 @@ class Lemmatizer(object):
                 univ_pos = 'adj'
             elif univ_pos == PUNCT:
                 univ_pos = 'punct'
    +        else:
    +            return set([string.lower()])
             # See Issue #435 for example of where this logic is requied.
             if self.is_base_form(univ_pos, morphology):
                 return set([string.lower()])
    
    From 3b527fa52bdd6f29131f3bfb7deb32816c2de4f0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:23:57 +0200
    Subject: [PATCH 323/649] Call morphology.assign_untagged when pushing token to
     Doc
    
    ---
     spacy/tokens/doc.pyx | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index df75ab3ec..400ca0f2a 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -512,6 +512,8 @@ cdef class Doc:
             assert t.lex.orth != 0
             t.spacy = has_space
             self.length += 1
    +        # Set morphological attributes, e.g. by lemma, if possible
    +        self.vocab.morphology.assign_untagged(t)
             self._py_tokens.append(None)
             return t.idx + t.lex.length + t.spacy
     
    
    From fd47f8e89f55703ad1c527124d631ab8543e6213 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 08:38:34 +0200
    Subject: [PATCH 324/649] Fix failing test
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index 77326f797..f10b96192 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -64,7 +64,7 @@ def test_sents_1_3(parser):
         doc[1].sent_start = True
         doc[3].sent_start = True
         doc = parser(doc)
    -    assert len(list(doc.sents)) == 4
    +    assert len(list(doc.sents)) >= 3
         doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
         doc[1].sent_start = True
         doc[2].sent_start = False
    
    From 3814a161e639829df99fe6f36913fced2c3d4e93 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 08:41:03 +0200
    Subject: [PATCH 325/649] Avoid clobbering preset lemmas
    
    ---
     spacy/morphology.pyx | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 5a4399698..da9246cb6 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -68,7 +68,8 @@ cdef class Morphology:
     
         cdef int assign_untagged(self, TokenC* token) except -1:
             '''Set morphological attributes on a token without a POS tag.'''
    -        token.lemma = self.lemmatize(0, token.lex.orth, {})
    +        if token.lemma == 0:
    +            token.lemma = self.lemmatize(0, token.lex.orth, {})
     
         cdef int assign_tag(self, TokenC* token, tag) except -1:
             if isinstance(tag, basestring):
    
    From 74c2c6a58cabdb31b77df3b24f6068355d9738bb Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 08:49:12 +0200
    Subject: [PATCH 326/649] Add default name and lang to meta
    
    ---
     spacy/cli/train.py | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 05d035769..a8b45e8fa 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -68,6 +68,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
         if not isinstance(meta, dict):
             prints("Expected dict but got: {}".format(type(meta)),
                    title="Not a valid meta.json format", exits=1)
    +    meta.setdefault('lang', lang)
    +    meta.setdefault('name', 'unnamed')
     
         pipeline = ['tagger', 'parser', 'ner']
         if no_tagger and 'tagger' in pipeline: pipeline.remove('tagger')
    
    From acba2e1051a0734d7d6ae2cc11211096039446bd Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 08:55:52 +0200
    Subject: [PATCH 327/649] Fix metadata in training
    
    ---
     spacy/cli/train.py | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index a8b45e8fa..3dae3f68b 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -91,6 +91,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
     
         lang_class = util.get_lang_class(lang)
         nlp = lang_class()
    +    meta['pipeline'] = pipeline
    +    nlp.meta.update(meta)
         if vectors:
             util.load_model(vectors, vocab=nlp.vocab)
         for name in pipeline:
    
    From 188f62004694d89a040f5409164258a150abc2b1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 09:43:48 +0200
    Subject: [PATCH 328/649] Improve parser defaults
    
    ---
     spacy/syntax/nn_parser.pyx | 12 ++++++------
     1 file changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 939414bd3..ce9ee39fa 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,13 +239,13 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 0))
    -        token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
    -        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 128))
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 3))
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
    +        token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 64))
    +        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 64))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
    -        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
    -        hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
    +        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 4))
    +        hist_width = util.env_opt('history_width', cfg.get('hist_width', 16))
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    
    From 76fe24f44d1238e3755c07cd377eddde2b74a913 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 09:44:17 +0200
    Subject: [PATCH 329/649] Improve embedding defaults
    
    ---
     spacy/_ml.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 62e0ceb9a..b07e179f0 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -311,7 +311,7 @@ def link_vectors_to_models(vocab):
     
     def Tok2Vec(width, embed_size, **kwargs):
         pretrained_dims = kwargs.get('pretrained_dims', 0)
    -    cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 3)
    +    cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 2)
         cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH]
         with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add,
                                      '*': reapply}):
    
    From 6e552c9d83ed2010e8de2291680bc8527b58fec4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 02:46:44 -0500
    Subject: [PATCH 330/649] Prune number of non-projective labels more
     aggressiely
    
    ---
     spacy/gold.pyx             | 2 +-
     spacy/syntax/nn_parser.pyx | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/gold.pyx b/spacy/gold.pyx
    index 2512c179f..5729af667 100644
    --- a/spacy/gold.pyx
    +++ b/spacy/gold.pyx
    @@ -213,7 +213,7 @@ class GoldCorpus(object):
             train_tuples = self.train_tuples
             if projectivize:
                 train_tuples = nonproj.preprocess_training_data(
    -                               self.train_tuples)
    +                               self.train_tuples, label_freq_cutoff=100)
             random.shuffle(train_tuples)
             gold_docs = self.iter_gold_docs(nlp, train_tuples, gold_preproc,
                                             max_length=max_length,
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index a8a1d4334..9288b523f 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -809,7 +809,7 @@ cdef class Parser:
         def begin_training(self, gold_tuples, pipeline=None, **cfg):
             if 'model' in cfg:
                 self.model = cfg['model']
    -        gold_tuples = nonproj.preprocess_training_data(gold_tuples)
    +        gold_tuples = nonproj.preprocess_training_data(gold_tuples, label_freq_cutoff=100)
             actions = self.moves.get_actions(gold_parses=gold_tuples)
             for action, labels in actions.items():
                 for label in labels:
    
    From 17c467e0ab143eb89c45917740b5d32be303f56a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:33:06 -0500
    Subject: [PATCH 331/649] Avoid clobbering existing lemmas
    
    ---
     spacy/morphology.pyx | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 5a4399698..b8dbb83ba 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -55,7 +55,7 @@ cdef class Morphology:
             # Add a 'null' tag, which we can reference when assign morphology to
             # untagged tokens.
             self.rich_tags[self.n_tags].id = self.n_tags
    - 
    +
             self._cache = PreshMapArray(self.n_tags)
             self.exc = {}
             if exc is not None:
    @@ -68,7 +68,8 @@ cdef class Morphology:
     
         cdef int assign_untagged(self, TokenC* token) except -1:
             '''Set morphological attributes on a token without a POS tag.'''
    -        token.lemma = self.lemmatize(0, token.lex.orth, {})
    +        if token.lemma == 0:
    +            token.lemma = self.lemmatize(0, token.lex.orth, {})
     
         cdef int assign_tag(self, TokenC* token, tag) except -1:
             if isinstance(tag, basestring):
    
    From 9fd471372a7e804fdd5402a6095404f71b947ed0 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:25:51 +0200
    Subject: [PATCH 332/649] Add lookup lemmatizer to lemmatizer as lookup()
     method
    
    ---
     spacy/lemmatizer.py | 29 ++++++++++-------------------
     1 file changed, 10 insertions(+), 19 deletions(-)
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 6c0fb6356..1fb83a727 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -10,10 +10,11 @@ class Lemmatizer(object):
         def load(cls, path, index=None, exc=None, rules=None):
             return cls(index or {}, exc or {}, rules or {})
     
    -    def __init__(self, index, exceptions, rules):
    -        self.index = index
    -        self.exc = exceptions
    -        self.rules = rules
    +    def __init__(self, index=None, exceptions=None, rules=None, lookup=None):
    +        self.index = index if index is not None else {}
    +        self.exc = exceptions if exceptions is not None else {}
    +        self.rules = rules if rules is not None else {}
    +        self.lookup_table = lookup if lookup is not None else {}
     
         def __call__(self, string, univ_pos, morphology=None):
             if univ_pos == NOUN:
    @@ -79,6 +80,11 @@ class Lemmatizer(object):
         def punct(self, string, morphology=None):
             return self(string, 'punct', morphology)
     
    +    def lookup(self, string):
    +        if string in self.lookup_table:
    +            return self.lookup_table[string]
    +        return string
    +
     
     def lemmatize(string, index, exceptions, rules):
         string = string.lower()
    @@ -102,18 +108,3 @@ def lemmatize(string, index, exceptions, rules):
         if not forms:
             forms.append(string)
         return set(forms)
    -
    -
    -class LookupLemmatizer(Lemmatizer):
    -    @classmethod
    -    def load(cls, path, lookup):
    -        return cls(lookup or {})
    -
    -    def __init__(self, lookup):
    -        self.lookup = lookup
    -
    -    def __call__(self, string, univ_pos, morphology=None):
    -        try:
    -            return set([self.lookup[string]])
    -        except:
    -            return set([string])
    
    From 9620c1a640a52f1e560c122e2c737a16d00d5c2f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:26:05 +0200
    Subject: [PATCH 333/649] Add lemma_lookup to Language defaults
    
    ---
     spacy/language.py | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index d40aee3ca..86292f4ff 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -33,7 +33,8 @@ from . import about
     class BaseDefaults(object):
         @classmethod
         def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(cls.lemma_index, cls.lemma_exc, cls.lemma_rules)
    +        return Lemmatizer(cls.lemma_index, cls.lemma_exc, cls.lemma_rules,
    +                          cls.lemma_lookup)
     
         @classmethod
         def create_vocab(cls, nlp=None):
    @@ -77,6 +78,7 @@ class BaseDefaults(object):
         lemma_rules = {}
         lemma_exc = {}
         lemma_index = {}
    +    lemma_lookup = {}
         morph_rules = {}
         lex_attr_getters = LEX_ATTRS
         syntax_iterators = {}
    
    From 6dd14dc3427167045c63b9cba8f24bcde87cd765 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:27:10 +0200
    Subject: [PATCH 334/649] Add lookup lemmas to tokens without POS tags
    
    ---
     spacy/morphology.pyx | 8 ++++++--
     1 file changed, 6 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index b8dbb83ba..4a1a0aa54 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -67,9 +67,13 @@ cdef class Morphology:
                                  self.exc), None, None)
     
         cdef int assign_untagged(self, TokenC* token) except -1:
    -        '''Set morphological attributes on a token without a POS tag.'''
    +        """Set morphological attributes on a token without a POS tag. Uses
    +        the lemmatizer's lookup() method, which looks up the string in the
    +        table provided by the language data as lemma_lookup (if available)."""
             if token.lemma == 0:
    -            token.lemma = self.lemmatize(0, token.lex.orth, {})
    +            orth_str = self.strings[token.lex.orth]
    +            lemma = self.lemmatizer.lookup(orth_str)
    +            token.lemma = self.strings.add(lemma)
     
         cdef int assign_tag(self, TokenC* token, tag) except -1:
             if isinstance(tag, basestring):
    
    From 15fe0fd82d0d38b584db6f1ca4ad674252c2cf0d Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:27:18 +0200
    Subject: [PATCH 335/649] Fix tests
    
    ---
     spacy/tests/doc/test_creation.py        | 4 ++--
     spacy/tests/regression/test_issue589.py | 1 +
     2 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tests/doc/test_creation.py b/spacy/tests/doc/test_creation.py
    index edadbf086..c14fdfbe9 100644
    --- a/spacy/tests/doc/test_creation.py
    +++ b/spacy/tests/doc/test_creation.py
    @@ -4,12 +4,12 @@ import pytest
     
     from ...vocab import Vocab
     from ...tokens.doc import Doc
    -from ...lemmatizerlookup import Lemmatizer
    +from ...lemmatizer import Lemmatizer
     
     
     @pytest.fixture
     def lemmatizer():
    -    return Lemmatizer({'dogs': 'dog', 'boxen': 'box', 'mice': 'mouse'})
    +    return Lemmatizer(lookup={'dogs': 'dog', 'boxen': 'box', 'mice': 'mouse'})
     
     
     @pytest.fixture
    diff --git a/spacy/tests/regression/test_issue589.py b/spacy/tests/regression/test_issue589.py
    index 27363739d..96ea4be61 100644
    --- a/spacy/tests/regression/test_issue589.py
    +++ b/spacy/tests/regression/test_issue589.py
    @@ -7,6 +7,7 @@ from ..util import get_doc
     import pytest
     
     
    +@pytest.mark.xfail
     def test_issue589():
         vocab = Vocab()
         vocab.strings.set_frozen(True)
    
    From 453c47ca24c7e8d3cd71afc3fe2ef4b501c25e27 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:27:26 +0200
    Subject: [PATCH 336/649] Add German lemmatizer tests
    
    ---
     spacy/tests/lang/de/test_lemma.py | 13 +++++++++++++
     1 file changed, 13 insertions(+)
     create mode 100644 spacy/tests/lang/de/test_lemma.py
    
    diff --git a/spacy/tests/lang/de/test_lemma.py b/spacy/tests/lang/de/test_lemma.py
    new file mode 100644
    index 000000000..39b3b0313
    --- /dev/null
    +++ b/spacy/tests/lang/de/test_lemma.py
    @@ -0,0 +1,13 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +import pytest
    +
    +
    +@pytest.mark.parametrize('string,lemma', [('Abgehängten', 'Abgehängte'),
    +                                          ('engagierte', 'engagieren'),
    +                                          ('schließt', 'schließen'),
    +                                          ('vorgebenden', 'vorgebend')])
    +def test_lemmatizer_lookup_assigns(de_tokenizer, string, lemma):
    +    tokens = de_tokenizer(string)
    +    assert tokens[0].lemma_ == lemma
    
    From c6ae49e8bf1da88a6f51dd47c2e0a4c09ecc851f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:34:11 +0200
    Subject: [PATCH 337/649] Fix formatting
    
    ---
     spacy/tests/test_underscore.py | 5 ++++-
     1 file changed, 4 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/tests/test_underscore.py b/spacy/tests/test_underscore.py
    index 262098515..4df47b886 100644
    --- a/spacy/tests/test_underscore.py
    +++ b/spacy/tests/test_underscore.py
    @@ -10,6 +10,7 @@ def test_create_doc_underscore():
         assert uscore._start is None
         assert uscore._end is None
     
    +
     def test_doc_underscore_getattr_setattr():
         doc = Mock()
         doc.doc = doc
    @@ -20,6 +21,7 @@ def test_doc_underscore_getattr_setattr():
         doc._.hello = True
         assert doc._.hello == True
     
    +
     def test_create_span_underscore():
         span = Mock(doc=Mock(), start=0, end=2)
         uscore = Underscore(Underscore.span_extensions, span,
    @@ -28,6 +30,7 @@ def test_create_span_underscore():
         assert uscore._start is span.start
         assert uscore._end is span.end
     
    +
     def test_span_underscore_getter_setter():
         span = Mock(doc=Mock(), start=0, end=2)
         Underscore.span_extensions['hello'] = (None, None,
    @@ -36,7 +39,7 @@ def test_span_underscore_getter_setter():
                                                                         value))
         span._ = Underscore(Underscore.span_extensions, span,
                             start=span.start, end=span.end)
    - 
    +
         assert span._.hello == (0, 'hi')
         span._.hello = 1
         assert span._.hello == (1, 'hi')
    
    From 51519251c23654a9f44f2f995b473e24735a5f2c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:34:19 +0200
    Subject: [PATCH 338/649] Fix underscore method test
    
    ---
     spacy/tests/test_underscore.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/test_underscore.py b/spacy/tests/test_underscore.py
    index 4df47b886..c7df57b62 100644
    --- a/spacy/tests/test_underscore.py
    +++ b/spacy/tests/test_underscore.py
    @@ -46,7 +46,7 @@ def test_span_underscore_getter_setter():
     
     
     def test_token_underscore_method():
    -    token = Mock(doc=Mock(), idx=7, say_cheese=lambda: 'cheese')
    +    token = Mock(doc=Mock(), idx=7, say_cheese=lambda token: 'cheese')
         Underscore.token_extensions['hello'] = (None, token.say_cheese,
                                                 None, None)
         token._ = Underscore(Underscore.token_extensions, token, start=token.idx)
    
    From eac9e99086b2c2b58ee57c0c3b621ac90116ac47 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 14:21:15 +0200
    Subject: [PATCH 339/649] Update docs on adding lemmatization to languages
    
    ---
     .../_adding-languages/_language-data.jade     | 21 ++++---------------
     1 file changed, 4 insertions(+), 17 deletions(-)
    
    diff --git a/website/usage/_adding-languages/_language-data.jade b/website/usage/_adding-languages/_language-data.jade
    index 81a6d638e..dc86b7a03 100644
    --- a/website/usage/_adding-languages/_language-data.jade
    +++ b/website/usage/_adding-languages/_language-data.jade
    @@ -456,24 +456,11 @@ p
         }
     
     p
    -    |  To add a lookup lemmatizer to your language, import the #[code LOOKUP]
    -    |  table and #[code Lemmatizer], and create a new classmethod:
    +    |  To provide a lookup lemmatizer for your language, import the lookup table
    +    |  and add it to the #[code Language] class as #[code lemma_lookup]:
     
    -
    -+code("__init__py (excerpt)").
    -    # other imports here, plus lookup table and lookup lemmatizer
    -    from .lemmatizer import LOOKUP
    -    from ...lemmatizerlookup import Lemmatizer
    -
    -    class Xxxxx(Language):
    -        lang = 'xx'
    -
    -        class Defaults(Language.Defaults):
    -            # other language defaults here
    -
    -            @classmethod
    -            def create_lemmatizer(cls, nlp=None):
    -                return Lemmatizer(LOOKUP)
    ++code.
    +    lemma_lookup = dict(LOOKUP)
     
     +h(3, "tag-map") Tag map
     
    
    From 8ce6f96180ab37f7f4ec0676868b0d8b3ae18787 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 15:34:55 +0200
    Subject: [PATCH 340/649] Don't make copies of language data components
    
    ---
     spacy/lang/bn/__init__.py | 12 ++++++------
     spacy/lang/da/__init__.py |  2 +-
     spacy/lang/de/__init__.py | 10 +++++-----
     spacy/lang/en/__init__.py | 16 ++++++++--------
     spacy/lang/es/__init__.py |  8 ++++----
     spacy/lang/fi/__init__.py |  2 +-
     spacy/lang/fr/__init__.py | 10 +++++-----
     spacy/lang/he/__init__.py |  2 +-
     spacy/lang/hu/__init__.py | 10 +++++-----
     spacy/lang/id/__init__.py | 12 ++++++------
     spacy/lang/it/__init__.py |  4 ++--
     spacy/lang/nb/__init__.py |  2 +-
     spacy/lang/nl/__init__.py |  2 +-
     spacy/lang/pl/__init__.py |  2 +-
     spacy/lang/pt/__init__.py |  4 ++--
     spacy/lang/sv/__init__.py |  6 +++---
     spacy/lang/th/__init__.py |  4 ++--
     17 files changed, 54 insertions(+), 54 deletions(-)
    
    diff --git a/spacy/lang/bn/__init__.py b/spacy/lang/bn/__init__.py
    index 1a76123ea..ff560afae 100644
    --- a/spacy/lang/bn/__init__.py
    +++ b/spacy/lang/bn/__init__.py
    @@ -17,12 +17,12 @@ class BengaliDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'bn'
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    tag_map = dict(TAG_MAP)
    -    stop_words = set(STOP_WORDS)
    -    lemma_rules = dict(LEMMA_RULES)
    -    prefixes = tuple(TOKENIZER_PREFIXES)
    -    suffixes = tuple(TOKENIZER_SUFFIXES)
    -    infixes = tuple(TOKENIZER_INFIXES)
    +    tag_map = TAG_MAP
    +    stop_words = STOP_WORDS
    +    lemma_rules = LEMMA_RULES
    +    prefixes = TOKENIZER_PREFIXES
    +    suffixes = TOKENIZER_SUFFIXES
    +    infixes = TOKENIZER_INFIXES
     
     
     class Bengali(Language):
    diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py
    index b255a04b9..86e47c00d 100644
    --- a/spacy/lang/da/__init__.py
    +++ b/spacy/lang/da/__init__.py
    @@ -16,7 +16,7 @@ class DanishDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'da'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    +    stop_words = STOP_WORDS
     
     
     class Danish(Language):
    diff --git a/spacy/lang/de/__init__.py b/spacy/lang/de/__init__.py
    index e56bab844..e8e7a12db 100644
    --- a/spacy/lang/de/__init__.py
    +++ b/spacy/lang/de/__init__.py
    @@ -22,11 +22,11 @@ class GermanDefaults(Language.Defaults):
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM],
                                              NORM_EXCEPTIONS, BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    infixes = tuple(TOKENIZER_INFIXES)
    -    tag_map = dict(TAG_MAP)
    -    stop_words = set(STOP_WORDS)
    -    syntax_iterators = dict(SYNTAX_ITERATORS)
    -    lemma_lookup = dict(LOOKUP)
    +    infixes = TOKENIZER_INFIXES
    +    tag_map = TAG_MAP
    +    stop_words = STOP_WORDS
    +    syntax_iterators = SYNTAX_ITERATORS
    +    lemma_lookup = LOOKUP
     
     
     class German(Language):
    diff --git a/spacy/lang/en/__init__.py b/spacy/lang/en/__init__.py
    index fffac6467..63fd9c2b4 100644
    --- a/spacy/lang/en/__init__.py
    +++ b/spacy/lang/en/__init__.py
    @@ -24,14 +24,14 @@ class EnglishDefaults(Language.Defaults):
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM],
                                              BASE_NORMS, NORM_EXCEPTIONS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    tag_map = dict(TAG_MAP)
    -    stop_words = set(STOP_WORDS)
    -    morph_rules = dict(MORPH_RULES)
    -    lemma_rules = dict(LEMMA_RULES)
    -    lemma_index = dict(LEMMA_INDEX)
    -    lemma_exc = dict(LEMMA_EXC)
    -    lemma_lookup = dict(LOOKUP)
    -    syntax_iterators = dict(SYNTAX_ITERATORS)
    +    tag_map = TAG_MAP
    +    stop_words = STOP_WORDS
    +    morph_rules = MORPH_RULES
    +    lemma_rules = LEMMA_RULES
    +    lemma_index = LEMMA_INDEX
    +    lemma_exc = LEMMA_EXC
    +    lemma_lookup = LOOKUP
    +    syntax_iterators = SYNTAX_ITERATORS
     
     
     class English(Language):
    diff --git a/spacy/lang/es/__init__.py b/spacy/lang/es/__init__.py
    index 4246a0703..661f0bbec 100644
    --- a/spacy/lang/es/__init__.py
    +++ b/spacy/lang/es/__init__.py
    @@ -19,10 +19,10 @@ class SpanishDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'es'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    tag_map = dict(TAG_MAP)
    -    stop_words = set(STOP_WORDS)
    -    sytax_iterators = dict(SYNTAX_ITERATORS)
    -    lemma_lookup = dict(LOOKUP)
    +    tag_map = TAG_MAP
    +    stop_words = STOP_WORDS
    +    sytax_iterators = SYNTAX_ITERATORS
    +    lemma_lookup = LOOKUP
     
     
     class Spanish(Language):
    diff --git a/spacy/lang/fi/__init__.py b/spacy/lang/fi/__init__.py
    index 2eb40851b..7f74495c5 100644
    --- a/spacy/lang/fi/__init__.py
    +++ b/spacy/lang/fi/__init__.py
    @@ -16,7 +16,7 @@ class FinnishDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'fi'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    +    stop_words = STOP_WORDS
     
     
     class Finnish(Language):
    diff --git a/spacy/lang/fr/__init__.py b/spacy/lang/fr/__init__.py
    index 0f2a60e3e..42acd0736 100644
    --- a/spacy/lang/fr/__init__.py
    +++ b/spacy/lang/fr/__init__.py
    @@ -21,12 +21,12 @@ class FrenchDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'fr'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    -    infixes = tuple(TOKENIZER_INFIXES)
    -    suffixes = tuple(TOKENIZER_SUFFIXES)
    +    stop_words = STOP_WORDS
    +    infixes = TOKENIZER_INFIXES
    +    suffixes = TOKENIZER_SUFFIXES
         token_match = TOKEN_MATCH
    -    syntax_iterators = dict(SYNTAX_ITERATORS)
    -    lemma_lookup = dict(LOOKUP)
    +    syntax_iterators = SYNTAX_ITERATORS
    +    lemma_lookup = LOOKUP
     
     
     class French(Language):
    diff --git a/spacy/lang/he/__init__.py b/spacy/lang/he/__init__.py
    index b815b3273..807794fee 100644
    --- a/spacy/lang/he/__init__.py
    +++ b/spacy/lang/he/__init__.py
    @@ -13,7 +13,7 @@ class HebrewDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'he'
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    +    stop_words = STOP_WORDS
     
     
     class Hebrew(Language):
    diff --git a/spacy/lang/hu/__init__.py b/spacy/lang/hu/__init__.py
    index fd039a8eb..35b047900 100644
    --- a/spacy/lang/hu/__init__.py
    +++ b/spacy/lang/hu/__init__.py
    @@ -18,12 +18,12 @@ class HungarianDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'hu'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    -    prefixes = tuple(TOKENIZER_PREFIXES)
    -    suffixes = tuple(TOKENIZER_SUFFIXES)
    -    infixes = tuple(TOKENIZER_INFIXES)
    +    stop_words = STOP_WORDS
    +    prefixes = TOKENIZER_PREFIXES
    +    suffixes = TOKENIZER_SUFFIXES
    +    infixes = TOKENIZER_INFIXES
         token_match = TOKEN_MATCH
    -    lemma_lookup = dict(LOOKUP)
    +    lemma_lookup = LOOKUP
     
     
     class Hungarian(Language):
    diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py
    index 29fe86a01..2f21e73cf 100644
    --- a/spacy/lang/id/__init__.py
    +++ b/spacy/lang/id/__init__.py
    @@ -20,12 +20,12 @@ class IndonesianDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'id'
         lex_attr_getters.update(LEX_ATTRS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    -    prefixes = tuple(TOKENIZER_PREFIXES)
    -    suffixes = tuple(TOKENIZER_SUFFIXES)
    -    infixes = tuple(TOKENIZER_INFIXES)
    -    syntax_iterators = dict(SYNTAX_ITERATORS)
    -    lemma_lookup = dict(LOOKUP)
    +    stop_words = STOP_WORDS
    +    prefixes = TOKENIZER_PREFIXES
    +    suffixes = TOKENIZER_SUFFIXES
    +    infixes = TOKENIZER_INFIXES
    +    syntax_iterators = SYNTAX_ITERATORS
    +    lemma_lookup = LOOKUP
     
     
     class Indonesian(Language):
    diff --git a/spacy/lang/it/__init__.py b/spacy/lang/it/__init__.py
    index c19cb6d39..6bc47ce92 100644
    --- a/spacy/lang/it/__init__.py
    +++ b/spacy/lang/it/__init__.py
    @@ -16,8 +16,8 @@ class ItalianDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'it'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    -    lemma_lookup = dict(LOOKUP)
    +    stop_words = STOP_WORDS
    +    lemma_lookup = LOOKUP
     
     
     class Italian(Language):
    diff --git a/spacy/lang/nb/__init__.py b/spacy/lang/nb/__init__.py
    index 8804f7424..4250e6809 100644
    --- a/spacy/lang/nb/__init__.py
    +++ b/spacy/lang/nb/__init__.py
    @@ -17,7 +17,7 @@ class NorwegianDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'nb'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    +    stop_words = STOP_WORDS
     
     
     class Norwegian(Language):
    diff --git a/spacy/lang/nl/__init__.py b/spacy/lang/nl/__init__.py
    index 29cbb4617..13786a7bc 100644
    --- a/spacy/lang/nl/__init__.py
    +++ b/spacy/lang/nl/__init__.py
    @@ -17,7 +17,7 @@ class DutchDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'nl'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    +    stop_words = STOP_WORDS
     
     
     class Dutch(Language):
    diff --git a/spacy/lang/pl/__init__.py b/spacy/lang/pl/__init__.py
    index 22e103246..80011f9d8 100644
    --- a/spacy/lang/pl/__init__.py
    +++ b/spacy/lang/pl/__init__.py
    @@ -16,7 +16,7 @@ class PolishDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'pl'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    +    stop_words = STOP_WORDS
     
     
     class Polish(Language):
    diff --git a/spacy/lang/pt/__init__.py b/spacy/lang/pt/__init__.py
    index 6366a25c1..2a8323597 100644
    --- a/spacy/lang/pt/__init__.py
    +++ b/spacy/lang/pt/__init__.py
    @@ -19,8 +19,8 @@ class PortugueseDefaults(Language.Defaults):
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         lex_attr_getters.update(LEX_ATTRS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    -    lemma_lookup = dict(LOOKUP)
    +    stop_words = STOP_WORDS
    +    lemma_lookup = LOOKUP
     
     
     class Portuguese(Language):
    diff --git a/spacy/lang/sv/__init__.py b/spacy/lang/sv/__init__.py
    index 27da9024e..224c105d7 100644
    --- a/spacy/lang/sv/__init__.py
    +++ b/spacy/lang/sv/__init__.py
    @@ -18,9 +18,9 @@ class SwedishDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'sv'
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    -    lemma_rules = dict(LEMMA_RULES)
    -    lemma_lookup = dict(LOOKUP)
    +    stop_words = STOP_WORDS
    +    lemma_rules = LEMMA_RULES
    +    lemma_lookup = LOOKUP
     
     
     class Swedish(Language):
    diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py
    index e640fc4ef..bedec46c8 100644
    --- a/spacy/lang/th/__init__.py
    +++ b/spacy/lang/th/__init__.py
    @@ -17,8 +17,8 @@ class ThaiDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters[LANG] = lambda text: 'th'
         tokenizer_exceptions = dict(TOKENIZER_EXCEPTIONS)
    -    tag_map = dict(TAG_MAP)
    -    stop_words = set(STOP_WORDS)
    +    tag_map = TAG_MAP
    +    stop_words = STOP_WORDS
     
     
     class Thai(Language):
    
    From cecfcc77114af45bcc6e52da3c937c8c634c1dca Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 13:12:26 +0200
    Subject: [PATCH 341/649] Set default hyper params back to 'slow' settings
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 1059982bc..5b087d367 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -240,8 +240,8 @@ cdef class Parser:
         @classmethod
         def Model(cls, nr_class, **cfg):
             depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
    -        token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 64))
    -        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 64))
    +        token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
    +        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200))
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
             hist_size = util.env_opt('history_feats', cfg.get('hist_size', 4))
    
    From a955843684cdbc5c2ac26a89bf2b1b3efeebbaff Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 13:13:01 +0200
    Subject: [PATCH 342/649] Increase default number of epochs
    
    ---
     spacy/cli/train.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 3dae3f68b..2faea72e7 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -44,7 +44,7 @@ numpy.random.seed(0)
         version=("Model version", "option", "V", str),
         meta_path=("Optional path to meta.json. All relevant properties will be overwritten.", "option", "m", Path)
     )
    -def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
    +def train(cmd, lang, output_dir, train_data, dev_data, n_iter=30, n_sents=0,
               use_gpu=-1, vectors=None, no_tagger=False, no_parser=False, no_entities=False,
               gold_preproc=False, version="0.0.0", meta_path=None):
         """
    
    From 908f44c3fe0e025ca9b7cf57d5428331fe66a07d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 14:56:11 +0200
    Subject: [PATCH 343/649] Disable history features by default
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 5b087d367..1f4918935 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -244,8 +244,8 @@ cdef class Parser:
             hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200))
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
    -        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 4))
    -        hist_width = util.env_opt('history_width', cfg.get('hist_width', 16))
    +        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
    +        hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    
    From fff1028391aee0f4218dfd7f572a86407cee48cf Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 12 Oct 2017 20:05:06 +0200
    Subject: [PATCH 344/649] Add validate CLI command
    
    ---
     spacy/__main__.py     |   3 +-
     spacy/cli/__init__.py |   1 +
     spacy/cli/validate.py | 123 ++++++++++++++++++++++++++++++++++++++++++
     3 files changed, 126 insertions(+), 1 deletion(-)
     create mode 100644 spacy/cli/validate.py
    
    diff --git a/spacy/__main__.py b/spacy/__main__.py
    index 0ec96e4a1..99d6b116c 100644
    --- a/spacy/__main__.py
    +++ b/spacy/__main__.py
    @@ -7,7 +7,7 @@ if __name__ == '__main__':
         import plac
         import sys
         from spacy.cli import download, link, info, package, train, convert, model
    -    from spacy.cli import profile, evaluate
    +    from spacy.cli import profile, evaluate, validate
         from spacy.util import prints
     
         commands = {
    @@ -20,6 +20,7 @@ if __name__ == '__main__':
             'package': package,
             'model': model,
             'profile': profile,
    +        'validate': validate
         }
         if len(sys.argv) == 1:
             prints(', '.join(commands), title="Available commands", exits=1)
    diff --git a/spacy/cli/__init__.py b/spacy/cli/__init__.py
    index ebe185f24..2595dcc03 100644
    --- a/spacy/cli/__init__.py
    +++ b/spacy/cli/__init__.py
    @@ -7,3 +7,4 @@ from .train import train
     from .evaluate import evaluate
     from .convert import convert
     from .model import model
    +from .validate import validate
    diff --git a/spacy/cli/validate.py b/spacy/cli/validate.py
    new file mode 100644
    index 000000000..68c8c5053
    --- /dev/null
    +++ b/spacy/cli/validate.py
    @@ -0,0 +1,123 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +import requests
    +import pkg_resources
    +from pathlib import Path
    +
    +from ..compat import path2str
    +from ..util import prints, get_data_path, read_json
    +from .. import about
    +
    +
    +def validate(cmd):
    +    """Validate that the currently installed version of spaCy is compatible
    +    with the installed models. Should be run after `pip install -U spacy`.
    +    """
    +    r = requests.get(about.__compatibility__)
    +    if r.status_code != 200:
    +        prints("Couldn't fetch compatibility table.",
    +               title="Server error (%d)" % r.status_code, exits=1)
    +    compat = r.json()['spacy']
    +    all_models = set()
    +    for spacy_v, models in dict(compat).items():
    +        all_models.update(models.keys())
    +        for model, model_vs in models.items():
    +            compat[spacy_v][model] = [reformat_version(v) for v in model_vs]
    +
    +    current_compat = compat[about.__version__]
    +    model_links = get_model_links(current_compat)
    +    model_pkgs = get_model_pkgs(current_compat, all_models)
    +    incompat_links = {l for l, d in model_links.items() if not d['compat']}
    +    incompat_models = {d['name'] for _, d in model_pkgs.items() if not d['compat']}
    +    incompat_models.update([d['name'] for _, d in model_links.items() if not d['compat']])
    +    na_models = [m for m in incompat_models if m not in current_compat]
    +    update_models = [m for m in incompat_models if m in current_compat]
    +
    +    prints(path2str(Path(__file__).parent.parent),
    +           title="Installed models (spaCy v{})".format(about.__version__))
    +    if model_links or model_pkgs:
    +        print(get_row('TYPE', 'NAME', 'MODEL', 'VERSION', ''))
    +        for name, data in model_pkgs.items():
    +            print(get_model_row(current_compat, name, data, 'package'))
    +        for name, data in model_links.items():
    +            print(get_model_row(current_compat, name, data, 'link'))
    +    else:
    +        prints("No models found in your current environment.", exits=0)
    +
    +    if update_models:
    +        cmd = '    python -m spacy download {}'
    +        print("\n    Use the following commands to update the model packages:")
    +        print('\n'.join([cmd.format(pkg) for pkg in update_models]))
    +
    +    if na_models:
    +        prints("The following models are not available for spaCy v{}: {}"
    +               .format(about.__version__, ', '.join(na_models)))
    +
    +    if incompat_links:
    +        prints("You may also want to overwrite the incompatible links using "
    +               "the `spacy link` command with `--force`, or remove them from "
    +               "the data directory. Data path: {}"
    +               .format(path2str(get_data_path())))
    +
    +
    +def get_model_links(compat):
    +    links = {}
    +    data_path = get_data_path()
    +    if data_path:
    +        models = [p for p in data_path.iterdir() if is_model_path(p)]
    +        for model in models:
    +            meta_path = Path(model) / 'meta.json'
    +            if not meta_path.exists():
    +                continue
    +            meta = read_json(meta_path)
    +            link = model.parts[-1]
    +            name = meta['lang'] + '_' + meta['name']
    +            links[link] = {'name': name, 'version': meta['version'],
    +                           'compat': is_compat(compat, name, meta['version'])}
    +    return links
    +
    +
    +def get_model_pkgs(compat, all_models):
    +    pkgs = {}
    +    for pkg_name, pkg_data in pkg_resources.working_set.by_key.items():
    +        package = pkg_name.replace('-', '_')
    +        if package in all_models:
    +            version = pkg_data.version
    +            pkgs[pkg_name] = {'name': package, 'version': version,
    +                              'compat': is_compat(compat, package, version)}
    +    return pkgs
    +
    +
    +def get_model_row(compat, name, data, type='package'):
    +    tpl_row = '    {:<10}' + ('  {:<20}' * 4)
    +    tpl_red = '\x1b[38;5;1m{}\x1b[0m'
    +    tpl_green = '\x1b[38;5;2m{}\x1b[0m'
    +    if data['compat']:
    +        comp = tpl_green.format('✔')
    +        version = tpl_green.format(data['version'])
    +    else:
    +        comp = '--> {}'.format(compat.get(data['name'], ['n/a'])[0])
    +        version = tpl_red.format(data['version'])
    +    return get_row(type, name, data['name'], version, comp)
    +
    +
    +def get_row(*args):
    +    tpl_row = '    {:<10}' + ('  {:<20}' * 4)
    +    return tpl_row.format(*args)
    +
    +
    +def is_model_path(model_path):
    +    exclude = ['cache', 'pycache', '__pycache__']
    +    name = model_path.parts[-1]
    +    return model_path.is_dir() and name not in exclude and not name.startswith('.')
    +
    +
    +def is_compat(compat, name, version):
    +    return name in compat and version in compat[name]
    +
    +
    +def reformat_version(version):
    +    if version.endswith('-alpha'):
    +        return version.replace('-alpha', 'a0')
    +    return version.replace('-alpha', 'a')
    
    From 39d3cbfdbae08fc43a64fdaa38af23b2d80ee1d3 Mon Sep 17 00:00:00 2001
    From: Jeffrey Gerard 
    Date: Thu, 12 Oct 2017 11:39:12 -0700
    Subject: [PATCH 345/649] Bugfix example script train_ner_standalone.py, fails
     after training
    
    ---
     examples/training/train_ner_standalone.py | 6 ++----
     1 file changed, 2 insertions(+), 4 deletions(-)
    
    diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py
    index e4fb1d1e8..3c2c2781a 100644
    --- a/examples/training/train_ner_standalone.py
    +++ b/examples/training/train_ner_standalone.py
    @@ -142,16 +142,14 @@ def train(nlp, train_examples, dev_examples, nr_epoch=5):
                 inputs, annots = zip(*batch)
                 nlp.update(list(inputs), list(annots), sgd, losses=losses)
             scores = nlp.evaluate(dev_examples)
    -        report_scores(i, losses['ner'], scores)
    -    scores = nlp.evaluate(dev_examples)
    -    report_scores(channels, i+1, loss, scores)
    +        report_scores(i+1, losses['ner'], scores)
     
     
     def report_scores(i, loss, scores):
         precision = '%.2f' % scores['ents_p']
         recall = '%.2f' % scores['ents_r']
         f_measure = '%.2f' % scores['ents_f']
    -    print('%d %s %s %s' % (int(loss), precision, recall, f_measure))
    +    print('Epoch %d: %d %s %s %s' % (i, int(loss), precision, recall, f_measure))
     
     
     def read_examples(path):
    
    From 462caf835a9e499387ca20858aecd6e4d9da725d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 21:18:22 +0200
    Subject: [PATCH 346/649] Fix SBD test
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index f10b96192..4c973bd97 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -35,7 +35,7 @@ def parser(vocab):
     def test_no_sentences(parser):
         doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
         doc = parser(doc)
    -    assert len(list(doc.sents)) == 2
    +    assert len(list(doc.sents)) >= 1
     
     
     def test_sents_1(parser):
    
    From 5ba970b4954e7bfe1904eb31a284e11abbf4e7ff Mon Sep 17 00:00:00 2001
    From: Jeffrey Gerard 
    Date: Thu, 12 Oct 2017 12:34:46 -0700
    Subject: [PATCH 347/649] minor cleanup
    
    ---
     examples/training/train_ner_standalone.py | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py
    index 3c2c2781a..0c5094bb7 100644
    --- a/examples/training/train_ner_standalone.py
    +++ b/examples/training/train_ner_standalone.py
    @@ -6,7 +6,7 @@ To achieve that, it duplicates some of spaCy's internal functionality.
     
     Specifically, in this example, we don't use spaCy's built-in Language class to
     wire together the Vocab, Tokenizer and EntityRecognizer. Instead, we write
    -our own simle Pipeline class, so that it's easier to see how the pieces
    +our own simple Pipeline class, so that it's easier to see how the pieces
     interact.
     
     Input data:
    @@ -149,7 +149,8 @@ def report_scores(i, loss, scores):
         precision = '%.2f' % scores['ents_p']
         recall = '%.2f' % scores['ents_r']
         f_measure = '%.2f' % scores['ents_f']
    -    print('Epoch %d: %d %s %s %s' % (i, int(loss), precision, recall, f_measure))
    +    print('Epoch %d: %d %s %s %s' % (
    +        i, int(loss), precision, recall, f_measure))
     
     
     def read_examples(path):
    
    From 27b927259a8196816fe5a5c2e789866029e3107f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 22:22:04 +0200
    Subject: [PATCH 348/649] Add locale_escape compat function
    
    ---
     spacy/compat.py | 10 ++++++++++
     1 file changed, 10 insertions(+)
    
    diff --git a/spacy/compat.py b/spacy/compat.py
    index e6b7c066b..81243ce1b 100644
    --- a/spacy/compat.py
    +++ b/spacy/compat.py
    @@ -6,6 +6,7 @@ import ftfy
     import sys
     import ujson
     import itertools
    +import locale
     
     from thinc.neural.util import copy_array
     
    @@ -113,3 +114,12 @@ def import_file(name, loc):
             module = importlib.util.module_from_spec(spec)
             spec.loader.exec_module(module)
             return module
    +
    +
    +def locale_escape(string, errors='replace'):
    +    '''
    +    Mangle non-supported characters, for savages with ascii terminals.
    +    '''
    +    encoding = locale.getpreferredencoding()
    +    string = string.encode(encoding, errors).decode('utf8')
    +    return string
    
    From dc01acd82199562529bc6c6ec7b92543dea895fb Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 22:23:21 +0200
    Subject: [PATCH 349/649] Escape encoding in validate function
    
    ---
     spacy/cli/validate.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/cli/validate.py b/spacy/cli/validate.py
    index 68c8c5053..c1f992ed6 100644
    --- a/spacy/cli/validate.py
    +++ b/spacy/cli/validate.py
    @@ -5,7 +5,7 @@ import requests
     import pkg_resources
     from pathlib import Path
     
    -from ..compat import path2str
    +from ..compat import path2str, locale_escape
     from ..util import prints, get_data_path, read_json
     from .. import about
     
    @@ -94,7 +94,7 @@ def get_model_row(compat, name, data, type='package'):
         tpl_red = '\x1b[38;5;1m{}\x1b[0m'
         tpl_green = '\x1b[38;5;2m{}\x1b[0m'
         if data['compat']:
    -        comp = tpl_green.format('✔')
    +        comp = tpl_green.format(locale_escape('✔', errors='ignore'))
             version = tpl_green.format(data['version'])
         else:
             comp = '--> {}'.format(compat.get(data['name'], ['n/a'])[0])
    
    From 9b90d235d111a87b50e46c92431d0412d9e5a8c1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 22:50:43 +0200
    Subject: [PATCH 350/649] Fix tag check in lemmatizer
    
    ---
     spacy/lemmatizer.py | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 1fb83a727..53519e4f1 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -17,13 +17,13 @@ class Lemmatizer(object):
             self.lookup_table = lookup if lookup is not None else {}
     
         def __call__(self, string, univ_pos, morphology=None):
    -        if univ_pos == NOUN:
    +        if univ_pos in (NOUN, 'NOUN', 'noun'):
                 univ_pos = 'noun'
    -        elif univ_pos == VERB:
    +        elif univ_pos in (VERB, 'VERB', 'verb'):
                 univ_pos = 'verb'
    -        elif univ_pos == ADJ:
    +        elif univ_pos in (ADJ, 'ADJ', 'adj'):
                 univ_pos = 'adj'
    -        elif univ_pos == PUNCT:
    +        elif univ_pos in (PUNCT, 'PUNCT', 'punct'):
                 univ_pos = 'punct'
             else:
                 return set([string.lower()])
    
    From cf6da9301a2e7896da05638c85656683ffd0d413 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 22:50:52 +0200
    Subject: [PATCH 351/649] Update lemmatizer test
    
    ---
     spacy/tests/lang/en/test_lemmatizer.py | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/tests/lang/en/test_lemmatizer.py b/spacy/tests/lang/en/test_lemmatizer.py
    index ecde87bed..22c8f2499 100644
    --- a/spacy/tests/lang/en/test_lemmatizer.py
    +++ b/spacy/tests/lang/en/test_lemmatizer.py
    @@ -57,6 +57,5 @@ def test_en_lemmatizer_punct(en_lemmatizer):
     def test_en_lemmatizer_lemma_assignment(EN):
         text = "Bananas in pyjamas are geese."
         doc = EN.make_doc(text)
    -    assert all(t.lemma_ == '' for t in doc)
         EN.tagger(doc)
         assert all(t.lemma_ != '' for t in doc)
    
    From 9fd68334abe06e14a0dcb5889afea64d6b290df4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 12 Oct 2017 23:36:44 +0200
    Subject: [PATCH 352/649] Add validate command docs
    
    ---
     website/api/_top-level/_cli.jade | 16 ++++++++++++++++
     1 file changed, 16 insertions(+)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index 3a4b4702a..b2a9c574d 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -113,6 +113,22 @@ p
             +cell flag
             +cell Show help message and available arguments.
     
    ++h(3, "validate") Validate
    +    +tag-new(2)
    +
    +p
    +    |  Find all models installed in the current environment (both packages and
    +    |  shortcut links) and check whether they are compatible with the currently
    +    |  installed version of spaCy. Should be run after upgrading spaCy via
    +    |  #[code pip install -U spacy] to ensure that all installed models are
    +    |  can be used with the new version. The command is also useful to detect
    +    |  out-of-sync model links resulting from links created in different virtual
    +    |  environments. Prints a list of models, the installed versions, the latest
    +    |  compatible version (if out of date) and the commands for updating.
    +
    ++code(false, "bash", "$").
    +    spacy validate
    +
     +h(3, "convert") Convert
     
     p
    
    From 5f5d6897e81645a2e7c26a707d1e1cc6f53cbab3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 13 Oct 2017 00:18:02 +0200
    Subject: [PATCH 353/649] Increment version
    
    ---
     website/_harp.json | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/_harp.json b/website/_harp.json
    index 55035c32f..d87fda049 100644
    --- a/website/_harp.json
    +++ b/website/_harp.json
    @@ -84,8 +84,8 @@
             ],
     
             "ALPHA": true,
    -        "V_CSS": "2.0",
    -        "V_JS": "2.0",
    +        "V_CSS": "2.0a0",
    +        "V_JS": "2.0a0",
             "DEFAULT_SYNTAX": "python",
             "ANALYTICS": "UA-58931649-1",
             "MAILCHIMP": {
    
    From bfd9506f1d69520b6b153390cf34fb9e8288f6ae Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 13 Oct 2017 00:18:13 +0200
    Subject: [PATCH 354/649] Update extensions docs and add resources
    
    ---
     website/usage/_data.json                        |  1 +
     .../_processing-pipelines/_extensions.jade      |  5 +++--
     website/usage/resources.jade                    | 17 +++++++++++++++++
     3 files changed, 21 insertions(+), 2 deletions(-)
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index 06b0371ae..cc9918631 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -183,6 +183,7 @@
             "teaser": "Libraries, demos, books, courses and research systems featuring spaCy.",
             "menu": {
                 "Third-party libraries": "libraries",
    +            "Extensions": "extensions",
                 "Demos & Visualizations": "demos",
                 "Books & Courses": "books",
                 "Jupyter Notebooks": "notebooks",
    diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
    index a1d8168e0..795d2d7c5 100644
    --- a/website/usage/_processing-pipelines/_extensions.jade
    +++ b/website/usage/_processing-pipelines/_extensions.jade
    @@ -4,7 +4,8 @@ p
         |  We're very excited about all the new possibilities for community
         |  extensions and plugins in spaCy v2.0, and we can't wait to see what
         |  you build with it! To get you started, here are a few tips, tricks and
    -    |  best practices:
    +    |  best practices. For examples of other spaCy extensions, see the
    +    |  #[+a("/usage/resources#extensions") resources].
     
     +list
         +item
    @@ -104,7 +105,7 @@ p
             |  #[+a("https://pypi.python.org") PyPi]. If you're sharing your code on
             |  GitHub, don't forget to tag it
             |  with #[+a("https://github.com/search?q=topic%3Aspacy") #[code spacy]]
    -        |  and #[+a("https://github.com/search?q=topic%3Aspacy-pipeline") #[code spacy-pipeline]]
    +        |  and #[+a("https://github.com/search?q=topic%3Aspacy-extensions") #[code spacy-extensions]]
             |  to help people find it. If you post it on Twitter, feel free to tag
             |  #[+a("https://twitter.com/" + SOCIAL.twitter) @#{SOCIAL.twitter}]
             |  so we can check it out.
    diff --git a/website/usage/resources.jade b/website/usage/resources.jade
    index 33a2a45aa..285c211e8 100644
    --- a/website/usage/resources.jade
    +++ b/website/usage/resources.jade
    @@ -41,6 +41,23 @@ include ../_includes/_mixins
         .u-text-right
             +button("https://github.com/search?o=desc&q=spacy&s=stars&type=Repositories&utf8=%E2%9C%93", false, "primary", "small") See more projects on GitHub
     
    ++section("extensions")
    +    +h(2, "extensions") Extensions & Pipeline Components
    +
    +    p
    +        |  This section lists spaCy extensions and components you can plug into
    +        |  your processing pipeline. For more details, see the docs on
    +        |  #[+a("/usage/processing-pipelines#custom-components") custom components]
    +        |  and #[+a("/usage/processing-pipelines#extensions") extensions].
    +
    +    +grid
    +        +card("spacymoji", "https://github.com/ines/spacymoji", "Ines Montani", "github")
    +            |  Pipeline component for emoji handling and adding emoji meta data
    +            |  to #[code Doc], #[code Token] and #[code Span] attributes.
    +
    +    .u-text-right
    +        +button("https://github.com/search?o=desc&q=spacy-extensions&s=stars&type=Repositories&utf8=%E2%9C%93", false, "primary", "small") See more extensions on GitHub
    +
     +section("demos")
         +h(2, "demos") Demos & Visualizations
     
    
    From bb6ecb82e52bd002837e9c449808b2e47acc24d8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:51:52 +0200
    Subject: [PATCH 355/649] Ensure long file paths in code examples break if
     needed
    
    ---
     website/_harp.json                       | 2 +-
     website/_includes/_mixins.jade           | 2 +-
     website/assets/css/_base/_utilities.sass | 3 +++
     3 files changed, 5 insertions(+), 2 deletions(-)
    
    diff --git a/website/_harp.json b/website/_harp.json
    index d87fda049..7c69beef0 100644
    --- a/website/_harp.json
    +++ b/website/_harp.json
    @@ -84,7 +84,7 @@
             ],
     
             "ALPHA": true,
    -        "V_CSS": "2.0a0",
    +        "V_CSS": "2.0a1",
             "V_JS": "2.0a0",
             "DEFAULT_SYNTAX": "python",
             "ANALYTICS": "UA-58931649-1",
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 7666889b5..414ee809e 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -190,7 +190,7 @@ mixin github(repo, file, alt_file, height)
                 code.c-code-block__content(data-gh-embed="#{repo}/#{branch}/#{file}")
     
             footer.o-grid.u-text
    -            .o-block-small.u-flex-full #[+icon("github")] #[code=repo + '/' + (alt_file || file)]
    +            .o-block-small.u-flex-full.u-padding-small #[+icon("github")] #[code.u-break.u-break--all=repo + '/' + (alt_file || file)]
                 div
                     +button(gh(repo, alt_file || file), false, "primary", "small") View on GitHub
     
    diff --git a/website/assets/css/_base/_utilities.sass b/website/assets/css/_base/_utilities.sass
    index 91a6251e6..8c1e82706 100644
    --- a/website/assets/css/_base/_utilities.sass
    +++ b/website/assets/css/_base/_utilities.sass
    @@ -188,6 +188,9 @@
         word-wrap: break-word
         white-space: initial
     
    +    &.u-break--all
    +        word-break: break-all
    +
     .u-no-border
         border: none
     
    
    From a69f4e56e53c093aed0ffa72352043f331d3528c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:52:07 +0200
    Subject: [PATCH 356/649] Remove outdated aside
    
    ---
     website/usage/_spacy-101/_community-faq.jade | 8 --------
     1 file changed, 8 deletions(-)
    
    diff --git a/website/usage/_spacy-101/_community-faq.jade b/website/usage/_spacy-101/_community-faq.jade
    index f91248bfd..a3a04647d 100644
    --- a/website/usage/_spacy-101/_community-faq.jade
    +++ b/website/usage/_spacy-101/_community-faq.jade
    @@ -115,14 +115,6 @@ p
         |  website is open-source, you can add your project or tutorial by making a
         |  pull request on GitHub.
     
    -+aside("Contributing to spacy.io")
    -    |  All showcase and tutorial links are stored in a
    -    |  #[+a(gh("spaCy", "website/usage/_data.json")) JSON file], so you
    -    |  won't even have to edit any markup. For more info on how to submit
    -    |  your project, see the
    -    |  #[+a(gh("spaCy", "CONTRIBUTING.md#submitting-a-project-to-the-showcase")) contributing guidelines]
    -    |  and our #[+a(gh("spaCy", "website")) website docs].
    -
     p
         |  If you would like to use the spaCy logo on your site, please get in touch
         |  and ask us first. However, if you want to show support and tell others
    
    From a5da683578db7711073f37a6fadf34def5305ea4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:52:41 +0200
    Subject: [PATCH 357/649] Add Russian to alpha docs and update tokenizer
     dependencies
    
    ---
     website/models/_data.json             |  1 +
     website/usage/_models/_languages.jade | 11 +++++++----
     2 files changed, 8 insertions(+), 4 deletions(-)
    
    diff --git a/website/models/_data.json b/website/models/_data.json
    index b2898be8a..f7ba16c9f 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -80,6 +80,7 @@
             "da": "Danish",
             "hu": "Hungarian",
             "pl": "Polish",
    +        "ru": "Russian",
             "he": "Hebrew",
             "bn": "Bengali",
             "id": "Indonesian",
    diff --git a/website/usage/_models/_languages.jade b/website/usage/_models/_languages.jade
    index abdad01ad..4337b5b99 100644
    --- a/website/usage/_models/_languages.jade
    +++ b/website/usage/_models/_languages.jade
    @@ -40,10 +40,13 @@ p
                         +src(gh("spaCy", "spacy/lang/" + code)) #[code lang/#{code}]
     
     +infobox("Dependencies")
    -    |  Some language tokenizers require external dependencies. To use #[strong Chinese],
    -    |  you need to have #[+a("https://github.com/fxsjy/jieba") Jieba] installed.
    -    |  The #[strong Japanese] tokenizer requires
    -    |  #[+a("https://github.com/mocobeta/janome") Janome].
    +    .o-block-small Some language tokenizers require external dependencies.
    +
    +    +list.o-no-block
    +        +item #[strong Chinese]: #[+a("https://github.com/fxsjy/jieba") Jieba]
    +        +item #[strong Japanese]: #[+a("https://github.com/mocobeta/janome") Janome]
    +        +item #[strong Thai]: #[+a("https://github.com/wannaphongcom/pythainlp") pythainlp]
    +        +item #[strong Russian]: #[+a("https://github.com/kmike/pymorphy2") pymorphy2]
     
     +h(3, "multi-language") Multi-language support
         +tag-new(2)
    
    From 09aed581405588947697cdaa2474fd7705197c86 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:52:59 +0200
    Subject: [PATCH 358/649] Port over changes from #1333 and add comments
    
    ---
     spacy/lang/char_classes.py | 10 +++++++++-
     1 file changed, 9 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py
    index b10481411..89774b17d 100644
    --- a/spacy/lang/char_classes.py
    +++ b/spacy/lang/char_classes.py
    @@ -29,11 +29,19 @@ _units = ('km km² km³ m m² m³ dm dm² dm³ cm cm² cm³ mm mm² mm³ ha µm
               'kg g mg µg t lb oz m/s km/h kmh mph hPa Pa mbar mb MB kb KB gb GB tb '
               'TB T G M K %')
     _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$'
    +
    +# These expressions contain various unicode variations, including characters
    +# used in Chinese (see #1333, #1340, #1351) – unless there are cross-language
    +# conflicts, spaCy's base tokenizer should handle all of those by default
     _punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* & 。 ? ! , 、 ; : ~ ·'
    -_quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‚ , „ » «'
    +_quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‘‘ ’’ ‚ , „ » « 「 」 『 』 ( ) 〔 〕 【 】 《 》 〈 〉'
     _hyphens = '- – — -- --- —— ~'
    +
    +# Various symbols like dingbats, but also emoji
    +# Details: https://www.compart.com/en/unicode/category/So
     _other_symbols = r'[\p{So}]'
     
    +
     UNITS = merge_chars(_units)
     CURRENCY = merge_chars(_currency)
     QUOTES = merge_chars(_quotes)
    
    From a4d974d97bcbb6f1d9102c2f5146d4e5016fb8ba Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:58:07 +0200
    Subject: [PATCH 359/649] Port over URL pattern changes from #1411
    
    ---
     spacy/lang/tokenizer_exceptions.py |  6 +++---
     spacy/tests/tokenizer/test_urls.py | 18 +++++++++---------
     2 files changed, 12 insertions(+), 12 deletions(-)
    
    diff --git a/spacy/lang/tokenizer_exceptions.py b/spacy/lang/tokenizer_exceptions.py
    index 6a7c09a44..73ad88d08 100644
    --- a/spacy/lang/tokenizer_exceptions.py
    +++ b/spacy/lang/tokenizer_exceptions.py
    @@ -36,11 +36,11 @@ URL_PATTERN = (
         r"(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))"
         r"|"
         # host name
    -    r"(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)"
    +    r"(?:(?:[a-z0-9\-]*)?[a-z0-9]+)"
         # domain name
    -    r"(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*"
    +    r"(?:\.(?:[a-z0-9\-])*[a-z0-9]+)*"
         # TLD identifier
    -    r"(?:\.(?:[a-z\u00a1-\uffff]{2,}))"
    +    r"(?:\.(?:[a-z]{2,}))"
         r")"
         # port number
         r"(?::\d{2,5})?"
    diff --git a/spacy/tests/tokenizer/test_urls.py b/spacy/tests/tokenizer/test_urls.py
    index 959067110..3bb6521f1 100644
    --- a/spacy/tests/tokenizer/test_urls.py
    +++ b/spacy/tests/tokenizer/test_urls.py
    @@ -33,13 +33,10 @@ URLS_SHOULD_MATCH = [
         "http://userid:password@example.com/",
         "http://142.42.1.1/",
         "http://142.42.1.1:8080/",
    -    "http://⌘.ws",
    -    "http://⌘.ws/",
         "http://foo.com/blah_(wikipedia)#cite-1",
         "http://foo.com/blah_(wikipedia)_blah#cite-1",
         "http://foo.com/unicode_(✪)_in_parens",
         "http://foo.com/(something)?after=parens",
    -    "http://☺.damowmow.com/",
         "http://code.google.com/events/#&product=browser",
         "http://j.mp",
         "ftp://foo.bar/baz",
    @@ -49,14 +46,17 @@ URLS_SHOULD_MATCH = [
         "http://a.b-c.de",
         "http://223.255.255.254",
         "http://a.b--c.de/", # this is a legit domain name see: https://gist.github.com/dperini/729294 comment on 9/9/2014
    -    "http://✪df.ws/123",
    -    "http://➡.ws/䨹",
    -    "http://مثال.إختبار",
    -    "http://例子.测试",
    -    "http://उदाहरण.परीक्षा",
     
         pytest.mark.xfail("http://foo.com/blah_blah_(wikipedia)"),
         pytest.mark.xfail("http://foo.com/blah_blah_(wikipedia)_(again)"),
    +    pytest.mark.xfail("http://⌘.ws"),
    +    pytest.mark.xfail("http://⌘.ws/"),
    +    pytest.mark.xfail("http://☺.damowmow.com/"),
    +    pytest.mark.xfail("http://✪df.ws/123"),
    +    pytest.mark.xfail("http://➡.ws/䨹"),
    +    pytest.mark.xfail("http://مثال.إختبار"),
    +    pytest.mark.xfail("http://例子.测试"),
    +    pytest.mark.xfail("http://उदाहरण.परीक्षा"),
     ]
     
     URLS_SHOULD_NOT_MATCH = [
    @@ -83,7 +83,6 @@ URLS_SHOULD_NOT_MATCH = [
         "http://foo.bar/foo(bar)baz quux",
         "ftps://foo.bar/",
         "http://-error-.invalid/",
    -    "http://-a.b.co",
         "http://a.b-.co",
         "http://0.0.0.0",
         "http://10.1.1.0",
    @@ -99,6 +98,7 @@ URLS_SHOULD_NOT_MATCH = [
         pytest.mark.xfail("foo.com"),
         pytest.mark.xfail("http://1.1.1.1.1"),
         pytest.mark.xfail("http://www.foo.bar./"),
    +    pytest.mark.xfail("http://-a.b.co"),
     ]
     
     
    
    From 9b3f8f9ec3c98c94581694060cfb60be0b8bf2f3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:11:18 +0200
    Subject: [PATCH 360/649] Fix formatting and add comment on languages
    
    ---
     spacy/tests/conftest.py | 11 ++++++++++-
     1 file changed, 10 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py
    index 28b5f4ab9..5f3fea342 100644
    --- a/spacy/tests/conftest.py
    +++ b/spacy/tests/conftest.py
    @@ -11,8 +11,12 @@ from ..strings import StringStore
     from .. import util
     
     
    +# These languages are used for generic tokenizer tests – only add a language
    +# here if it's using spaCy's tokenizer (not a different library)
    +# TODO: re-implement generic tokenizer tests
     _languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'id',
    -              'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'th','xx']
    +              'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'xx']
    +
     _models = {'en': ['en_core_web_sm'],
                'de': ['de_core_news_md'],
                'fr': ['fr_depvec_web_lg'],
    @@ -42,6 +46,7 @@ def FR(request):
         #lang = util.get_lang_class(request.param)
         #return lang.Defaults.create_tokenizer()
     
    +
     @pytest.fixture
     def tokenizer():
         return util.get_lang_class('xx').Defaults.create_tokenizer()
    @@ -87,10 +92,12 @@ def hu_tokenizer():
     def fi_tokenizer():
         return util.get_lang_class('fi').Defaults.create_tokenizer()
     
    +
     @pytest.fixture
     def id_tokenizer():
         return util.get_lang_class('id').Defaults.create_tokenizer()
     
    +
     @pytest.fixture
     def sv_tokenizer():
         return util.get_lang_class('sv').Defaults.create_tokenizer()
    @@ -105,6 +112,7 @@ def bn_tokenizer():
     def he_tokenizer():
         return util.get_lang_class('he').Defaults.create_tokenizer()
     
    +
     @pytest.fixture
     def nb_tokenizer():
         return util.get_lang_class('nb').Defaults.create_tokenizer()
    @@ -129,6 +137,7 @@ def en_entityrecognizer():
     def text_file():
         return StringIO()
     
    +
     @pytest.fixture
     def text_file_b():
         return BytesIO()
    
    From 612224c10da6cbb956d687dedd33a741d0212750 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:11:39 +0200
    Subject: [PATCH 361/649] Port over changes from #1157
    
    ---
     spacy/lang/ja/__init__.py             | 30 +++++++++++++++++++++------
     spacy/tests/conftest.py               |  7 +++++++
     spacy/tests/lang/ja/__init__.py       |  0
     spacy/tests/lang/ja/test_tokenizer.py | 19 +++++++++++++++++
     4 files changed, 50 insertions(+), 6 deletions(-)
     create mode 100644 spacy/tests/lang/ja/__init__.py
     create mode 100644 spacy/tests/lang/ja/test_tokenizer.py
    
    diff --git a/spacy/lang/ja/__init__.py b/spacy/lang/ja/__init__.py
    index 09ad9945e..3a9c58fca 100644
    --- a/spacy/lang/ja/__init__.py
    +++ b/spacy/lang/ja/__init__.py
    @@ -4,18 +4,36 @@ from __future__ import unicode_literals, print_function
     from ...language import Language
     from ...attrs import LANG
     from ...tokens import Doc
    +from ...tokenizer import Tokenizer
    +
    +
    +class JapaneseTokenizer(object):
    +    def __init__(self, cls, nlp=None):
    +        self.vocab = nlp.vocab if nlp is not None else cls.create_vocab(nlp)
    +        try:
    +            from janome.tokenizer import Tokenizer
    +        except ImportError:
    +            raise ImportError("The Japanese tokenizer requires the Janome "
    +                              "library: https://github.com/mocobeta/janome")
    +        self.tokenizer = Tokenizer()
    +
    +    def __call__(self, text):
    +        words = [x.surface for x in self.tokenizer.tokenize(text)]
    +        return Doc(self.vocab, words=words, spaces=[False]*len(words))
    +
    +
    +class JapaneseDefaults(Language.Defaults):
    +    @classmethod
    +    def create_tokenizer(cls, nlp=None):
    +        return JapaneseTokenizer(cls, nlp)
     
     
     class Japanese(Language):
         lang = 'ja'
    +    Defaults = JapaneseDefaults
     
         def make_doc(self, text):
    -        try:
    -            from janome.tokenizer import Tokenizer
    -        except ImportError:
    -            raise ImportError("The Japanese tokenizer requires the Janome library: "
    -                              "https://github.com/mocobeta/janome")
    -        words = [x.surface for x in Tokenizer().tokenize(text)]
    +        words = self.tokenizer(text)
             return Doc(self.vocab, words=words, spaces=[False]*len(words))
     
     
    diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py
    index 5f3fea342..29f37c9fa 100644
    --- a/spacy/tests/conftest.py
    +++ b/spacy/tests/conftest.py
    @@ -117,6 +117,13 @@ def he_tokenizer():
     def nb_tokenizer():
         return util.get_lang_class('nb').Defaults.create_tokenizer()
     
    +
    +@pytest.fixture
    +def ja_tokenizer():
    +    janome = pytest.importorskip("janome")
    +    return util.get_lang_class('ja').Defaults.create_tokenizer()
    +
    +
     @pytest.fixture
     def th_tokenizer():
         pythainlp = pytest.importorskip("pythainlp")
    diff --git a/spacy/tests/lang/ja/__init__.py b/spacy/tests/lang/ja/__init__.py
    new file mode 100644
    index 000000000..e69de29bb
    diff --git a/spacy/tests/lang/ja/test_tokenizer.py b/spacy/tests/lang/ja/test_tokenizer.py
    new file mode 100644
    index 000000000..1e30973a3
    --- /dev/null
    +++ b/spacy/tests/lang/ja/test_tokenizer.py
    @@ -0,0 +1,19 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +import pytest
    +
    +
    +TOKENIZER_TESTS = [
    +        ("日本語だよ", ['日本語', 'だ', 'よ']),
    +        ("東京タワーの近くに住んでいます。", ['東京', 'タワー', 'の', '近く', 'に', '住ん', 'で', 'い', 'ます', '。']),
    +        ("吾輩は猫である。", ['吾輩', 'は', '猫', 'で', 'ある', '。']),
    +        ("月に代わって、お仕置きよ!", ['月', 'に', '代わっ', 'て', '、', 'お仕置き', 'よ', '!']),
    +        ("すもももももももものうち", ['すもも', 'も', 'もも', 'も', 'もも', 'の', 'うち'])
    +]
    +
    +
    +@pytest.mark.parametrize('text,expected_tokens', TOKENIZER_TESTS)
    +def test_japanese_tokenizer(ja_tokenizer, text, expected_tokens):
    +    tokens = [token.text for token in ja_tokenizer(text)]
    +    assert tokens == expected_tokens
    
    From 38c756fd852a3f8f89c29eec858d537aaca003f1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:16:21 +0200
    Subject: [PATCH 362/649] Port over changes from #1287
    
    ---
     spacy/lang/en/syntax_iterators.py  |  2 +-
     spacy/tests/lang/en/test_parser.py | 30 ++++++++++++++++++++++++++++++
     2 files changed, 31 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/lang/en/syntax_iterators.py b/spacy/lang/en/syntax_iterators.py
    index 4240bd657..bb1a6b7f7 100644
    --- a/spacy/lang/en/syntax_iterators.py
    +++ b/spacy/lang/en/syntax_iterators.py
    @@ -8,7 +8,7 @@ def noun_chunks(obj):
         """
         Detect base noun phrases from a dependency parse. Works on both Doc and Span.
         """
    -    labels = ['nsubj', 'dobj', 'nsubjpass', 'pcomp', 'pobj',
    +    labels = ['nsubj', 'dobj', 'nsubjpass', 'pcomp', 'pobj', 'dative', 'appos',
                   'attr', 'ROOT']
         doc = obj.doc # Ensure works on both Doc and Span.
         np_deps = [doc.vocab.strings.add(label) for label in labels]
    diff --git a/spacy/tests/lang/en/test_parser.py b/spacy/tests/lang/en/test_parser.py
    index 39d0fce61..9468fe09d 100644
    --- a/spacy/tests/lang/en/test_parser.py
    +++ b/spacy/tests/lang/en/test_parser.py
    @@ -45,3 +45,33 @@ def test_parser_noun_chunks_pp_chunks(en_tokenizer):
         assert len(chunks) == 2
         assert chunks[0].text_with_ws == "A phrase "
         assert chunks[1].text_with_ws == "another phrase "
    +
    +
    +def test_parser_noun_chunks_appositional_modifiers(en_tokenizer):
    +    text = "Sam, my brother, arrived to the house."
    +    heads = [5, -1, 1, -3, -4, 0, -1, 1, -2, -4]
    +    tags = ['NNP', ',', 'PRP$', 'NN', ',', 'VBD', 'IN', 'DT', 'NN', '.']
    +    deps = ['nsubj', 'punct', 'poss', 'appos', 'punct', 'ROOT', 'prep', 'det', 'pobj', 'punct']
    +
    +    tokens = en_tokenizer(text)
    +    doc = get_doc(tokens.vocab, [t.text for t in tokens], tags=tags, deps=deps, heads=heads)
    +    chunks = list(doc.noun_chunks)
    +    assert len(chunks) == 3
    +    assert chunks[0].text_with_ws == "Sam "
    +    assert chunks[1].text_with_ws == "my brother "
    +    assert chunks[2].text_with_ws == "the house "
    +
    +
    +def test_parser_noun_chunks_dative(en_tokenizer):
    +    text = "She gave Bob a raise."
    +    heads = [1, 0, -1, 1, -3, -4]
    +    tags = ['PRP', 'VBD', 'NNP', 'DT', 'NN', '.']
    +    deps = ['nsubj', 'ROOT', 'dative', 'det', 'dobj', 'punct']
    +
    +    tokens = en_tokenizer(text)
    +    doc = get_doc(tokens.vocab, [t.text for t in tokens], tags=tags, deps=deps, heads=heads)
    +    chunks = list(doc.noun_chunks)
    +    assert len(chunks) == 3
    +    assert chunks[0].text_with_ws == "She "
    +    assert chunks[1].text_with_ws == "Bob "
    +    assert chunks[2].text_with_ws == "a raise "
    
    From cd6a29dce7af3edc00de988d6976a11b91b43682 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:28:46 +0200
    Subject: [PATCH 363/649] Port over changes from #1294
    
    ---
     .../lang/en/test_customized_tokenizer.py      | 42 +++++++++++++++++++
     spacy/tokenizer.pyx                           |  3 +-
     2 files changed, 44 insertions(+), 1 deletion(-)
     create mode 100644 spacy/tests/lang/en/test_customized_tokenizer.py
    
    diff --git a/spacy/tests/lang/en/test_customized_tokenizer.py b/spacy/tests/lang/en/test_customized_tokenizer.py
    new file mode 100644
    index 000000000..1d35fb128
    --- /dev/null
    +++ b/spacy/tests/lang/en/test_customized_tokenizer.py
    @@ -0,0 +1,42 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +import pytest
    +
    +from ....lang.en import English
    +from ....tokenizer import Tokenizer
    +from .... import util
    +
    +
    +@pytest.fixture
    +def custom_en_tokenizer(en_vocab):
    +    prefix_re = util.compile_prefix_regex(English.Defaults.prefixes)
    +    suffix_re = util.compile_suffix_regex(English.Defaults.suffixes)
    +    custom_infixes = ['\.\.\.+',
    +                      '(?<=[0-9])-(?=[0-9])',
    +                      # '(?<=[0-9]+),(?=[0-9]+)',
    +                      '[0-9]+(,[0-9]+)+',
    +                      '[\[\]!&:,()\*—–\/-]']
    +
    +    infix_re = util.compile_infix_regex(custom_infixes)
    +    return Tokenizer(en_vocab,
    +                     English.Defaults.tokenizer_exceptions,
    +                     prefix_re.search,
    +                     suffix_re.search,
    +                     infix_re.finditer,
    +                     token_match=None)
    +
    +
    +def test_customized_tokenizer_handles_infixes(custom_en_tokenizer):
    +    sentence = "The 8 and 10-county definitions are not used for the greater Southern California Megaregion."
    +    context = [word.text for word in custom_en_tokenizer(sentence)]
    +    assert context == ['The', '8', 'and', '10', '-', 'county', 'definitions',
    +                       'are', 'not', 'used', 'for', 'the', 'greater',
    +                       'Southern', 'California', 'Megaregion', '.']
    +
    +    # the trailing '-' may cause Assertion Error
    +    sentence = "The 8- and 10-county definitions are not used for the greater Southern California Megaregion."
    +    context = [word.text for word in custom_en_tokenizer(sentence)]
    +    assert context == ['The', '8', '-', 'and', '10', '-', 'county',
    +                       'definitions', 'are', 'not', 'used', 'for', 'the',
    +                       'greater', 'Southern', 'California', 'Megaregion', '.']
    diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx
    index de184baba..f2d21de44 100644
    --- a/spacy/tokenizer.pyx
    +++ b/spacy/tokenizer.pyx
    @@ -248,7 +248,8 @@ cdef class Tokenizer:
     
                             start = infix_end
                         span = string[start:]
    -                    tokens.push_back(self.vocab.get(tokens.mem, span), False)
    +                    if span:
    +                        tokens.push_back(self.vocab.get(tokens.mem, span), False)
             cdef vector[const LexemeC*].reverse_iterator it = suffixes.rbegin()
             while it != suffixes.rend():
                 lexeme = deref(it)
    
    From 3516aa0ceaa7fdcf2831a9f6d64c0c15de18c62f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:32:55 +0200
    Subject: [PATCH 364/649] Port over changes from #1389
    
    ---
     spacy/lemmatizer.py                      | 19 ++++++++++---------
     spacy/tests/regression/test_issue1387.py | 22 ++++++++++++++++++++++
     2 files changed, 32 insertions(+), 9 deletions(-)
     create mode 100644 spacy/tests/regression/test_issue1387.py
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 53519e4f1..bd2ca766a 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -94,15 +94,16 @@ def lemmatize(string, index, exceptions, rules):
         #    forms.append(string)
         forms.extend(exceptions.get(string, []))
         oov_forms = []
    -    for old, new in rules:
    -        if string.endswith(old):
    -            form = string[:len(string) - len(old)] + new
    -            if not form:
    -                pass
    -            elif form in index or not form.isalpha():
    -                forms.append(form)
    -            else:
    -                oov_forms.append(form)
    +    if not forms:
    +        for old, new in rules:
    +            if string.endswith(old):
    +                form = string[:len(string) - len(old)] + new
    +                if not form:
    +                    pass
    +                elif form in index or not form.isalpha():
    +                    forms.append(form)
    +                else:
    +                    oov_forms.append(form)
         if not forms:
             forms.extend(oov_forms)
         if not forms:
    diff --git a/spacy/tests/regression/test_issue1387.py b/spacy/tests/regression/test_issue1387.py
    new file mode 100644
    index 000000000..4bd0092d0
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1387.py
    @@ -0,0 +1,22 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +from ...symbols import POS, VERB, VerbForm_part
    +from ...vocab import Vocab
    +from ...lemmatizer import Lemmatizer
    +from ..util import get_doc
    +
    +import pytest
    +
    +
    +def test_issue1387():
    +    tag_map = {'VBG': {POS: VERB, VerbForm_part: True}}
    +    index = {"verb": ("cope","cop")}
    +    exc = {"verb": {"coping": ("cope",)}}
    +    rules = {"verb": [["ing", ""]]}
    +    lemmatizer = Lemmatizer(index, exc, rules)
    +    vocab = Vocab(lemmatizer=lemmatizer, tag_map=tag_map)
    +    doc = get_doc(vocab, ["coping"])
    +    doc[0].tag_ = 'VBG'
    +    assert doc[0].text == "coping"
    +    assert doc[0].lemma_ == "cope"
    
    From 9d6c8eaa491d0988bf16633bbba9847350f57778 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 14:58:52 +0200
    Subject: [PATCH 365/649] Update base norm exceptions with more unicode
     characters
    
    e.g. unicode variations of punctuation used in Chinese
    ---
     spacy/lang/norm_exceptions.py | 10 ++++++++++
     1 file changed, 10 insertions(+)
    
    diff --git a/spacy/lang/norm_exceptions.py b/spacy/lang/norm_exceptions.py
    index b02dda2c8..7857a16bf 100644
    --- a/spacy/lang/norm_exceptions.py
    +++ b/spacy/lang/norm_exceptions.py
    @@ -31,11 +31,21 @@ BASE_NORMS = {
         "„": '"',
         "»": '"',
         "«": '"',
    +    "‘‘": '"',
    +    "’’": '"',
    +    "?": "?",
    +    "!": "!",
    +    ",": ",",
    +    ";": ";",
    +    ":": ":",
    +    "。": ".",
    +    "।": ".",
         "…": "...",
         "—": "-",
         "–": "-",
         "--": "-",
         "---": "-",
    +    "——": "-",
         "€": "$",
         "£": "$",
         "¥": "$",
    
    From e85e1d571b834d35922a816e1886cfc74cdf50d8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 14:59:23 +0200
    Subject: [PATCH 366/649] Update base punctuation
    
    ---
     spacy/lang/char_classes.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py
    index 89774b17d..7ec631c92 100644
    --- a/spacy/lang/char_classes.py
    +++ b/spacy/lang/char_classes.py
    @@ -33,7 +33,7 @@ _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$'
     # These expressions contain various unicode variations, including characters
     # used in Chinese (see #1333, #1340, #1351) – unless there are cross-language
     # conflicts, spaCy's base tokenizer should handle all of those by default
    -_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* & 。 ? ! , 、 ; : ~ ·'
    +_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* & 。 ? ! , 、 ; : ~ · ।'
     _quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‘‘ ’’ ‚ , „ » « 「 」 『 』 ( ) 〔 〕 【 】 《 》 〈 〉'
     _hyphens = '- – — -- --- —— ~'
     
    
    From 266e7180a747c78ac4a123c12ef6c1fc3e0286c5 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 14:59:52 +0200
    Subject: [PATCH 367/649] Add Language class, stop words and basic stemmer that
     sets NORM
    
    ---
     spacy/lang/hi/__init__.py   |  24 +++++
     spacy/lang/hi/lex_attrs.py  |  38 ++++++++
     spacy/lang/hi/stop_words.py | 177 ++++++++++++++++++++++++++++++++++++
     3 files changed, 239 insertions(+)
     create mode 100644 spacy/lang/hi/__init__.py
     create mode 100644 spacy/lang/hi/lex_attrs.py
     create mode 100644 spacy/lang/hi/stop_words.py
    
    diff --git a/spacy/lang/hi/__init__.py b/spacy/lang/hi/__init__.py
    new file mode 100644
    index 000000000..0503b5b7f
    --- /dev/null
    +++ b/spacy/lang/hi/__init__.py
    @@ -0,0 +1,24 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +from .stop_words import STOP_WORDS
    +from .lex_attrs import LEX_ATTRS
    +
    +from ..norm_exceptions import BASE_NORMS
    +from ...language import Language
    +from ...attrs import LANG
    +
    +
    +class HindiDefaults(Language.Defaults):
    +    lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
    +    lex_attr_getters.update(LEX_ATTRS)
    +    lex_attr_getters[LANG] = lambda text: 'hi'
    +    stop_words = STOP_WORDS
    +
    +
    +class Hindi(Language):
    +    lang = 'hi'
    +    Defaults = HindiDefaults
    +
    +
    +__all__ = ['Hindi']
    diff --git a/spacy/lang/hi/lex_attrs.py b/spacy/lang/hi/lex_attrs.py
    new file mode 100644
    index 000000000..8886e26c3
    --- /dev/null
    +++ b/spacy/lang/hi/lex_attrs.py
    @@ -0,0 +1,38 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +from ..norm_exceptions import BASE_NORMS
    +from ...attrs import NORM
    +from ...util import add_lookups
    +
    +
    +_stem_suffixes = [
    +    ["ो","े","ू","ु","ी","ि","ा"],
    +    ["कर","ाओ","िए","ाई","ाए","ने","नी","ना","ते","ीं","ती","ता","ाँ","ां","ों","ें"],
    +    ["ाकर","ाइए","ाईं","ाया","ेगी","ेगा","ोगी","ोगे","ाने","ाना","ाते","ाती","ाता","तीं","ाओं","ाएं","ुओं","ुएं","ुआं"],
    +    ["ाएगी","ाएगा","ाओगी","ाओगे","एंगी","ेंगी","एंगे","ेंगे","ूंगी","ूंगा","ातीं","नाओं","नाएं","ताओं","ताएं","ियाँ","ियों","ियां"],
    +    ["ाएंगी","ाएंगे","ाऊंगी","ाऊंगा","ाइयाँ","ाइयों","ाइयां"]
    +]
    +
    +
    +def norm(string):
    +    # normalise base exceptions, e.g. punctuation or currency symbols
    +    if string in BASE_NORMS:
    +        return BASE_NORMS[string]
    +    # set stem word as norm, if available, adapted from:
    +    # http://computing.open.ac.uk/Sites/EACLSouthAsia/Papers/p6-Ramanathan.pdf
    +    # http://research.variancia.com/hindi_stemmer/
    +    # https://github.com/taranjeet/hindi-tokenizer/blob/master/HindiTokenizer.py#L142
    +    for suffix_group in reversed(_stem_suffixes):
    +        length = len(suffix_group[0])
    +        if len(string) <= length:
    +            break
    +        for suffix in suffix_group:
    +            if string.endswith(suffix):
    +                return string[:-length]
    +    return string
    +
    +
    +LEX_ATTRS = {
    +    NORM: norm
    +}
    diff --git a/spacy/lang/hi/stop_words.py b/spacy/lang/hi/stop_words.py
    new file mode 100644
    index 000000000..2ff27c015
    --- /dev/null
    +++ b/spacy/lang/hi/stop_words.py
    @@ -0,0 +1,177 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +
    +# Source: https://github.com/taranjeet/hindi-tokenizer/blob/master/stopwords.txt
    +
    +STOP_WORDS = set("""
    +अत
    +अपना
    +अपनी
    +अपने
    +अभी
    +अंदर
    +आदि
    +आप
    +इत्यादि
    +इन
    +इनका
    +इन्हीं
    +इन्हें
    +इन्हों
    +इस
    +इसका
    +इसकी
    +इसके
    +इसमें
    +इसी
    +इसे
    +उन
    +उनका
    +उनकी
    +उनके
    +उनको
    +उन्हीं
    +उन्हें
    +उन्हों
    +उस
    +उसके
    +उसी
    +उसे
    +एक
    +एवं
    +एस
    +ऐसे
    +और
    +कई
    +कर
    +करता
    +करते
    +करना
    +करने
    +करें
    +कहते
    +कहा
    +का
    +काफ़ी
    +कि
    +कितना
    +किन्हें
    +किन्हों
    +किया
    +किर
    +किस
    +किसी
    +किसे
    +की
    +कुछ
    +कुल
    +के
    +को
    +कोई
    +कौन
    +कौनसा
    +गया
    +घर
    +जब
    +जहाँ
    +जा
    +जितना
    +जिन
    +जिन्हें
    +जिन्हों
    +जिस
    +जिसे
    +जीधर
    +जैसा
    +जैसे
    +जो
    +तक
    +तब
    +तरह
    +तिन
    +तिन्हें
    +तिन्हों
    +तिस
    +तिसे
    +तो
    +था
    +थी
    +थे
    +दबारा
    +दिया
    +दुसरा
    +दूसरे
    +दो
    +द्वारा
    +न
    +नके
    +नहीं
    +ना
    +निहायत
    +नीचे
    +ने
    +पर
    +पहले
    +पूरा
    +पे
    +फिर
    +बनी
    +बही
    +बहुत
    +बाद
    +बाला
    +बिलकुल
    +भी
    +भीतर
    +मगर
    +मानो
    +मे
    +में
    +यदि
    +यह
    +यहाँ
    +यही
    +या
    +यिह
    +ये
    +रखें
    +रहा
    +रहे
    +ऱ्वासा
    +लिए
    +लिये
    +लेकिन
    +व
    +वग़ैरह
    +वर्ग
    +वह
    +वहाँ
    +वहीं
    +वाले
    +वुह
    +वे
    +सकता
    +सकते
    +सबसे
    +सभी
    +साथ
    +साबुत
    +साभ
    +सारा
    +से
    +सो
    +संग
    +ही
    +हुआ
    +हुई
    +हुए
    +है
    +हैं
    +हो
    +होता
    +होती
    +होते
    +होना
    +होने
    +""".split())
    
    From c0aceb9fbecfa0c62b3d3624b627a79e9984c040 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 15:16:41 +0200
    Subject: [PATCH 368/649] Add Hindi to supported languages
    
    ---
     website/models/_data.json | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/website/models/_data.json b/website/models/_data.json
    index f7ba16c9f..ff65d44ef 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -83,6 +83,7 @@
             "ru": "Russian",
             "he": "Hebrew",
             "bn": "Bengali",
    +        "hi": "Hindi",
             "id": "Indonesian",
             "th": "Thai",
             "zh": "Chinese",
    
    From 15514dc333e1333f6001d0eab6ba88e48d0f36df Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 22:14:47 +0200
    Subject: [PATCH 369/649] Add section on upgrading
    
    ---
     website/usage/_install/_instructions.jade | 34 +++++++++++++++++++++++
     1 file changed, 34 insertions(+)
    
    diff --git a/website/usage/_install/_instructions.jade b/website/usage/_install/_instructions.jade
    index 10132a646..fa4f8b29f 100644
    --- a/website/usage/_install/_instructions.jade
    +++ b/website/usage/_install/_instructions.jade
    @@ -44,6 +44,40 @@ p
         |  Improvements and pull requests to the recipe and setup are always
         |  appreciated.
     
    ++h(3, "upgrading") Upgrading spaCy
    +
    ++aside("Upgrading from v1 to v2")
    +    |  Although we've tried to keep breaking changes to a minimum, upgrading
    +    |  from spaCy v1.x to v2.x may still require some changes to your code base.
    +    |  For details see the sections on
    +    |  #[+a("/usage/v2#incompat") backwards incompatibilities] and
    +    |  #[+a("/usage/v2#migrating") migrating]. Also remember to download the new
    +    |  models, and retrain your own models.
    +
    +p
    +    |  When updating to a newer version of spaCy, it's generally recommended to
    +    |  start with a clean virtual environment. If you're upgrading to a new
    +    |  major version, make sure you have the latest #[strong compatible models]
    +    |  installed, and that there are no old shortcut links or incompatible model
    +    |  packages left over in your environment, as this can often lead to unexpected
    +    |  results and errors.  If you've trained your own models, keep in mind that
    +    |  your train and runtime inputs must match. This means you'll have to
    +    |  #[strong retrain your models] with the new version.
    +
    +p
    +    |  As of v2.0, spaCy also provides a #[+api("cli#validate") #[code validate]]
    +    |  command, which lets you verify that all installed models are compatible
    +    |  with your spaCy version. If incompatible models are found, tips and
    +    |  installation instructions are printed. The command is also useful to
    +    |  detect out-of-sync model links resulting from links created in different
    +    |  virtual environments. It's recommended to run the command with
    +    |  #[code python -m] to make sure you're executing the correct version of
    +    |  spaCy.
    +
    ++code(false, "bash").
    +    pip install -U spacy
    +    python -m spacy validate
    +
     +h(3, "gpu") Run spaCy with GPU
     
     p
    
    From 04331816589b1d6310a404add0669ba022a41400 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 12:06:33 +0200
    Subject: [PATCH 370/649] Document operator semantics in Matcher docstring
    
    ---
     spacy/matcher.pyx | 29 +++++++++++++++++++++--------
     1 file changed, 21 insertions(+), 8 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 41d7029f0..58f88fc1a 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -230,14 +230,27 @@ cdef class Matcher:
         def add(self, key, on_match, *patterns):
             """Add a match-rule to the matcher.
             A match-rule consists of: an ID key, an on_match callback, and one or
    -        more patterns. If the key exists, the patterns are appended to the
    -        previous ones, and the previous on_match callback is replaced. The
    -        `on_match` callback will receive the arguments `(matcher, doc, i,
    -        matches)`. You can also set `on_match` to `None` to not perform any
    -        actions. A pattern consists of one or more `token_specs`, where a
    -        `token_spec` is a dictionary mapping attribute IDs to values. Token
    -        descriptors can also include quantifiers. There are currently important
    -        known problems with the quantifiers – see the docs.
    +        more patterns.
    +
    +	If the key exists, the patterns are appended to the previous ones, and
    +	the previous on_match callback is replaced. The `on_match` callback will
    +	receive the arguments `(matcher, doc, i, matches)`. You can also set
    +	`on_match` to `None` to not perform any actions.
    +
    +	A pattern consists of one or more `token_specs`, where a `token_spec`
    +	is a dictionary mapping attribute IDs to values, and optionally a
    +	quantifier operator under the key "op". The available quantifiers are:
    +
    +	'!': Negate the pattern, by requiring it to match exactly 0 times.
    +	'?': Make the pattern optional, by allowing it to match 0 or 1 times.
    +	'+': Require the pattern to match 1 or more times.
    +	'*': Allow the pattern to zero or more times.
    +
    +	The + and * operators are usually interpretted "greedily", i.e. longer
    +	matches are returned where possible. However, if you specify two '+'
    +	and '*' patterns in a row and their matches overlap, the first
    +	operator will behave non-greedily. This quirk in the semantics
    +	makes the matcher more efficient, by avoiding the need for back-tracking.
             """
             for pattern in patterns:
                 if len(pattern) == 0:
    
    From 748d52580107a18c6e9a6ab513772232f87ac530 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 13:38:01 +0200
    Subject: [PATCH 371/649] Add more matcher operator tests
    
    ---
     spacy/tests/test_matcher.py | 37 +++++++++++++++++++++++++++++++++++++
     1 file changed, 37 insertions(+)
    
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index ce6f2d91e..ad6192c8f 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -107,6 +107,7 @@ def test_matcher_empty_dict(en_vocab):
         matches = matcher(doc)
         assert len(matches) == 1
         assert matches[0][1:] == (0, 3)
    +    matcher = Matcher(en_vocab)
         matcher.add('A.', None, [{'ORTH': 'a'}, {}])
         matches = matcher(doc)
         assert matches[0][1:] == (0, 2)
    @@ -175,3 +176,39 @@ def test_matcher_match_one_plus(matcher):
                                              {'ORTH': 'Philippe', 'OP': '+'}])
         m = matcher(doc)
         assert len(m) == 1
    +
    +
    +def test_operator_combos(matcher):
    +    cases = [
    +        ('aaab', 'a a a b', True),
    +        ('aaab', 'a+ b', True),
    +        ('aaab', 'a+ a+ b', True),
    +        ('aaab', 'a+ a+ a b', True),
    +        ('aaab', 'a+ a+ a+ b', True),
    +        ('aaab', 'a+ a a b', True),
    +        ('aaab', 'a+ a a', True),
    +        ('aaab', 'a+', True),
    +        ('aaa', 'a+ b', False),
    +        ('aaa', 'a+ a+ b', False),
    +        ('aaa', 'a+ a+ a+ b', False),
    +        ('aaa', 'a+ a b', False),
    +        ('aaa', 'a+ a a b', False),
    +        ('aaab', 'a+ a a', True),
    +        ('aaab', 'a+', True),
    +        ('aaab', 'a+ a b', False), # <-- This is the weird semantics
    +    ]
    +    for string, pattern_str, result in cases:
    +        matcher = Matcher(matcher.vocab)
    +        doc = get_doc(matcher.vocab, words=list(string))
    +        pattern = []
    +        for part in pattern_str.split():
    +            if part.endswith('+'):
    +                pattern.append({'ORTH': part[0], 'op': '+'})
    +            else:
    +                pattern.append({'ORTH': part})
    +        matcher.add('PATTERN', None, pattern)
    +        matches = matcher(doc)
    +        if result:
    +            assert matches, (string, pattern_str)
    +        else:
    +            assert not matches, (string, pattern_str)
    
    From 56aa42cc5d5371e22b621c9956731fee57d3f893 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 13:38:20 +0200
    Subject: [PATCH 372/649] Fix and document matcher operator 'shadowing'
     behaviour
    
    ---
     spacy/matcher.pyx | 42 ++++++++++++++++++++++--------------------
     1 file changed, 22 insertions(+), 20 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 58f88fc1a..24d0a9836 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -138,7 +138,10 @@ cdef int get_action(const TokenPatternC* pattern, const TokenC* token) nogil:
             # This is a bandaid over the 'shadowing' problem described here:
             # https://github.com/explosion/spaCy/issues/864
             next_action = get_action(pattern+1, token)
    -        return REPEAT if next_action is REJECT else next_action
    +        if next_action is REJECT:
    +            return REPEAT
    +        else:
    +            return ADVANCE_ZERO
         else:
             return PANIC
     
    @@ -228,29 +231,28 @@ cdef class Matcher:
             return len(self._patterns)
     
         def add(self, key, on_match, *patterns):
    -        """Add a match-rule to the matcher.
    -        A match-rule consists of: an ID key, an on_match callback, and one or
    -        more patterns.
    +        """Add a match-rule to the matcher. A match-rule consists of: an ID key,
    +        an on_match callback, and one or more patterns.
     
    -	If the key exists, the patterns are appended to the previous ones, and
    -	the previous on_match callback is replaced. The `on_match` callback will
    -	receive the arguments `(matcher, doc, i, matches)`. You can also set
    -	`on_match` to `None` to not perform any actions.
    +        If the key exists, the patterns are appended to the previous ones, and
    +        the previous on_match callback is replaced. The `on_match` callback will
    +        receive the arguments `(matcher, doc, i, matches)`. You can also set
    +        `on_match` to `None` to not perform any actions.
     
    -	A pattern consists of one or more `token_specs`, where a `token_spec`
    -	is a dictionary mapping attribute IDs to values, and optionally a
    -	quantifier operator under the key "op". The available quantifiers are:
    +        A pattern consists of one or more `token_specs`, where a `token_spec`
    +        is a dictionary mapping attribute IDs to values, and optionally a
    +        quantifier operator under the key "op". The available quantifiers are:
     
    -	'!': Negate the pattern, by requiring it to match exactly 0 times.
    -	'?': Make the pattern optional, by allowing it to match 0 or 1 times.
    -	'+': Require the pattern to match 1 or more times.
    -	'*': Allow the pattern to zero or more times.
    +        '!': Negate the pattern, by requiring it to match exactly 0 times.
    +        '?': Make the pattern optional, by allowing it to match 0 or 1 times.
    +        '+': Require the pattern to match 1 or more times.
    +        '*': Allow the pattern to zero or more times.
     
    -	The + and * operators are usually interpretted "greedily", i.e. longer
    -	matches are returned where possible. However, if you specify two '+'
    -	and '*' patterns in a row and their matches overlap, the first
    -	operator will behave non-greedily. This quirk in the semantics
    -	makes the matcher more efficient, by avoiding the need for back-tracking.
    +        The + and * operators are usually interpretted "greedily", i.e. longer
    +        matches are returned where possible. However, if you specify two '+'
    +        and '*' patterns in a row and their matches overlap, the first
    +        operator will behave non-greedily. This quirk in the semantics
    +        makes the matcher more efficient, by avoiding the need for back-tracking.
             """
             for pattern in patterns:
                 if len(pattern) == 0:
    
    From 63393b4e0dd9fd63047ff08a12112fb975c7fb3f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 13:44:12 +0200
    Subject: [PATCH 373/649] Update matcher docs to reflect operator changes
    
    ---
     .../_rule-based-matching.jade                 | 29 +++++++++----------
     1 file changed, 13 insertions(+), 16 deletions(-)
    
    diff --git a/website/usage/_linguistic-features/_rule-based-matching.jade b/website/usage/_linguistic-features/_rule-based-matching.jade
    index c006f43c9..a62050282 100644
    --- a/website/usage/_linguistic-features/_rule-based-matching.jade
    +++ b/website/usage/_linguistic-features/_rule-based-matching.jade
    @@ -142,33 +142,30 @@ p
         |  are no nested or scoped quantifiers – instead, you can build those
         |  behaviours with #[code on_match] callbacks.
     
    -+aside("Problems with quantifiers")
    -    |  Using quantifiers may lead to unexpected results when matching
    -    |  variable-length patterns, for example if the next token would also be
    -    |  matched by the previous token. This problem should be resolved in a future
    -    |  release. For more information, see
    -    |  #[+a(gh("spaCy") + "/issues/864") this issue].
    -
    -+table([ "OP", "Description", "Example"])
    ++table([ "OP", "Description"])
         +row
             +cell #[code !]
    -        +cell match exactly 0 times
    -        +cell negation
    +        +cell Negate the pattern, by requiring it to match exactly 0 times.
     
         +row
             +cell #[code *]
    -        +cell match 0 or more times
    -        +cell optional, variable number
    +        +cell Make the pattern optional, by allowing it to match 0 or 1 times.
     
         +row
             +cell #[code +]
    -        +cell match 1 or more times
    -        +cell mandatory, variable number
    +        +cell Require the pattern to match 1 or more times.
     
         +row
             +cell #[code ?]
    -        +cell match 0 or 1 times
    -        +cell optional, max one
    +        +cell Allow the pattern to zero or more times.
    +
    +p
    +    |  The #[code +] and #[code *] operators are usually interpretted
    +    |  "greedily", i.e. longer matches are returned where possible. However, if
    +    |  you specify two #[code +] and #[code *] patterns in a row and their
    +    |  matches overlap, the first operator will behave non-greedily. This quirk
    +    |  in the semantics makes the matcher more efficient, by avoiding the need
    +    |  for back-tracking.
     
     +h(3, "adding-phrase-patterns") Adding phrase patterns
     
    
    From d3c54cf39a7e98ad0568885d89f9306494e2936a Mon Sep 17 00:00:00 2001
    From: Vishnu Kumar Nekkanti 
    Date: Mon, 16 Oct 2017 18:51:33 +0530
    Subject: [PATCH 374/649] fixed SyntaxError while checking for jieba
    
    ---
     spacy/lang/zh/__init__.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/lang/zh/__init__.py b/spacy/lang/zh/__init__.py
    index 46ad3946f..6246fa7ea 100644
    --- a/spacy/lang/zh/__init__.py
    +++ b/spacy/lang/zh/__init__.py
    @@ -10,7 +10,7 @@ class Chinese(Language):
     
         def make_doc(self, text):
             try:
    -            from jieba
    +            import jieba
             except ImportError:
                 raise ImportError("The Chinese tokenizer requires the Jieba library: "
                                   "https://github.com/fxsjy/jieba")
    
    From c29927d2e7ef08a73f9fe0ba74bc77a6df65b2b7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 17:22:18 +0200
    Subject: [PATCH 375/649] Fix matcher test
    
    ---
     spacy/tests/test_matcher.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index ad6192c8f..9fcb47305 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -195,7 +195,7 @@ def test_operator_combos(matcher):
             ('aaa', 'a+ a a b', False),
             ('aaab', 'a+ a a', True),
             ('aaab', 'a+', True),
    -        ('aaab', 'a+ a b', False), # <-- This is the weird semantics
    +        ('aaab', 'a+ a b', True),
         ]
         for string, pattern_str, result in cases:
             matcher = Matcher(matcher.vocab)
    
    From 6ceadcdb5c9b552f3f1c049aa219bcbff6be26b4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 18:29:56 +0200
    Subject: [PATCH 376/649] Make sure from_disk passes string to numpy (see
     #1421)
    
    If path is a WindowsPath, numpy does not recognise it as a path and as
    a result, doesn't open the file.
    https://github.com/numpy/numpy/blob/master/numpy/lib/npyio.py#L369
    ---
     spacy/util.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index 50ebc036b..9262b5df4 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -494,7 +494,7 @@ def from_disk(path, readers, exclude):
         path = ensure_path(path)
         for key, reader in readers.items():
             if key not in exclude:
    -            reader(path / key)
    +            reader(path2str(path / key))
         return path
     
     
    
    From d5418553eb5ee82136754a382c4e6b1b332c1a4f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 18:30:04 +0200
    Subject: [PATCH 377/649] Fix whitespace
    
    ---
     spacy/util.py | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index 9262b5df4..71dff4321 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -584,4 +584,3 @@ def use_gpu(gpu_id):
         Model.ops = CupyOps()
         Model.Ops = CupyOps
         return device
    -
    
    From 59c216196cb0a502ca9214318a17efa4934b1268 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:22:11 +0200
    Subject: [PATCH 378/649] Allow weakrefs on Doc objects
    
    ---
     spacy/tokens/doc.pxd | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/tokens/doc.pxd b/spacy/tokens/doc.pxd
    index ad2b9876d..f34c455c6 100644
    --- a/spacy/tokens/doc.pxd
    +++ b/spacy/tokens/doc.pxd
    @@ -54,6 +54,8 @@ cdef class Doc:
     
         cdef public object noun_chunks_iterator
     
    +    cdef object __weakref__
    +
         cdef int push_back(self, LexemeOrToken lex_or_tok, bint has_space) except -1
     
         cpdef np.ndarray to_array(self, object features)
    
    From 5c14f3f033232b9329183148e706c0884d9d043f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:22:40 +0200
    Subject: [PATCH 379/649] Create a rolling buffer for the StringStore in
     Language.pipe()
    
    ---
     spacy/language.py | 26 ++++++++++++++++++++++++++
     1 file changed, 26 insertions(+)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 047c94a37..f092c9806 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -8,6 +8,7 @@ import random
     import ujson
     from collections import OrderedDict
     import itertools
    +import weakref
     
     from .tokenizer import Tokenizer
     from .vocab import Vocab
    @@ -510,8 +511,33 @@ class Language(object):
                 else:
                     # Apply the function, but yield the doc
                     docs = _pipe(proc, docs)
    +        # Track weakrefs of "recent" documents, so that we can see when they
    +        # expire from memory. When they do, we know we don't need old strings.
    +        # This way, we avoid maintaining an unbounded growth in string entries
    +        # in the string store.
    +        recent_refs = weakref.WeakSet()
    +        old_refs = weakref.WeakSet()
    +        original_strings_data = self.vocab.strings.to_bytes()
    +        StringStore = self.vocab.strings.__class__
    +        recent_strings = StringStore().from_bytes(original_strings_data)
    +        nr_seen = 0
             for doc in docs:
                 yield doc
    +            for word in doc:
    +                recent_strings.add(word.text)
    +            recent_refs.add(doc)
    +            if nr_seen < 1000:
    +                old_refs.add(doc)
    +                nr_seen += 1
    +            elif len(old_refs) == 0:
    +                # All the docs in the 'old' set have expired, so the only
    +                # difference between the backup strings and the current
    +                # string-store should be obsolete. We therefore swap out the
    +                # old strings data.
    +                old_refs, recent_refs = recent_refs, old_refs
    +                self.vocab.strings._reset_and_load(recent_strings)
    +                recent_strings = StringStore().from_bytes(original_strings_data)
    +                nr_seen = 0
     
         def to_disk(self, path, disable=tuple()):
             """Save the current state to a directory.  If a model is loaded, this
    
    From 3e037054c88476e11ca6c0bc2e0ee2ce32d0997e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:23:10 +0200
    Subject: [PATCH 380/649] Remove obsolete is_frozen functionality from
     StringStore
    
    ---
     spacy/strings.pxd |  2 --
     spacy/strings.pyx | 21 +--------------------
     2 files changed, 1 insertion(+), 22 deletions(-)
    
    diff --git a/spacy/strings.pxd b/spacy/strings.pxd
    index 0ad403cf1..4f987baed 100644
    --- a/spacy/strings.pxd
    +++ b/spacy/strings.pxd
    @@ -21,11 +21,9 @@ ctypedef union Utf8Str:
     
     cdef class StringStore:
         cdef Pool mem
    -    cdef bint is_frozen
     
         cdef vector[hash_t] keys
         cdef public PreshMap _map
    -    cdef public PreshMap _oov
     
         cdef const Utf8Str* intern_unicode(self, unicode py_string)
         cdef const Utf8Str* _intern_utf8(self, char* utf8_string, int length)
    diff --git a/spacy/strings.pyx b/spacy/strings.pyx
    index 6f676c79a..29a706996 100644
    --- a/spacy/strings.pyx
    +++ b/spacy/strings.pyx
    @@ -86,8 +86,6 @@ cdef class StringStore:
             """
             self.mem = Pool()
             self._map = PreshMap()
    -        self._oov = PreshMap()
    -        self.is_frozen = freeze
             if strings is not None:
                 for string in strings:
                     self.add(string)
    @@ -243,21 +241,12 @@ cdef class StringStore:
                 self.add(word)
             return self
     
    -    def set_frozen(self, bint is_frozen):
    -        # TODO
    -        self.is_frozen = is_frozen
    -
    -    def flush_oov(self):
    -        self._oov = PreshMap()
    -
    -    def _reset_and_load(self, strings, freeze=False):
    +    def _reset_and_load(self, strings):
             self.mem = Pool()
             self._map = PreshMap()
    -        self._oov = PreshMap()
             self.keys.clear()
             for string in strings:
                 self.add(string)
    -        self.is_frozen = freeze
     
         cdef const Utf8Str* intern_unicode(self, unicode py_string):
             # 0 means missing, but we don't bother offsetting the index.
    @@ -275,14 +264,6 @@ cdef class StringStore:
             value = self._oov.get(key)
             if value is not NULL:
                 return value
    -        if self.is_frozen:
    -            # OOV store uses 32 bit hashes. Pretty ugly :(
    -            key32 = hash32_utf8(utf8_string, length)
    -            # Important: Make the OOV store own the memory. That way it's trivial
    -            # to flush them all.
    -            value = _allocate(self._oov.mem, utf8_string, length)
    -            self._oov.set(key32, value)
    -            return NULL
     
             value = _allocate(self.mem, utf8_string, length)
             self._map.set(key, value)
    
    From a002264fec3f49e85f530bf8cb3d16be0a049071 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:34:21 +0200
    Subject: [PATCH 381/649] Remove caching of Token in Doc, as caused cycle.
    
    ---
     spacy/tokens/doc.pyx   | 13 ++-----------
     spacy/tokens/token.pxd |  3 ---
     2 files changed, 2 insertions(+), 14 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 05d393d2b..bf48cf4f5 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -140,7 +140,6 @@ cdef class Doc:
             self.user_span_hooks = {}
             self.tensor = numpy.zeros((0,), dtype='float32')
             self.user_data = {}
    -        self._py_tokens = []
             self._vector = None
             self.noun_chunks_iterator = _get_chunker(self.vocab.lang)
             cdef unicode orth
    @@ -209,10 +208,7 @@ cdef class Doc:
             if i < 0:
                 i = self.length + i
             bounds_check(i, self.length, PADDING)
    -        if self._py_tokens[i] is not None:
    -            return self._py_tokens[i]
    -        else:
    -            return Token.cinit(self.vocab, &self.c[i], i, self)
    +        return Token.cinit(self.vocab, &self.c[i], i, self)
     
         def __iter__(self):
             """Iterate over `Token`  objects, from which the annotations can be
    @@ -226,10 +222,7 @@ cdef class Doc:
             """
             cdef int i
             for i in range(self.length):
    -            if self._py_tokens[i] is not None:
    -                yield self._py_tokens[i]
    -            else:
    -                yield Token.cinit(self.vocab, &self.c[i], i, self)
    +            yield Token.cinit(self.vocab, &self.c[i], i, self)
     
         def __len__(self):
             """The number of tokens in the document.
    @@ -535,7 +528,6 @@ cdef class Doc:
             self.length += 1
             # Set morphological attributes, e.g. by lemma, if possible
             self.vocab.morphology.assign_untagged(t)
    -        self._py_tokens.append(None)
             return t.idx + t.lex.length + t.spacy
     
         @cython.boundscheck(False)
    @@ -841,7 +833,6 @@ cdef class Doc:
             # Set the left/right children, left/right edges
             set_children_from_heads(self.c, self.length)
             # Clear the cached Python objects
    -        self._py_tokens = [None] * self.length
             # Return the merged Python object
             return self[start]
     
    diff --git a/spacy/tokens/token.pxd b/spacy/tokens/token.pxd
    index f63a0490c..b408e04eb 100644
    --- a/spacy/tokens/token.pxd
    +++ b/spacy/tokens/token.pxd
    @@ -19,10 +19,7 @@ cdef class Token:
             if offset < 0 or offset >= doc.length:
                 msg = "Attempt to access token at %d, max length %d"
                 raise IndexError(msg % (offset, doc.length))
    -        if doc._py_tokens[offset] != None:
    -            return doc._py_tokens[offset]
             cdef Token self = Token.__new__(Token, vocab, doc, offset)
    -        doc._py_tokens[offset] = self
             return self
     
         #cdef inline TokenC struct_from_attrs(Vocab vocab, attrs):
    
    From 66e2eb8f397c82505d5b44c1b52071fcda2a5a1c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:34:41 +0200
    Subject: [PATCH 382/649] Clean up remnant of frozen in StringStore
    
    ---
     spacy/strings.pyx | 4 ----
     1 file changed, 4 deletions(-)
    
    diff --git a/spacy/strings.pyx b/spacy/strings.pyx
    index 29a706996..e6926a75d 100644
    --- a/spacy/strings.pyx
    +++ b/spacy/strings.pyx
    @@ -261,10 +261,6 @@ cdef class StringStore:
             cdef Utf8Str* value = self._map.get(key)
             if value is not NULL:
                 return value
    -        value = self._oov.get(key)
    -        if value is not NULL:
    -            return value
    -
             value = _allocate(self.mem, utf8_string, length)
             self._map.set(key, value)
             self.keys.push_back(key)
    
    From 2bc06e4b222c7f38505235b30105bca1d15bf286 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:38:29 +0200
    Subject: [PATCH 383/649] Bump rolling buffer size to 10k
    
    ---
     spacy/language.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index f092c9806..7fd56ed56 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -526,7 +526,7 @@ class Language(object):
                 for word in doc:
                     recent_strings.add(word.text)
                 recent_refs.add(doc)
    -            if nr_seen < 1000:
    +            if nr_seen < 10000:
                     old_refs.add(doc)
                     nr_seen += 1
                 elif len(old_refs) == 0:
    
    From 41744771611305363484f046b0271b5f0ea071aa Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:50:35 +0200
    Subject: [PATCH 384/649] Fix equality check in test
    
    ---
     spacy/tests/parser/test_parse_navigate.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tests/parser/test_parse_navigate.py b/spacy/tests/parser/test_parse_navigate.py
    index 4d909f0d6..da59b0b59 100644
    --- a/spacy/tests/parser/test_parse_navigate.py
    +++ b/spacy/tests/parser/test_parse_navigate.py
    @@ -57,9 +57,9 @@ def test_parser_parse_navigate_consistency(en_tokenizer, text, heads):
         doc = get_doc(tokens.vocab, [t.text for t in tokens], heads=heads)
         for head in doc:
             for child in head.lefts:
    -            assert child.head is head
    +            assert child.head == head
             for child in head.rights:
    -            assert child.head is head
    +            assert child.head == head
     
     
     def test_parser_parse_navigate_child_consistency(en_tokenizer, text, heads):
    
    From d383612225547820cccedf09810bed3177adc929 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 20:31:58 +0200
    Subject: [PATCH 385/649] Add note about word vectors in example (see #1117)
    
    ---
     website/usage/_spacy-101/_lightning-tour.jade | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/website/usage/_spacy-101/_lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
    index ecf57fbc2..7e801b8ef 100644
    --- a/website/usage/_spacy-101/_lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -159,6 +159,10 @@ p
     +h(3, "lightning-tour-word-vectors") Get word vectors and similarity
         +tag-model("word vectors")
     
    +p
    +    |  For the best results, you should run this example using the
    +    |  #[+a("/models/en#en_vectors_web_lg") #[code en_vectors_web_lg]] model
    +
     +code.
         doc = nlp(u"Apple and banana are similar. Pasta and hippo aren't.")
         apple = doc[0]
    
    From 18793efef1c505f836e31faa4e88a8174fbaabe1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 20:36:36 +0200
    Subject: [PATCH 386/649] Remove Russian from v2.0 docs for now
    
    ---
     website/models/_data.json | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/website/models/_data.json b/website/models/_data.json
    index f7ba16c9f..b2898be8a 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -80,7 +80,6 @@
             "da": "Danish",
             "hu": "Hungarian",
             "pl": "Polish",
    -        "ru": "Russian",
             "he": "Hebrew",
             "bn": "Bengali",
             "id": "Indonesian",
    
    From 4cfe259266a790189fa3a35965f80990df5e71ba Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 20:36:41 +0200
    Subject: [PATCH 387/649] Fix formatting
    
    ---
     website/usage/_spacy-101/_lightning-tour.jade | 48 +++++++++----------
     1 file changed, 24 insertions(+), 24 deletions(-)
    
    diff --git a/website/usage/_spacy-101/_lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
    index 7e801b8ef..acc7d5835 100644
    --- a/website/usage/_spacy-101/_lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -20,8 +20,8 @@ p
         doc_de = nlp_de(u'Ich bin ein Berliner.')
     
     +infobox
    -    |  #[strong API:] #[+api("spacy#load") #[code spacy.load()]]
    -    |  #[strong Usage:] #[+a("/usage/models") Models],
    +    |  #[+label-inline API:] #[+api("spacy#load") #[code spacy.load()]]
    +    |  #[+label-inline Usage:] #[+a("/usage/models") Models],
         |  #[+a("/usage/spacy-101") spaCy 101]
     
     +h(3, "lightning-tour-tokens-sentences") Get tokens, noun chunks & sentences
    @@ -42,8 +42,8 @@ p
         assert sentences[1].text == u'Peach is the superior emoji.'
     
     +infobox
    -    |  #[strong API:] #[+api("doc") #[code Doc]], #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/usage/spacy-101") spaCy 101]
    +    |  #[+label-inline API:] #[+api("doc") #[code Doc]], #[+api("token") #[code Token]]
    +    |  #[+label-inline Usage:] #[+a("/usage/spacy-101") spaCy 101]
     
     +h(3, "lightning-tour-pos-tags") Get part-of-speech tags and flags
         +tag-model("tagger")
    @@ -63,8 +63,8 @@ p
         assert billion.like_email == False
     
     +infobox
    -    |  #[strong API:] #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/usage/linguistic-features#pos-tagging") Part-of-speech tagging]
    +    |  #[+label-inline API:] #[+api("token") #[code Token]]
    +    |  #[+label-inline Usage:] #[+a("/usage/linguistic-features#pos-tagging") Part-of-speech tagging]
     
     +h(3, "lightning-tour-hashes") Use hash values for any string
     
    @@ -83,8 +83,8 @@ p
         unicorn_text = doc.vocab.strings[unicorn_hash] # '🦄 '
     
     +infobox
    -    |  #[strong API:] #[+api("stringstore") #[code stringstore]]
    -    |  #[strong Usage:] #[+a("/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
    +    |  #[+label-inline API:] #[+api("stringstore") #[code stringstore]]
    +    |  #[+label-inline Usage:] #[+a("/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
     
     +h(3, "lightning-tour-entities") Recongnise and update named entities
         +tag-model("NER")
    @@ -101,7 +101,7 @@ p
         assert ents == [(0, 7, u'ORG')]
     
     +infobox
    -    |  #[strong Usage:] #[+a("/usage/linguistic-features#named-entities") Named entity recognition]
    +    |  #[+label-inline Usage:] #[+a("/usage/linguistic-features#named-entities") Named entity recognition]
     
     +h(3, "lightning-tour-displacy") Visualize a dependency parse and named entities in your browser
         +tag-model("dependency parse", "NER")
    @@ -153,16 +153,12 @@ p
         displacy.serve(doc_ent, style='ent')
     
     +infobox
    -    |  #[strong API:] #[+api("displacy") #[code displacy]]
    -    |  #[strong Usage:] #[+a("/usage/visualizers") Visualizers]
    +    |  #[+label-inline API:] #[+api("displacy") #[code displacy]]
    +    |  #[+label-inline Usage:] #[+a("/usage/visualizers") Visualizers]
     
     +h(3, "lightning-tour-word-vectors") Get word vectors and similarity
         +tag-model("word vectors")
     
    -p
    -    |  For the best results, you should run this example using the
    -    |  #[+a("/models/en#en_vectors_web_lg") #[code en_vectors_web_lg]] model
    -
     +code.
         doc = nlp(u"Apple and banana are similar. Pasta and hippo aren't.")
         apple = doc[0]
    @@ -172,8 +168,12 @@ p
         assert apple.similarity(banana) > pasta.similarity(hippo)
         assert apple.has_vector, banana.has_vector, pasta.has_vector, hippo.has_vector
     
    +p
    +    |  For the best results, you should run this example using the
    +    |  #[+a("/models/en#en_vectors_web_lg") #[code en_vectors_web_lg]] model.
    +
     +infobox
    -    |  #[strong Usage:] #[+a("/usage/vectors-similarity") Word vectors and similarity]
    +    |  #[+label-inline Usage:] #[+a("/usage/vectors-similarity") Word vectors and similarity]
     
     +h(3, "lightning-tour-serialization") Simple and efficient serialization
     
    @@ -190,9 +190,9 @@ p
         new_doc = Doc(Vocab()).from_disk('/moby_dick.bin')
     
     +infobox
    -    |  #[strong API:] #[+api("language") #[code Language]],
    +    |  #[+label-inline API:] #[+api("language") #[code Language]],
         |  #[+api("doc") #[code Doc]]
    -    |  #[strong Usage:] #[+a("/usage/models#saving-loading") Saving and loading models]
    +    |  #[+label-inline Usage:] #[+a("/usage/models#saving-loading") Saving and loading models]
     
     +h(3, "lightning-tour-rule-matcher") Match text with token rules
     
    @@ -213,8 +213,8 @@ p
         matches = nlp(LOTS_OF TEXT)
     
     +infobox
    -    |  #[strong API:] #[+api("matcher") #[code Matcher]]
    -    |  #[strong Usage:] #[+a("/usage/linguistic-features#rule-based-matching") Rule-based matching]
    +    |  #[+label-inline API:] #[+api("matcher") #[code Matcher]]
    +    |  #[+label-inline Usage:] #[+a("/usage/linguistic-features#rule-based-matching") Rule-based matching]
     
     +h(3, "lightning-tour-multi-threaded") Multi-threaded generator
     
    @@ -228,8 +228,8 @@ p
                 break
     
     +infobox
    -    |  #[strong API:] #[+api("doc") #[code Doc]]
    -    |  #[strong Usage:] #[+a("/usage/processing-pipelines#multithreading") Processing pipelines]
    +    |  #[+label-inline API:] #[+api("doc") #[code Doc]]
    +    |  #[+label-inline Usage:] #[+a("/usage/processing-pipelines#multithreading") Processing pipelines]
     
     +h(3, "lightning-tour-dependencies") Get syntactic dependencies
         +tag-model("dependency parse")
    @@ -244,8 +244,8 @@ p
             return dep_labels
     
     +infobox
    -    |  #[strong API:] #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/usage/linguistic-features#dependency-parse") Using the dependency parse]
    +    |  #[+label-inline API:] #[+api("token") #[code Token]]
    +    |  #[+label-inline Usage:] #[+a("/usage/linguistic-features#dependency-parse") Using the dependency parse]
     
     +h(3, "lightning-tour-numpy-arrays") Export to numpy arrays
     
    
    From df488274b17a67c9e81566f2fa03cf896d096dc7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 20:55:00 +0200
    Subject: [PATCH 388/649] Fix deserialization of vectors
    
    ---
     spacy/util.py     | 2 +-
     spacy/vectors.pyx | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index 71dff4321..a67b05eb2 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -494,7 +494,7 @@ def from_disk(path, readers, exclude):
         path = ensure_path(path)
         for key, reader in readers.items():
             if key not in exclude:
    -            reader(path2str(path / key))
    +            reader(path / key)
         return path
     
     
    diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx
    index 8ce150531..5512279ae 100644
    --- a/spacy/vectors.pyx
    +++ b/spacy/vectors.pyx
    @@ -12,7 +12,7 @@ from thinc.neural._classes.model import Model
     from .typedefs cimport attr_t
     from .strings cimport StringStore
     from . import util
    -from .compat import basestring_
    +from .compat import basestring_, path2str
     
     
     cdef class Vectors:
    @@ -162,7 +162,7 @@ cdef class Vectors:
         def from_disk(self, path, **exclude):
             def load_keys(path):
                 if path.exists():
    -                self.keys = numpy.load(path)
    +                self.keys = numpy.load(path2str(path))
                     for i, key in enumerate(self.keys):
                         self.keys[i] = key
                         self.key2row[key] = i
    
    From 485c4f6df5763a01b90117632114f96e28c31738 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 17 Oct 2017 02:37:45 +0200
    Subject: [PATCH 389/649] Add Hungarian examples (see #1107)
    
    ---
     spacy/lang/hu/examples.py | 17 +++++++++++++++++
     1 file changed, 17 insertions(+)
     create mode 100644 spacy/lang/hu/examples.py
    
    diff --git a/spacy/lang/hu/examples.py b/spacy/lang/hu/examples.py
    new file mode 100644
    index 000000000..718d7d536
    --- /dev/null
    +++ b/spacy/lang/hu/examples.py
    @@ -0,0 +1,17 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +
    +"""
    +Example sentences to test spaCy and its language models.
    +
    +>>> from spacy.lang.hu.examples import sentences
    +>>> docs = nlp.pipe(sentences)
    +"""
    +
    +
    +sentences = [
    +    "Az Apple egy brit startup vásárlását tervezi 1 milliárd dollár értékben.",
    +    "San Francisco vezetése mérlegeli a járdát használó szállító robotok betiltását.",
    +    "London az Egyesült Királyság egy nagy városa."
    +]
    
    From 8ca344712d8adb5bdb7c1550667725def9b9bfb3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 17 Oct 2017 11:20:07 +0200
    Subject: [PATCH 390/649] Add Language.has_pipe method
    
    ---
     spacy/language.py         |  9 +++++++++
     website/api/language.jade | 24 ++++++++++++++++++++++++
     2 files changed, 33 insertions(+)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 7fd56ed56..5a8c3e90c 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -255,6 +255,15 @@ class Language(object):
                 unfound = before or after
                 raise ValueError(msg.format(unfound, self.pipe_names))
     
    +    def has_pipe(self, name):
    +        """Check if a component name is present in the pipeline. Equivalent to
    +        `name in nlp.pipe_names`.
    +
    +        name (unicode): Name of the component.
    +        RETURNS (bool): Whether a component of that name exists in the pipeline.
    +        """
    +        return name in self.pipe_names
    +
         def replace_pipe(self, name, component):
             """Replace a component in the pipeline.
     
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 500d6c411..668cbadd7 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -327,6 +327,30 @@ p
             +cell bool
             +cell Insert component last / not last in the pipeline.
     
    ++h(2, "has_pipe") Language.has_pipe
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Check whether a component is present in the pipeline. Equivalent to
    +    |  #[code name in nlp.pipe_names].
    +
    ++aside-code("Example").
    +    nlp.add_pipe(lambda doc: doc, name='component')
    +    assert 'component' in nlp.pipe_names
    +    assert nlp.has_pipe('component')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the pipeline component to check.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell Whether a component of that name exists in the pipeline.
    +
     +h(2, "get_pipe") Language.get_pipe
         +tag method
         +tag-new(2)
    
    From 8f5b60c168f47c1be476627cc1b90f706f19038d Mon Sep 17 00:00:00 2001
    From: Anto Binish Kaspar 
    Date: Tue, 17 Oct 2017 17:15:32 +0530
    Subject: [PATCH 391/649] Fix Language.from_disk overwrites the meta.json file.
    
    ---
     spacy/language.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 7fd56ed56..332a814b4 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -585,7 +585,7 @@ class Language(object):
             deserializers = OrderedDict((
                 ('vocab', lambda p: self.vocab.from_disk(p)),
                 ('tokenizer', lambda p: self.tokenizer.from_disk(p, vocab=False)),
    -            ('meta.json', lambda p: p.open('w').write(json_dumps(self.meta)))
    +            ('meta.json', lambda p: self.meta.update(ujson.load(p.open('r'))))
             ))
             for name, proc in self.pipeline:
                 if name in disable:
    
    From 534240648ef9b511048c704bbf4acf3db528ed6b Mon Sep 17 00:00:00 2001
    From: Anto Binish Kaspar 
    Date: Tue, 17 Oct 2017 17:15:58 +0530
    Subject: [PATCH 392/649] Fix trailing whitespace on morphology features
    
    ---
     spacy/symbols.pyx | 126 +++++++++++++++++++++++-----------------------
     1 file changed, 63 insertions(+), 63 deletions(-)
    
    diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx
    index dd0e38cad..b7f1f4556 100644
    --- a/spacy/symbols.pyx
    +++ b/spacy/symbols.pyx
    @@ -163,7 +163,7 @@ IDS = {
         "Degree_sup": Degree_sup,
         "Degree_abs": Degree_abs,
         "Degree_com": Degree_com,
    -    "Degree_dim ": Degree_dim, # du
    +    "Degree_dim": Degree_dim, # du
         "Degree_equ": Degree_equ, # U20
         "Evident_nfh": Evident_nfh, # U20
         "Gender_com": Gender_com,
    @@ -189,8 +189,8 @@ IDS = {
         "Number_none": Number_none,
         "Number_plur": Number_plur,
         "Number_sing": Number_sing,
    -    "Number_ptan ": Number_ptan, # bg
    -    "Number_count ": Number_count, # bg, U20
    +    "Number_ptan": Number_ptan, # bg
    +    "Number_count": Number_count, # bg, U20
         "Number_tri": Number_tri, # U20
         "NumType_card": NumType_card,
         "NumType_dist": NumType_dist,
    @@ -235,22 +235,22 @@ IDS = {
         "VerbForm_sup": VerbForm_sup,
         "VerbForm_trans": VerbForm_trans,
         "VerbForm_conv": VerbForm_conv, # U20
    -    "VerbForm_gdv ": VerbForm_gdv, # la,
    +    "VerbForm_gdv": VerbForm_gdv, # la,
         "VerbForm_vnoun": VerbForm_vnoun, # U20
         "Voice_act": Voice_act,
         "Voice_cau": Voice_cau,
         "Voice_pass": Voice_pass,
    -    "Voice_mid ": Voice_mid, # gkc, U20
    -    "Voice_int ": Voice_int, # hb,
    +    "Voice_mid": Voice_mid, # gkc, U20
    +    "Voice_int": Voice_int, # hb,
         "Voice_antip": Voice_antip, # U20
         "Voice_dir": Voice_dir, # U20
         "Voice_inv": Voice_inv, # U20
    -    "Abbr_yes ": Abbr_yes, # cz, fi, sl, U,
    -    "AdpType_prep ": AdpType_prep, # cz, U,
    -    "AdpType_post ": AdpType_post, # U,
    -    "AdpType_voc ": AdpType_voc, # cz,
    -    "AdpType_comprep ": AdpType_comprep, # cz,
    -    "AdpType_circ ": AdpType_circ, # U,
    +    "Abbr_yes": Abbr_yes, # cz, fi, sl, U,
    +    "AdpType_prep": AdpType_prep, # cz, U,
    +    "AdpType_post": AdpType_post, # U,
    +    "AdpType_voc": AdpType_voc, # cz,
    +    "AdpType_comprep": AdpType_comprep, # cz,
    +    "AdpType_circ": AdpType_circ, # U,
         "AdvType_man": AdvType_man,
         "AdvType_loc": AdvType_loc,
         "AdvType_tim": AdvType_tim,
    @@ -260,56 +260,56 @@ IDS = {
         "AdvType_sta": AdvType_sta,
         "AdvType_ex": AdvType_ex,
         "AdvType_adadj": AdvType_adadj,
    -    "ConjType_oper ": ConjType_oper, # cz, U,
    -    "ConjType_comp ": ConjType_comp, # cz, U,
    -    "Connegative_yes ": Connegative_yes, # fi,
    -    "Derivation_minen ": Derivation_minen, # fi,
    -    "Derivation_sti ": Derivation_sti, # fi,
    -    "Derivation_inen ": Derivation_inen, # fi,
    -    "Derivation_lainen ": Derivation_lainen, # fi,
    -    "Derivation_ja ": Derivation_ja, # fi,
    -    "Derivation_ton ": Derivation_ton, # fi,
    -    "Derivation_vs ": Derivation_vs, # fi,
    -    "Derivation_ttain ": Derivation_ttain, # fi,
    -    "Derivation_ttaa ": Derivation_ttaa, # fi,
    -    "Echo_rdp ": Echo_rdp, # U,
    -    "Echo_ech ": Echo_ech, # U,
    -    "Foreign_foreign ": Foreign_foreign, # cz, fi, U,
    -    "Foreign_fscript ": Foreign_fscript, # cz, fi, U,
    -    "Foreign_tscript ": Foreign_tscript, # cz, U,
    -    "Foreign_yes ": Foreign_yes, # sl,
    -    "Gender_dat_masc ": Gender_dat_masc, # bq, U,
    -    "Gender_dat_fem ": Gender_dat_fem, # bq, U,
    -    "Gender_erg_masc ": Gender_erg_masc, # bq,
    -    "Gender_erg_fem ": Gender_erg_fem, # bq,
    -    "Gender_psor_masc ": Gender_psor_masc, # cz, sl, U,
    -    "Gender_psor_fem ": Gender_psor_fem, # cz, sl, U,
    -    "Gender_psor_neut ": Gender_psor_neut, # sl,
    -    "Hyph_yes ": Hyph_yes, # cz, U,
    -    "InfForm_one ": InfForm_one, # fi,
    -    "InfForm_two ": InfForm_two, # fi,
    -    "InfForm_three ": InfForm_three, # fi,
    -    "NameType_geo ": NameType_geo, # U, cz,
    -    "NameType_prs ": NameType_prs, # U, cz,
    -    "NameType_giv ": NameType_giv, # U, cz,
    -    "NameType_sur ": NameType_sur, # U, cz,
    -    "NameType_nat ": NameType_nat, # U, cz,
    -    "NameType_com ": NameType_com, # U, cz,
    -    "NameType_pro ": NameType_pro, # U, cz,
    -    "NameType_oth ": NameType_oth, # U, cz,
    -    "NounType_com ": NounType_com, # U,
    -    "NounType_prop ": NounType_prop, # U,
    -    "NounType_class ": NounType_class, # U,
    -    "Number_abs_sing ": Number_abs_sing, # bq, U,
    -    "Number_abs_plur ": Number_abs_plur, # bq, U,
    -    "Number_dat_sing ": Number_dat_sing, # bq, U,
    -    "Number_dat_plur ": Number_dat_plur, # bq, U,
    -    "Number_erg_sing ": Number_erg_sing, # bq, U,
    -    "Number_erg_plur ": Number_erg_plur, # bq, U,
    -    "Number_psee_sing ": Number_psee_sing, # U,
    -    "Number_psee_plur ": Number_psee_plur, # U,
    -    "Number_psor_sing ": Number_psor_sing, # cz, fi, sl, U,
    -    "Number_psor_plur ": Number_psor_plur, # cz, fi, sl, U,
    +    "ConjType_oper": ConjType_oper, # cz, U,
    +    "ConjType_comp": ConjType_comp, # cz, U,
    +    "Connegative_yes": Connegative_yes, # fi,
    +    "Derivation_minen": Derivation_minen, # fi,
    +    "Derivation_sti": Derivation_sti, # fi,
    +    "Derivation_inen": Derivation_inen, # fi,
    +    "Derivation_lainen": Derivation_lainen, # fi,
    +    "Derivation_ja": Derivation_ja, # fi,
    +    "Derivation_ton": Derivation_ton, # fi,
    +    "Derivation_vs": Derivation_vs, # fi,
    +    "Derivation_ttain": Derivation_ttain, # fi,
    +    "Derivation_ttaa": Derivation_ttaa, # fi,
    +    "Echo_rdp": Echo_rdp, # U,
    +    "Echo_ech": Echo_ech, # U,
    +    "Foreign_foreign": Foreign_foreign, # cz, fi, U,
    +    "Foreign_fscript": Foreign_fscript, # cz, fi, U,
    +    "Foreign_tscript": Foreign_tscript, # cz, U,
    +    "Foreign_yes": Foreign_yes, # sl,
    +    "Gender_dat_masc": Gender_dat_masc, # bq, U,
    +    "Gender_dat_fem": Gender_dat_fem, # bq, U,
    +    "Gender_erg_masc": Gender_erg_masc, # bq,
    +    "Gender_erg_fem": Gender_erg_fem, # bq,
    +    "Gender_psor_masc": Gender_psor_masc, # cz, sl, U,
    +    "Gender_psor_fem": Gender_psor_fem, # cz, sl, U,
    +    "Gender_psor_neut": Gender_psor_neut, # sl,
    +    "Hyph_yes": Hyph_yes, # cz, U,
    +    "InfForm_one": InfForm_one, # fi,
    +    "InfForm_two": InfForm_two, # fi,
    +    "InfForm_three": InfForm_three, # fi,
    +    "NameType_geo": NameType_geo, # U, cz,
    +    "NameType_prs": NameType_prs, # U, cz,
    +    "NameType_giv": NameType_giv, # U, cz,
    +    "NameType_sur": NameType_sur, # U, cz,
    +    "NameType_nat": NameType_nat, # U, cz,
    +    "NameType_com": NameType_com, # U, cz,
    +    "NameType_pro": NameType_pro, # U, cz,
    +    "NameType_oth": NameType_oth, # U, cz,
    +    "NounType_com": NounType_com, # U,
    +    "NounType_prop": NounType_prop, # U,
    +    "NounType_class": NounType_class, # U,
    +    "Number_abs_sing": Number_abs_sing, # bq, U,
    +    "Number_abs_plur": Number_abs_plur, # bq, U,
    +    "Number_dat_sing": Number_dat_sing, # bq, U,
    +    "Number_dat_plur": Number_dat_plur, # bq, U,
    +    "Number_erg_sing": Number_erg_sing, # bq, U,
    +    "Number_erg_plur": Number_erg_plur, # bq, U,
    +    "Number_psee_sing": Number_psee_sing, # U,
    +    "Number_psee_plur": Number_psee_plur, # U,
    +    "Number_psor_sing": Number_psor_sing, # cz, fi, sl, U,
    +    "Number_psor_plur": Number_psor_plur, # cz, fi, sl, U,
         "Number_pauc": Number_pauc, # U20
         "Number_grpa": Number_grpa, # U20
         "Number_grpl": Number_grpl, # U20
    @@ -354,7 +354,7 @@ IDS = {
         "Polite_infm": Polite_infm, # U20
         "Polite_form": Polite_form, # U20
         "Polite_form_elev": Polite_form_elev, # U20
    -    "Polite_form_humb ": Polite_form_humb, # U20
    +    "Polite_form_humb": Polite_form_humb, # U20
         "Prefix_yes": Prefix_yes, # U,
         "PrepCase_npr": PrepCase_npr, # cz,
         "PrepCase_pre": PrepCase_pre, # U,
    
    From ed8da9b11f54705b9b71c4527c8b70d94c7d2ed4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 15:32:56 +0200
    Subject: [PATCH 393/649] Add missing return statement in SentenceSegmenter
    
    ---
     spacy/pipeline.pyx | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 5bb4b090e..7c1976dfa 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -69,6 +69,7 @@ class SentenceSegmenter(object):
     
         def __call__(self, doc):
             doc.user_hooks['sents'] = self.strategy
    +        return doc
     
         @staticmethod
         def split_on_punct(doc):
    
    From 92c1eb2d6f6e13e33f8c74b0b496cb571b354f78 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 16:11:13 +0200
    Subject: [PATCH 394/649] Fix Doc pickling. This also removes need for Binder
     class
    
    ---
     spacy/tokens/doc.pyx | 22 +++++++++++++++++++---
     1 file changed, 19 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index bf48cf4f5..5681df030 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -27,7 +27,7 @@ from ..attrs cimport LENGTH, POS, LEMMA, TAG, DEP, HEAD, SPACY, ENT_IOB, ENT_TYP
     from ..attrs cimport SENT_START
     from ..parts_of_speech cimport CCONJ, PUNCT, NOUN, univ_pos_t
     from ..util import normalize_slice
    -from ..compat import is_config
    +from ..compat import is_config, copy_reg, pickle
     from .. import about
     from .. import util
     from .underscore import Underscore
    @@ -104,7 +104,8 @@ cdef class Doc:
         def has_extension(cls, name):
             return name in Underscore.doc_extensions
     
    -    def __init__(self, Vocab vocab, words=None, spaces=None, orths_and_spaces=None):
    +    def __init__(self, Vocab vocab, words=None, spaces=None, user_data=None,
    +                 orths_and_spaces=None):
             """Create a Doc object.
     
             vocab (Vocab): A vocabulary object, which must match any models you want
    @@ -114,6 +115,8 @@ cdef class Doc:
             spaces (list or None): A list of boolean values, of the same length as
                 words. True means that the word is followed by a space, False means
                 it is not. If `None`, defaults to `[True]*len(words)`
    +        user_data (dict or None): Optional extra data to attach to the Doc.
    + 
             RETURNS (Doc): The newly constructed object.
             """
             self.vocab = vocab
    @@ -139,7 +142,7 @@ cdef class Doc:
             self.user_token_hooks = {}
             self.user_span_hooks = {}
             self.tensor = numpy.zeros((0,), dtype='float32')
    -        self.user_data = {}
    +        self.user_data = {} if user_data is None else user_data
             self._vector = None
             self.noun_chunks_iterator = _get_chunker(self.vocab.lang)
             cdef unicode orth
    @@ -914,3 +917,16 @@ cdef int set_children_from_heads(TokenC* tokens, int length) except -1:
             if tokens[i].head == 0 and tokens[i].dep != 0:
                 tokens[tokens[i].l_edge].sent_start = True
     
    +
    +def pickle_doc(doc):
    +    bytes_data = doc.to_bytes(exclude='vocab')
    +    return (unpickle_doc, (doc.vocab, doc.user_data, bytes_data))
    +
    +
    +def unpickle_doc(vocab, user_data, bytes_data):
    +    doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data)
    +    return doc
    +
    +
    +copy_reg.pickle(Doc, pickle_doc, unpickle_doc)
    +
    
    From a74cba2ffa548e829a56af3a2297c4c0390f0768 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 17 Oct 2017 16:27:17 +0200
    Subject: [PATCH 395/649] Remove Binder from docs (now covered by Doc API)
    
    ---
     website/api/_data.json                      | 10 +---------
     website/api/binder.jade                     |  7 -------
     website/usage/_spacy-101/_architecture.jade |  4 ----
     website/usage/v2.jade                       |  8 ++++++--
     4 files changed, 7 insertions(+), 22 deletions(-)
     delete mode 100644 website/api/binder.jade
    
    diff --git a/website/api/_data.json b/website/api/_data.json
    index 83b98f1fa..d85b103dc 100644
    --- a/website/api/_data.json
    +++ b/website/api/_data.json
    @@ -31,8 +31,7 @@
                 "StringStore": "stringstore",
                 "Vectors": "vectors",
                 "GoldParse": "goldparse",
    -            "GoldCorpus": "goldcorpus",
    -            "Binder": "binder"
    +            "GoldCorpus": "goldcorpus"
             }
         },
     
    @@ -193,13 +192,6 @@
             "source": "spacy/gold.pyx"
         },
     
    -    "binder": {
    -        "title": "Binder",
    -        "tag": "class",
    -        "tag_new": 2,
    -        "source": "spacy/tokens/binder.pyx"
    -    },
    -
         "vectors": {
             "title": "Vectors",
             "teaser": "Store, save and load word vectors.",
    diff --git a/website/api/binder.jade b/website/api/binder.jade
    deleted file mode 100644
    index e47cb597d..000000000
    --- a/website/api/binder.jade
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -//- 💫 DOCS > API > BINDER
    -
    -include ../_includes/_mixins
    -
    -p A container class for serializing collections of #[code Doc] objects.
    -
    -+under-construction
    diff --git a/website/usage/_spacy-101/_architecture.jade b/website/usage/_spacy-101/_architecture.jade
    index c9b299036..1a3ed05a3 100644
    --- a/website/usage/_spacy-101/_architecture.jade
    +++ b/website/usage/_spacy-101/_architecture.jade
    @@ -138,7 +138,3 @@ p
             +cell
                 |  An annotated corpus, using the JSON file format. Manages
                 |  annotations for tagging, dependency parsing and NER.
    -
    -    +row
    -        +cell #[+api("binder") #[code Binder]]
    -        +cell Container class for serializing collections of #[code Doc] objects.
    diff --git a/website/usage/v2.jade b/website/usage/v2.jade
    index 66304c860..bb150de86 100644
    --- a/website/usage/v2.jade
    +++ b/website/usage/v2.jade
    @@ -206,7 +206,7 @@ p
             |  e.g. #[code from spacy.lang.en import English].
     
         +infobox
    -        |  #[+label-inline API:] #[+api("spacy#load") #[code spacy.load]], #[+api("binder") #[code Binder]]
    +        |  #[+label-inline API:] #[+api("spacy#load") #[code spacy.load]]
             |  #[+label-inline Usage:] #[+a("/usage/saving-loading") Saving and loading]
     
         +h(3, "features-displacy") displaCy visualizer with Jupyter support
    @@ -387,7 +387,11 @@ p
     
             +row
                 +cell #[code Doc.read_bytes]
    -            +cell #[+api("binder") #[code Binder]]
    +            +cell
    +                |  #[+api("doc#to_bytes") #[code Doc.to_bytes]]
    +                |  #[+api("doc#from_bytes") #[code Doc.from_bytes]]
    +                |  #[+api("doc#to_disk") #[code Doc.to_disk]]
    +                |  #[+api("doc#from_disk") #[code Doc.from_disk]]
     
             +row
                 +cell #[code Token.is_ancestor_of]
    
    From 45d1dd90b1794897d72b25d9090bed785387560f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 17:20:58 +0200
    Subject: [PATCH 396/649] Add tests for pickling doc
    
    ---
     spacy/tests/doc/test_pickle_doc.py | 25 +++++++++++++++++++++++++
     1 file changed, 25 insertions(+)
     create mode 100644 spacy/tests/doc/test_pickle_doc.py
    
    diff --git a/spacy/tests/doc/test_pickle_doc.py b/spacy/tests/doc/test_pickle_doc.py
    new file mode 100644
    index 000000000..81ce22666
    --- /dev/null
    +++ b/spacy/tests/doc/test_pickle_doc.py
    @@ -0,0 +1,25 @@
    +from __future__ import unicode_literals
    +
    +import pickle
    +
    +from ...language import Language
    +
    +
    +def test_pickle_single_doc():
    +    nlp = Language()
    +    doc = nlp(u'pickle roundtrip')
    +    data = pickle.dumps(doc, 1)
    +    doc2 = pickle.loads(data)
    +    assert doc2.text == 'pickle roundtrip'
    +
    +
    +def test_list_of_docs_pickles_efficiently():
    +    nlp = Language()
    +    one_pickled = pickle.dumps(nlp(u'0'), -1)
    +    docs = list(nlp.pipe(str(i) for i in range(100)))
    +    many_pickled = pickle.dumps(docs, -1)
    +    assert len(many_pickled) < (len(one_pickled) * 2)
    +    many_unpickled = pickle.loads(many_pickled)
    +    assert many_unpickled[0].text == '0'
    +    assert many_unpickled[-1].text == '99'
    +    assert len(many_unpickled) == 99
    
    From 0d57b9748ad68002620554b2df06be34527c7503 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:17:45 +0200
    Subject: [PATCH 397/649] Serialize lex_attr_getters with dill, for better
     pickle support
    
    ---
     spacy/vocab.pyx | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index a5f8bf6ad..205e5a2af 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -5,6 +5,7 @@ import bz2
     import ujson
     import re
     import numpy
    +import dill
     
     from libc.string cimport memset, memcpy
     from libc.stdint cimport int32_t
    @@ -419,7 +420,7 @@ def pickle_vocab(vocab):
         morph = vocab.morphology
         length = vocab.length
         data_dir = vocab.data_dir
    -    lex_attr_getters = vocab.lex_attr_getters
    +    lex_attr_getters = dill.dumps(vocab.lex_attr_getters)
     
         lexemes_data = vocab.lexemes_to_bytes()
     
    @@ -435,7 +436,7 @@ def unpickle_vocab(sstore, morphology, data_dir,
         vocab.strings = sstore
         vocab.morphology = morphology
         vocab.data_dir = data_dir
    -    vocab.lex_attr_getters = lex_attr_getters
    +    vocab.lex_attr_getters = dill.loads(lex_attr_getters)
         vocab.lexemes_from_bytes(lexemes_data)
         vocab.length = length
         link_vectors_to_models(vocab)
    
    From 1cc85a89efd6116a904694012ebd150507258c64 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:18:10 +0200
    Subject: [PATCH 398/649] Allow reasonably efficient pickling of Language
     class, using to_bytes() and from_bytes().
    
    ---
     spacy/language.py | 22 +++++++++++++++++-----
     1 file changed, 17 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 5a8c3e90c..283b19899 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -9,6 +9,7 @@ import ujson
     from collections import OrderedDict
     import itertools
     import weakref
    +import functools
     
     from .tokenizer import Tokenizer
     from .vocab import Vocab
    @@ -19,14 +20,14 @@ from .syntax.parser import get_templates
     from .pipeline import NeuralDependencyParser, TokenVectorEncoder, NeuralTagger
     from .pipeline import NeuralEntityRecognizer, SimilarityHook, TextCategorizer
     
    -from .compat import json_dumps, izip
    +from .compat import json_dumps, izip, copy_reg
     from .scorer import Scorer
     from ._ml import link_vectors_to_models
     from .attrs import IS_STOP
     from .lang.punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES
     from .lang.tokenizer_exceptions import TOKEN_MATCH
     from .lang.tag_map import TAG_MAP
    -from .lang.lex_attrs import LEX_ATTRS
    +from .lang.lex_attrs import LEX_ATTRS, is_stop
     from . import util
     from . import about
     
    @@ -42,7 +43,8 @@ class BaseDefaults(object):
             lemmatizer = cls.create_lemmatizer(nlp)
             lex_attr_getters = dict(cls.lex_attr_getters)
             # This is messy, but it's the minimal working fix to Issue #639.
    -        lex_attr_getters[IS_STOP] = lambda string: string.lower() in cls.stop_words
    +        lex_attr_getters[IS_STOP] = functools.partial(is_stop,
    +                                                      stops=cls.stop_words)
             vocab = Vocab(lex_attr_getters=lex_attr_getters, tag_map=cls.tag_map,
                           lemmatizer=lemmatizer)
             for tag_str, exc in cls.morph_rules.items():
    @@ -135,6 +137,10 @@ class Language(object):
             self.pipeline = []
             self._optimizer = None
     
    +    def __reduce__(self):
    +        bytes_data = self.to_bytes(vocab=False)
    +        return (unpickle_language, (self.vocab, self.meta, bytes_data))
    +
         @property
         def meta(self):
             self._meta.setdefault('lang', self.vocab.lang)
    @@ -608,7 +614,7 @@ class Language(object):
             util.from_disk(path, deserializers, exclude)
             return self
     
    -    def to_bytes(self, disable=[]):
    +    def to_bytes(self, disable=[], **exclude):
             """Serialize the current state to a binary string.
     
             disable (list): Nameds of pipeline components to disable and prevent
    @@ -626,7 +632,7 @@ class Language(object):
                 if not hasattr(proc, 'to_bytes'):
                     continue
                 serializers[i] = lambda proc=proc: proc.to_bytes(vocab=False)
    -        return util.to_bytes(serializers, {})
    +        return util.to_bytes(serializers, exclude)
     
         def from_bytes(self, bytes_data, disable=[]):
             """Load state from a binary string.
    @@ -650,6 +656,12 @@ class Language(object):
             return self
     
     
    +def unpickle_language(vocab, meta, bytes_data):
    +    lang = Language(vocab=vocab)
    +    lang.from_bytes(bytes_data)
    +    return lang
    +
    +
     def _pipe(func, docs):
         for doc in docs:
             func(doc)
    
    From 9ce7d6af8762102bf5c826292e89a2ef29b6bbec Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:19:18 +0200
    Subject: [PATCH 399/649] Make lex attr functions top-level functions, to
     promote pickling
    
    ---
     spacy/lang/lex_attrs.py | 41 +++++++++++++++++++++++++++--------------
     1 file changed, 27 insertions(+), 14 deletions(-)
    
    diff --git a/spacy/lang/lex_attrs.py b/spacy/lang/lex_attrs.py
    index d4beebd26..f0363b05f 100644
    --- a/spacy/lang/lex_attrs.py
    +++ b/spacy/lang/lex_attrs.py
    @@ -122,22 +122,35 @@ def word_shape(text):
                 shape.append(shape_char)
         return ''.join(shape)
     
    +def lower(string): return string.lower()
    +def prefix(string): return string[0]
    +def suffix(string): return string[-3:]
    +def cluster(string): return 0
    +def is_alpha(string): return string.isalpha()
    +def is_digit(string): return string.isdigit()
    +def is_lower(string): return string.islower()
    +def is_space(string): return string.isspace()
    +def is_title(string): return string.istitle()
    +def is_upper(string): return string.isupper()
    +def is_stop(string, stops=set()): return string in stops
    +def is_oov(string): return True
    +def get_prob(string): return -20.
     
     LEX_ATTRS = {
    -    attrs.LOWER: lambda string: string.lower(),
    -    attrs.NORM: lambda string: string.lower(),
    -    attrs.PREFIX: lambda string: string[0],
    -    attrs.SUFFIX: lambda string: string[-3:],
    -    attrs.CLUSTER: lambda string: 0,
    -    attrs.IS_ALPHA: lambda string: string.isalpha(),
    -    attrs.IS_DIGIT: lambda string: string.isdigit(),
    -    attrs.IS_LOWER: lambda string: string.islower(),
    -    attrs.IS_SPACE: lambda string: string.isspace(),
    -    attrs.IS_TITLE: lambda string: string.istitle(),
    -    attrs.IS_UPPER: lambda string: string.isupper(),
    -    attrs.IS_STOP: lambda string: False,
    -    attrs.IS_OOV: lambda string: True,
    -    attrs.PROB: lambda string: -20.,
    +    attrs.LOWER: lower,
    +    attrs.NORM: lower,
    +    attrs.PREFIX: prefix,
    +    attrs.SUFFIX: suffix,
    +    attrs.CLUSTER: cluster,
    +    attrs.IS_ALPHA: is_alpha,
    +    attrs.IS_DIGIT: is_digit,
    +    attrs.IS_LOWER: is_lower,
    +    attrs.IS_SPACE: is_space,
    +    attrs.IS_TITLE: is_title,
    +    attrs.IS_UPPER: is_upper,
    +    attrs.IS_STOP: is_stop,
    +    attrs.IS_OOV: is_oov,
    +    attrs.PROB: get_prob,
         attrs.LIKE_EMAIL: like_email,
         attrs.LIKE_NUM: like_num,
         attrs.IS_PUNCT: is_punct,
    
    From 8ca97f32a3fa5af7d20937f63430a5d809c5f575 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:19:57 +0200
    Subject: [PATCH 400/649] Fix doc pickling test
    
    ---
     spacy/tests/doc/test_pickle_doc.py | 9 +++++----
     1 file changed, 5 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/tests/doc/test_pickle_doc.py b/spacy/tests/doc/test_pickle_doc.py
    index 81ce22666..9bfa442d9 100644
    --- a/spacy/tests/doc/test_pickle_doc.py
    +++ b/spacy/tests/doc/test_pickle_doc.py
    @@ -1,8 +1,7 @@
     from __future__ import unicode_literals
     
    -import pickle
    -
     from ...language import Language
    +from ...compat import pickle, unicode_
     
     
     def test_pickle_single_doc():
    @@ -15,11 +14,13 @@ def test_pickle_single_doc():
     
     def test_list_of_docs_pickles_efficiently():
         nlp = Language()
    +    for i in range(10000):
    +        _ = nlp.vocab[unicode_(i)]
         one_pickled = pickle.dumps(nlp(u'0'), -1)
    -    docs = list(nlp.pipe(str(i) for i in range(100)))
    +    docs = list(nlp.pipe(unicode_(i) for i in range(100)))
         many_pickled = pickle.dumps(docs, -1)
         assert len(many_pickled) < (len(one_pickled) * 2)
         many_unpickled = pickle.loads(many_pickled)
         assert many_unpickled[0].text == '0'
         assert many_unpickled[-1].text == '99'
    -    assert len(many_unpickled) == 99
    +    assert len(many_unpickled) == 100
    
    From 32a8564c79dd9cbee00992b0f07ad5decb4b4dca Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:20:24 +0200
    Subject: [PATCH 401/649] Fix doc pickling
    
    ---
     spacy/tokens/doc.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 5681df030..158cb9220 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -919,7 +919,7 @@ cdef int set_children_from_heads(TokenC* tokens, int length) except -1:
     
     
     def pickle_doc(doc):
    -    bytes_data = doc.to_bytes(exclude='vocab')
    +    bytes_data = doc.to_bytes(vocab=False)
         return (unpickle_doc, (doc.vocab, doc.user_data, bytes_data))
     
     
    
    From 9baa8fe7ecbe014b47b0dcbbe96d01341f5fb008 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:20:52 +0200
    Subject: [PATCH 402/649] Convert closure to functools.partial, to promote
     pickling
    
    ---
     spacy/util.py | 17 +++++++++++------
     1 file changed, 11 insertions(+), 6 deletions(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index a67b05eb2..ca5a40f97 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -15,6 +15,7 @@ import io
     import dill
     from collections import OrderedDict
     from thinc.neural._classes.model import Model
    +import functools
     
     import msgpack
     import msgpack_numpy
    @@ -336,12 +337,16 @@ def add_lookups(default_func, *lookups):
         *lookups (dict): Lookup dictionary mapping string to attribute value.
         RETURNS (callable): Lexical attribute getter.
         """
    -    def get_attr(string):
    -        for lookup in lookups:
    -            if string in lookup:
    -                return lookup[string]
    -        return default_func(string)
    -    return get_attr
    +    # This is implemented as functools.partial instead of a closure, to allow
    +    # pickle to work.
    +    return functools.partial(_get_attr_unless_lookup, default_func, lookups)
    +
    +
    +def _get_attr_unless_lookup(default_func, lookups, string):
    +    for lookup in lookups:
    +        if string in lookup:
    +            return lookup[string]
    +    return default_func(string)
     
     
     def update_exc(base_exceptions, *addition_dicts):
    
    From 839de87ca99b1469a0305ded10a7b99abd7a4df7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:21:20 +0200
    Subject: [PATCH 403/649] Make lambda func a named function, for pickling
    
    ---
     spacy/lang/en/__init__.py | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/lang/en/__init__.py b/spacy/lang/en/__init__.py
    index 63fd9c2b4..a95e501e1 100644
    --- a/spacy/lang/en/__init__.py
    +++ b/spacy/lang/en/__init__.py
    @@ -16,11 +16,13 @@ from ...language import Language
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    +def _return_en(_):
    +    return 'en'
     
     class EnglishDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters.update(LEX_ATTRS)
    -    lex_attr_getters[LANG] = lambda text: 'en'
    +    lex_attr_getters[LANG] = _return_en
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM],
                                              BASE_NORMS, NORM_EXCEPTIONS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    
    From f45973848cf65acf6a1595c10d43bc29553349c1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:21:41 +0200
    Subject: [PATCH 404/649] Rename 'tokens' variable 'doc' in tokenizer
    
    ---
     spacy/tokenizer.pyx | 18 +++++++++---------
     1 file changed, 9 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx
    index f2d21de44..692357c8a 100644
    --- a/spacy/tokenizer.pyx
    +++ b/spacy/tokenizer.pyx
    @@ -79,9 +79,9 @@ cdef class Tokenizer:
                     "String is too long: %d characters. Max is 2**30." % len(string)
                 )
             cdef int length = len(string)
    -        cdef Doc tokens = Doc(self.vocab)
    +        cdef Doc doc = Doc(self.vocab)
             if length == 0:
    -            return tokens
    +            return doc
             cdef int i = 0
             cdef int start = 0
             cdef bint cache_hit
    @@ -100,11 +100,11 @@ cdef class Tokenizer:
                         # we don't have to create the slice when we hit the cache.
                         span = string[start:i]
                         key = hash_string(span)
    -                    cache_hit = self._try_cache(key, tokens)
    +                    cache_hit = self._try_cache(key, doc)
                         if not cache_hit:
    -                        self._tokenize(tokens, span, key)
    +                        self._tokenize(doc, span, key)
                     if uc == ' ':
    -                    tokens.c[tokens.length - 1].spacy = True
    +                    doc.c[doc.length - 1].spacy = True
                         start = i + 1
                     else:
                         start = i
    @@ -113,11 +113,11 @@ cdef class Tokenizer:
             if start < i:
                 span = string[start:]
                 key = hash_string(span)
    -            cache_hit = self._try_cache(key, tokens)
    +            cache_hit = self._try_cache(key, doc)
                 if not cache_hit:
    -                self._tokenize(tokens, span, key)
    -            tokens.c[tokens.length - 1].spacy = string[-1] == ' ' and not in_ws
    -        return tokens
    +                self._tokenize(doc, span, key)
    +            doc.c[doc.length - 1].spacy = string[-1] == ' ' and not in_ws
    +        return doc
     
         def pipe(self, texts, batch_size=1000, n_threads=2):
             """Tokenize a stream of texts.
    
    From 374819edf827b7be59a57fed9e58d1e920752fd4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 19:28:54 +0200
    Subject: [PATCH 405/649] Test user_data deserialization, re #1085
    
    ---
     spacy/tests/doc/test_pickle_doc.py | 17 +++++++++++++++++
     1 file changed, 17 insertions(+)
    
    diff --git a/spacy/tests/doc/test_pickle_doc.py b/spacy/tests/doc/test_pickle_doc.py
    index 9bfa442d9..2571f30ac 100644
    --- a/spacy/tests/doc/test_pickle_doc.py
    +++ b/spacy/tests/doc/test_pickle_doc.py
    @@ -24,3 +24,20 @@ def test_list_of_docs_pickles_efficiently():
         assert many_unpickled[0].text == '0'
         assert many_unpickled[-1].text == '99'
         assert len(many_unpickled) == 100
    +
    +
    +def test_user_data_from_disk():
    +    nlp = Language()
    +    doc = nlp(u'Hello')
    +    doc.user_data[(0, 1)] = False
    +    b = doc.to_bytes()
    +    doc2 = doc.__class__(doc.vocab).from_bytes(b)
    +    assert doc2.user_data[(0, 1)] == False
    +
    +def test_user_data_unpickles():
    +    nlp = Language()
    +    doc = nlp(u'Hello')
    +    doc.user_data[(0, 1)] = False
    +    b = pickle.dumps(doc)
    +    doc2 = pickle.loads(b)
    +    assert doc2.user_data[(0, 1)] == False
    
    From cdb0c426d8961ee381a0bca14d6d869cd1d10d91 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 19:29:20 +0200
    Subject: [PATCH 406/649] Improve deserialization of user_data, esp. for
     Underscore
    
    ---
     spacy/tokens/doc.pyx | 28 ++++++++++++++++++++++++----
     1 file changed, 24 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 158cb9220..7c67df9c3 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -9,6 +9,7 @@ import numpy
     import numpy.linalg
     import struct
     import dill
    +import msgpack
     
     from libc.string cimport memcpy, memset
     from libc.math cimport sqrt
    @@ -687,14 +688,22 @@ cdef class Doc:
                 all annotations.
             """
             array_head = [LENGTH,SPACY,TAG,LEMMA,HEAD,DEP,ENT_IOB,ENT_TYPE]
    +        # Msgpack doesn't distinguish between lists and tuples, which is
    +        # vexing for user data. As a best guess, we *know* that within
    +        # keys, we must have tuples. In values we just have to hope
    +        # users don't mind getting a list instead of a tuple.
             serializers = {
                 'text': lambda: self.text,
                 'array_head': lambda: array_head,
                 'array_body': lambda: self.to_array(array_head),
                 'sentiment': lambda: self.sentiment,
                 'tensor': lambda: self.tensor,
    -            'user_data': lambda: self.user_data
             }
    +        if 'user_data' not in exclude and self.user_data:
    +            user_data_keys, user_data_values = list(zip(*self.user_data.items()))
    +            serializers['user_data_keys'] = lambda: msgpack.dumps(user_data_keys)
    +            serializers['user_data_values'] = lambda: msgpack.dumps(user_data_values)
    +
             return util.to_bytes(serializers, exclude)
     
         def from_bytes(self, bytes_data, **exclude):
    @@ -711,10 +720,20 @@ cdef class Doc:
                 'array_body': lambda b: None,
                 'sentiment': lambda b: None,
                 'tensor': lambda b: None,
    -            'user_data': lambda user_data: self.user_data.update(user_data)
    +            'user_data_keys': lambda b: None,
    +            'user_data_values': lambda b: None,
             }
     
             msg = util.from_bytes(bytes_data, deserializers, exclude)
    +        # Msgpack doesn't distinguish between lists and tuples, which is
    +        # vexing for user data. As a best guess, we *know* that within
    +        # keys, we must have tuples. In values we just have to hope
    +        # users don't mind getting a list instead of a tuple.
    +        if 'user_data' not in exclude and 'user_data_keys' in msg:
    +            user_data_keys = msgpack.loads(msg['user_data_keys'], use_list=False)
    +            user_data_values = msgpack.loads(msg['user_data_values'])
    +            for key, value in zip(user_data_keys, user_data_values):
    +                self.user_data[key] = value
     
             cdef attr_t[:, :] attrs
             cdef int i, start, end, has_space
    @@ -919,12 +938,13 @@ cdef int set_children_from_heads(TokenC* tokens, int length) except -1:
     
     
     def pickle_doc(doc):
    -    bytes_data = doc.to_bytes(vocab=False)
    +    bytes_data = doc.to_bytes(vocab=False, user_data=False)
         return (unpickle_doc, (doc.vocab, doc.user_data, bytes_data))
     
     
     def unpickle_doc(vocab, user_data, bytes_data):
    -    doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data)
    +    doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data,
    +                                                     exclude='user_data')
         return doc
     
     
    
    From fe844148f6490cd281ff5feb530fdd8941fa1091 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 19:43:52 +0200
    Subject: [PATCH 407/649] Test pickling hooks
    
    ---
     spacy/tests/doc/test_pickle_doc.py | 11 +++++++++++
     1 file changed, 11 insertions(+)
    
    diff --git a/spacy/tests/doc/test_pickle_doc.py b/spacy/tests/doc/test_pickle_doc.py
    index 2571f30ac..93f06f2c3 100644
    --- a/spacy/tests/doc/test_pickle_doc.py
    +++ b/spacy/tests/doc/test_pickle_doc.py
    @@ -41,3 +41,14 @@ def test_user_data_unpickles():
         b = pickle.dumps(doc)
         doc2 = pickle.loads(b)
         assert doc2.user_data[(0, 1)] == False
    +
    +
    +def test_hooks_unpickle():
    +    def inner_func(d1, d2):
    +        return 'hello!'
    +    nlp = Language()
    +    doc = nlp(u'Hello')
    +    doc.user_hooks['similarity'] = inner_func
    +    b = pickle.dumps(doc)
    +    doc2 = pickle.loads(b)
    +    assert doc2.similarity(None) == 'hello!'
    
    From 394633efce18246af0ddc1839239536a47d71f92 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 19:44:09 +0200
    Subject: [PATCH 408/649] Make doc pickling support hooks
    
    ---
     spacy/tokens/doc.pyx | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 7c67df9c3..809f178f8 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -939,12 +939,19 @@ cdef int set_children_from_heads(TokenC* tokens, int length) except -1:
     
     def pickle_doc(doc):
         bytes_data = doc.to_bytes(vocab=False, user_data=False)
    -    return (unpickle_doc, (doc.vocab, doc.user_data, bytes_data))
    +    hooks_and_data = (doc.user_data, doc.user_hooks, doc.user_span_hooks,
    +                      doc.user_token_hooks)
    +    return (unpickle_doc, (doc.vocab, dill.dumps(hooks_and_data), bytes_data))
     
     
    -def unpickle_doc(vocab, user_data, bytes_data):
    +def unpickle_doc(vocab, hooks_and_data, bytes_data):
    +    user_data, doc_hooks, span_hooks, token_hooks = dill.loads(hooks_and_data)
    + 
         doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data,
                                                          exclude='user_data')
    +    doc.user_hooks.update(doc_hooks)
    +    doc.user_span_hooks.update(span_hooks)
    +    doc.user_token_hooks.update(token_hooks)
         return doc
     
     
    
    From 633a75c7e06fb9b61091412c6cf7add92eadc368 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 18 Oct 2017 21:45:01 +0200
    Subject: [PATCH 409/649] Break parser batches into sub-batches, sorted by
     length.
    
    ---
     spacy/syntax/nn_parser.pyx | 91 +++++++++++++++++++-------------------
     1 file changed, 45 insertions(+), 46 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 1f4918935..f8e1baf35 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -9,6 +9,7 @@ from collections import Counter, OrderedDict
     import ujson
     import json
     import contextlib
    +import numpy
     
     from libc.math cimport exp
     cimport cython
    @@ -27,7 +28,7 @@ from libc.string cimport memset, memcpy
     from libc.stdlib cimport malloc, calloc, free
     from thinc.typedefs cimport weight_t, class_t, feat_t, atom_t, hash_t
     from thinc.linear.avgtron cimport AveragedPerceptron
    -from thinc.linalg cimport VecVec
    +from thinc.linalg cimport Vec, VecVec
     from thinc.structs cimport SparseArrayC, FeatureC, ExampleC
     from thinc.extra.eg cimport Example
     from thinc.extra.search cimport Beam
    @@ -288,6 +289,8 @@ cdef class Parser:
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    +                print(upper._layers)
    +                print(upper._layers[0]._layers)
     
             # TODO: This is an unfortunate hack atm!
             # Used to set input dimensions in network.
    @@ -391,19 +394,22 @@ cdef class Parser:
                 beam_density = self.cfg.get('beam_density', 0.0)
             cdef Doc doc
             cdef Beam beam
    -        for docs in cytoolz.partition_all(batch_size, docs):
    -            docs = list(docs)
    -            if beam_width == 1:
    -                parse_states = self.parse_batch(docs)
    -                beams = []
    -            else:
    -                beams = self.beam_parse(docs,
    -                            beam_width=beam_width, beam_density=beam_density)
    -                parse_states = []
    -                for beam in beams:
    -                    parse_states.append(beam.at(0))
    -            self.set_annotations(docs, parse_states)
    -            yield from docs
    +        for batch in cytoolz.partition_all(batch_size, docs):
    +            batch = list(batch)
    +            by_length = sorted(list(batch), key=lambda doc: len(doc))
    +            for subbatch in cytoolz.partition_all(32, by_length):
    +                subbatch = list(subbatch)
    +                if beam_width == 1:
    +                    parse_states = self.parse_batch(subbatch)
    +                    beams = []
    +                else:
    +                    beams = self.beam_parse(subbatch,
    +                                beam_width=beam_width, beam_density=beam_density)
    +                    parse_states = []
    +                    for beam in beams:
    +                        parse_states.append(beam.at(0))
    +                self.set_annotations(subbatch, parse_states)
    +            yield from batch
     
         def parse_batch(self, docs):
             cdef:
    @@ -437,38 +443,22 @@ cdef class Parser:
             cdef np.ndarray token_ids = numpy.zeros((nr_state, nr_feat), dtype='i')
             cdef np.ndarray is_valid = numpy.zeros((nr_state, nr_class), dtype='i')
             cdef np.ndarray scores
    +        cdef np.ndarray hidden_weights = numpy.ascontiguousarray(vec2scores._layers[-1].W.T)
    +        cdef np.ndarray hidden_bias = vec2scores._layers[-1].b
    +
    +        hW = hidden_weights.data
    +        hb = hidden_bias.data
    +        cdef int nr_hidden = hidden_weights.shape[0]
             c_token_ids = token_ids.data
             c_is_valid = is_valid.data
             cdef int has_hidden = not getattr(vec2scores, 'is_noop', False)
             cdef int nr_step
             while not next_step.empty():
                 nr_step = next_step.size()
    -            if not has_hidden:
    -                for i in cython.parallel.prange(nr_step, num_threads=6,
    -                                                nogil=True):
    -                    self._parse_step(next_step[i],
    -                        feat_weights, nr_class, nr_feat, nr_piece)
    -            else:
    -                hists = []
    -                for i in range(nr_step):
    -                    st = next_step[i]
    -                    st.set_context_tokens(&c_token_ids[i*nr_feat], nr_feat)
    -                    self.moves.set_valid(&c_is_valid[i*nr_class], st)
    -                    hists.append([st.get_hist(j+1) for j in range(8)])
    -                hists = numpy.asarray(hists)
    -                vectors = state2vec(token_ids[:next_step.size()])
    -                if self.cfg.get('hist_size'):
    -                    scores = vec2scores((vectors, hists))
    -                else:
    -                    scores = vec2scores(vectors)
    -                c_scores = scores.data
    -                for i in range(nr_step):
    -                    st = next_step[i]
    -                    guess = arg_max_if_valid(
    -                        &c_scores[i*nr_class], &c_is_valid[i*nr_class], nr_class)
    -                    action = self.moves.c[guess]
    -                    action.do(st, action.label)
    -                    st.push_hist(guess)
    +            for i in cython.parallel.prange(nr_step, num_threads=3,
    +                                            nogil=True):
    +                self._parse_step(next_step[i],
    +                    feat_weights, hW, hb, nr_class, nr_hidden, nr_feat, nr_piece)
                 this_step, next_step = next_step, this_step
                 next_step.clear()
                 for st in this_step:
    @@ -528,24 +518,33 @@ cdef class Parser:
             return beams
     
         cdef void _parse_step(self, StateC* state,
    -            const float* feat_weights,
    -            int nr_class, int nr_feat, int nr_piece) nogil:
    +            const float* feat_weights, const float* hW, const float* hb,
    +            int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil:
             '''This only works with no hidden layers -- fast but inaccurate'''
             token_ids = calloc(nr_feat, sizeof(int))
    -        scores = calloc(nr_class * nr_piece, sizeof(float))
    +        vector = calloc(nr_hidden * nr_piece, sizeof(float))
    +        scores = calloc(nr_class, sizeof(float))
             is_valid = calloc(nr_class, sizeof(int))
     
             state.set_context_tokens(token_ids, nr_feat)
    -        sum_state_features(scores,
    -            feat_weights, token_ids, 1, nr_feat, nr_class * nr_piece)
    +        sum_state_features(vector,
    +            feat_weights, token_ids, 1, nr_feat, nr_hidden * nr_piece)
    +        for i in range(nr_hidden):
    +            feature = Vec.max(&vector[i*nr_piece], nr_piece)
    +            for j in range(nr_class):
    +                scores[j] += feature * hW[j]
    +            hW += nr_class
    +        for i in range(nr_class):
    +            scores[i] += hb[i]
             self.moves.set_valid(is_valid, state)
    -        guess = arg_maxout_if_valid(scores, is_valid, nr_class, nr_piece)
    +        guess = arg_max_if_valid(scores, is_valid, nr_class)
             action = self.moves.c[guess]
             action.do(state, action.label)
             state.push_hist(guess)
     
             free(is_valid)
             free(scores)
    +        free(vector)
             free(token_ids)
     
         def update(self, docs, golds, drop=0., sgd=None, losses=None):
    
    From 65bf5e85bdab144a034864450628fff969b51c05 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 18 Oct 2017 21:46:12 +0200
    Subject: [PATCH 410/649] Improve piping in language.pipe
    
    ---
     spacy/language.py | 7 +++----
     1 file changed, 3 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index abfc1a064..c706e532a 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -10,6 +10,7 @@ from collections import OrderedDict
     import itertools
     import weakref
     import functools
    +import tqdm
     
     from .tokenizer import Tokenizer
     from .vocab import Vocab
    @@ -447,11 +448,9 @@ class Language(object):
             golds = list(golds)
             for name, pipe in self.pipeline:
                 if not hasattr(pipe, 'pipe'):
    -                for doc in docs:
    -                    pipe(doc)
    +                docs = (pipe(doc) for doc in docs)
                 else:
    -                docs = list(pipe.pipe(docs))
    -        assert len(docs) == len(golds)
    +                docs = pipe.pipe(docs, batch_size=256)
             for doc, gold in zip(docs, golds):
                 if verbose:
                     print(doc)
    
    From 79fcf8576aa077749c91315d102c0d70d888ca60 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 18 Oct 2017 21:46:34 +0200
    Subject: [PATCH 411/649] Compile with march=native
    
    ---
     setup.py | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/setup.py b/setup.py
    index 23b4f9581..2e2b816b7 100755
    --- a/setup.py
    +++ b/setup.py
    @@ -53,7 +53,8 @@ MOD_NAMES = [
     COMPILE_OPTIONS =  {
         'msvc': ['/Ox', '/EHsc'],
         'mingw32' : ['-O3', '-Wno-strict-prototypes', '-Wno-unused-function'],
    -    'other' : ['-O3', '-Wno-strict-prototypes', '-Wno-unused-function']
    +    'other' : ['-O3', '-Wno-strict-prototypes', '-Wno-unused-function',
    +               '-march=native']
     }
     
     
    
    From f018f2030ccbc1871732020ff42cb2ebb2277a84 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 18 Oct 2017 21:48:00 +0200
    Subject: [PATCH 412/649] Try optimized parser forward loop
    
    ---
     spacy/syntax/nn_parser.pxd         | 4 ++--
     spacy/syntax/nn_parser.pyx         | 2 --
     spacy/syntax/transition_system.pyx | 3 ++-
     3 files changed, 4 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd
    index b0b7693b7..fd1d4c9be 100644
    --- a/spacy/syntax/nn_parser.pxd
    +++ b/spacy/syntax/nn_parser.pxd
    @@ -16,7 +16,7 @@ cdef class Parser:
         cdef public object _multitasks
     
         cdef void _parse_step(self, StateC* state,
    -            const float* feat_weights,
    -            int nr_class, int nr_feat, int nr_piece) nogil
    +            const float* feat_weights, const float* hW, const float* hb,
    +            int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil
     
         #cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f8e1baf35..4846f326e 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -289,8 +289,6 @@ cdef class Parser:
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    -                print(upper._layers)
    -                print(upper._layers[0]._layers)
     
             # TODO: This is an unfortunate hack atm!
             # Used to set input dimensions in network.
    diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx
    index 055129c8b..922fdf97c 100644
    --- a/spacy/syntax/transition_system.pyx
    +++ b/spacy/syntax/transition_system.pyx
    @@ -148,7 +148,8 @@ cdef class TransitionSystem:
     
         def add_action(self, int action, label_name):
             cdef attr_t label_id
    -        if not isinstance(label_name, (int, long)):
    +        if not isinstance(label_name, int) and \
    +        not isinstance(label_name, long):
                 label_id = self.strings.add(label_name)
             else:
                 label_id = label_name
    
    From bbfd7d8d5de70249a949161b7cfee5f21274965d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 00:25:21 +0200
    Subject: [PATCH 413/649] Clean up parser multi-threading
    
    ---
     spacy/syntax/nn_parser.pxd |   4 +-
     spacy/syntax/nn_parser.pyx | 111 +++++++++++++++++--------------------
     2 files changed, 53 insertions(+), 62 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd
    index fd1d4c9be..1d389609b 100644
    --- a/spacy/syntax/nn_parser.pxd
    +++ b/spacy/syntax/nn_parser.pxd
    @@ -15,8 +15,6 @@ cdef class Parser:
         cdef readonly object cfg
         cdef public object _multitasks
     
    -    cdef void _parse_step(self, StateC* state,
    +    cdef void _parseC(self, StateC* state, 
                 const float* feat_weights, const float* hW, const float* hb,
                 int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil
    -
    -    #cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 4846f326e..fbd950292 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -395,7 +395,7 @@ cdef class Parser:
             for batch in cytoolz.partition_all(batch_size, docs):
                 batch = list(batch)
                 by_length = sorted(list(batch), key=lambda doc: len(doc))
    -            for subbatch in cytoolz.partition_all(32, by_length):
    +            for subbatch in cytoolz.partition_all(8, by_length):
                     subbatch = list(subbatch)
                     if beam_width == 1:
                         parse_states = self.parse_batch(subbatch)
    @@ -412,57 +412,80 @@ cdef class Parser:
         def parse_batch(self, docs):
             cdef:
                 precompute_hiddens state2vec
    -            StateClass state
    +            StateClass stcls
                 Pool mem
                 const float* feat_weights
                 StateC* st
    -            vector[StateC*] next_step, this_step
    -            int nr_class, nr_feat, nr_piece, nr_dim, nr_state
    +            vector[StateC*] states
    +            int guess, nr_class, nr_feat, nr_piece, nr_dim, nr_state, nr_step
    +            int j
             if isinstance(docs, Doc):
                 docs = [docs]
     
             cuda_stream = get_cuda_stream()
             (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream,
                                                                                 0.0)
    -
             nr_state = len(docs)
             nr_class = self.moves.n_moves
             nr_dim = tokvecs.shape[1]
             nr_feat = self.nr_feature
             nr_piece = state2vec.nP
     
    -        states = self.moves.init_batch(docs)
    -        for state in states:
    -            if not state.c.is_final():
    -                next_step.push_back(state.c)
    -
    +        state_objs = self.moves.init_batch(docs)
    +        for stcls in state_objs:
    +            if not stcls.c.is_final():
    +                states.push_back(stcls.c)
    +                
             feat_weights = state2vec.get_feat_weights()
             cdef int i
    -        cdef np.ndarray token_ids = numpy.zeros((nr_state, nr_feat), dtype='i')
    -        cdef np.ndarray is_valid = numpy.zeros((nr_state, nr_class), dtype='i')
    -        cdef np.ndarray scores
             cdef np.ndarray hidden_weights = numpy.ascontiguousarray(vec2scores._layers[-1].W.T)
             cdef np.ndarray hidden_bias = vec2scores._layers[-1].b
     
             hW = hidden_weights.data
             hb = hidden_bias.data
             cdef int nr_hidden = hidden_weights.shape[0]
    -        c_token_ids = token_ids.data
    -        c_is_valid = is_valid.data
    -        cdef int has_hidden = not getattr(vec2scores, 'is_noop', False)
    -        cdef int nr_step
    -        while not next_step.empty():
    -            nr_step = next_step.size()
    -            for i in cython.parallel.prange(nr_step, num_threads=3,
    -                                            nogil=True):
    -                self._parse_step(next_step[i],
    -                    feat_weights, hW, hb, nr_class, nr_hidden, nr_feat, nr_piece)
    -            this_step, next_step = next_step, this_step
    -            next_step.clear()
    -            for st in this_step:
    -                if not st.is_final():
    -                    next_step.push_back(st)
    -        return states
    +       
    +        with nogil:
    +            for i in cython.parallel.prange(states.size(), num_threads=2,
    +                                            schedule='guided'):
    +                self._parseC(states[i],
    +                    feat_weights, hW, hb,
    +                    nr_class, nr_hidden, nr_feat, nr_piece)
    +        return state_objs
    +
    +    cdef void _parseC(self, StateC* state, 
    +            const float* feat_weights, const float* hW, const float* hb,
    +            int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil:
    +        token_ids = calloc(nr_feat, sizeof(int))
    +        is_valid = calloc(nr_class, sizeof(int))
    +        vectors = calloc(nr_hidden * nr_piece, sizeof(float))
    +        scores = calloc(nr_class, sizeof(float))
    +        
    +        while not state.is_final():
    +            state.set_context_tokens(token_ids, nr_feat)
    +            memset(vectors, 0, nr_hidden * nr_piece * sizeof(float))
    +            memset(scores, 0, nr_class * sizeof(float))
    +            sum_state_features(vectors,
    +                feat_weights, token_ids, 1, nr_feat, nr_hidden * nr_piece)
    +            V = vectors
    +            W = hW
    +            for i in range(nr_hidden):
    +                feature = V[0] if V[0] >= V[1] else V[1]
    +                for j in range(nr_class):
    +                    scores[j] += feature * W[j]
    +                W += nr_class
    +                V += nr_piece
    +            for i in range(nr_class):
    +                scores[i] += hb[i]
    +            self.moves.set_valid(is_valid, state)
    +            guess = arg_max_if_valid(scores, is_valid, nr_class)
    +            action = self.moves.c[guess]
    +            action.do(state, action.label)
    +            state.push_hist(guess)
    +        free(token_ids)
    +        free(is_valid)
    +        free(vectors)
    +        free(scores)
     
         def beam_parse(self, docs, int beam_width=3, float beam_density=0.001):
             cdef Beam beam
    @@ -515,36 +538,6 @@ cdef class Parser:
                 beams.append(beam)
             return beams
     
    -    cdef void _parse_step(self, StateC* state,
    -            const float* feat_weights, const float* hW, const float* hb,
    -            int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil:
    -        '''This only works with no hidden layers -- fast but inaccurate'''
    -        token_ids = calloc(nr_feat, sizeof(int))
    -        vector = calloc(nr_hidden * nr_piece, sizeof(float))
    -        scores = calloc(nr_class, sizeof(float))
    -        is_valid = calloc(nr_class, sizeof(int))
    -
    -        state.set_context_tokens(token_ids, nr_feat)
    -        sum_state_features(vector,
    -            feat_weights, token_ids, 1, nr_feat, nr_hidden * nr_piece)
    -        for i in range(nr_hidden):
    -            feature = Vec.max(&vector[i*nr_piece], nr_piece)
    -            for j in range(nr_class):
    -                scores[j] += feature * hW[j]
    -            hW += nr_class
    -        for i in range(nr_class):
    -            scores[i] += hb[i]
    -        self.moves.set_valid(is_valid, state)
    -        guess = arg_max_if_valid(scores, is_valid, nr_class)
    -        action = self.moves.c[guess]
    -        action.do(state, action.label)
    -        state.push_hist(guess)
    -
    -        free(is_valid)
    -        free(scores)
    -        free(vector)
    -        free(token_ids)
    -
         def update(self, docs, golds, drop=0., sgd=None, losses=None):
             if not any(self.moves.has_gold(gold) for gold in golds):
                 return None
    
    From 960788aaa2681ba5c33ceac257f46d7a6389f949 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 00:42:34 +0200
    Subject: [PATCH 414/649] Eliminate dead code in parser, and raise errors for
     obsolete options
    
    ---
     spacy/syntax/nn_parser.pyx | 79 ++++++++------------------------------
     1 file changed, 16 insertions(+), 63 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index fbd950292..f5c0454bc 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -241,54 +241,32 @@ cdef class Parser:
         @classmethod
         def Model(cls, nr_class, **cfg):
             depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
    +        if depth != 1:
    +            raise ValueError("Currently parser depth is hard-coded to 1.")
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2))
    +        if parser_maxout_pieces != 2:
    +            raise ValueError("Currently parser_maxout_pieces is hard-coded to 2")
             token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
             hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200))
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
             hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
             hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
    -        if hist_size >= 1 and depth == 0:
    -            raise ValueError("Inconsistent hyper-params: "
    -                "history_feats >= 1 but parser_hidden_depth==0")
    +        if hist_size != 0:
    +            raise ValueError("Currently history size is hard-coded to 0")
    +        if hist_width != 0: 
    +            raise ValueError("Currently history width is hard-coded to 0")
             tok2vec = Tok2Vec(token_vector_width, embed_size,
                               pretrained_dims=cfg.get('pretrained_dims', 0))
             tok2vec = chain(tok2vec, flatten)
    -        if parser_maxout_pieces == 1:
    -            lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class,
    -                        nF=cls.nr_feature,
    -                        nI=token_vector_width)
    -        else:
    -            lower = PrecomputableMaxouts(hidden_width if depth >= 1 else nr_class,
    -                        nF=cls.nr_feature,
    -                        nP=parser_maxout_pieces,
    -                        nI=token_vector_width)
    +        lower = PrecomputableMaxouts(hidden_width if depth >= 1 else nr_class,
    +                    nF=cls.nr_feature, nP=parser_maxout_pieces,
    +                    nI=token_vector_width)
     
             with Model.use_device('cpu'):
    -            if depth == 0:
    -                upper = chain()
    -                upper.is_noop = True
    -            elif hist_size and depth == 1:
    -                upper = chain(
    -                    HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    -                                    nr_dim=hist_width),
    -                    zero_init(Affine(nr_class, hidden_width+hist_size*hist_width,
    -                                     drop_factor=0.0)))
    -                upper.is_noop = False
    -            elif hist_size:
    -                upper = chain(
    -                    HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    -                                    nr_dim=hist_width),
    -                    LayerNorm(Maxout(hidden_width, hidden_width+hist_size*hist_width)),
    -                    clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-2),
    -                    zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
    -                )
    -                upper.is_noop = False
    -            else:
    -                upper = chain(
    -                    clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-1),
    -                    zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
    -                )
    -                upper.is_noop = False
    +            upper = chain(
    +                clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-1),
    +                zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
    +            )
     
             # TODO: This is an unfortunate hack atm!
             # Used to set input dimensions in network.
    @@ -959,31 +937,6 @@ cdef int arg_max_if_valid(const weight_t* scores, const int* is_valid, int n) no
         return best
     
     
    -cdef int arg_maxout_if_valid(const weight_t* scores, const int* is_valid,
    -                             int n, int nP) nogil:
    -    cdef int best = -1
    -    cdef float best_score = 0
    -    for i in range(n):
    -        if is_valid[i] >= 1:
    -            for j in range(nP):
    -                if best == -1 or scores[i*nP+j] > best_score:
    -                    best = i
    -                    best_score = scores[i*nP+j]
    -    return best
    -
    -
    -cdef int _arg_max_clas(const weight_t* scores, int move, const Transition* actions,
    -                       int nr_class) except -1:
    -    cdef weight_t score = 0
    -    cdef int mode = -1
    -    cdef int i
    -    for i in range(nr_class):
    -        if actions[i].move == move and (mode == -1 or scores[i] >= score):
    -            mode = i
    -            score = scores[i]
    -    return mode
    -
    -
     # These are passed as callbacks to thinc.search.Beam
     cdef int _transition_state(void* _dest, void* _src, class_t clas, void* _moves) except -1:
         dest = _dest
    
    From d4cfff0476bbef90acfba037d805a1b21449f5d7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 00:47:24 +0200
    Subject: [PATCH 415/649] Comment out currently hard-coded hyper-params
    
    ---
     website/api/_top-level/_cli.jade | 32 ++++++++++++++++----------------
     1 file changed, 16 insertions(+), 16 deletions(-)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index b2a9c574d..fc573e0ec 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -315,30 +315,30 @@ p
             +cell Number of rows in embedding tables.
             +cell #[code 7500]
     
    -    +row
    -        +cell #[code parser_maxout_pieces]
    -        +cell Number of pieces in the parser's and NER's first maxout layer.
    -        +cell #[code 2]
    +    //- +row
    +    //-     +cell #[code parser_maxout_pieces]
    +    //-     +cell Number of pieces in the parser's and NER's first maxout layer.
    +    //-     +cell #[code 2]
     
    -    +row
    -        +cell #[code parser_hidden_depth]
    -        +cell Number of hidden layers in the parser and NER.
    -        +cell #[code 1]
    +    //- +row
    +    //-     +cell #[code parser_hidden_depth]
    +    //-     +cell Number of hidden layers in the parser and NER.
    +    //-     +cell #[code 1]
     
         +row
             +cell #[code hidden_width]
             +cell Size of the parser's and NER's hidden layers.
             +cell #[code 128]
     
    -    +row
    -        +cell #[code history_feats]
    -        +cell Number of previous action ID features for parser and NER.
    -        +cell #[code 128]
    +    //- +row
    +    //-     +cell #[code history_feats]
    +    //-     +cell Number of previous action ID features for parser and NER.
    +    //-     +cell #[code 128]
     
    -    +row
    -        +cell #[code history_width]
    -        +cell Number of embedding dimensions for each action ID.
    -        +cell #[code 128]
    +    //- +row
    +    //-     +cell #[code history_width]
    +    //-     +cell Number of embedding dimensions for each action ID.
    +    //-     +cell #[code 128]
     
         +row
             +cell #[code learn_rate]
    
    From bf415fd7782c430135033ce40705d7d392743730 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 19 Oct 2017 00:53:08 +0200
    Subject: [PATCH 416/649] Add test for serializing extension attrs (see #1085)
    
    ---
     .../test_serialize_extension_attrs.py         | 27 +++++++++++++++++++
     1 file changed, 27 insertions(+)
     create mode 100644 spacy/tests/serialize/test_serialize_extension_attrs.py
    
    diff --git a/spacy/tests/serialize/test_serialize_extension_attrs.py b/spacy/tests/serialize/test_serialize_extension_attrs.py
    new file mode 100644
    index 000000000..8919ebe1e
    --- /dev/null
    +++ b/spacy/tests/serialize/test_serialize_extension_attrs.py
    @@ -0,0 +1,27 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +import pytest
    +
    +from ...tokens.doc import Doc
    +from ...vocab import Vocab
    +
    +
    +@pytest.fixture
    +def doc_w_attrs(en_tokenizer):
    +    Doc.set_extension('_test_attr', default=False)
    +    Doc.set_extension('_test_prop', getter=lambda doc: len(doc.text))
    +    Doc.set_extension('_test_method', method=lambda doc, arg: "{}{}".format(len(doc.text), arg))
    +    doc = en_tokenizer("This is a test.")
    +    doc._._test_attr = 'test'
    +    return doc
    +
    +
    +
    +def test_serialize_ext_attrs_from_bytes(doc_w_attrs):
    +    doc_b = doc_w_attrs.to_bytes()
    +    doc = Doc(Vocab()).from_bytes(doc_b)
    +    assert doc._.has('_test_attr')
    +    assert doc._._test_attr == 'test'
    +    assert doc._._test_prop == len(doc.text)
    +    assert doc._._test_method('test') == '{}{}'.format(len(doc.text), 'test')
    
    From 24512420b1e0be23480dd4c71208d9e925907267 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 19 Oct 2017 00:53:49 +0200
    Subject: [PATCH 417/649] Show error if data_path does not exist or is None
     (see #1102)
    
    ---
     spacy/cli/link.py | 7 +++++++
     1 file changed, 7 insertions(+)
    
    diff --git a/spacy/cli/link.py b/spacy/cli/link.py
    index 712a05aee..5b333dae5 100644
    --- a/spacy/cli/link.py
    +++ b/spacy/cli/link.py
    @@ -27,6 +27,13 @@ def link(cmd, origin, link_name, force=False, model_path=None):
         if not model_path.exists():
             prints("The data should be located in %s" % path2str(model_path),
                    title="Can't locate model data", exits=1)
    +    data_path = util.get_data_path()
    +    if not data_path or not data_path.exists():
    +        spacy_loc = Path(__file__).parent.parent
    +        prints("Make sure a directory `/data` exists within your spaCy "
    +               "installation and try again. The data directory should be "
    +               "located here:", path2str(spacy_loc), exits=1,
    +               title="Can't find the spaCy data path to create model symlink")
         link_path = util.get_data_path() / link_name
         if link_path.exists() and not force:
             prints("To overwrite an existing link, use the --force flag.",
    
    From 906c50ac5997c33feb0ecb82d32faacf8b0b50e0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 01:48:39 +0200
    Subject: [PATCH 418/649] Fix loop typing, that caused error on windows
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f5c0454bc..f79837fae 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -422,9 +422,9 @@ cdef class Parser:
             hW = hidden_weights.data
             hb = hidden_bias.data
             cdef int nr_hidden = hidden_weights.shape[0]
    -       
    +        cdef int nr_task = states.size()
             with nogil:
    -            for i in cython.parallel.prange(states.size(), num_threads=2,
    +            for i in cython.parallel.prange(nr_task, num_threads=2,
                                                 schedule='guided'):
                     self._parseC(states[i],
                         feat_weights, hW, hb,
    
    From 15e5a04a8d9a1be29844332295eea85bedae12fc Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 01:48:43 +0200
    Subject: [PATCH 419/649] Clean up more depth=0 conditional code
    
    ---
     spacy/syntax/nn_parser.pyx | 21 ++++++---------------
     1 file changed, 6 insertions(+), 15 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f79837fae..cb26b8d37 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -38,7 +38,7 @@ from murmurhash.mrmr cimport hash64
     from preshed.maps cimport MapStruct
     from preshed.maps cimport map_get
     
    -from thinc.api import layerize, chain, noop, clone, with_flatten
    +from thinc.api import layerize, chain, clone, with_flatten
     from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU
     from thinc.misc import LayerNorm
     
    @@ -768,20 +768,11 @@ cdef class Parser:
             if self.model not in (True, False, None) and resized:
                 # Weights are stored in (nr_out, nr_in) format, so we're basically
                 # just adding rows here.
    -            if self.model[-1].is_noop:
    -                smaller = self.model[1]
    -                dims = dict(self.model[1]._dims)
    -                dims['nO'] = self.moves.n_moves
    -                larger = self.model[1].__class__(**dims)
    -                copy_array(larger.W[:, :smaller.nO], smaller.W)
    -                copy_array(larger.b[:smaller.nO], smaller.b)
    -                self.model = (self.model[0], larger, self.model[2])
    -            else:
    -                smaller = self.model[-1]._layers[-1]
    -                larger = Affine(self.moves.n_moves, smaller.nI)
    -                copy_array(larger.W[:smaller.nO], smaller.W)
    -                copy_array(larger.b[:smaller.nO], smaller.b)
    -                self.model[-1]._layers[-1] = larger
    +            smaller = self.model[-1]._layers[-1]
    +            larger = Affine(self.moves.n_moves, smaller.nI)
    +            copy_array(larger.W[:smaller.nO], smaller.W)
    +            copy_array(larger.b[:smaller.nO], smaller.b)
    +            self.model[-1]._layers[-1] = larger
     
         def begin_training(self, gold_tuples, pipeline=None, **cfg):
             if 'model' in cfg:
    
    From 7b9b1be44cae4d13c4e1f0881372701982b61a33 Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Thu, 19 Oct 2017 17:00:41 +0530
    Subject: [PATCH 420/649] Support single value for attribute list in
     doc.to_array
    
    ---
     .github/contributors/ramananbalakrishnan.md | 106 ++++++++++++++++++++
     spacy/tokens/doc.pyx                        |   6 ++
     2 files changed, 112 insertions(+)
     create mode 100644 .github/contributors/ramananbalakrishnan.md
    
    diff --git a/.github/contributors/ramananbalakrishnan.md b/.github/contributors/ramananbalakrishnan.md
    new file mode 100644
    index 000000000..804c41f56
    --- /dev/null
    +++ b/.github/contributors/ramananbalakrishnan.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect to my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Ramanan Balakrishnan |
    +| Company name (if applicable)   |                      |
    +| Title or role (if applicable)  |                      |
    +| Date                           | 2017-10-19           |
    +| GitHub username                | ramananbalakrishnan  |
    +| Website (optional)             |                      |
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 809f178f8..ad5358d9a 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -554,13 +554,19 @@ cdef class Doc:
             cdef int i, j
             cdef attr_id_t feature
             cdef np.ndarray[attr_t, ndim=2] output
    +        cdef np.ndarray[attr_t, ndim=1] output_1D
             # Make an array from the attributes --- otherwise our inner loop is Python
             # dict iteration.
    +        if( type(py_attr_ids) is not list and type(py_attr_ids) is not tuple ):
    +            py_attr_ids = [ py_attr_ids ]
             cdef np.ndarray[attr_t, ndim=1] attr_ids = numpy.asarray(py_attr_ids, dtype=numpy.uint64)
             output = numpy.ndarray(shape=(self.length, len(attr_ids)), dtype=numpy.uint64)
             for i in range(self.length):
                 for j, feature in enumerate(attr_ids):
                     output[i, j] = get_token_attr(&self.c[i], feature)
    +        if( len(attr_ids) == 1 ):
    +            output_1D = output.reshape((self.length))
    +            return output_1D
             return output
     
         def count_by(self, attr_id_t attr_id, exclude=None, PreshCounter counts=None):
    
    From 03a215c5fd577dc5c76ad9887938e1fc64264134 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 13:44:49 +0200
    Subject: [PATCH 421/649] Make PrecomputableAffines work
    
    ---
     spacy/_ml.py | 48 ++++++++++++++++++++++++++++++------------------
     1 file changed, 30 insertions(+), 18 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index b07e179f0..ad6ef6361 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -30,6 +30,8 @@ from . import util
     import numpy
     import io
     
    +from blis.py import einsum
    +
     # TODO: Unset this once we don't want to support models previous models.
     import thinc.neural._classes.layernorm
     thinc.neural._classes.layernorm.set_compat_six_eight(False)
    @@ -105,9 +107,7 @@ def _preprocess_doc(docs, drop=0.):
     def _init_for_precomputed(W, ops):
         if (W**2).sum() != 0.:
             return
    -    reshaped = W.reshape((W.shape[1], W.shape[0] * W.shape[2]))
    -    ops.xavier_uniform_init(reshaped)
    -    W[:] = reshaped.reshape(W.shape)
    +    ops.xavier_uniform_init(W, inplace=True)
     
     
     @describe.on_data(_set_dimensions_if_needed)
    @@ -116,7 +116,7 @@ def _init_for_precomputed(W, ops):
         nF=Dimension("Number of features"),
         nO=Dimension("Output size"),
         W=Synapses("Weights matrix",
    -        lambda obj: (obj.nF, obj.nO, obj.nI),
    +        lambda obj: (obj.nI, obj.nF * obj.nO),
             lambda W, ops: _init_for_precomputed(W, ops)),
         b=Biases("Bias vector",
             lambda obj: (obj.nO,)),
    @@ -130,31 +130,43 @@ class PrecomputableAffine(Model):
             self.nI = nI
             self.nF = nF
     
    +    @property
    +    def nIF(self):
    +        return self.nI * self.nF
    +
    +    @property
    +    def nFO(self):
    +        return self.nF * self.nO
    +
         def begin_update(self, X, drop=0.):
    +        nN = X.shape[0]
             # X: (b, i)
    -        # Yf: (b, f, i)
    +        # Xf: (b, f, i)
    +        # Yf: (b, f, o)
             # dY: (b, o)
             # dYf: (b, f, o)
    -        #Yf = numpy.einsum('bi,foi->bfo', X, self.W)
    -        Yf = self.ops.xp.tensordot(
    -                X, self.W, axes=[[1], [2]])
    -        Yf += self.b
    +        # W: (i, fo)
    +        # Yf = numpy.einsum('bi,i_fo->b_fo', X, self.W)
    +        Yf = einsum('ab,bc->ac', X, self.W).reshape((nN, self.nF, self.nO))
             def backward(dY_ids, sgd=None):
    -            tensordot = self.ops.xp.tensordot
                 dY, ids = dY_ids
    +            nB = ids.shape[0]
                 Xf = X[ids]
    +            Xf = Xf.reshape((nB, self.nIF))
     
    -            #dXf = numpy.einsum('bo,foi->bfi', dY, self.W)
    -            dXf = tensordot(dY, self.W, axes=[[1], [1]])
    -            #dW = numpy.einsum('bo,bfi->ofi', dY, Xf)
    -            dW = tensordot(dY, Xf, axes=[[0], [0]])
    -            # ofi -> foi
    -            self.d_W += dW.transpose((1, 0, 2))
    -            self.d_b += dY.sum(axis=0)
    +            dW_re = self.d_W.reshape((self.nIF, self.nO))
    +            W_re = self.d_W.reshape((self.nIF, self.nO))
    +            # bo,if_o->bif
    +            dXf = einsum('ab,cb->ac', dY, W_re)
    +            # b_if,bo->if_o
    +            einsum('ab,ac->bc', Xf, dY, out=dW_re)
    +            # self.d_b += dY.sum(axis=0)
     
                 if sgd is not None:
                     sgd(self._mem.weights, self._mem.gradient, key=self.id)
    -            return dXf
    +            dXf = dXf.reshape((nB, self.nI, self.nF))
    +            dXf = dXf.transpose((0, 2, 1))
    +            return self.ops.xp.ascontiguousarray(dXf)
             return Yf, backward
     
     
    
    From b54b4b8a974087577d3e1d22bdc90d3e64ef8bd7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 13:45:18 +0200
    Subject: [PATCH 422/649] Make parser_maxout_pieces hyper-param work
    
    ---
     spacy/syntax/nn_parser.pyx | 27 ++++++++++++++++++---------
     1 file changed, 18 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index cb26b8d37..361e61a99 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -153,7 +153,7 @@ cdef class precompute_hiddens:
                 if bp_nonlinearity is not None:
                     d_state_vector = bp_nonlinearity(d_state_vector, sgd)
                 # This will usually be on GPU
    -            if isinstance(d_state_vector, numpy.ndarray):
    +            if not isinstance(d_state_vector, self.ops.xp.ndarray):
                     d_state_vector = self.ops.xp.array(d_state_vector)
                 d_tokens = bp_hiddens((d_state_vector, token_ids), sgd)
                 return d_tokens
    @@ -244,8 +244,8 @@ cdef class Parser:
             if depth != 1:
                 raise ValueError("Currently parser depth is hard-coded to 1.")
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2))
    -        if parser_maxout_pieces != 2:
    -            raise ValueError("Currently parser_maxout_pieces is hard-coded to 2")
    +        #if parser_maxout_pieces != 2:
    +        #    raise ValueError("Currently parser_maxout_pieces is hard-coded to 2")
             token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
             hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
    @@ -258,9 +258,13 @@ cdef class Parser:
             tok2vec = Tok2Vec(token_vector_width, embed_size,
                               pretrained_dims=cfg.get('pretrained_dims', 0))
             tok2vec = chain(tok2vec, flatten)
    -        lower = PrecomputableMaxouts(hidden_width if depth >= 1 else nr_class,
    -                    nF=cls.nr_feature, nP=parser_maxout_pieces,
    -                    nI=token_vector_width)
    +        if parser_maxout_pieces >= 2:
    +            lower = PrecomputableMaxouts(hidden_width if depth >= 1 else nr_class,
    +                nF=cls.nr_feature, nP=parser_maxout_pieces,
    +                nI=token_vector_width)
    +        else:
    +            lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class,
    +                nF=cls.nr_feature, nI=token_vector_width)
     
             with Model.use_device('cpu'):
                 upper = chain(
    @@ -413,7 +417,7 @@ cdef class Parser:
             for stcls in state_objs:
                 if not stcls.c.is_final():
                     states.push_back(stcls.c)
    -                
    +
             feat_weights = state2vec.get_feat_weights()
             cdef int i
             cdef np.ndarray hidden_weights = numpy.ascontiguousarray(vec2scores._layers[-1].W.T)
    @@ -438,7 +442,7 @@ cdef class Parser:
             is_valid = calloc(nr_class, sizeof(int))
             vectors = calloc(nr_hidden * nr_piece, sizeof(float))
             scores = calloc(nr_class, sizeof(float))
    -        
    +
             while not state.is_final():
                 state.set_context_tokens(token_ids, nr_feat)
                 memset(vectors, 0, nr_hidden * nr_piece * sizeof(float))
    @@ -448,7 +452,12 @@ cdef class Parser:
                 V = vectors
                 W = hW
                 for i in range(nr_hidden):
    -                feature = V[0] if V[0] >= V[1] else V[1]
    +                if nr_piece == 1:
    +                    feature = V[0]
    +                elif nr_piece == 2:
    +                    feature = V[0] if V[0] >= V[1] else V[1]
    +                else:
    +                    feature = Vec.max(V, nr_piece)
                     for j in range(nr_class):
                         scores[j] += feature * W[j]
                     W += nr_class
    
    From b00d0a2c979ee81bc5f343d40b330445850219c2 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 18:42:11 +0200
    Subject: [PATCH 423/649] Fix bias in parser
    
    ---
     spacy/_ml.py               | 10 +++++-----
     spacy/syntax/nn_parser.pxd |  3 ++-
     spacy/syntax/nn_parser.pyx | 22 +++++++++++++++-------
     3 files changed, 22 insertions(+), 13 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index ad6ef6361..2b82f3d9b 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -148,6 +148,7 @@ class PrecomputableAffine(Model):
             # W: (i, fo)
             # Yf = numpy.einsum('bi,i_fo->b_fo', X, self.W)
             Yf = einsum('ab,bc->ac', X, self.W).reshape((nN, self.nF, self.nO))
    +        #Yf = self.ops.xp.dot(X, self.W).reshape((nN, self.nF, self.nO))
             def backward(dY_ids, sgd=None):
                 dY, ids = dY_ids
                 nB = ids.shape[0]
    @@ -155,12 +156,14 @@ class PrecomputableAffine(Model):
                 Xf = Xf.reshape((nB, self.nIF))
     
                 dW_re = self.d_W.reshape((self.nIF, self.nO))
    -            W_re = self.d_W.reshape((self.nIF, self.nO))
    +            W_re = self.W.reshape((self.nIF, self.nO))
                 # bo,if_o->bif
                 dXf = einsum('ab,cb->ac', dY, W_re)
    +            #dXf = self.ops.xp.dot(dY, W_re.T)
                 # b_if,bo->if_o
                 einsum('ab,ac->bc', Xf, dY, out=dW_re)
    -            # self.d_b += dY.sum(axis=0)
    +            #self.ops.xp.dot(Xf.T, dY, out=dW_re)
    +            self.d_b += dY.sum(axis=0)
     
                 if sgd is not None:
                     sgd(self._mem.weights, self._mem.gradient, key=self.id)
    @@ -208,7 +211,6 @@ class PrecomputableMaxouts(Model):
             ascontiguous = self.ops.xp.ascontiguousarray
     
             Yfp = tensordot(X, self.W, axes=[[1], [3]])
    -        Yfp += self.b
     
             def backward(dYp_ids, sgd=None):
                 dYp, ids = dYp_ids
    @@ -380,8 +382,6 @@ def reapply(layer, n_times):
         return wrap(reapply_fwd, layer)
     
     
    -
    -
     def asarray(ops, dtype):
         def forward(X, drop=0.):
             return ops.asarray(X, dtype=dtype), None
    diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd
    index 1d389609b..56615c6f1 100644
    --- a/spacy/syntax/nn_parser.pxd
    +++ b/spacy/syntax/nn_parser.pxd
    @@ -16,5 +16,6 @@ cdef class Parser:
         cdef public object _multitasks
     
         cdef void _parseC(self, StateC* state, 
    -            const float* feat_weights, const float* hW, const float* hb,
    +            const float* feat_weights, const float* bias,
    +            const float* hW, const float* hb,
                 int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 361e61a99..755c87369 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -101,6 +101,7 @@ cdef class precompute_hiddens:
         cdef public object ops
         cdef np.ndarray _features
         cdef np.ndarray _cached
    +    cdef np.ndarray bias
         cdef object _cuda_stream
         cdef object _bp_hiddens
     
    @@ -118,6 +119,7 @@ cdef class precompute_hiddens:
             self.nO = cached.shape[2]
             self.nP = getattr(lower_model, 'nP', 1)
             self.ops = lower_model.ops
    +        self.bias = lower_model.b
             self._is_synchronized = False
             self._cuda_stream = cuda_stream
             self._cached = cached
    @@ -147,6 +149,7 @@ cdef class precompute_hiddens:
             sum_state_features(state_vector.data,
                 feat_weights, &ids[0,0],
                 token_ids.shape[0], self.nF, self.nO*self.nP)
    +        state_vector += self.bias.ravel()
             state_vector, bp_nonlinearity = self._nonlinearity(state_vector)
     
             def backward(d_state_vector, sgd=None):
    @@ -161,14 +164,15 @@ cdef class precompute_hiddens:
     
         def _nonlinearity(self, state_vector):
             if self.nP == 1:
    -            return state_vector, None
    +            mask = state_vector >= 0.
    +            return state_vector * mask, lambda dY, sgd=None: dY * mask
             state_vector = state_vector.reshape(
                 (state_vector.shape[0], state_vector.shape[1]//self.nP, self.nP))
             best, which = self.ops.maxout(state_vector)
    -        def backprop(d_best, sgd=None):
    -            return self.ops.backprop_maxout(d_best, which, self.nP)
    -        return best, backprop
     
    +        def backprop_maxout(d_best, sgd=None):
    +            return self.ops.backprop_maxout(d_best, which, self.nP)
    +        return best, backprop_maxout
     
     
     cdef void sum_state_features(float* output,
    @@ -425,18 +429,20 @@ cdef class Parser:
     
             hW = hidden_weights.data
             hb = hidden_bias.data
    +        bias = state2vec.bias.data
             cdef int nr_hidden = hidden_weights.shape[0]
             cdef int nr_task = states.size()
             with nogil:
                 for i in cython.parallel.prange(nr_task, num_threads=2,
                                                 schedule='guided'):
                     self._parseC(states[i],
    -                    feat_weights, hW, hb,
    +                    feat_weights, bias, hW, hb,
                         nr_class, nr_hidden, nr_feat, nr_piece)
             return state_objs
     
         cdef void _parseC(self, StateC* state, 
    -            const float* feat_weights, const float* hW, const float* hb,
    +            const float* feat_weights, const float* bias,
    +            const float* hW, const float* hb,
                 int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil:
             token_ids = calloc(nr_feat, sizeof(int))
             is_valid = calloc(nr_class, sizeof(int))
    @@ -449,11 +455,13 @@ cdef class Parser:
                 memset(scores, 0, nr_class * sizeof(float))
                 sum_state_features(vectors,
                     feat_weights, token_ids, 1, nr_feat, nr_hidden * nr_piece)
    +            for i in range(nr_hidden * nr_piece):
    +                vectors[i] += bias[i]
                 V = vectors
                 W = hW
                 for i in range(nr_hidden):
                     if nr_piece == 1:
    -                    feature = V[0]
    +                    feature = V[0] if V[0] >= 0. else 0.
                     elif nr_piece == 2:
                         feature = V[0] if V[0] >= V[1] else V[1]
                     else:
    
    From a17a1b60c7718ef5958cae6ae1bf72df51fbfd02 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 20:26:37 +0200
    Subject: [PATCH 424/649] Clean up redundant PrecomputableMaxouts class
    
    ---
     spacy/_ml.py | 99 +++++++++++++---------------------------------------
     1 file changed, 24 insertions(+), 75 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 2b82f3d9b..1f504ec4a 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -30,8 +30,6 @@ from . import util
     import numpy
     import io
     
    -from blis.py import einsum
    -
     # TODO: Unset this once we don't want to support models previous models.
     import thinc.neural._classes.layernorm
     thinc.neural._classes.layernorm.set_compat_six_eight(False)
    @@ -107,7 +105,9 @@ def _preprocess_doc(docs, drop=0.):
     def _init_for_precomputed(W, ops):
         if (W**2).sum() != 0.:
             return
    +    W = W.reshape((W.shape[0] * W.shape[1], W.shape[2]))
         ops.xavier_uniform_init(W, inplace=True)
    +    return W
     
     
     @describe.on_data(_set_dimensions_if_needed)
    @@ -116,7 +116,7 @@ def _init_for_precomputed(W, ops):
         nF=Dimension("Number of features"),
         nO=Dimension("Output size"),
         W=Synapses("Weights matrix",
    -        lambda obj: (obj.nI, obj.nF * obj.nO),
    +        lambda obj: (obj.nI, obj.nF, obj.nO),
             lambda W, ops: _init_for_precomputed(W, ops)),
         b=Biases("Bias vector",
             lambda obj: (obj.nO,)),
    @@ -131,7 +131,7 @@ class PrecomputableAffine(Model):
             self.nF = nF
     
         @property
    -    def nIF(self):
    +    def nFI(self):
             return self.nI * self.nF
     
         @property
    @@ -145,87 +145,34 @@ class PrecomputableAffine(Model):
             # Yf: (b, f, o)
             # dY: (b, o)
             # dYf: (b, f, o)
    -        # W: (i, fo)
    -        # Yf = numpy.einsum('bi,i_fo->b_fo', X, self.W)
    -        Yf = einsum('ab,bc->ac', X, self.W).reshape((nN, self.nF, self.nO))
    -        #Yf = self.ops.xp.dot(X, self.W).reshape((nN, self.nF, self.nO))
    +        # W: (i, f, o)
    +        W = self.W.reshape((self.nI, self.nFO))
    +        Yf = self.ops.xp.dot(X, W)
    +        Yf = Yf.reshape((Yf.shape[0], self.nF, self.nO))
    +        #Yf = einsum('ab,bc->ac', X, W)
             def backward(dY_ids, sgd=None):
                 dY, ids = dY_ids
    -            nB = ids.shape[0]
                 Xf = X[ids]
    -            Xf = Xf.reshape((nB, self.nIF))
    -
    -            dW_re = self.d_W.reshape((self.nIF, self.nO))
    -            W_re = self.W.reshape((self.nIF, self.nO))
    -            # bo,if_o->bif
    -            dXf = einsum('ab,cb->ac', dY, W_re)
    -            #dXf = self.ops.xp.dot(dY, W_re.T)
    -            # b_if,bo->if_o
    -            einsum('ab,ac->bc', Xf, dY, out=dW_re)
    -            #self.ops.xp.dot(Xf.T, dY, out=dW_re)
    +            # bo,fi_o->b_if -> b_fi
    +            W_o_fi = self._transpose(self.W, shape=(self.nO, self.nFI))
    +            dXf = self.ops.xp.dot(dY, W_o_fi).reshape((Xf.shape[0], self.nF, self.nI))
    +            # bo,b_fi->o_fi
    +            dW = Xf.reshape((Xf.shape[0], self.nFI))
    +            dW = self.ops.xp.dot(Xf.T, dY)
    +            dW = dW.reshape((self.nO, self.nF, self.nI))
    +            self.d_W += dW.transpose((2, 1, 0))
                 self.d_b += dY.sum(axis=0)
     
                 if sgd is not None:
                     sgd(self._mem.weights, self._mem.gradient, key=self.id)
    -            dXf = dXf.reshape((nB, self.nI, self.nF))
    -            dXf = dXf.transpose((0, 2, 1))
    -            return self.ops.xp.ascontiguousarray(dXf)
    +            return dXf
             return Yf, backward
     
    +    def _transpose(self, weights, shape):
    +        weights = weights.transpose((2, 1, 0))
    +        weights = self.ops.xp.ascontiguousarray(weights)
    +        return weights.reshape(shape)
     
    -@describe.on_data(_set_dimensions_if_needed)
    -@describe.attributes(
    -    nI=Dimension("Input size"),
    -    nF=Dimension("Number of features"),
    -    nP=Dimension("Number of pieces"),
    -    nO=Dimension("Output size"),
    -    W=Synapses("Weights matrix",
    -        lambda obj: (obj.nF, obj.nO, obj.nP, obj.nI),
    -        lambda W, ops: ops.xavier_uniform_init(W)),
    -    b=Biases("Bias vector",
    -        lambda obj: (obj.nO, obj.nP)),
    -    d_W=Gradient("W"),
    -    d_b=Gradient("b")
    -)
    -class PrecomputableMaxouts(Model):
    -    def __init__(self, nO=None, nI=None, nF=None, nP=3, **kwargs):
    -        Model.__init__(self, **kwargs)
    -        self.nO = nO
    -        self.nP = nP
    -        self.nI = nI
    -        self.nF = nF
    -
    -    def begin_update(self, X, drop=0.):
    -        # X: (b, i)
    -        # Yfp: (b, f, o, p)
    -        # Xf: (f, b, i)
    -        # dYp: (b, o, p)
    -        # W: (f, o, p, i)
    -        # b: (o, p)
    -
    -        # bi,opfi->bfop
    -        # bop,fopi->bfi
    -        # bop,fbi->opfi : fopi
    -
    -        tensordot = self.ops.xp.tensordot
    -        ascontiguous = self.ops.xp.ascontiguousarray
    -
    -        Yfp = tensordot(X, self.W, axes=[[1], [3]])
    -
    -        def backward(dYp_ids, sgd=None):
    -            dYp, ids = dYp_ids
    -            Xf = X[ids]
    -
    -            dXf = tensordot(dYp, self.W, axes=[[1, 2], [1,2]])
    -            dW = tensordot(dYp, Xf, axes=[[0], [0]])
    -
    -            self.d_W += dW.transpose((2, 0, 1, 3))
    -            self.d_b += dYp.sum(axis=0)
    -
    -            if sgd is not None:
    -                sgd(self._mem.weights, self._mem.gradient, key=self.id)
    -            return dXf
    -        return Yfp, backward
     
     # Thinc's Embed class is a bit broken atm, so drop this here.
     from thinc import describe
    @@ -382,6 +329,8 @@ def reapply(layer, n_times):
         return wrap(reapply_fwd, layer)
     
     
    +
    +
     def asarray(ops, dtype):
         def forward(X, drop=0.):
             return ops.asarray(X, dtype=dtype), None
    
    From a8850b4282f4c16edcc7fa3fc5906599ced2278a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 20:27:34 +0200
    Subject: [PATCH 425/649] Remove redundant PrecomputableMaxouts class
    
    ---
     spacy/syntax/nn_parser.pyx | 32 +++++++++++++++-----------------
     1 file changed, 15 insertions(+), 17 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 755c87369..10a79750b 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -47,7 +47,7 @@ from thinc.neural.util import get_array_module
     
     from .. import util
     from ..util import get_async, get_cuda_stream
    -from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts
    +from .._ml import zero_init, PrecomputableAffine
     from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune
     from .._ml import Residual, drop_layer, flatten
     from .._ml import link_vectors_to_models
    @@ -153,8 +153,7 @@ cdef class precompute_hiddens:
             state_vector, bp_nonlinearity = self._nonlinearity(state_vector)
     
             def backward(d_state_vector, sgd=None):
    -            if bp_nonlinearity is not None:
    -                d_state_vector = bp_nonlinearity(d_state_vector, sgd)
    +            d_state_vector = bp_nonlinearity(d_state_vector, sgd)
                 # This will usually be on GPU
                 if not isinstance(d_state_vector, self.ops.xp.ndarray):
                     d_state_vector = self.ops.xp.array(d_state_vector)
    @@ -165,14 +164,18 @@ cdef class precompute_hiddens:
         def _nonlinearity(self, state_vector):
             if self.nP == 1:
                 mask = state_vector >= 0.
    -            return state_vector * mask, lambda dY, sgd=None: dY * mask
    -        state_vector = state_vector.reshape(
    -            (state_vector.shape[0], state_vector.shape[1]//self.nP, self.nP))
    -        best, which = self.ops.maxout(state_vector)
    +            state_vector *= mask
    +        else:
    +            state_vector = state_vector.reshape(
    +                (state_vector.shape[0], self.nO, self.nP))
    +            state_vector, mask = self.ops.maxout(state_vector)
     
    -        def backprop_maxout(d_best, sgd=None):
    -            return self.ops.backprop_maxout(d_best, which, self.nP)
    -        return best, backprop_maxout
    +        def backprop_nonlinearity(d_best, sgd=None):
    +            if self.nP == 1:
    +                return d_best * mask
    +            else:
    +                return self.ops.backprop_maxout(d_best, mask, self.nP)
    +        return state_vector, backprop_nonlinearity
     
     
     cdef void sum_state_features(float* output,
    @@ -262,13 +265,8 @@ cdef class Parser:
             tok2vec = Tok2Vec(token_vector_width, embed_size,
                               pretrained_dims=cfg.get('pretrained_dims', 0))
             tok2vec = chain(tok2vec, flatten)
    -        if parser_maxout_pieces >= 2:
    -            lower = PrecomputableMaxouts(hidden_width if depth >= 1 else nr_class,
    -                nF=cls.nr_feature, nP=parser_maxout_pieces,
    -                nI=token_vector_width)
    -        else:
    -            lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class,
    -                nF=cls.nr_feature, nI=token_vector_width)
    +        lower = PrecomputableAffine(hidden_width * parser_maxout_pieces,
    +                    nF=cls.nr_feature, nI=token_vector_width)
     
             with Model.use_device('cpu'):
                 upper = chain(
    
    From 827cd8a883397f00ab110a6356cb579742b6a52f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 03:07:17 +0200
    Subject: [PATCH 426/649] Fix support of maxout pieces in parser
    
    ---
     spacy/syntax/nn_parser.pyx | 6 ++++--
     1 file changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 10a79750b..465e4d877 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -116,8 +116,8 @@ cdef class precompute_hiddens:
             else:
                 cached = gpu_cached
             self.nF = cached.shape[1]
    -        self.nO = cached.shape[2]
             self.nP = getattr(lower_model, 'nP', 1)
    +        self.nO = cached.shape[2] // self.nP
             self.ops = lower_model.ops
             self.bias = lower_model.b
             self._is_synchronized = False
    @@ -174,7 +174,8 @@ cdef class precompute_hiddens:
                 if self.nP == 1:
                     return d_best * mask
                 else:
    -                return self.ops.backprop_maxout(d_best, mask, self.nP)
    +                d_vector = self.ops.backprop_maxout(d_best, mask, self.nP)
    +                return d_vector.reshape((d_vector.shape[0], self.nO*self.nP))
             return state_vector, backprop_nonlinearity
     
     
    @@ -267,6 +268,7 @@ cdef class Parser:
             tok2vec = chain(tok2vec, flatten)
             lower = PrecomputableAffine(hidden_width * parser_maxout_pieces,
                         nF=cls.nr_feature, nI=token_vector_width)
    +        lower.nP = parser_maxout_pieces
     
             with Model.use_device('cpu'):
                 upper = chain(
    
    From 64658e02e5d5d32a2d4f2174801ee96294b2c769 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 03:07:45 +0200
    Subject: [PATCH 427/649] Implement fancier initialisation for precomputed
     layer
    
    ---
     spacy/_ml.py | 64 ++++++++++++++++++++++++++++++++++++++++++----------
     1 file changed, 52 insertions(+), 12 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 1f504ec4a..1f0bfa5b6 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -13,7 +13,8 @@ from thinc.api import uniqued, wrap, flatten_add_lengths, noop
     
     from thinc.linear.linear import LinearModel
     from thinc.neural.ops import NumpyOps, CupyOps
    -from thinc.neural.util import get_array_module
    +from thinc.neural.util import get_array_module, copy_array
    +from thinc.neural._lsuv import svd_orthonormal
     
     import random
     import cytoolz
    @@ -22,6 +23,7 @@ from thinc import describe
     from thinc.describe import Dimension, Synapses, Biases, Gradient
     from thinc.neural._classes.affine import _set_dimensions_if_needed
     import thinc.extra.load_nlp
    +from thinc.neural._lsuv import svd_orthonormal
     
     from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER
     from .tokens.doc import Doc
    @@ -102,22 +104,14 @@ def _preprocess_doc(docs, drop=0.):
         return (keys, vals, lengths), None
     
     
    -def _init_for_precomputed(W, ops):
    -    if (W**2).sum() != 0.:
    -        return
    -    W = W.reshape((W.shape[0] * W.shape[1], W.shape[2]))
    -    ops.xavier_uniform_init(W, inplace=True)
    -    return W
    -
    -
    -@describe.on_data(_set_dimensions_if_needed)
    +@describe.on_data(_set_dimensions_if_needed,
    +    lambda model, X, y: model.init_weights(model))
     @describe.attributes(
         nI=Dimension("Input size"),
         nF=Dimension("Number of features"),
         nO=Dimension("Output size"),
         W=Synapses("Weights matrix",
    -        lambda obj: (obj.nI, obj.nF, obj.nO),
    -        lambda W, ops: _init_for_precomputed(W, ops)),
    +        lambda obj: (obj.nI, obj.nF, obj.nO)),
         b=Biases("Bias vector",
             lambda obj: (obj.nO,)),
         d_W=Gradient("W"),
    @@ -173,6 +167,52 @@ class PrecomputableAffine(Model):
             weights = self.ops.xp.ascontiguousarray(weights)
             return weights.reshape(shape)
     
    +    @staticmethod
    +    def init_weights(model):
    +        '''This is like the 'layer sequential unit variance', but instead
    +        of taking the actual inputs, we randomly generate whitened data.
    +
    +        Why's this all so complicated? We have a huge number of inputs,
    +        and the maxout unit makes guessing the dynamics tricky. Instead
    +        we set the maxout weights to values that empirically result in
    +        whitened outputs given whitened inputs.
    +        '''
    +        if (model.W**2).sum() != 0.:
    +            return
    +        model.ops.normal_init(model.W, model.nFI, inplace=True)
    +
    +        ids = numpy.zeros((5000, model.nF), dtype='i')
    +        ids += numpy.asarray(numpy.random.uniform(0, 1000, ids.shape), dtype='i')
    +        tokvecs = numpy.zeros((5000, model.nI), dtype='f')
    +        tokvecs += numpy.random.normal(loc=0., scale=1.,
    +                    size=tokvecs.size).reshape(tokvecs.shape)
    +
    +        def predict(ids, tokvecs):
    +            hiddens = model(tokvecs)
    +            vector = model.ops.allocate((hiddens.shape[0], model.nO))
    +            model.ops.scatter_add(vector, ids, hiddens)
    +            vector += model.b
    +            if model.nP >= 2:
    +                vector = vector.reshape((ids.shape[0], model.nO//model.nP, model.nP))
    +                return model.ops.maxout(vector)[0]
    +            else:
    +                return vector * (vector >= 0)
    +
    +        tol_var = 0.01
    +        tol_mean = 0.01
    +        t_max = 10
    +        t_i = 0
    +        for t_i in range(t_max):
    +            acts1 = predict(ids, tokvecs)
    +            var = numpy.var(acts1)
    +            mean = numpy.mean(acts1)
    +            if abs(var - 1.0) >= tol_var:
    +                model.W /= numpy.sqrt(var)
    +            elif abs(mean) >= tol_mean:
    +                model.b -= mean
    +            else:
    +                break
    +
     
     # Thinc's Embed class is a bit broken atm, so drop this here.
     from thinc import describe
    
    From b3ab124fc5ad9934a166cf6a21995571cbf4de8b Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Thu, 19 Oct 2017 19:37:14 +0530
    Subject: [PATCH 428/649] Support strings for attribute list in doc.to_array
    
    ---
     spacy/tests/doc/test_array.py | 20 ++++++++++++++++++++
     spacy/tokens/doc.pyx          | 27 +++++++++++++++++++--------
     2 files changed, 39 insertions(+), 8 deletions(-)
    
    diff --git a/spacy/tests/doc/test_array.py b/spacy/tests/doc/test_array.py
    index dd87aa763..ff10394d1 100644
    --- a/spacy/tests/doc/test_array.py
    +++ b/spacy/tests/doc/test_array.py
    @@ -17,6 +17,26 @@ def test_doc_array_attr_of_token(en_tokenizer, en_vocab):
         assert feats_array[0][0] != feats_array[0][1]
     
     
    +def test_doc_stringy_array_attr_of_token(en_tokenizer, en_vocab):
    +    text = "An example sentence"
    +    tokens = en_tokenizer(text)
    +    example = tokens.vocab["example"]
    +    assert example.orth != example.shape
    +    feats_array = tokens.to_array((ORTH, SHAPE))
    +    feats_array_stringy = tokens.to_array(("ORTH", "SHAPE"))
    +    assert feats_array_stringy[0][0] == feats_array[0][0]
    +    assert feats_array_stringy[0][1] == feats_array[0][1]
    +
    +
    +def test_doc_scalar_attr_of_token(en_tokenizer, en_vocab):
    +    text = "An example sentence"
    +    tokens = en_tokenizer(text)
    +    example = tokens.vocab["example"]
    +    assert example.orth != example.shape
    +    feats_array = tokens.to_array(ORTH)
    +    assert feats_array.shape == (3,)
    +
    +
     def test_doc_array_tag(en_tokenizer):
         text = "A nice sentence."
         pos = ['DET', 'ADJ', 'NOUN', 'PUNCT']
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index ad5358d9a..6e7230428 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -21,7 +21,7 @@ from .token cimport Token
     from .printers import parse_tree
     from ..lexeme cimport Lexeme, EMPTY_LEXEME
     from ..typedefs cimport attr_t, flags_t
    -from ..attrs import intify_attrs
    +from ..attrs import intify_attrs, IDS
     from ..attrs cimport attr_id_t
     from ..attrs cimport ID, ORTH, NORM, LOWER, SHAPE, PREFIX, SUFFIX, LENGTH, CLUSTER
     from ..attrs cimport LENGTH, POS, LEMMA, TAG, DEP, HEAD, SPACY, ENT_IOB, ENT_TYPE
    @@ -536,11 +536,15 @@ cdef class Doc:
     
         @cython.boundscheck(False)
         cpdef np.ndarray to_array(self, object py_attr_ids):
    -        """Given a list of M attribute IDs, export the tokens to a numpy
    -        `ndarray` of shape `(N, M)`, where `N` is the length of the document.
    -        The values will be 32-bit integers.
    +        """Export given token attributes to a numpy `ndarray`.
     
    -        attr_ids (list[int]): A list of attribute ID ints.
    +	If `attr_ids` is a sequence of M attributes, the output array will
    +	be of shape `(N, M)`, where N is the length of the `Doc`
    +	(in tokens). If `attr_ids` is a single attribute, the output shape will
    +	be (N,). You can specify attributes by integer ID (e.g. spacy.attrs.LEMMA)
    +	or string name (e.g. 'LEMMA' or 'lemma').
    +
    +        attr_ids (list[]): A list of attributes (int IDs or string names).
             RETURNS (numpy.ndarray[long, ndim=2]): A feature matrix, with one row
                 per word, and one column per attribute indicated in the input
                 `attr_ids`.
    @@ -555,11 +559,18 @@ cdef class Doc:
             cdef attr_id_t feature
             cdef np.ndarray[attr_t, ndim=2] output
             cdef np.ndarray[attr_t, ndim=1] output_1D
    -        # Make an array from the attributes --- otherwise our inner loop is Python
    -        # dict iteration.
    +        # Handle scalar/list inputs of strings/ints for py_attr_ids
             if( type(py_attr_ids) is not list and type(py_attr_ids) is not tuple ):
                 py_attr_ids = [ py_attr_ids ]
    -        cdef np.ndarray[attr_t, ndim=1] attr_ids = numpy.asarray(py_attr_ids, dtype=numpy.uint64)
    +        py_attr_ids_input = []
    +        for py_attr_id in py_attr_ids:
    +            if( type(py_attr_id) is int ):
    +                py_attr_ids_input.append(py_attr_id)
    +            else:
    +                py_attr_ids_input.append(IDS[py_attr_id.upper()])
    +        # Make an array from the attributes --- otherwise our inner loop is Python
    +        # dict iteration.
    +        cdef np.ndarray[attr_t, ndim=1] attr_ids = numpy.asarray(py_attr_ids_input, dtype=numpy.uint64)
             output = numpy.ndarray(shape=(self.length, len(attr_ids)), dtype=numpy.uint64)
             for i in range(self.length):
                 for j, feature in enumerate(attr_ids):
    
    From d44a079fe3d8958fd4e76690a45e77f85d3ea67c Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Fri, 20 Oct 2017 14:25:38 +0530
    Subject: [PATCH 429/649] Update documentation on doc.to_array
    
    ---
     website/api/doc.jade | 26 +++++++++++++++++++-------
     1 file changed, 19 insertions(+), 7 deletions(-)
    
    diff --git a/website/api/doc.jade b/website/api/doc.jade
    index dce6b89e0..ceb564c7a 100644
    --- a/website/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -336,28 +336,40 @@ p
         +tag method
     
     p
    -    |  Export the document annotations to a numpy array of shape #[code N*M]
    -    |  where #[code N] is the length of the document and #[code M] is the number
    -    |  of attribute IDs to export. The values will be 32-bit integers.
    +    |  Export given token attributes to a numpy #[code ndarray].
    +    |  If #[code attr_ids] is a sequence of #[code M] attributes,
    +    |  the output array will  be of shape #[code (N, M)], where #[code N]
    +    |  is the length of the #[code Doc] (in tokens). If #[code attr_ids] is
    +    |  a single attribute, the output shape will be #[code (N,)]. You can
    +    |  specify attributes by integer ID (e.g. #[code spacy.attrs.LEMMA])
    +    |  or string name (e.g. 'LEMMA' or 'lemma'). The values will be 64-bit
    +    |  integers.
     
     +aside-code("Example").
         from spacy.attrs import LOWER, POS, ENT_TYPE, IS_ALPHA
         doc = nlp(text)
         # All strings mapped to integers, for easy export to numpy
         np_array = doc.to_array([LOWER, POS, ENT_TYPE, IS_ALPHA])
    +    np_array = doc.to_array("POS")
     
     +table(["Name", "Type", "Description"])
         +row
             +cell #[code attr_ids]
    -        +cell list
    -        +cell A list of attribute ID ints.
    +        +cell list or int or string
    +        +cell
    +            | A list of attributes (int IDs or string names) or
    +            | a single attribute (int ID or string name)
     
         +row("foot")
             +cell returns
    -        +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']]
    +        +cell
    +            | #[code.u-break numpy.ndarray[ndim=2, dtype='uint64']] or
    +            | #[code.u-break numpy.ndarray[ndim=1, dtype='uint64']] or
             +cell
                 |  The exported attributes as a 2D numpy array, with one row per
    -            |  token and one column per attribute.
    +            |  token and one column per attribute (when #[code attr_ids] is a
    +            |  list), or as a 1D numpy array, with one item per attribute (when
    +            |  #[code attr_ids] is a single value).
     
     +h(2, "from_array") Doc.from_array
         +tag method
    
    From b10173655589b038ba1e69e937eddf03819dc94d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 12:14:52 +0200
    Subject: [PATCH 430/649] Fix precomputed layer
    
    ---
     spacy/_ml.py | 46 ++++++++++++----------------------------------
     1 file changed, 12 insertions(+), 34 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 1f0bfa5b6..934832a63 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -111,7 +111,7 @@ def _preprocess_doc(docs, drop=0.):
         nF=Dimension("Number of features"),
         nO=Dimension("Output size"),
         W=Synapses("Weights matrix",
    -        lambda obj: (obj.nI, obj.nF, obj.nO)),
    +        lambda obj: (obj.nF, obj.nO, obj.nI)),
         b=Biases("Bias vector",
             lambda obj: (obj.nO,)),
         d_W=Gradient("W"),
    @@ -124,37 +124,20 @@ class PrecomputableAffine(Model):
             self.nI = nI
             self.nF = nF
     
    -    @property
    -    def nFI(self):
    -        return self.nI * self.nF
    -
    -    @property
    -    def nFO(self):
    -        return self.nF * self.nO
    -
         def begin_update(self, X, drop=0.):
    -        nN = X.shape[0]
    -        # X: (b, i)
    -        # Xf: (b, f, i)
    -        # Yf: (b, f, o)
    -        # dY: (b, o)
    -        # dYf: (b, f, o)
    -        # W: (i, f, o)
    -        W = self.W.reshape((self.nI, self.nFO))
    -        Yf = self.ops.xp.dot(X, W)
    -        Yf = Yf.reshape((Yf.shape[0], self.nF, self.nO))
    -        #Yf = einsum('ab,bc->ac', X, W)
    +        tensordot = self.ops.xp.tensordot
    +        ascontiguous = self.ops.xp.ascontiguousarray
    +
    +        Yf = tensordot(X, self.W, axes=[[1], [2]])
    +
             def backward(dY_ids, sgd=None):
                 dY, ids = dY_ids
                 Xf = X[ids]
    -            # bo,fi_o->b_if -> b_fi
    -            W_o_fi = self._transpose(self.W, shape=(self.nO, self.nFI))
    -            dXf = self.ops.xp.dot(dY, W_o_fi).reshape((Xf.shape[0], self.nF, self.nI))
    -            # bo,b_fi->o_fi
    -            dW = Xf.reshape((Xf.shape[0], self.nFI))
    -            dW = self.ops.xp.dot(Xf.T, dY)
    -            dW = dW.reshape((self.nO, self.nF, self.nI))
    -            self.d_W += dW.transpose((2, 1, 0))
    +
    +            dXf = tensordot(dY, self.W, axes=[[1], [1]])
    +            dW = tensordot(dY, Xf, axes=[[0], [0]])
    +
    +            self.d_W += dW.transpose((1, 0, 2))
                 self.d_b += dY.sum(axis=0)
     
                 if sgd is not None:
    @@ -162,11 +145,6 @@ class PrecomputableAffine(Model):
                 return dXf
             return Yf, backward
     
    -    def _transpose(self, weights, shape):
    -        weights = weights.transpose((2, 1, 0))
    -        weights = self.ops.xp.ascontiguousarray(weights)
    -        return weights.reshape(shape)
    -
         @staticmethod
         def init_weights(model):
             '''This is like the 'layer sequential unit variance', but instead
    @@ -179,7 +157,7 @@ class PrecomputableAffine(Model):
             '''
             if (model.W**2).sum() != 0.:
                 return
    -        model.ops.normal_init(model.W, model.nFI, inplace=True)
    +        model.ops.normal_init(model.W, model.nF * model.nI, inplace=True)
     
             ids = numpy.zeros((5000, model.nF), dtype='i')
             ids += numpy.asarray(numpy.random.uniform(0, 1000, ids.shape), dtype='i')
    
    From 4acab77a8a36c6f54cacf5e26b32860a30d09657 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 20 Oct 2017 13:07:57 +0200
    Subject: [PATCH 431/649] Add missing symbol for LAW entities (resolves #1427)
    
    ---
     spacy/symbols.pxd                            | 1 +
     spacy/symbols.pyx                            | 1 +
     website/api/_annotation/_named-entities.jade | 4 ++++
     3 files changed, 6 insertions(+)
    
    diff --git a/spacy/symbols.pxd b/spacy/symbols.pxd
    index e981de6ae..4f1d35cf8 100644
    --- a/spacy/symbols.pxd
    +++ b/spacy/symbols.pxd
    @@ -467,3 +467,4 @@ cdef enum symbol_t:
     # We therefore wait until the next data version to add them.
     # acl
     
    +    LAW
    diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx
    index b7f1f4556..f64577309 100644
    --- a/spacy/symbols.pyx
    +++ b/spacy/symbols.pyx
    @@ -458,6 +458,7 @@ IDS = {
         "rcmod": rcmod,
         "root": root,
         "xcomp": xcomp
    +    "LAW": LAW
     }
     
     def sort_nums(x):
    diff --git a/website/api/_annotation/_named-entities.jade b/website/api/_annotation/_named-entities.jade
    index 476659d4a..93e705c72 100644
    --- a/website/api/_annotation/_named-entities.jade
    +++ b/website/api/_annotation/_named-entities.jade
    @@ -37,6 +37,10 @@
             +cell #[code WORK_OF_ART]
             +cell Titles of books, songs, etc.
     
    +    +row
    +        +cell #[code LAW]
    +        +cell Named documents made into laws.
    +
         +row
             +cell #[code LANGUAGE]
             +cell Any named language.
    
    From 108f1f786e62b1fc713ca20ff9a1aaf32665824b Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 20 Oct 2017 13:08:44 +0200
    Subject: [PATCH 432/649] Update symbols and document missing token attributes
     (see #1439)
    
    ---
     spacy/symbols.pxd      | 23 ++++++-----------------
     spacy/symbols.pyx      | 13 ++++++++-----
     website/api/token.jade | 20 ++++++++++++++++++++
     3 files changed, 34 insertions(+), 22 deletions(-)
    
    diff --git a/spacy/symbols.pxd b/spacy/symbols.pxd
    index 4f1d35cf8..6960681a3 100644
    --- a/spacy/symbols.pxd
    +++ b/spacy/symbols.pxd
    @@ -13,12 +13,12 @@ cdef enum symbol_t:
         LIKE_EMAIL
         IS_STOP
         IS_OOV
    +    IS_BRACKET
    +    IS_QUOTE
    +    IS_LEFT_PUNCT
    +    IS_RIGHT_PUNCT
     
    -    FLAG14 = 14
    -    FLAG15
    -    FLAG16
    -    FLAG17
    -    FLAG18
    +    FLAG18 = 18
         FLAG19
         FLAG20
         FLAG21
    @@ -455,16 +455,5 @@ cdef enum symbol_t:
         root
         xcomp
     
    -# Move these up to FLAG14--FLAG18 once we finish the functionality
    -# and are ready to regenerate the model.
    -#IS_BRACKET
    -#IS_QUOTE
    -#IS_LEFT_PUNCT
    -#IS_RIGHT_PUNCT
    -
    -# These symbols are currently missing. However, if we add them currently,
    -# we'll throw off the integer index and the model will have to be retrained.
    -# We therefore wait until the next data version to add them.
    -# acl
    -
    +    acl
         LAW
    diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx
    index f64577309..0e0337b6e 100644
    --- a/spacy/symbols.pyx
    +++ b/spacy/symbols.pyx
    @@ -18,10 +18,11 @@ IDS = {
         "LIKE_EMAIL": LIKE_EMAIL,
         "IS_STOP": IS_STOP,
         "IS_OOV": IS_OOV,
    -    "FLAG14": FLAG14,
    -    "FLAG15": FLAG15,
    -    "FLAG16": FLAG16,
    -    "FLAG17": FLAG17,
    +    "IS_BRACKET": IS_BRACKET,
    +    "IS_QUOTE": IS_QUOTE,
    +    "IS_LEFT_PUNCT": IS_LEFT_PUNCT,
    +    "IS_RIGHT_PUNCT": IS_RIGHT_PUNCT,
    +
         "FLAG18": FLAG18,
         "FLAG19": FLAG19,
         "FLAG20": FLAG20,
    @@ -457,7 +458,9 @@ IDS = {
         "quantmod": quantmod,
         "rcmod": rcmod,
         "root": root,
    -    "xcomp": xcomp
    +    "xcomp": xcomp,
    +
    +    "acl": acl,
         "LAW": LAW
     }
     
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 465d44c66..4062594b4 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -586,6 +586,16 @@ p The L2 norm of the token's vector representation.
             +cell bool
             +cell Is the token punctuation?
     
    +    +row
    +        +cell #[code is_left_punct]
    +        +cell bool
    +        +cell Is the token a left punctuation mark, e.g. #[code (]?
    +
    +    +row
    +        +cell #[code is_right_punct]
    +        +cell bool
    +        +cell Is the token a right punctuation mark, e.g. #[code )]?
    +
         +row
             +cell #[code is_space]
             +cell bool
    @@ -593,6 +603,16 @@ p The L2 norm of the token's vector representation.
                 |  Does the token consist of whitespace characters? Equivalent to
                 |  #[code token.text.isspace()].
     
    +    +row
    +        +cell #[code is_bracket]
    +        +cell bool
    +        +cell Is the token a bracket?
    +
    +    +row
    +        +cell #[code is_quote]
    +        +cell bool
    +        +cell Is the token a quotation mark?
    +
         +row
             +cell #[code like_url]
             +cell bool
    
    From 072694656376b423e5b53c2742b733d90b416bee Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Fri, 20 Oct 2017 17:09:37 +0530
    Subject: [PATCH 433/649] cleanup to_array implementation using fixes on master
    
    ---
     spacy/tokens/doc.pyx | 25 +++++++++++--------------
     1 file changed, 11 insertions(+), 14 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 6e7230428..9351ba366 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -557,28 +557,25 @@ cdef class Doc:
             """
             cdef int i, j
             cdef attr_id_t feature
    +        cdef np.ndarray[attr_t, ndim=1] attr_ids
             cdef np.ndarray[attr_t, ndim=2] output
    -        cdef np.ndarray[attr_t, ndim=1] output_1D
             # Handle scalar/list inputs of strings/ints for py_attr_ids
    -        if( type(py_attr_ids) is not list and type(py_attr_ids) is not tuple ):
    -            py_attr_ids = [ py_attr_ids ]
    -        py_attr_ids_input = []
    -        for py_attr_id in py_attr_ids:
    -            if( type(py_attr_id) is int ):
    -                py_attr_ids_input.append(py_attr_id)
    -            else:
    -                py_attr_ids_input.append(IDS[py_attr_id.upper()])
    +        if not hasattr(py_attr_ids, '__iter__'):
    +            py_attr_ids = [py_attr_ids]
    +
    +        # Allow strings, e.g. 'lemma' or 'LEMMA'
    +        py_attr_ids = [(IDS[id_.upper()] if hasattr(id_, 'upper') else id_)
    +                       for id_ in py_attr_ids]
             # Make an array from the attributes --- otherwise our inner loop is Python
             # dict iteration.
    -        cdef np.ndarray[attr_t, ndim=1] attr_ids = numpy.asarray(py_attr_ids_input, dtype=numpy.uint64)
    +        attr_ids = numpy.asarray(py_attr_ids, dtype=numpy.uint64)
             output = numpy.ndarray(shape=(self.length, len(attr_ids)), dtype=numpy.uint64)
             for i in range(self.length):
                 for j, feature in enumerate(attr_ids):
                     output[i, j] = get_token_attr(&self.c[i], feature)
    -        if( len(attr_ids) == 1 ):
    -            output_1D = output.reshape((self.length))
    -            return output_1D
    -        return output
    +        # Handle 1d case
    +        return output if len(attr_ids) >= 2 else output.reshape((self.length,))
    +
     
         def count_by(self, attr_id_t attr_id, exclude=None, PreshCounter counts=None):
             """Count the frequencies of a given attribute. Produces a dict of
    
    From 92ac9316b5f3ff79db1c3ec44be54f8c4dfe95dc Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 13:59:24 +0200
    Subject: [PATCH 434/649] Fix initialization of vectors, to address
     serialization problem
    
    ---
     spacy/vectors.pyx | 12 +++++-------
     spacy/vocab.pyx   | 10 ++++------
     2 files changed, 9 insertions(+), 13 deletions(-)
    
    diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx
    index 5512279ae..cea583110 100644
    --- a/spacy/vectors.pyx
    +++ b/spacy/vectors.pyx
    @@ -32,22 +32,20 @@ cdef class Vectors:
         cdef public object keys
         cdef public int i
     
    -    def __init__(self, strings, data_or_width=0):
    +    def __init__(self, strings, data=None, width=0):
             if isinstance(strings, StringStore):
                 self.strings = strings
             else:
                 self.strings = StringStore()
                 for string in strings:
                     self.strings.add(string)
    -        if isinstance(data_or_width, int):
    -            self.data = data = numpy.zeros((len(strings), data_or_width),
    -                                           dtype='f')
    +        if data is not None:
    +            self.data = numpy.asarray(data, dtype='f')
             else:
    -            data = data_or_width
    +            self.data = numpy.zeros((len(self.strings), width), dtype='f')
             self.i = 0
    -        self.data = data
             self.key2row = {}
    -        self.keys = np.ndarray((self.data.shape[0],), dtype='uint64')
    +        self.keys = numpy.zeros((self.data.shape[0],), dtype='uint64')
     
         def __reduce__(self):
             return (Vectors, (self.strings, self.data))
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index 205e5a2af..e6ba9944b 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -62,12 +62,10 @@ cdef class Vocab:
             if strings:
                 for string in strings:
                     _ = self[string]
    -        for name in tag_map.keys():
    -            if name:
    -                self.strings.add(name)
             self.lex_attr_getters = lex_attr_getters
    +        print("Create morphology", list(self.strings), tag_map)
             self.morphology = Morphology(self.strings, tag_map, lemmatizer)
    -        self.vectors = Vectors(self.strings)
    +        self.vectors = Vectors(self.strings, width=0)
     
         property lang:
             def __get__(self):
    @@ -338,7 +336,7 @@ cdef class Vocab:
                 if self.vectors is None:
                     return None
                 else:
    -                return self.vectors.to_bytes(exclude='strings.json')
    +                return self.vectors.to_bytes()
     
             getters = OrderedDict((
                 ('strings', lambda: self.strings.to_bytes()),
    @@ -358,7 +356,7 @@ cdef class Vocab:
                 if self.vectors is None:
                     return None
                 else:
    -                return self.vectors.from_bytes(b, exclude='strings')
    +                return self.vectors.from_bytes(b)
             setters = OrderedDict((
                 ('strings', lambda b: self.strings.from_bytes(b)),
                 ('lexemes', lambda b: self.lexemes_from_bytes(b)),
    
    From 6218af0105d1514089ecd76c4cbf6fec31d50423 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 13:59:57 +0200
    Subject: [PATCH 435/649] Remove cpdef enum, to avoid too much code generation
    
    ---
     spacy/morphology.pxd | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/morphology.pxd b/spacy/morphology.pxd
    index be6711bfd..9192f351f 100644
    --- a/spacy/morphology.pxd
    +++ b/spacy/morphology.pxd
    @@ -44,7 +44,7 @@ cdef class Morphology:
         cdef int assign_feature(self, uint64_t* morph, univ_morph_t feat_id, bint value) except -1
     
     
    -cpdef enum univ_morph_t:
    +cdef enum univ_morph_t:
         NIL = 0
         Animacy_anim = symbols.Animacy_anim
         Animacy_inam
    
    From 506cf2eb1389da6149f97de7db80df52ed0d2d1f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:00:23 +0200
    Subject: [PATCH 436/649] Remove cpdef enum, to avoid too much code generation
    
    ---
     spacy/morphology.pyx | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 4a1a0aa54..65b46fe08 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -426,3 +426,7 @@ IDS = {
     
     
     NAMES = [key for key, value in sorted(IDS.items(), key=lambda item: item[1])]
    +# Unfortunate hack here, to work around problem with long cpdef enum
    +# (which is generating an enormous amount of C++ in Cython 0.24+)
    +# We keep the enum cdef, and just make sure the names are available to Python
    +locals().update(IDS)
    
    From 49895fbef69598d18fd00197661ec3ad939de849 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:01:12 +0200
    Subject: [PATCH 437/649] Rename 'SP' special tag to '_SP'
    
    Renaming the tag with an underscore lets us add it to the tag map
    without worrying that we'll change the sequence of tags, which throws
    off the tag-to-ID mapping. For instance, if we inserted a 'SP' tag,
    the "VERB" tag is pushed to a different class ID, and the model is all
    messed up.
    ---
     spacy/lang/de/tag_map.py |  2 +-
     spacy/lang/en/tag_map.py |  4 +--
     spacy/lang/es/tag_map.py |  2 +-
     spacy/lang/th/tag_map.py | 77 ++++++++++++++++++++--------------------
     spacy/morphology.pyx     | 14 ++++++--
     5 files changed, 54 insertions(+), 45 deletions(-)
    
    diff --git a/spacy/lang/de/tag_map.py b/spacy/lang/de/tag_map.py
    index d16bd17e0..730c15cfc 100644
    --- a/spacy/lang/de/tag_map.py
    +++ b/spacy/lang/de/tag_map.py
    @@ -62,5 +62,5 @@ TAG_MAP = {
         "VVIZU":    {POS: VERB, "VerbForm": "inf"},
         "VVPP":     {POS: VERB, "Aspect": "perf", "VerbForm": "part"},
         "XY":       {POS: X},
    -    "SP":       {POS: SPACE}
    +    "_SP":      {POS: SPACE}
     }
    diff --git a/spacy/lang/en/tag_map.py b/spacy/lang/en/tag_map.py
    index a674c17e3..76eabf307 100644
    --- a/spacy/lang/en/tag_map.py
    +++ b/spacy/lang/en/tag_map.py
    @@ -55,11 +55,11 @@ TAG_MAP = {
         "WP":       {POS: NOUN, "PronType": "int|rel"},
         "WP$":      {POS: ADJ, "Poss": "yes", "PronType": "int|rel"},
         "WRB":      {POS: ADV, "PronType": "int|rel"},
    -    "SP":       {POS: SPACE},
         "ADD":      {POS: X},
         "NFP":      {POS: PUNCT},
         "GW":       {POS: X},
         "XX":       {POS: X},
         "BES":      {POS: VERB},
    -    "HVS":      {POS: VERB}
    +    "HVS":      {POS: VERB},
    +    "_SP":       {POS: SPACE},
     }
    diff --git a/spacy/lang/es/tag_map.py b/spacy/lang/es/tag_map.py
    index 86dd48620..2095d23b1 100644
    --- a/spacy/lang/es/tag_map.py
    +++ b/spacy/lang/es/tag_map.py
    @@ -303,5 +303,5 @@ TAG_MAP = {
         "VERB__VerbForm=Ger": {"morph": "VerbForm=Ger", "pos": "VERB"},
         "VERB__VerbForm=Inf": {"morph": "VerbForm=Inf", "pos": "VERB"},
         "X___": {"morph": "_", "pos": "X"},
    -    "SP": {"morph": "_", "pos": "SPACE"},
    +    "_SP": {"morph": "_", "pos": "SPACE"},
     }
    diff --git a/spacy/lang/th/tag_map.py b/spacy/lang/th/tag_map.py
    index 40e5ac44c..570871820 100644
    --- a/spacy/lang/th/tag_map.py
    +++ b/spacy/lang/th/tag_map.py
    @@ -19,63 +19,64 @@ TAG_MAP = {
         "NPRP":     {POS: PRON},
         # ADJ
         "ADJ":      {POS: ADJ},
    -    "NONM":      {POS: ADJ},
    -    "VATT":      {POS: ADJ},
    -    "DONM":      {POS: ADJ},
    +    "NONM":     {POS: ADJ},
    +    "VATT":     {POS: ADJ},
    +    "DONM":     {POS: ADJ},
         # ADV
         "ADV":      {POS: ADV},
    -    "ADVN":      {POS: ADV},
    -    "ADVI":      {POS: ADV},
    -    "ADVP":      {POS: ADV},
    -    "ADVS":      {POS: ADV},
    +    "ADVN":     {POS: ADV},
    +    "ADVI":     {POS: ADV},
    +    "ADVP":     {POS: ADV},
    +    "ADVS":     {POS: ADV},
     	# INT
         "INT":      {POS: INTJ},
         # PRON
         "PROPN":    {POS: PROPN},
    -    "PPRS":    {POS: PROPN},
    -    "PDMN":    {POS: PROPN},
    -    "PNTR":    {POS: PROPN},
    +    "PPRS":     {POS: PROPN},
    +    "PDMN":     {POS: PROPN},
    +    "PNTR":     {POS: PROPN},
         # DET
         "DET":      {POS: DET},
    -    "DDAN":      {POS: DET},
    -    "DDAC":      {POS: DET},
    -    "DDBQ":      {POS: DET},
    -    "DDAQ":      {POS: DET},
    -    "DIAC":      {POS: DET},
    -    "DIBQ":      {POS: DET},
    -    "DIAQ":      {POS: DET},
    -    "DCNM":      {POS: DET},
    +    "DDAN":     {POS: DET},
    +    "DDAC":     {POS: DET},
    +    "DDBQ":     {POS: DET},
    +    "DDAQ":     {POS: DET},
    +    "DIAC":     {POS: DET},
    +    "DIBQ":     {POS: DET},
    +    "DIAQ":     {POS: DET},
    +    "DCNM":     {POS: DET},
         # NUM
         "NUM":      {POS: NUM},
    -    "NCNM":      {POS: NUM},
    -    "NLBL":      {POS: NUM},
    -    "DCNM":      {POS: NUM},
    +    "NCNM":     {POS: NUM},
    +    "NLBL":     {POS: NUM},
    +    "DCNM":     {POS: NUM},
     	# AUX
         "AUX":      {POS: AUX},
    -    "XVBM":      {POS: AUX},
    -    "XVAM":      {POS: AUX},
    -    "XVMM":      {POS: AUX},
    -    "XVBB":      {POS: AUX},
    -    "XVAE":      {POS: AUX},
    +    "XVBM":     {POS: AUX},
    +    "XVAM":     {POS: AUX},
    +    "XVMM":     {POS: AUX},
    +    "XVBB":     {POS: AUX},
    +    "XVAE":     {POS: AUX},
     	# ADP
         "ADP":      {POS: ADP},
    -    "RPRE":      {POS: ADP},
    +    "RPRE":     {POS: ADP},
         # CCONJ
         "CCONJ":    {POS: CCONJ},
    -    "JCRG":    {POS: CCONJ},
    +    "JCRG":     {POS: CCONJ},
     	# SCONJ
         "SCONJ":    {POS: SCONJ},
    -    "PREL":    {POS: SCONJ},
    -    "JSBR":    {POS: SCONJ},
    -    "JCMP":    {POS: SCONJ},
    +    "PREL":     {POS: SCONJ},
    +    "JSBR":     {POS: SCONJ},
    +    "JCMP":     {POS: SCONJ},
         # PART
    -    "PART":    {POS: PART},
    -    "FIXN":    {POS: PART},
    -    "FIXV":    {POS: PART},
    -    "EAFF":    {POS: PART},
    -    "AITT":    {POS: PART},
    -    "NEG":    {POS: PART},
    +    "PART":     {POS: PART},
    +    "FIXN":     {POS: PART},
    +    "FIXV":     {POS: PART},
    +    "EAFF":     {POS: PART},
    +    "AITT":     {POS: PART},
    +    "NEG":      {POS: PART},
         # PUNCT
         "PUNCT":    {POS: PUNCT},
    -    "PUNC":    {POS: PUNCT}
    +    "PUNC":     {POS: PUNCT},
    +    "_SP":      {POS: SPACE}
     }
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 65b46fe08..7845ab4e7 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -4,7 +4,7 @@ from __future__ import unicode_literals
     
     from libc.string cimport memset
     
    -from .parts_of_speech cimport ADJ, VERB, NOUN, PUNCT
    +from .parts_of_speech cimport ADJ, VERB, NOUN, PUNCT, SPACE
     from .attrs cimport POS, IS_SPACE
     from .parts_of_speech import IDS as POS_IDS
     from .lexeme cimport Lexeme
    @@ -36,14 +36,22 @@ cdef class Morphology:
         def __init__(self, StringStore string_store, tag_map, lemmatizer, exc=None):
             self.mem = Pool()
             self.strings = string_store
    +        # Add special space symbol. We prefix with underscore, to make sure it
    +        # always sorts to the end.
    +        space_attrs = tag_map.pop('SP', {POS: SPACE})
    +        if '_SP' not in tag_map:
    +            self.strings.add('_SP')
    +            tag_map = dict(tag_map)
    +            tag_map['_SP'] = space_attrs
    +        self.tag_names = tuple(sorted(tag_map.keys()))
             self.tag_map = {}
             self.lemmatizer = lemmatizer
             self.n_tags = len(tag_map)
    -        self.tag_names = tuple(sorted(tag_map.keys()))
             self.reverse_index = {}
     
             self.rich_tags = self.mem.alloc(self.n_tags+1, sizeof(RichTagC))
             for i, (tag_str, attrs) in enumerate(sorted(tag_map.items())):
    +            self.strings.add(tag_str)
                 self.tag_map[tag_str] = dict(attrs)
                 attrs = _normalize_props(attrs)
                 attrs = intify_attrs(attrs, self.strings, _do_deprecated=True)
    @@ -93,7 +101,7 @@ cdef class Morphology:
             # the statistical model fails.
             # Related to Issue #220
             if Lexeme.c_check_flag(token.lex, IS_SPACE):
    -            tag_id = self.reverse_index[self.strings.add('SP')]
    +            tag_id = self.reverse_index[self.strings.add('_SP')]
             rich_tag = self.rich_tags[tag_id]
             analysis = self._cache.get(tag_id, token.lex.orth)
             if analysis is NULL:
    
    From ebecaddb765713aaaf7f5b2f51488f39f66655d9 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:17:15 +0200
    Subject: [PATCH 438/649] Make 'data_or_width' two keyword args in
     Vectors.__init__
    
    Previously the data and width options were one argument in Vectors,
    which meant you couldn't say vectors = Vectors(strings, width=300).
    It's better to have two keywords.
    ---
     spacy/tests/vectors/test_vectors.py |  8 ++++----
     website/api/vectors.jade            | 15 +++++++++------
     2 files changed, 13 insertions(+), 10 deletions(-)
    
    diff --git a/spacy/tests/vectors/test_vectors.py b/spacy/tests/vectors/test_vectors.py
    index 798871edd..74ac26a10 100644
    --- a/spacy/tests/vectors/test_vectors.py
    +++ b/spacy/tests/vectors/test_vectors.py
    @@ -35,18 +35,18 @@ def vocab(en_vocab, vectors):
     
     
     def test_init_vectors_with_data(strings, data):
    -    v = Vectors(strings, data)
    +    v = Vectors(strings, data=data)
         assert v.shape == data.shape
     
     def test_init_vectors_with_width(strings):
    -    v = Vectors(strings, 3)
    +    v = Vectors(strings, width=3)
         for string in strings:
             v.add(string)
         assert v.shape == (len(strings), 3)
     
     
     def test_get_vector(strings, data):
    -    v = Vectors(strings, data)
    +    v = Vectors(strings, data=data)
         for string in strings:
             v.add(string)
         assert list(v[strings[0]]) == list(data[0])
    @@ -56,7 +56,7 @@ def test_get_vector(strings, data):
     
     def test_set_vector(strings, data):
         orig = data.copy()
    -    v = Vectors(strings, data)
    +    v = Vectors(strings, data=data)
         for string in strings:
             v.add(string)
         assert list(v[strings[0]]) == list(orig[0])
    diff --git a/website/api/vectors.jade b/website/api/vectors.jade
    index a58736506..e08f34643 100644
    --- a/website/api/vectors.jade
    +++ b/website/api/vectors.jade
    @@ -12,7 +12,7 @@ p
     
     p
         |  Create a new vector store. To keep the vector table empty, pass
    -    |  #[code data_or_width=0]. You can also create the vector table and add
    +    |  #[code width=0]. You can also create the vector table and add
         |  vectors one by one, or set the vector values directly on initialisation.
     
     +aside-code("Example").
    @@ -21,11 +21,11 @@ p
     
         empty_vectors = Vectors(StringStore())
     
    -    vectors = Vectors([u'cat'], 300)
    +    vectors = Vectors([u'cat'], width=300)
         vectors[u'cat'] = numpy.random.uniform(-1, 1, (300,))
     
         vector_table = numpy.zeros((3, 300), dtype='f')
    -    vectors = Vectors(StringStore(), vector_table)
    +    vectors = Vectors(StringStore(), data=vector_table)
     
     +table(["Name", "Type", "Description"])
         +row
    @@ -36,9 +36,12 @@ p
                 |  that maps strings to hash values, and vice versa.
     
         +row
    -        +cell #[code data_or_width]
    -        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] or int
    -        +cell Vector data or number of dimensions.
    +        +cell #[code data]
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +
    +    +row
    +        +cell #[code width]
    +        +cell Number of dimensions.
     
         +row("foot")
             +cell returns
    
    From cfae54c507ab24a1da36d3008484d2ac8edb3071 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:19:04 +0200
    Subject: [PATCH 439/649] Make change to Vectors.__init__
    
    ---
     spacy/vectors.pyx | 6 +++++-
     1 file changed, 5 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx
    index cea583110..fa5fcf624 100644
    --- a/spacy/vectors.pyx
    +++ b/spacy/vectors.pyx
    @@ -32,7 +32,7 @@ cdef class Vectors:
         cdef public object keys
         cdef public int i
     
    -    def __init__(self, strings, data=None, width=0):
    +    def __init__(self, strings, width=0, data=None):
             if isinstance(strings, StringStore):
                 self.strings = strings
             else:
    @@ -46,6 +46,10 @@ cdef class Vectors:
             self.i = 0
             self.key2row = {}
             self.keys = numpy.zeros((self.data.shape[0],), dtype='uint64')
    +        for i, string in enumerate(self.strings):
    +            if i >= self.data.shape[0]:
    +                break
    +            self.add(self.strings[string], self.data[i])
     
         def __reduce__(self):
             return (Vectors, (self.strings, self.data))
    
    From 33229b1c9ef53a49a3bbd00d61ca02c28c5481c8 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:19:29 +0200
    Subject: [PATCH 440/649] Remove print statement
    
    ---
     spacy/vocab.pyx | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index e6ba9944b..2e189a02b 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -63,7 +63,6 @@ cdef class Vocab:
                 for string in strings:
                     _ = self[string]
             self.lex_attr_getters = lex_attr_getters
    -        print("Create morphology", list(self.strings), tag_map)
             self.morphology = Morphology(self.strings, tag_map, lemmatizer)
             self.vectors = Vectors(self.strings, width=0)
     
    
    From 9010a1a0603fba85143bcd859b88aaed59937a9a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:19:46 +0200
    Subject: [PATCH 441/649] Create vectors correctly
    
    ---
     spacy/vocab.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index 2e189a02b..3f96b5144 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -252,7 +252,7 @@ cdef class Vocab:
             """
             if new_dim is None:
                 new_dim = self.vectors.data.shape[1]
    -        self.vectors = Vectors(self.strings, new_dim)
    +        self.vectors = Vectors(self.strings, width=new_dim)
     
         def get_vector(self, orth):
             """Retrieve a vector for a word in the vocabulary.
    
    From 3faf9189a275c775fe04aafc56ac95a1cb4393b2 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 16:23:31 +0200
    Subject: [PATCH 442/649] Make parser hidden shape consistent even if maxout==1
    
    ---
     spacy/_ml.py | 19 ++++++++++---------
     1 file changed, 10 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 934832a63..8d1b81048 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -110,17 +110,19 @@ def _preprocess_doc(docs, drop=0.):
         nI=Dimension("Input size"),
         nF=Dimension("Number of features"),
         nO=Dimension("Output size"),
    +    nP=Dimension("Maxout pieces"),
         W=Synapses("Weights matrix",
    -        lambda obj: (obj.nF, obj.nO, obj.nI)),
    +        lambda obj: (obj.nF, obj.nO, obj.nP, obj.nI)),
         b=Biases("Bias vector",
    -        lambda obj: (obj.nO,)),
    +        lambda obj: (obj.nO, obj.nP)),
         d_W=Gradient("W"),
         d_b=Gradient("b")
     )
     class PrecomputableAffine(Model):
    -    def __init__(self, nO=None, nI=None, nF=None, **kwargs):
    +    def __init__(self, nO=None, nI=None, nF=None, nP=None, **kwargs):
             Model.__init__(self, **kwargs)
             self.nO = nO
    +        self.nP = nP
             self.nI = nI
             self.nF = nF
     
    @@ -128,16 +130,16 @@ class PrecomputableAffine(Model):
             tensordot = self.ops.xp.tensordot
             ascontiguous = self.ops.xp.ascontiguousarray
     
    -        Yf = tensordot(X, self.W, axes=[[1], [2]])
    +        Yf = tensordot(X, self.W, axes=[[1], [3]])
     
             def backward(dY_ids, sgd=None):
                 dY, ids = dY_ids
                 Xf = X[ids]
     
    -            dXf = tensordot(dY, self.W, axes=[[1], [1]])
    +            dXf = tensordot(dY, self.W, axes=[[1,2], [1,2]])
                 dW = tensordot(dY, Xf, axes=[[0], [0]])
    -
    -            self.d_W += dW.transpose((1, 0, 2))
    +            # (o, p, f, i) --> (f, o, p, i)
    +            self.d_W += dW.transpose((2, 0, 1, 3))
                 self.d_b += dY.sum(axis=0)
     
                 if sgd is not None:
    @@ -167,11 +169,10 @@ class PrecomputableAffine(Model):
     
             def predict(ids, tokvecs):
                 hiddens = model(tokvecs)
    -            vector = model.ops.allocate((hiddens.shape[0], model.nO))
    +            vector = model.ops.allocate((hiddens.shape[0], model.nO, model.nP))
                 model.ops.scatter_add(vector, ids, hiddens)
                 vector += model.b
                 if model.nP >= 2:
    -                vector = vector.reshape((ids.shape[0], model.nO//model.nP, model.nP))
                     return model.ops.maxout(vector)[0]
                 else:
                     return vector * (vector >= 0)
    
    From 10367981553bcf1b7361cdbb76bdb50ad9d06b6f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 16:24:16 +0200
    Subject: [PATCH 443/649] Make parser consistent if maxout==1
    
    ---
     spacy/syntax/nn_parser.pyx | 13 ++++++-------
     1 file changed, 6 insertions(+), 7 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 465e4d877..f95d4e0cd 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -136,7 +136,8 @@ cdef class precompute_hiddens:
             return self.begin_update(X)[0]
     
         def begin_update(self, token_ids, drop=0.):
    -        cdef np.ndarray state_vector = numpy.zeros((token_ids.shape[0], self.nO*self.nP), dtype='f')
    +        cdef np.ndarray state_vector = numpy.zeros(
    +            (token_ids.shape[0], self.nO, self.nP), dtype='f')
             # This is tricky, but (assuming GPU available);
             # - Input to forward on CPU
             # - Output from forward on CPU
    @@ -166,16 +167,13 @@ cdef class precompute_hiddens:
                 mask = state_vector >= 0.
                 state_vector *= mask
             else:
    -            state_vector = state_vector.reshape(
    -                (state_vector.shape[0], self.nO, self.nP))
                 state_vector, mask = self.ops.maxout(state_vector)
     
             def backprop_nonlinearity(d_best, sgd=None):
                 if self.nP == 1:
                     return d_best * mask
                 else:
    -                d_vector = self.ops.backprop_maxout(d_best, mask, self.nP)
    -                return d_vector.reshape((d_vector.shape[0], self.nO*self.nP))
    +                return self.ops.backprop_maxout(d_best, mask, self.nP)
             return state_vector, backprop_nonlinearity
     
     
    @@ -266,8 +264,9 @@ cdef class Parser:
             tok2vec = Tok2Vec(token_vector_width, embed_size,
                               pretrained_dims=cfg.get('pretrained_dims', 0))
             tok2vec = chain(tok2vec, flatten)
    -        lower = PrecomputableAffine(hidden_width * parser_maxout_pieces,
    -                    nF=cls.nr_feature, nI=token_vector_width)
    +        lower = PrecomputableAffine(hidden_width,
    +                    nF=cls.nr_feature, nI=token_vector_width,
    +                    nP=parser_maxout_pieces)
             lower.nP = parser_maxout_pieces
     
             with Model.use_device('cpu'):
    
    From f111b228e0bcd65a9b852f2687a7441628355bba Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 16:24:48 +0200
    Subject: [PATCH 444/649] Fix re-parsing of previously parsed text
    
    If a Doc object had been previously parsed, it was possible for
    invalid parses to be added. There were two problems:
    
    1) The parse was only being partially erased
    2) The RightArc action was able to create a 1-cycle.
    
    This patch fixes both errors, and avoids resetting the parse if one is
    present. In theory this might allow a better parse to be predicted by
    running the parser twice.
    
    Closes #1253.
    ---
     spacy/syntax/arc_eager.pyx               | 14 ++++++++++----
     spacy/tests/regression/test_issue1253.py | 20 ++++++++++++++++++++
     2 files changed, 30 insertions(+), 4 deletions(-)
     create mode 100644 spacy/tests/regression/test_issue1253.py
    
    diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx
    index 9770383d1..8adb8e52c 100644
    --- a/spacy/syntax/arc_eager.pyx
    +++ b/spacy/syntax/arc_eager.pyx
    @@ -212,7 +212,8 @@ cdef class LeftArc:
     cdef class RightArc:
         @staticmethod
         cdef bint is_valid(const StateC* st, attr_t label) nogil:
    -        return st.B_(0).sent_start != 1
    +        # If there's (perhaps partial) parse pre-set, don't allow cycle.
    +        return st.B_(0).sent_start != 1 and st.H(st.S(0)) != st.B(0)
     
         @staticmethod
         cdef int transition(StateC* st, attr_t label) nogil:
    @@ -446,14 +447,19 @@ cdef class ArcEager(TransitionSystem):
     
         cdef int initialize_state(self, StateC* st) nogil:
             for i in range(st.length):
    -            st._sent[i].l_edge = i
    -            st._sent[i].r_edge = i
    +            if st._sent[i].dep == 0:
    +                st._sent[i].l_edge = i
    +                st._sent[i].r_edge = i
    +                st._sent[i].head = 0
    +                st._sent[i].dep = 0
    +                st._sent[i].l_kids = 0
    +                st._sent[i].r_kids = 0
             st.fast_forward()
     
         cdef int finalize_state(self, StateC* st) nogil:
             cdef int i
             for i in range(st.length):
    -            if st._sent[i].head == 0 and st._sent[i].dep == 0:
    +            if st._sent[i].head == 0:
                     st._sent[i].dep = self.root_label
     
         def finalize_doc(self, doc):
    diff --git a/spacy/tests/regression/test_issue1253.py b/spacy/tests/regression/test_issue1253.py
    new file mode 100644
    index 000000000..2fe77d6d8
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1253.py
    @@ -0,0 +1,20 @@
    +from __future__ import unicode_literals
    +import pytest
    +import spacy
    +
    +
    +def ss(tt):
    +    for i in range(len(tt)-1):
    +        for j in range(i+1, len(tt)):
    +            tt[i:j].root
    +
    +
    +@pytest.mark.models('en')
    +def test_access_parse_for_merged():
    +    nlp = spacy.load('en_core_web_sm')
    +    t_t = nlp.tokenizer("Highly rated - I'll definitely")
    +    nlp.tagger(t_t)
    +    nlp.parser(t_t)
    +    nlp.parser(t_t)
    +    ss(t_t)
    +
    
    From d8391b1c4d344f12c89d78bce64779b24b35d658 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 16:49:36 +0200
    Subject: [PATCH 445/649] Fix #1434: Matcher failed on ending ? if no token
    
    ---
     spacy/matcher.pyx                        |  2 +-
     spacy/tests/regression/test_issue1434.py | 22 ++++++++++++++++++++++
     2 files changed, 23 insertions(+), 1 deletion(-)
     create mode 100644 spacy/tests/regression/test_issue1434.py
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 24d0a9836..fa67f32d6 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -391,7 +391,7 @@ cdef class Matcher:
                         matches.append((ent_id, start, end))
             # Look for open patterns that are actually satisfied
             for state in partials:
    -            while state.second.quantifier in (ZERO, ZERO_PLUS):
    +            while state.second.quantifier in (ZERO, ZERO_ONE, ZERO_PLUS):
                     state.second += 1
                     if state.second.nr_attr == 0:
                         start = state.first
    diff --git a/spacy/tests/regression/test_issue1434.py b/spacy/tests/regression/test_issue1434.py
    new file mode 100644
    index 000000000..ec3a34bb0
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1434.py
    @@ -0,0 +1,22 @@
    +from __future__ import unicode_literals
    +
    +from spacy.tokens import Doc
    +from spacy.vocab import Vocab
    +from spacy.matcher import Matcher
    +from spacy.lang.lex_attrs import LEX_ATTRS
    +
    +
    +def test_issue1434():
    +    '''Test matches occur when optional element at end of short doc'''
    +    vocab = Vocab(lex_attr_getters=LEX_ATTRS)
    +    hello_world = Doc(vocab, words=['Hello', 'World'])
    +    hello = Doc(vocab, words=['Hello'])
    +
    +    matcher = Matcher(vocab)
    +    matcher.add('MyMatcher', None,
    +        [ {'ORTH': 'Hello' }, {'IS_ALPHA': True, 'OP': '?'} ])
    +
    +    matches = matcher(hello_world)
    +    assert matches
    +    matches = matcher(hello)
    +    assert matches
    
    From d2fe56a5779fbc56b1b8db2b16dc45443d1e076c Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Fri, 20 Oct 2017 23:58:00 +0530
    Subject: [PATCH 446/649] Add LCA matrix for spans and docs
    
    ---
     spacy/tests/doc/test_doc_api.py |  7 +++++
     spacy/tests/spans/test_span.py  | 11 ++++++++
     spacy/tokens/doc.pyx            | 48 +++++++++++++++++++++++++++++++
     spacy/tokens/span.pyx           | 50 +++++++++++++++++++++++++++++++++
     4 files changed, 116 insertions(+)
    
    diff --git a/spacy/tests/doc/test_doc_api.py b/spacy/tests/doc/test_doc_api.py
    index cbe1bbc66..5e052f771 100644
    --- a/spacy/tests/doc/test_doc_api.py
    +++ b/spacy/tests/doc/test_doc_api.py
    @@ -217,6 +217,13 @@ def test_doc_api_has_vector(en_tokenizer, text_file, text, vectors):
         doc = en_tokenizer(text)
         assert doc.has_vector
     
    +def test_lowest_common_ancestor(en_tokenizer):
    +    tokens = en_tokenizer('the lazy dog slept')
    +    doc = get_doc(tokens.vocab, [t.text for t in tokens], heads=[2, 1, 1, 0])
    +    lca = doc.get_lca_matrix()
    +    assert(lca[1, 1] == 1)
    +    assert(lca[0, 1] == 2)
    +    assert(lca[1, 2] == 2)
     
     def test_parse_tree(en_tokenizer):
         """Tests doc.print_tree() method."""
    diff --git a/spacy/tests/spans/test_span.py b/spacy/tests/spans/test_span.py
    index 7ed9333b8..5e7c638b6 100644
    --- a/spacy/tests/spans/test_span.py
    +++ b/spacy/tests/spans/test_span.py
    @@ -55,6 +55,17 @@ def test_spans_span_sent(doc):
         assert doc[6:7].sent.root.left_edge.text == 'This'
     
     
    +def test_spans_lca_matrix(en_tokenizer):
    +    """Test span's lca matrix generation"""
    +    tokens = en_tokenizer('the lazy dog slept')
    +    doc = get_doc(tokens.vocab, [t.text for t in tokens], heads=[2, 1, 1, 0])
    +    lca = doc[:2].get_lca_matrix()
    +    assert(lca[0, 0] == 0)
    +    assert(lca[0, 1] == -1)
    +    assert(lca[1, 0] == -1)
    +    assert(lca[1, 1] == 1)
    +
    +
     def test_spans_default_sentiment(en_tokenizer):
         """Test span.sentiment property's default averaging behaviour"""
         text = "good stuff bad stuff"
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 809f178f8..fa5b4ba28 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -660,6 +660,54 @@ cdef class Doc:
             self.is_tagged = bool(TAG in attrs or POS in attrs)
             return self
     
    +    def get_lca_matrix(self):
    +        '''
    +        Calculates the lowest common ancestor matrix
    +        for a given Spacy doc.
    +        Returns LCA matrix containing the integer index
    +        of the ancestor, or -1 if no common ancestor is
    +        found (ex if span excludes a necessary ancestor).
    +        Apologies about the recursion, but the
    +        impact on performance is negligible given
    +        the natural limitations on the depth of a typical human sentence.
    +        '''
    +        # Efficiency notes:
    +        #
    +        # We can easily improve the performance here by iterating in Cython.
    +        # To loop over the tokens in Cython, the easiest way is:
    +        # for token in doc.c[:doc.c.length]:
    +        #     head = token + token.head
    +        # Both token and head will be TokenC* here. The token.head attribute
    +        # is an integer offset.
    +        def __pairwise_lca(token_j, token_k, lca_matrix):
    +            if lca_matrix[token_j.i][token_k.i] != -2:
    +                return lca_matrix[token_j.i][token_k.i]
    +            elif token_j == token_k:
    +                lca_index = token_j.i
    +            elif token_k.head == token_j:
    +                lca_index = token_j.i
    +            elif token_j.head == token_k:
    +                lca_index = token_k.i
    +            elif (token_j.head == token_j) and (token_k.head == token_k):
    +                lca_index = -1
    +            else:
    +                lca_index = __pairwise_lca(token_j.head, token_k.head, lca_matrix)
    +            lca_matrix[token_j.i][token_k.i] = lca_index
    +            lca_matrix[token_k.i][token_j.i] = lca_index
    +
    +            return lca_index
    +
    +        lca_matrix = numpy.empty((len(self), len(self)), dtype=numpy.int32)
    +        lca_matrix.fill(-2)
    +        for j in range(len(self)):
    +            token_j = self[j]
    +            for k in range(j, len(self)):
    +                token_k = self[k]
    +                lca_matrix[j][k] = __pairwise_lca(token_j, token_k, lca_matrix)
    +                lca_matrix[k][j] = lca_matrix[j][k]
    +
    +        return lca_matrix
    +
         def to_disk(self, path, **exclude):
             """Save the current state to a directory.
     
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 3b31c50c0..b0a170ddf 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -177,6 +177,56 @@ cdef class Span:
                 return 0.0
             return numpy.dot(self.vector, other.vector) / (self.vector_norm * other.vector_norm)
     
    +    def get_lca_matrix(self):
    +        '''
    +        Calculates the lowest common ancestor matrix
    +        for a given Spacy span.
    +        Returns LCA matrix containing the integer index
    +        of the ancestor, or -1 if no common ancestor is
    +        found (ex if span excludes a necessary ancestor).
    +        Apologies about the recursion, but the
    +        impact on performance is negligible given
    +        the natural limitations on the depth of a typical human sentence.
    +        '''
    +
    +        def __pairwise_lca(token_j, token_k, lca_matrix, margins):
    +            offset = margins[0]
    +            token_k_head = token_k.head if token_k.head.i in range(*margins) else token_k
    +            token_j_head = token_j.head if token_j.head.i in range(*margins) else token_j
    +            token_j_i = token_j.i - offset
    +            token_k_i = token_k.i - offset
    +
    +            if lca_matrix[token_j_i][token_k_i] != -2:
    +                return lca_matrix[token_j_i][token_k_i]
    +            elif token_j == token_k:
    +                lca_index = token_j_i
    +            elif token_k_head == token_j:
    +                lca_index = token_j_i
    +            elif token_j_head == token_k:
    +                lca_index = token_k_i
    +            elif (token_j_head == token_j) and (token_k_head == token_k):
    +                lca_index = -1
    +            else:
    +                lca_index = __pairwise_lca(token_j_head, token_k_head, lca_matrix, margins)
    +
    +            lca_matrix[token_j_i][token_k_i] = lca_index
    +            lca_matrix[token_k_i][token_j_i] = lca_index
    +
    +            return lca_index
    +
    +        lca_matrix = numpy.empty((len(self), len(self)), dtype=numpy.int32)
    +        lca_matrix.fill(-2)
    +        margins = [self.start, self.end]
    +
    +        for j in range(len(self)):
    +            token_j = self[j]
    +            for k in range(len(self)):
    +                token_k = self[k]
    +                lca_matrix[j][k] = __pairwise_lca(token_j, token_k, lca_matrix, margins)
    +                lca_matrix[k][j] = lca_matrix[j][k]
    +
    +        return lca_matrix
    +
         cpdef np.ndarray to_array(self, object py_attr_ids):
             """Given a list of M attribute IDs, export the tokens to a numpy
             `ndarray` of shape `(N, M)`, where `N` is the length of the document.
    
    From 8f8bccecb9427448563b2d2c4c3cf7fb4eecdfb1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 21 Oct 2017 00:51:42 +0200
    Subject: [PATCH 447/649] Patch deserialisation for invalid loads, to avoid
     model failure
    
    ---
     spacy/vocab.pyx | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index 205e5a2af..da4d21026 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -400,6 +400,7 @@ cdef class Vocab:
             cdef int j = 0
             cdef SerializedLexemeC lex_data
             chunk_size = sizeof(lex_data.data)
    +        cdef void* ptr
             cdef unsigned char* bytes_ptr = bytes_data
             for i in range(0, len(bytes_data), chunk_size):
                 lexeme = self.mem.alloc(1, sizeof(LexemeC))
    @@ -407,6 +408,9 @@ cdef class Vocab:
                     lex_data.data[j] = bytes_ptr[i+j]
                 Lexeme.c_from_bytes(lexeme, lex_data)
     
    +            ptr = self.strings._map.get(lexeme.orth)
    +            if ptr == NULL:
    +                continue
                 py_str = self.strings[lexeme.orth]
                 assert self.strings[py_str] == lexeme.orth, (py_str, lexeme.orth)
                 key = hash_string(py_str)
    
    From 490ad3eaf070f2e210869c37b70edf3fcd504da7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 21 Oct 2017 00:52:14 +0200
    Subject: [PATCH 448/649] Check that empty strings are handled. Closes #1242
    
    ---
     spacy/tests/regression/test_issue1242.py | 23 +++++++++++++++++++++++
     1 file changed, 23 insertions(+)
     create mode 100644 spacy/tests/regression/test_issue1242.py
    
    diff --git a/spacy/tests/regression/test_issue1242.py b/spacy/tests/regression/test_issue1242.py
    new file mode 100644
    index 000000000..50dc8c37e
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1242.py
    @@ -0,0 +1,23 @@
    +from __future__ import unicode_literals
    +import pytest
    +from ...lang.en import English
    +from ...util import load_model
    +
    +
    +def test_issue1242_empty_strings():
    +    nlp = English()
    +    doc = nlp('')
    +    assert len(doc) == 0
    +    docs = list(nlp.pipe(['', 'hello']))
    +    assert len(docs[0]) == 0
    +    assert len(docs[1]) == 1
    +
    +
    +@pytest.mark.models('en')
    +def test_issue1242_empty_strings_en_core_web_sm():
    +    nlp = load_model('en_core_web_sm')
    +    doc = nlp('')
    +    assert len(doc) == 0
    +    docs = list(nlp.pipe(['', 'hello']))
    +    assert len(docs[0]) == 0
    +    assert len(docs[1]) == 1
    
    From 84c6c20d1c640f665ff98ef8c11b69a2d4038812 Mon Sep 17 00:00:00 2001
    From: Jeroen Bobbeldijk 
    Date: Sun, 22 Oct 2017 15:18:36 +0200
    Subject: [PATCH 449/649] Fix #1444: fix pipeline logic and wrong paramater in
     update call
    
    ---
     examples/training/train_new_entity_type.py | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py
    index ab69285a6..5f10beebc 100644
    --- a/examples/training/train_new_entity_type.py
    +++ b/examples/training/train_new_entity_type.py
    @@ -56,8 +56,7 @@ def train_ner(nlp, train_data, output_dir):
             losses = {}
             for batch in minibatch(get_gold_parses(nlp.make_doc, train_data), size=3):
                 docs, golds = zip(*batch)
    -            nlp.update(docs, golds, losses=losses, sgd=optimizer, update_shared=True,
    -                       drop=0.35)
    +            nlp.update(docs, golds, losses=losses, sgd=optimizer, drop=0.35)
             print(losses)
         if not output_dir:
             return
    @@ -100,9 +99,10 @@ def main(model_name, output_directory=None):
             )
     
         ]
    -    nlp.pipeline.append(TokenVectorEncoder(nlp.vocab))
    -    nlp.pipeline.append(NeuralEntityRecognizer(nlp.vocab))
    -    nlp.pipeline[-1].add_label('ANIMAL')
    +    nlp.add_pipe(TokenVectorEncoder(nlp.vocab))
    +    ner = NeuralEntityRecognizer(nlp.vocab)
    +    ner.add_label('ANIMAL')
    +    nlp.add_pipe(ner)
         train_ner(nlp, train_data, output_directory)
     
         # Test that the entity is recognized
    
    From a31f048b4d05ff5b30ff456de0460f51a192ee75 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 23 Oct 2017 10:38:06 +0200
    Subject: [PATCH 450/649] Fix formatting
    
    ---
     spacy/tokens/span.pyx | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 3b31c50c0..05dcce1ba 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -129,6 +129,7 @@ cdef class Span:
         def _(self):
             return Underscore(Underscore.span_extensions, self,
                               start=self.start_char, end=self.end_char)
    +
         def as_doc(self):
             '''Create a Doc object view of the Span's data.
     
    
    From 3f0a157b33a24c63b52c7c714a55573a0f096398 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 23 Oct 2017 10:38:13 +0200
    Subject: [PATCH 451/649] Fix typo
    
    ---
     website/api/span.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 6bff45a9b..399d0bd33 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -284,7 +284,7 @@ p Retokenize the document, such that the span is merged into a single token.
     
     +aside-code("Example").
         doc = nlp(u'I like New York in Autumn.')
    -    span = doc[2:3]
    +    span = doc[2:4]
         span.merge()
         assert len(doc) == 6
         assert doc[2].text == 'New York'
    
    From db15902e84df8c3187479afb8ccfc3ae02aedb33 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 23 Oct 2017 10:38:21 +0200
    Subject: [PATCH 452/649] Tidy up
    
    ---
     website/assets/css/_components/_code.sass       | 1 -
     website/assets/css/_components/_navigation.sass | 3 ---
     2 files changed, 4 deletions(-)
    
    diff --git a/website/assets/css/_components/_code.sass b/website/assets/css/_components/_code.sass
    index f83e96d29..eaf0980e1 100644
    --- a/website/assets/css/_components/_code.sass
    +++ b/website/assets/css/_components/_code.sass
    @@ -63,7 +63,6 @@ code
         padding: 0.2rem 0.4rem
         border-radius: 0.25rem
         font-family: $font-code
    -    white-space: nowrap
         margin: 0
         box-decoration-break: clone
         white-space: nowrap
    diff --git a/website/assets/css/_components/_navigation.sass b/website/assets/css/_components/_navigation.sass
    index 0e4af8267..1543de5fb 100644
    --- a/website/assets/css/_components/_navigation.sass
    +++ b/website/assets/css/_components/_navigation.sass
    @@ -14,9 +14,6 @@
         width: 100%
         box-shadow: $box-shadow
     
    -    //@include breakpoint(min, md)
    -    //    position: fixed
    -
         &.is-fixed
             animation: slideInDown 0.5s ease-in-out
             position: fixed
    
    From 7701984f13913a4f114e42f4e0bb009e8c4f6c47 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 23 Oct 2017 10:38:27 +0200
    Subject: [PATCH 453/649] Document Span.as_doc
    
    ---
     website/api/span.jade | 19 +++++++++++++++++++
     1 file changed, 19 insertions(+)
    
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 399d0bd33..2a55409f1 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -302,6 +302,25 @@ p Retokenize the document, such that the span is merged into a single token.
             +cell #[code Token]
             +cell The newly merged token.
     
    ++h(2, "as_doc") Span.as_doc
    +
    +p
    +    |  Create a #[code Doc] object view of the #[code Span]'s data. Mostly
    +    |  useful for C-typed interfaces.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn.')
    +    span = doc[2:4]
    +    doc2 = span.as_doc()
    +    assert doc2.text == 'New York'
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Doc]
    +        +cell A #[code Doc] object of the #[code Span]'s content.
    +
    +
     +h(2, "root") Span.root
         +tag property
         +tag-model("parse")
    
    From e7556ff048cb0c15b9fdae303852e1bb72925936 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 23 Oct 2017 18:16:23 +0200
    Subject: [PATCH 454/649] Fix non-maxout parser
    
    ---
     spacy/syntax/nn_parser.pyx | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f95d4e0cd..eb33d4a7b 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -117,7 +117,7 @@ cdef class precompute_hiddens:
                 cached = gpu_cached
             self.nF = cached.shape[1]
             self.nP = getattr(lower_model, 'nP', 1)
    -        self.nO = cached.shape[2] // self.nP
    +        self.nO = cached.shape[2]
             self.ops = lower_model.ops
             self.bias = lower_model.b
             self._is_synchronized = False
    @@ -150,7 +150,7 @@ cdef class precompute_hiddens:
             sum_state_features(state_vector.data,
                 feat_weights, &ids[0,0],
                 token_ids.shape[0], self.nF, self.nO*self.nP)
    -        state_vector += self.bias.ravel()
    +        state_vector += self.bias
             state_vector, bp_nonlinearity = self._nonlinearity(state_vector)
     
             def backward(d_state_vector, sgd=None):
    @@ -164,6 +164,7 @@ cdef class precompute_hiddens:
     
         def _nonlinearity(self, state_vector):
             if self.nP == 1:
    +            state_vector = state_vector.reshape(state_vector.shape[:-1])
                 mask = state_vector >= 0.
                 state_vector *= mask
             else:
    @@ -171,7 +172,9 @@ cdef class precompute_hiddens:
     
             def backprop_nonlinearity(d_best, sgd=None):
                 if self.nP == 1:
    -                return d_best * mask
    +                d_best *= mask
    +                d_best = d_best.reshape((d_best.shape + (1,)))
    +                return d_best
                 else:
                     return self.ops.backprop_maxout(d_best, mask, self.nP)
             return state_vector, backprop_nonlinearity
    
    From 667575500564355621f0dbaabaf4209e3fe6b24a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 12:05:10 +0200
    Subject: [PATCH 455/649] Add training data JSON example
    
    ---
     examples/training/training-data.json | 1103 ++++++++++++++++++++++++++
     1 file changed, 1103 insertions(+)
     create mode 100644 examples/training/training-data.json
    
    diff --git a/examples/training/training-data.json b/examples/training/training-data.json
    new file mode 100644
    index 000000000..8b4956f05
    --- /dev/null
    +++ b/examples/training/training-data.json
    @@ -0,0 +1,1103 @@
    +[
    +  {
    +    "id":0,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"prep",
    +                "head":44,
    +                "tag":"IN",
    +                "orth":"In"
    +              },
    +              {
    +                "dep":"det",
    +                "head":3,
    +                "tag":"DT",
    +                "orth":"an"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":2,
    +                "tag":"NNP",
    +                "orth":"Oct."
    +              },
    +              {
    +                "dep":"num",
    +                "head":1,
    +                "tag":"CD",
    +                "orth":"19"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-4,
    +                "tag":"NN",
    +                "orth":"review"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-1,
    +                "tag":"IN",
    +                "orth":"of"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":2,
    +                "tag":"``",
    +                "orth":"``"
    +              },
    +              {
    +                "dep":"det",
    +                "head":1,
    +                "tag":"DT",
    +                "orth":"The"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-3,
    +                "tag":"NN",
    +                "orth":"Misanthrope"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-1,
    +                "tag":"''",
    +                "orth":"''"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-2,
    +                "tag":"IN",
    +                "orth":"at"
    +              },
    +              {
    +                "dep":"poss",
    +                "head":3,
    +                "tag":"NNP",
    +                "orth":"Chicago"
    +              },
    +              {
    +                "dep":"possessive",
    +                "head":-1,
    +                "tag":"POS",
    +                "orth":"'s"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Goodman"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-4,
    +                "tag":"NNP",
    +                "orth":"Theatre"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":4,
    +                "tag":"-LRB-",
    +                "orth":"-LRB-"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":3,
    +                "tag":"``",
    +                "orth":"``"
    +              },
    +              {
    +                "dep":"amod",
    +                "head":1,
    +                "tag":"VBN",
    +                "orth":"Revitalized"
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":1,
    +                "tag":"NNS",
    +                "orth":"Classics"
    +              },
    +              {
    +                "dep":"dep",
    +                "head":-15,
    +                "tag":"VBP",
    +                "orth":"Take"
    +              },
    +              {
    +                "dep":"det",
    +                "head":1,
    +                "tag":"DT",
    +                "orth":"the"
    +              },
    +              {
    +                "dep":"dobj",
    +                "head":-2,
    +                "tag":"NN",
    +                "orth":"Stage"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-3,
    +                "tag":"IN",
    +                "orth":"in"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Windy"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-2,
    +                "tag":"NNP",
    +                "orth":"City"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-6,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-7,
    +                "tag":"''",
    +                "orth":"''"
    +              },
    +              {
    +                "dep":"dep",
    +                "head":-8,
    +                "tag":"NN",
    +                "orth":"Leisure"
    +              },
    +              {
    +                "dep":"cc",
    +                "head":-1,
    +                "tag":"CC",
    +                "orth":"&"
    +              },
    +              {
    +                "dep":"conj",
    +                "head":-2,
    +                "tag":"NNS",
    +                "orth":"Arts"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-11,
    +                "tag":"-RRB-",
    +                "orth":"-RRB-"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":13,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"det",
    +                "head":1,
    +                "tag":"DT",
    +                "orth":"the"
    +              },
    +              {
    +                "dep":"nsubjpass",
    +                "head":11,
    +                "tag":"NN",
    +                "orth":"role"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-1,
    +                "tag":"IN",
    +                "orth":"of"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-1,
    +                "tag":"NNP",
    +                "orth":"Celimene"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-3,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"partmod",
    +                "head":-4,
    +                "tag":"VBN",
    +                "orth":"played"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-1,
    +                "tag":"IN",
    +                "orth":"by"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Kim"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-2,
    +                "tag":"NNP",
    +                "orth":"Cattrall"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-8,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"auxpass",
    +                "head":2,
    +                "tag":"VBD",
    +                "orth":"was"
    +              },
    +              {
    +                "dep":"advmod",
    +                "head":1,
    +                "tag":"RB",
    +                "orth":"mistakenly"
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"VBN",
    +                "orth":"attributed"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-1,
    +                "tag":"TO",
    +                "orth":"to"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Christina"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-2,
    +                "tag":"NNP",
    +                "orth":"Haag"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-4,
    +                "tag":".",
    +                "orth":"."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  },
    +  {
    +    "id":1,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Ms."
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Haag"
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"VBZ",
    +                "orth":"plays"
    +              },
    +              {
    +                "dep":"dobj",
    +                "head":-1,
    +                "tag":"NNP",
    +                "orth":"Elianti"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-2,
    +                "tag":".",
    +                "orth":"."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  },
    +  {
    +    "id":2,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"nn",
    +                "head":3,
    +                "tag":"NNP",
    +                "orth":"Rolls-Royce"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":2,
    +                "tag":"NNP",
    +                "orth":"Motor"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNPS",
    +                "orth":"Cars"
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Inc."
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"VBD",
    +                "orth":"said"
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":1,
    +                "tag":"PRP",
    +                "orth":"it"
    +              },
    +              {
    +                "dep":"ccomp",
    +                "head":-2,
    +                "tag":"VBZ",
    +                "orth":"expects"
    +              },
    +              {
    +                "dep":"poss",
    +                "head":2,
    +                "tag":"PRP$",
    +                "orth":"its"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"U.S."
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":3,
    +                "tag":"NNS",
    +                "orth":"sales"
    +              },
    +              {
    +                "dep":"aux",
    +                "head":2,
    +                "tag":"TO",
    +                "orth":"to"
    +              },
    +              {
    +                "dep":"cop",
    +                "head":1,
    +                "tag":"VB",
    +                "orth":"remain"
    +              },
    +              {
    +                "dep":"xcomp",
    +                "head":-6,
    +                "tag":"JJ",
    +                "orth":"steady"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-1,
    +                "tag":"IN",
    +                "orth":"at"
    +              },
    +              {
    +                "dep":"quantmod",
    +                "head":1,
    +                "tag":"IN",
    +                "orth":"about"
    +              },
    +              {
    +                "dep":"num",
    +                "head":1,
    +                "tag":"CD",
    +                "orth":"1,200"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-3,
    +                "tag":"NNS",
    +                "orth":"cars"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-5,
    +                "tag":"IN",
    +                "orth":"in"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-1,
    +                "tag":"CD",
    +                "orth":"1990"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-15,
    +                "tag":".",
    +                "orth":"."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  },
    +  {
    +    "id":3,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"det",
    +                "head":3,
    +                "tag":"DT",
    +                "orth":"The"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":2,
    +                "tag":"NN",
    +                "orth":"luxury"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NN",
    +                "orth":"auto"
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":3,
    +                "tag":"NN",
    +                "orth":"maker"
    +              },
    +              {
    +                "dep":"amod",
    +                "head":1,
    +                "tag":"JJ",
    +                "orth":"last"
    +              },
    +              {
    +                "dep":"tmod",
    +                "head":1,
    +                "tag":"NN",
    +                "orth":"year"
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"VBD",
    +                "orth":"sold"
    +              },
    +              {
    +                "dep":"num",
    +                "head":1,
    +                "tag":"CD",
    +                "orth":"1,214"
    +              },
    +              {
    +                "dep":"dobj",
    +                "head":-2,
    +                "tag":"NNS",
    +                "orth":"cars"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-3,
    +                "tag":"IN",
    +                "orth":"in"
    +              },
    +              {
    +                "dep":"det",
    +                "head":1,
    +                "tag":"DT",
    +                "orth":"the"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-2,
    +                "tag":"NNP",
    +                "orth":"U.S."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  },
    +  {
    +    "id":4,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Howard"
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":8,
    +                "tag":"NNP",
    +                "orth":"Mosher"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-1,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"appos",
    +                "head":-2,
    +                "tag":"NN",
    +                "orth":"president"
    +              },
    +              {
    +                "dep":"cc",
    +                "head":-1,
    +                "tag":"CC",
    +                "orth":"and"
    +              },
    +              {
    +                "dep":"amod",
    +                "head":2,
    +                "tag":"JJ",
    +                "orth":"chief"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NN",
    +                "orth":"executive"
    +              },
    +              {
    +                "dep":"conj",
    +                "head":-4,
    +                "tag":"NN",
    +                "orth":"officer"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-7,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"VBD",
    +                "orth":"said"
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":1,
    +                "tag":"PRP",
    +                "orth":"he"
    +              },
    +              {
    +                "dep":"ccomp",
    +                "head":-2,
    +                "tag":"VBZ",
    +                "orth":"anticipates"
    +              },
    +              {
    +                "dep":"dobj",
    +                "head":-1,
    +                "tag":"NN",
    +                "orth":"growth"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-1,
    +                "tag":"IN",
    +                "orth":"for"
    +              },
    +              {
    +                "dep":"det",
    +                "head":3,
    +                "tag":"DT",
    +                "orth":"the"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":2,
    +                "tag":"NN",
    +                "orth":"luxury"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NN",
    +                "orth":"auto"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-4,
    +                "tag":"NN",
    +                "orth":"maker"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-6,
    +                "tag":"IN",
    +                "orth":"in"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-1,
    +                "tag":"NNP",
    +                "orth":"Britain"
    +              },
    +              {
    +                "dep":"cc",
    +                "head":-1,
    +                "tag":"CC",
    +                "orth":"and"
    +              },
    +              {
    +                "dep":"conj",
    +                "head":-2,
    +                "tag":"NNP",
    +                "orth":"Europe"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-4,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"cc",
    +                "head":-5,
    +                "tag":"CC",
    +                "orth":"and"
    +              },
    +              {
    +                "dep":"conj",
    +                "head":-6,
    +                "tag":"IN",
    +                "orth":"in"
    +              },
    +              {
    +                "dep":"amod",
    +                "head":1,
    +                "tag":"JJ",
    +                "orth":"Far"
    +              },
    +              {
    +                "dep":"amod",
    +                "head":1,
    +                "tag":"JJ",
    +                "orth":"Eastern"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-3,
    +                "tag":"NNS",
    +                "orth":"markets"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-19,
    +                "tag":".",
    +                "orth":"."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  },
    +  {
    +    "id":5,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"nn",
    +                "head":2,
    +                "tag":"NNP",
    +                "orth":"BELL"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"INDUSTRIES"
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Inc."
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"VBD",
    +                "orth":"increased"
    +              },
    +              {
    +                "dep":"poss",
    +                "head":1,
    +                "tag":"PRP$",
    +                "orth":"its"
    +              },
    +              {
    +                "dep":"dobj",
    +                "head":-2,
    +                "tag":"NN",
    +                "orth":"quarterly"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-3,
    +                "tag":"TO",
    +                "orth":"to"
    +              },
    +              {
    +                "dep":"num",
    +                "head":1,
    +                "tag":"CD",
    +                "orth":"10"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-2,
    +                "tag":"NNS",
    +                "orth":"cents"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-6,
    +                "tag":"IN",
    +                "orth":"from"
    +              },
    +              {
    +                "dep":"num",
    +                "head":1,
    +                "tag":"CD",
    +                "orth":"seven"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-2,
    +                "tag":"NNS",
    +                "orth":"cents"
    +              },
    +              {
    +                "dep":"det",
    +                "head":1,
    +                "tag":"DT",
    +                "orth":"a"
    +              },
    +              {
    +                "dep":"npadvmod",
    +                "head":-2,
    +                "tag":"NN",
    +                "orth":"share"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-11,
    +                "tag":".",
    +                "orth":"."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  },
    +  {
    +    "id":6,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"det",
    +                "head":2,
    +                "tag":"DT",
    +                "orth":"The"
    +              },
    +              {
    +                "dep":"amod",
    +                "head":1,
    +                "tag":"JJ",
    +                "orth":"new"
    +              },
    +              {
    +                "dep":"nsubj",
    +                "head":3,
    +                "tag":"NN",
    +                "orth":"rate"
    +              },
    +              {
    +                "dep":"aux",
    +                "head":2,
    +                "tag":"MD",
    +                "orth":"will"
    +              },
    +              {
    +                "dep":"cop",
    +                "head":1,
    +                "tag":"VB",
    +                "orth":"be"
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"JJ",
    +                "orth":"payable"
    +              },
    +              {
    +                "dep":"tmod",
    +                "head":-1,
    +                "tag":"NNP",
    +                "orth":"Feb."
    +              },
    +              {
    +                "dep":"num",
    +                "head":-1,
    +                "tag":"CD",
    +                "orth":"15"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-3,
    +                "tag":".",
    +                "orth":"."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  },
    +  {
    +    "id":7,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"det",
    +                "head":2,
    +                "tag":"DT",
    +                "orth":"A"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NN",
    +                "orth":"record"
    +              },
    +              {
    +                "dep":"nsubjpass",
    +                "head":4,
    +                "tag":"NN",
    +                "orth":"date"
    +              },
    +              {
    +                "dep":"aux",
    +                "head":3,
    +                "tag":"VBZ",
    +                "orth":"has"
    +              },
    +              {
    +                "dep":"neg",
    +                "head":2,
    +                "tag":"RB",
    +                "orth":"n't"
    +              },
    +              {
    +                "dep":"auxpass",
    +                "head":1,
    +                "tag":"VBN",
    +                "orth":"been"
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"VBN",
    +                "orth":"set"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-1,
    +                "tag":".",
    +                "orth":"."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  },
    +  {
    +    "id":8,
    +    "paragraphs":[
    +      {
    +        "sentences":[
    +          {
    +            "tokens":[
    +              {
    +                "dep":"nsubj",
    +                "head":7,
    +                "tag":"NNP",
    +                "orth":"Bell"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-1,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"partmod",
    +                "head":-2,
    +                "tag":"VBN",
    +                "orth":"based"
    +              },
    +              {
    +                "dep":"prep",
    +                "head":-1,
    +                "tag":"IN",
    +                "orth":"in"
    +              },
    +              {
    +                "dep":"nn",
    +                "head":1,
    +                "tag":"NNP",
    +                "orth":"Los"
    +              },
    +              {
    +                "dep":"pobj",
    +                "head":-2,
    +                "tag":"NNP",
    +                "orth":"Angeles"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-6,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"ROOT",
    +                "head":0,
    +                "tag":"VBZ",
    +                "orth":"makes"
    +              },
    +              {
    +                "dep":"cc",
    +                "head":-1,
    +                "tag":"CC",
    +                "orth":"and"
    +              },
    +              {
    +                "dep":"conj",
    +                "head":-2,
    +                "tag":"VBZ",
    +                "orth":"distributes"
    +              },
    +              {
    +                "dep":"amod",
    +                "head":5,
    +                "tag":"JJ",
    +                "orth":"electronic"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-1,
    +                "tag":",",
    +                "orth":","
    +              },
    +              {
    +                "dep":"conj",
    +                "head":-2,
    +                "tag":"NN",
    +                "orth":"computer"
    +              },
    +              {
    +                "dep":"cc",
    +                "head":-3,
    +                "tag":"CC",
    +                "orth":"and"
    +              },
    +              {
    +                "dep":"conj",
    +                "head":-4,
    +                "tag":"NN",
    +                "orth":"building"
    +              },
    +              {
    +                "dep":"dobj",
    +                "head":-8,
    +                "tag":"NNS",
    +                "orth":"products"
    +              },
    +              {
    +                "dep":"punct",
    +                "head":-9,
    +                "tag":".",
    +                "orth":"."
    +              }
    +            ]
    +          }
    +        ]
    +      }
    +    ]
    +  }
    +]
    
    From a68d89a4f351f8df2bfceeac77540b23e29827be Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 12:05:25 +0200
    Subject: [PATCH 456/649] Add failing test for bug #1375 -- no out-of-bounds
     error for token.nbor()
    
    ---
     spacy/tests/regression/test_issue1375.py | 16 ++++++++++++++++
     1 file changed, 16 insertions(+)
     create mode 100644 spacy/tests/regression/test_issue1375.py
    
    diff --git a/spacy/tests/regression/test_issue1375.py b/spacy/tests/regression/test_issue1375.py
    new file mode 100644
    index 000000000..72070758d
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1375.py
    @@ -0,0 +1,16 @@
    +from __future__ import unicode_literals
    +import pytest
    +from ...vocab import Vocab
    +from ...tokens.doc import Doc
    +
    +@pytest.mark.xfail
    +def test_issue1375():
    +    '''Test that token.nbor() raises IndexError for out-of-bounds access.'''
    +    doc = Doc(Vocab(), words=['0', '1', '2'])
    +    with pytest.raises(IndexError):
    +        assert doc[0].nbor(-1)
    +    assert doc[1].nbor(-1).text == '0'
    +    with pytest.raises(IndexError):
    +        assert doc[2].nbor(1)
    +    assert doc[1].nbor(1).text == '2'
    + 
    
    From b66b8f028b256447d0694a5d8cb04b6554e2e2d0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 12:10:39 +0200
    Subject: [PATCH 457/649] Fix #1375 -- out-of-bounds on token.nbor()
    
    ---
     spacy/tests/regression/test_issue1375.py | 2 +-
     spacy/tokens/token.pyx                   | 3 +++
     2 files changed, 4 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/tests/regression/test_issue1375.py b/spacy/tests/regression/test_issue1375.py
    index 72070758d..6f74d9a6d 100644
    --- a/spacy/tests/regression/test_issue1375.py
    +++ b/spacy/tests/regression/test_issue1375.py
    @@ -3,7 +3,7 @@ import pytest
     from ...vocab import Vocab
     from ...tokens.doc import Doc
     
    -@pytest.mark.xfail
    +
     def test_issue1375():
         '''Test that token.nbor() raises IndexError for out-of-bounds access.'''
         doc = Doc(Vocab(), words=['0', '1', '2'])
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index 9ff59eabe..514934ca7 100644
    --- a/spacy/tokens/token.pyx
    +++ b/spacy/tokens/token.pyx
    @@ -127,6 +127,9 @@ cdef class Token:
             i (int): The relative position of the token to get. Defaults to 1.
             RETURNS (Token): The token at position `self.doc[self.i+i]`.
             """
    +        if self.i+i < 0 or (self.i+i >= len(self.doc)):
    +            msg = "Error accessing doc[%d].nbor(%d), for doc of length %d"
    +            raise IndexError(msg % (self.i, i, len(self.doc)))
             return self.doc[self.i+i]
     
         def similarity(self, other):
    
    From 9bf57510644f0845c33a210364b709f6268eba81 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 12:22:17 +0200
    Subject: [PATCH 458/649] Pretty-print JSON
    
    ---
     examples/training/training-data.json | 1384 +++++++++++++-------------
     1 file changed, 692 insertions(+), 692 deletions(-)
    
    diff --git a/examples/training/training-data.json b/examples/training/training-data.json
    index 8b4956f05..532ab4ea8 100644
    --- a/examples/training/training-data.json
    +++ b/examples/training/training-data.json
    @@ -1,304 +1,304 @@
     [
       {
    -    "id":0,
    -    "paragraphs":[
    +    "id": 0,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"prep",
    -                "head":44,
    -                "tag":"IN",
    -                "orth":"In"
    +                "dep": "prep",
    +                "head": 44,
    +                "tag": "IN",
    +                "orth": "In"
                   },
                   {
    -                "dep":"det",
    -                "head":3,
    -                "tag":"DT",
    -                "orth":"an"
    +                "dep": "det",
    +                "head": 3,
    +                "tag": "DT",
    +                "orth": "an"
                   },
                   {
    -                "dep":"nn",
    -                "head":2,
    -                "tag":"NNP",
    -                "orth":"Oct."
    +                "dep": "nn",
    +                "head": 2,
    +                "tag": "NNP",
    +                "orth": "Oct."
                   },
                   {
    -                "dep":"num",
    -                "head":1,
    -                "tag":"CD",
    -                "orth":"19"
    +                "dep": "num",
    +                "head": 1,
    +                "tag": "CD",
    +                "orth": "19"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-4,
    -                "tag":"NN",
    -                "orth":"review"
    +                "dep": "pobj",
    +                "head": -4,
    +                "tag": "NN",
    +                "orth": "review"
                   },
                   {
    -                "dep":"prep",
    -                "head":-1,
    -                "tag":"IN",
    -                "orth":"of"
    +                "dep": "prep",
    +                "head": -1,
    +                "tag": "IN",
    +                "orth": "of"
                   },
                   {
    -                "dep":"punct",
    -                "head":2,
    -                "tag":"``",
    -                "orth":"``"
    +                "dep": "punct",
    +                "head": 2,
    +                "tag": "``",
    +                "orth": "``"
                   },
                   {
    -                "dep":"det",
    -                "head":1,
    -                "tag":"DT",
    -                "orth":"The"
    +                "dep": "det",
    +                "head": 1,
    +                "tag": "DT",
    +                "orth": "The"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-3,
    -                "tag":"NN",
    -                "orth":"Misanthrope"
    +                "dep": "pobj",
    +                "head": -3,
    +                "tag": "NN",
    +                "orth": "Misanthrope"
                   },
                   {
    -                "dep":"punct",
    -                "head":-1,
    -                "tag":"''",
    -                "orth":"''"
    +                "dep": "punct",
    +                "head": -1,
    +                "tag": "''",
    +                "orth": "''"
                   },
                   {
    -                "dep":"prep",
    -                "head":-2,
    -                "tag":"IN",
    -                "orth":"at"
    +                "dep": "prep",
    +                "head": -2,
    +                "tag": "IN",
    +                "orth": "at"
                   },
                   {
    -                "dep":"poss",
    -                "head":3,
    -                "tag":"NNP",
    -                "orth":"Chicago"
    +                "dep": "poss",
    +                "head": 3,
    +                "tag": "NNP",
    +                "orth": "Chicago"
                   },
                   {
    -                "dep":"possessive",
    -                "head":-1,
    -                "tag":"POS",
    -                "orth":"'s"
    +                "dep": "possessive",
    +                "head": -1,
    +                "tag": "POS",
    +                "orth": "'s"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Goodman"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Goodman"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-4,
    -                "tag":"NNP",
    -                "orth":"Theatre"
    +                "dep": "pobj",
    +                "head": -4,
    +                "tag": "NNP",
    +                "orth": "Theatre"
                   },
                   {
    -                "dep":"punct",
    -                "head":4,
    -                "tag":"-LRB-",
    -                "orth":"-LRB-"
    +                "dep": "punct",
    +                "head": 4,
    +                "tag": "-LRB-",
    +                "orth": "-LRB-"
                   },
                   {
    -                "dep":"punct",
    -                "head":3,
    -                "tag":"``",
    -                "orth":"``"
    +                "dep": "punct",
    +                "head": 3,
    +                "tag": "``",
    +                "orth": "``"
                   },
                   {
    -                "dep":"amod",
    -                "head":1,
    -                "tag":"VBN",
    -                "orth":"Revitalized"
    +                "dep": "amod",
    +                "head": 1,
    +                "tag": "VBN",
    +                "orth": "Revitalized"
                   },
                   {
    -                "dep":"nsubj",
    -                "head":1,
    -                "tag":"NNS",
    -                "orth":"Classics"
    +                "dep": "nsubj",
    +                "head": 1,
    +                "tag": "NNS",
    +                "orth": "Classics"
                   },
                   {
    -                "dep":"dep",
    -                "head":-15,
    -                "tag":"VBP",
    -                "orth":"Take"
    +                "dep": "dep",
    +                "head": -15,
    +                "tag": "VBP",
    +                "orth": "Take"
                   },
                   {
    -                "dep":"det",
    -                "head":1,
    -                "tag":"DT",
    -                "orth":"the"
    +                "dep": "det",
    +                "head": 1,
    +                "tag": "DT",
    +                "orth": "the"
                   },
                   {
    -                "dep":"dobj",
    -                "head":-2,
    -                "tag":"NN",
    -                "orth":"Stage"
    +                "dep": "dobj",
    +                "head": -2,
    +                "tag": "NN",
    +                "orth": "Stage"
                   },
                   {
    -                "dep":"prep",
    -                "head":-3,
    -                "tag":"IN",
    -                "orth":"in"
    +                "dep": "prep",
    +                "head": -3,
    +                "tag": "IN",
    +                "orth": "in"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Windy"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Windy"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-2,
    -                "tag":"NNP",
    -                "orth":"City"
    +                "dep": "pobj",
    +                "head": -2,
    +                "tag": "NNP",
    +                "orth": "City"
                   },
                   {
    -                "dep":"punct",
    -                "head":-6,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -6,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"punct",
    -                "head":-7,
    -                "tag":"''",
    -                "orth":"''"
    +                "dep": "punct",
    +                "head": -7,
    +                "tag": "''",
    +                "orth": "''"
                   },
                   {
    -                "dep":"dep",
    -                "head":-8,
    -                "tag":"NN",
    -                "orth":"Leisure"
    +                "dep": "dep",
    +                "head": -8,
    +                "tag": "NN",
    +                "orth": "Leisure"
                   },
                   {
    -                "dep":"cc",
    -                "head":-1,
    -                "tag":"CC",
    -                "orth":"&"
    +                "dep": "cc",
    +                "head": -1,
    +                "tag": "CC",
    +                "orth": "&"
                   },
                   {
    -                "dep":"conj",
    -                "head":-2,
    -                "tag":"NNS",
    -                "orth":"Arts"
    +                "dep": "conj",
    +                "head": -2,
    +                "tag": "NNS",
    +                "orth": "Arts"
                   },
                   {
    -                "dep":"punct",
    -                "head":-11,
    -                "tag":"-RRB-",
    -                "orth":"-RRB-"
    +                "dep": "punct",
    +                "head": -11,
    +                "tag": "-RRB-",
    +                "orth": "-RRB-"
                   },
                   {
    -                "dep":"punct",
    -                "head":13,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": 13,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"det",
    -                "head":1,
    -                "tag":"DT",
    -                "orth":"the"
    +                "dep": "det",
    +                "head": 1,
    +                "tag": "DT",
    +                "orth": "the"
                   },
                   {
    -                "dep":"nsubjpass",
    -                "head":11,
    -                "tag":"NN",
    -                "orth":"role"
    +                "dep": "nsubjpass",
    +                "head": 11,
    +                "tag": "NN",
    +                "orth": "role"
                   },
                   {
    -                "dep":"prep",
    -                "head":-1,
    -                "tag":"IN",
    -                "orth":"of"
    +                "dep": "prep",
    +                "head": -1,
    +                "tag": "IN",
    +                "orth": "of"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-1,
    -                "tag":"NNP",
    -                "orth":"Celimene"
    +                "dep": "pobj",
    +                "head": -1,
    +                "tag": "NNP",
    +                "orth": "Celimene"
                   },
                   {
    -                "dep":"punct",
    -                "head":-3,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -3,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"partmod",
    -                "head":-4,
    -                "tag":"VBN",
    -                "orth":"played"
    +                "dep": "partmod",
    +                "head": -4,
    +                "tag": "VBN",
    +                "orth": "played"
                   },
                   {
    -                "dep":"prep",
    -                "head":-1,
    -                "tag":"IN",
    -                "orth":"by"
    +                "dep": "prep",
    +                "head": -1,
    +                "tag": "IN",
    +                "orth": "by"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Kim"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Kim"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-2,
    -                "tag":"NNP",
    -                "orth":"Cattrall"
    +                "dep": "pobj",
    +                "head": -2,
    +                "tag": "NNP",
    +                "orth": "Cattrall"
                   },
                   {
    -                "dep":"punct",
    -                "head":-8,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -8,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"auxpass",
    -                "head":2,
    -                "tag":"VBD",
    -                "orth":"was"
    +                "dep": "auxpass",
    +                "head": 2,
    +                "tag": "VBD",
    +                "orth": "was"
                   },
                   {
    -                "dep":"advmod",
    -                "head":1,
    -                "tag":"RB",
    -                "orth":"mistakenly"
    +                "dep": "advmod",
    +                "head": 1,
    +                "tag": "RB",
    +                "orth": "mistakenly"
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"VBN",
    -                "orth":"attributed"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "VBN",
    +                "orth": "attributed"
                   },
                   {
    -                "dep":"prep",
    -                "head":-1,
    -                "tag":"TO",
    -                "orth":"to"
    +                "dep": "prep",
    +                "head": -1,
    +                "tag": "TO",
    +                "orth": "to"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Christina"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Christina"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-2,
    -                "tag":"NNP",
    -                "orth":"Haag"
    +                "dep": "pobj",
    +                "head": -2,
    +                "tag": "NNP",
    +                "orth": "Haag"
                   },
                   {
    -                "dep":"punct",
    -                "head":-4,
    -                "tag":".",
    -                "orth":"."
    +                "dep": "punct",
    +                "head": -4,
    +                "tag": ".",
    +                "orth": "."
                   }
                 ]
               }
    @@ -307,41 +307,41 @@
         ]
       },
       {
    -    "id":1,
    -    "paragraphs":[
    +    "id": 1,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Ms."
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Ms."
                   },
                   {
    -                "dep":"nsubj",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Haag"
    +                "dep": "nsubj",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Haag"
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"VBZ",
    -                "orth":"plays"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "VBZ",
    +                "orth": "plays"
                   },
                   {
    -                "dep":"dobj",
    -                "head":-1,
    -                "tag":"NNP",
    -                "orth":"Elianti"
    +                "dep": "dobj",
    +                "head": -1,
    +                "tag": "NNP",
    +                "orth": "Elianti"
                   },
                   {
    -                "dep":"punct",
    -                "head":-2,
    -                "tag":".",
    -                "orth":"."
    +                "dep": "punct",
    +                "head": -2,
    +                "tag": ".",
    +                "orth": "."
                   }
                 ]
               }
    @@ -350,131 +350,131 @@
         ]
       },
       {
    -    "id":2,
    -    "paragraphs":[
    +    "id": 2,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"nn",
    -                "head":3,
    -                "tag":"NNP",
    -                "orth":"Rolls-Royce"
    +                "dep": "nn",
    +                "head": 3,
    +                "tag": "NNP",
    +                "orth": "Rolls-Royce"
                   },
                   {
    -                "dep":"nn",
    -                "head":2,
    -                "tag":"NNP",
    -                "orth":"Motor"
    +                "dep": "nn",
    +                "head": 2,
    +                "tag": "NNP",
    +                "orth": "Motor"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNPS",
    -                "orth":"Cars"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNPS",
    +                "orth": "Cars"
                   },
                   {
    -                "dep":"nsubj",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Inc."
    +                "dep": "nsubj",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Inc."
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"VBD",
    -                "orth":"said"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "VBD",
    +                "orth": "said"
                   },
                   {
    -                "dep":"nsubj",
    -                "head":1,
    -                "tag":"PRP",
    -                "orth":"it"
    +                "dep": "nsubj",
    +                "head": 1,
    +                "tag": "PRP",
    +                "orth": "it"
                   },
                   {
    -                "dep":"ccomp",
    -                "head":-2,
    -                "tag":"VBZ",
    -                "orth":"expects"
    +                "dep": "ccomp",
    +                "head": -2,
    +                "tag": "VBZ",
    +                "orth": "expects"
                   },
                   {
    -                "dep":"poss",
    -                "head":2,
    -                "tag":"PRP$",
    -                "orth":"its"
    +                "dep": "poss",
    +                "head": 2,
    +                "tag": "PRP$",
    +                "orth": "its"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"U.S."
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "U.S."
                   },
                   {
    -                "dep":"nsubj",
    -                "head":3,
    -                "tag":"NNS",
    -                "orth":"sales"
    +                "dep": "nsubj",
    +                "head": 3,
    +                "tag": "NNS",
    +                "orth": "sales"
                   },
                   {
    -                "dep":"aux",
    -                "head":2,
    -                "tag":"TO",
    -                "orth":"to"
    +                "dep": "aux",
    +                "head": 2,
    +                "tag": "TO",
    +                "orth": "to"
                   },
                   {
    -                "dep":"cop",
    -                "head":1,
    -                "tag":"VB",
    -                "orth":"remain"
    +                "dep": "cop",
    +                "head": 1,
    +                "tag": "VB",
    +                "orth": "remain"
                   },
                   {
    -                "dep":"xcomp",
    -                "head":-6,
    -                "tag":"JJ",
    -                "orth":"steady"
    +                "dep": "xcomp",
    +                "head": -6,
    +                "tag": "JJ",
    +                "orth": "steady"
                   },
                   {
    -                "dep":"prep",
    -                "head":-1,
    -                "tag":"IN",
    -                "orth":"at"
    +                "dep": "prep",
    +                "head": -1,
    +                "tag": "IN",
    +                "orth": "at"
                   },
                   {
    -                "dep":"quantmod",
    -                "head":1,
    -                "tag":"IN",
    -                "orth":"about"
    +                "dep": "quantmod",
    +                "head": 1,
    +                "tag": "IN",
    +                "orth": "about"
                   },
                   {
    -                "dep":"num",
    -                "head":1,
    -                "tag":"CD",
    -                "orth":"1,200"
    +                "dep": "num",
    +                "head": 1,
    +                "tag": "CD",
    +                "orth": "1,200"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-3,
    -                "tag":"NNS",
    -                "orth":"cars"
    +                "dep": "pobj",
    +                "head": -3,
    +                "tag": "NNS",
    +                "orth": "cars"
                   },
                   {
    -                "dep":"prep",
    -                "head":-5,
    -                "tag":"IN",
    -                "orth":"in"
    +                "dep": "prep",
    +                "head": -5,
    +                "tag": "IN",
    +                "orth": "in"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-1,
    -                "tag":"CD",
    -                "orth":"1990"
    +                "dep": "pobj",
    +                "head": -1,
    +                "tag": "CD",
    +                "orth": "1990"
                   },
                   {
    -                "dep":"punct",
    -                "head":-15,
    -                "tag":".",
    -                "orth":"."
    +                "dep": "punct",
    +                "head": -15,
    +                "tag": ".",
    +                "orth": "."
                   }
                 ]
               }
    @@ -483,83 +483,83 @@
         ]
       },
       {
    -    "id":3,
    -    "paragraphs":[
    +    "id": 3,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"det",
    -                "head":3,
    -                "tag":"DT",
    -                "orth":"The"
    +                "dep": "det",
    +                "head": 3,
    +                "tag": "DT",
    +                "orth": "The"
                   },
                   {
    -                "dep":"nn",
    -                "head":2,
    -                "tag":"NN",
    -                "orth":"luxury"
    +                "dep": "nn",
    +                "head": 2,
    +                "tag": "NN",
    +                "orth": "luxury"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NN",
    -                "orth":"auto"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NN",
    +                "orth": "auto"
                   },
                   {
    -                "dep":"nsubj",
    -                "head":3,
    -                "tag":"NN",
    -                "orth":"maker"
    +                "dep": "nsubj",
    +                "head": 3,
    +                "tag": "NN",
    +                "orth": "maker"
                   },
                   {
    -                "dep":"amod",
    -                "head":1,
    -                "tag":"JJ",
    -                "orth":"last"
    +                "dep": "amod",
    +                "head": 1,
    +                "tag": "JJ",
    +                "orth": "last"
                   },
                   {
    -                "dep":"tmod",
    -                "head":1,
    -                "tag":"NN",
    -                "orth":"year"
    +                "dep": "tmod",
    +                "head": 1,
    +                "tag": "NN",
    +                "orth": "year"
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"VBD",
    -                "orth":"sold"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "VBD",
    +                "orth": "sold"
                   },
                   {
    -                "dep":"num",
    -                "head":1,
    -                "tag":"CD",
    -                "orth":"1,214"
    +                "dep": "num",
    +                "head": 1,
    +                "tag": "CD",
    +                "orth": "1,214"
                   },
                   {
    -                "dep":"dobj",
    -                "head":-2,
    -                "tag":"NNS",
    -                "orth":"cars"
    +                "dep": "dobj",
    +                "head": -2,
    +                "tag": "NNS",
    +                "orth": "cars"
                   },
                   {
    -                "dep":"prep",
    -                "head":-3,
    -                "tag":"IN",
    -                "orth":"in"
    +                "dep": "prep",
    +                "head": -3,
    +                "tag": "IN",
    +                "orth": "in"
                   },
                   {
    -                "dep":"det",
    -                "head":1,
    -                "tag":"DT",
    -                "orth":"the"
    +                "dep": "det",
    +                "head": 1,
    +                "tag": "DT",
    +                "orth": "the"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-2,
    -                "tag":"NNP",
    -                "orth":"U.S."
    +                "dep": "pobj",
    +                "head": -2,
    +                "tag": "NNP",
    +                "orth": "U.S."
                   }
                 ]
               }
    @@ -568,185 +568,185 @@
         ]
       },
       {
    -    "id":4,
    -    "paragraphs":[
    +    "id": 4,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Howard"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Howard"
                   },
                   {
    -                "dep":"nsubj",
    -                "head":8,
    -                "tag":"NNP",
    -                "orth":"Mosher"
    +                "dep": "nsubj",
    +                "head": 8,
    +                "tag": "NNP",
    +                "orth": "Mosher"
                   },
                   {
    -                "dep":"punct",
    -                "head":-1,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -1,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"appos",
    -                "head":-2,
    -                "tag":"NN",
    -                "orth":"president"
    +                "dep": "appos",
    +                "head": -2,
    +                "tag": "NN",
    +                "orth": "president"
                   },
                   {
    -                "dep":"cc",
    -                "head":-1,
    -                "tag":"CC",
    -                "orth":"and"
    +                "dep": "cc",
    +                "head": -1,
    +                "tag": "CC",
    +                "orth": "and"
                   },
                   {
    -                "dep":"amod",
    -                "head":2,
    -                "tag":"JJ",
    -                "orth":"chief"
    +                "dep": "amod",
    +                "head": 2,
    +                "tag": "JJ",
    +                "orth": "chief"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NN",
    -                "orth":"executive"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NN",
    +                "orth": "executive"
                   },
                   {
    -                "dep":"conj",
    -                "head":-4,
    -                "tag":"NN",
    -                "orth":"officer"
    +                "dep": "conj",
    +                "head": -4,
    +                "tag": "NN",
    +                "orth": "officer"
                   },
                   {
    -                "dep":"punct",
    -                "head":-7,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -7,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"VBD",
    -                "orth":"said"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "VBD",
    +                "orth": "said"
                   },
                   {
    -                "dep":"nsubj",
    -                "head":1,
    -                "tag":"PRP",
    -                "orth":"he"
    +                "dep": "nsubj",
    +                "head": 1,
    +                "tag": "PRP",
    +                "orth": "he"
                   },
                   {
    -                "dep":"ccomp",
    -                "head":-2,
    -                "tag":"VBZ",
    -                "orth":"anticipates"
    +                "dep": "ccomp",
    +                "head": -2,
    +                "tag": "VBZ",
    +                "orth": "anticipates"
                   },
                   {
    -                "dep":"dobj",
    -                "head":-1,
    -                "tag":"NN",
    -                "orth":"growth"
    +                "dep": "dobj",
    +                "head": -1,
    +                "tag": "NN",
    +                "orth": "growth"
                   },
                   {
    -                "dep":"prep",
    -                "head":-1,
    -                "tag":"IN",
    -                "orth":"for"
    +                "dep": "prep",
    +                "head": -1,
    +                "tag": "IN",
    +                "orth": "for"
                   },
                   {
    -                "dep":"det",
    -                "head":3,
    -                "tag":"DT",
    -                "orth":"the"
    +                "dep": "det",
    +                "head": 3,
    +                "tag": "DT",
    +                "orth": "the"
                   },
                   {
    -                "dep":"nn",
    -                "head":2,
    -                "tag":"NN",
    -                "orth":"luxury"
    +                "dep": "nn",
    +                "head": 2,
    +                "tag": "NN",
    +                "orth": "luxury"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NN",
    -                "orth":"auto"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NN",
    +                "orth": "auto"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-4,
    -                "tag":"NN",
    -                "orth":"maker"
    +                "dep": "pobj",
    +                "head": -4,
    +                "tag": "NN",
    +                "orth": "maker"
                   },
                   {
    -                "dep":"prep",
    -                "head":-6,
    -                "tag":"IN",
    -                "orth":"in"
    +                "dep": "prep",
    +                "head": -6,
    +                "tag": "IN",
    +                "orth": "in"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-1,
    -                "tag":"NNP",
    -                "orth":"Britain"
    +                "dep": "pobj",
    +                "head": -1,
    +                "tag": "NNP",
    +                "orth": "Britain"
                   },
                   {
    -                "dep":"cc",
    -                "head":-1,
    -                "tag":"CC",
    -                "orth":"and"
    +                "dep": "cc",
    +                "head": -1,
    +                "tag": "CC",
    +                "orth": "and"
                   },
                   {
    -                "dep":"conj",
    -                "head":-2,
    -                "tag":"NNP",
    -                "orth":"Europe"
    +                "dep": "conj",
    +                "head": -2,
    +                "tag": "NNP",
    +                "orth": "Europe"
                   },
                   {
    -                "dep":"punct",
    -                "head":-4,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -4,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"cc",
    -                "head":-5,
    -                "tag":"CC",
    -                "orth":"and"
    +                "dep": "cc",
    +                "head": -5,
    +                "tag": "CC",
    +                "orth": "and"
                   },
                   {
    -                "dep":"conj",
    -                "head":-6,
    -                "tag":"IN",
    -                "orth":"in"
    +                "dep": "conj",
    +                "head": -6,
    +                "tag": "IN",
    +                "orth": "in"
                   },
                   {
    -                "dep":"amod",
    -                "head":1,
    -                "tag":"JJ",
    -                "orth":"Far"
    +                "dep": "amod",
    +                "head": 1,
    +                "tag": "JJ",
    +                "orth": "Far"
                   },
                   {
    -                "dep":"amod",
    -                "head":1,
    -                "tag":"JJ",
    -                "orth":"Eastern"
    +                "dep": "amod",
    +                "head": 1,
    +                "tag": "JJ",
    +                "orth": "Eastern"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-3,
    -                "tag":"NNS",
    -                "orth":"markets"
    +                "dep": "pobj",
    +                "head": -3,
    +                "tag": "NNS",
    +                "orth": "markets"
                   },
                   {
    -                "dep":"punct",
    -                "head":-19,
    -                "tag":".",
    -                "orth":"."
    +                "dep": "punct",
    +                "head": -19,
    +                "tag": ".",
    +                "orth": "."
                   }
                 ]
               }
    @@ -755,101 +755,101 @@
         ]
       },
       {
    -    "id":5,
    -    "paragraphs":[
    +    "id": 5,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"nn",
    -                "head":2,
    -                "tag":"NNP",
    -                "orth":"BELL"
    +                "dep": "nn",
    +                "head": 2,
    +                "tag": "NNP",
    +                "orth": "BELL"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"INDUSTRIES"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "INDUSTRIES"
                   },
                   {
    -                "dep":"nsubj",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Inc."
    +                "dep": "nsubj",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Inc."
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"VBD",
    -                "orth":"increased"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "VBD",
    +                "orth": "increased"
                   },
                   {
    -                "dep":"poss",
    -                "head":1,
    -                "tag":"PRP$",
    -                "orth":"its"
    +                "dep": "poss",
    +                "head": 1,
    +                "tag": "PRP$",
    +                "orth": "its"
                   },
                   {
    -                "dep":"dobj",
    -                "head":-2,
    -                "tag":"NN",
    -                "orth":"quarterly"
    +                "dep": "dobj",
    +                "head": -2,
    +                "tag": "NN",
    +                "orth": "quarterly"
                   },
                   {
    -                "dep":"prep",
    -                "head":-3,
    -                "tag":"TO",
    -                "orth":"to"
    +                "dep": "prep",
    +                "head": -3,
    +                "tag": "TO",
    +                "orth": "to"
                   },
                   {
    -                "dep":"num",
    -                "head":1,
    -                "tag":"CD",
    -                "orth":"10"
    +                "dep": "num",
    +                "head": 1,
    +                "tag": "CD",
    +                "orth": "10"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-2,
    -                "tag":"NNS",
    -                "orth":"cents"
    +                "dep": "pobj",
    +                "head": -2,
    +                "tag": "NNS",
    +                "orth": "cents"
                   },
                   {
    -                "dep":"prep",
    -                "head":-6,
    -                "tag":"IN",
    -                "orth":"from"
    +                "dep": "prep",
    +                "head": -6,
    +                "tag": "IN",
    +                "orth": "from"
                   },
                   {
    -                "dep":"num",
    -                "head":1,
    -                "tag":"CD",
    -                "orth":"seven"
    +                "dep": "num",
    +                "head": 1,
    +                "tag": "CD",
    +                "orth": "seven"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-2,
    -                "tag":"NNS",
    -                "orth":"cents"
    +                "dep": "pobj",
    +                "head": -2,
    +                "tag": "NNS",
    +                "orth": "cents"
                   },
                   {
    -                "dep":"det",
    -                "head":1,
    -                "tag":"DT",
    -                "orth":"a"
    +                "dep": "det",
    +                "head": 1,
    +                "tag": "DT",
    +                "orth": "a"
                   },
                   {
    -                "dep":"npadvmod",
    -                "head":-2,
    -                "tag":"NN",
    -                "orth":"share"
    +                "dep": "npadvmod",
    +                "head": -2,
    +                "tag": "NN",
    +                "orth": "share"
                   },
                   {
    -                "dep":"punct",
    -                "head":-11,
    -                "tag":".",
    -                "orth":"."
    +                "dep": "punct",
    +                "head": -11,
    +                "tag": ".",
    +                "orth": "."
                   }
                 ]
               }
    @@ -858,65 +858,65 @@
         ]
       },
       {
    -    "id":6,
    -    "paragraphs":[
    +    "id": 6,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"det",
    -                "head":2,
    -                "tag":"DT",
    -                "orth":"The"
    +                "dep": "det",
    +                "head": 2,
    +                "tag": "DT",
    +                "orth": "The"
                   },
                   {
    -                "dep":"amod",
    -                "head":1,
    -                "tag":"JJ",
    -                "orth":"new"
    +                "dep": "amod",
    +                "head": 1,
    +                "tag": "JJ",
    +                "orth": "new"
                   },
                   {
    -                "dep":"nsubj",
    -                "head":3,
    -                "tag":"NN",
    -                "orth":"rate"
    +                "dep": "nsubj",
    +                "head": 3,
    +                "tag": "NN",
    +                "orth": "rate"
                   },
                   {
    -                "dep":"aux",
    -                "head":2,
    -                "tag":"MD",
    -                "orth":"will"
    +                "dep": "aux",
    +                "head": 2,
    +                "tag": "MD",
    +                "orth": "will"
                   },
                   {
    -                "dep":"cop",
    -                "head":1,
    -                "tag":"VB",
    -                "orth":"be"
    +                "dep": "cop",
    +                "head": 1,
    +                "tag": "VB",
    +                "orth": "be"
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"JJ",
    -                "orth":"payable"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "JJ",
    +                "orth": "payable"
                   },
                   {
    -                "dep":"tmod",
    -                "head":-1,
    -                "tag":"NNP",
    -                "orth":"Feb."
    +                "dep": "tmod",
    +                "head": -1,
    +                "tag": "NNP",
    +                "orth": "Feb."
                   },
                   {
    -                "dep":"num",
    -                "head":-1,
    -                "tag":"CD",
    -                "orth":"15"
    +                "dep": "num",
    +                "head": -1,
    +                "tag": "CD",
    +                "orth": "15"
                   },
                   {
    -                "dep":"punct",
    -                "head":-3,
    -                "tag":".",
    -                "orth":"."
    +                "dep": "punct",
    +                "head": -3,
    +                "tag": ".",
    +                "orth": "."
                   }
                 ]
               }
    @@ -925,59 +925,59 @@
         ]
       },
       {
    -    "id":7,
    -    "paragraphs":[
    +    "id": 7,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"det",
    -                "head":2,
    -                "tag":"DT",
    -                "orth":"A"
    +                "dep": "det",
    +                "head": 2,
    +                "tag": "DT",
    +                "orth": "A"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NN",
    -                "orth":"record"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NN",
    +                "orth": "record"
                   },
                   {
    -                "dep":"nsubjpass",
    -                "head":4,
    -                "tag":"NN",
    -                "orth":"date"
    +                "dep": "nsubjpass",
    +                "head": 4,
    +                "tag": "NN",
    +                "orth": "date"
                   },
                   {
    -                "dep":"aux",
    -                "head":3,
    -                "tag":"VBZ",
    -                "orth":"has"
    +                "dep": "aux",
    +                "head": 3,
    +                "tag": "VBZ",
    +                "orth": "has"
                   },
                   {
    -                "dep":"neg",
    -                "head":2,
    -                "tag":"RB",
    -                "orth":"n't"
    +                "dep": "neg",
    +                "head": 2,
    +                "tag": "RB",
    +                "orth": "n't"
                   },
                   {
    -                "dep":"auxpass",
    -                "head":1,
    -                "tag":"VBN",
    -                "orth":"been"
    +                "dep": "auxpass",
    +                "head": 1,
    +                "tag": "VBN",
    +                "orth": "been"
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"VBN",
    -                "orth":"set"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "VBN",
    +                "orth": "set"
                   },
                   {
    -                "dep":"punct",
    -                "head":-1,
    -                "tag":".",
    -                "orth":"."
    +                "dep": "punct",
    +                "head": -1,
    +                "tag": ".",
    +                "orth": "."
                   }
                 ]
               }
    @@ -986,113 +986,113 @@
         ]
       },
       {
    -    "id":8,
    -    "paragraphs":[
    +    "id": 8,
    +    "paragraphs": [
           {
    -        "sentences":[
    +        "sentences": [
               {
    -            "tokens":[
    +            "tokens": [
                   {
    -                "dep":"nsubj",
    -                "head":7,
    -                "tag":"NNP",
    -                "orth":"Bell"
    +                "dep": "nsubj",
    +                "head": 7,
    +                "tag": "NNP",
    +                "orth": "Bell"
                   },
                   {
    -                "dep":"punct",
    -                "head":-1,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -1,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"partmod",
    -                "head":-2,
    -                "tag":"VBN",
    -                "orth":"based"
    +                "dep": "partmod",
    +                "head": -2,
    +                "tag": "VBN",
    +                "orth": "based"
                   },
                   {
    -                "dep":"prep",
    -                "head":-1,
    -                "tag":"IN",
    -                "orth":"in"
    +                "dep": "prep",
    +                "head": -1,
    +                "tag": "IN",
    +                "orth": "in"
                   },
                   {
    -                "dep":"nn",
    -                "head":1,
    -                "tag":"NNP",
    -                "orth":"Los"
    +                "dep": "nn",
    +                "head": 1,
    +                "tag": "NNP",
    +                "orth": "Los"
                   },
                   {
    -                "dep":"pobj",
    -                "head":-2,
    -                "tag":"NNP",
    -                "orth":"Angeles"
    +                "dep": "pobj",
    +                "head": -2,
    +                "tag": "NNP",
    +                "orth": "Angeles"
                   },
                   {
    -                "dep":"punct",
    -                "head":-6,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -6,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"ROOT",
    -                "head":0,
    -                "tag":"VBZ",
    -                "orth":"makes"
    +                "dep": "ROOT",
    +                "head": 0,
    +                "tag": "VBZ",
    +                "orth": "makes"
                   },
                   {
    -                "dep":"cc",
    -                "head":-1,
    -                "tag":"CC",
    -                "orth":"and"
    +                "dep": "cc",
    +                "head": -1,
    +                "tag": "CC",
    +                "orth": "and"
                   },
                   {
    -                "dep":"conj",
    -                "head":-2,
    -                "tag":"VBZ",
    -                "orth":"distributes"
    +                "dep": "conj",
    +                "head": -2,
    +                "tag": "VBZ",
    +                "orth": "distributes"
                   },
                   {
    -                "dep":"amod",
    -                "head":5,
    -                "tag":"JJ",
    -                "orth":"electronic"
    +                "dep": "amod",
    +                "head": 5,
    +                "tag": "JJ",
    +                "orth": "electronic"
                   },
                   {
    -                "dep":"punct",
    -                "head":-1,
    -                "tag":",",
    -                "orth":","
    +                "dep": "punct",
    +                "head": -1,
    +                "tag": ",",
    +                "orth": ","
                   },
                   {
    -                "dep":"conj",
    -                "head":-2,
    -                "tag":"NN",
    -                "orth":"computer"
    +                "dep": "conj",
    +                "head": -2,
    +                "tag": "NN",
    +                "orth": "computer"
                   },
                   {
    -                "dep":"cc",
    -                "head":-3,
    -                "tag":"CC",
    -                "orth":"and"
    +                "dep": "cc",
    +                "head": -3,
    +                "tag": "CC",
    +                "orth": "and"
                   },
                   {
    -                "dep":"conj",
    -                "head":-4,
    -                "tag":"NN",
    -                "orth":"building"
    +                "dep": "conj",
    +                "head": -4,
    +                "tag": "NN",
    +                "orth": "building"
                   },
                   {
    -                "dep":"dobj",
    -                "head":-8,
    -                "tag":"NNS",
    -                "orth":"products"
    +                "dep": "dobj",
    +                "head": -8,
    +                "tag": "NNS",
    +                "orth": "products"
                   },
                   {
    -                "dep":"punct",
    -                "head":-9,
    -                "tag":".",
    -                "orth":"."
    +                "dep": "punct",
    +                "head": -9,
    +                "tag": ".",
    +                "orth": "."
                   }
                 ]
               }
    
    From dd5b2d8fa31d47f3ee16f6a1b3340f1319b39ecb Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 12:40:47 +0200
    Subject: [PATCH 459/649] Check for out-of-memory when calling calloc. Closes
     #1446
    
    ---
     spacy/syntax/_state.pxd    | 7 +++++++
     spacy/syntax/nn_parser.pyx | 7 ++++++-
     2 files changed, 13 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd
    index 4675d887e..803348b53 100644
    --- a/spacy/syntax/_state.pxd
    +++ b/spacy/syntax/_state.pxd
    @@ -2,6 +2,8 @@ from libc.string cimport memcpy, memset, memmove
     from libc.stdlib cimport malloc, calloc, free
     from libc.stdint cimport uint32_t, uint64_t
     
    +from cpython.exc cimport PyErr_CheckSignals, PyErr_SetFromErrno
    +
     from murmurhash.mrmr cimport hash64
     
     from ..vocab cimport EMPTY_LEXEME
    @@ -55,6 +57,11 @@ cdef cppclass StateC:
             this.shifted = calloc(length + (PADDING * 2), sizeof(bint))
             this._sent = calloc(length + (PADDING * 2), sizeof(TokenC))
             this._ents = calloc(length + (PADDING * 2), sizeof(Entity))
    +        if not (this._buffer and this._stack and this.shifted
    +                and this._sent and this._ents):
    +            with gil:
    +                PyErr_SetFromErrno(MemoryError)
    +                PyErr_CheckSignals()
             memset(&this._hist, 0, sizeof(this._hist))
             this.offset = 0
             cdef int i
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index cb26b8d37..a9553fd1f 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -22,7 +22,7 @@ cimport numpy as np
     
     from libcpp.vector cimport vector
     from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF
    -from cpython.exc cimport PyErr_CheckSignals
    +from cpython.exc cimport PyErr_CheckSignals, PyErr_SetFromErrno
     from libc.stdint cimport uint32_t, uint64_t
     from libc.string cimport memset, memcpy
     from libc.stdlib cimport malloc, calloc, free
    @@ -429,6 +429,7 @@ cdef class Parser:
                     self._parseC(states[i],
                         feat_weights, hW, hb,
                         nr_class, nr_hidden, nr_feat, nr_piece)
    +        PyErr_CheckSignals()
             return state_objs
     
         cdef void _parseC(self, StateC* state, 
    @@ -438,6 +439,10 @@ cdef class Parser:
             is_valid = calloc(nr_class, sizeof(int))
             vectors = calloc(nr_hidden * nr_piece, sizeof(float))
             scores = calloc(nr_class, sizeof(float))
    +        if not (token_ids and is_valid and vectors and scores):
    +            with gil:
    +                PyErr_SetFromErrno(MemoryError)
    +                PyErr_CheckSignals()
             
             while not state.is_final():
                 state.set_context_tokens(token_ids, nr_feat)
    
    From 66f8f9d4a0476f84a130f9e7ba5c7f69f4da02e4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 13:02:19 +0200
    Subject: [PATCH 460/649] Fix Japanese tokenizer
    
    JapaneseTokenizer now returns a Doc, not individual words
    ---
     spacy/lang/ja/__init__.py | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/spacy/lang/ja/__init__.py b/spacy/lang/ja/__init__.py
    index 3a9c58fca..04cc013a4 100644
    --- a/spacy/lang/ja/__init__.py
    +++ b/spacy/lang/ja/__init__.py
    @@ -33,8 +33,7 @@ class Japanese(Language):
         Defaults = JapaneseDefaults
     
         def make_doc(self, text):
    -        words = self.tokenizer(text)
    -        return Doc(self.vocab, words=words, spaces=[False]*len(words))
    +        return self.tokenizer(text)
     
     
     __all__ = ['Japanese']
    
    From c55db0a4a1c8027b16af1510df1e725df2b15a02 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 13:02:24 +0200
    Subject: [PATCH 461/649] Add example sentences for Japanese and Chinese (see
     #1107)
    
    ---
     spacy/lang/ja/examples.py | 18 ++++++++++++++++++
     spacy/lang/zh/examples.py | 18 ++++++++++++++++++
     2 files changed, 36 insertions(+)
     create mode 100644 spacy/lang/ja/examples.py
     create mode 100644 spacy/lang/zh/examples.py
    
    diff --git a/spacy/lang/ja/examples.py b/spacy/lang/ja/examples.py
    new file mode 100644
    index 000000000..623609205
    --- /dev/null
    +++ b/spacy/lang/ja/examples.py
    @@ -0,0 +1,18 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +
    +"""
    +Example sentences to test spaCy and its language models.
    +
    +>>> from spacy.lang.ja.examples import sentences
    +>>> docs = nlp.pipe(sentences)
    +"""
    +
    +
    +sentences = [
    +    'アップルがイギリスの新興企業を10億ドルで購入を検討',
    +    '自動運転車の損害賠償責任、自動車メーカーに一定の負担を求める',
    +    '歩道を走る自動配達ロボ、サンフランシスコ市が走行禁止を検討',
    +    'ロンドンはイギリスの大都市です。'
    +]
    diff --git a/spacy/lang/zh/examples.py b/spacy/lang/zh/examples.py
    new file mode 100644
    index 000000000..5e8a36119
    --- /dev/null
    +++ b/spacy/lang/zh/examples.py
    @@ -0,0 +1,18 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +
    +"""
    +Example sentences to test spaCy and its language models.
    +
    +>>> from spacy.lang.zh.examples import sentences
    +>>> docs = nlp.pipe(sentences)
    +"""
    +
    +
    +sentences = [
    +    "蘋果公司正考量用一億元買下英國的新創公司",
    +    "自駕車將保險責任歸屬轉移至製造商",
    +    "舊金山考慮禁止送貨機器人在人行道上行駛",
    +    "倫敦是英國的大城市"
    +]
    
    From 391d5ef0d13c9f7401ee3576ff578515c07c5f77 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 14:25:49 +0200
    Subject: [PATCH 462/649] Normalize imports in regression test
    
    ---
     spacy/tests/regression/test_issue1434.py | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/tests/regression/test_issue1434.py b/spacy/tests/regression/test_issue1434.py
    index ec3a34bb0..fc88cc3e6 100644
    --- a/spacy/tests/regression/test_issue1434.py
    +++ b/spacy/tests/regression/test_issue1434.py
    @@ -1,9 +1,9 @@
     from __future__ import unicode_literals
     
    -from spacy.tokens import Doc
    -from spacy.vocab import Vocab
    -from spacy.matcher import Matcher
    -from spacy.lang.lex_attrs import LEX_ATTRS
    +from ...vocab import Vocab
    +from ...lang.lex_attrs import LEX_ATTRS
    +from ...tokens import Doc
    +from ...matcher import Matcher
     
     
     def test_issue1434():
    
    From 4bea65a1a8426bb551854b0a6175b5df1403e27d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 14:26:27 +0200
    Subject: [PATCH 463/649] Fix Issue #1450: Off-by-1 in * and ? matches
    
    Patterns that end in variable-length operators e.g. * and ? now end on
    the correct token. Previously, they were off by 1: the next token was
    pulled into the match, even if that's where the pattern failed.
    ---
     spacy/matcher.pyx                        | 24 ++++++----
     spacy/tests/regression/test_issue1450.py | 58 ++++++++++++++++++++++++
     spacy/tests/test_matcher.py              | 22 +++++++++
     3 files changed, 96 insertions(+), 8 deletions(-)
     create mode 100644 spacy/tests/regression/test_issue1450.py
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index fa67f32d6..a0c69f4bf 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -69,6 +69,7 @@ cdef enum action_t:
         REPEAT
         ACCEPT
         ADVANCE_ZERO
    +    ACCEPT_PREV
         PANIC
     
     # A "match expression" conists of one or more token patterns
    @@ -120,24 +121,27 @@ cdef attr_t get_pattern_key(const TokenPatternC* pattern) except 0:
     
     
     cdef int get_action(const TokenPatternC* pattern, const TokenC* token) nogil:
    +    lookahead = &pattern[1]
         for attr in pattern.attrs[:pattern.nr_attr]:
             if get_token_attr(token, attr.attr) != attr.value:
                 if pattern.quantifier == ONE:
                     return REJECT
                 elif pattern.quantifier == ZERO:
    -                return ACCEPT if (pattern+1).nr_attr == 0 else ADVANCE
    +                return ACCEPT if lookahead.nr_attr == 0 else ADVANCE
                 elif pattern.quantifier in (ZERO_ONE, ZERO_PLUS):
    -                return ACCEPT if (pattern+1).nr_attr == 0 else ADVANCE_ZERO
    +                return ACCEPT_PREV if lookahead.nr_attr == 0 else ADVANCE_ZERO
                 else:
                     return PANIC
         if pattern.quantifier == ZERO:
             return REJECT
    +    elif lookahead.nr_attr == 0:
    +        return ACCEPT
         elif pattern.quantifier in (ONE, ZERO_ONE):
    -        return ACCEPT if (pattern+1).nr_attr == 0 else ADVANCE
    +        return ADVANCE
         elif pattern.quantifier == ZERO_PLUS:
             # This is a bandaid over the 'shadowing' problem described here:
             # https://github.com/explosion/spaCy/issues/864
    -        next_action = get_action(pattern+1, token)
    +        next_action = get_action(lookahead, token)
             if next_action is REJECT:
                 return REPEAT
             else:
    @@ -345,6 +349,9 @@ cdef class Matcher:
                     while action == ADVANCE_ZERO:
                         state.second += 1
                         action = get_action(state.second, token)
    +                if action == PANIC:
    +                    raise Exception("Error selecting action in matcher")
    +
                     if action == REPEAT:
                         # Leave the state in the queue, and advance to next slot
                         # (i.e. we don't overwrite -- we want to greedily match more
    @@ -356,14 +363,15 @@ cdef class Matcher:
                         partials[q] = state
                         partials[q].second += 1
                         q += 1
    -                elif action == ACCEPT:
    +                elif action in (ACCEPT, ACCEPT_PREV):
                         # TODO: What to do about patterns starting with ZERO? Need to
                         # adjust the start position.
                         start = state.first
    -                    end = token_i+1
    +                    end = token_i+1 if action == ACCEPT else token_i
                         ent_id = state.second[1].attrs[0].value
                         label = state.second[1].attrs[1].value
                         matches.append((ent_id, start, end))
    +
                 partials.resize(q)
                 # Check whether we open any new patterns on this token
                 for pattern in self.patterns:
    @@ -383,9 +391,9 @@ cdef class Matcher:
                         state.first = token_i
                         state.second = pattern + 1
                         partials.push_back(state)
    -                elif action == ACCEPT:
    +                elif action in (ACCEPT, ACCEPT_PREV):
                         start = token_i
    -                    end = token_i+1
    +                    end = token_i+1 if action == ACCEPT else token_i
                         ent_id = pattern[1].attrs[0].value
                         label = pattern[1].attrs[1].value
                         matches.append((ent_id, start, end))
    diff --git a/spacy/tests/regression/test_issue1450.py b/spacy/tests/regression/test_issue1450.py
    new file mode 100644
    index 000000000..6f1d4f568
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1450.py
    @@ -0,0 +1,58 @@
    +from __future__ import unicode_literals
    +import pytest
    +
    +from ...matcher import Matcher
    +from ...tokens import Doc
    +from ...vocab import Vocab
    +
    +
    +@pytest.mark.parametrize(
    +    'string,start,end',
    +    [
    +        ('a', 0, 1),
    +        ('a b', 0, 2),
    +        ('a c', 0, 1),
    +        ('a b c', 0, 2),
    +        ('a b b c', 0, 2),
    +        ('a b b', 0, 2),
    +    ]
    +)
    +def test_issue1450_matcher_end_zero_plus(string, start, end):
    +    '''Test matcher works when patterns end with * operator.
    +    
    +    Original example (rewritten to avoid model usage)
    +
    +    nlp = spacy.load('en_core_web_sm')
    +    matcher = Matcher(nlp.vocab)
    +    matcher.add(
    +        "TSTEND",
    +        on_match_1,
    +        [
    +            {TAG: "JJ", LOWER: "new"},
    +            {TAG: "NN", 'OP': "*"}
    +        ]
    +    )
    +    doc = nlp(u'Could you create a new ticket for me?')
    +    print([(w.tag_, w.text, w.lower_) for w in doc])
    +    matches = matcher(doc)
    +    print(matches)
    +    assert len(matches) == 1
    +    assert matches[0][1] == 4
    +    assert matches[0][2] == 5
    +    '''
    +    matcher = Matcher(Vocab())
    +    matcher.add(
    +        "TSTEND",
    +        None,
    +        [
    +            {'ORTH': "a"},
    +            {'ORTH': "b", 'OP': "*"}
    +        ]
    +    )
    +    doc = Doc(Vocab(), words=string.split())
    +    matches = matcher(doc)
    +    if start is None or end is None:
    +        assert matches == []
    +    
    +    assert matches[0][1] == start
    +    assert matches[0][2] == end
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index 9fcb47305..5b08ede39 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -3,6 +3,7 @@ from __future__ import unicode_literals
     
     from ..matcher import Matcher, PhraseMatcher
     from .util import get_doc
    +from ..tokens import Doc
     
     import pytest
     
    @@ -212,3 +213,24 @@ def test_operator_combos(matcher):
                 assert matches, (string, pattern_str)
             else:
                 assert not matches, (string, pattern_str)
    +
    +
    +def test_matcher_end_zero_plus(matcher):
    +    '''Test matcher works when patterns end with * operator. (issue 1450)'''
    +    matcher = Matcher(matcher.vocab)
    +    matcher.add(
    +        "TSTEND",
    +        None,
    +        [
    +            {'ORTH': "a"},
    +            {'ORTH': "b", 'OP': "*"}
    +        ]
    +    )
    +    nlp = lambda string: Doc(matcher.vocab, words=string.split())
    +    assert len(matcher(nlp(u'a'))) == 1
    +    assert len(matcher(nlp(u'a b'))) == 1
    +    assert len(matcher(nlp(u'a b'))) == 1
    +    assert len(matcher(nlp(u'a c'))) == 1
    +    assert len(matcher(nlp(u'a b c'))) == 1
    +    assert len(matcher(nlp(u'a b b c'))) == 1
    +    assert len(matcher(nlp(u'a b b'))) == 1
    
    From 4ef81a9ebce7674f0c290a70c8f2432bdd6198c6 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 15:27:29 +0200
    Subject: [PATCH 464/649] Fix whitespace
    
    ---
     spacy/tests/spans/test_span.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/spans/test_span.py b/spacy/tests/spans/test_span.py
    index 5e7c638b6..dbb835301 100644
    --- a/spacy/tests/spans/test_span.py
    +++ b/spacy/tests/spans/test_span.py
    @@ -100,7 +100,7 @@ def test_spans_are_hashable(en_tokenizer):
         assert hash(span1) != hash(span2)
         span3 = tokens[0:2]
         assert hash(span3) == hash(span1)
    - 
    +
     
     def test_spans_by_character(doc):
         span1 = doc[1:-2]
    
    From 090aed940a8340d20b4ab1cd31637ceae3753cfe Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 15:28:05 +0200
    Subject: [PATCH 465/649] Add test for currently failing span.as_doc case
    
    ---
     spacy/tests/spans/test_span.py | 6 ++++++
     1 file changed, 6 insertions(+)
    
    diff --git a/spacy/tests/spans/test_span.py b/spacy/tests/spans/test_span.py
    index dbb835301..4050809b5 100644
    --- a/spacy/tests/spans/test_span.py
    +++ b/spacy/tests/spans/test_span.py
    @@ -117,3 +117,9 @@ def test_span_to_array(doc):
         assert arr[0, 0] == span[0].orth
         assert arr[0, 1] == len(span[0])
     
    +
    +@pytest.mark.xfail
    +def test_span_as_doc(doc):
    +    span = doc[4:10]
    +    span_doc = span.as_doc()
    +    assert span.text == span_doc.text
    
    From 2b8e7c45e09d0ad45fb9b1c26cb69c451a629afe Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 15:35:16 +0200
    Subject: [PATCH 466/649] Use better training data JSON example
    
    ---
     examples/training/training-data.json | 1742 ++++++++++----------------
     1 file changed, 640 insertions(+), 1102 deletions(-)
    
    diff --git a/examples/training/training-data.json b/examples/training/training-data.json
    index 532ab4ea8..7737b9a14 100644
    --- a/examples/training/training-data.json
    +++ b/examples/training/training-data.json
    @@ -1,1103 +1,641 @@
     [
    -  {
    -    "id": 0,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "prep",
    -                "head": 44,
    -                "tag": "IN",
    -                "orth": "In"
    -              },
    -              {
    -                "dep": "det",
    -                "head": 3,
    -                "tag": "DT",
    -                "orth": "an"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 2,
    -                "tag": "NNP",
    -                "orth": "Oct."
    -              },
    -              {
    -                "dep": "num",
    -                "head": 1,
    -                "tag": "CD",
    -                "orth": "19"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -4,
    -                "tag": "NN",
    -                "orth": "review"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -1,
    -                "tag": "IN",
    -                "orth": "of"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": 2,
    -                "tag": "``",
    -                "orth": "``"
    -              },
    -              {
    -                "dep": "det",
    -                "head": 1,
    -                "tag": "DT",
    -                "orth": "The"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -3,
    -                "tag": "NN",
    -                "orth": "Misanthrope"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -1,
    -                "tag": "''",
    -                "orth": "''"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -2,
    -                "tag": "IN",
    -                "orth": "at"
    -              },
    -              {
    -                "dep": "poss",
    -                "head": 3,
    -                "tag": "NNP",
    -                "orth": "Chicago"
    -              },
    -              {
    -                "dep": "possessive",
    -                "head": -1,
    -                "tag": "POS",
    -                "orth": "'s"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Goodman"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -4,
    -                "tag": "NNP",
    -                "orth": "Theatre"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": 4,
    -                "tag": "-LRB-",
    -                "orth": "-LRB-"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": 3,
    -                "tag": "``",
    -                "orth": "``"
    -              },
    -              {
    -                "dep": "amod",
    -                "head": 1,
    -                "tag": "VBN",
    -                "orth": "Revitalized"
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 1,
    -                "tag": "NNS",
    -                "orth": "Classics"
    -              },
    -              {
    -                "dep": "dep",
    -                "head": -15,
    -                "tag": "VBP",
    -                "orth": "Take"
    -              },
    -              {
    -                "dep": "det",
    -                "head": 1,
    -                "tag": "DT",
    -                "orth": "the"
    -              },
    -              {
    -                "dep": "dobj",
    -                "head": -2,
    -                "tag": "NN",
    -                "orth": "Stage"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -3,
    -                "tag": "IN",
    -                "orth": "in"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Windy"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -2,
    -                "tag": "NNP",
    -                "orth": "City"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -6,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -7,
    -                "tag": "''",
    -                "orth": "''"
    -              },
    -              {
    -                "dep": "dep",
    -                "head": -8,
    -                "tag": "NN",
    -                "orth": "Leisure"
    -              },
    -              {
    -                "dep": "cc",
    -                "head": -1,
    -                "tag": "CC",
    -                "orth": "&"
    -              },
    -              {
    -                "dep": "conj",
    -                "head": -2,
    -                "tag": "NNS",
    -                "orth": "Arts"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -11,
    -                "tag": "-RRB-",
    -                "orth": "-RRB-"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": 13,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "det",
    -                "head": 1,
    -                "tag": "DT",
    -                "orth": "the"
    -              },
    -              {
    -                "dep": "nsubjpass",
    -                "head": 11,
    -                "tag": "NN",
    -                "orth": "role"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -1,
    -                "tag": "IN",
    -                "orth": "of"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -1,
    -                "tag": "NNP",
    -                "orth": "Celimene"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -3,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "partmod",
    -                "head": -4,
    -                "tag": "VBN",
    -                "orth": "played"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -1,
    -                "tag": "IN",
    -                "orth": "by"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Kim"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -2,
    -                "tag": "NNP",
    -                "orth": "Cattrall"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -8,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "auxpass",
    -                "head": 2,
    -                "tag": "VBD",
    -                "orth": "was"
    -              },
    -              {
    -                "dep": "advmod",
    -                "head": 1,
    -                "tag": "RB",
    -                "orth": "mistakenly"
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "VBN",
    -                "orth": "attributed"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -1,
    -                "tag": "TO",
    -                "orth": "to"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Christina"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -2,
    -                "tag": "NNP",
    -                "orth": "Haag"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -4,
    -                "tag": ".",
    -                "orth": "."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "id": 1,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Ms."
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Haag"
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "VBZ",
    -                "orth": "plays"
    -              },
    -              {
    -                "dep": "dobj",
    -                "head": -1,
    -                "tag": "NNP",
    -                "orth": "Elianti"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -2,
    -                "tag": ".",
    -                "orth": "."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "id": 2,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "nn",
    -                "head": 3,
    -                "tag": "NNP",
    -                "orth": "Rolls-Royce"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 2,
    -                "tag": "NNP",
    -                "orth": "Motor"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNPS",
    -                "orth": "Cars"
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Inc."
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "VBD",
    -                "orth": "said"
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 1,
    -                "tag": "PRP",
    -                "orth": "it"
    -              },
    -              {
    -                "dep": "ccomp",
    -                "head": -2,
    -                "tag": "VBZ",
    -                "orth": "expects"
    -              },
    -              {
    -                "dep": "poss",
    -                "head": 2,
    -                "tag": "PRP$",
    -                "orth": "its"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "U.S."
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 3,
    -                "tag": "NNS",
    -                "orth": "sales"
    -              },
    -              {
    -                "dep": "aux",
    -                "head": 2,
    -                "tag": "TO",
    -                "orth": "to"
    -              },
    -              {
    -                "dep": "cop",
    -                "head": 1,
    -                "tag": "VB",
    -                "orth": "remain"
    -              },
    -              {
    -                "dep": "xcomp",
    -                "head": -6,
    -                "tag": "JJ",
    -                "orth": "steady"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -1,
    -                "tag": "IN",
    -                "orth": "at"
    -              },
    -              {
    -                "dep": "quantmod",
    -                "head": 1,
    -                "tag": "IN",
    -                "orth": "about"
    -              },
    -              {
    -                "dep": "num",
    -                "head": 1,
    -                "tag": "CD",
    -                "orth": "1,200"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -3,
    -                "tag": "NNS",
    -                "orth": "cars"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -5,
    -                "tag": "IN",
    -                "orth": "in"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -1,
    -                "tag": "CD",
    -                "orth": "1990"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -15,
    -                "tag": ".",
    -                "orth": "."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "id": 3,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "det",
    -                "head": 3,
    -                "tag": "DT",
    -                "orth": "The"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 2,
    -                "tag": "NN",
    -                "orth": "luxury"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NN",
    -                "orth": "auto"
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 3,
    -                "tag": "NN",
    -                "orth": "maker"
    -              },
    -              {
    -                "dep": "amod",
    -                "head": 1,
    -                "tag": "JJ",
    -                "orth": "last"
    -              },
    -              {
    -                "dep": "tmod",
    -                "head": 1,
    -                "tag": "NN",
    -                "orth": "year"
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "VBD",
    -                "orth": "sold"
    -              },
    -              {
    -                "dep": "num",
    -                "head": 1,
    -                "tag": "CD",
    -                "orth": "1,214"
    -              },
    -              {
    -                "dep": "dobj",
    -                "head": -2,
    -                "tag": "NNS",
    -                "orth": "cars"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -3,
    -                "tag": "IN",
    -                "orth": "in"
    -              },
    -              {
    -                "dep": "det",
    -                "head": 1,
    -                "tag": "DT",
    -                "orth": "the"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -2,
    -                "tag": "NNP",
    -                "orth": "U.S."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "id": 4,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Howard"
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 8,
    -                "tag": "NNP",
    -                "orth": "Mosher"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -1,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "appos",
    -                "head": -2,
    -                "tag": "NN",
    -                "orth": "president"
    -              },
    -              {
    -                "dep": "cc",
    -                "head": -1,
    -                "tag": "CC",
    -                "orth": "and"
    -              },
    -              {
    -                "dep": "amod",
    -                "head": 2,
    -                "tag": "JJ",
    -                "orth": "chief"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NN",
    -                "orth": "executive"
    -              },
    -              {
    -                "dep": "conj",
    -                "head": -4,
    -                "tag": "NN",
    -                "orth": "officer"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -7,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "VBD",
    -                "orth": "said"
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 1,
    -                "tag": "PRP",
    -                "orth": "he"
    -              },
    -              {
    -                "dep": "ccomp",
    -                "head": -2,
    -                "tag": "VBZ",
    -                "orth": "anticipates"
    -              },
    -              {
    -                "dep": "dobj",
    -                "head": -1,
    -                "tag": "NN",
    -                "orth": "growth"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -1,
    -                "tag": "IN",
    -                "orth": "for"
    -              },
    -              {
    -                "dep": "det",
    -                "head": 3,
    -                "tag": "DT",
    -                "orth": "the"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 2,
    -                "tag": "NN",
    -                "orth": "luxury"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NN",
    -                "orth": "auto"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -4,
    -                "tag": "NN",
    -                "orth": "maker"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -6,
    -                "tag": "IN",
    -                "orth": "in"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -1,
    -                "tag": "NNP",
    -                "orth": "Britain"
    -              },
    -              {
    -                "dep": "cc",
    -                "head": -1,
    -                "tag": "CC",
    -                "orth": "and"
    -              },
    -              {
    -                "dep": "conj",
    -                "head": -2,
    -                "tag": "NNP",
    -                "orth": "Europe"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -4,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "cc",
    -                "head": -5,
    -                "tag": "CC",
    -                "orth": "and"
    -              },
    -              {
    -                "dep": "conj",
    -                "head": -6,
    -                "tag": "IN",
    -                "orth": "in"
    -              },
    -              {
    -                "dep": "amod",
    -                "head": 1,
    -                "tag": "JJ",
    -                "orth": "Far"
    -              },
    -              {
    -                "dep": "amod",
    -                "head": 1,
    -                "tag": "JJ",
    -                "orth": "Eastern"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -3,
    -                "tag": "NNS",
    -                "orth": "markets"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -19,
    -                "tag": ".",
    -                "orth": "."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "id": 5,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "nn",
    -                "head": 2,
    -                "tag": "NNP",
    -                "orth": "BELL"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "INDUSTRIES"
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Inc."
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "VBD",
    -                "orth": "increased"
    -              },
    -              {
    -                "dep": "poss",
    -                "head": 1,
    -                "tag": "PRP$",
    -                "orth": "its"
    -              },
    -              {
    -                "dep": "dobj",
    -                "head": -2,
    -                "tag": "NN",
    -                "orth": "quarterly"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -3,
    -                "tag": "TO",
    -                "orth": "to"
    -              },
    -              {
    -                "dep": "num",
    -                "head": 1,
    -                "tag": "CD",
    -                "orth": "10"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -2,
    -                "tag": "NNS",
    -                "orth": "cents"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -6,
    -                "tag": "IN",
    -                "orth": "from"
    -              },
    -              {
    -                "dep": "num",
    -                "head": 1,
    -                "tag": "CD",
    -                "orth": "seven"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -2,
    -                "tag": "NNS",
    -                "orth": "cents"
    -              },
    -              {
    -                "dep": "det",
    -                "head": 1,
    -                "tag": "DT",
    -                "orth": "a"
    -              },
    -              {
    -                "dep": "npadvmod",
    -                "head": -2,
    -                "tag": "NN",
    -                "orth": "share"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -11,
    -                "tag": ".",
    -                "orth": "."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "id": 6,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "det",
    -                "head": 2,
    -                "tag": "DT",
    -                "orth": "The"
    -              },
    -              {
    -                "dep": "amod",
    -                "head": 1,
    -                "tag": "JJ",
    -                "orth": "new"
    -              },
    -              {
    -                "dep": "nsubj",
    -                "head": 3,
    -                "tag": "NN",
    -                "orth": "rate"
    -              },
    -              {
    -                "dep": "aux",
    -                "head": 2,
    -                "tag": "MD",
    -                "orth": "will"
    -              },
    -              {
    -                "dep": "cop",
    -                "head": 1,
    -                "tag": "VB",
    -                "orth": "be"
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "JJ",
    -                "orth": "payable"
    -              },
    -              {
    -                "dep": "tmod",
    -                "head": -1,
    -                "tag": "NNP",
    -                "orth": "Feb."
    -              },
    -              {
    -                "dep": "num",
    -                "head": -1,
    -                "tag": "CD",
    -                "orth": "15"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -3,
    -                "tag": ".",
    -                "orth": "."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "id": 7,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "det",
    -                "head": 2,
    -                "tag": "DT",
    -                "orth": "A"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NN",
    -                "orth": "record"
    -              },
    -              {
    -                "dep": "nsubjpass",
    -                "head": 4,
    -                "tag": "NN",
    -                "orth": "date"
    -              },
    -              {
    -                "dep": "aux",
    -                "head": 3,
    -                "tag": "VBZ",
    -                "orth": "has"
    -              },
    -              {
    -                "dep": "neg",
    -                "head": 2,
    -                "tag": "RB",
    -                "orth": "n't"
    -              },
    -              {
    -                "dep": "auxpass",
    -                "head": 1,
    -                "tag": "VBN",
    -                "orth": "been"
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "VBN",
    -                "orth": "set"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -1,
    -                "tag": ".",
    -                "orth": "."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  },
    -  {
    -    "id": 8,
    -    "paragraphs": [
    -      {
    -        "sentences": [
    -          {
    -            "tokens": [
    -              {
    -                "dep": "nsubj",
    -                "head": 7,
    -                "tag": "NNP",
    -                "orth": "Bell"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -1,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "partmod",
    -                "head": -2,
    -                "tag": "VBN",
    -                "orth": "based"
    -              },
    -              {
    -                "dep": "prep",
    -                "head": -1,
    -                "tag": "IN",
    -                "orth": "in"
    -              },
    -              {
    -                "dep": "nn",
    -                "head": 1,
    -                "tag": "NNP",
    -                "orth": "Los"
    -              },
    -              {
    -                "dep": "pobj",
    -                "head": -2,
    -                "tag": "NNP",
    -                "orth": "Angeles"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -6,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "ROOT",
    -                "head": 0,
    -                "tag": "VBZ",
    -                "orth": "makes"
    -              },
    -              {
    -                "dep": "cc",
    -                "head": -1,
    -                "tag": "CC",
    -                "orth": "and"
    -              },
    -              {
    -                "dep": "conj",
    -                "head": -2,
    -                "tag": "VBZ",
    -                "orth": "distributes"
    -              },
    -              {
    -                "dep": "amod",
    -                "head": 5,
    -                "tag": "JJ",
    -                "orth": "electronic"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -1,
    -                "tag": ",",
    -                "orth": ","
    -              },
    -              {
    -                "dep": "conj",
    -                "head": -2,
    -                "tag": "NN",
    -                "orth": "computer"
    -              },
    -              {
    -                "dep": "cc",
    -                "head": -3,
    -                "tag": "CC",
    -                "orth": "and"
    -              },
    -              {
    -                "dep": "conj",
    -                "head": -4,
    -                "tag": "NN",
    -                "orth": "building"
    -              },
    -              {
    -                "dep": "dobj",
    -                "head": -8,
    -                "tag": "NNS",
    -                "orth": "products"
    -              },
    -              {
    -                "dep": "punct",
    -                "head": -9,
    -                "tag": ".",
    -                "orth": "."
    -              }
    -            ]
    -          }
    -        ]
    -      }
    -    ]
    -  }
    -]
    +    {
    +      "id": "wsj_0200",
    +      "paragraphs": [
    +        {
    +          "raw": "In an Oct. 19 review of \"The Misanthrope\" at Chicago's Goodman Theatre (\"Revitalized Classics Take the Stage in Windy City,\" Leisure & Arts), the role of Celimene, played by Kim Cattrall, was mistakenly attributed to Christina Haag. Ms. Haag plays Elianti.",
    +          "sentences": [
    +            {
    +              "tokens": [
    +                {
    +                  "head": 44,
    +                  "dep": "prep",
    +                  "tag": "IN",
    +                  "orth": "In",
    +                  "ner": "O",
    +                  "id": 0
    +                },
    +                {
    +                  "head": 3,
    +                  "dep": "det",
    +                  "tag": "DT",
    +                  "orth": "an",
    +                  "ner": "O",
    +                  "id": 1
    +                },
    +                {
    +                  "head": 2,
    +                  "dep": "nmod",
    +                  "tag": "NNP",
    +                  "orth": "Oct.",
    +                  "ner": "B-DATE",
    +                  "id": 2
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "nummod",
    +                  "tag": "CD",
    +                  "orth": "19",
    +                  "ner": "L-DATE",
    +                  "id": 3
    +                },
    +                {
    +                  "head": -4,
    +                  "dep": "pobj",
    +                  "tag": "NN",
    +                  "orth": "review",
    +                  "ner": "O",
    +                  "id": 4
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "prep",
    +                  "tag": "IN",
    +                  "orth": "of",
    +                  "ner": "O",
    +                  "id": 5
    +                },
    +                {
    +                  "head": 2,
    +                  "dep": "punct",
    +                  "tag": "``",
    +                  "orth": "``",
    +                  "ner": "O",
    +                  "id": 6
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "det",
    +                  "tag": "DT",
    +                  "orth": "The",
    +                  "ner": "B-WORK_OF_ART",
    +                  "id": 7
    +                },
    +                {
    +                  "head": -3,
    +                  "dep": "pobj",
    +                  "tag": "NN",
    +                  "orth": "Misanthrope",
    +                  "ner": "L-WORK_OF_ART",
    +                  "id": 8
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "punct",
    +                  "tag": "''",
    +                  "orth": "''",
    +                  "ner": "O",
    +                  "id": 9
    +                },
    +                {
    +                  "head": -2,
    +                  "dep": "prep",
    +                  "tag": "IN",
    +                  "orth": "at",
    +                  "ner": "O",
    +                  "id": 10
    +                },
    +                {
    +                  "head": 3,
    +                  "dep": "poss",
    +                  "tag": "NNP",
    +                  "orth": "Chicago",
    +                  "ner": "U-GPE",
    +                  "id": 11
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "case",
    +                  "tag": "POS",
    +                  "orth": "'s",
    +                  "ner": "O",
    +                  "id": 12
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "compound",
    +                  "tag": "NNP",
    +                  "orth": "Goodman",
    +                  "ner": "B-FAC",
    +                  "id": 13
    +                },
    +                {
    +                  "head": -4,
    +                  "dep": "pobj",
    +                  "tag": "NNP",
    +                  "orth": "Theatre",
    +                  "ner": "L-FAC",
    +                  "id": 14
    +                },
    +                {
    +                  "head": 4,
    +                  "dep": "punct",
    +                  "tag": "-LRB-",
    +                  "orth": "(",
    +                  "ner": "O",
    +                  "id": 15
    +                },
    +                {
    +                  "head": 3,
    +                  "dep": "punct",
    +                  "tag": "``",
    +                  "orth": "``",
    +                  "ner": "O",
    +                  "id": 16
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "amod",
    +                  "tag": "VBN",
    +                  "orth": "Revitalized",
    +                  "ner": "B-WORK_OF_ART",
    +                  "id": 17
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "nsubj",
    +                  "tag": "NNS",
    +                  "orth": "Classics",
    +                  "ner": "I-WORK_OF_ART",
    +                  "id": 18
    +                },
    +                {
    +                  "head": -15,
    +                  "dep": "appos",
    +                  "tag": "VBP",
    +                  "orth": "Take",
    +                  "ner": "I-WORK_OF_ART",
    +                  "id": 19
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "det",
    +                  "tag": "DT",
    +                  "orth": "the",
    +                  "ner": "I-WORK_OF_ART",
    +                  "id": 20
    +                },
    +                {
    +                  "head": -2,
    +                  "dep": "dobj",
    +                  "tag": "NN",
    +                  "orth": "Stage",
    +                  "ner": "I-WORK_OF_ART",
    +                  "id": 21
    +                },
    +                {
    +                  "head": -3,
    +                  "dep": "prep",
    +                  "tag": "IN",
    +                  "orth": "in",
    +                  "ner": "I-WORK_OF_ART",
    +                  "id": 22
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "compound",
    +                  "tag": "NNP",
    +                  "orth": "Windy",
    +                  "ner": "I-WORK_OF_ART",
    +                  "id": 23
    +                },
    +                {
    +                  "head": -2,
    +                  "dep": "pobj",
    +                  "tag": "NNP",
    +                  "orth": "City",
    +                  "ner": "L-WORK_OF_ART",
    +                  "id": 24
    +                },
    +                {
    +                  "head": -6,
    +                  "dep": "punct",
    +                  "tag": ",",
    +                  "orth": ",",
    +                  "ner": "O",
    +                  "id": 25
    +                },
    +                {
    +                  "head": -7,
    +                  "dep": "punct",
    +                  "tag": "''",
    +                  "orth": "''",
    +                  "ner": "O",
    +                  "id": 26
    +                },
    +                {
    +                  "head": -8,
    +                  "dep": "npadvmod",
    +                  "tag": "NN",
    +                  "orth": "Leisure",
    +                  "ner": "B-ORG",
    +                  "id": 27
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "cc",
    +                  "tag": "CC",
    +                  "orth": "&",
    +                  "ner": "I-ORG",
    +                  "id": 28
    +                },
    +                {
    +                  "head": -2,
    +                  "dep": "conj",
    +                  "tag": "NNS",
    +                  "orth": "Arts",
    +                  "ner": "L-ORG",
    +                  "id": 29
    +                },
    +                {
    +                  "head": -11,
    +                  "dep": "punct",
    +                  "tag": "-RRB-",
    +                  "orth": ")",
    +                  "ner": "O",
    +                  "id": 30
    +                },
    +                {
    +                  "head": 13,
    +                  "dep": "punct",
    +                  "tag": ",",
    +                  "orth": ",",
    +                  "ner": "O",
    +                  "id": 31
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "det",
    +                  "tag": "DT",
    +                  "orth": "the",
    +                  "ner": "O",
    +                  "id": 32
    +                },
    +                {
    +                  "head": 11,
    +                  "dep": "nsubjpass",
    +                  "tag": "NN",
    +                  "orth": "role",
    +                  "ner": "O",
    +                  "id": 33
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "prep",
    +                  "tag": "IN",
    +                  "orth": "of",
    +                  "ner": "O",
    +                  "id": 34
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "pobj",
    +                  "tag": "NNP",
    +                  "orth": "Celimene",
    +                  "ner": "U-PERSON",
    +                  "id": 35
    +                },
    +                {
    +                  "head": -3,
    +                  "dep": "punct",
    +                  "tag": ",",
    +                  "orth": ",",
    +                  "ner": "O",
    +                  "id": 36
    +                },
    +                {
    +                  "head": -4,
    +                  "dep": "acl",
    +                  "tag": "VBN",
    +                  "orth": "played",
    +                  "ner": "O",
    +                  "id": 37
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "agent",
    +                  "tag": "IN",
    +                  "orth": "by",
    +                  "ner": "O",
    +                  "id": 38
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "compound",
    +                  "tag": "NNP",
    +                  "orth": "Kim",
    +                  "ner": "B-PERSON",
    +                  "id": 39
    +                },
    +                {
    +                  "head": -2,
    +                  "dep": "pobj",
    +                  "tag": "NNP",
    +                  "orth": "Cattrall",
    +                  "ner": "L-PERSON",
    +                  "id": 40
    +                },
    +                {
    +                  "head": -8,
    +                  "dep": "punct",
    +                  "tag": ",",
    +                  "orth": ",",
    +                  "ner": "O",
    +                  "id": 41
    +                },
    +                {
    +                  "head": 2,
    +                  "dep": "auxpass",
    +                  "tag": "VBD",
    +                  "orth": "was",
    +                  "ner": "O",
    +                  "id": 42
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "advmod",
    +                  "tag": "RB",
    +                  "orth": "mistakenly",
    +                  "ner": "O",
    +                  "id": 43
    +                },
    +                {
    +                  "head": 0,
    +                  "dep": "root",
    +                  "tag": "VBN",
    +                  "orth": "attributed",
    +                  "ner": "O",
    +                  "id": 44
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "prep",
    +                  "tag": "IN",
    +                  "orth": "to",
    +                  "ner": "O",
    +                  "id": 45
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "compound",
    +                  "tag": "NNP",
    +                  "orth": "Christina",
    +                  "ner": "B-PERSON",
    +                  "id": 46
    +                },
    +                {
    +                  "head": -2,
    +                  "dep": "pobj",
    +                  "tag": "NNP",
    +                  "orth": "Haag",
    +                  "ner": "L-PERSON",
    +                  "id": 47
    +                },
    +                {
    +                  "head": -4,
    +                  "dep": "punct",
    +                  "tag": ".",
    +                  "orth": ".",
    +                  "ner": "O",
    +                  "id": 48
    +                }
    +              ],
    +              "brackets": [
    +                {
    +                  "first": 2,
    +                  "last": 3,
    +                  "label": "NML"
    +                },
    +                {
    +                  "first": 1,
    +                  "last": 4,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 7,
    +                  "last": 8,
    +                  "label": "NP-TTL"
    +                },
    +                {
    +                  "first": 11,
    +                  "last": 12,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 11,
    +                  "last": 14,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 10,
    +                  "last": 14,
    +                  "label": "PP-LOC"
    +                },
    +                {
    +                  "first": 6,
    +                  "last": 14,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 5,
    +                  "last": 14,
    +                  "label": "PP"
    +                },
    +                {
    +                  "first": 1,
    +                  "last": 14,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 17,
    +                  "last": 18,
    +                  "label": "NP-SBJ"
    +                },
    +                {
    +                  "first": 20,
    +                  "last": 21,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 23,
    +                  "last": 24,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 22,
    +                  "last": 24,
    +                  "label": "PP-LOC"
    +                },
    +                {
    +                  "first": 19,
    +                  "last": 24,
    +                  "label": "VP"
    +                },
    +                {
    +                  "first": 17,
    +                  "last": 24,
    +                  "label": "S-HLN"
    +                },
    +                {
    +                  "first": 27,
    +                  "last": 29,
    +                  "label": "NP-TMP"
    +                },
    +                {
    +                  "first": 15,
    +                  "last": 30,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 1,
    +                  "last": 30,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 0,
    +                  "last": 30,
    +                  "label": "PP-LOC"
    +                },
    +                {
    +                  "first": 32,
    +                  "last": 33,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 35,
    +                  "last": 35,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 34,
    +                  "last": 35,
    +                  "label": "PP"
    +                },
    +                {
    +                  "first": 32,
    +                  "last": 35,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 39,
    +                  "last": 40,
    +                  "label": "NP-LGS"
    +                },
    +                {
    +                  "first": 38,
    +                  "last": 40,
    +                  "label": "PP"
    +                },
    +                {
    +                  "first": 37,
    +                  "last": 40,
    +                  "label": "VP"
    +                },
    +                {
    +                  "first": 32,
    +                  "last": 41,
    +                  "label": "NP-SBJ-2"
    +                },
    +                {
    +                  "first": 43,
    +                  "last": 43,
    +                  "label": "ADVP-MNR"
    +                },
    +                {
    +                  "first": 46,
    +                  "last": 47,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 45,
    +                  "last": 47,
    +                  "label": "PP-CLR"
    +                },
    +                {
    +                  "first": 44,
    +                  "last": 47,
    +                  "label": "VP"
    +                },
    +                {
    +                  "first": 42,
    +                  "last": 47,
    +                  "label": "VP"
    +                },
    +                {
    +                  "first": 0,
    +                  "last": 48,
    +                  "label": "S"
    +                }
    +              ]
    +            },
    +            {
    +              "tokens": [
    +                {
    +                  "head": 1,
    +                  "dep": "compound",
    +                  "tag": "NNP",
    +                  "orth": "Ms.",
    +                  "ner": "O",
    +                  "id": 0
    +                },
    +                {
    +                  "head": 1,
    +                  "dep": "nsubj",
    +                  "tag": "NNP",
    +                  "orth": "Haag",
    +                  "ner": "U-PERSON",
    +                  "id": 1
    +                },
    +                {
    +                  "head": 0,
    +                  "dep": "root",
    +                  "tag": "VBZ",
    +                  "orth": "plays",
    +                  "ner": "O",
    +                  "id": 2
    +                },
    +                {
    +                  "head": -1,
    +                  "dep": "dobj",
    +                  "tag": "NNP",
    +                  "orth": "Elianti",
    +                  "ner": "U-PERSON",
    +                  "id": 3
    +                },
    +                {
    +                  "head": -2,
    +                  "dep": "punct",
    +                  "tag": ".",
    +                  "orth": ".",
    +                  "ner": "O",
    +                  "id": 4
    +                }
    +              ],
    +              "brackets": [
    +                {
    +                  "first": 0,
    +                  "last": 1,
    +                  "label": "NP-SBJ"
    +                },
    +                {
    +                  "first": 3,
    +                  "last": 3,
    +                  "label": "NP"
    +                },
    +                {
    +                  "first": 2,
    +                  "last": 3,
    +                  "label": "VP"
    +                },
    +                {
    +                  "first": 0,
    +                  "last": 4,
    +                  "label": "S"
    +                }
    +              ]
    +            }
    +          ]
    +        }
    +      ]
    +    }
    +  ]
    
    From c9dc88ddfc8d605818b02cea7b2ce95dbaf97610 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 15:50:41 +0200
    Subject: [PATCH 467/649] Document current JSON format for training
    
    ---
     website/api/_annotation/_training.jade      | 46 +++++++++++++++++++++
     website/api/annotation.jade                 | 29 +------------
     website/usage/_training/_tagger-parser.jade |  4 ++
     3 files changed, 51 insertions(+), 28 deletions(-)
     create mode 100644 website/api/_annotation/_training.jade
    
    diff --git a/website/api/_annotation/_training.jade b/website/api/_annotation/_training.jade
    new file mode 100644
    index 000000000..3b11eb2f5
    --- /dev/null
    +++ b/website/api/_annotation/_training.jade
    @@ -0,0 +1,46 @@
    +//- 💫 DOCS > API > ANNOTATION > TRAINING
    +
    +p
    +    |  spaCy takes training data in JSON format. The built-in
    +    |  #[+api("cli#convert") #[code convert]] command helps you convert the
    +    |  #[code .conllu] format used by the
    +    |  #[+a("https://github.com/UniversalDependencies") Universal Dependencies corpora]
    +    |  to spaCy's training format.
    +
    ++aside("Annotating entities")
    +    |  Named entities are provided in the #[+a("/api/annotation#biluo") BILUO]
    +    |  notation. Tokens outside an entity are set to #[code "O"] and tokens
    +    |  that are part of an entity are set to the entity label, prefixed by the
    +    |  BILUO marker. For example #[code "B-ORG"] describes the first token of
    +    |  a multi-token #[code ORG] entity and #[code "U-PERSON"] a single
    +    |  token representing a #[code PERSON] entity
    +
    ++code("Example structure").
    +    [{
    +        "id": int,                      # ID of the document within the corpus
    +        "paragraphs": [{                # list of paragraphs in the corpus
    +            "raw": string,              # raw text of the paragraph
    +            "sentences": [{             # list of sentences in the paragraph
    +                "tokens": [{            # list of tokens in the sentence
    +                    "id": int,          # index of the token in the document
    +                    "dep": string,      # dependency label
    +                    "head": int,        # offset of token head relative to token index
    +                    "tag": string,      # part-of-speech tag
    +                    "orth": string,     # verbatim text of the token
    +                    "ner": string       # BILUO label, e.g. "O" or "B-ORG"
    +                }],
    +                "brackets": [{          # phrase structure (NOT USED by current models)
    +                    "first": int,       # index of first token
    +                    "last": int,        # index of last token
    +                    "label": string     # phrase label
    +                }]
    +            }]
    +        }]
    +    }]
    +
    +p
    +    |  Here's an example of dependencies, part-of-speech tags and names
    +    |  entities, taken from the English Wall Street Journal portion of the Penn
    +    |  Treebank:
    +
    ++github("spacy", "examples/training/training-data.json", false, false, "json")
    diff --git a/website/api/annotation.jade b/website/api/annotation.jade
    index efada23d7..c65cd3983 100644
    --- a/website/api/annotation.jade
    +++ b/website/api/annotation.jade
    @@ -101,31 +101,4 @@ p This document describes the target annotations spaCy is trained to predict.
     +section("training")
         +h(2, "json-input") JSON input format for training
     
    -    +under-construction
    -
    -    p spaCy takes training data in the following format:
    -
    -    +code("Example structure").
    -        doc: {
    -            id: string,
    -            paragraphs: [{
    -                raw: string,
    -                sents: [int],
    -                tokens: [{
    -                    start: int,
    -                    tag: string,
    -                    head: int,
    -                    dep: string
    -                }],
    -                ner: [{
    -                    start: int,
    -                    end: int,
    -                    label: string
    -                }],
    -                brackets: [{
    -                    start: int,
    -                    end: int,
    -                    label: string
    -                }]
    -            }]
    -        }
    +    include _annotation/_training
    diff --git a/website/usage/_training/_tagger-parser.jade b/website/usage/_training/_tagger-parser.jade
    index 4011464c7..a62b9d43e 100644
    --- a/website/usage/_training/_tagger-parser.jade
    +++ b/website/usage/_training/_tagger-parser.jade
    @@ -1,3 +1,7 @@
     //- 💫 DOCS > USAGE > TRAINING > TAGGER & PARSER
     
     +under-construction
    +
    ++h(3, "training-json") JSON format for training
    +
    +include ../../api/_annotation/_training
    
    From 3944c1d6e7e6a62824b4074545c59f183ad4479a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 15:51:05 +0200
    Subject: [PATCH 468/649] Document lemmatizer
    
    ---
     website/api/_data.json      |   4 +-
     website/api/lemmatizer.jade | 157 +++++++++++++++++++++++++++++++++++-
     2 files changed, 159 insertions(+), 2 deletions(-)
    
    diff --git a/website/api/_data.json b/website/api/_data.json
    index d85b103dc..e9324e7e3 100644
    --- a/website/api/_data.json
    +++ b/website/api/_data.json
    @@ -160,7 +160,9 @@
     
         "lemmatizer": {
             "title": "Lemmatizer",
    -        "tag": "class"
    +        "teaser": "Assign the base forms of words.",
    +        "tag": "class",
    +        "source": "spacy/lemmatizer.py"
         },
     
         "tagger": {
    diff --git a/website/api/lemmatizer.jade b/website/api/lemmatizer.jade
    index 9699395b1..eb061f10a 100644
    --- a/website/api/lemmatizer.jade
    +++ b/website/api/lemmatizer.jade
    @@ -2,4 +2,159 @@
     
     include ../_includes/_mixins
     
    -+under-construction
    +p
    +    |  The #[code Lemmatizer] supports simple part-of-speech-sensitive suffix
    +    |  rules and lookup tables.
    +
    ++h(2, "init") Lemmatizer.__init__
    +    +tag method
    +
    +p Create a #[code Lemmatizer].
    +
    ++aside-code("Example").
    +    from spacy.lemmatizer import Lemmatizer
    +    lemmatizer = Lemmatizer()
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code index]
    +        +cell dict / #[code None]
    +        +cell Inventory of lemmas in the language.
    +
    +    +row
    +        +cell #[code exceptions]
    +        +cell dict / #[code None]
    +        +cell Mapping of string forms to lemmas that bypass the #[code rules].
    +
    +    +row
    +        +cell #[code rules]
    +        +cell dict / #[code None]
    +        +cell List of suffix rewrite rules.
    +
    +    +row
    +        +cell #[code lookup]
    +        +cell dict / #[code None]
    +        +cell Lookup table mapping string to their lemmas.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Lemmatizer]
    +        +cell The newly created object.
    +
    ++h(2, "call") Lemmatizer.__call__
    +    +tag method
    +
    +p Lemmatize a string.
    +
    ++aside-code("Example").
    +    from spacy.lemmatizer import Lemmatizer
    +    from spacy.lang.en import LEMMA_INDEX, LEMMA_EXC, LEMMA_RULES
    +    lemmatizer = Lemmatizer(LEMMA_INDEX, LEMMA_EXC, LEMMA_RULES)
    +    lemmas = lemmatizer(u'ducks', u'NOUN')
    +    assert lemmas == [u'duck']
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code string]
    +        +cell unicode
    +        +cell The string to lemmatize, e.g. the token text.
    +
    +    +row
    +        +cell #[code univ_pos]
    +        +cell unicode / int
    +        +cell The token's universal part-of-speech tag.
    +
    +    +row
    +        +cell #[code morphology]
    +        +cell dict / #[code None]
    +        +cell
    +            |  Morphological features following the
    +            |  #[+a("http://universaldependencies.org/") Universal Dependencies]
    +            |  scheme.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell list
    +        +cell The available lemmas for the string.
    +
    ++h(2, "lookup") Lemmatizer.lookup
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Look up a lemma in the lookup table, if available. If no lemma is found,
    +    |  the original string is returned. Languages can provide a
    +    |  #[+a("/usage/adding-languages#lemmatizer") lookup table] via the
    +    |  #[code lemma_lookup] variable, set on the individual #[code Language]
    +    |  class.
    +
    ++aside-code("Example").
    +    lookup = {u'going': u'go'}
    +    lemmatizer = Lemmatizer(lookup=lookup)
    +    assert lemmatizer.lookup(u'going') == u'go'
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code string]
    +        +cell unicode
    +        +cell The string to look up.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell unicode
    +        +cell The lemma if the string was found, otherwise the original string.
    +
    ++h(2, "is_base_form") Lemmatizer.is_base_form
    +    +tag method
    +
    +p
    +    |  Check whether we're dealing with an uninflected paradigm, so we can
    +    |  avoid lemmatization entirely.
    +
    ++aside-code("Example").
    +    pos = 'verb'
    +    morph = {'VerbForm': 'inf'}
    +    is_base_form = lemmatizer.is_base_form(pos, morph)
    +    assert is_base_form == True
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code univ_pos]
    +        +cell unicode / int
    +        +cell The token's universal part-of-speech tag.
    +
    +    +row
    +        +cell #[code morphology]
    +        +cell dict
    +        +cell The token's morphological features.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell
    +            |  Whether the token's part-of-speech tag and morphological features
    +            |  describe a base form.
    +
    ++h(2, "attributes") Attributes
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code index]
    +        +cell dict / #[code None]
    +        +cell Inventory of lemmas in the language.
    +
    +    +row
    +        +cell #[code exc]
    +        +cell dict / #[code None]
    +        +cell Mapping of string forms to lemmas that bypass the #[code rules].
    +
    +    +row
    +        +cell #[code rules]
    +        +cell dict / #[code None]
    +        +cell List of suffix rewrite rules.
    +
    +    +row
    +        +cell #[code lookup_table]
    +            +tag-new(2)
    +        +cell dict / #[code None]
    +        +cell The lemma lookup table, if available.
    
    From 56a47f137f7f5334bbc0ae580e9aee7e207731e4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 15:51:13 +0200
    Subject: [PATCH 469/649] Add title description for tokenizer
    
    ---
     website/api/_data.json | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/website/api/_data.json b/website/api/_data.json
    index e9324e7e3..ba7997690 100644
    --- a/website/api/_data.json
    +++ b/website/api/_data.json
    @@ -154,6 +154,7 @@
     
         "tokenizer": {
             "title": "Tokenizer",
    +        "teaser": "Segment text into words, punctuations marks etc.",
             "tag": "class",
             "source": "spacy/tokenizer.pyx"
         },
    
    From 6686e53530c97b7c5b6b7b0cd132aaf0f07d816f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 15:51:24 +0200
    Subject: [PATCH 470/649] Allow GitHub embeds to specify optional language
    
    ---
     website/_includes/_mixins.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 414ee809e..b7375e2e0 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -181,7 +181,7 @@ mixin codepen(slug, height, default_tab)
         alt_file - [string] alternative file path used in footer and link button
         height   - [integer] height of code preview in px
     
    -mixin github(repo, file, alt_file, height)
    +mixin github(repo, file, alt_file, height, language)
         - var branch = ALPHA ? "develop" : "master"
         - var height = height || 250
     
    
    From 95f61745162db49649bb3849aef59a173563c3f8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 16:00:13 +0200
    Subject: [PATCH 471/649] Remove tensorizer from model pipeline example in
     spacy package
    
    ---
     spacy/cli/package.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/cli/package.py b/spacy/cli/package.py
    index 5ffc493c3..83d4917f6 100644
    --- a/spacy/cli/package.py
    +++ b/spacy/cli/package.py
    @@ -101,7 +101,7 @@ def generate_meta():
     def generate_pipeline():
         prints("If set to 'True', the default pipeline is used. If set to 'False', "
                "the pipeline will be disabled. Components should be specified as a "
    -           "comma-separated list of component names, e.g. tensorizer, tagger, "
    +           "comma-separated list of component names, e.g. tagger, "
                "parser, ner. For more information, see the docs on processing pipelines.",
                title="Enter your model's pipeline components")
         pipeline = util.get_raw_input("Pipeline components", True)
    
    From 95f866f99f42ca2475991c23ef10141730000324 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 16:00:33 +0200
    Subject: [PATCH 472/649] Add lookup argument to Lemmatizer.load
    
    ---
     spacy/lemmatizer.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index bd2ca766a..1f401f63c 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -7,8 +7,8 @@ from .symbols import VerbForm_inf, VerbForm_none, Number_sing, Degree_pos
     
     class Lemmatizer(object):
         @classmethod
    -    def load(cls, path, index=None, exc=None, rules=None):
    -        return cls(index or {}, exc or {}, rules or {})
    +    def load(cls, path, index=None, exc=None, rules=None, lookup=None):
    +        return cls(index or {}, exc or {}, rules or {}, lookup or {})
     
         def __init__(self, index=None, exceptions=None, rules=None, lookup=None):
             self.index = index if index is not None else {}
    
    From 8492d5be6dd7b9d10bccd97c70fd157a3122abd7 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 16:00:54 +0200
    Subject: [PATCH 473/649] Always make lemmatizer return a list of lemmas, not a
     set
    
    ---
     spacy/lemmatizer.py  | 6 +++---
     spacy/morphology.pyx | 2 +-
     2 files changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 1f401f63c..f3327a1d7 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -26,10 +26,10 @@ class Lemmatizer(object):
             elif univ_pos in (PUNCT, 'PUNCT', 'punct'):
                 univ_pos = 'punct'
             else:
    -            return set([string.lower()])
    +            return list(set([string.lower()]))
             # See Issue #435 for example of where this logic is requied.
             if self.is_base_form(univ_pos, morphology):
    -            return set([string.lower()])
    +            return list(set([string.lower()]))
             lemmas = lemmatize(string, self.index.get(univ_pos, {}),
                                self.exc.get(univ_pos, {}),
                                self.rules.get(univ_pos, []))
    @@ -108,4 +108,4 @@ def lemmatize(string, index, exceptions, rules):
             forms.extend(oov_forms)
         if not forms:
             forms.append(string)
    -    return set(forms)
    +    return list(set(forms))
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 7845ab4e7..090a07fe8 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -172,7 +172,7 @@ cdef class Morphology:
             cdef unicode py_string = self.strings[orth]
             if self.lemmatizer is None:
                 return self.strings.add(py_string.lower())
    -        cdef set lemma_strings
    +        cdef list lemma_strings
             cdef unicode lemma_string
             lemma_strings = self.lemmatizer(py_string, univ_pos, morphology)
             lemma_string = sorted(lemma_strings)[0]
    
    From 63f0bde749018909812de4f1cf3ec12cf6770483 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 16:07:18 +0200
    Subject: [PATCH 474/649] Add test for #1250: Tokenizer cache clobbered
     special-case attrs
    
    ---
     spacy/tests/regression/test_issue1250.py | 13 +++++++++++++
     1 file changed, 13 insertions(+)
     create mode 100644 spacy/tests/regression/test_issue1250.py
    
    diff --git a/spacy/tests/regression/test_issue1250.py b/spacy/tests/regression/test_issue1250.py
    new file mode 100644
    index 000000000..3b6e0bbf2
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1250.py
    @@ -0,0 +1,13 @@
    +from __future__ import unicode_literals
    +from ...tokenizer import Tokenizer
    +from ...symbols import ORTH, LEMMA, POS
    +from ...lang.en import English
    +
    +def test_issue1250_cached_special_cases():
    +    nlp = English()
    +    nlp.tokenizer.add_special_case(u'reimbur', [{ORTH: u'reimbur', LEMMA: u'reimburse', POS: u'VERB'}])
    +
    +    lemmas = [w.lemma_ for w in nlp(u'reimbur, reimbur...')]
    +    assert lemmas == ['reimburse', ',', 'reimburse', '...']
    +    lemmas = [w.lemma_ for w in nlp(u'reimbur, reimbur...')]
    +    assert lemmas == ['reimburse', ',', 'reimburse', '...']
    
    From b0f6fd3f1db76131c230b317caba946ce516a193 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 16:07:44 +0200
    Subject: [PATCH 475/649] Disable tokenizer cache for special-cases. Fixes
     #1250
    
    ---
     spacy/tokenizer.pxd |  5 +++--
     spacy/tokenizer.pyx | 27 ++++++++++++++++++++-------
     2 files changed, 23 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/tokenizer.pxd b/spacy/tokenizer.pxd
    index 1a3e86b49..919b0928b 100644
    --- a/spacy/tokenizer.pxd
    +++ b/spacy/tokenizer.pxd
    @@ -27,8 +27,9 @@ cdef class Tokenizer:
         cdef int _try_cache(self, hash_t key, Doc tokens) except -1
         cdef int _tokenize(self, Doc tokens, unicode span, hash_t key) except -1
         cdef unicode _split_affixes(self, Pool mem, unicode string, vector[LexemeC*] *prefixes,
    -                             vector[LexemeC*] *suffixes)
    +                             vector[LexemeC*] *suffixes, int* has_special)
         cdef int _attach_tokens(self, Doc tokens, unicode string,
                                 vector[LexemeC*] *prefixes, vector[LexemeC*] *suffixes) except -1
     
    -    cdef int _save_cached(self, const TokenC* tokens, hash_t key, int n) except -1
    +    cdef int _save_cached(self, const TokenC* tokens, hash_t key, int has_special,
    +                          int n) except -1
    diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx
    index 692357c8a..bc09129de 100644
    --- a/spacy/tokenizer.pyx
    +++ b/spacy/tokenizer.pyx
    @@ -20,7 +20,8 @@ cdef class Tokenizer:
         """Segment text, and create Doc objects with the discovered segment
         boundaries.
         """
    -    def __init__(self, Vocab vocab, rules, prefix_search, suffix_search, infix_finditer, token_match=None):
    +    def __init__(self, Vocab vocab, rules=None, prefix_search=None,
    +            suffix_search=None, infix_finditer=None, token_match=None):
             """Create a `Tokenizer`, to create `Doc` objects given unicode text.
     
             vocab (Vocab): A storage container for lexical types.
    @@ -48,8 +49,9 @@ cdef class Tokenizer:
             self.infix_finditer = infix_finditer
             self.vocab = vocab
             self._rules = {}
    -        for chunk, substrings in sorted(rules.items()):
    -            self.add_special_case(chunk, substrings)
    +        if rules is not None:
    +            for chunk, substrings in sorted(rules.items()):
    +                self.add_special_case(chunk, substrings)
     
         def __reduce__(self):
             args = (self.vocab,
    @@ -148,14 +150,18 @@ cdef class Tokenizer:
             cdef vector[LexemeC*] prefixes
             cdef vector[LexemeC*] suffixes
             cdef int orig_size
    +        cdef int has_special
             orig_size = tokens.length
    -        span = self._split_affixes(tokens.mem, span, &prefixes, &suffixes)
    +        span = self._split_affixes(tokens.mem, span, &prefixes, &suffixes,
    +                                   &has_special)
             self._attach_tokens(tokens, span, &prefixes, &suffixes)
    -        self._save_cached(&tokens.c[orig_size], orig_key, tokens.length - orig_size)
    +        self._save_cached(&tokens.c[orig_size], orig_key, has_special,
    +                          tokens.length - orig_size)
     
         cdef unicode _split_affixes(self, Pool mem, unicode string,
                                     vector[const LexemeC*] *prefixes,
    -                                vector[const LexemeC*] *suffixes):
    +                                vector[const LexemeC*] *suffixes,
    +                                int* has_special):
             cdef size_t i
             cdef unicode prefix
             cdef unicode suffix
    @@ -174,6 +180,7 @@ cdef class Tokenizer:
                     if minus_pre and self._specials.get(hash_string(minus_pre)) != NULL:
                         string = minus_pre
                         prefixes.push_back(self.vocab.get(mem, prefix))
    +                    has_special[0] = 1
                         break
                     if self.token_match and self.token_match(string):
                         break
    @@ -185,6 +192,7 @@ cdef class Tokenizer:
                     if minus_suf and (self._specials.get(hash_string(minus_suf)) != NULL):
                         string = minus_suf
                         suffixes.push_back(self.vocab.get(mem, suffix))
    +                    has_special[0] = 1
                         break
                 if pre_len and suf_len and (pre_len + suf_len) <= len(string):
                     string = string[pre_len:-suf_len]
    @@ -197,6 +205,7 @@ cdef class Tokenizer:
                     string = minus_suf
                     suffixes.push_back(self.vocab.get(mem, suffix))
                 if string and (self._specials.get(hash_string(string)) != NULL):
    +                has_special[0] = 1
                     break
             return string
     
    @@ -256,11 +265,15 @@ cdef class Tokenizer:
                 preinc(it)
                 tokens.push_back(lexeme, False)
     
    -    cdef int _save_cached(self, const TokenC* tokens, hash_t key, int n) except -1:
    +    cdef int _save_cached(self, const TokenC* tokens, hash_t key,
    +                          int has_special, int n) except -1:
             cdef int i
             for i in range(n):
                 if tokens[i].lex.id == 0:
                     return 0
    +        # See https://github.com/explosion/spaCy/issues/1250
    +        if has_special:
    +            return 0
             cached = <_Cached*>self.mem.alloc(1, sizeof(_Cached))
             cached.length = n
             cached.is_lex = True
    
    From 66766c145440541e9982147580f0f445109bac4e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 17:04:43 +0200
    Subject: [PATCH 476/649] Restore SP tag to English tag_map, until models
     migrate
    
    ---
     spacy/lang/en/tag_map.py | 1 +
     spacy/morphology.pyx     | 2 +-
     2 files changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/lang/en/tag_map.py b/spacy/lang/en/tag_map.py
    index 76eabf307..fc3d2cc93 100644
    --- a/spacy/lang/en/tag_map.py
    +++ b/spacy/lang/en/tag_map.py
    @@ -42,6 +42,7 @@ TAG_MAP = {
         "RBR":      {POS: ADV, "Degree": "comp"},
         "RBS":      {POS: ADV, "Degree": "sup"},
         "RP":       {POS: PART},
    +    "SP":       {POS: SPACE},
         "SYM":      {POS: SYM},
         "TO":       {POS: PART, "PartType": "inf", "VerbForm": "inf"},
         "UH":       {POS: INTJ},
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 090a07fe8..91befaa1b 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -38,7 +38,7 @@ cdef class Morphology:
             self.strings = string_store
             # Add special space symbol. We prefix with underscore, to make sure it
             # always sorts to the end.
    -        space_attrs = tag_map.pop('SP', {POS: SPACE})
    +        space_attrs = tag_map.get('SP', {POS: SPACE})
             if '_SP' not in tag_map:
                 self.strings.add('_SP')
                 tag_map = dict(tag_map)
    
    From 908809d488fb7c9ba25fde8d8077a328a12376f4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 17:05:15 +0200
    Subject: [PATCH 477/649] Update tests
    
    ---
     spacy/tests/doc/test_doc_api.py          | 18 +++++-------
     spacy/tests/doc/test_token_api.py        | 35 +++++++++++-------------
     spacy/tests/regression/test_issue1305.py | 11 +++++---
     spacy/tests/regression/test_issue781.py  |  2 +-
     4 files changed, 31 insertions(+), 35 deletions(-)
    
    diff --git a/spacy/tests/doc/test_doc_api.py b/spacy/tests/doc/test_doc_api.py
    index 5e052f771..46c615973 100644
    --- a/spacy/tests/doc/test_doc_api.py
    +++ b/spacy/tests/doc/test_doc_api.py
    @@ -2,6 +2,8 @@
     from __future__ import unicode_literals
     
     from ..util import get_doc
    +from ...tokens import Doc
    +from ...vocab import Vocab
     
     import pytest
     import numpy
    @@ -204,17 +206,11 @@ def test_doc_api_right_edge(en_tokenizer):
         assert doc[6].right_edge.text == ','
     
     
    -@pytest.mark.xfail
    -@pytest.mark.parametrize('text,vectors', [
    -    ("apple orange pear", ["apple -1 -1 -1", "orange -1 -1 0", "pear -1 0 -1"])
    -])
    -def test_doc_api_has_vector(en_tokenizer, text_file, text, vectors):
    -    text_file.write('\n'.join(vectors))
    -    text_file.seek(0)
    -    vector_length = en_tokenizer.vocab.load_vectors(text_file)
    -    assert vector_length == 3
    -
    -    doc = en_tokenizer(text)
    +def test_doc_api_has_vector():
    +    vocab = Vocab()
    +    vocab.clear_vectors(2)
    +    vocab.vectors.add('kitten', numpy.asarray([0., 2.], dtype='f'))
    +    doc = Doc(vocab, words=['kitten'])
         assert doc.has_vector
     
     def test_lowest_common_ancestor(en_tokenizer):
    diff --git a/spacy/tests/doc/test_token_api.py b/spacy/tests/doc/test_token_api.py
    index 00caa1445..0ab723f7a 100644
    --- a/spacy/tests/doc/test_token_api.py
    +++ b/spacy/tests/doc/test_token_api.py
    @@ -3,6 +3,8 @@ from __future__ import unicode_literals
     
     from ...attrs import IS_ALPHA, IS_DIGIT, IS_LOWER, IS_PUNCT, IS_TITLE, IS_STOP
     from ..util import get_doc
    +from ...vocab import Vocab
    +from ...tokens import Doc
     
     import pytest
     import numpy
    @@ -68,26 +70,21 @@ def test_doc_token_api_is_properties(en_vocab):
         assert doc[5].like_email
     
     
    -@pytest.mark.xfail
    -@pytest.mark.parametrize('text,vectors', [
    -    ("apples oranges ldskbjls", ["apples -1 -1 -1", "oranges -1 -1 0"])
    -])
    -def test_doc_token_api_vectors(en_tokenizer, text_file, text, vectors):
    -    text_file.write('\n'.join(vectors))
    -    text_file.seek(0)
    -    vector_length = en_tokenizer.vocab.load_vectors(text_file)
    -    assert vector_length == 3
    +def test_doc_token_api_vectors():
    +    vocab = Vocab()
    +    vocab.clear_vectors(2)
    +    vocab.vectors.add('apples', numpy.asarray([0., 2.], dtype='f'))
    +    vocab.vectors.add('oranges', numpy.asarray([0., 1.], dtype='f'))
    +    doc = Doc(vocab, words=['apples', 'oranges', 'oov'])
    +    assert doc.has_vector
     
    -    tokens = en_tokenizer(text)
    -    assert tokens[0].has_vector
    -    assert tokens[1].has_vector
    -    assert not tokens[2].has_vector
    -    assert tokens[0].similarity(tokens[1]) > tokens[0].similarity(tokens[2])
    -    assert tokens[0].similarity(tokens[1]) == tokens[1].similarity(tokens[0])
    -    assert sum(tokens[0].vector) != sum(tokens[1].vector)
    -    assert numpy.isclose(
    -        tokens[0].vector_norm,
    -        numpy.sqrt(numpy.dot(tokens[0].vector, tokens[0].vector)))
    +    assert doc[0].has_vector
    +    assert doc[1].has_vector
    +    assert not doc[2].has_vector
    +    apples_norm = (0*0 + 2*2) ** 0.5
    +    oranges_norm = (0*0 + 1*1) ** 0.5
    +    cosine = ((0*0) + (2*1)) / (apples_norm * oranges_norm)
    +    assert doc[0].similarity(doc[1]) == cosine
     
     
     def test_doc_token_api_ancestors(en_tokenizer):
    diff --git a/spacy/tests/regression/test_issue1305.py b/spacy/tests/regression/test_issue1305.py
    index e123ce0ba..d1d5eb93d 100644
    --- a/spacy/tests/regression/test_issue1305.py
    +++ b/spacy/tests/regression/test_issue1305.py
    @@ -1,8 +1,11 @@
     import pytest
    +import spacy
     
    -@pytest.mark.models('en')
    -def test_issue1305(EN):
    +#@pytest.mark.models('en')
    +def test_issue1305():
         '''Test lemmatization of English VBZ'''
    -    assert EN.vocab.morphology.lemmatizer('works', 'verb') == set(['work'])
    -    doc = EN(u'This app works well')
    +    nlp = spacy.load('en_core_web_sm')
    +    assert nlp.vocab.morphology.lemmatizer('works', 'verb') == ['work']
    +    doc = nlp(u'This app works well')
    +    print([(w.text, w.tag_) for w in doc])
         assert doc[2].lemma_ == 'work'
    diff --git a/spacy/tests/regression/test_issue781.py b/spacy/tests/regression/test_issue781.py
    index e3f391a37..2c77e68cd 100644
    --- a/spacy/tests/regression/test_issue781.py
    +++ b/spacy/tests/regression/test_issue781.py
    @@ -9,4 +9,4 @@ import pytest
     @pytest.mark.parametrize('word,lemmas', [("chromosomes", ["chromosome"]), ("endosomes", ["endosome"]), ("colocalizes", ["colocalize", "colocaliz"])])
     def test_issue781(EN, word, lemmas):
         lemmatizer = EN.Defaults.create_lemmatizer()
    -    assert lemmatizer(word, 'noun', morphology={'number': 'plur'}) == set(lemmas)
    +    assert lemmatizer(word, 'noun', morphology={'number': 'plur'}) == lemmas
    
    From d9bb1e5de8908111fe314026662e07139cccf5bf Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 24 Oct 2017 17:06:19 +0200
    Subject: [PATCH 478/649] Increment version
    
    ---
     spacy/about.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/about.py b/spacy/about.py
    index 699b61aff..45b91955a 100644
    --- a/spacy/about.py
    +++ b/spacy/about.py
    @@ -3,7 +3,7 @@
     # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py
     
     __title__ = 'spacy-nightly'
    -__version__ = '2.0.0a17'
    +__version__ = '2.0.0a18'
     __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython'
     __uri__ = 'https://spacy.io'
     __author__ = 'Explosion AI'
    
    From d71702b8274cfb61153a76f97713637ba239adac Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 20:10:37 +0200
    Subject: [PATCH 479/649] Fix formatting
    
    ---
     website/api/_annotation/_biluo.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/api/_annotation/_biluo.jade b/website/api/_annotation/_biluo.jade
    index dc6168732..34d93f768 100644
    --- a/website/api/_annotation/_biluo.jade
    +++ b/website/api/_annotation/_biluo.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > API > ANNOTATION > BILUO
     
    -+table([ "Tag", "Description" ])
    ++table(["Tag", "Description"])
         +row
             +cell #[code #[span.u-color-theme B] EGIN]
             +cell The first token of a multi-token entity.
    
    From 7459ecfa87cc41f6195a4f49a5842c0eb1879dd8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 20:13:34 +0200
    Subject: [PATCH 480/649] Port over contributor agreements
    
    ---
     .github/CONTRIBUTOR_AGREEMENT.md    |  10 +--
     .github/contributors/demfier.md     | 106 +++++++++++++++++++++++++++
     .github/contributors/honnibal.md    | 106 +++++++++++++++++++++++++++
     .github/contributors/ines.md        | 106 +++++++++++++++++++++++++++
     .github/contributors/jerbob92.md    | 106 +++++++++++++++++++++++++++
     .github/contributors/johnhaley81.md | 106 +++++++++++++++++++++++++++
     .github/contributors/mdcclv.md      | 106 +++++++++++++++++++++++++++
     .github/contributors/polm.md        | 106 +++++++++++++++++++++++++++
     .github/contributors/shuvanon.md    | 108 ++++++++++++++++++++++++++++
     .github/contributors/yuukos.md      | 106 +++++++++++++++++++++++++++
     10 files changed, 961 insertions(+), 5 deletions(-)
     create mode 100644 .github/contributors/demfier.md
     create mode 100644 .github/contributors/honnibal.md
     create mode 100644 .github/contributors/ines.md
     create mode 100644 .github/contributors/jerbob92.md
     create mode 100644 .github/contributors/johnhaley81.md
     create mode 100644 .github/contributors/mdcclv.md
     create mode 100644 .github/contributors/polm.md
     create mode 100644 .github/contributors/shuvanon.md
     create mode 100644 .github/contributors/yuukos.md
    
    diff --git a/.github/CONTRIBUTOR_AGREEMENT.md b/.github/CONTRIBUTOR_AGREEMENT.md
    index c915d48bf..f34603065 100644
    --- a/.github/CONTRIBUTOR_AGREEMENT.md
    +++ b/.github/CONTRIBUTOR_AGREEMENT.md
    @@ -87,8 +87,8 @@ U.S. Federal law. Any choice of law rules will not apply.
     7. Please place an “x” on one of the applicable statement below. Please do NOT
     mark both statements:
     
    -    * [x] I am signing on behalf of myself as an individual and no other person
    -    or entity, including my employer, has or will have rights with respect my
    +    * [ ] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect to my
         contributions.
     
         * [ ] I am signing on behalf of my employer or a legal entity and I have the
    @@ -98,9 +98,9 @@ mark both statements:
     
     | Field                          | Entry                |
     |------------------------------- | -------------------- |
    -| Name                           | Shuvanon Razik       |
    +| Name                           |                      |
     | Company name (if applicable)   |                      |
     | Title or role (if applicable)  |                      |
    -| Date                           | 3/12/2017            |
    -| GitHub username                | shuvanon             |
    +| Date                           |                      |
    +| GitHub username                |                      |
     | Website (optional)             |                      |
    diff --git a/.github/contributors/demfier.md b/.github/contributors/demfier.md
    new file mode 100644
    index 000000000..1a730fc78
    --- /dev/null
    +++ b/.github/contributors/demfier.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect to my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Gaurav Sahu          |
    +| Company name (if applicable)   |                      |
    +| Title or role (if applicable)  |                      |
    +| Date                           |  2017-10-18          |
    +| GitHub username                |  demfier             |
    +| Website (optional)             |                      |
    diff --git a/.github/contributors/honnibal.md b/.github/contributors/honnibal.md
    new file mode 100644
    index 000000000..3a700b7dd
    --- /dev/null
    +++ b/.github/contributors/honnibal.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [ ] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect to my
    +    contributions.
    +
    +    * [x] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Matthew Honnibal     |
    +| Company name (if applicable)   | Explosion AI         |
    +| Title or role (if applicable)  | Founder              |
    +| Date                           | 2017-10-18           |
    +| GitHub username                | honnibal             |
    +| Website (optional)             | https://explosion.ai |
    diff --git a/.github/contributors/ines.md b/.github/contributors/ines.md
    new file mode 100644
    index 000000000..5cd57b07e
    --- /dev/null
    +++ b/.github/contributors/ines.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [ ] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect to my
    +    contributions.
    +
    +    * [x] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Ines Montani         |
    +| Company name (if applicable)   | Explosion AI         |
    +| Title or role (if applicable)  | Founder              |
    +| Date                           | 2017/10/18           |
    +| GitHub username                | ines                 |
    +| Website (optional)             | https://explosion.ai |
    diff --git a/.github/contributors/jerbob92.md b/.github/contributors/jerbob92.md
    new file mode 100644
    index 000000000..bb0430d14
    --- /dev/null
    +++ b/.github/contributors/jerbob92.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect to my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Jeroen Bobbeldijk    |
    +| Company name (if applicable)   |                      |
    +| Title or role (if applicable)  |                      |
    +| Date                           | 22-10-2017           |
    +| GitHub username                | jerbob92             |
    +| Website (optional)             |                      |
    diff --git a/.github/contributors/johnhaley81.md b/.github/contributors/johnhaley81.md
    new file mode 100644
    index 000000000..277b3126c
    --- /dev/null
    +++ b/.github/contributors/johnhaley81.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect to my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | John Haley           |
    +| Company name (if applicable)   |                      |
    +| Title or role (if applicable)  |                      |
    +| Date                           | 19/10/2017           |
    +| GitHub username                | johnhaley81          |
    +| Website (optional)             |                      |
    diff --git a/.github/contributors/mdcclv.md b/.github/contributors/mdcclv.md
    new file mode 100644
    index 000000000..14ebfae26
    --- /dev/null
    +++ b/.github/contributors/mdcclv.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                            |
    +|------------------------------- | -------------------------------- |
    +| Name                           |  Orion Montoya                   |
    +| Company name (if applicable)   |                                  |
    +| Title or role (if applicable)  |                                  |
    +| Date                           |  04-10-2017                      |
    +| GitHub username                |  mdcclv                          |
    +| Website (optional)             |  http://www.mdcclv.com/          |
    diff --git a/.github/contributors/polm.md b/.github/contributors/polm.md
    new file mode 100644
    index 000000000..a2aa0cb65
    --- /dev/null
    +++ b/.github/contributors/polm.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Paul McCann          |
    +| Company name (if applicable)   |                      |
    +| Title or role (if applicable)  |                      |
    +| Date                           | 2017-10-14           |
    +| GitHub username                | polm                 |
    +| Website (optional)             | http://dampfkraft.com|
    diff --git a/.github/contributors/shuvanon.md b/.github/contributors/shuvanon.md
    new file mode 100644
    index 000000000..82d02d8d2
    --- /dev/null
    +++ b/.github/contributors/shuvanon.md
    @@ -0,0 +1,108 @@
    +
    +
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Shuvanon Razik       |
    +| Company name (if applicable)   |                      |
    +| Title or role (if applicable)  |                      |
    +| Date                           | 3/12/2017            |
    +| GitHub username                | shuvanon             |
    +| Website (optional)             |                      |
    diff --git a/.github/contributors/yuukos.md b/.github/contributors/yuukos.md
    new file mode 100644
    index 000000000..aecafeecb
    --- /dev/null
    +++ b/.github/contributors/yuukos.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Alexey Kim           |
    +| Company name (if applicable)   |                      |
    +| Title or role (if applicable)  |                      |
    +| Date                           | 13-12-2017           |
    +| GitHub username                | yuukos               |
    +| Website (optional)             |                      |
    
    From c815ff65f6986302bf6d89c7747e53bcbc65ee9e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 21:38:53 +0200
    Subject: [PATCH 481/649] Update feature list
    
    ---
     website/index.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/index.jade b/website/index.jade
    index 0155ab295..1abe5a984 100644
    --- a/website/index.jade
    +++ b/website/index.jade
    @@ -79,12 +79,12 @@ include _includes/_mixins
                 +h(2) Features
                 +list
                     +item Non-destructive #[strong tokenization]
    +                +item #[strong Named entity] recognition
                     +item Support for #[strong #{LANG_COUNT}+ languages]
                     +item #[strong #{MODEL_COUNT} statistical models] for #{MODEL_LANG_COUNT} languages
                     +item Pre-trained #[strong word vectors]
                     +item Easy #[strong deep learning] integration
                     +item Part-of-speech tagging
    -                +item #[strong Named entity] recognition
                     +item Labelled dependency parsing
                     +item Syntax-driven sentence segmentation
                     +item Built in #[strong visualizers] for syntax and NER
    
    From 63683a515132eef4e8668e51f6ed65066080cb67 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 21:39:05 +0200
    Subject: [PATCH 482/649] Port over contributors from master
    
    ---
     CONTRIBUTORS.md | 14 ++++++++++++++
     1 file changed, 14 insertions(+)
    
    diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
    index b64dc8db3..edd1ed30d 100644
    --- a/CONTRIBUTORS.md
    +++ b/CONTRIBUTORS.md
    @@ -3,6 +3,8 @@
     This is a list of everyone who has made significant contributions to spaCy, in alphabetical order. Thanks a lot for the great work!
     
     * Adam Bittlingmayer, [@bittlingmayer](https://github.com/bittlingmayer)
    +* Alexey Kim, [@yuukos](https://github.com/yuukos)
    +* Alexis Eidelman, [@AlexisEidelman](https://github.com/AlexisEidelman)
     * Andreas Grivas, [@andreasgrv](https://github.com/andreasgrv)
     * Andrew Poliakov, [@pavlin99th](https://github.com/pavlin99th)
     * Aniruddha Adhikary [@aniruddha-adhikary](https://github.com/aniruddha-adhikary)
    @@ -16,6 +18,7 @@ This is a list of everyone who has made significant contributions to spaCy, in a
     * Daniel Vila Suero, [@dvsrepo](https://github.com/dvsrepo)
     * Dmytro Sadovnychyi, [@sadovnychyi](https://github.com/sadovnychyi)
     * Eric Zhao, [@ericzhao28](https://github.com/ericzhao28)
    +* Francisco Aranda, [@frascuchon](https://github.com/frascuchon)
     * Greg Baker, [@solresol](https://github.com/solresol)
     * Grégory Howard, [@Gregory-Howard](https://github.com/Gregory-Howard)
     * György Orosz, [@oroszgy](https://github.com/oroszgy)
    @@ -24,6 +27,9 @@ This is a list of everyone who has made significant contributions to spaCy, in a
     * Ines Montani, [@ines](https://github.com/ines)
     * J Nicolas Schrading, [@NSchrading](https://github.com/NSchrading)
     * Janneke van der Zwaan, [@jvdzwaan](https://github.com/jvdzwaan)
    +* Jim Geovedi, [@geovedi](https://github.com/geovedi)
    +* Jim Regan, [@jimregan](https://github.com/jimregan)
    +* Jeffrey Gerard, [@IamJeffG](https://github.com/IamJeffG)
     * Jordan Suchow, [@suchow](https://github.com/suchow)
     * Josh Reeter, [@jreeter](https://github.com/jreeter)
     * Juan Miguel Cejuela, [@juanmirocks](https://github.com/juanmirocks)
    @@ -38,6 +44,8 @@ This is a list of everyone who has made significant contributions to spaCy, in a
     * Michael Wallin, [@wallinm1](https://github.com/wallinm1)
     * Miguel Almeida, [@mamoit](https://github.com/mamoit)
     * Oleg Zd, [@olegzd](https://github.com/olegzd)
    +* Orion Montoya, [@mdcclv](https://github.com/mdcclv)
    +* Paul O'Leary McCann, [@polm](https://github.com/polm)
     * Pokey Rule, [@pokey](https://github.com/pokey)
     * Raphaël Bournhonesque, [@raphael0202](https://github.com/raphael0202)
     * Rob van Nieuwpoort, [@RvanNieuwpoort](https://github.com/RvanNieuwpoort)
    @@ -45,12 +53,18 @@ This is a list of everyone who has made significant contributions to spaCy, in a
     * Sam Bozek, [@sambozek](https://github.com/sambozek)
     * Sasho Savkov, [@savkov](https://github.com/savkov)
     * Shuvanon Razik, [@shuvanon](https://github.com/shuvanon)
    +* Swier, [@swierh](https://github.com/swierh)
     * Thomas Tanon, [@Tpt](https://github.com/Tpt)
     * Tiago Rodrigues, [@TiagoMRodrigues](https://github.com/TiagoMRodrigues)
    +* Vimos Tan, [@Vimos](https://github.com/Vimos)
     * Vsevolod Solovyov, [@vsolovyov](https://github.com/vsolovyov)
     * Wah Loon Keng, [@kengz](https://github.com/kengz)
    +* Wannaphong Phatthiyaphaibun, [@wannaphongcom](https://github.com/wannaphongcom)
     * Willem van Hage, [@wrvhage](https://github.com/wrvhage)
     * Wolfgang Seeker, [@wbwseeker](https://github.com/wbwseeker)
    +* Yam, [@hscspring](https://github.com/hscspring)
     * Yanhao Yang, [@YanhaoYang](https://github.com/YanhaoYang)
     * Yasuaki Uechi, [@uetchy](https://github.com/uetchy)
    +* Yu-chun Huang, [@galaxyh](https://github.com/galaxyh)
     * Yubing Dong, [@tomtung](https://github.com/tomtung)
    +* Yuval Pinter, [@yuvalpinter](https://github.com/yuvalpinter)
    
    From 972d9e832cc782bdc50693b0cf8c62f3ee247c7d Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 21:39:18 +0200
    Subject: [PATCH 483/649] Update README for v2.0
    
    ---
     README.rst | 256 +++++++++++++++++++----------------------------------
     1 file changed, 93 insertions(+), 163 deletions(-)
    
    diff --git a/README.rst b/README.rst
    index 244308473..27fca3fc2 100644
    --- a/README.rst
    +++ b/README.rst
    @@ -1,15 +1,16 @@
     spaCy: Industrial-strength NLP
     ******************************
     
    -spaCy is a library for advanced natural language processing in Python and
    +spaCy is a library for advanced Natural Language Processing in Python and
     Cython. spaCy is built on  the very latest research, but it isn't researchware.
    -It was designed from day one to be used in real products. spaCy currently supports
    -English, German, French and Spanish, as well as tokenization for Italian,
    -Portuguese, Dutch, Swedish, Finnish, Norwegian, Danish, Hungarian, Polish,
    -Bengali, Hebrew, Chinese and Japanese. It's commercial open-source software,
    -released under the MIT license.
    +It was designed from day one to be used in real products. spaCy comes with
    +`pre-trained statistical models `_ and word
    +vectors, and currently supports tokenization for **20+ languages**. It features
    +the **fastest syntactic parser** in the world, convolutional **neural network models**
    +for tagging, parsing and **named entity recognition** and easy **deep learning**
    +integration. It's commercial open-source software, released under the MIT license.
     
    -💫 **Version 1.8 out now!** `Read the release notes here. `_
    +💫 **Version 2.0 out now!** `Check out the new features here. `_
     
     .. image:: https://img.shields.io/travis/explosion/spaCy/master.svg?style=flat-square
         :target: https://travis-ci.org/explosion/spaCy
    @@ -38,68 +39,72 @@ released under the MIT license.
     📖 Documentation
     ================
     
    -=================== ===
    -`Usage Workflows`_  How to use spaCy and its features.
    -`API Reference`_    The detailed reference for spaCy's API.
    -`Troubleshooting`_  Common problems and solutions for beginners.
    -`Tutorials`_        End-to-end examples, with code you can modify and run.
    -`Showcase & Demos`_ Demos, libraries and products from the spaCy community.
    -`Contribute`_       How to contribute to the spaCy project and code base.
    -=================== ===
    +===================  ===
    +`spaCy 101`_         New to spaCy? Here's everything you need to know!
    +`Usage Guides`_      How to use spaCy and its features.
    +`New in v2.0`_       New features, backwards incompatibilitiies and migration guide.
    +`API Reference`_     The detailed reference for spaCy's API.
    +`Models`_            Download statistical language models for spaCy.
    +`Resources`_         Libraries, extensions, demos, books and courses.
    +`Changelog`_         Changes and version history.
    +`Contribute`_        How to contribute to the spaCy project and code base.
    +===================  ===
     
    -.. _Usage Workflows: https://spacy.io/docs/usage/
    -.. _API Reference: https://spacy.io/docs/api/
    -.. _Troubleshooting: https://spacy.io/docs/usage/troubleshooting
    -.. _Tutorials: https://spacy.io/docs/usage/tutorials
    -.. _Showcase & Demos: https://spacy.io/docs/usage/showcase
    +.. _spaCy 101: https://alpha.spacy.io/usage/spacy-101
    +.. _New in v2.0: https://alpha.spacy.io/usage/v2#migrating
    +.. _Usage Guides: https://alpha.spacy.io/usage/
    +.. _API Reference: https://alpha.spacy.io/api/
    +.. _Models: https://alpha.spacy.io/models
    +.. _Resources: https://alpha.spacy.io/usage/resources
    +.. _Changelog: https://alpha.spacy.io/usage/#changelog
     .. _Contribute: https://github.com/explosion/spaCy/blob/master/CONTRIBUTING.md
     
     💬 Where to ask questions
     ==========================
     
    +The spaCy project is maintained by `@honnibal `_
    +and `@ines `_. Please understand that we won't be able
    +to provide individual support via email. We also believe that help is much more
    +valuable if it's shared publicly, so that more people can benefit from it.
    +
     ====================== ===
    -**Bug reports**        `GitHub issue tracker`_
    -**Usage questions**    `StackOverflow`_, `Gitter chat`_, `Reddit user group`_
    -**General discussion** `Gitter chat`_, `Reddit user group`_
    -**Commercial support** contact@explosion.ai
    +**Bug Reports**        `GitHub Issue Tracker`_
    +**Usage Questions**    `StackOverflow`_, `Gitter Chat`_, `Reddit User Group`_
    +**General Discussion** `Gitter Chat`_, `Reddit User Group`_
     ====================== ===
     
    -.. _GitHub issue tracker: https://github.com/explosion/spaCy/issues
    +.. _GitHub Issue Tracker: https://github.com/explosion/spaCy/issues
     .. _StackOverflow: http://stackoverflow.com/questions/tagged/spacy
    -.. _Gitter chat: https://gitter.im/explosion/spaCy
    -.. _Reddit user group: https://www.reddit.com/r/spacynlp
    +.. _Gitter Chat: https://gitter.im/explosion/spaCy
    +.. _Reddit User Group: https://www.reddit.com/r/spacynlp
     
     Features
     ========
     
    -* Non-destructive **tokenization**
    -* Syntax-driven sentence segmentation
    -* Pre-trained **word vectors**
    -* Part-of-speech tagging
    +* **Fastest syntactic parser** in the world
     * **Named entity** recognition
    -* Labelled dependency parsing
    -* Convenient string-to-int mapping
    -* Export to numpy data arrays
    -* GIL-free **multi-threading**
    -* Efficient binary serialization
    +* Non-destructive **tokenization**
    +* Support for **20+ languages**
    +* Pre-trained `statistical models `_ and word vectors
     * Easy **deep learning** integration
    -* Statistical models for **English**, **German**, **French** and **Spanish**
    +* Part-of-speech tagging
    +* Labelled dependency parsing
    +* Syntax-driven sentence segmentation
    +* Built in **visualizers** for syntax and NER
    +* Convenient string-to-hash mapping
    +* Export to numpy data arrays
    +* Efficient binary serialization
    +* Easy **model packaging** and deployment
     * State-of-the-art speed
     * Robust, rigorously evaluated accuracy
     
    -See `facts, figures and benchmarks `_.
    +📖  **For more details, see the** `facts, figures and benchmarks `_.
     
    -Top Performance
    ----------------
    +Install spaCy
    +=============
     
    -* Fastest in the world: <50ms per document.  No faster system has ever been
    -  announced.
    -* Accuracy within 1% of the current state of the art on all tasks performed
    -  (parsing, named entity recognition, part-of-speech tagging).  The only more
    -  accurate systems are an order of magnitude slower or more.
    -
    -Supports
    ---------
    +For detailed installation instructions, see
    +the `documentation `_.
     
     ==================== ===
     **Operating system** macOS / OS X, Linux, Windows (Cygwin, MinGW, Visual Studio)
    @@ -110,12 +115,6 @@ Supports
     .. _pip: https://pypi.python.org/pypi/spacy
     .. _conda: https://anaconda.org/conda-forge/spacy
     
    -Install spaCy
    -=============
    -
    -Installation requires a working build environment. See notes on Ubuntu,
    -macOS/OS X and Windows for details.
    -
     pip
     ---
     
    @@ -123,7 +122,7 @@ Using pip, spaCy releases are currently only available as source packages.
     
     .. code:: bash
     
    -    pip install -U spacy
    +    pip install spacy
     
     When using pip it is generally recommended to install packages in a ``virtualenv``
     to avoid modifying system state:
    @@ -149,25 +148,41 @@ For the feedstock including the build recipe and configuration,
     check out `this repository `_.
     Improvements and pull requests to the recipe and setup are always appreciated.
     
    +Updating spaCy
    +--------------
    +
    +Some updates to spaCy may require downloading new statistical models. If you're
    +running spaCy v2.0 or higher, you can use the ``validate`` command to check if
    +your installed models are compatible and if not, print details on how to update
    +them:
    +
    +.. code:: bash
    +
    +    pip install -U spacy
    +    spacy validate
    +
    +If you've trained your own models, keep in mind that your training and runtime
    +inputs must match. After updating spaCy, we recommend **retraining your models**
    +with the new version.
    +
    +📖  **For details on upgrading from spaCy 1.x to spaCy 2.x, see the**
    +`migration guide `_.
    +
     Download models
     ===============
     
     As of v1.7.0, models for spaCy can be installed as **Python packages**.
     This means that they're a component of your application, just like any
    -other module. They're versioned and can be defined as a dependency in your
    -``requirements.txt``. Models can be installed from a download URL or
    -a local directory, manually or via pip. Their data can be located anywhere on
    -your file system. To make a model available to spaCy, all you need to do is
    -create a "shortcut link", an internal alias that tells spaCy where to find the
    -data files for a specific model name.
    +other module. Models can be installed using spaCy's ``download`` command,
    +or manually by pointing pip to a path or URL.
     
     ======================= ===
    -`spaCy Models`_         Available models, latest releases and direct download.
    +`Available Models`_     Detailed model descriptions, accuracy figures and benchmarks.
     `Models Documentation`_ Detailed usage instructions.
     ======================= ===
     
    -.. _spaCy Models: https://github.com/explosion/spacy-models/releases/
    -.. _Models Documentation: https://spacy.io/docs/usage/models
    +.. _Available Models: https://alpha.spacy.io/models
    +.. _Models Documentation: https://alpha.spacy.io/docs/usage/models
     
     .. code:: bash
     
    @@ -175,17 +190,10 @@ data files for a specific model name.
         python -m spacy download en
     
         # download best-matching version of specific model for your spaCy installation
    -    python -m spacy download en_core_web_md
    +    python -m spacy download en_core_web_lg
     
         # pip install .tar.gz archive from path or URL
    -    pip install /Users/you/en_core_web_md-1.2.0.tar.gz
    -    pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_md-1.2.0/en_core_web_md-1.2.0.tar.gz
    -
    -    # set up shortcut link to load installed package as "en_default"
    -    python -m spacy link en_core_web_md en_default
    -
    -    # set up shortcut link to load local model as "my_amazing_model"
    -    python -m spacy link /Users/you/data my_amazing_model
    +    pip install /Users/you/en_core_web_sm-2.0.0.tar.gz
     
     Loading and using models
     ------------------------
    @@ -199,24 +207,24 @@ To load a model, use ``spacy.load()`` with the model's shortcut link:
         doc = nlp(u'This is a sentence.')
     
     If you've installed a model via pip, you can also ``import`` it directly and
    -then call its ``load()`` method with no arguments. This should also work for
    -older models in previous versions of spaCy.
    +then call its ``load()`` method:
     
     .. code:: python
     
         import spacy
    -    import en_core_web_md
    +    import en_core_web_sm
     
    -    nlp = en_core_web_md.load()
    +    nlp = en_core_web_.load()
         doc = nlp(u'This is a sentence.')
     
    -📖 **For more info and examples, check out the** `models documentation `_.
    +📖 **For more info and examples, check out the**
    +`models documentation `_.
     
     Support for older versions
     --------------------------
     
    -If you're using an older version (v1.6.0 or below), you can still download and
    -install the old models from within spaCy using ``python -m spacy.en.download all``
    +If you're using an older version (``v1.6.0`` or below), you can still download
    +and install the old models from within spaCy using ``python -m spacy.en.download all``
     or ``python -m spacy.de.download all``. The ``.tar.gz`` archives are also
     `attached to the v1.6.0 release `_.
     To download and install the models manually, unpack the archive, drop the
    @@ -248,11 +256,13 @@ details.
         pip install -r requirements.txt
         pip install -e .
     
    -Compared to regular install via pip `requirements.txt `_
    +Compared to regular install via pip, `requirements.txt `_
     additionally installs developer dependencies such as Cython.
    -
     Instead of the above verbose commands, you can also use the following
    -`Fabric `_ commands:
    +`Fabric `_ commands. All commands assume that your
    +``virtualenv`` is located in a directory ``.env``. If you're using a different
    +directory, you can change it via the environment variable ``VENV_DIR``, for
    +example ``VENV_DIR=".custom-env" fab clean make``.
     
     ============= ===
     ``fab env``   Create ``virtualenv`` and delete previous one, if it exists.
    @@ -261,14 +271,6 @@ Instead of the above verbose commands, you can also use the following
     ``fab test``  Run basic tests, aborting after first failure.
     ============= ===
     
    -All commands assume that your ``virtualenv`` is located in a directory ``.env``.
    -If you're using a different directory, you can change it via the environment
    -variable ``VENV_DIR``, for example:
    -
    -.. code:: bash
    -
    -    VENV_DIR=".custom-env" fab clean make
    -
     Ubuntu
     ------
     
    @@ -310,76 +312,4 @@ and ``--model`` are optional and enable additional tests:
     
         # make sure you are using recent pytest version
         python -m pip install -U pytest
    -
         python -m pytest 
    -
    -🛠 Changelog
    -============
    -
    -=========== ============== ===========
    -Version     Date           Description
    -=========== ============== ===========
    -`v1.8.2`_   ``2017-04-26`` French model and small improvements
    -`v1.8.1`_   ``2017-04-23`` Saving, loading and training bug fixes
    -`v1.8.0`_   ``2017-04-16`` Better NER training, saving and loading
    -`v1.7.5`_   ``2017-04-07`` Bug fixes and new CLI commands
    -`v1.7.3`_   ``2017-03-26`` Alpha support for Hebrew, new CLI commands and bug fixes
    -`v1.7.2`_   ``2017-03-20`` Small fixes to beam parser and model linking
    -`v1.7.1`_   ``2017-03-19`` Fix data download for system installation
    -`v1.7.0`_   ``2017-03-18`` New 50 MB model, CLI, better downloads and lots of bug fixes
    -`v1.6.0`_   ``2017-01-16`` Improvements to tokenizer and tests
    -`v1.5.0`_   ``2016-12-27`` Alpha support for Swedish and Hungarian
    -`v1.4.0`_   ``2016-12-18`` Improved language data and alpha Dutch support
    -`v1.3.0`_   ``2016-12-03`` Improve API consistency
    -`v1.2.0`_   ``2016-11-04`` Alpha tokenizers for Chinese, French, Spanish, Italian and Portuguese
    -`v1.1.0`_   ``2016-10-23`` Bug fixes and adjustments
    -`v1.0.0`_   ``2016-10-18`` Support for deep learning workflows and entity-aware rule matcher
    -`v0.101.0`_ ``2016-05-10`` Fixed German model
    -`v0.100.7`_ ``2016-05-05`` German support
    -`v0.100.6`_ ``2016-03-08`` Add support for GloVe vectors
    -`v0.100.5`_ ``2016-02-07`` Fix incorrect use of header file
    -`v0.100.4`_ ``2016-02-07`` Fix OSX problem introduced in 0.100.3
    -`v0.100.3`_ ``2016-02-06`` Multi-threading, faster loading and bugfixes
    -`v0.100.2`_ ``2016-01-21`` Fix data version lock
    -`v0.100.1`_ ``2016-01-21`` Fix install for OSX
    -`v0.100`_   ``2016-01-19`` Revise setup.py, better model downloads, bug fixes
    -`v0.99`_    ``2015-11-08`` Improve span merging, internal refactoring
    -`v0.98`_    ``2015-11-03`` Smaller package, bug fixes
    -`v0.97`_    ``2015-10-23`` Load the StringStore from a json list, instead of a text file
    -`v0.96`_    ``2015-10-19`` Hotfix to .merge method
    -`v0.95`_    ``2015-10-18`` Bug fixes
    -`v0.94`_    ``2015-10-09`` Fix memory and parse errors
    -`v0.93`_    ``2015-09-22`` Bug fixes to word vectors
    -=========== ============== ===========
    -
    -.. _v1.8.2: https://github.com/explosion/spaCy/releases/tag/v1.8.2
    -.. _v1.8.1: https://github.com/explosion/spaCy/releases/tag/v1.8.1
    -.. _v1.8.0: https://github.com/explosion/spaCy/releases/tag/v1.8.0
    -.. _v1.7.5: https://github.com/explosion/spaCy/releases/tag/v1.7.5
    -.. _v1.7.3: https://github.com/explosion/spaCy/releases/tag/v1.7.3
    -.. _v1.7.2: https://github.com/explosion/spaCy/releases/tag/v1.7.2
    -.. _v1.7.1: https://github.com/explosion/spaCy/releases/tag/v1.7.1
    -.. _v1.7.0: https://github.com/explosion/spaCy/releases/tag/v1.7.0
    -.. _v1.6.0: https://github.com/explosion/spaCy/releases/tag/v1.6.0
    -.. _v1.5.0: https://github.com/explosion/spaCy/releases/tag/v1.5.0
    -.. _v1.4.0: https://github.com/explosion/spaCy/releases/tag/v1.4.0
    -.. _v1.3.0: https://github.com/explosion/spaCy/releases/tag/v1.3.0
    -.. _v1.2.0: https://github.com/explosion/spaCy/releases/tag/v1.2.0
    -.. _v1.1.0: https://github.com/explosion/spaCy/releases/tag/v1.1.0
    -.. _v1.0.0: https://github.com/explosion/spaCy/releases/tag/v1.0.0
    -.. _v0.101.0: https://github.com/explosion/spaCy/releases/tag/0.101.0
    -.. _v0.100.7: https://github.com/explosion/spaCy/releases/tag/0.100.7
    -.. _v0.100.6: https://github.com/explosion/spaCy/releases/tag/0.100.6
    -.. _v0.100.5: https://github.com/explosion/spaCy/releases/tag/0.100.5
    -.. _v0.100.4: https://github.com/explosion/spaCy/releases/tag/0.100.4
    -.. _v0.100.3: https://github.com/explosion/spaCy/releases/tag/0.100.3
    -.. _v0.100.2: https://github.com/explosion/spaCy/releases/tag/0.100.2
    -.. _v0.100.1: https://github.com/explosion/spaCy/releases/tag/0.100.1
    -.. _v0.100: https://github.com/explosion/spaCy/releases/tag/0.100
    -.. _v0.99: https://github.com/explosion/spaCy/releases/tag/0.99
    -.. _v0.98: https://github.com/explosion/spaCy/releases/tag/0.98
    -.. _v0.97: https://github.com/explosion/spaCy/releases/tag/0.97
    -.. _v0.96: https://github.com/explosion/spaCy/releases/tag/0.96
    -.. _v0.95: https://github.com/explosion/spaCy/releases/tag/0.95
    -.. _v0.94: https://github.com/explosion/spaCy/releases/tag/0.94
    -.. _v0.93: https://github.com/explosion/spaCy/releases/tag/0.93
    
    From 1730648e195a854fc44d1970737cb128e874d0d5 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 21:49:04 +0200
    Subject: [PATCH 484/649] Update pull request template
    
    ---
     .github/PULL_REQUEST_TEMPLATE.md | 31 +++++++++++++++----------------
     1 file changed, 15 insertions(+), 16 deletions(-)
    
    diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
    index e97a7ea16..ec11b78bd 100644
    --- a/.github/PULL_REQUEST_TEMPLATE.md
    +++ b/.github/PULL_REQUEST_TEMPLATE.md
    @@ -1,20 +1,19 @@
    -
    +
     
     ## Description
    -
    -
    +
     
    +### Types of change
    +
     
    -## Types of changes
    -
    -- [ ] **Bug fix** (non-breaking change fixing an issue)
    -- [ ] **New feature** (non-breaking change adding functionality to spaCy)
    -- [ ] **Breaking change** (fix or feature causing change to spaCy's existing functionality)
    -- [ ] **Documentation** (addition to documentation of spaCy)
    -
    -## Checklist:
    -
    -- [ ] My change requires a change to spaCy's documentation.
    -- [ ] I have updated the documentation accordingly.
    -- [ ] I have added tests to cover my changes.
    -- [ ] All new and existing tests passed.
    +## Checklist
    +
    +- [ ] I have submitted the spaCy Contributor Agreement.
    +- [ ] I ran the tests, and all new and existing tests passed.
    +- [ ] My changes don't require a change to the documentation, or if they do, I've added all required information.
    
    From 4a06eddb5fdc067bf02cca3b9567759372de4885 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 24 Oct 2017 22:18:40 +0200
    Subject: [PATCH 485/649] Update README
    
    ---
     README.rst | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/README.rst b/README.rst
    index 27fca3fc2..9cffd2cae 100644
    --- a/README.rst
    +++ b/README.rst
    @@ -1,9 +1,9 @@
     spaCy: Industrial-strength NLP
     ******************************
     
    -spaCy is a library for advanced Natural Language Processing in Python and
    -Cython. spaCy is built on  the very latest research, but it isn't researchware.
    -It was designed from day one to be used in real products. spaCy comes with
    +spaCy is a library for advanced Natural Language Processing in Python and Cython.
    +It's built on the very latest research, and was designed from day one to be
    +used in real products. spaCy comes with
     `pre-trained statistical models `_ and word
     vectors, and currently supports tokenization for **20+ languages**. It features
     the **fastest syntactic parser** in the world, convolutional **neural network models**
    
    From 3484174e487c3ec6171042d06e6a994a8330c61c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 11:57:43 +0200
    Subject: [PATCH 486/649] Add Language.path
    
    ---
     spacy/language.py         | 6 ++++++
     website/api/language.jade | 8 ++++++++
     2 files changed, 14 insertions(+)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index c706e532a..933ca772d 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -127,6 +127,7 @@ class Language(object):
             RETURNS (Language): The newly constructed object.
             """
             self._meta = dict(meta)
    +        self._path = None
             if vocab is True:
                 factory = self.Defaults.create_vocab
                 vocab = factory(self, **meta.get('vocab', {}))
    @@ -142,6 +143,10 @@ class Language(object):
             bytes_data = self.to_bytes(vocab=False)
             return (unpickle_language, (self.vocab, self.meta, bytes_data))
     
    +    @property
    +    def path(self):
    +        return self._path
    +
         @property
         def meta(self):
             self._meta.setdefault('lang', self.vocab.lang)
    @@ -611,6 +616,7 @@ class Language(object):
             if not (path / 'vocab').exists():
                 exclude['vocab'] = True
             util.from_disk(path, deserializers, exclude)
    +        self._path = path
             return self
     
         def to_bytes(self, disable=[], **exclude):
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 668cbadd7..6aa2d7612 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -609,6 +609,14 @@ p Load state from a binary string.
                 |  Custom meta data for the Language class. If a model is loaded,
                 |  contains meta data of the model.
     
    +    +row
    +        +cell #[code path]
    +            +tag-new(2)
    +        +cell #[code Path]
    +        +cell
    +            |  Path to the model data directory, if a model is loaded. Otherwise
    +            |  #[code None].
    +
     +h(2, "class-attributes") Class attributes
     
     +table(["Name", "Type", "Description"])
    
    From 0b1dcbac1488e62379c2da326d666b39221e84e9 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 12:08:46 +0200
    Subject: [PATCH 487/649] Remove unused function
    
    ---
     spacy/_ml.py | 40 ----------------------------------------
     1 file changed, 40 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index b07e179f0..8a8d355d9 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -482,46 +482,6 @@ def get_token_vectors(tokens_attrs_vectors, drop=0.):
         return vectors, backward
     
     
    -def fine_tune(embedding, combine=None):
    -    if combine is not None:
    -        raise NotImplementedError(
    -            "fine_tune currently only supports addition. Set combine=None")
    -    def fine_tune_fwd(docs_tokvecs, drop=0.):
    -        docs, tokvecs = docs_tokvecs
    -
    -        lengths = model.ops.asarray([len(doc) for doc in docs], dtype='i')
    -
    -        vecs, bp_vecs = embedding.begin_update(docs, drop=drop)
    -        flat_tokvecs = embedding.ops.flatten(tokvecs)
    -        flat_vecs = embedding.ops.flatten(vecs)
    -        output = embedding.ops.unflatten(
    -                   (model.mix[0] * flat_tokvecs + model.mix[1] * flat_vecs), lengths)
    -
    -        def fine_tune_bwd(d_output, sgd=None):
    -            flat_grad = model.ops.flatten(d_output)
    -            model.d_mix[0] += flat_tokvecs.dot(flat_grad.T).sum()
    -            model.d_mix[1] += flat_vecs.dot(flat_grad.T).sum()
    -
    -            bp_vecs([d_o * model.mix[1] for d_o in d_output], sgd=sgd)
    -            if sgd is not None:
    -                sgd(model._mem.weights, model._mem.gradient, key=model.id)
    -            return [d_o * model.mix[0] for d_o in d_output]
    -        return output, fine_tune_bwd
    -
    -    def fine_tune_predict(docs_tokvecs):
    -        docs, tokvecs = docs_tokvecs
    -        vecs = embedding(docs)
    -        return [model.mix[0]*tv+model.mix[1]*v
    -                for tv, v in zip(tokvecs, vecs)]
    -
    -    model = wrap(fine_tune_fwd, embedding)
    -    model.mix = model._mem.add((model.id, 'mix'), (2,))
    -    model.mix.fill(0.5)
    -    model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix'))
    -    model.predict = fine_tune_predict
    -    return model
    -
    -
     @layerize
     def flatten(seqs, drop=0.):
         if isinstance(seqs[0], numpy.ndarray):
    
    From 7bcec574620b611882e74d2356f6ffdead628ae3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 12:08:54 +0200
    Subject: [PATCH 488/649] Remove unused attribute
    
    ---
     spacy/matcher.pyx | 2 --
     1 file changed, 2 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index a0c69f4bf..2c001c652 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -198,7 +198,6 @@ cdef class Matcher:
         cdef public object _patterns
         cdef public object _entities
         cdef public object _callbacks
    -    cdef public object _acceptors
     
         def __init__(self, vocab):
             """Create the Matcher.
    @@ -209,7 +208,6 @@ cdef class Matcher:
             """
             self._patterns = {}
             self._entities = {}
    -        self._acceptors = {}
             self._callbacks = {}
             self.vocab = vocab
             self.mem = Pool()
    
    From 7eebeeaf85d1637af744aa2b504ffa2d2df42ed6 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 12:09:47 +0200
    Subject: [PATCH 489/649] Fix Matcher.__contains__
    
    ---
     spacy/matcher.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 2c001c652..ea5b7e416 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -230,7 +230,7 @@ cdef class Matcher:
             key (unicode): The match ID.
             RETURNS (bool): Whether the matcher contains rules for this match ID.
             """
    -        return len(self._patterns)
    +        return key in self._patterns
     
         def add(self, key, on_match, *patterns):
             """Add a match-rule to the matcher. A match-rule consists of: an ID key,
    
    From 9c733a884922a447ae620ab41d97c086d429c8a4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 12:09:56 +0200
    Subject: [PATCH 490/649] Implement PhraseMatcher.__len__
    
    ---
     spacy/matcher.pyx | 8 +++++++-
     1 file changed, 7 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index ea5b7e416..be9634fc9 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -471,7 +471,13 @@ cdef class PhraseMatcher:
             self._callbacks = {}
     
         def __len__(self):
    -        raise NotImplementedError
    +        """Get the number of rules added to the matcher. Note that this only
    +        returns the number of rules (identical with the number of IDs), not the
    +        number of individual patterns.
    +
    +        RETURNS (int): The number of rules.
    +        """
    +        return len(self.phrase_ids)
     
         def __contains__(self, key):
             raise NotImplementedError
    
    From 1262aa0bf9e954b9193781661f29652a97222b56 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 12:10:04 +0200
    Subject: [PATCH 491/649] Implement PhraseMatcher.__contains__
    
    ---
     spacy/matcher.pyx | 8 +++++++-
     1 file changed, 7 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index be9634fc9..8b815194c 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -480,7 +480,13 @@ cdef class PhraseMatcher:
             return len(self.phrase_ids)
     
         def __contains__(self, key):
    -        raise NotImplementedError
    +        """Check whether the matcher contains rules for a match ID.
    +
    +        key (unicode): The match ID.
    +        RETURNS (bool): Whether the matcher contains rules for this match ID.
    +        """
    +        cdef hash_t ent_id = self.matcher._normalize_key(key)
    +        return ent_id in self.phrase_ids
     
         def __reduce__(self):
             return (self.__class__, (self.vocab,), None, None)
    
    From 4d97efc3b5f1d51fa4ff9d2a350787298f77ab04 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 12:10:16 +0200
    Subject: [PATCH 492/649] Add missing docstrings
    
    ---
     spacy/matcher.pyx | 26 ++++++++++++++++++++++++++
     1 file changed, 26 insertions(+)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 8b815194c..6c1069578 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -255,6 +255,10 @@ cdef class Matcher:
             and '*' patterns in a row and their matches overlap, the first
             operator will behave non-greedily. This quirk in the semantics
             makes the matcher more efficient, by avoiding the need for back-tracking.
    +
    +        key (unicode): The match ID.
    +        on_match (callable): Callback executed on match.
    +        *patterns (list): List of token descritions.
             """
             for pattern in patterns:
                 if len(pattern) == 0:
    @@ -492,6 +496,13 @@ cdef class PhraseMatcher:
             return (self.__class__, (self.vocab,), None, None)
     
         def add(self, key, on_match, *docs):
    +        """Add a match-rule to the matcher. A match-rule consists of: an ID key,
    +        an on_match callback, and one or more patterns.
    +
    +        key (unicode): The match ID.
    +        on_match (callable): Callback executed on match.
    +        *docs (Doc): `Doc` objects representing match patterns.
    +        """
             cdef Doc doc
             for doc in docs:
                 if len(doc) >= self.max_length:
    @@ -520,6 +531,13 @@ cdef class PhraseMatcher:
                 self.phrase_ids.set(phrase_hash, ent_id)
     
         def __call__(self, Doc doc):
    +        """Find all sequences matching the supplied patterns on the `Doc`.
    +
    +        doc (Doc): The document to match over.
    +        RETURNS (list): A list of `(key, start, end)` tuples,
    +            describing the matches. A match tuple describes a span
    +            `doc[start:end]`. The `label_id` and `key` are both integers.
    +        """
             matches = []
             for _, start, end in self.matcher(doc):
                 ent_id = self.accept_match(doc, start, end)
    @@ -532,6 +550,14 @@ cdef class PhraseMatcher:
             return matches
     
         def pipe(self, stream, batch_size=1000, n_threads=2):
    +        """Match a stream of documents, yielding them in turn.
    +
    +        docs (iterable): A stream of documents.
    +        batch_size (int): The number of documents to accumulate into a working set.
    +        n_threads (int): The number of threads with which to work on the buffer
    +            in parallel, if the `Matcher` implementation supports multi-threading.
    +        YIELDS (Doc): Documents, in order.
    +        """
             for doc in stream:
                 self(doc)
                 yield doc
    
    From 72497c8cb2ed59ac1f0b9fd0c9f1b0f6a6d1f51e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 12:15:43 +0200
    Subject: [PATCH 493/649] Remove comments and add TODO
    
    ---
     spacy/tokenizer.pyx | 5 +----
     1 file changed, 1 insertion(+), 4 deletions(-)
    
    diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx
    index bc09129de..e865c60dd 100644
    --- a/spacy/tokenizer.pyx
    +++ b/spacy/tokenizer.pyx
    @@ -63,11 +63,8 @@ cdef class Tokenizer:
             return (self.__class__, args, None, None)
     
         cpdef Doc tokens_from_list(self, list strings):
    +        # TODO: deprecation warning
             return Doc(self.vocab, words=strings)
    -        #raise NotImplementedError(
    -        #    "Method deprecated in 1.0.\n"
    -        #    "Old: tokenizer.tokens_from_list(strings)\n"
    -        #    "New: Doc(tokenizer.vocab, words=strings)")
     
         @cython.boundscheck(False)
         def __call__(self, unicode string):
    
    From e70f80f29ed9c3acd92ac005af54a967ce32a3fb Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 25 Oct 2017 13:46:41 +0200
    Subject: [PATCH 494/649] Add Language.disable_pipes()
    
    ---
     spacy/language.py                         | 60 +++++++++++++++++++++++
     spacy/tests/pipeline/test_pipe_methods.py | 18 +++++++
     2 files changed, 78 insertions(+)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index c706e532a..ddc089bd3 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -1,6 +1,7 @@
     # coding: utf8
     from __future__ import absolute_import, unicode_literals
     from contextlib import contextmanager
    +import copy
     
     from thinc.neural import Model
     from thinc.neural.optimizers import Adam
    @@ -329,6 +330,29 @@ class Language(object):
                 doc = proc(doc)
             return doc
     
    +    def disable_pipes(self, *names):
    +        '''Disable one or more pipeline components.
    +
    +        If used as a context manager, the pipeline will be restored to the initial
    +        state at the end of the block. Otherwise, a DisabledPipes object is
    +        returned, that has a `.restore()` method you can use to undo your
    +        changes.
    +
    +        EXAMPLE:
    +
    +            >>> nlp.add_pipe('parser')
    +            >>> nlp.add_pipe('tagger')
    +            >>> with nlp.disable_pipes('parser', 'tagger'):
    +            >>>     assert not nlp.has_pipe('parser')
    +            >>> assert nlp.has_pipe('parser')
    +            >>> disabled = nlp.disable_pipes('parser')
    +            >>> assert len(disabled) == 1
    +            >>> assert not nlp.has_pipe('parser')
    +            >>> disabled.restore()
    +            >>> assert nlp.has_pipe('parser')
    +        '''
    +        return DisabledPipes(self, *names)
    +
         def make_doc(self, text):
             return self.tokenizer(text)
     
    @@ -655,6 +679,42 @@ class Language(object):
             return self
     
     
    +class DisabledPipes(list):
    +    '''Manager for temporary pipeline disabling.'''
    +    def __init__(self, nlp, *names):
    +        self.nlp = nlp
    +        self.names = names
    +        # Important! Not deep copy -- we just want the container (but we also
    +        # want to support people providing arbitrarily typed nlp.pipeline
    +        # objects.)
    +        self.original_pipeline = copy.copy(nlp.pipeline)
    +        list.__init__(self)
    +        self.extend(nlp.remove_pipe(name) for name in names)
    +
    +    def __enter__(self):
    +        pass
    +
    +    def __exit__(self, *args):
    +        self.restore()
    +
    +    def restore(self):
    +        '''Restore the pipeline to its state when DisabledPipes was created.'''
    +        current, self.nlp.pipeline = self.nlp.pipeline, self.original_pipeline
    +        unexpected = [name for name in current if not self.nlp.has_pipe(name)]
    +        if unexpected:
    +            # Don't change the pipeline if we're raising an error.
    +            self.nlp.pipeline = current
    +            msg = (
    +                "Some current components would be lost when restoring "
    +                "previous pipeline state. If you added components after "
    +                "calling nlp.disable_pipes(), you should remove them "
    +                "explicitly with nlp.remove_pipe() before the pipeline is "
    +                "restore. Names of the new components: %s"
    +            )
    +            raise ValueError(msg % unexpected)
    +        self[:] = []
    +
    +
     def unpickle_language(vocab, meta, bytes_data):
         lang = Language(vocab=vocab)
         lang.from_bytes(bytes_data)
    diff --git a/spacy/tests/pipeline/test_pipe_methods.py b/spacy/tests/pipeline/test_pipe_methods.py
    index 5ec78aefb..dbcde3e5e 100644
    --- a/spacy/tests/pipeline/test_pipe_methods.py
    +++ b/spacy/tests/pipeline/test_pipe_methods.py
    @@ -82,3 +82,21 @@ def test_remove_pipe(nlp, name):
         assert not len(nlp.pipeline)
         assert removed_name == name
         assert removed_component == new_pipe
    +
    +
    +@pytest.mark.parametrize('name', ['my_component'])
    +def test_disable_pipes_method(nlp, name):
    +    nlp.add_pipe(new_pipe, name=name)
    +    assert nlp.has_pipe(name)
    +    disabled = nlp.disable_pipes(name)
    +    assert not nlp.has_pipe(name)
    +    disabled.restore()
    +
    +
    +@pytest.mark.parametrize('name', ['my_component'])
    +def test_disable_pipes_context(nlp, name):
    +    nlp.add_pipe(new_pipe, name=name)
    +    assert nlp.has_pipe(name)
    +    with nlp.disable_pipes(name):
    +        assert not nlp.has_pipe(name)
    +    assert nlp.has_pipe(name)
    
    From 68e9de691728f3853218ee6871902f79f6cd4ae9 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 13:57:14 +0200
    Subject: [PATCH 495/649] Add documentation
    
    ---
     website/api/language.jade | 31 +++++++++++++++++++++++++++++++
     1 file changed, 31 insertions(+)
    
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 668cbadd7..52950987a 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -440,6 +440,37 @@ p
             +cell tuple
             +cell A #[code (name, component)] tuple of the removed component.
     
    ++h(2, "disable_pipes") Language.disable_pipes
    +    +tag contextmanager
    +    +tag-new(2)
    +
    +p
    +    |  Disable one or more pipeline components. If used as a context manager,
    +    |  the pipeline will be restored to the initial state at the end of the
    +    |  block. Otherwise, a #[code DisabledPipes] object is returned, that has a
    +    |  #[code .restore()] method you can use to undo your changes.
    +
    ++aside-code("Example").
    +    with nlp.disable_pipes('tagger', 'parser'):
    +        optimizer = nlp.begin_training(gold_tuples)
    +
    +    disabled = nlp.disable_pipes('tagger', 'parser')
    +    optimizer = nlp.begin_training(gold_tuples)
    +    disabled.restore()
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code *disabled]
    +        +cell unicode
    +        +cell Names of pipeline components to disable.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell #[code DisabledPipes]
    +        +cell
    +            |  The disabled pipes that can be restored by calling the object's
    +            |  #[code .restore()] method.
    +
     +h(2, "to_disk") Language.to_disk
         +tag method
         +tag-new(2)
    
    From 0102561f34033163dd8b7f711e98f33687233ac8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 13:57:55 +0200
    Subject: [PATCH 496/649] Update docs
    
    ---
     website/api/language.jade | 1 +
     website/usage/v2.jade     | 1 +
     2 files changed, 2 insertions(+)
    
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 6aa2d7612..b8fe98d78 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -229,6 +229,7 @@ p
             +cell Config parameters.
     
     +h(2, "preprocess_gold") Language.preprocess_gold
    +    +tag method
     
     p
         |  Can be called before training to pre-process gold data. By default, it
    diff --git a/website/usage/v2.jade b/website/usage/v2.jade
    index bb150de86..f833468bf 100644
    --- a/website/usage/v2.jade
    +++ b/website/usage/v2.jade
    @@ -497,6 +497,7 @@ p
     
         +code-new.
             nlp = spacy.load('en', disable=['tagger', 'ner'])
    +        doc = nlp(u"I don't want parsed", disable['parser'])
             nlp.remove_pipe('parser')
         +code-old.
             nlp = spacy.load('en', tagger=False, entity=False)
    
    From 094512fd47a67501d911066035289a10454c873c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 25 Oct 2017 14:44:00 +0200
    Subject: [PATCH 497/649] Fix model-mark on regression test.
    
    ---
     spacy/tests/regression/test_issue1305.py | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    diff --git a/spacy/tests/regression/test_issue1305.py b/spacy/tests/regression/test_issue1305.py
    index d1d5eb93d..342cdd081 100644
    --- a/spacy/tests/regression/test_issue1305.py
    +++ b/spacy/tests/regression/test_issue1305.py
    @@ -1,11 +1,10 @@
     import pytest
     import spacy
     
    -#@pytest.mark.models('en')
    +@pytest.mark.models('en')
     def test_issue1305():
         '''Test lemmatization of English VBZ'''
         nlp = spacy.load('en_core_web_sm')
         assert nlp.vocab.morphology.lemmatizer('works', 'verb') == ['work']
         doc = nlp(u'This app works well')
    -    print([(w.text, w.tag_) for w in doc])
         assert doc[2].lemma_ == 'work'
    
    From 7f03932477f92cb5a3b5ae0379f3ee7499a340b0 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 14:56:16 +0200
    Subject: [PATCH 498/649] Return self on __enter__
    
    ---
     spacy/language.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index ddc089bd3..5a85a83ec 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -692,7 +692,7 @@ class DisabledPipes(list):
             self.extend(nlp.remove_pipe(name) for name in names)
     
         def __enter__(self):
    -        pass
    +        return self
     
         def __exit__(self, *args):
             self.restore()
    
    From 6a00de4f77f1391744f914ebe8f957e1da43a73e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 14:56:35 +0200
    Subject: [PATCH 499/649] Fix check of unexpected pipe names in restore()
    
    ---
     spacy/language.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 5a85a83ec..05dc32783 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -700,7 +700,7 @@ class DisabledPipes(list):
         def restore(self):
             '''Restore the pipeline to its state when DisabledPipes was created.'''
             current, self.nlp.pipeline = self.nlp.pipeline, self.original_pipeline
    -        unexpected = [name for name in current if not self.nlp.has_pipe(name)]
    +        unexpected = [name for name, pipe in current if not self.nlp.has_pipe(name)]
             if unexpected:
                 # Don't change the pipeline if we're raising an error.
                 self.nlp.pipeline = current
    
    From 615c315d709035ea159f3fd3e49dd3cde594bff2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 14:56:53 +0200
    Subject: [PATCH 500/649] Update train_new_entity_type example to use
     disable_pipes
    
    ---
     examples/training/train_new_entity_type.py | 174 ++++++++++++---------
     1 file changed, 96 insertions(+), 78 deletions(-)
    
    diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py
    index 5f10beebc..fc550b1ed 100644
    --- a/examples/training/train_new_entity_type.py
    +++ b/examples/training/train_new_entity_type.py
    @@ -21,103 +21,121 @@ After training your model, you can save it to a directory. We recommend
     wrapping models as Python packages, for ease of deployment.
     
     For more details, see the documentation:
    -* Training the Named Entity Recognizer: https://spacy.io/docs/usage/train-ner
    -* Saving and loading models: https://spacy.io/docs/usage/saving-loading
    +* Training: https://alpha.spacy.io/usage/training
    +* NER: https://alpha.spacy.io/usage/linguistic-features#named-entities
     
    -Developed for: spaCy 1.7.6
    -Last updated for: spaCy 2.0.0a13
    +Developed for: spaCy 2.0.0a18
    +Last updated for: spaCy 2.0.0a18
     """
     from __future__ import unicode_literals, print_function
     
     import random
     from pathlib import Path
    -import random
     
     import spacy
     from spacy.gold import GoldParse, minibatch
     from spacy.pipeline import NeuralEntityRecognizer
    -from spacy.pipeline import TokenVectorEncoder
    +
    +
    +# new entity label
    +LABEL = 'ANIMAL'
    +
    +# training data
    +TRAIN_DATA = [
    +    ("Horses are too tall and they pretend to care about your feelings",
    +     [(0, 6, 'ANIMAL')]),
    +
    +    ("Do they bite?", []),
    +
    +    ("horses are too tall and they pretend to care about your feelings",
    +     [(0, 6, 'ANIMAL')]),
    +
    +    ("horses pretend to care about your feelings", [(0, 6, 'ANIMAL')]),
    +
    +    ("they pretend to care about your feelings, those horses",
    +     [(48, 54, 'ANIMAL')]),
    +
    +    ("horses?", [(0, 6, 'ANIMAL')])
    +]
    +
    +
    +def main(model=None, new_model_name='animal', output_dir=None):
    +    """Set up the pipeline and entity recognizer, and train the new entity.
    +
    +    model (unicode): Model name to start off with. If None, a blank English
    +        Language class is created.
    +    new_model_name (unicode): Name of new model to create. Will be added to the
    +        model meta and prefixed by the language code, e.g. 'en_animal'.
    +    output_dir (unicode / Path): Optional output directory. If None, no model
    +        will be saved.
    +    """
    +    if model is not None:
    +        nlp = spacy.load(model)  # load existing spaCy model
    +        print("Loaded model '%s'" % model)
    +    else:
    +        nlp = spacy.blank('en')  # create blank Language class
    +        print("Created blank 'en' model")
    +
    +    # Add entity recognizer to model if it's not in the pipeline
    +    if 'ner' not in nlp.pipe_names:
    +        nlp.add_pipe(NeuralEntityRecognizer(nlp.vocab))
    +
    +    ner = nlp.get_pipe('ner')  # get entity recognizer
    +    ner.add_label(LABEL)   # add new entity label to entity recognizer
    +
    +    # get names of other pipes to disable them during training
    +    other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
    +    with nlp.disable_pipes(*other_pipes) as disabled:  # only train NER
    +        random.seed(0)
    +        optimizer = nlp.begin_training(lambda: [])
    +        for itn in range(50):
    +            losses = {}
    +            gold_parses = get_gold_parses(nlp.make_doc, TRAIN_DATA)
    +            for batch in minibatch(gold_parses, size=3):
    +                docs, golds = zip(*batch)
    +                nlp.update(docs, golds, losses=losses, sgd=optimizer,
    +                           drop=0.35)
    +            print(losses)
    +        print(nlp.pipeline)
    +        print(disabled.original_pipeline)
    +
    +    # test the trained model
    +    test_text = 'Do you like horses?'
    +    doc = nlp(test_text)
    +    print("Entities in '%s'" % test_text)
    +    for ent in doc.ents:
    +        print(ent.label_, ent.text)
    +
    +    # save model to output directory
    +    if output_dir is not None:
    +        output_dir = Path(output_dir)
    +        if not output_dir.exists():
    +            output_dir.mkdir()
    +        nlp.meta['name'] = new_model_name  # rename model
    +        nlp.to_disk(output_dir)
    +        print("Saved model to", output_dir)
    +
    +        # test the saved model
    +        print("Loading from", output_dir)
    +        nlp2 = spacy.load(output_dir)
    +        doc2 = nlp2(test_text)
    +        for ent in doc2.ents:
    +            print(ent.label_, ent.text)
     
     
     def get_gold_parses(tokenizer, train_data):
    -    '''Shuffle and create GoldParse objects'''
    +    """Shuffle and create GoldParse objects.
    +
    +    tokenizer (Tokenizer): Tokenizer to processs the raw text.
    +    train_data (list): The training data.
    +    YIELDS (tuple): (doc, gold) tuples.
    +    """
         random.shuffle(train_data)
         for raw_text, entity_offsets in train_data:
             doc = tokenizer(raw_text)
             gold = GoldParse(doc, entities=entity_offsets)
             yield doc, gold
     
    - 
    -def train_ner(nlp, train_data, output_dir):
    -    random.seed(0)
    -    optimizer = nlp.begin_training(lambda: [])
    -    nlp.meta['name'] = 'en_ent_animal'
    -    for itn in range(50):
    -        losses = {}
    -        for batch in minibatch(get_gold_parses(nlp.make_doc, train_data), size=3):
    -            docs, golds = zip(*batch)
    -            nlp.update(docs, golds, losses=losses, sgd=optimizer, drop=0.35)
    -        print(losses)
    -    if not output_dir:
    -        return
    -    elif not output_dir.exists():
    -        output_dir.mkdir()
    -    nlp.to_disk(output_dir)
    -
    -
    -def main(model_name, output_directory=None):
    -    print("Creating initial model", model_name)
    -    nlp = spacy.blank(model_name)
    -    if output_directory is not None:
    -        output_directory = Path(output_directory)
    -
    -    train_data = [
    -        (
    -            "Horses are too tall and they pretend to care about your feelings",
    -            [(0, 6, 'ANIMAL')],
    -        ),
    -        (
    -            "Do they bite?", 
    -            [],
    -        ),
    - 
    -        (
    -            "horses are too tall and they pretend to care about your feelings",
    -            [(0, 6, 'ANIMAL')]
    -        ),
    -        (
    -            "horses pretend to care about your feelings",
    -            [(0, 6, 'ANIMAL')]
    -        ),
    -        (
    -            "they pretend to care about your feelings, those horses",
    -            [(48, 54, 'ANIMAL')]
    -        ),
    -        (
    -            "horses?",
    -            [(0, 6, 'ANIMAL')]
    -        )
    -
    -    ]
    -    nlp.add_pipe(TokenVectorEncoder(nlp.vocab))
    -    ner = NeuralEntityRecognizer(nlp.vocab)
    -    ner.add_label('ANIMAL')
    -    nlp.add_pipe(ner)
    -    train_ner(nlp, train_data, output_directory)
    -
    -    # Test that the entity is recognized
    -    text = 'Do you like horses?'
    -    print("Ents in 'Do you like horses?':")
    -    doc = nlp(text)
    -    for ent in doc.ents:
    -        print(ent.label_, ent.text)
    -    if output_directory:
    -        print("Loading from", output_directory)
    -        nlp2 = spacy.load(output_directory)
    -        doc2 = nlp2('Do you like horses?')
    -        for ent in doc2.ents:
    -            print(ent.label_, ent.text)
    -
     
     if __name__ == '__main__':
         import plac
    
    From 5117a7d24d0ca15f6fc04be13fa4a30527971ef8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 15:54:02 +0200
    Subject: [PATCH 501/649] Fix whitespace
    
    ---
     spacy/syntax/nn_parser.pyx | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index a9553fd1f..f93f44d9d 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -253,7 +253,7 @@ cdef class Parser:
             hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
             if hist_size != 0:
                 raise ValueError("Currently history size is hard-coded to 0")
    -        if hist_width != 0: 
    +        if hist_width != 0:
                 raise ValueError("Currently history width is hard-coded to 0")
             tok2vec = Tok2Vec(token_vector_width, embed_size,
                               pretrained_dims=cfg.get('pretrained_dims', 0))
    @@ -413,7 +413,7 @@ cdef class Parser:
             for stcls in state_objs:
                 if not stcls.c.is_final():
                     states.push_back(stcls.c)
    -                
    +
             feat_weights = state2vec.get_feat_weights()
             cdef int i
             cdef np.ndarray hidden_weights = numpy.ascontiguousarray(vec2scores._layers[-1].W.T)
    @@ -432,7 +432,7 @@ cdef class Parser:
             PyErr_CheckSignals()
             return state_objs
     
    -    cdef void _parseC(self, StateC* state, 
    +    cdef void _parseC(self, StateC* state,
                 const float* feat_weights, const float* hW, const float* hb,
                 int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil:
             token_ids = calloc(nr_feat, sizeof(int))
    @@ -443,7 +443,7 @@ cdef class Parser:
                 with gil:
                     PyErr_SetFromErrno(MemoryError)
                     PyErr_CheckSignals()
    -        
    +
             while not state.is_final():
                 state.set_context_tokens(token_ids, nr_feat)
                 memset(vectors, 0, nr_hidden * nr_piece * sizeof(float))
    
    From 18aae423fbc09ca0507c6cabbe650143ae9b30bf Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 15:54:10 +0200
    Subject: [PATCH 502/649] Remove import of non-existing function
    
    ---
     spacy/syntax/nn_parser.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f93f44d9d..913d2365f 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -48,7 +48,7 @@ from thinc.neural.util import get_array_module
     from .. import util
     from ..util import get_async, get_cuda_stream
     from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts
    -from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune
    +from .._ml import Tok2Vec, doc2feats, rebatch
     from .._ml import Residual, drop_layer, flatten
     from .._ml import link_vectors_to_models
     from .._ml import HistoryFeatures
    
    From 273e6381839d810a81b281d2c4315d132e5f2bfb Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 16:03:05 +0200
    Subject: [PATCH 503/649] Add vector data to model meta after training (see
     #1457)
    
    ---
     spacy/cli/train.py | 5 ++++-
     1 file changed, 4 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 2faea72e7..026b1fe44 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -144,7 +144,10 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=30, n_sents=0,
                         file_.write(json_dumps(scorer.scores))
                     meta_loc = output_path / ('model%d' % i) / 'meta.json'
                     meta['accuracy'] = scorer.scores
    -                meta['speed'] = {'nwords': nwords, 'cpu':cpu_wps, 'gpu': gpu_wps}
    +                meta['speed'] = {'nwords': nwords, 'cpu': cpu_wps,
    +                                 'gpu': gpu_wps}
    +                meta['vectors'] = {'entries': nlp.vocab.vectors_length,
    +                                   'width': 0}
                     meta['lang'] = nlp.lang
                     meta['pipeline'] = pipeline
                     meta['spacy_version'] = '>=%s' % about.__version__
    
    From 057954695bc7baf88d301a7e756668b13757b6fe Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 16:03:26 +0200
    Subject: [PATCH 504/649] Read pipeline and vector data off model in
     --generate-meta
    
    ---
     spacy/cli/package.py | 29 ++++++++++-------------------
     1 file changed, 10 insertions(+), 19 deletions(-)
    
    diff --git a/spacy/cli/package.py b/spacy/cli/package.py
    index 83d4917f6..6b0811459 100644
    --- a/spacy/cli/package.py
    +++ b/spacy/cli/package.py
    @@ -43,7 +43,7 @@ def package(cmd, input_dir, output_dir, meta_path=None, create_meta=False, force
             prints(meta_path, title="Reading meta.json from file")
             meta = util.read_json(meta_path)
         else:
    -        meta = generate_meta()
    +        meta = generate_meta(input_dir)
         meta = validate_meta(meta, ['lang', 'name', 'version'])
     
         model_name = meta['lang'] + '_' + meta['name']
    @@ -77,7 +77,8 @@ def create_file(file_path, contents):
         file_path.open('w', encoding='utf-8').write(contents)
     
     
    -def generate_meta():
    +def generate_meta(model_path):
    +    meta = {}
         settings = [('lang', 'Model language', 'en'),
                     ('name', 'Model name', 'model'),
                     ('version', 'Model version', '0.0.0'),
    @@ -87,31 +88,21 @@ def generate_meta():
                     ('email', 'Author email', False),
                     ('url', 'Author website', False),
                     ('license', 'License', 'CC BY-NC 3.0')]
    -    prints("Enter the package settings for your model.", title="Generating meta.json")
    -    meta = {}
    +    nlp = util.load_model_from_path(Path(model_path))
    +    meta['pipeline'] = nlp.pipe_names
    +    meta['vectors'] = {'width': nlp.vocab.vectors_length,
    +                       'entries': len(nlp.vocab.vectors)}
    +    prints("Enter the package settings for your model. The following "
    +           "information will be read from your model data: pipeline, vectors.",
    +           title="Generating meta.json")
         for setting, desc, default in settings:
             response = util.get_raw_input(desc, default)
             meta[setting] = default if response == '' and default else response
    -    meta['pipeline'] = generate_pipeline()
         if about.__title__ != 'spacy':
             meta['parent_package'] = about.__title__
         return meta
     
     
    -def generate_pipeline():
    -    prints("If set to 'True', the default pipeline is used. If set to 'False', "
    -           "the pipeline will be disabled. Components should be specified as a "
    -           "comma-separated list of component names, e.g. tagger, "
    -           "parser, ner. For more information, see the docs on processing pipelines.",
    -           title="Enter your model's pipeline components")
    -    pipeline = util.get_raw_input("Pipeline components", True)
    -    subs = {'True': True, 'False': False}
    -    if pipeline in subs:
    -        return subs[pipeline]
    -    else:
    -        return [p.strip() for p in pipeline.split(',')]
    -
    -
     def validate_meta(meta, keys):
         for key in keys:
             if key not in meta or meta[key] == '':
    
    From 11e3f19764e5958247edcef4eb00110ef9a7fb8f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 16:08:26 +0200
    Subject: [PATCH 505/649] Fix vectors data added after training (see #1457)
    
    ---
     spacy/cli/train.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 026b1fe44..da398751c 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -146,8 +146,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=30, n_sents=0,
                     meta['accuracy'] = scorer.scores
                     meta['speed'] = {'nwords': nwords, 'cpu': cpu_wps,
                                      'gpu': gpu_wps}
    -                meta['vectors'] = {'entries': nlp.vocab.vectors_length,
    -                                   'width': 0}
    +                meta['vectors'] = {'width': nlp.vocab.vectors_length,
    +                                   'entries': len(nlp.vocab.vectors)}
                     meta['lang'] = nlp.lang
                     meta['pipeline'] = pipeline
                     meta['spacy_version'] = '>=%s' % about.__version__
    
    From 70de2dd0359169bc86ccd397446d0acd6d47f9d6 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 16:15:37 +0200
    Subject: [PATCH 506/649] Display vectors in models directory if available (see
     #1457)
    
    ---
     website/_includes/_page_models.jade |  2 +-
     website/assets/js/main.js           | 11 +++++++++--
     2 files changed, 10 insertions(+), 3 deletions(-)
    
    diff --git a/website/_includes/_page_models.jade b/website/_includes/_page_models.jade
    index c5bd799f0..d4ce55f43 100644
    --- a/website/_includes/_page_models.jade
    +++ b/website/_includes/_page_models.jade
    @@ -38,7 +38,7 @@ for id in CURRENT_MODELS
                     +cell #[+label Size]
                     +cell #[+tag=comps.size] #[span(data-tpl=id data-tpl-key="size") #[em n/a]]
     
    -            each label in ["Pipeline", "Sources", "Author", "License"]
    +            each label in ["Pipeline", "Vectors", "Sources", "Author", "License"]
                     - var field = label.toLowerCase()
                     +row
                         +cell.u-nowrap
    diff --git a/website/assets/js/main.js b/website/assets/js/main.js
    index 42199538f..5cbd4d807 100644
    --- a/website/assets/js/main.js
    +++ b/website/assets/js/main.js
    @@ -140,6 +140,10 @@ class ModelLoader {
             else return ({ ok: res.ok })
         }
     
    +    convertNumber(num, separator = ',') {
    +        return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, separator);
    +    }
    +
         getModels(compat) {
             this.compat = compat;
             for (let modelId of this.modelIds) {
    @@ -159,7 +163,7 @@ class ModelLoader {
             const template = new Templater(modelId);
             template.get('table').removeAttribute('data-loading');
             template.get('error').style.display = 'block';
    -        for (let key of ['sources', 'pipeline', 'author', 'license']) {
    +        for (let key of ['sources', 'pipeline', 'vectors', 'author', 'license']) {
                 template.get(key).parentElement.parentElement.style.display = 'none';
             }
         }
    @@ -167,13 +171,14 @@ class ModelLoader {
         /**
          * Update model details in tables. Currently quite hacky :(
          */
    -    render({ lang, name, version, sources, pipeline, url, author, license, accuracy, size, description, notes }) {
    +    render({ lang, name, version, sources, pipeline, vectors, url, author, license, accuracy, size, description, notes }) {
             const modelId = `${lang}_${name}`;
             const model = `${modelId}-${version}`;
             const template = new Templater(modelId);
     
             const getSources = s => (s instanceof Array) ? s.join(', ') : s;
             const getPipeline = p => p.map(comp => `${comp}`).join(', ');
    +        const getVectors = v => `${this.convertNumber(v.entries)} (${v.width} dimensions)`;
             const getLink = (t, l) => `${t}`;
     
             const keys = { version, size, description, notes }
    @@ -182,6 +187,8 @@ class ModelLoader {
             if (sources) template.fill('sources', getSources(sources));
             if (pipeline && pipeline.length) template.fill('pipeline', getPipeline(pipeline), true);
             else template.get('pipeline').parentElement.parentElement.style.display = 'none';
    +        if (vectors) template.fill('vectors', getVectors(vectors));
    +        else template.get('vectors').parentElement.parentElement.style.display = 'none';
     
             if (author) template.fill('author', url ? getLink(author, url) : author, true);
             if (license) template.fill('license', this.licenses[license] ? getLink(license, this.licenses[license]) : license, true);
    
    From 91beacf5e327a5898935050ff8fdb9b9d9268821 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 16:19:38 +0200
    Subject: [PATCH 507/649] Fix Matcher.__contains__
    
    ---
     spacy/matcher.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 6c1069578..fd4a8026a 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -230,7 +230,7 @@ cdef class Matcher:
             key (unicode): The match ID.
             RETURNS (bool): Whether the matcher contains rules for this match ID.
             """
    -        return key in self._patterns
    +        return self._normalize_key(key) in self._patterns
     
         def add(self, key, on_match, *patterns):
             """Add a match-rule to the matcher. A match-rule consists of: an ID key,
    
    From c0b55ebdac8196f4432a381a1ad39d7746d19ded Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 16:31:11 +0200
    Subject: [PATCH 508/649] Fix PhraseMatcher.__contains__ and add more tests
    
    ---
     spacy/matcher.pyx           |  2 +-
     spacy/tests/test_matcher.py | 28 ++++++++++++++++++++++++++--
     2 files changed, 27 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index fd4a8026a..401405c14 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -490,7 +490,7 @@ cdef class PhraseMatcher:
             RETURNS (bool): Whether the matcher contains rules for this match ID.
             """
             cdef hash_t ent_id = self.matcher._normalize_key(key)
    -        return ent_id in self.phrase_ids
    +        return ent_id in self._callbacks
     
         def __reduce__(self):
             return (self.__class__, (self.vocab,), None, None)
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index 5b08ede39..8210467ea 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -64,6 +64,12 @@ def test_matcher_init(en_vocab, words):
         assert matcher(doc) == []
     
     
    +def test_matcher_contains(matcher):
    +    matcher.add('TEST', None, [{'ORTH': 'test'}])
    +    assert 'TEST' in matcher
    +    assert 'TEST2' not in matcher
    +
    +
     def test_matcher_no_match(matcher):
         words = ["I", "like", "cheese", "."]
         doc = get_doc(matcher.vocab, words)
    @@ -112,7 +118,8 @@ def test_matcher_empty_dict(en_vocab):
         matcher.add('A.', None, [{'ORTH': 'a'}, {}])
         matches = matcher(doc)
         assert matches[0][1:] == (0, 2)
    - 
    +
    +
     def test_matcher_operator_shadow(en_vocab):
         matcher = Matcher(en_vocab)
         abc = ["a", "b", "c"]
    @@ -123,7 +130,8 @@ def test_matcher_operator_shadow(en_vocab):
         matches = matcher(doc)
         assert len(matches) == 1
         assert matches[0][1:] == (0, 3)
    - 
    +
    +
     def test_matcher_phrase_matcher(en_vocab):
         words = ["Google", "Now"]
         doc = get_doc(en_vocab, words)
    @@ -134,6 +142,22 @@ def test_matcher_phrase_matcher(en_vocab):
         assert len(matcher(doc)) == 1
     
     
    +def test_phrase_matcher_length(en_vocab):
    +    matcher = PhraseMatcher(en_vocab)
    +    assert len(matcher) == 0
    +    matcher.add('TEST', None, get_doc(en_vocab, ['test']))
    +    assert len(matcher) == 1
    +    matcher.add('TEST2', None, get_doc(en_vocab, ['test2']))
    +    assert len(matcher) == 2
    +
    +
    +def test_phrase_matcher_contains(en_vocab):
    +    matcher = PhraseMatcher(en_vocab)
    +    matcher.add('TEST', None, get_doc(en_vocab, ['test']))
    +    assert 'TEST' in matcher
    +    assert 'TEST2' not in matcher
    +
    +
     def test_matcher_match_zero(matcher):
         words1 = 'He said , " some words " ...'.split()
         words2 = 'He said , " some three words " ...'.split()
    
    From 1bc07758faaf73a9cbcdca340b6343cb5d6cd76a Mon Sep 17 00:00:00 2001
    From: mayukh18 
    Date: Wed, 25 Oct 2017 22:24:40 +0530
    Subject: [PATCH 509/649] added few bengali pronouns
    
    ---
     spacy/lang/bn/morph_rules.py | 15 ++++++++++++++-
     spacy/lang/bn/stop_words.py  |  4 ++--
     2 files changed, 16 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/lang/bn/morph_rules.py b/spacy/lang/bn/morph_rules.py
    index 8561f8676..6ca8fc097 100644
    --- a/spacy/lang/bn/morph_rules.py
    +++ b/spacy/lang/bn/morph_rules.py
    @@ -12,11 +12,11 @@ MORPH_RULES = {
             'কি':        {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'Gender': 'Neut', 'PronType': 'Int', 'Case': 'Acc'},
             'সে':        {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'Person': 'Three', 'PronType': 'Prs', 'Case': 'Nom'},
             'কিসে':      {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'Gender': 'Neut', 'PronType': 'Int', 'Case': 'Acc'},
    -        'কাদের':     {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'PronType': 'Int', 'Case': 'Acc'},
             'তাকে':      {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'Person': 'Three', 'PronType': 'Prs', 'Case': 'Acc'},
             'স্বয়ং':     {LEMMA: PRON_LEMMA, 'Reflex': 'Yes', 'PronType': 'Ref'},
             'কোনগুলো':   {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'Gender': 'Neut', 'PronType': 'Int', 'Case': 'Acc'},
             'তুমি':      {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'Person': 'Two', 'PronType': 'Prs', 'Case': 'Nom'},
    +        'তুই':      {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'Person': 'Two', 'PronType': 'Prs', 'Case': 'Nom'},
             'তাদেরকে':   {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'Person': 'Three', 'PronType': 'Prs', 'Case': 'Acc'},
             'আমরা':      {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'Person': 'One ', 'PronType': 'Prs', 'Case': 'Nom'},
             'যিনি':      {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'PronType': 'Rel', 'Case': 'Nom'},
    @@ -24,12 +24,15 @@ MORPH_RULES = {
             'কোন':       {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'PronType': 'Int', 'Case': 'Acc'},
             'কারা':      {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'PronType': 'Int', 'Case': 'Acc'},
             'তোমাকে':    {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'Person': 'Two', 'PronType': 'Prs', 'Case': 'Acc'},
    +        'তোকে':    {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'Person': 'Two', 'PronType': 'Prs', 'Case': 'Acc'},
             'খোদ':       {LEMMA: PRON_LEMMA, 'Reflex': 'Yes', 'PronType': 'Ref'},
             'কে':        {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'PronType': 'Int', 'Case': 'Acc'},
             'যারা':      {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'PronType': 'Rel', 'Case': 'Nom'},
             'যে':        {LEMMA: PRON_LEMMA, 'Number': 'Sing', 'PronType': 'Rel', 'Case': 'Nom'},
             'তোমরা':     {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'Person': 'Two', 'PronType': 'Prs', 'Case': 'Nom'},
    +        'তোরা':     {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'Person': 'Two', 'PronType': 'Prs', 'Case': 'Nom'},
             'তোমাদেরকে': {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'Person': 'Two', 'PronType': 'Prs', 'Case': 'Acc'},
    +        'তোদেরকে': {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'Person': 'Two', 'PronType': 'Prs', 'Case': 'Acc'},
             'আপন':       {LEMMA: PRON_LEMMA, 'Reflex': 'Yes', 'PronType': 'Ref'},
             'এ':         {LEMMA: PRON_LEMMA, 'PronType': 'Dem'},
             'নিজ':       {LEMMA: PRON_LEMMA, 'Reflex': 'Yes', 'PronType': 'Ref'},
    @@ -42,6 +45,10 @@ MORPH_RULES = {
     
             'আমার':    {LEMMA:  PRON_LEMMA, 'Number': 'Sing', 'Person': 'One', 'PronType': 'Prs', 'Poss': 'Yes',
                         'Case': 'Nom'},
    +        'মোর':     {LEMMA:  PRON_LEMMA, 'Number': 'Sing', 'Person': 'One', 'PronType': 'Prs', 'Poss': 'Yes',
    +                    'Case': 'Nom'},
    +        'মোদের':   {LEMMA:  PRON_LEMMA, 'Number': 'Plur', 'Person': 'One', 'PronType': 'Prs', 'Poss': 'Yes',
    +                    'Case': 'Nom'},
             'তার':     {LEMMA:  PRON_LEMMA, 'Number': 'Sing', 'Person': 'Three', 'PronType': 'Prs', 'Poss': 'Yes',
                         'Case': 'Nom'},
             'তোমাদের': {LEMMA:  PRON_LEMMA, 'Number': 'Plur', 'Person': 'Two', 'PronType': 'Prs', 'Poss': 'Yes',
    @@ -50,7 +57,13 @@ MORPH_RULES = {
                         'Case': 'Nom'},
             'তোমার':   {LEMMA:  PRON_LEMMA, 'Number': 'Sing', 'Person': 'Two', 'PronType': 'Prs', 'Poss': 'Yes',
                         'Case': 'Nom'},
    +        'তোর':     {LEMMA:  PRON_LEMMA, 'Number': 'Sing', 'Person': 'Two', 'PronType': 'Prs', 'Poss': 'Yes',
    +                    'Case': 'Nom'},
             'তাদের':   {LEMMA:  PRON_LEMMA, 'Number': 'Plur', 'Person': 'Three', 'PronType': 'Prs', 'Poss': 'Yes',
                         'Case': 'Nom'},
    +        'কাদের':   {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'PronType': 'Int', 'Case': 'Acc'},
    +        'তোদের':   {LEMMA:  PRON_LEMMA, 'Number': 'Plur', 'Person': 'Two', 'PronType': 'Prs', 'Poss': 'Yes',
    +                    'Case': 'Nom'},
    +        'যাদের':   {LEMMA: PRON_LEMMA, 'Number': 'Plur', 'PronType': 'Int', 'Case': 'Acc'},
         }
     }
    diff --git a/spacy/lang/bn/stop_words.py b/spacy/lang/bn/stop_words.py
    index 5b513da7b..ca0ae934a 100644
    --- a/spacy/lang/bn/stop_words.py
    +++ b/spacy/lang/bn/stop_words.py
    @@ -22,7 +22,7 @@ STOP_WORDS = set("""
     টি 
     ঠিক 
     তখন তত তথা তবু তবে তা তাঁকে তাঁদের তাঁর তাঁরা তাঁহারা তাই তাও তাকে তাতে তাদের তার তারপর তারা তারই তাহলে তাহা তাহাতে তাহার তিনই 
    -তিনি তিনিও তুমি তুলে তেমন তো তোমার 
    +তিনি তিনিও তুমি তুলে তেমন তো তোমার তুই তোরা তোর তোমাদের তোদের
     থাকবে থাকবেন থাকা থাকায় থাকে থাকেন থেকে থেকেই  থেকেও থাকায়
     দিকে দিতে দিয়ে দিয়েছে দিয়েছেন দিলেন দিয়ে দু  দুটি  দুটো দেওয়া দেওয়ার দেখতে দেখা দেখে দেন দেয়  দেশের  
     দ্বারা দিয়েছে দিয়েছেন দেয় দেওয়া দেওয়ার দিন দুই
    @@ -32,7 +32,7 @@ STOP_WORDS = set("""
     ফলে ফিরে ফের 
     বছর বদলে বরং বলতে বলল বললেন বলা বলে বলেছেন বলেন  বসে বহু বা বাদে বার বিনা বিভিন্ন বিশেষ বিষয়টি বেশ ব্যবহার ব্যাপারে বক্তব্য বন বেশি
     ভাবে  ভাবেই 
    -মত মতো মতোই মধ্যভাগে মধ্যে মধ্যেই  মধ্যেও মনে মাত্র মাধ্যমে মানুষ মানুষের মোট মোটেই 
    +মত মতো মতোই মধ্যভাগে মধ্যে মধ্যেই  মধ্যেও মনে মাত্র মাধ্যমে মানুষ মানুষের মোট মোটেই মোদের মোর 
     যখন যত যতটা যথেষ্ট যদি যদিও যা যাঁর যাঁরা যাওয়া  যাওয়ার যাকে যাচ্ছে যাতে যাদের যান যাবে যায় যার  যারা যায় যিনি যে যেখানে যেতে যেন 
     যেমন 
     রকম রয়েছে রাখা রেখে রয়েছে 
    
    From 400812d9b17ac1ad054a2f4105ffae32dc45f945 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 22:17:11 +0200
    Subject: [PATCH 510/649] Add add_label method to Pipe
    
    ---
     website/api/pipe.jade | 15 +++++++++++++++
     1 file changed, 15 insertions(+)
    
    diff --git a/website/api/pipe.jade b/website/api/pipe.jade
    index 66bdbcc62..c2afbde12 100644
    --- a/website/api/pipe.jade
    +++ b/website/api/pipe.jade
    @@ -304,6 +304,21 @@ p Modify the pipe's model, to use the given parameter values.
                 |  The parameter values to use in the model. At the end of the
                 |  context, the original parameters are restored.
     
    ++h(2, "add_label") #{CLASSNAME}.add_label
    +    +tag method
    +
    +p Add a new label to the pipe.
    +
    ++aside-code("Example").
    +    #{VARNAME} = #{CLASSNAME}(nlp.vocab)
    +    #{VARNAME}.add_label('MY_LABEL')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code label]
    +        +cell unicode
    +        +cell The label to add.
    +
     +h(2, "to_disk") #{CLASSNAME}.to_disk
         +tag method
     
    
    From e6536d231fc92dab27438dc1d8731d67483c4948 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 25 Oct 2017 22:17:23 +0200
    Subject: [PATCH 511/649] Update new entity type training example in docs
    
    ---
     website/usage/_training/_ner.jade | 56 ++++++++++++++++++++++++-------
     1 file changed, 44 insertions(+), 12 deletions(-)
    
    diff --git a/website/usage/_training/_ner.jade b/website/usage/_training/_ner.jade
    index ff3101c8f..ed58c4c6f 100644
    --- a/website/usage/_training/_ner.jade
    +++ b/website/usage/_training/_ner.jade
    @@ -24,28 +24,60 @@ p
         |  #[strong experiment on your own data] to find a solution that works best
         |  for you.
     
    -+h(3, "example-new-entity-type") Example: Training an additional entity type
    ++h(3, "example-new-entity-type") Training an additional entity type
     
     p
    -    |  This script shows how to add a new entity type to an existing pre-trained
    -    |  NER model. To keep the example short and simple, only a few sentences are
    +    |  This script shows how to add a new entity type #[code ANIMAL] to an
    +    |  existing pre-trained NER model, or an empty #[code Language] class. To
    +    |  keep the example short and simple, only a few sentences are
         |  provided as examples. In practice, you'll need many more — a few hundred
         |  would be a good start. You will also likely need to mix in examples of
         |  other entity types, which might be obtained by running the entity
         |  recognizer over unlabelled sentences, and adding their annotations to the
         |  training set.
     
    -p
    -    |  The actual training is performed by looping over the examples, and
    -    |  calling #[+api("language#update") #[code nlp.update()]]. The
    -    |  #[code update] method steps through the words of the input. At each word,
    -    |  it makes a prediction. It then consults the annotations provided on the
    -    |  #[+api("goldparse") #[code GoldParse]] instance, to see whether it was
    -    |  right. If it was wrong, it adjusts its weights so that the correct
    -    |  action will score higher next time.
    -
     +github("spacy", "examples/training/train_new_entity_type.py")
     
    +p Training a new entity type requires the following steps:
    +
    ++list("numbers")
    +    +item
    +        |  Create #[+api("doc") #[code Doc]] and
    +        |  #[+api("goldparse") #[code GoldParse]] objects for
    +        |  #[strong each example in your training data].
    +
    +    +item
    +        |  #[strong Load the model] you want to start with, or create an
    +        |  #[strong empty model] using
    +        |  #[+api("spacy#blank") #[code spacy.blank()]] with the ID of your
    +        |  language. If you're using an existing model, make sure to disable
    +        |  all other pipeline components during training using
    +        |  #[+api("language#disable_pipes") #[code nlp.disable_pipes]]. This way,
    +        |  you'll only be training the entity recognizer.
    +
    +    +item
    +        |  #[strong Add the new entity label] to the entity recognizer using the
    +        |  #[+api("entityrecognizer#add_label") #[code add_label]] method. You
    +        |  can access the entity recognizer in the pipeline via
    +        |  #[code nlp.get_pipe('ner')].
    +
    +    +item
    +        |  #[strong Loop over] the examples and call
    +        |  #[+api("language#update") #[code nlp.update]], which steps through
    +        |  the words of the input. At each word, it makes a
    +        |  #[strong prediction]. It then consults the annotations provided on the
    +        |  #[+api("goldparse") #[code GoldParse]] instance, to see whether it was
    +        |  right. If it was wrong, it adjusts its weights so that the correct
    +        |  action will score higher next time.
    +
    +    +item
    +        |  #[strong Save] the trained model using
    +        |  #[+api("language#to_disk") #[code nlp.to_disk()]].
    +
    +    +item
    +        |  #[strong Test] the model to make sure the new entity is recognized
    +        |  correctly.
    +
     +h(3, "example-ner-from-scratch") Example: Training an NER system from scratch
     
     p
    
    From b0f3ea2200ab62bae2482884dbcce8e8e376c1d1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 26 Oct 2017 12:38:23 +0200
    Subject: [PATCH 512/649] Fix names of pipeline components
    
    NeuralDependencyParser --> DependencyParser
    NeuralEntityRecognizer --> EntityRecognizer
    TokenVectorEncoder     --> Tensorizer
    NeuralLabeller         --> MultitaskObjective
    ---
     spacy/language.py                             | 13 ++-
     spacy/pipeline.pxd                            | 21 -----
     spacy/pipeline.pyx                            | 86 ++++---------------
     spacy/tests/doc/test_add_entities.py          |  3 +-
     spacy/tests/parser/test_add_label.py          |  4 +-
     spacy/tests/parser/test_neural_parser.py      |  2 +-
     spacy/tests/parser/test_preset_sbd.py         |  4 +-
     spacy/tests/parser/test_to_from_bytes_disk.py |  6 +-
     .../serialize/test_serialize_parser_ner.py    |  4 +-
     .../tests/serialize/test_serialize_tagger.py  |  2 +-
     .../serialize/test_serialize_tensorizer.py    |  2 +-
     11 files changed, 35 insertions(+), 112 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 933ca772d..c4777898e 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -18,8 +18,8 @@ from .tagger import Tagger
     from .lemmatizer import Lemmatizer
     from .syntax.parser import get_templates
     
    -from .pipeline import NeuralDependencyParser, TokenVectorEncoder, NeuralTagger
    -from .pipeline import NeuralEntityRecognizer, SimilarityHook, TextCategorizer
    +from .pipeline import DependencyParser, Tensorizer, Tagger
    +from .pipeline import EntityRecognizer, SimilarityHook, TextCategorizer
     
     from .compat import json_dumps, izip, copy_reg
     from .scorer import Scorer
    @@ -75,9 +75,6 @@ class BaseDefaults(object):
         infixes = tuple(TOKENIZER_INFIXES)
         tag_map = dict(TAG_MAP)
         tokenizer_exceptions = {}
    -    parser_features = get_templates('parser')
    -    entity_features = get_templates('ner')
    -    tagger_features = Tagger.feature_templates # TODO -- fix this
         stop_words = set()
         lemma_rules = {}
         lemma_exc = {}
    @@ -102,9 +99,9 @@ class Language(object):
         factories = {
             'tokenizer': lambda nlp: nlp.Defaults.create_tokenizer(nlp),
             'tensorizer': lambda nlp, **cfg: TokenVectorEncoder(nlp.vocab, **cfg),
    -        'tagger': lambda nlp, **cfg: NeuralTagger(nlp.vocab, **cfg),
    -        'parser': lambda nlp, **cfg: NeuralDependencyParser(nlp.vocab, **cfg),
    -        'ner': lambda nlp, **cfg: NeuralEntityRecognizer(nlp.vocab, **cfg),
    +        'tagger': lambda nlp, **cfg: Tagger(nlp.vocab, **cfg),
    +        'parser': lambda nlp, **cfg: DependencyParser(nlp.vocab, **cfg),
    +        'ner': lambda nlp, **cfg: EntityRecognizer(nlp.vocab, **cfg),
             'similarity': lambda nlp, **cfg: SimilarityHook(nlp.vocab, **cfg),
             'textcat': lambda nlp, **cfg: TextCategorizer(nlp.vocab, **cfg)
         }
    diff --git a/spacy/pipeline.pxd b/spacy/pipeline.pxd
    index e9b7f0f73..e69de29bb 100644
    --- a/spacy/pipeline.pxd
    +++ b/spacy/pipeline.pxd
    @@ -1,21 +0,0 @@
    -from .syntax.parser cimport Parser
    -#from .syntax.beam_parser cimport BeamParser
    -from .syntax.ner cimport BiluoPushDown
    -from .syntax.arc_eager cimport ArcEager
    -from .tagger cimport Tagger
    -
    -
    -cdef class EntityRecognizer(Parser):
    -    pass
    -
    -
    -cdef class DependencyParser(Parser):
    -    pass
    -
    -
    -#cdef class BeamEntityRecognizer(BeamParser):
    -#    pass
    -#
    -#
    -#cdef class BeamDependencyParser(BeamParser):
    -#    pass
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 7c1976dfa..6e4ef2f3e 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -26,11 +26,8 @@ from thinc.neural.util import to_categorical
     from thinc.neural._classes.difference import Siamese, CauchySimilarity
     
     from .tokens.doc cimport Doc
    -from .syntax.parser cimport Parser as LinearParser
    -from .syntax.nn_parser cimport Parser as NeuralParser
    +from .syntax.nn_parser cimport Parser
     from .syntax import nonproj
    -from .syntax.parser import get_templates as get_feature_templates
    -from .syntax.beam_parser cimport BeamParser
     from .syntax.ner cimport BiluoPushDown
     from .syntax.arc_eager cimport ArcEager
     from .tagger import Tagger
    @@ -217,7 +214,7 @@ def _load_cfg(path):
             return {}
     
     
    -class TokenVectorEncoder(BaseThincComponent):
    +class Tensorizer(BaseThincComponent):
         """Assign position-sensitive vectors to tokens, using a CNN or RNN."""
         name = 'tensorizer'
     
    @@ -329,7 +326,7 @@ class TokenVectorEncoder(BaseThincComponent):
             link_vectors_to_models(self.vocab)
     
     
    -class NeuralTagger(BaseThincComponent):
    +class Tagger(BaseThincComponent):
         name = 'tagger'
         def __init__(self, vocab, model=True, **cfg):
             self.vocab = vocab
    @@ -513,7 +510,11 @@ class NeuralTagger(BaseThincComponent):
             return self
     
     
    -class NeuralLabeller(NeuralTagger):
    +class MultitaskObjective(Tagger):
    +    '''Assist training of a parser or tagger, by training a side-objective.
    +
    +    Experimental
    +    '''
         name = 'nn_labeller'
         def __init__(self, vocab, model=True, target='dep_tag_offset', **cfg):
             self.vocab = vocab
    @@ -532,7 +533,7 @@ class NeuralLabeller(NeuralTagger):
                 self.make_label = target
             else:
                 raise ValueError(
    -                "NeuralLabeller target should be function or one of "
    +                "MultitaskObjective target should be function or one of "
                     "['dep', 'tag', 'ent', 'dep_tag_offset', 'ent_tag']")
             self.cfg = dict(cfg)
             self.cfg.setdefault('cnn_maxout_pieces', 2)
    @@ -752,45 +753,7 @@ class TextCategorizer(BaseThincComponent):
                 link_vectors_to_models(self.vocab)
     
     
    -cdef class EntityRecognizer(LinearParser):
    -    """Annotate named entities on Doc objects."""
    -    TransitionSystem = BiluoPushDown
    -
    -    feature_templates = get_feature_templates('ner')
    -
    -    def add_label(self, label):
    -        LinearParser.add_label(self, label)
    -        if isinstance(label, basestring):
    -            label = self.vocab.strings[label]
    -
    -
    -cdef class BeamEntityRecognizer(BeamParser):
    -    """Annotate named entities on Doc objects."""
    -    TransitionSystem = BiluoPushDown
    -
    -    feature_templates = get_feature_templates('ner')
    -
    -    def add_label(self, label):
    -        LinearParser.add_label(self, label)
    -        if isinstance(label, basestring):
    -            label = self.vocab.strings[label]
    -
    -
    -cdef class DependencyParser(LinearParser):
    -    TransitionSystem = ArcEager
    -    feature_templates = get_feature_templates('basic')
    -
    -    def add_label(self, label):
    -        LinearParser.add_label(self, label)
    -        if isinstance(label, basestring):
    -            label = self.vocab.strings[label]
    -
    -    @property
    -    def postprocesses(self):
    -        return [nonproj.deprojectivize]
    -
    -
    -cdef class NeuralDependencyParser(NeuralParser):
    +cdef class DependencyParser(Parser):
         name = 'parser'
         TransitionSystem = ArcEager
     
    @@ -800,17 +763,17 @@ cdef class NeuralDependencyParser(NeuralParser):
     
         def init_multitask_objectives(self, gold_tuples, pipeline, **cfg):
             for target in []:
    -            labeller = NeuralLabeller(self.vocab, target=target)
    +            labeller = MultitaskObjective(self.vocab, target=target)
                 tok2vec = self.model[0]
                 labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec)
                 pipeline.append(labeller)
                 self._multitasks.append(labeller)
     
         def __reduce__(self):
    -        return (NeuralDependencyParser, (self.vocab, self.moves, self.model), None, None)
    +        return (DependencyParser, (self.vocab, self.moves, self.model), None, None)
     
     
    -cdef class NeuralEntityRecognizer(NeuralParser):
    +cdef class EntityRecognizer(Parser):
         name = 'ner'
         TransitionSystem = BiluoPushDown
     
    @@ -818,31 +781,14 @@ cdef class NeuralEntityRecognizer(NeuralParser):
     
         def init_multitask_objectives(self, gold_tuples, pipeline, **cfg):
             for target in []:
    -            labeller = NeuralLabeller(self.vocab, target=target)
    +            labeller = MultitaskObjective(self.vocab, target=target)
                 tok2vec = self.model[0]
                 labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec)
                 pipeline.append(labeller)
                 self._multitasks.append(labeller)
     
         def __reduce__(self):
    -        return (NeuralEntityRecognizer, (self.vocab, self.moves, self.model), None, None)
    +        return (EntityRecognizer, (self.vocab, self.moves, self.model), None, None)
     
     
    -cdef class BeamDependencyParser(BeamParser):
    -    TransitionSystem = ArcEager
    -
    -    feature_templates = get_feature_templates('basic')
    -
    -    def add_label(self, label):
    -        Parser.add_label(self, label)
    -        if isinstance(label, basestring):
    -            label = self.vocab.strings[label]
    -
    -    @property
    -    def postprocesses(self):
    -        return [nonproj.deprojectivize]
    -
    -
    -
    -__all__ = ['Tagger', 'DependencyParser', 'EntityRecognizer', 'BeamDependencyParser',
    -           'BeamEntityRecognizer', 'TokenVectorEnoder']
    +__all__ = ['Tagger', 'DependencyParser', 'EntityRecognizer', 'Tensorizer']
    diff --git a/spacy/tests/doc/test_add_entities.py b/spacy/tests/doc/test_add_entities.py
    index cc74aa0ae..cd444ba81 100644
    --- a/spacy/tests/doc/test_add_entities.py
    +++ b/spacy/tests/doc/test_add_entities.py
    @@ -10,7 +10,8 @@ import pytest
     def test_doc_add_entities_set_ents_iob(en_vocab):
         text = ["This", "is", "a", "lion"]
         doc = get_doc(en_vocab, text)
    -    ner = EntityRecognizer(en_vocab, features=[(2,), (3,)])
    +    ner = EntityRecognizer(en_vocab)
    +    ner.begin_training([])
         ner(doc)
     
         assert len(list(doc.ents)) == 0
    diff --git a/spacy/tests/parser/test_add_label.py b/spacy/tests/parser/test_add_label.py
    index 3fbfc96a6..c3bceb106 100644
    --- a/spacy/tests/parser/test_add_label.py
    +++ b/spacy/tests/parser/test_add_label.py
    @@ -9,7 +9,7 @@ from ...attrs import NORM
     from ...gold import GoldParse
     from ...vocab import Vocab
     from ...tokens import Doc
    -from ...pipeline import NeuralDependencyParser
    +from ...pipeline import DependencyParser
     
     numpy.random.seed(0)
     
    @@ -21,7 +21,7 @@ def vocab():
     
     @pytest.fixture
     def parser(vocab):
    -    parser = NeuralDependencyParser(vocab)
    +    parser = DependencyParser(vocab)
         parser.cfg['token_vector_width'] = 8
         parser.cfg['hidden_width'] = 30
         parser.cfg['hist_size'] = 0
    diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py
    index ae20cd5f0..e85c61276 100644
    --- a/spacy/tests/parser/test_neural_parser.py
    +++ b/spacy/tests/parser/test_neural_parser.py
    @@ -6,7 +6,7 @@ import numpy
     
     from ..._ml import chain, Tok2Vec, doc2feats
     from ...vocab import Vocab
    -from ...pipeline import TokenVectorEncoder
    +from ...pipeline import Tensorizer
     from ...syntax.arc_eager import ArcEager
     from ...syntax.nn_parser import Parser
     from ...tokens.doc import Doc
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index 4c973bd97..9b8c98735 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -8,7 +8,7 @@ from ...attrs import NORM
     from ...gold import GoldParse
     from ...vocab import Vocab
     from ...tokens import Doc
    -from ...pipeline import NeuralDependencyParser
    +from ...pipeline import DependencyParser
     
     @pytest.fixture
     def vocab():
    @@ -16,7 +16,7 @@ def vocab():
     
     @pytest.fixture
     def parser(vocab):
    -    parser = NeuralDependencyParser(vocab)
    +    parser = DependencyParser(vocab)
         parser.cfg['token_vector_width'] = 4
         parser.cfg['hidden_width'] = 32
         #parser.add_label('right')
    diff --git a/spacy/tests/parser/test_to_from_bytes_disk.py b/spacy/tests/parser/test_to_from_bytes_disk.py
    index b0a10fa8e..48c412b7a 100644
    --- a/spacy/tests/parser/test_to_from_bytes_disk.py
    +++ b/spacy/tests/parser/test_to_from_bytes_disk.py
    @@ -1,11 +1,11 @@
     import pytest
     
    -from ...pipeline import NeuralDependencyParser
    +from ...pipeline import DependencyParser
     
     
     @pytest.fixture
     def parser(en_vocab):
    -    parser = NeuralDependencyParser(en_vocab)
    +    parser = DependencyParser(en_vocab)
         parser.add_label('nsubj')
         parser.model, cfg = parser.Model(parser.moves.n_moves)
         parser.cfg.update(cfg)
    @@ -14,7 +14,7 @@ def parser(en_vocab):
     
     @pytest.fixture
     def blank_parser(en_vocab):
    -    parser = NeuralDependencyParser(en_vocab)
    +    parser = DependencyParser(en_vocab)
         return parser
     
     
    diff --git a/spacy/tests/serialize/test_serialize_parser_ner.py b/spacy/tests/serialize/test_serialize_parser_ner.py
    index ae9e23e9a..cbe97b716 100644
    --- a/spacy/tests/serialize/test_serialize_parser_ner.py
    +++ b/spacy/tests/serialize/test_serialize_parser_ner.py
    @@ -2,8 +2,8 @@
     from __future__ import unicode_literals
     
     from ..util import make_tempdir
    -from ...pipeline import NeuralDependencyParser as DependencyParser
    -from ...pipeline import NeuralEntityRecognizer as EntityRecognizer
    +from ...pipeline import DependencyParser
    +from ...pipeline import EntityRecognizer
     
     import pytest
     
    diff --git a/spacy/tests/serialize/test_serialize_tagger.py b/spacy/tests/serialize/test_serialize_tagger.py
    index 475be1cef..7b7dedae0 100644
    --- a/spacy/tests/serialize/test_serialize_tagger.py
    +++ b/spacy/tests/serialize/test_serialize_tagger.py
    @@ -2,7 +2,7 @@
     from __future__ import unicode_literals
     
     from ..util import make_tempdir
    -from ...pipeline import NeuralTagger as Tagger
    +from ...pipeline import Tagger
     
     import pytest
     
    diff --git a/spacy/tests/serialize/test_serialize_tensorizer.py b/spacy/tests/serialize/test_serialize_tensorizer.py
    index ba01a2fa6..bc751a686 100644
    --- a/spacy/tests/serialize/test_serialize_tensorizer.py
    +++ b/spacy/tests/serialize/test_serialize_tensorizer.py
    @@ -2,7 +2,7 @@
     from __future__ import unicode_literals
     
     from ..util import make_tempdir
    -from ...pipeline import TokenVectorEncoder as Tensorizer
    +from ...pipeline import Tensorizer
     
     import pytest
     
    
    From a8abc47811e732ac49c402b0a0b41ca585d584c8 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 26 Oct 2017 12:40:40 +0200
    Subject: [PATCH 513/649] Rename BaseThincComponent --> Pipe
    
    ---
     spacy/pipeline.pyx | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 6e4ef2f3e..c52c29883 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -83,7 +83,7 @@ class SentenceSegmenter(object):
                 yield doc[start : len(doc)]
     
     
    -class BaseThincComponent(object):
    +class Pipe(object):
         name = None
     
         @classmethod
    @@ -214,7 +214,7 @@ def _load_cfg(path):
             return {}
     
     
    -class Tensorizer(BaseThincComponent):
    +class Tensorizer(Pipe):
         """Assign position-sensitive vectors to tokens, using a CNN or RNN."""
         name = 'tensorizer'
     
    @@ -326,7 +326,7 @@ class Tensorizer(BaseThincComponent):
             link_vectors_to_models(self.vocab)
     
     
    -class Tagger(BaseThincComponent):
    +class Tagger(Pipe):
         name = 'tagger'
         def __init__(self, vocab, model=True, **cfg):
             self.vocab = vocab
    @@ -623,7 +623,7 @@ class MultitaskObjective(Tagger):
                 return '%s-%s' % (tags[i], ents[i])
     
     
    -class SimilarityHook(BaseThincComponent):
    +class SimilarityHook(Pipe):
         """
         Experimental
     
    @@ -675,7 +675,7 @@ class SimilarityHook(BaseThincComponent):
                 link_vectors_to_models(self.vocab)
     
     
    -class TextCategorizer(BaseThincComponent):
    +class TextCategorizer(Pipe):
         name = 'textcat'
     
         @classmethod
    
    From 33f8c58782f96d787f862b32ead86f933a1a574e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 26 Oct 2017 12:42:05 +0200
    Subject: [PATCH 514/649] Remove obsolete parser.pyx
    
    ---
     spacy/syntax/_parse_features.pxd | 259 ---------------
     spacy/syntax/_parse_features.pyx | 419 ------------------------
     spacy/syntax/beam_parser.pxd     |  10 -
     spacy/syntax/beam_parser.pyx     | 239 --------------
     spacy/syntax/parser.pxd          |  24 --
     spacy/syntax/parser.pyx          | 526 -------------------------------
     6 files changed, 1477 deletions(-)
     delete mode 100644 spacy/syntax/_parse_features.pxd
     delete mode 100644 spacy/syntax/_parse_features.pyx
     delete mode 100644 spacy/syntax/beam_parser.pxd
     delete mode 100644 spacy/syntax/beam_parser.pyx
     delete mode 100644 spacy/syntax/parser.pxd
     delete mode 100644 spacy/syntax/parser.pyx
    
    diff --git a/spacy/syntax/_parse_features.pxd b/spacy/syntax/_parse_features.pxd
    deleted file mode 100644
    index 0842e3504..000000000
    --- a/spacy/syntax/_parse_features.pxd
    +++ /dev/null
    @@ -1,259 +0,0 @@
    -from thinc.typedefs cimport atom_t
    -
    -from .stateclass cimport StateClass
    -from ._state cimport StateC
    -
    -
    -cdef int fill_context(atom_t* context, const StateC* state) nogil
    -# Context elements
    -
    -# Ensure each token's attributes are listed: w, p, c, c6, c4. The order
    -# is referenced by incrementing the enum...
    -
    -# Tokens are listed in left-to-right order.
    -#cdef size_t* SLOTS = [
    -#    S2w, S1w,
    -#    S0l0w, S0l2w, S0lw,
    -#    S0w,
    -#    S0r0w, S0r2w, S0rw,
    -#    N0l0w, N0l2w, N0lw,
    -#    P2w, P1w,
    -#    N0w, N1w, N2w, N3w, 0
    -#]
    -
    -# NB: The order of the enum is _NOT_ arbitrary!!
    -cpdef enum:
    -    S2w
    -    S2W
    -    S2p
    -    S2c
    -    S2c4
    -    S2c6
    -    S2L
    -    S2_prefix
    -    S2_suffix
    -    S2_shape
    -    S2_ne_iob
    -    S2_ne_type
    -
    -    S1w
    -    S1W
    -    S1p
    -    S1c
    -    S1c4
    -    S1c6
    -    S1L
    -    S1_prefix
    -    S1_suffix
    -    S1_shape
    -    S1_ne_iob
    -    S1_ne_type
    -
    -    S1rw
    -    S1rW
    -    S1rp
    -    S1rc
    -    S1rc4
    -    S1rc6
    -    S1rL
    -    S1r_prefix
    -    S1r_suffix
    -    S1r_shape
    -    S1r_ne_iob
    -    S1r_ne_type
    -
    -    S0lw
    -    S0lW
    -    S0lp
    -    S0lc
    -    S0lc4
    -    S0lc6
    -    S0lL
    -    S0l_prefix
    -    S0l_suffix
    -    S0l_shape
    -    S0l_ne_iob
    -    S0l_ne_type
    -
    -    S0l2w
    -    S0l2W
    -    S0l2p
    -    S0l2c
    -    S0l2c4
    -    S0l2c6
    -    S0l2L
    -    S0l2_prefix
    -    S0l2_suffix
    -    S0l2_shape
    -    S0l2_ne_iob
    -    S0l2_ne_type
    -
    -    S0w
    -    S0W
    -    S0p
    -    S0c
    -    S0c4
    -    S0c6
    -    S0L
    -    S0_prefix
    -    S0_suffix
    -    S0_shape
    -    S0_ne_iob
    -    S0_ne_type
    -
    -    S0r2w
    -    S0r2W
    -    S0r2p
    -    S0r2c
    -    S0r2c4
    -    S0r2c6
    -    S0r2L
    -    S0r2_prefix
    -    S0r2_suffix
    -    S0r2_shape
    -    S0r2_ne_iob
    -    S0r2_ne_type
    -
    -    S0rw
    -    S0rW
    -    S0rp
    -    S0rc
    -    S0rc4
    -    S0rc6
    -    S0rL
    -    S0r_prefix
    -    S0r_suffix
    -    S0r_shape
    -    S0r_ne_iob
    -    S0r_ne_type
    -
    -    N0l2w
    -    N0l2W
    -    N0l2p
    -    N0l2c
    -    N0l2c4
    -    N0l2c6
    -    N0l2L
    -    N0l2_prefix
    -    N0l2_suffix
    -    N0l2_shape
    -    N0l2_ne_iob
    -    N0l2_ne_type
    -
    -    N0lw
    -    N0lW
    -    N0lp
    -    N0lc
    -    N0lc4
    -    N0lc6
    -    N0lL
    -    N0l_prefix
    -    N0l_suffix
    -    N0l_shape
    -    N0l_ne_iob
    -    N0l_ne_type
    -
    -    N0w
    -    N0W
    -    N0p
    -    N0c
    -    N0c4
    -    N0c6
    -    N0L
    -    N0_prefix
    -    N0_suffix
    -    N0_shape
    -    N0_ne_iob
    -    N0_ne_type
    -
    -    N1w
    -    N1W
    -    N1p
    -    N1c
    -    N1c4
    -    N1c6
    -    N1L
    -    N1_prefix
    -    N1_suffix
    -    N1_shape
    -    N1_ne_iob
    -    N1_ne_type
    -
    -    N2w
    -    N2W
    -    N2p
    -    N2c
    -    N2c4
    -    N2c6
    -    N2L
    -    N2_prefix
    -    N2_suffix
    -    N2_shape
    -    N2_ne_iob
    -    N2_ne_type
    -
    -    P1w
    -    P1W
    -    P1p
    -    P1c
    -    P1c4
    -    P1c6
    -    P1L
    -    P1_prefix
    -    P1_suffix
    -    P1_shape
    -    P1_ne_iob
    -    P1_ne_type
    -
    -    P2w
    -    P2W
    -    P2p
    -    P2c
    -    P2c4
    -    P2c6
    -    P2L
    -    P2_prefix
    -    P2_suffix
    -    P2_shape
    -    P2_ne_iob
    -    P2_ne_type
    -
    -    E0w
    -    E0W
    -    E0p
    -    E0c
    -    E0c4
    -    E0c6
    -    E0L
    -    E0_prefix
    -    E0_suffix
    -    E0_shape
    -    E0_ne_iob
    -    E0_ne_type
    -
    -    E1w
    -    E1W
    -    E1p
    -    E1c
    -    E1c4
    -    E1c6
    -    E1L
    -    E1_prefix
    -    E1_suffix
    -    E1_shape
    -    E1_ne_iob
    -    E1_ne_type
    -
    -    # Misc features at the end
    -    dist
    -    N0lv
    -    S0lv
    -    S0rv
    -    S1lv
    -    S1rv
    -
    -    S0_has_head
    -    S1_has_head
    -    S2_has_head
    -
    -    CONTEXT_SIZE
    diff --git a/spacy/syntax/_parse_features.pyx b/spacy/syntax/_parse_features.pyx
    deleted file mode 100644
    index 2e0db4877..000000000
    --- a/spacy/syntax/_parse_features.pyx
    +++ /dev/null
    @@ -1,419 +0,0 @@
    -"""
    -Fill an array, context, with every _atomic_ value our features reference.
    -We then write the _actual features_ as tuples of the atoms. The machinery
    -that translates from the tuples to feature-extractors (which pick the values
    -out of "context") is in features/extractor.pyx
    -
    -The atomic feature names are listed in a big enum, so that the feature tuples
    -can refer to them.
    -"""
    -# coding: utf-8
    -from __future__ import unicode_literals
    -
    -from libc.string cimport memset
    -from itertools import combinations
    -from cymem.cymem cimport Pool
    -
    -from ..structs cimport TokenC
    -from .stateclass cimport StateClass
    -from ._state cimport StateC
    -
    -
    -cdef inline void fill_token(atom_t* context, const TokenC* token) nogil:
    -    if token is NULL:
    -        context[0] = 0
    -        context[1] = 0
    -        context[2] = 0
    -        context[3] = 0
    -        context[4] = 0
    -        context[5] = 0
    -        context[6] = 0
    -        context[7] = 0
    -        context[8] = 0
    -        context[9] = 0
    -        context[10] = 0
    -        context[11] = 0
    -    else:
    -        context[0] = token.lex.orth
    -        context[1] = token.lemma
    -        context[2] = token.tag
    -        context[3] = token.lex.cluster
    -        # We've read in the string little-endian, so now we can take & (2**n)-1
    -        # to get the first n bits of the cluster.
    -        # e.g. s = "1110010101"
    -        # s = ''.join(reversed(s))
    -        # first_4_bits = int(s, 2)
    -        # print first_4_bits
    -        # 5
    -        # print "{0:b}".format(prefix).ljust(4, '0')
    -        # 1110
    -        # What we're doing here is picking a number where all bits are 1, e.g.
    -        # 15 is 1111, 63 is 111111 and doing bitwise AND, so getting all bits in
    -        # the source that are set to 1.
    -        context[4] = token.lex.cluster & 15
    -        context[5] = token.lex.cluster & 63
    -        context[6] = token.dep if token.head != 0 else 0
    -        context[7] = token.lex.prefix
    -        context[8] = token.lex.suffix
    -        context[9] = token.lex.shape
    -        context[10] = token.ent_iob
    -        context[11] = token.ent_type
    -
    -cdef int fill_context(atom_t* ctxt, const StateC* st) nogil:
    -    # Take care to fill every element of context!
    -    # We could memset, but this makes it very easy to have broken features that
    -    # make almost no impact on accuracy. If instead they're unset, the impact
    -    # tends to be dramatic, so we get an obvious regression to fix...
    -    fill_token(&ctxt[S2w], st.S_(2))
    -    fill_token(&ctxt[S1w], st.S_(1))
    -    fill_token(&ctxt[S1rw], st.R_(st.S(1), 1))
    -    fill_token(&ctxt[S0lw], st.L_(st.S(0), 1))
    -    fill_token(&ctxt[S0l2w], st.L_(st.S(0), 2))
    -    fill_token(&ctxt[S0w], st.S_(0))
    -    fill_token(&ctxt[S0r2w], st.R_(st.S(0), 2))
    -    fill_token(&ctxt[S0rw], st.R_(st.S(0), 1))
    -    fill_token(&ctxt[N0lw], st.L_(st.B(0), 1))
    -    fill_token(&ctxt[N0l2w], st.L_(st.B(0), 2))
    -    fill_token(&ctxt[N0w], st.B_(0))
    -    fill_token(&ctxt[N1w], st.B_(1))
    -    fill_token(&ctxt[N2w], st.B_(2))
    -    fill_token(&ctxt[P1w], st.safe_get(st.B(0)-1))
    -    fill_token(&ctxt[P2w], st.safe_get(st.B(0)-2))
    -
    -    fill_token(&ctxt[E0w], st.E_(0))
    -    fill_token(&ctxt[E1w], st.E_(1))
    -
    -    if st.stack_depth() >= 1 and not st.eol():
    -        ctxt[dist] = min_(st.B(0) - st.E(0), 5)
    -    else:
    -        ctxt[dist] = 0
    -    ctxt[N0lv] = min_(st.n_L(st.B(0)), 5)
    -    ctxt[S0lv] = min_(st.n_L(st.S(0)), 5)
    -    ctxt[S0rv] = min_(st.n_R(st.S(0)), 5)
    -    ctxt[S1lv] = min_(st.n_L(st.S(1)), 5)
    -    ctxt[S1rv] = min_(st.n_R(st.S(1)), 5)
    -
    -    ctxt[S0_has_head] = 0
    -    ctxt[S1_has_head] = 0
    -    ctxt[S2_has_head] = 0
    -    if st.stack_depth() >= 1:
    -        ctxt[S0_has_head] = st.has_head(st.S(0)) + 1
    -        if st.stack_depth() >= 2:
    -            ctxt[S1_has_head] = st.has_head(st.S(1)) + 1
    -            if st.stack_depth() >= 3:
    -                ctxt[S2_has_head] = st.has_head(st.S(2)) + 1
    -
    -
    -cdef inline int min_(int a, int b) nogil:
    -    return a if a > b else b
    -
    -
    -ner = (
    -    (N0W,),
    -    (P1W,),
    -    (N1W,),
    -    (P2W,),
    -    (N2W,),
    -
    -    (P1W, N0W,),
    -    (N0W, N1W),
    -
    -    (N0_prefix,),
    -    (N0_suffix,),
    -
    -    (P1_shape,),
    -    (N0_shape,),
    -    (N1_shape,),
    -    (P1_shape, N0_shape,),
    -    (N0_shape, P1_shape,),
    -    (P1_shape, N0_shape, N1_shape),
    -    (N2_shape,),
    -    (P2_shape,),
    -
    -    #(P2_norm, P1_norm, W_norm),
    -    #(P1_norm, W_norm, N1_norm),
    -    #(W_norm, N1_norm, N2_norm)
    -
    -    (P2p,),
    -    (P1p,),
    -    (N0p,),
    -    (N1p,),
    -    (N2p,),
    -
    -    (P1p, N0p),
    -    (N0p, N1p),
    -    (P2p, P1p, N0p),
    -    (P1p, N0p, N1p),
    -    (N0p, N1p, N2p),
    -
    -    (P2c,),
    -    (P1c,),
    -    (N0c,),
    -    (N1c,),
    -    (N2c,),
    -
    -    (P1c, N0c),
    -    (N0c, N1c),
    -
    -    (E0W,),
    -    (E0c,),
    -    (E0p,),
    -
    -    (E0W, N0W),
    -    (E0c, N0W),
    -    (E0p, N0W),
    -
    -    (E0p, P1p, N0p),
    -    (E0c, P1c, N0c),
    -
    -    (E0w, P1c),
    -    (E0p, P1p),
    -    (E0c, P1c),
    -    (E0p, E1p),
    -    (E0c, P1p),
    -
    -    (E1W,),
    -    (E1c,),
    -    (E1p,),
    -
    -    (E0W, E1W),
    -    (E0W, E1p,),
    -    (E0p, E1W,),
    -    (E0p, E1W),
    -
    -    (P1_ne_iob,),
    -    (P1_ne_iob, P1_ne_type),
    -    (N0w, P1_ne_iob, P1_ne_type),
    -
    -    (N0_shape,),
    -    (N1_shape,),
    -    (N2_shape,),
    -    (P1_shape,),
    -    (P2_shape,),
    -
    -    (N0_prefix,),
    -    (N0_suffix,),
    -
    -    (P1_ne_iob,),
    -    (P2_ne_iob,),
    -    (P1_ne_iob, P2_ne_iob),
    -    (P1_ne_iob, P1_ne_type),
    -    (P2_ne_iob, P2_ne_type),
    -    (N0w, P1_ne_iob, P1_ne_type),
    -
    -    (N0w, N1w),
    -)
    -
    -
    -unigrams = (
    -    (S2W, S2p),
    -    (S2c6, S2p),
    -
    -    (S1W, S1p),
    -    (S1c6, S1p),
    -
    -    (S0W, S0p),
    -    (S0c6, S0p),
    -
    -    (N0W, N0p),
    -    (N0p,),
    -    (N0c,),
    -    (N0c6, N0p),
    -    (N0L,),
    -
    -    (N1W, N1p),
    -    (N1c6, N1p),
    -
    -    (N2W, N2p),
    -    (N2c6, N2p),
    -
    -    (S0r2W, S0r2p),
    -    (S0r2c6, S0r2p),
    -    (S0r2L,),
    -
    -    (S0rW, S0rp),
    -    (S0rc6, S0rp),
    -    (S0rL,),
    -
    -    (S0l2W, S0l2p),
    -    (S0l2c6, S0l2p),
    -    (S0l2L,),
    -
    -    (S0lW, S0lp),
    -    (S0lc6, S0lp),
    -    (S0lL,),
    -
    -    (N0l2W, N0l2p),
    -    (N0l2c6, N0l2p),
    -    (N0l2L,),
    -
    -    (N0lW, N0lp),
    -    (N0lc6, N0lp),
    -    (N0lL,),
    -)
    -
    -
    -s0_n0 = (
    -    (S0W, S0p, N0W, N0p),
    -    (S0c, S0p, N0c, N0p),
    -    (S0c6, S0p, N0c6, N0p),
    -    (S0c4, S0p, N0c4, N0p),
    -    (S0p, N0p),
    -    (S0W, N0p),
    -    (S0p, N0W),
    -    (S0W, N0c),
    -    (S0c, N0W),
    -    (S0p, N0c),
    -    (S0c, N0p),
    -    (S0W, S0rp, N0p),
    -    (S0p, S0rp, N0p),
    -    (S0p, N0lp, N0W),
    -    (S0p, N0lp, N0p),
    -    (S0L, N0p),
    -    (S0p, S0rL, N0p),
    -    (S0p, N0lL, N0p),
    -    (S0p, S0rv, N0p),
    -    (S0p, N0lv, N0p),
    -    (S0c6, S0rL, S0r2L, N0p),
    -    (S0p, N0lL, N0l2L, N0p),
    -)
    -
    -
    -s1_s0 = (
    -    (S1p, S0p),
    -    (S1p, S0p, S0_has_head),
    -    (S1W, S0p),
    -    (S1W, S0p, S0_has_head),
    -    (S1c, S0p),
    -    (S1c, S0p, S0_has_head),
    -    (S1p, S1rL, S0p),
    -    (S1p, S1rL, S0p, S0_has_head),
    -    (S1p, S0lL, S0p),
    -    (S1p, S0lL, S0p, S0_has_head),
    -    (S1p, S0lL, S0l2L, S0p),
    -    (S1p, S0lL, S0l2L, S0p, S0_has_head),
    -    (S1L, S0L, S0W),
    -    (S1L, S0L, S0p),
    -    (S1p, S1L, S0L, S0p),
    -    (S1p, S0p),
    -)
    -
    -
    -s1_n0 = (
    -    (S1p, N0p),
    -    (S1c, N0c),
    -    (S1c, N0p),
    -    (S1p, N0c),
    -    (S1W, S1p, N0p),
    -    (S1p, N0W, N0p),
    -    (S1c6, S1p, N0c6, N0p),
    -    (S1L, N0p),
    -    (S1p, S1rL, N0p),
    -    (S1p, S1rp, N0p),
    -)
    -
    -
    -s0_n1 = (
    -    (S0p, N1p),
    -    (S0c, N1c),
    -    (S0c, N1p),
    -    (S0p, N1c),
    -    (S0W, S0p, N1p),
    -    (S0p, N1W, N1p),
    -    (S0c6, S0p, N1c6, N1p),
    -    (S0L, N1p),
    -    (S0p, S0rL, N1p),
    -)
    -
    -
    -n0_n1 = (
    -    (N0W, N0p, N1W, N1p),
    -    (N0W, N0p, N1p),
    -    (N0p, N1W, N1p),
    -    (N0c, N0p, N1c, N1p),
    -    (N0c6, N0p, N1c6, N1p),
    -    (N0c, N1c),
    -    (N0p, N1c),
    -)
    -
    -tree_shape = (
    -    (dist,),
    -    (S0p, S0_has_head, S1_has_head, S2_has_head),
    -    (S0p, S0lv, S0rv),
    -    (N0p, N0lv),
    -)
    -
    -trigrams = (
    -    (N0p, N1p, N2p),
    -    (S0p, S0lp, S0l2p),
    -    (S0p, S0rp, S0r2p),
    -    (S0p, S1p, S2p),
    -    (S1p, S0p, N0p),
    -    (S0p, S0lp, N0p),
    -    (S0p, N0p, N0lp),
    -    (N0p, N0lp, N0l2p),
    -
    -    (S0W, S0p, S0rL, S0r2L),
    -    (S0p, S0rL, S0r2L),
    -
    -    (S0W, S0p, S0lL, S0l2L),
    -    (S0p, S0lL, S0l2L),
    -
    -    (N0W, N0p, N0lL, N0l2L),
    -    (N0p, N0lL, N0l2L),
    -)
    -
    -
    -words = (
    -    S2w,
    -    S1w,
    -    S1rw,
    -    S0lw,
    -    S0l2w,
    -    S0w,
    -    S0r2w,
    -    S0rw,
    -    N0lw,
    -    N0l2w,
    -    N0w,
    -    N1w,
    -    N2w,
    -    P1w,
    -    P2w
    -)
    -
    -tags = (
    -    S2p,
    -    S1p,
    -    S1rp,
    -    S0lp,
    -    S0l2p,
    -    S0p,
    -    S0r2p,
    -    S0rp,
    -    N0lp,
    -    N0l2p,
    -    N0p,
    -    N1p,
    -    N2p,
    -    P1p,
    -    P2p
    -)
    -
    -labels = (
    -    S2L,
    -    S1L,
    -    S1rL,
    -    S0lL,
    -    S0l2L,
    -    S0L,
    -    S0r2L,
    -    S0rL,
    -    N0lL,
    -    N0l2L,
    -    N0L,
    -    N1L,
    -    N2L,
    -    P1L,
    -    P2L
    -)
    diff --git a/spacy/syntax/beam_parser.pxd b/spacy/syntax/beam_parser.pxd
    deleted file mode 100644
    index 35a60cbf3..000000000
    --- a/spacy/syntax/beam_parser.pxd
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -from .parser cimport Parser
    -from ..structs cimport TokenC
    -from thinc.typedefs cimport weight_t
    -
    -
    -cdef class BeamParser(Parser):
    -    cdef public int beam_width
    -    cdef public weight_t beam_density
    -
    -    cdef int _parseC(self, TokenC* tokens, int length, int nr_feat, int nr_class) except -1
    diff --git a/spacy/syntax/beam_parser.pyx b/spacy/syntax/beam_parser.pyx
    deleted file mode 100644
    index 68e9f27af..000000000
    --- a/spacy/syntax/beam_parser.pyx
    +++ /dev/null
    @@ -1,239 +0,0 @@
    -"""
    -MALT-style dependency parser
    -"""
    -# cython: profile=True
    -# cython: experimental_cpp_class_def=True
    -# cython: cdivision=True
    -# cython: infer_types=True
    -# coding: utf-8
    -
    -from __future__ import unicode_literals, print_function
    -cimport cython
    -
    -from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF
    -from libc.stdint cimport uint32_t, uint64_t
    -from libc.string cimport memset, memcpy
    -from libc.stdlib cimport rand
    -from libc.math cimport log, exp, isnan, isinf
    -from cymem.cymem cimport Pool, Address
    -from murmurhash.mrmr cimport real_hash64 as hash64
    -from thinc.typedefs cimport weight_t, class_t, feat_t, atom_t, hash_t
    -from thinc.linear.features cimport ConjunctionExtracter
    -from thinc.structs cimport FeatureC, ExampleC
    -from thinc.extra.search cimport Beam, MaxViolation
    -from thinc.extra.eg cimport Example
    -from thinc.extra.mb cimport Minibatch
    -
    -from ..structs cimport TokenC
    -from ..tokens.doc cimport Doc
    -from ..strings cimport StringStore
    -from .transition_system cimport TransitionSystem, Transition
    -from ..gold cimport GoldParse
    -from . import _parse_features
    -from ._parse_features cimport CONTEXT_SIZE
    -from ._parse_features cimport fill_context
    -from .stateclass cimport StateClass
    -from .parser cimport Parser
    -
    -
    -DEBUG = False
    -def set_debug(val):
    -    global DEBUG
    -    DEBUG = val
    -
    -
    -def get_templates(name):
    -    pf = _parse_features
    -    if name == 'ner':
    -        return pf.ner
    -    elif name == 'debug':
    -        return pf.unigrams
    -    else:
    -        return (pf.unigrams + pf.s0_n0 + pf.s1_n0 + pf.s1_s0 + pf.s0_n1 + pf.n0_n1 + \
    -                pf.tree_shape + pf.trigrams)
    -
    -
    -cdef int BEAM_WIDTH = 16
    -cdef weight_t BEAM_DENSITY = 0.001
    -
    -cdef class BeamParser(Parser):
    -    def __init__(self, *args, **kwargs):
    -        self.beam_width = kwargs.get('beam_width', BEAM_WIDTH)
    -        self.beam_density = kwargs.get('beam_density', BEAM_DENSITY)
    -        Parser.__init__(self, *args, **kwargs)
    -
    -    cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil:
    -        with gil:
    -            self._parseC(tokens, length, nr_feat, self.moves.n_moves)
    -
    -    cdef int _parseC(self, TokenC* tokens, int length, int nr_feat, int nr_class) except -1:
    -        cdef Beam beam = Beam(self.moves.n_moves, self.beam_width, min_density=self.beam_density)
    -        # TODO: How do we handle new labels here? This increases nr_class
    -        beam.initialize(self.moves.init_beam_state, length, tokens)
    -        beam.check_done(_check_final_state, NULL)
    -        if beam.is_done:
    -            _cleanup(beam)
    -            return 0
    -        while not beam.is_done:
    -            self._advance_beam(beam, None, False)
    -        state = beam.at(0)
    -        self.moves.finalize_state(state.c)
    -        for i in range(length):
    -            tokens[i] = state.c._sent[i]
    -        _cleanup(beam)
    -
    -    def update(self, Doc tokens, GoldParse gold_parse, itn=0):
    -        self.moves.preprocess_gold(gold_parse)
    -        cdef Beam pred = Beam(self.moves.n_moves, self.beam_width)
    -        pred.initialize(self.moves.init_beam_state, tokens.length, tokens.c)
    -        pred.check_done(_check_final_state, NULL)
    -        # Hack for NER
    -        for i in range(pred.size):
    -            stcls = pred.at(i)
    -            self.moves.initialize_state(stcls.c)
    -
    -        cdef Beam gold = Beam(self.moves.n_moves, self.beam_width, min_density=0.0)
    -        gold.initialize(self.moves.init_beam_state, tokens.length, tokens.c)
    -        gold.check_done(_check_final_state, NULL)
    -        violn = MaxViolation()
    -        while not pred.is_done and not gold.is_done:
    -            # We search separately here, to allow for ambiguity in the gold parse.
    -            self._advance_beam(pred, gold_parse, False)
    -            self._advance_beam(gold, gold_parse, True)
    -            violn.check_crf(pred, gold)
    -            if pred.loss > 0 and pred.min_score > (gold.score + self.model.time):
    -                break
    -        else:
    -            # The non-monotonic oracle makes it difficult to ensure final costs are
    -            # correct. Therefore do final correction
    -            for i in range(pred.size):
    -                if self.moves.is_gold_parse(pred.at(i), gold_parse):
    -                    pred._states[i].loss = 0.0
    -                elif pred._states[i].loss == 0.0:
    -                    pred._states[i].loss = 1.0
    -            violn.check_crf(pred, gold)
    -        if pred.size < 1:
    -            raise Exception("No candidates", tokens.length)
    -        if gold.size < 1:
    -            raise Exception("No gold", tokens.length)
    -        if pred.loss == 0:
    -            self.model.update_from_histories(self.moves, tokens, [(0.0, [])])
    -        elif True:
    -            #_check_train_integrity(pred, gold, gold_parse, self.moves)
    -            histories = list(zip(violn.p_probs, violn.p_hist)) + \
    -                        list(zip(violn.g_probs, violn.g_hist))
    -            self.model.update_from_histories(self.moves, tokens, histories, min_grad=0.001**(itn+1))
    -        else:
    -            self.model.update_from_histories(self.moves, tokens,
    -                [(1.0, violn.p_hist[0]), (-1.0, violn.g_hist[0])])
    -        _cleanup(pred)
    -        _cleanup(gold)
    -        return pred.loss
    -
    -    def _advance_beam(self, Beam beam, GoldParse gold, bint follow_gold):
    -        cdef atom_t[CONTEXT_SIZE] context
    -        cdef Pool mem = Pool()
    -        features = mem.alloc(self.model.nr_feat, sizeof(FeatureC))
    -        if False:
    -            mb = Minibatch(self.model.widths, beam.size)
    -            for i in range(beam.size):
    -                stcls = beam.at(i)
    -                if stcls.c.is_final():
    -                    nr_feat = 0
    -                else:
    -                    nr_feat = self.model.set_featuresC(context, features, stcls.c)
    -                    self.moves.set_valid(beam.is_valid[i], stcls.c)
    -                mb.c.push_back(features, nr_feat, beam.costs[i], beam.is_valid[i], 0)
    -            self.model(mb)
    -            for i in range(beam.size):
    -                memcpy(beam.scores[i], mb.c.scores(i), mb.c.nr_out() * sizeof(beam.scores[i][0]))
    -        else:
    -            for i in range(beam.size):
    -                stcls = beam.at(i)
    -                if not stcls.is_final():
    -                    nr_feat = self.model.set_featuresC(context, features, stcls.c)
    -                    self.moves.set_valid(beam.is_valid[i], stcls.c)
    -                    self.model.set_scoresC(beam.scores[i], features, nr_feat)
    -        if gold is not None:
    -            n_gold = 0
    -            lines = []
    -            for i in range(beam.size):
    -                stcls = beam.at(i)
    -                if not stcls.c.is_final():
    -                    self.moves.set_costs(beam.is_valid[i], beam.costs[i], stcls, gold)
    -                    if follow_gold:
    -                        for j in range(self.moves.n_moves):
    -                            if beam.costs[i][j] >= 1:
    -                                beam.is_valid[i][j] = 0
    -                                lines.append((stcls.B(0), stcls.B(1),
    -                                    stcls.B_(0).ent_iob, stcls.B_(1).ent_iob,
    -                                    stcls.B_(1).sent_start,
    -                                    j,
    -                                    beam.is_valid[i][j], 'set invalid',
    -                                    beam.costs[i][j], self.moves.c[j].move, self.moves.c[j].label))
    -                            n_gold += 1 if beam.is_valid[i][j] else 0
    -            if follow_gold and n_gold == 0:
    -                raise Exception("No gold")
    -        if follow_gold:
    -            beam.advance(_transition_state, NULL, self.moves.c)
    -        else:
    -            beam.advance(_transition_state, _hash_state, self.moves.c)
    -        beam.check_done(_check_final_state, NULL)
    -
    -
    -# These are passed as callbacks to thinc.search.Beam
    -cdef int _transition_state(void* _dest, void* _src, class_t clas, void* _moves) except -1:
    -    dest = _dest
    -    src = _src
    -    moves = _moves
    -    dest.clone(src)
    -    moves[clas].do(dest.c, moves[clas].label)
    -
    -
    -cdef int _check_final_state(void* _state, void* extra_args) except -1:
    -    return (_state).is_final()
    -
    -
    -def _cleanup(Beam beam):
    -    for i in range(beam.width):
    -        Py_XDECREF(beam._states[i].content)
    -        Py_XDECREF(beam._parents[i].content)
    -
    -
    -cdef hash_t _hash_state(void* _state, void* _) except 0:
    -    state = _state
    -    if state.c.is_final():
    -        return 1
    -    else:
    -        return state.c.hash()
    -
    -
    -def _check_train_integrity(Beam pred, Beam gold, GoldParse gold_parse, TransitionSystem moves):
    -    for i in range(pred.size):
    -        if not pred._states[i].is_done or pred._states[i].loss == 0:
    -            continue
    -        state = pred.at(i)
    -        if moves.is_gold_parse(state, gold_parse) == True:
    -            for dep in gold_parse.orig_annot:
    -                print(dep[1], dep[3], dep[4])
    -            print("Cost", pred._states[i].loss)
    -            for j in range(gold_parse.length):
    -                print(gold_parse.orig_annot[j][1], state.H(j), moves.strings[state.safe_get(j).dep])
    -            acts = [moves.c[clas].move for clas in pred.histories[i]]
    -            labels = [moves.c[clas].label for clas in pred.histories[i]]
    -            print([moves.move_name(move, label) for move, label in zip(acts, labels)])
    -            raise Exception("Predicted state is gold-standard")
    -    for i in range(gold.size):
    -        if not gold._states[i].is_done:
    -            continue
    -        state = gold.at(i)
    -        if moves.is_gold(state, gold_parse) == False:
    -            print("Truth")
    -            for dep in gold_parse.orig_annot:
    -                print(dep[1], dep[3], dep[4])
    -            print("Predicted good")
    -            for j in range(gold_parse.length):
    -                print(gold_parse.orig_annot[j][1], state.H(j), moves.strings[state.safe_get(j).dep])
    -            raise Exception("Gold parse is not gold-standard")
    -
    -
    diff --git a/spacy/syntax/parser.pxd b/spacy/syntax/parser.pxd
    deleted file mode 100644
    index 95b6c3d3f..000000000
    --- a/spacy/syntax/parser.pxd
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -from thinc.linear.avgtron cimport AveragedPerceptron
    -from thinc.typedefs cimport atom_t
    -from thinc.structs cimport FeatureC
    -
    -from .stateclass cimport StateClass
    -from .arc_eager cimport TransitionSystem
    -from ..vocab cimport Vocab
    -from ..tokens.doc cimport Doc
    -from ..structs cimport TokenC
    -from ._state cimport StateC
    -
    -
    -cdef class ParserModel(AveragedPerceptron):
    -    cdef int set_featuresC(self, atom_t* context, FeatureC* features,
    -                            const StateC* state) nogil
    -
    -
    -cdef class Parser:
    -    cdef readonly Vocab vocab
    -    cdef readonly ParserModel model
    -    cdef readonly TransitionSystem moves
    -    cdef readonly object cfg
    -
    -    cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil
    diff --git a/spacy/syntax/parser.pyx b/spacy/syntax/parser.pyx
    deleted file mode 100644
    index 78698db12..000000000
    --- a/spacy/syntax/parser.pyx
    +++ /dev/null
    @@ -1,526 +0,0 @@
    -"""
    -MALT-style dependency parser
    -"""
    -# coding: utf-8
    -# cython: infer_types=True
    -from __future__ import unicode_literals
    -
    -from collections import Counter
    -import ujson
    -
    -cimport cython
    -cimport cython.parallel
    -
    -import numpy.random
    -
    -from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF
    -from cpython.exc cimport PyErr_CheckSignals
    -from libc.stdint cimport uint32_t, uint64_t
    -from libc.string cimport memset, memcpy
    -from libc.stdlib cimport malloc, calloc, free
    -from thinc.typedefs cimport weight_t, class_t, feat_t, atom_t, hash_t
    -from thinc.linear.avgtron cimport AveragedPerceptron
    -from thinc.linalg cimport VecVec
    -from thinc.structs cimport SparseArrayC, FeatureC, ExampleC
    -from thinc.extra.eg cimport Example
    -from cymem.cymem cimport Pool, Address
    -from murmurhash.mrmr cimport hash64
    -from preshed.maps cimport MapStruct
    -from preshed.maps cimport map_get
    -
    -from . import _parse_features
    -from ._parse_features cimport CONTEXT_SIZE
    -from ._parse_features cimport fill_context
    -from .stateclass cimport StateClass
    -from ._state cimport StateC
    -from .transition_system import OracleError
    -from .transition_system cimport TransitionSystem, Transition
    -from ..structs cimport TokenC
    -from ..tokens.doc cimport Doc
    -from ..strings cimport StringStore
    -from ..gold cimport GoldParse
    -
    -
    -USE_FTRL = True
    -DEBUG = False
    -def set_debug(val):
    -    global DEBUG
    -    DEBUG = val
    -
    -
    -def get_templates(name):
    -    pf = _parse_features
    -    if name == 'ner':
    -        return pf.ner
    -    elif name == 'debug':
    -        return pf.unigrams
    -    elif name.startswith('embed'):
    -        return (pf.words, pf.tags, pf.labels)
    -    else:
    -        return (pf.unigrams + pf.s0_n0 + pf.s1_n0 + pf.s1_s0 + pf.s0_n1 + pf.n0_n1 + \
    -                pf.tree_shape + pf.trigrams)
    -
    -
    -cdef class ParserModel(AveragedPerceptron):
    -    cdef int set_featuresC(self, atom_t* context, FeatureC* features,
    -            const StateC* state) nogil:
    -        fill_context(context, state)
    -        nr_feat = self.extracter.set_features(features, context)
    -        return nr_feat
    -
    -    def update(self, Example eg, itn=0):
    -        """
    -        Does regression on negative cost. Sort of cute?
    -        """
    -        self.time += 1
    -        cdef int best = arg_max_if_gold(eg.c.scores, eg.c.costs, eg.c.nr_class)
    -        cdef int guess = eg.guess
    -        if guess == best or best == -1:
    -            return 0.0
    -        cdef FeatureC feat
    -        cdef int clas
    -        cdef weight_t gradient
    -        if USE_FTRL:
    -            for feat in eg.c.features[:eg.c.nr_feat]:
    -                for clas in range(eg.c.nr_class):
    -                    if eg.c.is_valid[clas] and eg.c.scores[clas] >= eg.c.scores[best]:
    -                        gradient = eg.c.scores[clas] + eg.c.costs[clas]
    -                        self.update_weight_ftrl(feat.key, clas, feat.value * gradient)
    -        else:
    -            for feat in eg.c.features[:eg.c.nr_feat]:
    -                self.update_weight(feat.key, guess, feat.value * eg.c.costs[guess])
    -                self.update_weight(feat.key, best, -feat.value * eg.c.costs[guess])
    -        return eg.c.costs[guess]
    -
    -    def update_from_histories(self, TransitionSystem moves, Doc doc, histories, weight_t min_grad=0.0):
    -        cdef Pool mem = Pool()
    -        features = mem.alloc(self.nr_feat, sizeof(FeatureC))
    -
    -        cdef StateClass stcls
    -
    -        cdef class_t clas
    -        self.time += 1
    -        cdef atom_t[CONTEXT_SIZE] atoms
    -        histories = [(grad, hist) for grad, hist in histories if abs(grad) >= min_grad and hist]
    -        if not histories:
    -            return None
    -        gradient = [Counter() for _ in range(max([max(h)+1 for _, h in histories]))]
    -        for d_loss, history in histories:
    -            stcls = StateClass.init(doc.c, doc.length)
    -            moves.initialize_state(stcls.c)
    -            for clas in history:
    -                nr_feat = self.set_featuresC(atoms, features, stcls.c)
    -                clas_grad = gradient[clas]
    -                for feat in features[:nr_feat]:
    -                    clas_grad[feat.key] += d_loss * feat.value
    -                moves.c[clas].do(stcls.c, moves.c[clas].label)
    -        cdef feat_t key
    -        cdef weight_t d_feat
    -        for clas, clas_grad in enumerate(gradient):
    -            for key, d_feat in clas_grad.items():
    -                if d_feat != 0:
    -                    self.update_weight_ftrl(key, clas, d_feat)
    -
    -
    -cdef class Parser:
    -    """
    -    Base class of the DependencyParser and EntityRecognizer.
    -    """
    -    @classmethod
    -    def load(cls, path, Vocab vocab, TransitionSystem=None, require=False, **cfg):
    -        """
    -        Load the statistical model from the supplied path.
    -
    -        Arguments:
    -            path (Path):
    -                The path to load from.
    -            vocab (Vocab):
    -                The vocabulary. Must be shared by the documents to be processed.
    -            require (bool):
    -                Whether to raise an error if the files are not found.
    -        Returns (Parser):
    -            The newly constructed object.
    -        """
    -        with (path / 'config.json').open() as file_:
    -            cfg = ujson.load(file_)
    -        # TODO: remove this shim when we don't have to support older data
    -        if 'labels' in cfg and 'actions' not in cfg:
    -            cfg['actions'] = cfg.pop('labels')
    -        # TODO: remove this shim when we don't have to support older data
    -        for action_name, labels in dict(cfg.get('actions', {})).items():
    -            # We need this to be sorted
    -            if isinstance(labels, dict):
    -                labels = list(sorted(labels.keys()))
    -            cfg['actions'][action_name] = labels
    -        self = cls(vocab, TransitionSystem=TransitionSystem, model=None, **cfg)
    -        if (path / 'model').exists():
    -            self.model.load(str(path / 'model'))
    -        elif require:
    -            raise IOError(
    -                "Required file %s/model not found when loading" % str(path))
    -        return self
    -
    -    def __init__(self, Vocab vocab, TransitionSystem=None, ParserModel model=None, **cfg):
    -        """
    -        Create a Parser.
    -
    -        Arguments:
    -            vocab (Vocab):
    -                The vocabulary object. Must be shared with documents to be processed.
    -            model (thinc.linear.AveragedPerceptron):
    -                The statistical model.
    -        Returns (Parser):
    -            The newly constructed object.
    -        """
    -        if TransitionSystem is None:
    -            TransitionSystem = self.TransitionSystem
    -        self.vocab = vocab
    -        cfg['actions'] = TransitionSystem.get_actions(**cfg)
    -        self.moves = TransitionSystem(vocab.strings, cfg['actions'])
    -        # TODO: Remove this when we no longer need to support old-style models
    -        if isinstance(cfg.get('features'), basestring):
    -            cfg['features'] = get_templates(cfg['features'])
    -        elif 'features' not in cfg:
    -            cfg['features'] = self.feature_templates
    -
    -        self.model = ParserModel(cfg['features'])
    -        self.model.l1_penalty = cfg.get('L1', 0.0)
    -        self.model.learn_rate = cfg.get('learn_rate', 0.001)
    -
    -        self.cfg = cfg
    -        # TODO: This is a pretty hacky fix to the problem of adding more
    -        # labels. The issue is they come in out of order, if labels are
    -        # added during training
    -        for label in cfg.get('extra_labels', []):
    -            self.add_label(label)
    -
    -    def __reduce__(self):
    -        return (Parser, (self.vocab, self.moves, self.model), None, None)
    -
    -    def __call__(self, Doc tokens):
    -        """
    -        Apply the entity recognizer, setting the annotations onto the Doc object.
    -
    -        Arguments:
    -            doc (Doc): The document to be processed.
    -        Returns:
    -            None
    -        """
    -        cdef int nr_feat = self.model.nr_feat
    -        with nogil:
    -            status = self.parseC(tokens.c, tokens.length, nr_feat)
    -        # Check for KeyboardInterrupt etc. Untested
    -        PyErr_CheckSignals()
    -        if status != 0:
    -            raise ParserStateError(tokens)
    -        self.moves.finalize_doc(tokens)
    -
    -    def pipe(self, stream, int batch_size=1000, int n_threads=2):
    -        """
    -        Process a stream of documents.
    -
    -        Arguments:
    -            stream: The sequence of documents to process.
    -            batch_size (int):
    -                The number of documents to accumulate into a working set.
    -            n_threads (int):
    -                The number of threads with which to work on the buffer in parallel.
    -        Yields (Doc): Documents, in order.
    -        """
    -        cdef Pool mem = Pool()
    -        cdef TokenC** doc_ptr = mem.alloc(batch_size, sizeof(TokenC*))
    -        cdef int* lengths = mem.alloc(batch_size, sizeof(int))
    -        cdef Doc doc
    -        cdef int i
    -        cdef int nr_feat = self.model.nr_feat
    -        cdef int status
    -        queue = []
    -        for doc in stream:
    -            doc_ptr[len(queue)] = doc.c
    -            lengths[len(queue)] = doc.length
    -            queue.append(doc)
    -            if len(queue) == batch_size:
    -                with nogil:
    -                    for i in cython.parallel.prange(batch_size, num_threads=n_threads):
    -                        status = self.parseC(doc_ptr[i], lengths[i], nr_feat)
    -                        if status != 0:
    -                            with gil:
    -                                raise ParserStateError(queue[i])
    -                PyErr_CheckSignals()
    -                for doc in queue:
    -                    self.moves.finalize_doc(doc)
    -                    yield doc
    -                queue = []
    -        batch_size = len(queue)
    -        with nogil:
    -            for i in cython.parallel.prange(batch_size, num_threads=n_threads):
    -                status = self.parseC(doc_ptr[i], lengths[i], nr_feat)
    -                if status != 0:
    -                    with gil:
    -                        raise ParserStateError(queue[i])
    -        PyErr_CheckSignals()
    -        for doc in queue:
    -            self.moves.finalize_doc(doc)
    -            yield doc
    -
    -    cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil:
    -        state = new StateC(tokens, length)
    -        # NB: This can change self.moves.n_moves!
    -        # I think this causes memory errors if called by .pipe()
    -        self.moves.initialize_state(state)
    -        nr_class = self.moves.n_moves
    -
    -        cdef ExampleC eg
    -        eg.nr_feat = nr_feat
    -        eg.nr_atom = CONTEXT_SIZE
    -        eg.nr_class = nr_class
    -        eg.features = calloc(sizeof(FeatureC), nr_feat)
    -        eg.atoms = calloc(sizeof(atom_t), CONTEXT_SIZE)
    -        eg.scores = calloc(sizeof(weight_t), nr_class)
    -        eg.is_valid = calloc(sizeof(int), nr_class)
    -        cdef int i
    -        while not state.is_final():
    -            eg.nr_feat = self.model.set_featuresC(eg.atoms, eg.features, state)
    -            self.moves.set_valid(eg.is_valid, state)
    -            self.model.set_scoresC(eg.scores, eg.features, eg.nr_feat)
    -
    -            guess = VecVec.arg_max_if_true(eg.scores, eg.is_valid, eg.nr_class)
    -            if guess < 0:
    -                return 1
    -
    -            action = self.moves.c[guess]
    -
    -            action.do(state, action.label)
    -            memset(eg.scores, 0, sizeof(eg.scores[0]) * eg.nr_class)
    -            for i in range(eg.nr_class):
    -                eg.is_valid[i] = 1
    -        self.moves.finalize_state(state)
    -        for i in range(length):
    -            tokens[i] = state._sent[i]
    -        del state
    -        free(eg.features)
    -        free(eg.atoms)
    -        free(eg.scores)
    -        free(eg.is_valid)
    -        return 0
    -
    -    def update(self, Doc tokens, GoldParse gold, itn=0, double drop=0.0):
    -        """
    -        Update the statistical model.
    -
    -        Arguments:
    -            doc (Doc):
    -                The example document for the update.
    -            gold (GoldParse):
    -                The gold-standard annotations, to calculate the loss.
    -        Returns (float):
    -            The loss on this example.
    -        """
    -        self.moves.preprocess_gold(gold)
    -        cdef StateClass stcls = StateClass.init(tokens.c, tokens.length)
    -        self.moves.initialize_state(stcls.c)
    -        cdef Pool mem = Pool()
    -        cdef Example eg = Example(
    -                nr_class=self.moves.n_moves,
    -                nr_atom=CONTEXT_SIZE,
    -                nr_feat=self.model.nr_feat)
    -        cdef weight_t loss = 0
    -        cdef Transition action
    -        cdef double dropout_rate = self.cfg.get('dropout', drop)
    -        while not stcls.is_final():
    -            eg.c.nr_feat = self.model.set_featuresC(eg.c.atoms, eg.c.features,
    -                                                    stcls.c)
    -            dropout(eg.c.features, eg.c.nr_feat, dropout_rate)
    -            self.moves.set_costs(eg.c.is_valid, eg.c.costs, stcls, gold)
    -            self.model.set_scoresC(eg.c.scores, eg.c.features, eg.c.nr_feat)
    -            guess = VecVec.arg_max_if_true(eg.c.scores, eg.c.is_valid, eg.c.nr_class)
    -            self.model.update(eg)
    -
    -            action = self.moves.c[guess]
    -            action.do(stcls.c, action.label)
    -            loss += eg.costs[guess]
    -            eg.fill_scores(0, eg.c.nr_class)
    -            eg.fill_costs(0, eg.c.nr_class)
    -            eg.fill_is_valid(1, eg.c.nr_class)
    -
    -        self.moves.finalize_state(stcls.c)
    -        return loss
    -
    -    def step_through(self, Doc doc, GoldParse gold=None):
    -        """
    -        Set up a stepwise state, to introspect and control the transition sequence.
    -
    -        Arguments:
    -            doc (Doc): The document to step through.
    -            gold (GoldParse): Optional gold parse
    -        Returns (StepwiseState):
    -            A state object, to step through the annotation process.
    -        """
    -        return StepwiseState(self, doc, gold=gold)
    -
    -    def from_transition_sequence(self, Doc doc, sequence):
    -        """Control the annotations on a document by specifying a transition sequence
    -        to follow.
    -
    -        Arguments:
    -            doc (Doc): The document to annotate.
    -            sequence: A sequence of action names, as unicode strings.
    -        Returns: None
    -        """
    -        with self.step_through(doc) as stepwise:
    -            for transition in sequence:
    -                stepwise.transition(transition)
    -
    -    def add_label(self, label):
    -        # Doesn't set label into serializer -- subclasses override it to do that.
    -        for action in self.moves.action_types:
    -            added = self.moves.add_action(action, label)
    -            if added:
    -                # Important that the labels be stored as a list! We need the
    -                # order, or the model goes out of synch
    -                self.cfg.setdefault('extra_labels', []).append(label)
    -
    -
    -cdef int dropout(FeatureC* feats, int nr_feat, float prob) except -1:
    -    if prob <= 0 or prob >= 1.:
    -        return 0
    -    cdef double[::1] py_probs = numpy.random.uniform(0., 1., nr_feat)
    -    cdef double* probs = &py_probs[0]
    -    for i in range(nr_feat):
    -        if probs[i] >= prob:
    -            feats[i].value /= prob
    -        else:
    -            feats[i].value = 0.
    -
    -
    -cdef class StepwiseState:
    -    cdef readonly StateClass stcls
    -    cdef readonly Example eg
    -    cdef readonly Doc doc
    -    cdef readonly GoldParse gold
    -    cdef readonly Parser parser
    -
    -    def __init__(self, Parser parser, Doc doc, GoldParse gold=None):
    -        self.parser = parser
    -        self.doc = doc
    -        if gold is not None:
    -            self.gold = gold
    -            self.parser.moves.preprocess_gold(self.gold)
    -        else:
    -            self.gold = GoldParse(doc)
    -        self.stcls = StateClass.init(doc.c, doc.length)
    -        self.parser.moves.initialize_state(self.stcls.c)
    -        self.eg = Example(
    -            nr_class=self.parser.moves.n_moves,
    -            nr_atom=CONTEXT_SIZE,
    -            nr_feat=self.parser.model.nr_feat)
    -
    -    def __enter__(self):
    -        return self
    -
    -    def __exit__(self, type, value, traceback):
    -        self.finish()
    -
    -    @property
    -    def is_final(self):
    -        return self.stcls.is_final()
    -
    -    @property
    -    def stack(self):
    -        return self.stcls.stack
    -
    -    @property
    -    def queue(self):
    -        return self.stcls.queue
    -
    -    @property
    -    def heads(self):
    -        return [self.stcls.H(i) for i in range(self.stcls.c.length)]
    -
    -    @property
    -    def deps(self):
    -        return [self.doc.vocab.strings[self.stcls.c._sent[i].dep]
    -                for i in range(self.stcls.c.length)]
    -
    -    @property
    -    def costs(self):
    -        """
    -        Find the action-costs for the current state.
    -        """
    -        if not self.gold:
    -            raise ValueError("Can't set costs: No GoldParse provided")
    -        self.parser.moves.set_costs(self.eg.c.is_valid, self.eg.c.costs,
    -                self.stcls, self.gold)
    -        costs = {}
    -        for i in range(self.parser.moves.n_moves):
    -            if not self.eg.c.is_valid[i]:
    -                continue
    -            transition = self.parser.moves.c[i]
    -            name = self.parser.moves.move_name(transition.move, transition.label)
    -            costs[name] = self.eg.c.costs[i]
    -        return costs
    -
    -    def predict(self):
    -        self.eg.reset()
    -        self.eg.c.nr_feat = self.parser.model.set_featuresC(self.eg.c.atoms, self.eg.c.features,
    -                                                            self.stcls.c)
    -        self.parser.moves.set_valid(self.eg.c.is_valid, self.stcls.c)
    -        self.parser.model.set_scoresC(self.eg.c.scores,
    -            self.eg.c.features, self.eg.c.nr_feat)
    -
    -        cdef Transition action = self.parser.moves.c[self.eg.guess]
    -        return self.parser.moves.move_name(action.move, action.label)
    -
    -    def transition(self, action_name=None):
    -        if action_name is None:
    -            action_name = self.predict()
    -        moves = {'S': 0, 'D': 1, 'L': 2, 'R': 3}
    -        if action_name == '_':
    -            action_name = self.predict()
    -            action = self.parser.moves.lookup_transition(action_name)
    -        elif action_name == 'L' or action_name == 'R':
    -            self.predict()
    -            move = moves[action_name]
    -            clas = _arg_max_clas(self.eg.c.scores, move, self.parser.moves.c,
    -                                 self.eg.c.nr_class)
    -            action = self.parser.moves.c[clas]
    -        else:
    -            action = self.parser.moves.lookup_transition(action_name)
    -        action.do(self.stcls.c, action.label)
    -
    -    def finish(self):
    -        if self.stcls.is_final():
    -            self.parser.moves.finalize_state(self.stcls.c)
    -        self.doc.set_parse(self.stcls.c._sent)
    -        self.parser.moves.finalize_doc(self.doc)
    -
    -
    -class ParserStateError(ValueError):
    -    def __init__(self, doc):
    -        ValueError.__init__(self,
    -            "Error analysing doc -- no valid actions available. This should "
    -            "never happen, so please report the error on the issue tracker. "
    -            "Here's the thread to do so --- reopen it if it's closed:\n"
    -            "https://github.com/spacy-io/spaCy/issues/429\n"
    -            "Please include the text that the parser failed on, which is:\n"
    -            "%s" % repr(doc.text))
    -
    -cdef int arg_max_if_gold(const weight_t* scores, const weight_t* costs, int n) nogil:
    -    cdef int best = -1
    -    for i in range(n):
    -        if costs[i] <= 0:
    -            if best == -1 or scores[i] > scores[best]:
    -                best = i
    -    return best
    -
    -
    -cdef int _arg_max_clas(const weight_t* scores, int move, const Transition* actions,
    -                       int nr_class) except -1:
    -    cdef weight_t score = 0
    -    cdef int mode = -1
    -    cdef int i
    -    for i in range(nr_class):
    -        if actions[i].move == move and (mode == -1 or scores[i] >= score):
    -            mode = i
    -            score = scores[i]
    -    return mode
    
    From 96b4214303a957e4b81c77f8bdc3d14c6f778318 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 12:57:32 +0200
    Subject: [PATCH 515/649] Add notes on pipe template inheritance in docs
    
    ---
     website/api/dependencyparser.jade | 1 +
     website/api/entityrecognizer.jade | 1 +
     website/api/tagger.jade           | 1 +
     website/api/tensorizer.jade       | 1 +
     website/api/textcategorizer.jade  | 1 +
     5 files changed, 5 insertions(+)
    
    diff --git a/website/api/dependencyparser.jade b/website/api/dependencyparser.jade
    index ca56d6816..e557ef9da 100644
    --- a/website/api/dependencyparser.jade
    +++ b/website/api/dependencyparser.jade
    @@ -2,4 +2,5 @@
     
     include ../_includes/_mixins
     
    +//- This class inherits from Pipe, so this page uses the template in pipe.jade.
     !=partial("pipe", { subclass: "DependencyParser", short: "parser", pipeline_id: "parser" })
    diff --git a/website/api/entityrecognizer.jade b/website/api/entityrecognizer.jade
    index aff33bde7..a8b68e453 100644
    --- a/website/api/entityrecognizer.jade
    +++ b/website/api/entityrecognizer.jade
    @@ -2,4 +2,5 @@
     
     include ../_includes/_mixins
     
    +//- This class inherits from Pipe, so this page uses the template in pipe.jade.
     !=partial("pipe", { subclass: "EntityRecognizer", short: "ner", pipeline_id: "ner" })
    diff --git a/website/api/tagger.jade b/website/api/tagger.jade
    index 4c8ce916f..7a7e9214f 100644
    --- a/website/api/tagger.jade
    +++ b/website/api/tagger.jade
    @@ -2,4 +2,5 @@
     
     include ../_includes/_mixins
     
    +//- This class inherits from Pipe, so this page uses the template in pipe.jade.
     !=partial("pipe", { subclass: "Tagger", pipeline_id: "tagger" })
    diff --git a/website/api/tensorizer.jade b/website/api/tensorizer.jade
    index b54e20514..cc79f36e3 100644
    --- a/website/api/tensorizer.jade
    +++ b/website/api/tensorizer.jade
    @@ -2,4 +2,5 @@
     
     include ../_includes/_mixins
     
    +//- This class inherits from Pipe, so this page uses the template in pipe.jade.
     !=partial("pipe", { subclass: "Tensorizer", pipeline_id: "tensorizer" })
    diff --git a/website/api/textcategorizer.jade b/website/api/textcategorizer.jade
    index 2d550f699..a9684b15d 100644
    --- a/website/api/textcategorizer.jade
    +++ b/website/api/textcategorizer.jade
    @@ -16,4 +16,5 @@ p
         |  before a logistic activation is applied elementwise. The value of each
         |  output neuron is the probability that some class is present.
     
    +//- This class inherits from Pipe, so this page uses the template in pipe.jade.
     !=partial("pipe", { subclass: "TextCategorizer", short: "textcat", pipeline_id: "textcat" })
    
    From 9bf78d5fb3a638f4463a21fc7439e9edf1dba04b Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 13:04:25 +0200
    Subject: [PATCH 516/649] Update spacy.explain docs
    
    ---
     spacy/glossary.py                  | 10 ++++++++++
     website/api/_top-level/_spacy.jade |  2 +-
     2 files changed, 11 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/glossary.py b/spacy/glossary.py
    index ed1c22c21..55f337b1a 100644
    --- a/spacy/glossary.py
    +++ b/spacy/glossary.py
    @@ -3,6 +3,16 @@ from __future__ import unicode_literals
     
     
     def explain(term):
    +    """Get a description for a given POS tag, dependency label or entity type.
    +
    +    term (unicode): The term to explain.
    +    RETURNS (unicode): The explanation, or `None` if not found in the glossary.
    +
    +    EXAMPLE:
    +        >>> spacy.explain(u'NORP')
    +        >>> doc = nlp(u'Hello world')
    +        >>> print([w.text, w.tag_, spacy.explain(w.tag_) for w in doc])
    +    """
         if term in GLOSSARY:
             return GLOSSARY[term]
     
    diff --git a/website/api/_top-level/_spacy.jade b/website/api/_top-level/_spacy.jade
    index 81ec744ad..81612c5e6 100644
    --- a/website/api/_top-level/_spacy.jade
    +++ b/website/api/_top-level/_spacy.jade
    @@ -136,7 +136,7 @@ p
         |  #[+src(gh("spacy", "spacy/glossary.py")) #[code glossary.py]].
     
     +aside-code("Example").
    -    spacy.explain('NORP')
    +    spacy.explain(u'NORP')
         # Nationalities or religious or political groups
     
         doc = nlp(u'Hello world')
    
    From 6f78e29bed2d226ebaf316f16fc329c0c07371c3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 13:04:35 +0200
    Subject: [PATCH 517/649] Add LAW entity label to glossary
    
    ---
     spacy/glossary.py | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/glossary.py b/spacy/glossary.py
    index 55f337b1a..fd74d85e7 100644
    --- a/spacy/glossary.py
    +++ b/spacy/glossary.py
    @@ -293,6 +293,7 @@ GLOSSARY = {
         'PRODUCT':      'Objects, vehicles, foods, etc. (not services)',
         'EVENT':        'Named hurricanes, battles, wars, sports events, etc.',
         'WORK_OF_ART':  'Titles of books, songs, etc.',
    +    'LAW':          'Named documents made into laws.',
         'LANGUAGE':     'Any named language',
         'DATE':         'Absolute or relative dates or periods',
         'TIME':         'Times smaller than a day',
    
    From 90d1d9b230522124eaefba5172ac28b5b708a215 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 26 Oct 2017 13:22:45 +0200
    Subject: [PATCH 518/649] Remove obsolete parser code
    
    ---
     setup.py                   | 5 -----
     spacy/language.py          | 1 -
     spacy/syntax/nn_parser.pyx | 3 ---
     3 files changed, 9 deletions(-)
    
    diff --git a/setup.py b/setup.py
    index 2e2b816b7..f7525a3ff 100755
    --- a/setup.py
    +++ b/setup.py
    @@ -30,19 +30,14 @@ MOD_NAMES = [
         'spacy.syntax._state',
         'spacy.syntax._beam_utils',
         'spacy.tokenizer',
    -    'spacy._cfile',
    -    'spacy.syntax.parser',
         'spacy.syntax.nn_parser',
    -    'spacy.syntax.beam_parser',
         'spacy.syntax.nonproj',
         'spacy.syntax.transition_system',
         'spacy.syntax.arc_eager',
    -    'spacy.syntax._parse_features',
         'spacy.gold',
         'spacy.tokens.doc',
         'spacy.tokens.span',
         'spacy.tokens.token',
    -    'spacy.cfile',
         'spacy.matcher',
         'spacy.syntax.ner',
         'spacy.symbols',
    diff --git a/spacy/language.py b/spacy/language.py
    index c4777898e..34bc49263 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -16,7 +16,6 @@ from .tokenizer import Tokenizer
     from .vocab import Vocab
     from .tagger import Tagger
     from .lemmatizer import Lemmatizer
    -from .syntax.parser import get_templates
     
     from .pipeline import DependencyParser, Tensorizer, Tagger
     from .pipeline import EntityRecognizer, SimilarityHook, TextCategorizer
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 913d2365f..c592cdc22 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -54,9 +54,6 @@ from .._ml import link_vectors_to_models
     from .._ml import HistoryFeatures
     from ..compat import json_dumps, copy_array
     
    -from . import _parse_features
    -from ._parse_features cimport CONTEXT_SIZE
    -from ._parse_features cimport fill_context
     from .stateclass cimport StateClass
     from ._state cimport StateC
     from . import nonproj
    
    From ea03f1ef6431791700aa8458d720de94a31cb68b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 26 Oct 2017 13:23:36 +0200
    Subject: [PATCH 519/649] Remove obsolete cfile code
    
    ---
     spacy/_cfile.pxd |  26 ------------
     spacy/_cfile.pyx |  88 ----------------------------------------
     spacy/cfile.pxd  |  33 ---------------
     spacy/cfile.pyx  | 103 -----------------------------------------------
     4 files changed, 250 deletions(-)
     delete mode 100644 spacy/_cfile.pxd
     delete mode 100644 spacy/_cfile.pyx
     delete mode 100644 spacy/cfile.pxd
     delete mode 100644 spacy/cfile.pyx
    
    diff --git a/spacy/_cfile.pxd b/spacy/_cfile.pxd
    deleted file mode 100644
    index cb0077587..000000000
    --- a/spacy/_cfile.pxd
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -from libc.stdio cimport fopen, fclose, fread, fwrite, FILE
    -from cymem.cymem cimport Pool
    -
    -cdef class CFile:
    -    cdef FILE* fp
    -    cdef bint is_open
    -    cdef Pool mem
    -    cdef int size # For compatibility with subclass
    -    cdef int _capacity # For compatibility with subclass
    -
    -    cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1
    -
    -    cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1
    -
    -    cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *
    -
    -
    -
    -cdef class StringCFile(CFile):
    -    cdef unsigned char* data
    - 
    -    cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1
    -
    -    cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1
    -    
    -    cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *
    diff --git a/spacy/_cfile.pyx b/spacy/_cfile.pyx
    deleted file mode 100644
    index ceebe2e59..000000000
    --- a/spacy/_cfile.pyx
    +++ /dev/null
    @@ -1,88 +0,0 @@
    -from libc.stdio cimport fopen, fclose, fread, fwrite, FILE
    -from libc.string cimport memcpy
    -
    -
    -cdef class CFile:
    -    def __init__(self, loc, mode, on_open_error=None):
    -        if isinstance(mode, unicode):
    -            mode_str = mode.encode('ascii')
    -        else:
    -            mode_str = mode
    -        if hasattr(loc, 'as_posix'):
    -            loc = loc.as_posix()
    -        self.mem = Pool()
    -        cdef bytes bytes_loc = loc.encode('utf8') if type(loc) == unicode else loc
    -        self.fp = fopen(bytes_loc, mode_str)
    -        if self.fp == NULL:
    -            if on_open_error is not None:
    -                on_open_error()
    -            else:
    -                raise IOError("Could not open binary file %s" % bytes_loc)
    -        self.is_open = True
    -
    -    def __dealloc__(self):
    -        if self.is_open:
    -            fclose(self.fp)
    -
    -    def close(self):
    -        fclose(self.fp)
    -        self.is_open = False
    -
    -    cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1:
    -        st = fread(dest, elem_size, number, self.fp)
    -        if st != number:
    -            raise IOError
    -
    -    cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1:
    -        st = fwrite(src, elem_size, number, self.fp)
    -        if st != number:
    -            raise IOError
    -
    -    cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *:
    -        cdef void* dest = mem.alloc(number, elem_size)
    -        self.read_into(dest, number, elem_size)
    -        return dest
    -
    -    def write_unicode(self, unicode value):
    -        cdef bytes py_bytes = value.encode('utf8')
    -        cdef char* chars = py_bytes
    -        self.write(sizeof(char), len(py_bytes), chars)
    -
    -
    -cdef class StringCFile:
    -    def __init__(self, mode, bytes data=b'', on_open_error=None):
    -        self.mem = Pool()
    -        self.is_open = 'w' in mode
    -        self._capacity = max(len(data), 8)
    -        self.size = len(data)
    -        self.data = self.mem.alloc(1, self._capacity)
    -        for i in range(len(data)):
    -            self.data[i] = data[i]
    -
    -    def close(self):
    -        self.is_open = False
    -
    -    def string_data(self):
    -        return (self.data-self.size)[:self.size]
    -
    -    cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1:
    -        memcpy(dest, self.data, elem_size * number)
    -        self.data += elem_size * number
    -
    -    cdef int write_from(self, void* src, size_t elem_size, size_t number) except -1:
    -        write_size = number * elem_size
    -        if (self.size + write_size) >= self._capacity:
    -            self._capacity = (self.size + write_size) * 2
    -            self.data = self.mem.realloc(self.data, self._capacity)
    -        memcpy(&self.data[self.size], src, elem_size * number)
    -        self.size += write_size
    -
    -    cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *:
    -        cdef void* dest = mem.alloc(number, elem_size)
    -        self.read_into(dest, number, elem_size)
    -        return dest
    -
    -    def write_unicode(self, unicode value):
    -        cdef bytes py_bytes = value.encode('utf8')
    -        cdef char* chars = py_bytes
    -        self.write(sizeof(char), len(py_bytes), chars)
    diff --git a/spacy/cfile.pxd b/spacy/cfile.pxd
    deleted file mode 100644
    index b95fbb2be..000000000
    --- a/spacy/cfile.pxd
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -from libc.stdio cimport fopen, fclose, fread, fwrite, FILE
    -from cymem.cymem cimport Pool
    -
    -cdef class CFile:
    -    cdef FILE* fp
    -    cdef unsigned char* data
    -    cdef int is_open
    -    cdef Pool mem
    -    cdef int size # For compatibility with subclass
    -    cdef int i # For compatibility with subclass
    -    cdef int _capacity # For compatibility with subclass
    -
    -    cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1
    -
    -    cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1
    -
    -    cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *
    -
    -
    -
    -cdef class StringCFile:
    -    cdef unsigned char* data
    -    cdef int is_open
    -    cdef Pool mem
    -    cdef int size # For compatibility with subclass
    -    cdef int i # For compatibility with subclass
    -    cdef int _capacity # For compatibility with subclass
    - 
    -    cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1
    -
    -    cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1
    -    
    -    cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *
    diff --git a/spacy/cfile.pyx b/spacy/cfile.pyx
    deleted file mode 100644
    index 006ff78ac..000000000
    --- a/spacy/cfile.pyx
    +++ /dev/null
    @@ -1,103 +0,0 @@
    -# coding: utf8
    -from __future__ import unicode_literals
    -
    -from libc.stdio cimport fopen, fclose, fread, fwrite
    -from libc.string cimport memcpy
    -
    -
    -cdef class CFile:
    -    def __init__(self, loc, mode, on_open_error=None):
    -        if isinstance(mode, unicode):
    -            mode_str = mode.encode('ascii')
    -        else:
    -            mode_str = mode
    -        if hasattr(loc, 'as_posix'):
    -            loc = loc.as_posix()
    -        self.mem = Pool()
    -        cdef bytes bytes_loc = loc.encode('utf8') if type(loc) == unicode else loc
    -        self.fp = fopen(bytes_loc, mode_str)
    -        if self.fp == NULL:
    -            if on_open_error is not None:
    -                on_open_error()
    -            else:
    -                raise IOError("Could not open binary file %s" % bytes_loc)
    -        self.is_open = True
    -
    -    def __dealloc__(self):
    -        if self.is_open:
    -            fclose(self.fp)
    -
    -    def close(self):
    -        fclose(self.fp)
    -        self.is_open = False
    -
    -    cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1:
    -        st = fread(dest, elem_size, number, self.fp)
    -        if st != number:
    -            raise IOError
    -
    -    cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1:
    -        st = fwrite(src, elem_size, number, self.fp)
    -        if st != number:
    -            raise IOError
    -
    -    cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *:
    -        cdef void* dest = mem.alloc(number, elem_size)
    -        self.read_into(dest, number, elem_size)
    -        return dest
    -
    -    def write_unicode(self, unicode value):
    -        cdef bytes py_bytes = value.encode('utf8')
    -        cdef char* chars = py_bytes
    -        self.write(sizeof(char), len(py_bytes), chars)
    -
    -
    -cdef class StringCFile:
    -    def __init__(self, bytes data, mode, on_open_error=None):
    -        self.mem = Pool()
    -        self.is_open = 1 if 'w' in mode else 0
    -        self._capacity = max(len(data), 8)
    -        self.size = len(data)
    -        self.i = 0
    -        self.data = self.mem.alloc(1, self._capacity)
    -        for i in range(len(data)):
    -            self.data[i] = data[i]
    -
    -    def __dealloc__(self):
    -        # Important to override this -- or
    -        # we try to close a non-existant file pointer!
    -        pass
    -
    -    def close(self):
    -        self.is_open = False
    -
    -    def string_data(self):
    -        cdef bytes byte_string = b'\0' * (self.size)
    -        bytes_ptr = byte_string
    -        for i in range(self.size):
    -            bytes_ptr[i] = self.data[i]
    -        print(byte_string)
    -        return byte_string
    -
    -    cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1:
    -        if self.i+(number * elem_size) < self.size:
    -            memcpy(dest, &self.data[self.i], elem_size * number)
    -            self.i += elem_size * number
    -
    -    cdef int write_from(self, void* src, size_t elem_size, size_t number) except -1:
    -        write_size = number * elem_size
    -        if (self.size + write_size) >= self._capacity:
    -            self._capacity = (self.size + write_size) * 2
    -            self.data = self.mem.realloc(self.data, self._capacity)
    -        memcpy(&self.data[self.size], src, write_size)
    -        self.size += write_size
    -
    -    cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *:
    -        cdef void* dest = mem.alloc(number, elem_size)
    -        self.read_into(dest, number, elem_size)
    -        return dest
    -
    -    def write_unicode(self, unicode value):
    -        cdef bytes py_bytes = value.encode('utf8')
    -        cdef char* chars = py_bytes
    -        self.write(sizeof(char), len(py_bytes), chars)
    
    From c52671420c7b2554274009faa976a2788dc16d13 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 26 Oct 2017 13:28:19 +0200
    Subject: [PATCH 520/649] Remove old cfile import
    
    ---
     spacy/vocab.pyx | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index bcd1f3c10..193509771 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -16,7 +16,6 @@ from .lexeme cimport EMPTY_LEXEME
     from .lexeme cimport Lexeme
     from .strings cimport hash_string
     from .typedefs cimport attr_t
    -from .cfile cimport CFile
     from .tokens.token cimport Token
     from .attrs cimport PROB, LANG
     from .structs cimport SerializedLexemeC
    
    From c30258c3a2635e21f6e6f3c8ed7cb314a431794e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 14:23:52 +0200
    Subject: [PATCH 521/649] Remove old example
    
    ---
     examples/training/train_ner_standalone.py | 206 ----------------------
     1 file changed, 206 deletions(-)
     delete mode 100644 examples/training/train_ner_standalone.py
    
    diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py
    deleted file mode 100644
    index 0c5094bb7..000000000
    --- a/examples/training/train_ner_standalone.py
    +++ /dev/null
    @@ -1,206 +0,0 @@
    -#!/usr/bin/env python
    -'''Example of training a named entity recognition system from scratch using spaCy
    -
    -This example is written to be self-contained and reasonably transparent.
    -To achieve that, it duplicates some of spaCy's internal functionality.
    -
    -Specifically, in this example, we don't use spaCy's built-in Language class to
    -wire together the Vocab, Tokenizer and EntityRecognizer. Instead, we write
    -our own simple Pipeline class, so that it's easier to see how the pieces
    -interact.
    -
    -Input data:
    -https://www.lt.informatik.tu-darmstadt.de/fileadmin/user_upload/Group_LangTech/data/GermEval2014_complete_data.zip
    -
    -Developed for: spaCy 1.7.1
    -Last tested for: spaCy 2.0.0a13
    -'''
    -from __future__ import unicode_literals, print_function
    -import plac
    -from pathlib import Path
    -import random
    -import json
    -import tqdm
    -
    -from thinc.neural.optimizers import Adam
    -from thinc.neural.ops import NumpyOps
    -
    -from spacy.vocab import Vocab
    -from spacy.pipeline import TokenVectorEncoder, NeuralEntityRecognizer
    -from spacy.tokenizer import Tokenizer
    -from spacy.tokens import Doc
    -from spacy.attrs import *
    -from spacy.gold import GoldParse
    -from spacy.gold import iob_to_biluo
    -from spacy.gold import minibatch
    -from spacy.scorer import Scorer
    -import spacy.util
    -
    -
    -try:
    -    unicode
    -except NameError:
    -    unicode = str
    -
    -
    -spacy.util.set_env_log(True)
    -
    -
    -def init_vocab():
    -    return Vocab(
    -        lex_attr_getters={
    -            LOWER: lambda string: string.lower(),
    -            NORM: lambda string: string.lower(),
    -            PREFIX: lambda string: string[0],
    -            SUFFIX: lambda string: string[-3:],
    -        })
    -
    -
    -class Pipeline(object):
    -    def __init__(self, vocab=None, tokenizer=None, entity=None):
    -        if vocab is None:
    -            vocab = init_vocab()
    -        if tokenizer is None:
    -            tokenizer = Tokenizer(vocab, {}, None, None, None)
    -        if entity is None:
    -            entity = NeuralEntityRecognizer(vocab)
    -        self.vocab = vocab
    -        self.tokenizer = tokenizer
    -        self.entity = entity
    -        self.pipeline = [self.entity]
    -
    -    def begin_training(self):
    -        for model in self.pipeline:
    -            model.begin_training([])
    -        optimizer = Adam(NumpyOps(), 0.001)
    -        return optimizer
    -
    -    def __call__(self, input_):
    -        doc = self.make_doc(input_)
    -        for process in self.pipeline:
    -            process(doc)
    -        return doc
    -
    -    def make_doc(self, input_):
    -        if isinstance(input_, bytes):
    -            input_ = input_.decode('utf8')
    -        if isinstance(input_, unicode):
    -            return self.tokenizer(input_)
    -        else:
    -            return Doc(self.vocab, words=input_)
    -
    -    def make_gold(self, input_, annotations):
    -        doc = self.make_doc(input_)
    -        gold = GoldParse(doc, entities=annotations)
    -        return gold
    -
    -    def update(self, inputs, annots, sgd, losses=None, drop=0.):
    -        if losses is None:
    -            losses = {}
    -        docs = [self.make_doc(input_) for input_ in inputs]
    -        golds = [self.make_gold(input_, annot) for input_, annot in
    -                 zip(inputs, annots)]
    -
    -        self.entity.update(docs, golds, drop=drop,
    -                           sgd=sgd, losses=losses)
    -        return losses
    -
    -    def evaluate(self, examples):
    -        scorer = Scorer()
    -        for input_, annot in examples:
    -            gold = self.make_gold(input_, annot)
    -            doc = self(input_)
    -            scorer.score(doc, gold)
    -        return scorer.scores
    -
    -    def to_disk(self, path):
    -        path = Path(path)
    -        if not path.exists():
    -            path.mkdir()
    -        elif not path.is_dir():
    -            raise IOError("Can't save pipeline to %s\nNot a directory" % path)
    -        self.vocab.to_disk(path / 'vocab')
    -        self.entity.to_disk(path / 'ner')
    -
    -    def from_disk(self, path):
    -        path = Path(path)
    -        if not path.exists():
    -            raise IOError("Cannot load pipeline from %s\nDoes not exist" % path)
    -        if not path.is_dir():
    -            raise IOError("Cannot load pipeline from %s\nNot a directory" % path)
    -        self.vocab = self.vocab.from_disk(path / 'vocab')
    -        self.entity = self.entity.from_disk(path / 'ner')
    -
    -
    -def train(nlp, train_examples, dev_examples, nr_epoch=5):
    -    sgd = nlp.begin_training()
    -    print("Iter", "Loss", "P", "R", "F")
    -    for i in range(nr_epoch):
    -        random.shuffle(train_examples)
    -        losses = {}
    -        for batch in minibatch(tqdm.tqdm(train_examples, leave=False), size=8):
    -            inputs, annots = zip(*batch)
    -            nlp.update(list(inputs), list(annots), sgd, losses=losses)
    -        scores = nlp.evaluate(dev_examples)
    -        report_scores(i+1, losses['ner'], scores)
    -
    -
    -def report_scores(i, loss, scores):
    -    precision = '%.2f' % scores['ents_p']
    -    recall = '%.2f' % scores['ents_r']
    -    f_measure = '%.2f' % scores['ents_f']
    -    print('Epoch %d: %d %s %s %s' % (
    -        i, int(loss), precision, recall, f_measure))
    -
    -
    -def read_examples(path):
    -    path = Path(path)
    -    with path.open() as file_:
    -        sents = file_.read().strip().split('\n\n')
    -        for sent in sents:
    -            sent = sent.strip()
    -            if not sent:
    -                continue
    -            tokens = sent.split('\n')
    -            while tokens and tokens[0].startswith('#'):
    -                tokens.pop(0)
    -            words = []
    -            iob = []
    -            for token in tokens:
    -                if token.strip():
    -                    pieces = token.split('\t')
    -                    words.append(pieces[1])
    -                    iob.append(pieces[2])
    -            yield words, iob_to_biluo(iob)
    -
    -
    -def get_labels(examples):
    -    labels = set()
    -    for words, tags in examples:
    -        for tag in tags:
    -            if '-' in tag:
    -                labels.add(tag.split('-')[1])
    -    return sorted(labels)
    -
    -
    -@plac.annotations(
    -    model_dir=("Path to save the model", "positional", None, Path),
    -    train_loc=("Path to your training data", "positional", None, Path),
    -    dev_loc=("Path to your development data", "positional", None, Path),
    -)
    -def main(model_dir, train_loc, dev_loc, nr_epoch=30):
    -    print(model_dir, train_loc, dev_loc)
    -    train_examples = list(read_examples(train_loc))
    -    dev_examples = read_examples(dev_loc)
    -    nlp = Pipeline()
    -    for label in get_labels(train_examples):
    -        nlp.entity.add_label(label)
    -        print("Add label", label)
    -
    -    train(nlp, train_examples, list(dev_examples), nr_epoch)
    -
    -    nlp.to_disk(model_dir)
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    
    From e904075f35dde853f4f210fb4bb1ceebe781bc55 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 14:24:00 +0200
    Subject: [PATCH 522/649] Remove stray print statements
    
    ---
     examples/training/train_new_entity_type.py | 2 --
     1 file changed, 2 deletions(-)
    
    diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py
    index fc550b1ed..d3bdc4dcf 100644
    --- a/examples/training/train_new_entity_type.py
    +++ b/examples/training/train_new_entity_type.py
    @@ -96,8 +96,6 @@ def main(model=None, new_model_name='animal', output_dir=None):
                     nlp.update(docs, golds, losses=losses, sgd=optimizer,
                                drop=0.35)
                 print(losses)
    -        print(nlp.pipeline)
    -        print(disabled.original_pipeline)
     
         # test the trained model
         test_text = 'Do you like horses?'
    
    From 9d58673aaf84ed04e40f48e1bf7eb1a0c0b20723 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 14:24:12 +0200
    Subject: [PATCH 523/649] Update train_ner example for spaCy v2.0
    
    ---
     examples/training/train_ner.py | 138 ++++++++++++++++++++++-----------
     1 file changed, 93 insertions(+), 45 deletions(-)
    
    diff --git a/examples/training/train_ner.py b/examples/training/train_ner.py
    index e9ae013d3..5a3e23244 100644
    --- a/examples/training/train_ner.py
    +++ b/examples/training/train_ner.py
    @@ -1,13 +1,104 @@
    +#!/usr/bin/env python
    +# coding: utf8
    +"""
    +Example of training spaCy's named entity recognizer, starting off with an
    +existing model or a blank model.
    +
    +For more details, see the documentation:
    +* Training: https://alpha.spacy.io/usage/training
    +* NER: https://alpha.spacy.io/usage/linguistic-features#named-entities
    +
    +Developed for: spaCy 2.0.0a18
    +Last updated for: spaCy 2.0.0a18
    +"""
     from __future__ import unicode_literals, print_function
     
     import random
    +from pathlib import Path
     
    -from spacy.lang.en import English
    +import spacy
     from spacy.gold import GoldParse, biluo_tags_from_offsets
     
     
    +# training data
    +TRAIN_DATA = [
    +    ('Who is Shaka Khan?', [(7, 17, 'PERSON')]),
    +    ('I like London and Berlin.', [(7, 13, 'LOC'), (18, 24, 'LOC')])
    +]
    +
    +
    +def main(model=None, output_dir=None, n_iter=100):
    +    """Load the model, set up the pipeline and train the entity recognizer.
    +
    +    model (unicode): Model name to start off with. If None, a blank English
    +        Language class is created.
    +    output_dir (unicode / Path): Optional output directory. If None, no model
    +        will be saved.
    +    n_iter (int): Number of iterations during training.
    +    """
    +    if model is not None:
    +        nlp = spacy.load(model)  # load existing spaCy model
    +        print("Loaded model '%s'" % model)
    +    else:
    +        nlp = spacy.blank('en')  # create blank Language class
    +        print("Created blank 'en' model")
    +
    +    # create the built-in pipeline components and add them to the pipeline
    +    # ner.create_pipe works for built-ins that are registered with spaCy!
    +    if 'ner' not in nlp.pipe_names:
    +        ner = nlp.create_pipe('ner')
    +        nlp.add_pipe(ner, last=True)
    +
    +    # function that allows begin_training to get the training data
    +    get_data = lambda: reformat_train_data(nlp.tokenizer, TRAIN_DATA)
    +
    +    # get names of other pipes to disable them during training
    +    other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
    +    with nlp.disable_pipes(*other_pipes) as disabled:  # only train NER
    +        optimizer = nlp.begin_training(get_data)
    +        for itn in range(n_iter):
    +            random.shuffle(TRAIN_DATA)
    +            losses = {}
    +            for raw_text, entity_offsets in TRAIN_DATA:
    +                doc = nlp.make_doc(raw_text)
    +                gold = GoldParse(doc, entities=entity_offsets)
    +                nlp.update(
    +                    [doc], # Batch of Doc objects
    +                    [gold], # Batch of GoldParse objects
    +                    drop=0.5, # Dropout -- make it harder to memorise data
    +                    sgd=optimizer, # Callable to update weights
    +                    losses=losses)
    +            print(losses)
    +
    +    # test the trained model
    +    for text, _ in TRAIN_DATA:
    +        doc = nlp(text)
    +        print('Entities', [(ent.text, ent.label_) for ent in doc.ents])
    +        print('Tokens', [(t.text, t.ent_type_, t.ent_iob) for t in doc])
    +
    +    # save model to output directory
    +    if output_dir is not None:
    +        output_dir = Path(output_dir)
    +        if not output_dir.exists():
    +            output_dir.mkdir()
    +        nlp.to_disk(output_dir)
    +        print("Saved model to", output_dir)
    +
    +        # test the saved model
    +        print("Loading from", output_dir)
    +        for text, _ in TRAIN_DATA:
    +            doc = nlp(text)
    +            print('Entities', [(ent.text, ent.label_) for ent in doc.ents])
    +            print('Tokens', [(t.text, t.ent_type_, t.ent_iob) for t in doc])
    +
    +
     def reformat_train_data(tokenizer, examples):
    -    """Reformat data to match JSON format"""
    +    """Reformat data to match JSON format.
    +    https://alpha.spacy.io/api/annotation#json-input
    +
    +    tokenizer (Tokenizer): Tokenizer to process the raw text.
    +    examples (list): The trainig data.
    +    RETURNS (list): The reformatted training data."""
         output = []
         for i, (text, entity_offsets) in enumerate(examples):
             doc = tokenizer(text)
    @@ -21,49 +112,6 @@ def reformat_train_data(tokenizer, examples):
         return output
     
     
    -def main(model_dir=None):
    -    train_data = [
    -        (
    -            'Who is Shaka Khan?',
    -            [(len('Who is '), len('Who is Shaka Khan'), 'PERSON')]
    -        ),
    -        (
    -            'I like London and Berlin.',
    -            [(len('I like '), len('I like London'), 'LOC'),
    -            (len('I like London and '), len('I like London and Berlin'), 'LOC')]
    -        )
    -    ]
    -    nlp = English(pipeline=['tensorizer', 'ner'])
    -    get_data = lambda: reformat_train_data(nlp.tokenizer, train_data)
    -    optimizer = nlp.begin_training(get_data)
    -    for itn in range(100):
    -        random.shuffle(train_data)
    -        losses = {}
    -        for raw_text, entity_offsets in train_data:
    -            doc = nlp.make_doc(raw_text)
    -            gold = GoldParse(doc, entities=entity_offsets)
    -            nlp.update(
    -                [doc], # Batch of Doc objects
    -                [gold], # Batch of GoldParse objects
    -                drop=0.5, # Dropout -- make it harder to memorise data
    -                sgd=optimizer, # Callable to update weights
    -                losses=losses)
    -        print(losses)
    -    print("Save to", model_dir)
    -    nlp.to_disk(model_dir)
    -    print("Load from", model_dir)
    -    nlp = spacy.lang.en.English(pipeline=['tensorizer', 'ner'])
    -    nlp.from_disk(model_dir)
    -    for raw_text, _ in train_data:
    -        doc = nlp(raw_text)
    -        for word in doc:
    -            print(word.text, word.ent_type_, word.ent_iob_)
    -
     if __name__ == '__main__':
         import plac
         plac.call(main)
    -    # Who "" 2
    -    # is "" 2
    -    # Shaka "" PERSON 3
    -    # Khan "" PERSON 1
    -    # ? "" 2
    
    From 8116d1a077cba9d32d3e4da21dcb6bd6c5356d70 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 14:44:32 +0200
    Subject: [PATCH 524/649] Add note on biluo_tags_from_offsets helper
    
    ---
     website/api/_annotation/_training.jade | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/website/api/_annotation/_training.jade b/website/api/_annotation/_training.jade
    index 3b11eb2f5..d05bfa825 100644
    --- a/website/api/_annotation/_training.jade
    +++ b/website/api/_annotation/_training.jade
    @@ -13,7 +13,9 @@ p
         |  that are part of an entity are set to the entity label, prefixed by the
         |  BILUO marker. For example #[code "B-ORG"] describes the first token of
         |  a multi-token #[code ORG] entity and #[code "U-PERSON"] a single
    -    |  token representing a #[code PERSON] entity
    +    |  token representing a #[code PERSON] entity. The
    +    |  #[+api("goldparse#biluo_tags_from_offsets") #[code biluo_tags_from_offsets]]
    +    |  function can help you convert entity offsets to the right format.
     
     +code("Example structure").
         [{
    
    From 281f88a59c309f66f5b2a55c41a1418c3050142f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 14:44:43 +0200
    Subject: [PATCH 525/649] Update NER training examples
    
    ---
     website/usage/_training/_ner.jade | 92 ++++++++++++++++++++++---------
     website/usage/examples.jade       | 18 +++---
     2 files changed, 74 insertions(+), 36 deletions(-)
    
    diff --git a/website/usage/_training/_ner.jade b/website/usage/_training/_ner.jade
    index ed58c4c6f..12f92dbce 100644
    --- a/website/usage/_training/_ner.jade
    +++ b/website/usage/_training/_ner.jade
    @@ -24,6 +24,58 @@ p
         |  #[strong experiment on your own data] to find a solution that works best
         |  for you.
     
    ++h(3, "example-train-ner") Updating the Named Entity Recognizer
    +
    +p
    +    |  This example shows how to update spaCy's entity recognizer
    +    |  with your own examples, starting off with an existing, pre-trained
    +    |  model, or from scratch using a blank #[code Language] class. To do
    +    |  this, you'll need #[strong example texts] and the
    +    |  #[strong character offsets] and #[strong labels] of each entity contained
    +    |  in the texts.
    +
    +    +github("spacy", "examples/training/train_ner.py")
    +
    ++h(4) Step by step guide
    +
    ++list("numbers")
    +    +item
    +        |  #[strong Reformat the training data] to match spaCy's
    +        |  #[+a("/api/annotation#json-input") JSON format]. The built-in
    +        |  #[+api("goldparse#biluo_tags_from_offsets") #[code biluo_tags_from_offsets]]
    +        |  function can help you with this.
    +
    +    +item
    +        |  #[strong Load the model] you want to start with, or create an
    +        |  #[strong empty model] using
    +        |  #[+api("spacy#blank") #[code spacy.blank]] with the ID of your
    +        |  language. If you're using a blank model, don't forget to add the
    +        |  entity recognizer to the pipeline. If you're using an existing model,
    +        |  make sure to disable all other pipeline components during training
    +        |  using #[+api("language#disable_pipes") #[code nlp.disable_pipes]].
    +        |  This way, you'll only be training the entity recognizer.
    +
    +    +item
    +        |  #[strong Shuffle and loop over] the examples and create a
    +        |  #[code Doc] and #[code GoldParse] object for each example.
    +
    +    +item
    +        |  For each example, #[strong update the model]
    +        |  by calling #[+api("language#update") #[code nlp.update]], which steps
    +        |  through the words of the input. At each word, it makes a
    +        |  #[strong prediction]. It then consults the annotations provided on the
    +        |  #[code GoldParse] instance, to see whether it was
    +        |  right. If it was wrong, it adjusts its weights so that the correct
    +        |  action will score higher next time.
    +
    +    +item
    +        |  #[strong Save] the trained model using
    +        |  #[+api("language#to_disk") #[code nlp.to_disk]].
    +
    +    +item
    +        |  #[strong Test] the model to make sure the entities in the training
    +        |  data are recognised correctly.
    +
     +h(3, "example-new-entity-type") Training an additional entity type
     
     p
    @@ -38,22 +90,22 @@ p
     
     +github("spacy", "examples/training/train_new_entity_type.py")
     
    -p Training a new entity type requires the following steps:
    ++h(4) Step by step guide
     
     +list("numbers")
         +item
    -        |  Create #[+api("doc") #[code Doc]] and
    -        |  #[+api("goldparse") #[code GoldParse]] objects for
    +        |  Create #[code Doc] and #[code GoldParse] objects for
             |  #[strong each example in your training data].
     
         +item
             |  #[strong Load the model] you want to start with, or create an
             |  #[strong empty model] using
    -        |  #[+api("spacy#blank") #[code spacy.blank()]] with the ID of your
    -        |  language. If you're using an existing model, make sure to disable
    -        |  all other pipeline components during training using
    -        |  #[+api("language#disable_pipes") #[code nlp.disable_pipes]]. This way,
    -        |  you'll only be training the entity recognizer.
    +        |  #[+api("spacy#blank") #[code spacy.blank]] with the ID of your
    +        |  language. If you're using a blank model, don't forget to add the
    +        |  entity recognizer to the pipeline. If you're using an existing model,
    +        |  make sure to disable all other pipeline components during training
    +        |  using #[+api("language#disable_pipes") #[code nlp.disable_pipes]].
    +        |  This way, you'll only be training the entity recognizer.
     
         +item
             |  #[strong Add the new entity label] to the entity recognizer using the
    @@ -66,28 +118,14 @@ p Training a new entity type requires the following steps:
             |  #[+api("language#update") #[code nlp.update]], which steps through
             |  the words of the input. At each word, it makes a
             |  #[strong prediction]. It then consults the annotations provided on the
    -        |  #[+api("goldparse") #[code GoldParse]] instance, to see whether it was
    -        |  right. If it was wrong, it adjusts its weights so that the correct
    -        |  action will score higher next time.
    +        |  #[code GoldParse] instance, to see whether it was right. If it was
    +        |  wrong, it adjusts its weights so that the correct action will score
    +        |  higher next time.
     
         +item
             |  #[strong Save] the trained model using
    -        |  #[+api("language#to_disk") #[code nlp.to_disk()]].
    +        |  #[+api("language#to_disk") #[code nlp.to_disk]].
     
         +item
    -        |  #[strong Test] the model to make sure the new entity is recognized
    +        |  #[strong Test] the model to make sure the new entity is recognised
             |  correctly.
    -
    -+h(3, "example-ner-from-scratch") Example: Training an NER system from scratch
    -
    -p
    -    |  This example is written to be self-contained and reasonably transparent.
    -    |  To achieve that, it duplicates some of spaCy's internal functionality.
    -    |  Specifically, in this example, we don't use spaCy's built-in
    -    |  #[+api("language") #[code Language]] class to wire together the
    -    |  #[+api("vocab") #[code Vocab]], #[+api("tokenizer") #[code Tokenizer]]
    -    |  and #[+api("entityrecognizer") #[code EntityRecognizer]]. Instead, we
    -    |  write our own simle #[code Pipeline] class, so that it's easier to see
    -    |  how the pieces interact.
    -
    -+github("spacy", "examples/training/train_ner_standalone.py")
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 5dfeaf2a7..914ecafde 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -61,6 +61,15 @@ include ../_includes/_mixins
         +github("spacy", "examples/phrase_matcher.py")
     
     +section("training")
    +    +h(3, "training-ner") Training spaCy's Named Entity Recognizer
    +
    +    p
    +        |  This example shows how to update spaCy's entity recognizer
    +        |  with your own examples, starting off with an existing, pre-trained
    +        |  model, or from scratch using a blank #[code Language] class.
    +
    +    +github("spacy", "examples/training/train_ner.py")
    +
         +h(3, "new-entity-type") Training an additional entity type
     
         p
    @@ -71,15 +80,6 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/training/train_new_entity_type.py")
     
    -    +h(3, "ner-standalone") Training an NER system from scratch
    -
    -    p
    -        |  This example is written to be self-contained and reasonably
    -        |  transparent. To achieve that, it duplicates some of spaCy's internal
    -        |  functionality.
    -
    -    +github("spacy", "examples/training/train_ner_standalone.py")
    -
         +h(3, "textcat") Training spaCy's text classifier
             +tag-new(2)
     
    
    From d425ede7e9e44e7fc003faf29524698a0531a1ff Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 15:15:08 +0200
    Subject: [PATCH 526/649] Fix example
    
    ---
     examples/training/train_ner.py | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/examples/training/train_ner.py b/examples/training/train_ner.py
    index 5a3e23244..9427f452e 100644
    --- a/examples/training/train_ner.py
    +++ b/examples/training/train_ner.py
    @@ -44,7 +44,7 @@ def main(model=None, output_dir=None, n_iter=100):
             print("Created blank 'en' model")
     
         # create the built-in pipeline components and add them to the pipeline
    -    # ner.create_pipe works for built-ins that are registered with spaCy!
    +    # nlp.create_pipe works for built-ins that are registered with spaCy
         if 'ner' not in nlp.pipe_names:
             ner = nlp.create_pipe('ner')
             nlp.add_pipe(ner, last=True)
    @@ -86,8 +86,9 @@ def main(model=None, output_dir=None, n_iter=100):
     
             # test the saved model
             print("Loading from", output_dir)
    +        nlp2 = spacy.load(output_dir)
             for text, _ in TRAIN_DATA:
    -            doc = nlp(text)
    +            doc = nlp2(text)
                 print('Entities', [(ent.text, ent.label_) for ent in doc.ents])
                 print('Tokens', [(t.text, t.ent_type_, t.ent_iob) for t in doc])
     
    
    From 586b9047fd1d2fcc750f2d9930b28a1ee0e25fff Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 15:15:26 +0200
    Subject: [PATCH 527/649] Use create_pipe instead of importing the entity
     recognizer
    
    ---
     examples/training/train_new_entity_type.py | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py
    index d3bdc4dcf..ea6c08763 100644
    --- a/examples/training/train_new_entity_type.py
    +++ b/examples/training/train_new_entity_type.py
    @@ -34,7 +34,6 @@ from pathlib import Path
     
     import spacy
     from spacy.gold import GoldParse, minibatch
    -from spacy.pipeline import NeuralEntityRecognizer
     
     
     # new entity label
    @@ -77,10 +76,14 @@ def main(model=None, new_model_name='animal', output_dir=None):
             print("Created blank 'en' model")
     
         # Add entity recognizer to model if it's not in the pipeline
    +    # nlp.create_pipe works for built-ins that are registered with spaCy
         if 'ner' not in nlp.pipe_names:
    -        nlp.add_pipe(NeuralEntityRecognizer(nlp.vocab))
    +        ner = nlp.create_pipe('ner')
    +        nlp.add_pipe(ner)
    +    # otherwise, get it, so we can add labels to it
    +    else:
    +        ner = nlp.get_pipe('ner')
     
    -    ner = nlp.get_pipe('ner')  # get entity recognizer
         ner.add_label(LABEL)   # add new entity label to entity recognizer
     
         # get names of other pipes to disable them during training
    
    From b5c74dbb34f035b71732e8bc37f0a43c859459ae Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 15:15:37 +0200
    Subject: [PATCH 528/649] Update parser training example
    
    ---
     examples/training/train_parser.py | 153 +++++++++++++++++++-----------
     1 file changed, 95 insertions(+), 58 deletions(-)
    
    diff --git a/examples/training/train_parser.py b/examples/training/train_parser.py
    index 8c3119704..d2c15c4c2 100644
    --- a/examples/training/train_parser.py
    +++ b/examples/training/train_parser.py
    @@ -1,75 +1,112 @@
    +#!/usr/bin/env python
    +# coding: utf8
    +"""
    +Example of training spaCy dependency parser, starting off with an existing model
    +or a blank model.
    +
    +For more details, see the documentation:
    +* Training: https://alpha.spacy.io/usage/training
    +* Dependency Parse: https://alpha.spacy.io/usage/linguistic-features#dependency-parse
    +
    +Developed for: spaCy 2.0.0a18
    +Last updated for: spaCy 2.0.0a18
    +"""
     from __future__ import unicode_literals, print_function
    -import json
    -import pathlib
    +
     import random
    +from pathlib import Path
     
     import spacy
    -from spacy.pipeline import DependencyParser
     from spacy.gold import GoldParse
     from spacy.tokens import Doc
     
     
    -def train_parser(nlp, train_data, left_labels, right_labels):
    -    parser = DependencyParser(
    -                nlp.vocab,
    -                left_labels=left_labels,
    -                right_labels=right_labels)
    -    for itn in range(1000):
    -        random.shuffle(train_data)
    -        loss = 0
    -        for words, heads, deps in train_data:
    -            doc = Doc(nlp.vocab, words=words)
    -            gold = GoldParse(doc, heads=heads, deps=deps)
    -            loss += parser.update(doc, gold)
    -    parser.model.end_training()
    -    return parser
    +# training data
    +TRAIN_DATA = [
    +    (
    +        ['They', 'trade',  'mortgage', '-', 'backed', 'securities', '.'],
    +        [1, 1, 4, 4, 5, 1, 1],
    +        ['nsubj', 'ROOT', 'compound', 'punct', 'nmod', 'dobj', 'punct']
    +    ),
    +    (
    +        ['I', 'like', 'London', 'and', 'Berlin', '.'],
    +        [1, 1, 1, 2, 2, 1],
    +        ['nsubj', 'ROOT', 'dobj', 'cc', 'conj', 'punct']
    +    )
    +]
     
     
    -def main(model_dir=None):
    -    if model_dir is not None:
    -        model_dir = pathlib.Path(model_dir)
    -        if not model_dir.exists():
    -            model_dir.mkdir()
    -        assert model_dir.is_dir()
    +def main(model=None, output_dir=None, n_iter=1000):
    +    """Load the model, set up the pipeline and train the parser.
     
    -    nlp = spacy.load('en', tagger=False, parser=False, entity=False, add_vectors=False)
    +    model (unicode): Model name to start off with. If None, a blank English
    +        Language class is created.
    +    output_dir (unicode / Path): Optional output directory. If None, no model
    +        will be saved.
    +    n_iter (int): Number of iterations during training.
    +    """
    +    if model is not None:
    +        nlp = spacy.load(model)  # load existing spaCy model
    +        print("Loaded model '%s'" % model)
    +    else:
    +        nlp = spacy.blank('en')  # create blank Language class
    +        print("Created blank 'en' model")
     
    -    train_data = [
    -        (
    -            ['They', 'trade',  'mortgage', '-', 'backed', 'securities', '.'],
    -            [1, 1, 4, 4, 5, 1, 1],
    -            ['nsubj', 'ROOT', 'compound', 'punct', 'nmod', 'dobj', 'punct']
    -        ),
    -        (
    -            ['I', 'like', 'London', 'and', 'Berlin', '.'],
    -            [1, 1, 1, 2, 2, 1],
    -            ['nsubj', 'ROOT', 'dobj', 'cc', 'conj', 'punct']
    -        )
    -    ]
    -    left_labels = set()
    -    right_labels = set()
    -    for _, heads, deps in train_data:
    -        for i, (head, dep) in enumerate(zip(heads, deps)):
    -            if i < head:
    -                left_labels.add(dep)
    -            elif i > head:
    -                right_labels.add(dep)
    -    parser = train_parser(nlp, train_data, sorted(left_labels), sorted(right_labels))
    +    # add the parser to the pipeline if it doesn't exist
    +    # nlp.create_pipe works for built-ins that are registered with spaCy
    +    if 'parser' not in nlp.pipe_names:
    +        parser = nlp.create_pipe('parser')
    +        nlp.add_pipe(parser, first=True)
    +    # otherwise, get it, so we can add labels to it
    +    else:
    +        parser = nlp.get_pipe('parser')
     
    -    doc = Doc(nlp.vocab, words=['I', 'like', 'securities', '.'])
    -    parser(doc)
    -    for word in doc:
    -        print(word.text, word.dep_, word.head.text)
    +    # add labels to the parser
    +    for _, heads, deps in TRAIN_DATA:
    +        for dep in deps:
    +            parser.add_label(dep)
     
    -    if model_dir is not None:
    -        with (model_dir / 'config.json').open('w') as file_:
    -            json.dump(parser.cfg, file_)
    -        parser.model.dump(str(model_dir / 'model'))
    +    # get names of other pipes to disable them during training
    +    other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'parser']
    +    with nlp.disable_pipes(*other_pipes) as disabled:  # only train parser
    +        optimizer = nlp.begin_training(lambda: [])
    +        for itn in range(n_iter):
    +            random.shuffle(TRAIN_DATA)
    +            losses = {}
    +            for words, heads, deps in TRAIN_DATA:
    +                doc = Doc(nlp.vocab, words=words)
    +                gold = GoldParse(doc, heads=heads, deps=deps)
    +                nlp.update([doc], [gold], sgd=optimizer, losses=losses)
    +            print(losses)
    +
    +    # test the trained model
    +    test_text = "I like securities."
    +    doc = nlp(test_text)
    +    print('Dependencies', [(t.text, t.dep_, t.head.text) for t in doc])
    +
    +    # save model to output directory
    +    if output_dir is not None:
    +        output_dir = Path(output_dir)
    +        if not output_dir.exists():
    +            output_dir.mkdir()
    +        nlp.to_disk(output_dir)
    +        print("Saved model to", output_dir)
    +
    +        # test the save model
    +        print("Loading from", output_dir)
    +        nlp2 = spacy.load(output_dir)
    +        doc = nlp2(test_text)
    +        print('Dependencies', [(t.text, t.dep_, t.head.text) for t in doc])
     
     
     if __name__ == '__main__':
    -    main()
    -    # I nsubj like
    -    # like ROOT like
    -    # securities dobj like
    -    # . cc securities
    +    import plac
    +    plac.call(main)
    +
    +    # expected result:
    +    # [
    +    #   ('I', 'nsubj', 'like'),
    +    #   ('like', 'ROOT', 'like'),
    +    #   ('securities', 'dobj', 'like'),
    +    #   ('.', 'punct', 'like')
    +    # ]
    
    From bc2c92f22dc7d4d92673b615f0fea75e18b0496e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:10:56 +0200
    Subject: [PATCH 529/649] Use plac annotations for arguments
    
    ---
     examples/training/train_ner.py | 15 ++++++---------
     1 file changed, 6 insertions(+), 9 deletions(-)
    
    diff --git a/examples/training/train_ner.py b/examples/training/train_ner.py
    index 9427f452e..2e8241ffc 100644
    --- a/examples/training/train_ner.py
    +++ b/examples/training/train_ner.py
    @@ -13,6 +13,7 @@ Last updated for: spaCy 2.0.0a18
     """
     from __future__ import unicode_literals, print_function
     
    +import plac
     import random
     from pathlib import Path
     
    @@ -27,15 +28,12 @@ TRAIN_DATA = [
     ]
     
     
    +@plac.annotations(
    +    model=("Model name. Defaults to blank 'en' model.", "option", "m", str),
    +    output_dir=("Optional output directory", "option", "o", Path),
    +    n_iter=("Number of training iterations", "option", "n", int))
     def main(model=None, output_dir=None, n_iter=100):
    -    """Load the model, set up the pipeline and train the entity recognizer.
    -
    -    model (unicode): Model name to start off with. If None, a blank English
    -        Language class is created.
    -    output_dir (unicode / Path): Optional output directory. If None, no model
    -        will be saved.
    -    n_iter (int): Number of iterations during training.
    -    """
    +    """Load the model, set up the pipeline and train the entity recognizer."""
         if model is not None:
             nlp = spacy.load(model)  # load existing spaCy model
             print("Loaded model '%s'" % model)
    @@ -114,5 +112,4 @@ def reformat_train_data(tokenizer, examples):
     
     
     if __name__ == '__main__':
    -    import plac
         plac.call(main)
    
    From c3b681e5fbe157ea70167da1e67c740e8339af6f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:11:05 +0200
    Subject: [PATCH 530/649] Use plac annotations for arguments and add n_iter
    
    ---
     examples/training/train_new_entity_type.py | 21 +++++++++------------
     1 file changed, 9 insertions(+), 12 deletions(-)
    
    diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py
    index ea6c08763..69ee20e04 100644
    --- a/examples/training/train_new_entity_type.py
    +++ b/examples/training/train_new_entity_type.py
    @@ -29,6 +29,7 @@ Last updated for: spaCy 2.0.0a18
     """
     from __future__ import unicode_literals, print_function
     
    +import plac
     import random
     from pathlib import Path
     
    @@ -58,16 +59,13 @@ TRAIN_DATA = [
     ]
     
     
    -def main(model=None, new_model_name='animal', output_dir=None):
    -    """Set up the pipeline and entity recognizer, and train the new entity.
    -
    -    model (unicode): Model name to start off with. If None, a blank English
    -        Language class is created.
    -    new_model_name (unicode): Name of new model to create. Will be added to the
    -        model meta and prefixed by the language code, e.g. 'en_animal'.
    -    output_dir (unicode / Path): Optional output directory. If None, no model
    -        will be saved.
    -    """
    +@plac.annotations(
    +    model=("Model name. Defaults to blank 'en' model.", "option", "m", str),
    +    new_model_name=("New model name for model meta.", "option", "nm", str),
    +    output_dir=("Optional output directory", "option", "o", Path),
    +    n_iter=("Number of training iterations", "option", "n", int))
    +def main(model=None, new_model_name='animal', output_dir=None, n_iter=50):
    +    """Set up the pipeline and entity recognizer, and train the new entity."""
         if model is not None:
             nlp = spacy.load(model)  # load existing spaCy model
             print("Loaded model '%s'" % model)
    @@ -91,7 +89,7 @@ def main(model=None, new_model_name='animal', output_dir=None):
         with nlp.disable_pipes(*other_pipes) as disabled:  # only train NER
             random.seed(0)
             optimizer = nlp.begin_training(lambda: [])
    -        for itn in range(50):
    +        for itn in range(n_iter):
                 losses = {}
                 gold_parses = get_gold_parses(nlp.make_doc, TRAIN_DATA)
                 for batch in minibatch(gold_parses, size=3):
    @@ -139,5 +137,4 @@ def get_gold_parses(tokenizer, train_data):
     
     
     if __name__ == '__main__':
    -    import plac
         plac.call(main)
    
    From 4d896171ae43a4faba1b3c5cf480e641beb84cf3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:11:20 +0200
    Subject: [PATCH 531/649] Use plac annotations for arguments
    
    ---
     examples/training/train_parser.py | 15 ++++++---------
     1 file changed, 6 insertions(+), 9 deletions(-)
    
    diff --git a/examples/training/train_parser.py b/examples/training/train_parser.py
    index d2c15c4c2..ad39ab7c3 100644
    --- a/examples/training/train_parser.py
    +++ b/examples/training/train_parser.py
    @@ -13,6 +13,7 @@ Last updated for: spaCy 2.0.0a18
     """
     from __future__ import unicode_literals, print_function
     
    +import plac
     import random
     from pathlib import Path
     
    @@ -36,15 +37,12 @@ TRAIN_DATA = [
     ]
     
     
    +@plac.annotations(
    +    model=("Model name. Defaults to blank 'en' model.", "option", "m", str),
    +    output_dir=("Optional output directory", "option", "o", Path),
    +    n_iter=("Number of training iterations", "option", "n", int))
     def main(model=None, output_dir=None, n_iter=1000):
    -    """Load the model, set up the pipeline and train the parser.
    -
    -    model (unicode): Model name to start off with. If None, a blank English
    -        Language class is created.
    -    output_dir (unicode / Path): Optional output directory. If None, no model
    -        will be saved.
    -    n_iter (int): Number of iterations during training.
    -    """
    +    """Load the model, set up the pipeline and train the parser."""
         if model is not None:
             nlp = spacy.load(model)  # load existing spaCy model
             print("Loaded model '%s'" % model)
    @@ -100,7 +98,6 @@ def main(model=None, output_dir=None, n_iter=1000):
     
     
     if __name__ == '__main__':
    -    import plac
         plac.call(main)
     
         # expected result:
    
    From 421c3837e83c2322a2addb52cf8d293af18b54ad Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:11:25 +0200
    Subject: [PATCH 532/649] Fix formatting
    
    ---
     examples/training/train_parser.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/examples/training/train_parser.py b/examples/training/train_parser.py
    index ad39ab7c3..8cd602bcd 100644
    --- a/examples/training/train_parser.py
    +++ b/examples/training/train_parser.py
    @@ -60,7 +60,7 @@ def main(model=None, output_dir=None, n_iter=1000):
             parser = nlp.get_pipe('parser')
     
         # add labels to the parser
    -    for _, heads, deps in TRAIN_DATA:
    +    for _, _, deps in TRAIN_DATA:
             for dep in deps:
                 parser.add_label(dep)
     
    
    From 9e372913e046f81ca3da4b5d6b4f92c6b5e6346e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:11:57 +0200
    Subject: [PATCH 533/649] Remove old 'SP' condition in tag map
    
    ---
     spacy/pipeline.pyx | 2 --
     1 file changed, 2 deletions(-)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 7c1976dfa..14ebe0301 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -420,8 +420,6 @@ class NeuralTagger(BaseThincComponent):
                             new_tag_map[tag] = orig_tag_map[tag]
                         else:
                             new_tag_map[tag] = {POS: X}
    -        if 'SP' not in new_tag_map:
    -            new_tag_map['SP'] = orig_tag_map.get('SP', {POS: X})
             cdef Vocab vocab = self.vocab
             if new_tag_map:
                 vocab.morphology = Morphology(vocab.strings, new_tag_map,
    
    From 2d6ec998842ea5773f9e66c6153b5b9ceb7a5c0a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:12:23 +0200
    Subject: [PATCH 534/649] Set 'model' as default model name to prevent
     meta.json errors
    
    ---
     spacy/language.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index b836b8619..9ced836f0 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -151,7 +151,7 @@ class Language(object):
         @property
         def meta(self):
             self._meta.setdefault('lang', self.vocab.lang)
    -        self._meta.setdefault('name', '')
    +        self._meta.setdefault('name', 'model')
             self._meta.setdefault('version', '0.0.0')
             self._meta.setdefault('spacy_version', about.__version__)
             self._meta.setdefault('description', '')
    
    From 0575e9cf207b3986a8369bfe2cb1e240bf188917 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:12:34 +0200
    Subject: [PATCH 535/649] Add parser example to docs
    
    ---
     website/usage/_training/_tagger-parser.jade | 52 ++++++++++++++++++++-
     website/usage/examples.jade                 |  9 ++++
     2 files changed, 60 insertions(+), 1 deletion(-)
    
    diff --git a/website/usage/_training/_tagger-parser.jade b/website/usage/_training/_tagger-parser.jade
    index a62b9d43e..437ded9c9 100644
    --- a/website/usage/_training/_tagger-parser.jade
    +++ b/website/usage/_training/_tagger-parser.jade
    @@ -1,6 +1,56 @@
     //- 💫 DOCS > USAGE > TRAINING > TAGGER & PARSER
     
    -+under-construction
    ++h(3, "example-train-parser") Updating the parser
    +
    +p
    +    |  This example shows how to train spaCy's dependency parser, starting off
    +    |  with an existing model or a blank model. You'll need a set of
    +    |  #[strong training examples] and the respective #[strong heads] and
    +    |  #[strong dependency label] for each token of the example texts.
    +
    ++github("spacy", "examples/training/train_parser.py")
    +
    ++h(4) Step by step guide
    +
    ++list("numbers")
    +    +item
    +        |  #[strong Load the model] you want to start with, or create an
    +        |  #[strong empty model] using
    +        |  #[+api("spacy#blank") #[code spacy.blank]] with the ID of your
    +        |  language. If you're using a blank model, don't forget to add the
    +        |  parser to the pipeline. If you're using an existing model,
    +        |  make sure to disable all other pipeline components during training
    +        |  using #[+api("language#disable_pipes") #[code nlp.disable_pipes]].
    +        |  This way, you'll only be training the parser.
    +
    +    +item
    +        |  #[strong Add the dependency labels] to the parser using the
    +        |  #[+api("dependencyparser#add_label") #[code add_label]] method. If
    +        |  you're starting off with a pre-trained spaCy model, this is usually
    +        |  not necessary – but it doesn't hurt either, just to be safe.
    +
    +    +item
    +        |  #[strong Shuffle and loop over] the examples and create a
    +        |  #[code Doc] and #[code GoldParse] object for each example. Make sure
    +        |  to pass in the #[code heads] and #[code deps] when you create the
    +        |  #[code GoldParse].
    +
    +    +item
    +        |  For each example, #[strong update the model]
    +        |  by calling #[+api("language#update") #[code nlp.update]], which steps
    +        |  through the words of the input. At each word, it makes a
    +        |  #[strong prediction]. It then consults the annotations provided on the
    +        |  #[code GoldParse] instance, to see whether it was
    +        |  right. If it was wrong, it adjusts its weights so that the correct
    +        |  action will score higher next time.
    +
    +    +item
    +        |  #[strong Save] the trained model using
    +        |  #[+api("language#to_disk") #[code nlp.to_disk]].
    +
    +    +item
    +        |  #[strong Test] the model to make sure the parser works as expected.
    +
     
     +h(3, "training-json") JSON format for training
     
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 914ecafde..d6ad8bc23 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -80,6 +80,15 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/training/train_new_entity_type.py")
     
    +    +h(3, "parser") Training spaCy's parser
    +
    +    p
    +        |  This example shows how to update spaCy's dependency parser,
    +        |  starting off with an existing, pre-trained model, or from scratch
    +        |  using a blank #[code Language] class.
    +
    +    +github("spacy", "examples/training/train_parser.py")
    +
         +h(3, "textcat") Training spaCy's text classifier
             +tag-new(2)
     
    
    From e44bbb53616e07ffcf855e7dea7bee9e3011d9da Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:12:41 +0200
    Subject: [PATCH 536/649] Remove old example
    
    ---
     examples/training/load_ner.py | 22 ----------------------
     1 file changed, 22 deletions(-)
     delete mode 100644 examples/training/load_ner.py
    
    diff --git a/examples/training/load_ner.py b/examples/training/load_ner.py
    deleted file mode 100644
    index bf81cee50..000000000
    --- a/examples/training/load_ner.py
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -# Load NER
    -from __future__ import unicode_literals
    -import spacy
    -import pathlib
    -from spacy.pipeline import EntityRecognizer
    -from spacy.vocab import Vocab
    -
    -def load_model(model_dir):
    -    model_dir = pathlib.Path(model_dir)
    -    nlp = spacy.load('en', parser=False, entity=False, add_vectors=False)
    -    with (model_dir / 'vocab' / 'strings.json').open('r', encoding='utf8') as file_:
    -        nlp.vocab.strings.load(file_)
    -    nlp.vocab.load_lexemes(model_dir / 'vocab' / 'lexemes.bin')
    -    ner = EntityRecognizer.load(model_dir, nlp.vocab, require=True)
    -    return (nlp, ner)
    -
    -(nlp, ner) = load_model('ner')
    -doc = nlp.make_doc('Who is Shaka Khan?')
    -nlp.tagger(doc)
    -ner(doc)
    -for word in doc:
    -    print(word.text, word.orth, word.lower, word.tag_, word.ent_type_, word.ent_iob)
    
    From f1529463a80d9380c525e8870cda42e089801b38 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:19:02 +0200
    Subject: [PATCH 537/649] Update tagger training example
    
    ---
     examples/training/train_tagger.py | 110 +++++++++++++++++-------------
     1 file changed, 63 insertions(+), 47 deletions(-)
    
    diff --git a/examples/training/train_tagger.py b/examples/training/train_tagger.py
    index d5a519942..6b1fbcae8 100644
    --- a/examples/training/train_tagger.py
    +++ b/examples/training/train_tagger.py
    @@ -1,18 +1,21 @@
    -"""A quick example for training a part-of-speech tagger, without worrying
    -about the tokenization, or other language-specific customizations."""
    -
    -from __future__ import unicode_literals
    -from __future__ import print_function
    +#!/usr/bin/env python
    +# coding: utf8
    +"""
    +A simple example for training a part-of-speech tagger with a custom tag map.
    +To allow us to update the tag map with our custom one, this example starts off
    +with a blank Language class and modifies its defaults.
    +"""
    +from __future__ import unicode_literals, print_function
     
     import plac
    +import random
     from pathlib import Path
     
    -from spacy.vocab import Vocab
    -from spacy.tagger import Tagger
    +import spacy
    +from spacy.util import get_lang_class
     from spacy.tokens import Doc
     from spacy.gold import GoldParse
     
    -import random
     
     # You need to define a mapping from your data's part-of-speech tag names to the
     # Universal Part-of-Speech tag set, as spaCy includes an enum of these tags.
    @@ -28,54 +31,67 @@ TAG_MAP = {
     
     # Usually you'll read this in, of course. Data formats vary.
     # Ensure your strings are unicode.
    -DATA = [
    -    (
    -        ["I", "like", "green", "eggs"],
    -        ["N", "V", "J", "N"]
    -    ),
    -    (
    -        ["Eat", "blue", "ham"],
    -        ["V", "J", "N"]
    -    )
    +TRAIN_DATA = [
    +    (["I", "like", "green", "eggs"], ["N", "V", "J", "N"]),
    +    (["Eat", "blue", "ham"], ["V", "J", "N"])
     ]
     
     
    -def ensure_dir(path):
    -    if not path.exists():
    -        path.mkdir()
    +@plac.annotations(
    +    lang=("ISO Code of language to use", "option", "l", str),
    +    output_dir=("Optional output directory", "option", "o", Path),
    +    n_iter=("Number of training iterations", "option", "n", int))
    +def main(lang='en', output_dir=None, n_iter=25):
    +    """Create a new model, set up the pipeline and train the tagger. In order to
    +    train the tagger with a custom tag map, we're creating a new Language
    +    instance with a custom vocab.
    +    """
    +    lang_cls = get_lang_class(lang)  # get Language class
    +    lang_cls.Defaults.tag_map.update(TAG_MAP)  # add tag map to defaults
    +    nlp = lang_cls()  # initialise Language class
     
    +    # add the parser to the pipeline
    +    # nlp.create_pipe works for built-ins that are registered with spaCy
    +    tagger = nlp.create_pipe('tagger')
    +    nlp.add_pipe(tagger)
     
    -def main(output_dir=None):
    +    optimizer = nlp.begin_training(lambda: [])
    +    for i in range(n_iter):
    +        random.shuffle(TRAIN_DATA)
    +        losses = {}
    +        for words, tags in TRAIN_DATA:
    +            doc = Doc(nlp.vocab, words=words)
    +            gold = GoldParse(doc, tags=tags)
    +            nlp.update([doc], [gold], sgd=optimizer, losses=losses)
    +        print(losses)
    +
    +    # test the trained model
    +    test_text = "I like blue eggs"
    +    doc = nlp(test_text)
    +    print('Tags', [(t.text, t.tag_, t.pos_) for t in doc])
    +
    +    # save model to output directory
         if output_dir is not None:
             output_dir = Path(output_dir)
    -        ensure_dir(output_dir)
    -        ensure_dir(output_dir / "pos")
    -        ensure_dir(output_dir / "vocab")
    +        if not output_dir.exists():
    +            output_dir.mkdir()
    +        nlp.to_disk(output_dir)
    +        print("Saved model to", output_dir)
     
    -    vocab = Vocab(tag_map=TAG_MAP)
    -    # The default_templates argument is where features are specified. See
    -    # spacy/tagger.pyx for the defaults.
    -    tagger = Tagger(vocab)
    -    for i in range(25):
    -        for words, tags in DATA:
    -            doc = Doc(vocab, words=words)
    -            gold = GoldParse(doc, tags=tags)
    -            tagger.update(doc, gold)
    -        random.shuffle(DATA)
    -    tagger.model.end_training()
    -    doc = Doc(vocab, orths_and_spaces=zip(["I", "like", "blue", "eggs"], [True] * 4))
    -    tagger(doc)
    -    for word in doc:
    -        print(word.text, word.tag_, word.pos_)
    -    if output_dir is not None:
    -        tagger.model.dump(str(output_dir / 'pos' / 'model'))
    -        with (output_dir / 'vocab' / 'strings.json').open('w') as file_:
    -            tagger.vocab.strings.dump(file_)
    +        # test the save model
    +        print("Loading from", output_dir)
    +        nlp2 = spacy.load(output_dir)
    +        doc = nlp2(test_text)
    +        print('Tags', [(t.text, t.tag_, t.pos_) for t in doc])
     
     
     if __name__ == '__main__':
         plac.call(main)
    -    # I V VERB
    -    # like V VERB
    -    # blue N NOUN
    -    # eggs N NOUN
    +
    +    # Expected output:
    +    # [
    +    #   ('I', 'N', 'NOUN'),
    +    #   ('like', 'V', 'VERB'),
    +    #   ('blue', 'J', 'ADJ'),
    +    #   ('eggs', 'N', 'NOUN')
    +    # ]
    
    From b90e95897548f1f17b3f7607ffaeb544b8edde7b Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:27:42 +0200
    Subject: [PATCH 538/649] Update tagger and parser examples and add to docs
    
    ---
     examples/training/train_tagger.py           |  2 +-
     website/usage/_training/_tagger-parser.jade | 45 ++++++++++++++++++++-
     website/usage/examples.jade                 | 11 ++++-
     3 files changed, 55 insertions(+), 3 deletions(-)
    
    diff --git a/examples/training/train_tagger.py b/examples/training/train_tagger.py
    index 6b1fbcae8..b887b4592 100644
    --- a/examples/training/train_tagger.py
    +++ b/examples/training/train_tagger.py
    @@ -50,7 +50,7 @@ def main(lang='en', output_dir=None, n_iter=25):
         lang_cls.Defaults.tag_map.update(TAG_MAP)  # add tag map to defaults
         nlp = lang_cls()  # initialise Language class
     
    -    # add the parser to the pipeline
    +    # add the tagger to the pipeline
         # nlp.create_pipe works for built-ins that are registered with spaCy
         tagger = nlp.create_pipe('tagger')
         nlp.add_pipe(tagger)
    diff --git a/website/usage/_training/_tagger-parser.jade b/website/usage/_training/_tagger-parser.jade
    index 437ded9c9..c32577a73 100644
    --- a/website/usage/_training/_tagger-parser.jade
    +++ b/website/usage/_training/_tagger-parser.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > USAGE > TRAINING > TAGGER & PARSER
     
    -+h(3, "example-train-parser") Updating the parser
    ++h(3, "example-train-parser") Updating the Dependency Parser
     
     p
         |  This example shows how to train spaCy's dependency parser, starting off
    @@ -51,6 +51,49 @@ p
         +item
             |  #[strong Test] the model to make sure the parser works as expected.
     
    ++h(3, "example-train-tagger") Updating the Part-of-speech Tagger
    +
    +p
    +    |  In this example, we're training spaCy's part-of-speech tagger with a
    +    |  custom tag map. We start off with a blank #[code Language] class, update
    +    |  its defaults with our custom tags and then train the tagger. You'll need
    +    |  a set of #[strong training examples] and the respective
    +    |  #[strong custom tags], as well as a dictionary mapping those tags to the
    +    |  #[+a("http://universaldependencies.github.io/docs/u/pos/index.html") Universal Dependencies scheme].
    +
    ++github("spacy", "examples/training/train_tagger.py")
    +
    ++h(4) Step by step guide
    +
    ++list("numbers")
    +    +item
    +        |  #[strong Create] a new #[code Language] class and before initialising
    +        |  it, update the #[code tag_map] in its #[code Defaults] with your
    +        |  custom tags.
    +
    +    +item
    +        |  #[strong Create a new tagger] component and add it to the pipeline.
    +
    +    +item
    +        |  #[strong Shuffle and loop over] the examples and create a
    +        |  #[code Doc] and #[code GoldParse] object for each example. Make sure
    +        |  to pass in the #[code tags] when you create the #[code GoldParse].
    +
    +    +item
    +        |  For each example, #[strong update the model]
    +        |  by calling #[+api("language#update") #[code nlp.update]], which steps
    +        |  through the words of the input. At each word, it makes a
    +        |  #[strong prediction]. It then consults the annotations provided on the
    +        |  #[code GoldParse] instance, to see whether it was
    +        |  right. If it was wrong, it adjusts its weights so that the correct
    +        |  action will score higher next time.
    +
    +    +item
    +        |  #[strong Save] the trained model using
    +        |  #[+api("language#to_disk") #[code nlp.to_disk]].
    +
    +    +item
    +        |  #[strong Test] the model to make sure the parser works as expected.
     
     +h(3, "training-json") JSON format for training
     
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index d6ad8bc23..6641a83c6 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -80,7 +80,7 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/training/train_new_entity_type.py")
     
    -    +h(3, "parser") Training spaCy's parser
    +    +h(3, "parser") Training spaCy's Dependency Parser
     
         p
             |  This example shows how to update spaCy's dependency parser,
    @@ -89,6 +89,15 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/training/train_parser.py")
     
    +    +h(3, "tagger") Training spaCy's Part-of-speech Tagger
    +
    +    p
    +        |  In this example, we're training spaCy's part-of-speech tagger with a
    +        |  custom tag map, mapping our own tags to the mapping those tags to the
    +        |  #[+a("http://universaldependencies.github.io/docs/u/pos/index.html") Universal Dependencies scheme].
    +
    +    +github("spacy", "examples/training/train_tagger.py")
    +
         +h(3, "textcat") Training spaCy's text classifier
             +tag-new(2)
     
    
    From f57043e6fe091ebaf2f4a1220215a8bb7a4b5099 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 16:29:08 +0200
    Subject: [PATCH 539/649] Update docstring
    
    ---
     examples/training/train_tagger.py | 7 +++++++
     1 file changed, 7 insertions(+)
    
    diff --git a/examples/training/train_tagger.py b/examples/training/train_tagger.py
    index b887b4592..c6fc1de88 100644
    --- a/examples/training/train_tagger.py
    +++ b/examples/training/train_tagger.py
    @@ -4,6 +4,13 @@
     A simple example for training a part-of-speech tagger with a custom tag map.
     To allow us to update the tag map with our custom one, this example starts off
     with a blank Language class and modifies its defaults.
    +
    +For more details, see the documentation:
    +* Training: https://alpha.spacy.io/usage/training
    +* POS Tagging: https://alpha.spacy.io/usage/linguistic-features#pos-tagging
    +
    +Developed for: spaCy 2.0.0a18
    +Last updated for: spaCy 2.0.0a18
     """
     from __future__ import unicode_literals, print_function
     
    
    From bca5372fb16b15c1d2bc01b3cd866c15ba20bba7 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 17:32:59 +0200
    Subject: [PATCH 540/649] Clean up examples
    
    ---
     examples/phrase_matcher.py    | 60 +++++++++++++++++++----------------
     examples/vectors_fast_text.py | 14 ++++----
     2 files changed, 41 insertions(+), 33 deletions(-)
    
    diff --git a/examples/phrase_matcher.py b/examples/phrase_matcher.py
    index ca9b0cc92..2dd2691b9 100644
    --- a/examples/phrase_matcher.py
    +++ b/examples/phrase_matcher.py
    @@ -4,22 +4,24 @@ The idea is to associate each word in the vocabulary with a tag, noting whether
     they begin, end, or are inside at least one pattern. An additional tag is used
     for single-word patterns. Complete patterns are also stored in a hash set.
     
    -When we process a document, we look up the words in the vocabulary, to associate
    -the words with the tags.  We then search for tag-sequences that correspond to
    -valid candidates. Finally, we look up the candidates in the hash set.
    +When we process a document, we look up the words in the vocabulary, to
    +associate the words with the tags.  We then search for tag-sequences that
    +correspond to valid candidates. Finally, we look up the candidates in the hash
    +set.
     
    -For instance, to search for the phrases "Barack Hussein Obama" and "Hilary Clinton", we
    -would associate "Barack" and "Hilary" with the B tag, Hussein with the I tag,
    -and Obama and Clinton with the L tag.
    +For instance, to search for the phrases "Barack Hussein Obama" and "Hilary
    +Clinton", we would associate "Barack" and "Hilary" with the B tag, Hussein with
    +the I tag, and Obama and Clinton with the L tag.
     
     The document "Barack Clinton and Hilary Clinton" would have the tag sequence
    -[{B}, {L}, {}, {B}, {L}], so we'd get two matches. However, only the second candidate
    -is in the phrase dictionary, so only one is returned as a match.
    +[{B}, {L}, {}, {B}, {L}], so we'd get two matches. However, only the second
    +candidate is in the phrase dictionary, so only one is returned as a match.
     
    -The algorithm is O(n) at run-time for document of length n because we're only ever
    -matching over the tag patterns. So no matter how many phrases we're looking for,
    -our pattern set stays very small (exact size depends on the maximum length we're
    -looking for, as the query language currently has no quantifiers)
    +The algorithm is O(n) at run-time for document of length n because we're only
    +ever matching over the tag patterns. So no matter how many phrases we're
    +looking for, our pattern set stays very small (exact size depends on the
    +maximum length we're looking for, as the query language currently has no
    +quantifiers).
     
     The example expects a .bz2 file from the Reddit corpus, and a patterns file,
     formatted in jsonl as a sequence of entries like this:
    @@ -32,11 +34,9 @@ formatted in jsonl as a sequence of entries like this:
     {"text":"Argentina"}
     """
     from __future__ import print_function, unicode_literals, division
    +
     from bz2 import BZ2File
     import time
    -import math
    -import codecs
    -
     import plac
     import ujson
     
    @@ -44,6 +44,24 @@ from spacy.matcher import PhraseMatcher
     import spacy
     
     
    +@plac.annotations(
    +    patterns_loc=("Path to gazetteer", "positional", None, str),
    +    text_loc=("Path to Reddit corpus file", "positional", None, str),
    +    n=("Number of texts to read", "option", "n", int),
    +    lang=("Language class to initialise", "option", "l", str))
    +def main(patterns_loc, text_loc, n=10000, lang='en'):
    +    nlp = spacy.blank('en')
    +    nlp.vocab.lex_attr_getters = {}
    +    phrases = read_gazetteer(nlp.tokenizer, patterns_loc)
    +    count = 0
    +    t1 = time.time()
    +    for ent_id, text in get_matches(nlp.tokenizer, phrases,
    +                                    read_text(text_loc, n=n)):
    +        count += 1
    +    t2 = time.time()
    +    print("%d docs in %.3f s. %d matches" % (n, (t2 - t1), count))
    +
    +
     def read_gazetteer(tokenizer, loc, n=-1):
         for i, line in enumerate(open(loc)):
             data = ujson.loads(line.strip())
    @@ -75,18 +93,6 @@ def get_matches(tokenizer, phrases, texts, max_length=6):
                 yield (ent_id, doc[start:end].text)
     
     
    -def main(patterns_loc, text_loc, n=10000):
    -    nlp = spacy.blank('en')
    -    nlp.vocab.lex_attr_getters = {}
    -    phrases = read_gazetteer(nlp.tokenizer, patterns_loc)
    -    count = 0
    -    t1 = time.time()
    -    for ent_id, text in get_matches(nlp.tokenizer, phrases, read_text(text_loc, n=n)):
    -        count += 1
    -    t2 = time.time()
    -    print("%d docs in %.3f s. %d matches" % (n, (t2 - t1), count))
    -
    -
     if __name__ == '__main__':
         if False:
             import cProfile
    diff --git a/examples/vectors_fast_text.py b/examples/vectors_fast_text.py
    index 9aa9fda56..323d5803f 100644
    --- a/examples/vectors_fast_text.py
    +++ b/examples/vectors_fast_text.py
    @@ -1,16 +1,18 @@
    -'''Load vectors for a language trained using FastText
    -
    +#!/usr/bin/env python
    +# coding: utf8
    +"""Load vectors for a language trained using FastText
     https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md
    -'''
    +"""
     from __future__ import unicode_literals
     import plac
     import numpy
     
    -import spacy.language
    +import from spacy.language import Language
     
     
    +@plac.annotations(vectors_loc=("Path to vectors", "positional", None, str))
     def main(vectors_loc):
    -    nlp = spacy.language.Language()
    +    nlp = Language()
     
         with open(vectors_loc, 'rb') as file_:
             header = file_.readline()
    @@ -18,7 +20,7 @@ def main(vectors_loc):
             nlp.vocab.clear_vectors(int(nr_dim))
             for line in file_:
                 line = line.decode('utf8')
    -            pieces = line.split() 
    +            pieces = line.split()
                 word = pieces[0]
                 vector = numpy.asarray([float(v) for v in pieces[1:]], dtype='f')
                 nlp.vocab.set_vector(word, vector)
    
    From daed7ff8fedf8d7bc202ec706eed5d53e70cef77 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 18:46:11 +0200
    Subject: [PATCH 541/649] Update information extraction examples
    
    ---
     examples/get_parse_subregions.py              | 59 -----------------
     examples/information_extraction.py            | 59 -----------------
     .../entity_relations.py                       | 62 ++++++++++++++++++
     .../information_extraction/parse_subtrees.py  | 65 +++++++++++++++++++
     .../phrase_matcher.py                         |  0
     website/usage/_data.json                      |  2 +-
     website/usage/examples.jade                   | 51 +++++++++------
     7 files changed, 159 insertions(+), 139 deletions(-)
     delete mode 100644 examples/get_parse_subregions.py
     delete mode 100644 examples/information_extraction.py
     create mode 100644 examples/information_extraction/entity_relations.py
     create mode 100644 examples/information_extraction/parse_subtrees.py
     rename examples/{ => information_extraction}/phrase_matcher.py (100%)
    
    diff --git a/examples/get_parse_subregions.py b/examples/get_parse_subregions.py
    deleted file mode 100644
    index 5eb4f2c77..000000000
    --- a/examples/get_parse_subregions.py
    +++ /dev/null
    @@ -1,59 +0,0 @@
    -"""Issue #252
    -
    -Question:
    -
    -In the documents and tutorials the main thing I haven't found is examples on how to break sentences down into small sub thoughts/chunks. The noun_chunks is handy, but having examples on using the token.head to find small (near-complete) sentence chunks would be neat.
    -
    -Lets take the example sentence on https://displacy.spacy.io/displacy/index.html
    -
    -displaCy uses CSS and JavaScript to show you how computers understand language
    -This sentence has two main parts (XCOMP & CCOMP) according to the breakdown:
    -
    -[displaCy] uses CSS and Javascript [to + show]
    -&
    -show you how computers understand [language]
    -I'm assuming that we can use the token.head to build these groups. In one of your examples you had the following function.
    -
    -def dependency_labels_to_root(token):
    -    '''Walk up the syntactic tree, collecting the arc labels.'''
    -    dep_labels = []
    -    while token.head is not token:
    -        dep_labels.append(token.dep)
    -        token = token.head
    -    return dep_labels
    -"""
    -from __future__ import print_function, unicode_literals
    -
    -# Answer:
    -# The easiest way is to find the head of the subtree you want, and then use the
    -# `.subtree`, `.children`, `.lefts` and `.rights` iterators. `.subtree` is the
    -# one that does what you're asking for most directly:
    -
    -from spacy.en import English
    -nlp = English()
    -
    -doc = nlp(u'displaCy uses CSS and JavaScript to show you how computers understand language')
    -for word in doc:
    -    if word.dep_ in ('xcomp', 'ccomp'):
    -        print(''.join(w.text_with_ws for w in word.subtree))
    -
    -# It'd probably be better for `word.subtree` to return a `Span` object instead 
    -# of a generator over the tokens. If you want the `Span` you can get it via the 
    -# `.right_edge` and `.left_edge` properties. The `Span` object is nice because 
    -# you can easily get a vector, merge it, etc.
    -
    -doc = nlp(u'displaCy uses CSS and JavaScript to show you how computers understand language')
    -for word in doc:
    -    if word.dep_ in ('xcomp', 'ccomp'):
    -        subtree_span = doc[word.left_edge.i : word.right_edge.i + 1]
    -        print(subtree_span.text, '|', subtree_span.root.text)
    -        print(subtree_span.similarity(doc))
    -        print(subtree_span.similarity(subtree_span.root))
    -
    -
    -# You might also want to select a head, and then select a start and end position by
    -# walking along its children. You could then take the `.left_edge` and `.right_edge`
    -# of those tokens, and use it to calculate a span.
    -
    -
    -
    diff --git a/examples/information_extraction.py b/examples/information_extraction.py
    deleted file mode 100644
    index 19e93b499..000000000
    --- a/examples/information_extraction.py
    +++ /dev/null
    @@ -1,59 +0,0 @@
    -import plac
    -
    -from spacy.en import English
    -from spacy.parts_of_speech import NOUN
    -from spacy.parts_of_speech import ADP as PREP
    -
    -
    -def _span_to_tuple(span):
    -    start = span[0].idx
    -    end = span[-1].idx + len(span[-1])
    -    tag = span.root.tag_
    -    text = span.text
    -    label = span.label_
    -    return (start, end, tag, text, label)
    -
    -def merge_spans(spans, doc):
    -    # This is a bit awkward atm. What we're doing here is merging the entities,
    -    # so that each only takes up a single token. But an entity is a Span, and
    -    # each Span is a view into the doc. When we merge a span, we invalidate
    -    # the other spans. This will get fixed --- but for now the solution
    -    # is to gather the information first, before merging.
    -    tuples = [_span_to_tuple(span) for span in spans]
    -    for span_tuple in tuples:
    -        doc.merge(*span_tuple)
    -
    -
    -def extract_currency_relations(doc):
    -    merge_spans(doc.ents, doc)
    -    merge_spans(doc.noun_chunks, doc)
    -
    -    relations = []
    -    for money in filter(lambda w: w.ent_type_ == 'MONEY', doc):
    -        if money.dep_ in ('attr', 'dobj'):
    -            subject = [w for w in money.head.lefts if w.dep_ == 'nsubj']
    -            if subject:
    -                subject = subject[0]
    -                relations.append((subject, money))
    -        elif money.dep_ == 'pobj' and money.head.dep_ == 'prep':
    -            relations.append((money.head.head, money))
    - 
    -    return relations
    -
    -
    -def main():
    -    nlp = English()
    -    texts = [
    -        u'Net income was $9.4 million compared to the prior year of $2.7 million.',
    -        u'Revenue exceeded twelve billion dollars, with a loss of $1b.',
    -    ]
    -               
    -    for text in texts:
    -        doc = nlp(text)
    -        relations = extract_currency_relations(doc)
    -        for r1, r2 in relations:
    -            print(r1.text, r2.ent_type_, r2.text)
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/examples/information_extraction/entity_relations.py b/examples/information_extraction/entity_relations.py
    new file mode 100644
    index 000000000..b73dcbf3b
    --- /dev/null
    +++ b/examples/information_extraction/entity_relations.py
    @@ -0,0 +1,62 @@
    +#!/usr/bin/env python
    +# coding: utf8
    +"""
    +A simple example of extracting relations between phrases and entities using
    +spaCy's named entity recognizer and the dependency parse. Here, we extract
    +money and currency values (entities labelled as MONEY) and then check the
    +dependency tree to find the noun phrase they are referring to – for example:
    +$9.4 million --> Net income.
    +
    +Last updated for: spaCy 2.0.0a18
    +"""
    +from __future__ import unicode_literals, print_function
    +
    +import plac
    +import spacy
    +
    +
    +TEXTS = [
    +    'Net income was $9.4 million compared to the prior year of $2.7 million.',
    +    'Revenue exceeded twelve billion dollars, with a loss of $1b.',
    +]
    +
    +
    +@plac.annotations(
    +    model=("Model to load (needs parser and NER)", "positional", None, str))
    +def main(model='en_core_web_sm'):
    +    nlp = spacy.load(model)
    +    print("Loaded model '%s'" % model)
    +    print("Processing %d texts" % len(TEXTS))
    +
    +    for text in TEXTS:
    +        doc = nlp(text)
    +        relations = extract_currency_relations(doc)
    +        for r1, r2 in relations:
    +            print('{:<10}\t{}\t{}'.format(r1.text, r2.ent_type_, r2.text))
    +
    +
    +def extract_currency_relations(doc):
    +    # merge entities and noun chunks into one token
    +    for span in [*list(doc.ents), *list(doc.noun_chunks)]:
    +        span.merge()
    +
    +    relations = []
    +    for money in filter(lambda w: w.ent_type_ == 'MONEY', doc):
    +        if money.dep_ in ('attr', 'dobj'):
    +            subject = [w for w in money.head.lefts if w.dep_ == 'nsubj']
    +            if subject:
    +                subject = subject[0]
    +                relations.append((subject, money))
    +        elif money.dep_ == 'pobj' and money.head.dep_ == 'prep':
    +            relations.append((money.head.head, money))
    +    return relations
    +
    +
    +if __name__ == '__main__':
    +    plac.call(main)
    +
    +    # Expected output:
    +    # Net income      MONEY   $9.4 million
    +    # the prior year  MONEY   $2.7 million
    +    # Revenue         MONEY   twelve billion dollars
    +    # a loss          MONEY   1b
    diff --git a/examples/information_extraction/parse_subtrees.py b/examples/information_extraction/parse_subtrees.py
    new file mode 100644
    index 000000000..5963d014c
    --- /dev/null
    +++ b/examples/information_extraction/parse_subtrees.py
    @@ -0,0 +1,65 @@
    +#!/usr/bin/env python
    +# coding: utf8
    +"""
    +This example shows how to navigate the parse tree including subtrees attached
    +to a word.
    +
    +Based on issue #252:
    +"In the documents and tutorials the main thing I haven't found is
    +examples on how to break sentences down into small sub thoughts/chunks. The
    +noun_chunks is handy, but having examples on using the token.head to find small
    +(near-complete) sentence chunks would be neat. Lets take the example sentence:
    +"displaCy uses CSS and JavaScript to show you how computers understand language"
    +
    +This sentence has two main parts (XCOMP & CCOMP) according to the breakdown:
    +[displaCy] uses CSS and Javascript [to + show]
    +show you how computers understand [language]
    +
    +I'm assuming that we can use the token.head to build these groups."
    +
    +Last updated for: spaCy 2.0.0a18
    +"""
    +from __future__ import unicode_literals, print_function
    +
    +import plac
    +import spacy
    +
    +
    +@plac.annotations(
    +    model=("Model to load", "positional", None, str))
    +def main(model='en_core_web_sm'):
    +    nlp = spacy.load(model)
    +    print("Loaded model '%s'" % model)
    +
    +    doc = nlp("displaCy uses CSS and JavaScript to show you how computers "
    +               "understand language")
    +
    +    # The easiest way is to find the head of the subtree you want, and then use
    +    # the `.subtree`, `.children`, `.lefts` and `.rights` iterators. `.subtree`
    +    # is the one that does what you're asking for most directly:
    +    for word in doc:
    +        if word.dep_ in ('xcomp', 'ccomp'):
    +            print(''.join(w.text_with_ws for w in word.subtree))
    +
    +    # It'd probably be better for `word.subtree` to return a `Span` object
    +    # instead of a generator over the tokens. If you want the `Span` you can
    +    # get it via the `.right_edge` and `.left_edge` properties. The `Span`
    +    # object is nice because you can easily get a vector, merge it, etc.
    +    for word in doc:
    +        if word.dep_ in ('xcomp', 'ccomp'):
    +            subtree_span = doc[word.left_edge.i : word.right_edge.i + 1]
    +            print(subtree_span.text, '|', subtree_span.root.text)
    +
    +    # You might also want to select a head, and then select a start and end
    +    # position by walking along its children. You could then take the
    +    # `.left_edge` and `.right_edge` of those tokens, and use it to calculate
    +    # a span.
    +
    +if __name__ == '__main__':
    +    plac.call(main)
    +
    +    # Expected output:
    +    # to show you how computers understand language
    +    # how computers understand language
    +    # to show you how computers understand language | show
    +    # how computers understand language | understand
    diff --git a/examples/phrase_matcher.py b/examples/information_extraction/phrase_matcher.py
    similarity index 100%
    rename from examples/phrase_matcher.py
    rename to examples/information_extraction/phrase_matcher.py
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index cc9918631..c34b5f2b0 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -196,8 +196,8 @@
             "teaser": "Full code examples you can modify and run.",
             "next": "resources",
             "menu": {
    +            "Information Extraction": "information-extraction",
                 "Pipeline": "pipeline",
    -            "Matching": "matching",
                 "Training": "training",
                 "Deep Learning": "deep-learning"
             }
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 6641a83c6..74d562e27 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -2,6 +2,37 @@
     
     include ../_includes/_mixins
     
    ++section("information-extraction")
    +    +h(3, "phrase-matcher") Using spaCy's phrase matcher
    +        +tag-new(2)
    +
    +    p
    +        |  This example shows how to use the new
    +        |  #[+api("phrasematcher") #[code PhraseMatcher]] to efficiently find
    +        |  entities from a large terminology list.
    +
    +    +github("spacy", "examples/information_extraction/phrase_matcher.py")
    +
    +    +h(3, "entity-relations") Extracting entity relations
    +
    +    p
    +        |  A simple example of extracting relations between phrases and
    +        |  entities using spaCy's named entity recognizer and the dependency
    +        |  parse. Here, we extract money and currency values (entities labelled
    +        |  as #[code MONEY]) and then check the dependency tree to find the
    +        |  noun phrase they are referring to – for example: "$9.4 million"
    +        |  → "Net income".
    +
    +    +github("spacy", "examples/information_extraction/entity_relations.py")
    +
    +    +h(3, "subtrees") Navigating the parse tree and subtrees
    +
    +    p
    +        |  This example shows how to navigate the parse tree including subtrees
    +        |  attached to a word.
    +
    +    +github("spacy", "examples/information_extraction/parse_subtrees.py")
    +
     +section("pipeline")
         +h(3, "custom-components-entities") Custom pipeline components and attribute extensions
             +tag-new(2)
    @@ -40,26 +71,6 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/pipeline/custom_attr_methods.py")
     
    -+section("matching")
    -    +h(3, "matcher") Using spaCy's rule-based matcher
    -
    -    p
    -        |  This example shows how to use spaCy's rule-based
    -        |  #[+api("matcher") #[code Matcher]] to find and label entities across
    -        |  documents.
    -
    -    +github("spacy", "examples/matcher_example.py")
    -
    -    +h(3, "phrase-matcher") Using spaCy's phrase matcher
    -        +tag-new(2)
    -
    -    p
    -        |  This example shows how to use the new
    -        |  #[+api("phrasematcher") #[code PhraseMatcher]] to efficiently find
    -        |  entities from a large terminology list.
    -
    -    +github("spacy", "examples/phrase_matcher.py")
    -
     +section("training")
         +h(3, "training-ner") Training spaCy's Named Entity Recognizer
     
    
    From db843735d3a94826784492709afa0d26129eddd6 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 18:46:25 +0200
    Subject: [PATCH 542/649] Remove outdated examples
    
    ---
     examples/inventory_count/Instructions.md   |   5 -
     examples/inventory_count/inventory.py      |  35 -----
     examples/inventory_count/inventoryCount.py |  92 ------------
     examples/inventory_count/main.py           |  30 ----
     examples/matcher_example.py                | 161 ---------------------
     examples/twitter_filter.py                 |  36 -----
     6 files changed, 359 deletions(-)
     delete mode 100644 examples/inventory_count/Instructions.md
     delete mode 100644 examples/inventory_count/inventory.py
     delete mode 100644 examples/inventory_count/inventoryCount.py
     delete mode 100644 examples/inventory_count/main.py
     delete mode 100644 examples/matcher_example.py
     delete mode 100644 examples/twitter_filter.py
    
    diff --git a/examples/inventory_count/Instructions.md b/examples/inventory_count/Instructions.md
    deleted file mode 100644
    index 456f5d4fe..000000000
    --- a/examples/inventory_count/Instructions.md
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -An example of inventory counting using SpaCy.io NLP library. Meant to show how to instantiate Spacy's English class, and allow reusability by reloading the main module.
    -
    -In the future, a better implementation of this library would be to apply machine learning to each query and learn what to classify as the quantitative statement (55 kgs OF), vs the actual item of count (how likely is a preposition object to be the item of count if x,y,z qualifications appear in the statement).
    -
    -
    diff --git a/examples/inventory_count/inventory.py b/examples/inventory_count/inventory.py
    deleted file mode 100644
    index abc031513..000000000
    --- a/examples/inventory_count/inventory.py
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -class Inventory:
    -    """
    -        Inventory class - a struct{} like feature to house inventory counts
    -        across modules.
    -    """
    -    originalQuery = None
    -    item = ""
    -    unit = ""
    -    amount = ""
    -
    -    def __init__(self, statement):
    -        """
    -        Constructor - only takes in the original query/statement
    -        :return: new Inventory object
    -        """
    -
    -        self.originalQuery = statement
    -        pass
    -
    -    def __str__(self):
    -        return str(self.amount) + ' ' + str(self.unit) + ' ' + str(self.item)
    -
    -    def printInfo(self):
    -        print '-------------Inventory Count------------'
    -        print "Original Query:  " + str(self.originalQuery)
    -        print 'Amount:  ' + str(self.amount)
    -        print 'Unit:    ' + str(self.unit)
    -        print 'Item:    ' + str(self.item)
    -        print '----------------------------------------'
    -
    -    def isValid(self):
    -        if not self.item or not self.unit or not self.amount or not self.originalQuery:
    -            return False
    -        else:
    -            return True
    diff --git a/examples/inventory_count/inventoryCount.py b/examples/inventory_count/inventoryCount.py
    deleted file mode 100644
    index b1b7b43c8..000000000
    --- a/examples/inventory_count/inventoryCount.py
    +++ /dev/null
    @@ -1,92 +0,0 @@
    -from inventory import Inventory
    -
    -
    -def runTest(nlp):
    -    testset = []
    -    testset += [nlp(u'6 lobster cakes')]
    -    testset += [nlp(u'6 avacados')]
    -    testset += [nlp(u'fifty five carrots')]
    -    testset += [nlp(u'i have 55 carrots')]
    -    testset += [nlp(u'i got me some 9 cabbages')]
    -    testset += [nlp(u'i got 65 kgs of carrots')]
    -
    -    result = []
    -    for doc in testset:
    -        c = decodeInventoryEntry_level1(doc)
    -        if not c.isValid():
    -            c = decodeInventoryEntry_level2(doc)
    -        result.append(c)
    -
    -    for i in result:
    -        i.printInfo()
    -
    -
    -def decodeInventoryEntry_level1(document):
    -    """
    -    Decodes a basic entry such as: '6 lobster cake' or '6' cakes
    -    @param document : NLP Doc object
    -    :return: Status if decoded correctly (true, false), and Inventory object
    -    """
    -    count = Inventory(str(document))
    -    for token in document:
    -        if token.pos_ == (u'NOUN' or u'NNS' or u'NN'):
    -            item = str(token)
    -
    -            for child in token.children:
    -                if child.dep_ == u'compound' or child.dep_ == u'ad':
    -                    item = str(child) + str(item)
    -                elif child.dep_ == u'nummod':
    -                    count.amount = str(child).strip()
    -                    for numerical_child in child.children:
    -                        # this isn't arithmetic rather than treating it such as a string
    -                        count.amount = str(numerical_child) + str(count.amount).strip()
    -                else:
    -                    print "WARNING: unknown child: " + str(child) + ':'+str(child.dep_)
    -
    -            count.item = item
    -            count.unit = item
    -
    -    return count
    -
    -
    -def decodeInventoryEntry_level2(document):
    -    """
    -    Entry level 2, a more complicated parsing scheme that covers examples such as
    -    'i have 80 boxes of freshly baked pies'
    -
    -    @document @param document : NLP Doc object
    -    :return: Status if decoded correctly (true, false), and Inventory object-
    -    """
    -
    -    count = Inventory(str(document))
    -
    -    for token in document:
    -        #  Look for a preposition object that is a noun (this is the item we are counting).
    -        #  If found, look at its' dependency (if a preposition that is not indicative of
    -        #  inventory location, the dependency of the preposition must be a noun
    -
    -        if token.dep_ == (u'pobj' or u'meta') and token.pos_ == (u'NOUN' or u'NNS' or u'NN'):
    -            item = ''
    -
    -            #  Go through all the token's children, these are possible adjectives and other add-ons
    -            #  this deals with cases such as 'hollow rounded waffle pancakes"
    -            for i in token.children:
    -                item += ' ' + str(i)
    -
    -            item += ' ' + str(token)
    -            count.item = item
    -
    -            # Get the head of the item:
    -            if token.head.dep_ != u'prep':
    -                #  Break out of the loop, this is a confusing entry
    -                break
    -            else:
    -                amountUnit = token.head.head
    -                count.unit = str(amountUnit)
    -
    -                for inner in amountUnit.children:
    -                    if inner.pos_ == u'NUM':
    -                        count.amount += str(inner)
    -    return count
    -
    -
    diff --git a/examples/inventory_count/main.py b/examples/inventory_count/main.py
    deleted file mode 100644
    index cbc9e25c3..000000000
    --- a/examples/inventory_count/main.py
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -import inventoryCount as mainModule
    -import os
    -from spacy.en import English
    -
    -if __name__ == '__main__':
    -    """
    -    Main module for this example - loads the English main NLP class,
    -    and keeps it in RAM while waiting for the user to re-run it. Allows the
    -    developer to re-edit their module under testing without having
    -    to wait as long to load the English class
    -    """
    -
    -    #  Set the NLP object here for the parameters you want to see,
    -    #  or just leave it blank and get all the opts
    -    print "Loading English module... this will take a while."
    -    nlp = English()
    -    print "Done loading English module."
    -    while True:
    -        try:
    -            reload(mainModule)
    -            mainModule.runTest(nlp)
    -            raw_input('================ To reload main module, press Enter ================')
    -
    -            
    -        except Exception, e:
    -            print "Unexpected error: " + str(e)
    -            continue
    -
    -
    -
    diff --git a/examples/matcher_example.py b/examples/matcher_example.py
    deleted file mode 100644
    index 041b98a9a..000000000
    --- a/examples/matcher_example.py
    +++ /dev/null
    @@ -1,161 +0,0 @@
    -from __future__ import unicode_literals, print_function
    -
    -import spacy.en
    -import spacy.matcher
    -from spacy.attrs import ORTH, TAG, LOWER, IS_ALPHA, FLAG63
    -
    -import plac
    -
    -
    -def main():
    -    nlp = spacy.en.English()
    -    example = u"I prefer Siri to Google Now. I'll google now to find out how the google now service works."
    -    before = nlp(example)
    -    print("Before")
    -    for ent in before.ents:
    -        print(ent.text, ent.label_, [w.tag_ for w in ent])
    -    # Output:
    -    # Google ORG [u'NNP']
    -    # google ORG [u'VB']
    -    # google ORG [u'NNP']
    -    nlp.matcher.add(
    -        "GoogleNow", # Entity ID: Not really used at the moment.
    -        "PRODUCT",   # Entity type: should be one of the types in the NER data
    -        {"wiki_en": "Google_Now"}, # Arbitrary attributes. Currently unused.
    -        [  # List of patterns that can be Surface Forms of the entity
    -
    -            # This Surface Form matches "Google Now", verbatim
    -            [ # Each Surface Form is a list of Token Specifiers.
    -                { # This Token Specifier matches tokens whose orth field is "Google"
    -                    ORTH: "Google"
    -                },
    -                { # This Token Specifier matches tokens whose orth field is "Now"
    -                    ORTH: "Now"
    -                }
    -            ],
    -            [ # This Surface Form matches "google now", verbatim, and requires
    -              # "google" to have the NNP tag. This helps prevent the pattern from
    -              # matching cases like "I will google now to look up the time"
    -                {
    -                    ORTH: "google",
    -                    TAG: "NNP"
    -                },
    -                {
    -                    ORTH: "now"
    -                }
    -            ]
    -        ]
    -    )
    -    after = nlp(example)
    -    print("After")
    -    for ent in after.ents:
    -        print(ent.text, ent.label_, [w.tag_ for w in ent])
    -    # Output
    -    # Google Now PRODUCT [u'NNP', u'RB']
    -    # google ORG [u'VB']
    -    # google now PRODUCT [u'NNP', u'RB']
    -    #
    -    # You can customize attribute values in the lexicon, and then refer to the
    -    # new attributes in your Token Specifiers.
    -    # This is particularly good for word-set membership.
    -    # 
    -    australian_capitals = ['Brisbane', 'Sydney', 'Canberra', 'Melbourne', 'Hobart',
    -                           'Darwin', 'Adelaide', 'Perth']
    -    # Internally, the tokenizer immediately maps each token to a pointer to a 
    -    # LexemeC struct. These structs hold various features, e.g. the integer IDs
    -    # of the normalized string forms.
    -    # For our purposes, the key attribute is a 64-bit integer, used as a bit field.
    -    # spaCy currently only uses 12 of the bits for its built-in features, so
    -    # the others are available for use. It's best to use the higher bits, as
    -    # future versions of spaCy may add more flags. For instance, we might add
    -    # a built-in IS_MONTH flag, taking up FLAG13. So, we bind our user-field to
    -    # FLAG63 here.
    -    is_australian_capital = FLAG63
    -    # Now we need to set the flag value. It's False on all tokens by default,
    -    # so we just need to set it to True for the tokens we want.
    -    # Here we iterate over the strings, and set it on only the literal matches.
    -    for string in australian_capitals:
    -        lexeme = nlp.vocab[string]
    -        lexeme.set_flag(is_australian_capital, True)
    -    print('Sydney', nlp.vocab[u'Sydney'].check_flag(is_australian_capital))
    -    print('sydney', nlp.vocab[u'sydney'].check_flag(is_australian_capital))
    -    # If we want case-insensitive matching, we have to be a little bit more
    -    # round-about, as there's no case-insensitive index to the vocabulary. So
    -    # we have to iterate over the vocabulary.
    -    # We'll be looking up attribute IDs in this set a lot, so it's good to pre-build it
    -    target_ids = {nlp.vocab.strings[s.lower()] for s in australian_capitals}
    -    for lexeme in nlp.vocab:
    -        if lexeme.lower in target_ids:
    -            lexeme.set_flag(is_australian_capital, True)
    -    print('Sydney', nlp.vocab[u'Sydney'].check_flag(is_australian_capital))
    -    print('sydney', nlp.vocab[u'sydney'].check_flag(is_australian_capital))
    -    print('SYDNEY', nlp.vocab[u'SYDNEY'].check_flag(is_australian_capital))
    -    # Output
    -    # Sydney True
    -    # sydney False
    -    # Sydney True
    -    # sydney True
    -    # SYDNEY True
    -    #
    -    # The key thing to note here is that we're setting these attributes once,
    -    # over the vocabulary --- and then reusing them at run-time. This means the
    -    # amortized complexity of anything we do this way is going to be O(1). You
    -    # can match over expressions that need to have sets with tens of thousands
    -    # of values, e.g. "all the street names in Germany", and you'll still have
    -    # O(1) complexity. Most regular expression algorithms don't scale well to
    -    # this sort of problem.
    -    #
    -    # Now, let's use this in a pattern
    -    nlp.matcher.add("AuCitySportsTeam", "ORG", {},
    -        [
    -            [
    -                {LOWER: "the"},
    -                {is_australian_capital: True},
    -                {TAG: "NNS"}
    -            ],
    -            [
    -                {LOWER: "the"},
    -                {is_australian_capital: True},
    -                {TAG: "NNPS"}
    -            ],
    -            [
    -                {LOWER: "the"},
    -                {IS_ALPHA: True}, # Allow a word in between, e.g. The Western Sydney
    -                {is_australian_capital: True},
    -                {TAG: "NNS"}
    -            ],
    -            [
    -                {LOWER: "the"},
    -                {IS_ALPHA: True}, # Allow a word in between, e.g. The Western Sydney
    -                {is_australian_capital: True},
    -                {TAG: "NNPS"}
    -            ]
    -        ])
    -    doc = nlp(u'The pattern should match the Brisbane Broncos and the South Darwin Spiders, but not the Colorado Boulders')
    -    for ent in doc.ents:
    -        print(ent.text, ent.label_)
    -    # Output
    -    # the Brisbane Broncos ORG
    -    # the South Darwin Spiders ORG
    -
    -
    -# Output
    -# Before
    -# Google ORG [u'NNP']
    -# google ORG [u'VB']
    -# google ORG [u'NNP']
    -# After
    -# Google Now PRODUCT [u'NNP', u'RB']
    -# google ORG [u'VB']
    -# google now PRODUCT [u'NNP', u'RB']
    -# Sydney True
    -# sydney False
    -# Sydney True
    -# sydney True
    -# SYDNEY True
    -# the Brisbane Broncos ORG
    -# the South Darwin Spiders ORG
    -
    -if __name__ == '__main__':
    -    main()
    -    
    diff --git a/examples/twitter_filter.py b/examples/twitter_filter.py
    deleted file mode 100644
    index b6e4e4e83..000000000
    --- a/examples/twitter_filter.py
    +++ /dev/null
    @@ -1,36 +0,0 @@
    -# encoding: utf8
    -from __future__ import unicode_literals, print_function
    -import plac
    -import codecs
    -import pathlib
    -import random
    -
    -import twython
    -import spacy.en
    -
    -import _handler
    -
    -
    -class Connection(twython.TwythonStreamer):
    -    def __init__(self, keys_dir, nlp, query):
    -        keys_dir = pathlib.Path(keys_dir)
    -        read = lambda fn: (keys_dir / (fn + '.txt')).open().read().strip()
    -        api_key = map(read, ['key', 'secret', 'token', 'token_secret'])
    -        twython.TwythonStreamer.__init__(self, *api_key)
    -        self.nlp = nlp
    -        self.query = query
    -
    -    def on_success(self, data):
    -        _handler.handle_tweet(self.nlp, data, self.query)
    -        if random.random() >= 0.1:
    -            reload(_handler)
    -
    -
    -def main(keys_dir, term):
    -    nlp = spacy.en.English()
    -    twitter = Connection(keys_dir, nlp, term)
    -    twitter.statuses.filter(track=term, language='en')
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    
    From cc2917c9e8b5f519f3f023e2c8180153897c9f5d Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 18:47:02 +0200
    Subject: [PATCH 543/649] Update fastText example and add to examples in docs
    
    ---
     examples/vectors_fast_text.py |  5 +++--
     website/usage/_data.json      |  1 +
     website/usage/examples.jade   | 12 ++++++++++++
     3 files changed, 16 insertions(+), 2 deletions(-)
    
    diff --git a/examples/vectors_fast_text.py b/examples/vectors_fast_text.py
    index 323d5803f..159250098 100644
    --- a/examples/vectors_fast_text.py
    +++ b/examples/vectors_fast_text.py
    @@ -1,6 +1,6 @@
     #!/usr/bin/env python
     # coding: utf8
    -"""Load vectors for a language trained using FastText
    +"""Load vectors for a language trained using fastText
     https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md
     """
     from __future__ import unicode_literals
    @@ -10,7 +10,8 @@ import numpy
     import from spacy.language import Language
     
     
    -@plac.annotations(vectors_loc=("Path to vectors", "positional", None, str))
    +@plac.annotations(
    +    vectors_loc=("Path to vectors", "positional", None, str))
     def main(vectors_loc):
         nlp = Language()
     
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index c34b5f2b0..63e959882 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -199,6 +199,7 @@
                 "Information Extraction": "information-extraction",
                 "Pipeline": "pipeline",
                 "Training": "training",
    +            "Vectors & Similarity": "vectors",
                 "Deep Learning": "deep-learning"
             }
         }
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 74d562e27..808810364 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -119,6 +119,18 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/training/train_textcat.py")
     
    ++section("vectors")
    +    +h(3, "fasttext") Loading pre-trained FastText vectors
    +
    +    p
    +        |  This simple snippet is all you need to be able to use the Facebook's
    +        |  #[+a("https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md") fastText vectors]
    +        |  (294 languages, pre-trained on Wikipedia) with spaCy.  Once they're
    +        |  loaded, the vectors will be available via spaCy's built-in
    +        |  #[code similarity()] methods.
    +
    +    +github("spacy", "examples/vectors_fast_text.py")
    +
     +section("deep-learning")
         +h(3, "keras") Text classification with Keras
     
    
    From b7b285971fb2e0f058e83ebebc4834cb670c4a7c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 26 Oct 2017 18:47:11 +0200
    Subject: [PATCH 544/649] Update examples README
    
    ---
     examples/README.md | 22 ++++++++++------------
     1 file changed, 10 insertions(+), 12 deletions(-)
    
    diff --git a/examples/README.md b/examples/README.md
    index d7168f613..18a1760ec 100644
    --- a/examples/README.md
    +++ b/examples/README.md
    @@ -2,20 +2,18 @@
     
     # spaCy examples
     
    -The examples are Python scripts with well-behaved command line interfaces. For a full list of spaCy tutorials and code snippets, see the [documentation](https://spacy.io/docs/usage/tutorials).
    +The examples are Python scripts with well-behaved command line interfaces. For
    +more detailed usage guides, see the [documentation](https://alpha.spacy.io/usage/).
     
    -## How to run an example
    -
    -For example, to run the [`nn_text_class.py`](nn_text_class.py) script, do:
    +To see the available arguments, you can use the `--help` or `-h` flag:
     
     ```bash
    -$ python examples/nn_text_class.py
    -usage: nn_text_class.py [-h] [-d 3] [-H 300] [-i 5] [-w 40000] [-b 24]
    -                        [-r 0.3] [-p 1e-05] [-e 0.005]
    -                        data_dir
    -nn_text_class.py: error: too few arguments
    +$ python examples/training/train_ner.py --help
     ```
     
    -You can print detailed help with the `-h` argument.
    -
    -While we try to keep the examples up to date, they are not currently exercised by the test suite, as some of them require significant data downloads or take time to train. If you find that an example is no longer running, [please tell us](https://github.com/explosion/spaCy/issues)! We know there's nothing worse than trying to figure out what you're doing wrong, and it turns out your code was never the problem.
    +While we try to keep the examples up to date, they are not currently exercised
    +by the test suite, as some of them require significant data downloads or take
    +time to train. If you find that an example is no longer running,
    +[please tell us](https://github.com/explosion/spaCy/issues)! We know there's
    +nothing worse than trying to figure out what you're doing wrong, and it turns
    +out your code was never the problem.
    
    From f81cc0bd1c59776332254a8bb3e43f3b9d0781d7 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 00:31:30 +0200
    Subject: [PATCH 545/649] Fix usage of disable_pipes
    
    ---
     examples/training/train_ner.py             | 2 +-
     examples/training/train_new_entity_type.py | 2 +-
     examples/training/train_parser.py          | 2 +-
     3 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/examples/training/train_ner.py b/examples/training/train_ner.py
    index 2e8241ffc..499807d23 100644
    --- a/examples/training/train_ner.py
    +++ b/examples/training/train_ner.py
    @@ -52,7 +52,7 @@ def main(model=None, output_dir=None, n_iter=100):
     
         # get names of other pipes to disable them during training
         other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
    -    with nlp.disable_pipes(*other_pipes) as disabled:  # only train NER
    +    with nlp.disable_pipes(*other_pipes):  # only train NER
             optimizer = nlp.begin_training(get_data)
             for itn in range(n_iter):
                 random.shuffle(TRAIN_DATA)
    diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py
    index 69ee20e04..ec1e562c6 100644
    --- a/examples/training/train_new_entity_type.py
    +++ b/examples/training/train_new_entity_type.py
    @@ -86,7 +86,7 @@ def main(model=None, new_model_name='animal', output_dir=None, n_iter=50):
     
         # get names of other pipes to disable them during training
         other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
    -    with nlp.disable_pipes(*other_pipes) as disabled:  # only train NER
    +    with nlp.disable_pipes(*other_pipes):  # only train NER
             random.seed(0)
             optimizer = nlp.begin_training(lambda: [])
             for itn in range(n_iter):
    diff --git a/examples/training/train_parser.py b/examples/training/train_parser.py
    index 8cd602bcd..30a6f6095 100644
    --- a/examples/training/train_parser.py
    +++ b/examples/training/train_parser.py
    @@ -66,7 +66,7 @@ def main(model=None, output_dir=None, n_iter=1000):
     
         # get names of other pipes to disable them during training
         other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'parser']
    -    with nlp.disable_pipes(*other_pipes) as disabled:  # only train parser
    +    with nlp.disable_pipes(*other_pipes):  # only train parser
             optimizer = nlp.begin_training(lambda: [])
             for itn in range(n_iter):
                 random.shuffle(TRAIN_DATA)
    
    From 4eb5bd02e7640465419ad1a16576d59dab2d11c0 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 00:32:12 +0200
    Subject: [PATCH 546/649] Update textcat pre-processing after to_array change
    
    ---
     spacy/_ml.py | 2 --
     1 file changed, 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 8a8d355d9..4c4e36412 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -94,7 +94,6 @@ def _zero_init(model):
     @layerize
     def _preprocess_doc(docs, drop=0.):
         keys = [doc.to_array([LOWER]) for doc in docs]
    -    keys = [a[:, 0] for a in keys]
         ops = Model.ops
         lengths = ops.asarray([arr.shape[0] for arr in keys])
         keys = ops.xp.concatenate(keys)
    @@ -521,7 +520,6 @@ def zero_init(model):
     @layerize
     def preprocess_doc(docs, drop=0.):
         keys = [doc.to_array([LOWER]) for doc in docs]
    -    keys = [a[:, 0] for a in keys]
         ops = Model.ops
         lengths = ops.asarray([arr.shape[0] for arr in keys])
         keys = ops.xp.concatenate(keys)
    
    From b61866a2e4d22842399531bf885dd6b0074b5eaa Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 00:32:19 +0200
    Subject: [PATCH 547/649] Update textcat example
    
    ---
     examples/training/train_textcat.py | 188 ++++++++++++++++-------------
     1 file changed, 102 insertions(+), 86 deletions(-)
    
    diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py
    index 4d07ed26a..2f540b530 100644
    --- a/examples/training/train_textcat.py
    +++ b/examples/training/train_textcat.py
    @@ -1,58 +1,119 @@
    -'''Train a multi-label convolutional neural network text classifier,
    -using the spacy.pipeline.TextCategorizer component. The model is then added
    -to spacy.pipeline, and predictions are available at `doc.cats`.
    -'''
    -from __future__ import unicode_literals
    +#!/usr/bin/env python
    +# coding: utf8
    +"""Train a multi-label convolutional neural network text classifier on the
    +IMDB dataset, using the TextCategorizer component. The dataset will be loaded
    +automatically via Thinc's built-in dataset loader. The model is then added to
    +spacy.pipeline, and predictions are available via `doc.cats`.
    +
    +For more details, see the documentation:
    +* Training: https://alpha.spacy.io/usage/training
    +* Text classification: https://alpha.spacy.io/usage/text-classification
    +
    +Developed for: spaCy 2.0.0a18
    +Last updated for: spaCy 2.0.0a18
    +"""
    +from __future__ import unicode_literals, print_function
     import plac
     import random
    -import tqdm
    -
    -from thinc.neural.optimizers import Adam
    -from thinc.neural.ops import NumpyOps
    +from pathlib import Path
     import thinc.extra.datasets
     
    -import spacy.lang.en
    +import spacy
     from spacy.gold import GoldParse, minibatch
     from spacy.util import compounding
     from spacy.pipeline import TextCategorizer
     
    -# TODO: Remove this once we're not supporting models trained with thinc <6.9.0
    -import thinc.neural._classes.layernorm
    -thinc.neural._classes.layernorm.set_compat_six_eight(False)
     
    +@plac.annotations(
    +    model=("Model name. Defaults to blank 'en' model.", "option", "m", str),
    +    output_dir=("Optional output directory", "option", "o", Path),
    +    n_iter=("Number of training iterations", "option", "n", int))
    +def main(model=None, output_dir=None, n_iter=20):
    +    if model is not None:
    +        nlp = spacy.load(model)  # load existing spaCy model
    +        print("Loaded model '%s'" % model)
    +    else:
    +        nlp = spacy.blank('en')  # create blank Language class
    +        print("Created blank 'en' model")
     
    -def train_textcat(tokenizer, textcat,
    -                  train_texts, train_cats, dev_texts, dev_cats,
    -                  n_iter=20):
    -    '''
    -    Train the TextCategorizer without associated pipeline.
    -    '''
    -    textcat.begin_training()
    -    optimizer = Adam(NumpyOps(), 0.001)
    -    train_docs = [tokenizer(text) for text in train_texts]
    +    # add the text classifier to the pipeline if it doesn't exist
    +    # nlp.create_pipe works for built-ins that are registered with spaCy
    +    if 'textcat' not in nlp.pipe_names:
    +        # textcat = nlp.create_pipe('textcat')
    +        textcat = TextCategorizer(nlp.vocab, labels=['POSITIVE'])
    +        nlp.add_pipe(textcat, first=True)
    +    # otherwise, get it, so we can add labels to it
    +    else:
    +        textcat = nlp.get_pipe('textcat')
    +
    +    # add label to text classifier
    +    # textcat.add_label('POSITIVE')
    +
    +    # load the IMBD dataset
    +    print("Loading IMDB data...")
    +    (train_texts, train_cats), (dev_texts, dev_cats) = load_data(limit=2000)
    +    train_docs = [nlp.tokenizer(text) for text in train_texts]
         train_gold = [GoldParse(doc, cats=cats) for doc, cats in
                       zip(train_docs, train_cats)]
         train_data = list(zip(train_docs, train_gold))
    -    batch_sizes = compounding(4., 128., 1.001)
    -    for i in range(n_iter):
    -        losses = {}
    -        # Progress bar and minibatching
    -        batches = minibatch(tqdm.tqdm(train_data, leave=False), size=batch_sizes)
    -        for batch in batches:
    -            docs, golds = zip(*batch)
    -            textcat.update(docs, golds, sgd=optimizer, drop=0.2,
    -                losses=losses)
    -        with textcat.model.use_params(optimizer.averages):
    -            scores = evaluate(tokenizer, textcat, dev_texts, dev_cats)
    -        yield losses['textcat'], scores
    +
    +    # get names of other pipes to disable them during training
    +    other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'textcat']
    +    with nlp.disable_pipes(*other_pipes):  # only train textcat
    +        optimizer = nlp.begin_training(lambda: [])
    +        print("Training the model...")
    +        print('{:^5}\t{:^5}\t{:^5}\t{:^5}'.format('LOSS', 'P', 'R', 'F'))
    +        for i in range(n_iter):
    +            losses = {}
    +            # batch up the examples using spaCy's minibatch
    +            batches = minibatch(train_data, size=compounding(4., 128., 1.001))
    +            for batch in batches:
    +                docs, golds = zip(*batch)
    +                nlp.update(docs, golds, sgd=optimizer, drop=0.2, losses=losses)
    +            with textcat.model.use_params(optimizer.averages):
    +                # evaluate on the dev data split off in load_data()
    +                scores = evaluate(nlp.tokenizer, textcat, dev_texts, dev_cats)
    +            print('{0:.3f}\t{0:.3f}\t{0:.3f}\t{0:.3f}'  # print a simple table
    +                  .format(losses['textcat'], scores['textcat_p'],
    +                          scores['textcat_r'], scores['textcat_f']))
    +
    +    # test the trained model
    +    test_text = "This movie sucked"
    +    doc = nlp(test_text)
    +    print(test_text, doc.cats)
    +
    +    if output_dir is not None:
    +        output_dir = Path(output_dir)
    +        if not output_dir.exists():
    +            output_dir.mkdir()
    +        nlp.to_disk(output_dir)
    +        print("Saved model to", output_dir)
    +
    +        # test the saved model
    +        print("Loading from", output_dir)
    +        nlp2 = spacy.load(output_dir)
    +        doc2 = nlp2(test_text)
    +        print(test_text, doc2.cats)
    +
    +
    +def load_data(limit=0, split=0.8):
    +    """Load data from the IMDB dataset."""
    +    # Partition off part of the train data for evaluation
    +    train_data, _ = thinc.extra.datasets.imdb()
    +    random.shuffle(train_data)
    +    train_data = train_data[-limit:]
    +    texts, labels = zip(*train_data)
    +    cats = [{'POSITIVE': bool(y)} for y in labels]
    +    split = int(len(train_data) * split)
    +    return (texts[:split], cats[:split]), (texts[split:], cats[split:])
     
     
     def evaluate(tokenizer, textcat, texts, cats):
         docs = (tokenizer(text) for text in texts)
    -    tp = 1e-8 # True positives
    -    fp = 1e-8 # False positives
    -    fn = 1e-8 # False negatives
    -    tn = 1e-8 # True negatives
    +    tp = 1e-8  # True positives
    +    fp = 1e-8  # False positives
    +    fn = 1e-8  # False negatives
    +    tn = 1e-8  # True negatives
         for i, doc in enumerate(textcat.pipe(docs)):
             gold = cats[i]
             for label, score in doc.cats.items():
    @@ -66,55 +127,10 @@ def evaluate(tokenizer, textcat, texts, cats):
                     tn += 1
                 elif score < 0.5 and gold[label] >= 0.5:
                     fn += 1
    -    precis = tp / (tp + fp)
    +    precision = tp / (tp + fp)
         recall = tp / (tp + fn)
    -    fscore = 2 * (precis * recall) / (precis + recall)
    -    return {'textcat_p': precis, 'textcat_r': recall, 'textcat_f': fscore}
    -
    -
    -def load_data(limit=0):
    -    # Partition off part of the train data --- avoid running experiments
    -    # against test.
    -    train_data, _ = thinc.extra.datasets.imdb()
    -
    -    random.shuffle(train_data)
    -    train_data = train_data[-limit:]
    -
    -    texts, labels = zip(*train_data)
    -    cats = [{'POSITIVE': bool(y)} for y in labels]
    -
    -    split = int(len(train_data) * 0.8)
    -
    -    train_texts = texts[:split]
    -    train_cats = cats[:split]
    -    dev_texts = texts[split:]
    -    dev_cats = cats[split:]
    -    return (train_texts, train_cats), (dev_texts, dev_cats)
    -
    -
    -def main(model_loc=None):
    -    nlp = spacy.lang.en.English()
    -    tokenizer = nlp.tokenizer
    -    textcat = TextCategorizer(tokenizer.vocab, labels=['POSITIVE'])
    -
    -    print("Load IMDB data")
    -    (train_texts, train_cats), (dev_texts, dev_cats) = load_data(limit=2000)
    -
    -    print("Itn.\tLoss\tP\tR\tF")
    -    progress = '{i:d} {loss:.3f} {textcat_p:.3f} {textcat_r:.3f} {textcat_f:.3f}'
    -
    -    for i, (loss, scores) in enumerate(train_textcat(tokenizer, textcat,
    -                                       train_texts, train_cats,
    -                                       dev_texts, dev_cats, n_iter=20)):
    -        print(progress.format(i=i, loss=loss, **scores))
    -    # How to save, load and use
    -    nlp.pipeline.append(textcat)
    -    if model_loc is not None:
    -        nlp.to_disk(model_loc)
    -
    -        nlp = spacy.load(model_loc)
    -        doc = nlp(u'This movie sucked!')
    -        print(doc.cats)
    +    f_score = 2 * (precision * recall) / (precision + recall)
    +    return {'textcat_p': precision, 'textcat_r': recall, 'textcat_f': f_score}
     
     
     if __name__ == '__main__':
    
    From a7b9074b4c06920d86e610647abbb550cf2f16c3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 00:48:45 +0200
    Subject: [PATCH 548/649] Update textcat training example and docs
    
    ---
     examples/training/train_textcat.py     |  4 +-
     website/usage/_training/_textcat.jade  | 62 +++++++++++++++++++++++---
     website/usage/examples.jade            |  9 ++--
     website/usage/text-classification.jade |  6 +--
     4 files changed, 65 insertions(+), 16 deletions(-)
    
    diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py
    index 2f540b530..1f9cd29aa 100644
    --- a/examples/training/train_textcat.py
    +++ b/examples/training/train_textcat.py
    @@ -2,7 +2,7 @@
     # coding: utf8
     """Train a multi-label convolutional neural network text classifier on the
     IMDB dataset, using the TextCategorizer component. The dataset will be loaded
    -automatically via Thinc's built-in dataset loader. The model is then added to
    +automatically via Thinc's built-in dataset loader. The model is added to
     spacy.pipeline, and predictions are available via `doc.cats`.
     
     For more details, see the documentation:
    @@ -41,7 +41,7 @@ def main(model=None, output_dir=None, n_iter=20):
         if 'textcat' not in nlp.pipe_names:
             # textcat = nlp.create_pipe('textcat')
             textcat = TextCategorizer(nlp.vocab, labels=['POSITIVE'])
    -        nlp.add_pipe(textcat, first=True)
    +        nlp.add_pipe(textcat, last=True)
         # otherwise, get it, so we can add labels to it
         else:
             textcat = nlp.get_pipe('textcat')
    diff --git a/website/usage/_training/_textcat.jade b/website/usage/_training/_textcat.jade
    index 5c90519db..ad863bce1 100644
    --- a/website/usage/_training/_textcat.jade
    +++ b/website/usage/_training/_textcat.jade
    @@ -1,13 +1,63 @@
     //- 💫 DOCS > USAGE > TRAINING > TEXT CLASSIFICATION
     
    -+under-construction
    -
    -+h(3, "example-textcat") Example: Training spaCy's text classifier
    ++h(3, "example-textcat") Adding a text classifier to a spaCy model
         +tag-new(2)
     
     p
    -    |  This example shows how to use and train spaCy's new
    -    |  #[+api("textcategorizer") #[code TextCategorizer]] pipeline component
    -    |  on IMDB movie reviews.
    +    |  This example shows how to train a multi-label convolutional neural
    +    |  network text classifier on IMDB movie reviews, using spaCy's new
    +    |  #[+api("textcategorizer") #[code TextCategorizer]] component. The
    +    |  dataset will be loaded automatically via Thinc's built-in dataset
    +    |  loader. Predictions are available via
    +    |  #[+api("doc#attributes") #[code Doc.cats]].
     
     +github("spacy", "examples/training/train_textcat.py")
    +
    ++h(4) Step by step guide
    +
    ++list("numbers")
    +    +item
    +        |  #[strong Load the model] you want to start with, or create an
    +        |  #[strong empty model] using
    +        |  #[+api("spacy#blank") #[code spacy.blank]] with the ID of your
    +        |  language. If you're using a blank model, don't forget to add the
    +        |  parser to the pipeline. If you're using an existing model,
    +        |  make sure to disable all other pipeline components during training
    +        |  using #[+api("language#disable_pipes") #[code nlp.disable_pipes]].
    +        |  This way, you'll only be training the parser.
    +
    +    +item
    +        |  #[strong Add the text classifier] to the pipeline, and add the labels
    +        |  you want to train – for example, #[code POSITIVE].
    +
    +    +item
    +        |  #[strong Load and pre-process the dataset], shuffle the data and
    +        |  split off a part of it to hold back for evaluation. This way, you'll
    +        |  be able to see results on each training iteration.
    +
    +    +item
    +        |  #[strong Loop over] the training examples, partition them into
    +        |  batches and create #[code Doc] and #[code GoldParse] objects for each
    +        |  example in the batch.
    +
    +    +item
    +        |  #[strong Update the model] by calling
    +        |  #[+api("language#update") #[code nlp.update]], which steps
    +        |  through the examples and makes a #[strong prediction]. It then
    +        |  consults the annotations provided on the #[code GoldParse] instance,
    +        |  to see whether it was right. If it was wrong, it adjusts its weights
    +        |  so that the correct prediction will score higher next time.
    +
    +    +item
    +        |  Optionally, you can also #[strong evaluate the text classifier] on
    +        |  each iteration, by checking how it performs on the development data
    +        |  held back from the dataset. This lets you print the
    +        |  #[strong precision], #[strong recall] and #[strong F-score].
    +
    +    +item
    +        |  #[strong Save] the trained model using
    +        |  #[+api("language#to_disk") #[code nlp.to_disk]].
    +
    +    +item
    +        |  #[strong Test] the model to make sure the text classifier works as
    +        |  expected.
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 808810364..525d584a1 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -113,9 +113,12 @@ include ../_includes/_mixins
             +tag-new(2)
     
         p
    -        |  This example shows how to use and train spaCy's new
    -        |  #[+api("textcategorizer") #[code TextCategorizer]] pipeline component
    -        |  on IMDB movie reviews.
    +        |  This example shows how to train a multi-label convolutional neural
    +        |  network text classifier on IMDB movie reviews, using spaCy's new
    +        |  #[+api("textcategorizer") #[code TextCategorizer]] component. The
    +        |  dataset will be loaded automatically via Thinc's built-in dataset
    +        |  loader. Predictions are available via
    +        |  #[+api("doc#attributes") #[code Doc.cats]].
     
         +github("spacy", "examples/training/train_textcat.py")
     
    diff --git a/website/usage/text-classification.jade b/website/usage/text-classification.jade
    index 8a0e93450..9e43d185c 100644
    --- a/website/usage/text-classification.jade
    +++ b/website/usage/text-classification.jade
    @@ -2,8 +2,4 @@
     
     include ../_includes/_mixins
     
    -+under-construction
    -
    -+h(2, "example") Example
    -
    -+github("spacy", "examples/training/train_textcat.py")
    +include _training/_textcat
    
    From 647ef64f8696d667481c149cefba269b2dae9755 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 00:51:29 +0200
    Subject: [PATCH 549/649] Update textcat docs
    
    ---
     website/usage/_training/_textcat.jade | 9 ++++-----
     1 file changed, 4 insertions(+), 5 deletions(-)
    
    diff --git a/website/usage/_training/_textcat.jade b/website/usage/_training/_textcat.jade
    index ad863bce1..5ccff7a84 100644
    --- a/website/usage/_training/_textcat.jade
    +++ b/website/usage/_training/_textcat.jade
    @@ -20,11 +20,10 @@ p
             |  #[strong Load the model] you want to start with, or create an
             |  #[strong empty model] using
             |  #[+api("spacy#blank") #[code spacy.blank]] with the ID of your
    -        |  language. If you're using a blank model, don't forget to add the
    -        |  parser to the pipeline. If you're using an existing model,
    -        |  make sure to disable all other pipeline components during training
    -        |  using #[+api("language#disable_pipes") #[code nlp.disable_pipes]].
    -        |  This way, you'll only be training the parser.
    +        |  language. If you're using an existing model, make sure to disable all
    +        |  other pipeline components during training using
    +        |  #[+api("language#disable_pipes") #[code nlp.disable_pipes]]. This
    +        |  way, you'll only be training the text classifier.
     
         +item
             |  #[strong Add the text classifier] to the pipeline, and add the labels
    
    From 096a80170d23365e1b8ff9d3749bb6caa379abdd Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 01:48:39 +0200
    Subject: [PATCH 550/649] Remove old example files
    
    ---
     examples/_handler.py       | 37 -------------------
     examples/parallel_parse.py | 74 --------------------------------------
     2 files changed, 111 deletions(-)
     delete mode 100644 examples/_handler.py
     delete mode 100644 examples/parallel_parse.py
    
    diff --git a/examples/_handler.py b/examples/_handler.py
    deleted file mode 100644
    index cebfe8968..000000000
    --- a/examples/_handler.py
    +++ /dev/null
    @@ -1,37 +0,0 @@
    -# encoding: utf8
    -from __future__ import unicode_literals, print_function
    -
    -from math import sqrt
    -from numpy import dot
    -from numpy.linalg import norm
    -
    -
    -def handle_tweet(spacy, tweet_data, query):
    -    text = tweet_data.get('text', u'')
    -    # Twython returns either bytes or unicode, depending on tweet.
    -    # ಠ_ಠ #APIshaming
    -    try:
    -        match_tweet(spacy, text, query)
    -    except TypeError:
    -        match_tweet(spacy, text.decode('utf8'), query)
    -
    -
    -def match_tweet(spacy, text, query):
    -    def get_vector(word):
    -        return spacy.vocab[word].repvec
    -
    -    tweet = spacy(text)
    -    tweet = [w.repvec for w in tweet if w.is_alpha and w.lower_ != query]
    -    if tweet:
    -        accept = map(get_vector, 'child classroom teach'.split())
    -        reject = map(get_vector, 'mouth hands giveaway'.split())
    -        
    -        y = sum(max(cos(w1, w2), 0) for w1 in tweet for w2 in accept)
    -        n = sum(max(cos(w1, w2), 0) for w1 in tweet for w2 in reject)
    -        
    -        if (y / (y + n)) >= 0.5 or True:
    -            print(text)
    -
    -
    -def cos(v1, v2):
    -    return dot(v1, v2) / (norm(v1) * norm(v2))
    diff --git a/examples/parallel_parse.py b/examples/parallel_parse.py
    deleted file mode 100644
    index 5cdd0778b..000000000
    --- a/examples/parallel_parse.py
    +++ /dev/null
    @@ -1,74 +0,0 @@
    -from __future__ import print_function, unicode_literals, division
    -import io
    -import bz2
    -import logging
    -from toolz import partition
    -from os import path
    -import re
    -
    -import spacy.en
    -from spacy.tokens import Doc
    -
    -from joblib import Parallel, delayed
    -import plac
    -import ujson
    -
    -
    -def parallelize(func, iterator, n_jobs, extra, backend='multiprocessing'):
    -    extra = tuple(extra)
    -    return Parallel(n_jobs=n_jobs, backend=backend)(delayed(func)(*(item + extra))
    -                    for item in iterator)
    -
    -
    -def iter_comments(loc):
    -    with bz2.BZ2File(loc) as file_:
    -        for i, line in enumerate(file_):
    -            yield ujson.loads(line)['body']
    -
    -
    -pre_format_re = re.compile(r'^[\`\*\~]')
    -post_format_re = re.compile(r'[\`\*\~]$')
    -url_re = re.compile(r'\[([^]]+)\]\(%%URL\)')
    -link_re = re.compile(r'\[([^]]+)\]\(https?://[^\)]+\)')
    -def strip_meta(text):
    -    text = link_re.sub(r'\1', text)
    -    text = text.replace('>', '>').replace('<', '<')
    -    text = pre_format_re.sub('', text)
    -    text = post_format_re.sub('', text)
    -    return text.strip()
    -
    -
    -def save_parses(batch_id, input_, out_dir, n_threads, batch_size):
    -    out_loc = path.join(out_dir, '%d.bin' % batch_id)
    -    if path.exists(out_loc):
    -        return None
    -    print('Batch', batch_id)
    -    nlp = spacy.en.English()
    -    nlp.matcher = None
    -    with open(out_loc, 'wb') as file_:
    -        texts = (strip_meta(text) for text in input_)
    -        texts = (text for text in texts if text.strip())
    -        for doc in nlp.pipe(texts, batch_size=batch_size, n_threads=n_threads):
    -            file_.write(doc.to_bytes())
    -
    -@plac.annotations(
    -    in_loc=("Location of input file"),
    -    out_dir=("Location of input file"),
    -    n_process=("Number of processes", "option", "p", int),
    -    n_thread=("Number of threads per process", "option", "t", int),
    -    batch_size=("Number of texts to accumulate in a buffer", "option", "b", int)
    -)
    -def main(in_loc, out_dir, n_process=1, n_thread=4, batch_size=100):
    -    if not path.exists(out_dir):
    -        path.join(out_dir)
    -    if n_process >= 2:
    -        texts = partition(200000, iter_comments(in_loc))
    -        parallelize(save_parses, enumerate(texts), n_process, [out_dir, n_thread, batch_size],
    -                   backend='multiprocessing')
    -    else:
    -        save_parses(0, iter_comments(in_loc), out_dir, n_thread, batch_size)
    -
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    
    From ed69bd69f4cb7dcc8ba9f70cdc2e4de197520869 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 01:48:52 +0200
    Subject: [PATCH 551/649] Update parallel tagging example
    
    ---
     examples/parallel_tag.py | 71 +++++++++++++++++++++++++++++++
     examples/pos_tag.py      | 90 ----------------------------------------
     2 files changed, 71 insertions(+), 90 deletions(-)
     create mode 100644 examples/parallel_tag.py
     delete mode 100644 examples/pos_tag.py
    
    diff --git a/examples/parallel_tag.py b/examples/parallel_tag.py
    new file mode 100644
    index 000000000..a6571a2ac
    --- /dev/null
    +++ b/examples/parallel_tag.py
    @@ -0,0 +1,71 @@
    +"""
    +Print part-of-speech tagged, true-cased, (very roughly) sentence-separated
    +text, with each "sentence" on a newline, and spaces between tokens. Supports
    +multi-processing.
    +
    +Last updated for: spaCy 2.0.0a18
    +"""
    +from __future__ import print_function, unicode_literals, division
    +from toolz import partition_all
    +from pathlib import Path
    +from joblib import Parallel, delayed
    +import thinc.extra.datasets
    +import plac
    +import spacy
    +
    +
    +@plac.annotations(
    +    output_dir=("Output directory", "positional", None, Path),
    +    model=("Model name (needs tagger)", "positional", None, str),
    +    n_jobs=("Number of workers", "option", "n", int),
    +    batch_size=("Batch-size for each process", "option", "b", int),
    +    limit=("Limit of entries from the dataset", "option", "l", int))
    +def main(output_dir, model='en_core_web_sm', n_jobs=4, batch_size=1000,
    +         limit=10000):
    +    nlp = spacy.load(model)  # load spaCy model
    +    print("Loaded model '%s'" % model)
    +    if not output_dir.exists():
    +        output_dir.mkdir()
    +    # load and pre-process the IMBD dataset
    +    print("Loading IMDB data...")
    +    data, _ = thinc.extra.datasets.imdb()
    +    texts, _ = zip(*data[-limit:])
    +    partitions = partition_all(batch_size, texts)
    +    items = ((i, [nlp(text) for text in texts], output_dir) for i, texts
    +             in enumerate(partitions))
    +    Parallel(n_jobs=n_jobs)(delayed(transform_texts)(*item) for item in items)
    +
    +
    +def transform_texts(batch_id, docs, output_dir):
    +    out_path = Path(output_dir) / ('%d.txt' % batch_id)
    +    if out_path.exists():  # return None in case same batch is called again
    +        return None
    +    print('Processing batch', batch_id)
    +    with out_path.open('w', encoding='utf8') as f:
    +        for doc in docs:
    +            f.write(' '.join(represent_word(w) for w in doc if not w.is_space))
    +            f.write('\n')
    +    print('Saved {} texts to {}.txt'.format(len(docs), batch_id))
    +
    +
    +def represent_word(word):
    +    text = word.text
    +    # True-case, i.e. try to normalize sentence-initial capitals.
    +    # Only do this if the lower-cased form is more probable.
    +    if text.istitle() and is_sent_begin(word) \
    +       and word.prob < word.doc.vocab[text.lower()].prob:
    +        text = text.lower()
    +    return text + '|' + word.tag_
    +
    +
    +def is_sent_begin(word):
    +    if word.i == 0:
    +        return True
    +    elif word.i >= 2 and word.nbor(-1).text in ('.', '!', '?', '...'):
    +        return True
    +    else:
    +        return False
    +
    +
    +if __name__ == '__main__':
    +    plac.call(main)
    diff --git a/examples/pos_tag.py b/examples/pos_tag.py
    deleted file mode 100644
    index 1dd6add0f..000000000
    --- a/examples/pos_tag.py
    +++ /dev/null
    @@ -1,90 +0,0 @@
    -"""
    -Print part-of-speech tagged, true-cased, (very roughly) sentence-separated
    -text, with each "sentence" on a newline, and spaces between tokens. Supports
    -multi-processing.
    -"""
    -from __future__ import print_function, unicode_literals, division
    -import io
    -import bz2
    -import logging
    -from toolz import partition
    -from os import path
    -
    -import spacy.en
    -
    -from joblib import Parallel, delayed
    -import plac
    -import ujson
    -
    -
    -def parallelize(func, iterator, n_jobs, extra):
    -    extra = tuple(extra)
    -    return Parallel(n_jobs=n_jobs)(delayed(func)(*(item + extra)) for item in iterator)
    -
    -
    -def iter_texts_from_json_bz2(loc):
    -    """
    -    Iterator of unicode strings, one per document (here, a comment).
    -    
    -    Expects a a path to a BZ2 file, which should be new-line delimited JSON. The
    -    document text should be in a string field titled 'body'.
    -
    -    This is the data format of the Reddit comments corpus.
    -    """
    -    with bz2.BZ2File(loc) as file_:
    -        for i, line in enumerate(file_):
    -            yield ujson.loads(line)['body']
    -
    -
    -def transform_texts(batch_id, input_, out_dir):
    -    out_loc = path.join(out_dir, '%d.txt' % batch_id)
    -    if path.exists(out_loc):
    -        return None
    -    print('Batch', batch_id)
    -    nlp = spacy.en.English(parser=False, entity=False)
    -    with io.open(out_loc, 'w', encoding='utf8') as file_:
    -        for text in input_:
    -            doc = nlp(text)
    -            file_.write(' '.join(represent_word(w) for w in doc if not w.is_space))
    -            file_.write('\n')
    -
    -
    -def represent_word(word):
    -    text = word.text
    -    # True-case, i.e. try to normalize sentence-initial capitals.
    -    # Only do this if the lower-cased form is more probable.
    -    if text.istitle() \
    -    and is_sent_begin(word) \
    -    and word.prob < word.doc.vocab[text.lower()].prob:
    -        text = text.lower()
    -    return text + '|' + word.tag_
    -
    -
    -def is_sent_begin(word):
    -    # It'd be nice to have some heuristics like these in the library, for these
    -    # times where we don't care so much about accuracy of SBD, and we don't want
    -    # to parse
    -    if word.i == 0:
    -        return True
    -    elif word.i >= 2 and word.nbor(-1).text in ('.', '!', '?', '...'):
    -        return True
    -    else:
    -        return False
    -
    -
    -@plac.annotations(
    -    in_loc=("Location of input file"),
    -    out_dir=("Location of input file"),
    -    n_workers=("Number of workers", "option", "n", int),
    -    batch_size=("Batch-size for each process", "option", "b", int)
    -)
    -def main(in_loc, out_dir, n_workers=4, batch_size=100000):
    -    if not path.exists(out_dir):
    -        path.join(out_dir)
    -    texts = partition(batch_size, iter_texts_from_json_bz2(in_loc))
    -    parallelize(transform_texts, enumerate(texts), n_workers, [out_dir])
    - 
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    -
    
    From 4eabaafd667c97c2f5e9bbd65cf2fd775b0fbef8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 01:50:44 +0200
    Subject: [PATCH 552/649] Update docstring and example
    
    ---
     examples/parallel_tag.py | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/examples/parallel_tag.py b/examples/parallel_tag.py
    index a6571a2ac..445b9fb69 100644
    --- a/examples/parallel_tag.py
    +++ b/examples/parallel_tag.py
    @@ -1,11 +1,11 @@
     """
    -Print part-of-speech tagged, true-cased, (very roughly) sentence-separated
    -text, with each "sentence" on a newline, and spaces between tokens. Supports
    -multi-processing.
    +Example of multi-processing with joblib. Here, we're exporting
    +part-of-speech-tagged, true-cased, (very roughly) sentence-separated text, with
    +each "sentence" on a newline, and spaces between tokens.
     
     Last updated for: spaCy 2.0.0a18
     """
    -from __future__ import print_function, unicode_literals, division
    +from __future__ import print_function, unicode_literals
     from toolz import partition_all
     from pathlib import Path
     from joblib import Parallel, delayed
    
    From 1d69a46cd4afa6cdc4d79e39cacf26c97d7c1c8a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 01:58:55 +0200
    Subject: [PATCH 553/649] Update multi-processing example and add to docs
    
    ---
     examples/parallel_tag.py                            |  6 ++++--
     website/usage/_data.json                            |  2 +-
     .../_processing-pipelines/_multithreading.jade      | 13 +++++++++++++
     website/usage/examples.jade                         | 13 +++++++++++++
     4 files changed, 31 insertions(+), 3 deletions(-)
    
    diff --git a/examples/parallel_tag.py b/examples/parallel_tag.py
    index 445b9fb69..19b1c462a 100644
    --- a/examples/parallel_tag.py
    +++ b/examples/parallel_tag.py
    @@ -1,7 +1,9 @@
     """
    -Example of multi-processing with joblib. Here, we're exporting
    +Example of multi-processing with Joblib. Here, we're exporting
     part-of-speech-tagged, true-cased, (very roughly) sentence-separated text, with
    -each "sentence" on a newline, and spaces between tokens.
    +each "sentence" on a newline, and spaces between tokens. Data is loaded from
    +the IMDB movie reviews dataset and will be loaded automatically via Thinc's
    +built-in dataset loader.
     
     Last updated for: spaCy 2.0.0a18
     """
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index 63e959882..4a4e6df01 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -106,7 +106,7 @@
                 "How Pipelines Work": "pipelines",
                 "Custom Components": "custom-components",
                 "Developing Extensions": "extensions",
    -            "Multi-threading": "multithreading",
    +            "Multi-Threading": "multithreading",
                 "Serialization": "serialization"
             }
         },
    diff --git a/website/usage/_processing-pipelines/_multithreading.jade b/website/usage/_processing-pipelines/_multithreading.jade
    index 1e08508b8..206879e28 100644
    --- a/website/usage/_processing-pipelines/_multithreading.jade
    +++ b/website/usage/_processing-pipelines/_multithreading.jade
    @@ -38,3 +38,16 @@ p
             |  the generator in two, and then #[code izip] the extra stream to the
             |  document stream. Here's
             |  #[+a(gh("spacy") + "/issues/172#issuecomment-183963403") an example].
    +
    ++h(3, "multi-processing-example") Example: Multi-processing with Joblib
    +
    +p
    +    |  This example shows how to use multiple cores to process text using
    +    |  spaCy and #[+a("https://pythonhosted.org/joblib/") Joblib]. We're
    +    |  exporting part-of-speech-tagged, true-cased, (very roughly)
    +    |  sentence-separated text, with each "sentence" on a newline, and
    +    |  spaces between tokens. Data is loaded from the IMDB movie reviews
    +    |  dataset and will be loaded automatically via Thinc's built-in dataset
    +    |  loader.
    +
    ++github("spacy", "examples/parallel_tag.py")
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 525d584a1..b00de183b 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -71,6 +71,19 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/pipeline/custom_attr_methods.py")
     
    +    +h(3, "parallel-tag") Multi-processing with Joblib
    +
    +    p
    +        |  This example shows how to use multiple cores to process text using
    +        |  spaCy and #[+a("https://pythonhosted.org/joblib/") Joblib]. We're
    +        |  exporting part-of-speech-tagged, true-cased, (very roughly)
    +        |  sentence-separated text, with each "sentence" on a newline, and
    +        |  spaces between tokens. Data is loaded from the IMDB movie reviews
    +        |  dataset and will be loaded automatically via Thinc's built-in dataset
    +        |  loader.
    +
    +    +github("spacy", "examples/parallel_tag.py")
    +
     +section("training")
         +h(3, "training-ner") Training spaCy's Named Entity Recognizer
     
    
    From af28ca1ba09136c5e01d4e7235c69b3b1609632b Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 02:00:01 +0200
    Subject: [PATCH 554/649] Move example to pipeline directory
    
    ---
     examples/{parallel_tag.py => pipeline/multi_processing.py} | 0
     website/usage/_processing-pipelines/_multithreading.jade   | 2 +-
     website/usage/examples.jade                                | 4 ++--
     3 files changed, 3 insertions(+), 3 deletions(-)
     rename examples/{parallel_tag.py => pipeline/multi_processing.py} (100%)
    
    diff --git a/examples/parallel_tag.py b/examples/pipeline/multi_processing.py
    similarity index 100%
    rename from examples/parallel_tag.py
    rename to examples/pipeline/multi_processing.py
    diff --git a/website/usage/_processing-pipelines/_multithreading.jade b/website/usage/_processing-pipelines/_multithreading.jade
    index 206879e28..a80768f38 100644
    --- a/website/usage/_processing-pipelines/_multithreading.jade
    +++ b/website/usage/_processing-pipelines/_multithreading.jade
    @@ -50,4 +50,4 @@ p
         |  dataset and will be loaded automatically via Thinc's built-in dataset
         |  loader.
     
    -+github("spacy", "examples/parallel_tag.py")
    ++github("spacy", "examples/pipeline/multi_processing.py")
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index b00de183b..a97471dbe 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -71,7 +71,7 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/pipeline/custom_attr_methods.py")
     
    -    +h(3, "parallel-tag") Multi-processing with Joblib
    +    +h(3, "multi-processing") Multi-processing with Joblib
     
         p
             |  This example shows how to use multiple cores to process text using
    @@ -82,7 +82,7 @@ include ../_includes/_mixins
             |  dataset and will be loaded automatically via Thinc's built-in dataset
             |  loader.
     
    -    +github("spacy", "examples/parallel_tag.py")
    +    +github("spacy", "examples/pipeline/multi_processing.py")
     
     +section("training")
         +h(3, "training-ner") Training spaCy's Named Entity Recognizer
    
    From 3ed71c46be73a03d38e7157d44ede4fd80634ded Mon Sep 17 00:00:00 2001
    From: Ines Montani 
    Date: Fri, 27 Oct 2017 02:29:40 +0200
    Subject: [PATCH 555/649] Update README.rst
    
    ---
     README.rst | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.rst b/README.rst
    index 9cffd2cae..a503abbc0 100644
    --- a/README.rst
    +++ b/README.rst
    @@ -42,7 +42,7 @@ integration. It's commercial open-source software, released under the MIT licens
     ===================  ===
     `spaCy 101`_         New to spaCy? Here's everything you need to know!
     `Usage Guides`_      How to use spaCy and its features.
    -`New in v2.0`_       New features, backwards incompatibilitiies and migration guide.
    +`New in v2.0`_       New features, backwards incompatibilities and migration guide.
     `API Reference`_     The detailed reference for spaCy's API.
     `Models`_            Download statistical language models for spaCy.
     `Resources`_         Libraries, extensions, demos, books and courses.
    
    From 44f83b35bc86b791d80ad52c4f44c82559be4507 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 02:58:14 +0200
    Subject: [PATCH 556/649] Update pipeline component examples to use plac
    
    ---
     examples/pipeline/custom_attr_methods.py      | 63 ++++++++++++------
     .../custom_component_countries_api.py         | 65 ++++++++++++-------
     .../pipeline/custom_component_entities.py     | 60 ++++++++++++-----
     3 files changed, 129 insertions(+), 59 deletions(-)
    
    diff --git a/examples/pipeline/custom_attr_methods.py b/examples/pipeline/custom_attr_methods.py
    index 9b1a8325d..741541b06 100644
    --- a/examples/pipeline/custom_attr_methods.py
    +++ b/examples/pipeline/custom_attr_methods.py
    @@ -1,35 +1,60 @@
    +#!/usr/bin/env python
     # coding: utf-8
     """This example contains several snippets of methods that can be set via custom
     Doc, Token or Span attributes in spaCy v2.0. Attribute methods act like
     they're "bound" to the object and are partially applied – i.e. the object
    -they're called on is passed in as the first argument."""
    +they're called on is passed in as the first argument.
    +
    +* Custom pipeline components: https://alpha.spacy.io//usage/processing-pipelines#custom-components
    +
    +Developed for: spaCy 2.0.0a17
    +Last updated for: spaCy 2.0.0a18
    +"""
     from __future__ import unicode_literals
     
    +import plac
     from spacy.lang.en import English
     from spacy.tokens import Doc, Span
     from spacy import displacy
     from pathlib import Path
     
     
    +@plac.annotations(
    +    output_dir=("Output directory for saved HTML", "positional", None, Path))
    +def main(output_dir=None):
    +    nlp = English()  # start off with blank English class
    +
    +    Doc.set_extension('overlap', method=overlap_tokens)
    +    doc1 = nlp(u"Peach emoji is where it has always been.")
    +    doc2 = nlp(u"Peach is the superior emoji.")
    +    print("Text 1:", doc1.text)
    +    print("Text 2:", doc2.text)
    +    print("Overlapping tokens:", doc1._.overlap(doc2))
    +
    +    Doc.set_extension('to_html', method=to_html)
    +    doc = nlp(u"This is a sentence about Apple.")
    +    # add entity manually for demo purposes, to make it work without a model
    +    doc.ents = [Span(doc, 5, 6, label=nlp.vocab.strings['ORG'])]
    +    print("Text:", doc.text)
    +    doc._.to_html(output=output_dir, style='ent')
    +
    +
     def to_html(doc, output='/tmp', style='dep'):
         """Doc method extension for saving the current state as a displaCy
         visualization.
         """
         # generate filename from first six non-punct tokens
         file_name = '-'.join([w.text for w in doc[:6] if not w.is_punct]) + '.html'
    -    output_path = Path(output) / file_name
         html = displacy.render(doc, style=style, page=True)  # render markup
    -    output_path.open('w', encoding='utf-8').write(html)  # save to file
    -    print('Saved HTML to {}'.format(output_path))
    -
    -
    -Doc.set_extension('to_html', method=to_html)
    -
    -nlp = English()
    -doc = nlp(u"This is a sentence about Apple.")
    -# add entity manually for demo purposes, to make it work without a model
    -doc.ents = [Span(doc, 5, 6, label=nlp.vocab.strings['ORG'])]
    -doc._.to_html(style='ent')
    +    if output is not None:
    +        output_path = Path(output)
    +        if not output_path.exists():
    +            output_path.mkdir()
    +        output_file = Path(output) / file_name
    +        output_file.open('w', encoding='utf-8').write(html)  # save to file
    +        print('Saved HTML to {}'.format(output_file))
    +    else:
    +        print(html)
     
     
     def overlap_tokens(doc, other_doc):
    @@ -43,10 +68,10 @@ def overlap_tokens(doc, other_doc):
         return overlap
     
     
    -Doc.set_extension('overlap', method=overlap_tokens)
    +if __name__ == '__main__':
    +    plac.call(main)
     
    -nlp = English()
    -doc1 = nlp(u"Peach emoji is where it has always been.")
    -doc2 = nlp(u"Peach is the superior emoji.")
    -tokens = doc1._.overlap(doc2)
    -print(tokens)
    +    # Expected output:
    +    # Text 1: Peach emoji is where it has always been.
    +    # Text 2: Peach is the superior emoji.
    +    # Overlapping tokens: [Peach, emoji, is, .]
    diff --git a/examples/pipeline/custom_component_countries_api.py b/examples/pipeline/custom_component_countries_api.py
    index 2554af967..38eec7384 100644
    --- a/examples/pipeline/custom_component_countries_api.py
    +++ b/examples/pipeline/custom_component_countries_api.py
    @@ -1,21 +1,45 @@
    -# coding: utf-8
    +#!/usr/bin/env python
    +# coding: utf8
    +"""Example of a spaCy v2.0 pipeline component that requests all countries via
    +the REST Countries API, merges country names into one token, assigns entity
    +labels and sets attributes on country tokens, e.g. the capital and lat/lng
    +coordinates. Can be extended with more details from the API.
    +
    +* REST Countries API: https://restcountries.eu (Mozilla Public License MPL 2.0)
    +* Custom pipeline components: https://alpha.spacy.io//usage/processing-pipelines#custom-components
    +
    +Developed for: spaCy 2.0.0a17
    +Last updated for: spaCy 2.0.0a18
    +"""
     from __future__ import unicode_literals
     
     import requests
    -
    +import plac
     from spacy.lang.en import English
     from spacy.matcher import PhraseMatcher
     from spacy.tokens import Doc, Span, Token
     
     
    -class RESTCountriesComponent(object):
    -    """Example of a spaCy v2.0 pipeline component that requests all countries
    -    via the REST Countries API, merges country names into one token, assigns
    -    entity labels and sets attributes on country tokens, e.g. the capital and
    -    lat/lng coordinates. Can be extended with more details from the API.
    +def main():
    +    # For simplicity, we start off with only the blank English Language class
    +    # and no model or pre-defined pipeline loaded.
    +    nlp = English()
    +    rest_countries = RESTCountriesComponent(nlp)  # initialise component
    +    nlp.add_pipe(rest_countries) # add it to the pipeline
    +    doc = nlp(u"Some text about Colombia and the Czech Republic")
    +    print('Pipeline', nlp.pipe_names)  # pipeline contains component name
    +    print('Doc has countries', doc._.has_country)  # Doc contains countries
    +    for token in doc:
    +        if token._.is_country:
    +            print(token.text, token._.country_capital, token._.country_latlng,
    +                token._.country_flag)  # country data
    +    print('Entities', [(e.text, e.label_) for e in doc.ents])  # entities
     
    -    REST Countries API: https://restcountries.eu
    -    API License: Mozilla Public License MPL 2.0
    +
    +class RESTCountriesComponent(object):
    +    """spaCy v2.0 pipeline component that requests all countries via
    +    the REST Countries API, merges country names into one token, assigns entity
    +    labels and sets attributes on country tokens.
         """
         name = 'rest_countries' # component name, will show up in the pipeline
     
    @@ -90,19 +114,12 @@ class RESTCountriesComponent(object):
             return any([t._.get('is_country') for t in tokens])
     
     
    -# For simplicity, we start off with only the blank English Language class and
    -# no model or pre-defined pipeline loaded.
    +if __name__ == '__main__':
    +    plac.call(main)
     
    -nlp = English()
    -rest_countries = RESTCountriesComponent(nlp)  # initialise component
    -nlp.add_pipe(rest_countries) # add it to the pipeline
    -
    -doc = nlp(u"Some text about Colombia and the Czech Republic")
    -
    -print('Pipeline', nlp.pipe_names)  # pipeline contains component name
    -print('Doc has countries', doc._.has_country)  # Doc contains countries
    -for token in doc:
    -    if token._.is_country:
    -        print(token.text, token._.country_capital, token._.country_latlng,
    -              token._.country_flag)  # country data
    -print('Entities', [(e.text, e.label_) for e in doc.ents])  # all countries are entities
    +    # Expected output:
    +    # Pipeline ['rest_countries']
    +    # Doc has countries True
    +    # Colombia Bogotá [4.0, -72.0] https://restcountries.eu/data/col.svg
    +    # Czech Republic Prague [49.75, 15.5] https://restcountries.eu/data/cze.svg
    +    # Entities [('Colombia', 'GPE'), ('Czech Republic', 'GPE')]
    diff --git a/examples/pipeline/custom_component_entities.py b/examples/pipeline/custom_component_entities.py
    index a0d9c61ec..050a89905 100644
    --- a/examples/pipeline/custom_component_entities.py
    +++ b/examples/pipeline/custom_component_entities.py
    @@ -1,11 +1,45 @@
    -# coding: utf-8
    +#!/usr/bin/env python
    +# coding: utf8
    +"""Example of a spaCy v2.0 pipeline component that sets entity annotations
    +based on list of single or multiple-word company names. Companies are
    +labelled as ORG and their spans are merged into one token. Additionally,
    +._.has_tech_org and ._.is_tech_org is set on the Doc/Span and Token
    +respectively.
    +
    +* Custom pipeline components: https://alpha.spacy.io//usage/processing-pipelines#custom-components
    +
    +Developed for: spaCy 2.0.0a17
    +Last updated for: spaCy 2.0.0a18
    +"""
     from __future__ import unicode_literals
     
    +import plac
     from spacy.lang.en import English
     from spacy.matcher import PhraseMatcher
     from spacy.tokens import Doc, Span, Token
     
     
    +@plac.annotations(
    +    text=("Text to process", "positional", None, str),
    +    companies=("Names of technology companies", "positional", None, str))
    +def main(text="Alphabet Inc. is the company behind Google.", *companies):
    +    # For simplicity, we start off with only the blank English Language class
    +    # and no model or pre-defined pipeline loaded.
    +    nlp = English()
    +    if not companies:  # set default companies if none are set via args
    +        companies = ['Alphabet Inc.', 'Google', 'Netflix', 'Apple']  # etc.
    +    component = TechCompanyRecognizer(nlp, companies)  # initialise component
    +    nlp.add_pipe(component, last=True)  # add last to the pipeline
    +
    +    doc = nlp(text)
    +    print('Pipeline', nlp.pipe_names)  # pipeline contains component name
    +    print('Tokens', [t.text for t in doc])  # company names from the list are merged
    +    print('Doc has_tech_org', doc._.has_tech_org)  # Doc contains tech orgs
    +    print('Token 0 is_tech_org', doc[0]._.is_tech_org)  # "Alphabet Inc." is a tech org
    +    print('Token 1 is_tech_org', doc[1]._.is_tech_org)  # "is" is not
    +    print('Entities', [(e.text, e.label_) for e in doc.ents])  # all orgs are entities
    +
    +
     class TechCompanyRecognizer(object):
         """Example of a spaCy v2.0 pipeline component that sets entity annotations
         based on list of single or multiple-word company names. Companies are
    @@ -67,19 +101,13 @@ class TechCompanyRecognizer(object):
             return any([t._.get('is_tech_org') for t in tokens])
     
     
    -# For simplicity, we start off with only the blank English Language class and
    -# no model or pre-defined pipeline loaded.
    +if __name__ == '__main__':
    +    plac.call(main)
     
    -nlp = English()
    -companies = ['Alphabet Inc.', 'Google', 'Netflix', 'Apple']  # etc.
    -component = TechCompanyRecognizer(nlp, companies)  # initialise component
    -nlp.add_pipe(component, last=True)  # add it to the pipeline as the last element
    -
    -doc = nlp(u"Alphabet Inc. is the company behind Google.")
    -
    -print('Pipeline', nlp.pipe_names)  # pipeline contains component name
    -print('Tokens', [t.text for t in doc])  # company names from the list are merged
    -print('Doc has_tech_org', doc._.has_tech_org)  # Doc contains tech orgs
    -print('Token 0 is_tech_org', doc[0]._.is_tech_org)  # "Alphabet Inc." is a tech org
    -print('Token 1 is_tech_org', doc[1]._.is_tech_org)  # "is" is not
    -print('Entities', [(e.text, e.label_) for e in doc.ents])  # all orgs are entities
    +    # Expected output:
    +    # Pipeline ['tech_companies']
    +    # Tokens ['Alphabet Inc.', 'is', 'the', 'company', 'behind', 'Google', '.']
    +    # Doc has_tech_org True
    +    # Token 0 is_tech_org True
    +    # Token 1 is_tech_org False
    +    # Entities [('Alphabet Inc.', 'ORG'), ('Google', 'ORG')]
    
    From bb25bdcd923534108691174850449f98711c6834 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 01:16:55 +0000
    Subject: [PATCH 557/649] Adjust call to scatter_add for the new version
    
    ---
     spacy/syntax/nn_parser.pyx | 11 +++++------
     1 file changed, 5 insertions(+), 6 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index c9a4926fc..96fdbab6d 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -1,5 +1,4 @@
     # cython: infer_types=True
    -# cython: profile=True
     # cython: cdivision=True
     # cython: boundscheck=False
     # coding: utf-8
    @@ -435,8 +434,7 @@ cdef class Parser:
             cdef int nr_hidden = hidden_weights.shape[0]
             cdef int nr_task = states.size()
             with nogil:
    -            for i in cython.parallel.prange(nr_task, num_threads=2,
    -                                            schedule='guided'):
    +            for i in range(nr_task):
                     self._parseC(states[i],
                         feat_weights, bias, hW, hb,
                         nr_class, nr_hidden, nr_feat, nr_piece)
    @@ -697,9 +695,10 @@ cdef class Parser:
             xp = get_array_module(d_tokvecs)
             for ids, d_vector, bp_vector in backprops:
                 d_state_features = bp_vector(d_vector, sgd=sgd)
    -            mask = ids >= 0
    -            d_state_features *= mask.reshape(ids.shape + (1,))
    -            self.model[0].ops.scatter_add(d_tokvecs, ids * mask,
    +            ids = ids.flatten()
    +            d_state_features = d_state_features.reshape(
    +                (ids.size, d_state_features.shape[2]))
    +            self.model[0].ops.scatter_add(d_tokvecs, ids,
                     d_state_features)
             bp_tokvecs(d_tokvecs, sgd=sgd)
     
    
    From 783c0c87958e0af281f346de8d1957b93000c74a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 01:17:54 +0000
    Subject: [PATCH 558/649] Remove unnecessary bz2 import
    
    ---
     spacy/vocab.pyx | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index bcd1f3c10..1a91c2c0e 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -1,7 +1,6 @@
     # coding: utf8
     from __future__ import unicode_literals
     
    -import bz2
     import ujson
     import re
     import numpy
    
    From b9616419e1395745ce59288d01e591d72f80f0c8 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 01:18:05 +0000
    Subject: [PATCH 559/649] Add try/except around bz2 import
    
    ---
     spacy/cli/model.py | 7 +++++--
     1 file changed, 5 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/cli/model.py b/spacy/cli/model.py
    index 14e75647e..bcc1626bc 100644
    --- a/spacy/cli/model.py
    +++ b/spacy/cli/model.py
    @@ -1,8 +1,11 @@
     # coding: utf8
     from __future__ import unicode_literals
     
    -import bz2
    -import gzip
    +try:
    +    import bz2
    +    import gzip
    +except ImportError:
    +    pass
     import math
     from ast import literal_eval
     from pathlib import Path
    
    From 4d272e25eeb2360c27a8adc6719e416e48b3a5de Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 03:55:04 +0200
    Subject: [PATCH 560/649] Fix examples
    
    ---
     examples/pipeline/custom_attr_methods.py            | 2 +-
     examples/pipeline/custom_component_countries_api.py | 2 +-
     examples/pipeline/custom_component_entities.py      | 2 +-
     examples/training/train_parser.py                   | 2 +-
     4 files changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/examples/pipeline/custom_attr_methods.py b/examples/pipeline/custom_attr_methods.py
    index 741541b06..18d6b482a 100644
    --- a/examples/pipeline/custom_attr_methods.py
    +++ b/examples/pipeline/custom_attr_methods.py
    @@ -10,7 +10,7 @@ they're called on is passed in as the first argument.
     Developed for: spaCy 2.0.0a17
     Last updated for: spaCy 2.0.0a18
     """
    -from __future__ import unicode_literals
    +from __future__ import unicode_literals, print_function
     
     import plac
     from spacy.lang.en import English
    diff --git a/examples/pipeline/custom_component_countries_api.py b/examples/pipeline/custom_component_countries_api.py
    index 38eec7384..e7371e205 100644
    --- a/examples/pipeline/custom_component_countries_api.py
    +++ b/examples/pipeline/custom_component_countries_api.py
    @@ -11,7 +11,7 @@ coordinates. Can be extended with more details from the API.
     Developed for: spaCy 2.0.0a17
     Last updated for: spaCy 2.0.0a18
     """
    -from __future__ import unicode_literals
    +from __future__ import unicode_literals, print_function
     
     import requests
     import plac
    diff --git a/examples/pipeline/custom_component_entities.py b/examples/pipeline/custom_component_entities.py
    index 050a89905..6b78744b7 100644
    --- a/examples/pipeline/custom_component_entities.py
    +++ b/examples/pipeline/custom_component_entities.py
    @@ -11,7 +11,7 @@ respectively.
     Developed for: spaCy 2.0.0a17
     Last updated for: spaCy 2.0.0a18
     """
    -from __future__ import unicode_literals
    +from __future__ import unicode_literals, print_function
     
     import plac
     from spacy.lang.en import English
    diff --git a/examples/training/train_parser.py b/examples/training/train_parser.py
    index 30a6f6095..a23d73ec7 100644
    --- a/examples/training/train_parser.py
    +++ b/examples/training/train_parser.py
    @@ -90,7 +90,7 @@ def main(model=None, output_dir=None, n_iter=1000):
             nlp.to_disk(output_dir)
             print("Saved model to", output_dir)
     
    -        # test the save model
    +        # test the saved model
             print("Loading from", output_dir)
             nlp2 = spacy.load(output_dir)
             doc = nlp2(test_text)
    
    From 9dfca0f2f8fb53314dfe874fd327b07239669438 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 03:55:11 +0200
    Subject: [PATCH 561/649] Add example for custom intent parser
    
    ---
     examples/training/train_intent_parser.py | 157 +++++++++++++++++++++++
     1 file changed, 157 insertions(+)
     create mode 100644 examples/training/train_intent_parser.py
    
    diff --git a/examples/training/train_intent_parser.py b/examples/training/train_intent_parser.py
    new file mode 100644
    index 000000000..e67f26aff
    --- /dev/null
    +++ b/examples/training/train_intent_parser.py
    @@ -0,0 +1,157 @@
    +#!/usr/bin/env python
    +# coding: utf-8
    +"""Using the parser to recognise your own semantics spaCy's parser component
    +can be used to trained to predict any type of tree structure over your input
    +text. You can also predict trees over whole documents or chat logs, with
    +connections between the sentence-roots used to annotate discourse structure.
    +
    +In this example, we'll build a message parser for a common "chat intent":
    +finding local businesses. Our message semantics will have the following types
    +of relations: INTENT, PLACE, QUALITY, ATTRIBUTE, TIME, LOCATION. For example:
    +
    +"show me the best hotel in berlin"
    +('show', 'ROOT', 'show')
    +('best', 'QUALITY', 'hotel') --> hotel with QUALITY best
    +('hotel', 'PLACE', 'show') --> show PLACE hotel
    +('berlin', 'LOCATION', 'hotel') --> hotel with LOCATION berlin
    +"""
    +from __future__ import unicode_literals, print_function
    +
    +import plac
    +import random
    +import spacy
    +from spacy.gold import GoldParse
    +from spacy.tokens import Doc
    +from pathlib import Path
    +
    +
    +# training data: words, head and dependency labels
    +# for no relation, we simply chose an arbitrary dependency label, e.g. '-'
    +TRAIN_DATA = [
    +    (
    +        ['find', 'a', 'cafe', 'with', 'great', 'wifi'],
    +        [0, 2, 0, 5, 5, 2],  # index of token head
    +        ['ROOT', '-', 'PLACE', '-', 'QUALITY', 'ATTRIBUTE']
    +    ),
    +    (
    +        ['find', 'a', 'hotel', 'near', 'the', 'beach'],
    +        [0, 2, 0, 5, 5, 2],
    +        ['ROOT', '-', 'PLACE', 'QUALITY', '-', 'ATTRIBUTE']
    +    ),
    +    (
    +        ['find', 'me', 'the', 'closest', 'gym', 'that', "'s", 'open', 'late'],
    +        [0, 0, 4, 4, 0, 6, 4, 6, 6],
    +        ['ROOT', '-', '-', 'QUALITY', 'PLACE', '-', '-', 'ATTRIBUTE', 'TIME']
    +    ),
    +    (
    +        ['show', 'me', 'the', 'cheapest', 'store', 'that', 'sells', 'flowers'],
    +        [0, 0, 4, 4, 0, 4, 4, 4],  # attach "flowers" to store!
    +        ['ROOT', '-', '-', 'QUALITY', 'PLACE', '-', '-', 'PRODUCT']
    +    ),
    +    (
    +        ['find', 'a', 'nice', 'restaurant', 'in', 'london'],
    +        [0, 3, 3, 0, 3, 3],
    +        ['ROOT', '-', 'QUALITY', 'PLACE', '-', 'LOCATION']
    +    ),
    +    (
    +        ['show', 'me', 'the', 'coolest', 'hostel', 'in', 'berlin'],
    +        [0, 0, 4, 4, 0, 4, 4],
    +        ['ROOT', '-', '-', 'QUALITY', 'PLACE', '-', 'LOCATION']
    +    ),
    +    (
    +        ['find', 'a', 'good', 'italian', 'restaurant', 'near', 'work'],
    +        [0, 4, 4, 4, 0, 4, 5],
    +        ['ROOT', '-', 'QUALITY', 'ATTRIBUTE', 'PLACE', 'ATTRIBUTE', 'LOCATION']
    +    )
    +]
    +
    +
    +@plac.annotations(
    +    model=("Model name. Defaults to blank 'en' model.", "option", "m", str),
    +    output_dir=("Optional output directory", "option", "o", Path),
    +    n_iter=("Number of training iterations", "option", "n", int))
    +def main(model=None, output_dir=None, n_iter=100):
    +    """Load the model, set up the pipeline and train the parser."""
    +    if model is not None:
    +        nlp = spacy.load(model)  # load existing spaCy model
    +        print("Loaded model '%s'" % model)
    +    else:
    +        nlp = spacy.blank('en')  # create blank Language class
    +        print("Created blank 'en' model")
    +
    +    # add the parser to the pipeline if it doesn't exist
    +    # nlp.create_pipe works for built-ins that are registered with spaCy
    +    if 'parser' not in nlp.pipe_names:
    +        parser = nlp.create_pipe('parser')
    +        nlp.add_pipe(parser, first=True)
    +    # otherwise, get it, so we can add labels to it
    +    else:
    +        parser = nlp.get_pipe('parser')
    +
    +    for _, _, deps in TRAIN_DATA:
    +        for dep in deps:
    +            parser.add_label(dep)
    +
    +    other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'parser']
    +    with nlp.disable_pipes(*other_pipes):  # only train parser
    +        optimizer = nlp.begin_training(lambda: [])
    +        for itn in range(n_iter):
    +            random.shuffle(TRAIN_DATA)
    +            losses = {}
    +            for words, heads, deps in TRAIN_DATA:
    +                doc = Doc(nlp.vocab, words=words)
    +                gold = GoldParse(doc, heads=heads, deps=deps)
    +                nlp.update([doc], [gold], sgd=optimizer, losses=losses)
    +            print(losses)
    +
    +    # test the trained model
    +    test_model(nlp)
    +
    +    # save model to output directory
    +    if output_dir is not None:
    +        output_dir = Path(output_dir)
    +        if not output_dir.exists():
    +            output_dir.mkdir()
    +        nlp.to_disk(output_dir)
    +        print("Saved model to", output_dir)
    +
    +        # test the saved model
    +        print("Loading from", output_dir)
    +        nlp2 = spacy.load(output_dir)
    +        test_model(nlp2)
    +
    +
    +def test_model(nlp):
    +    texts = ["find a hotel with good wifi",
    +             "find me the cheapest gym near work",
    +             "show me the best hotel in berlin"]
    +    docs = nlp.pipe(texts)
    +    for doc in docs:
    +        print(doc.text)
    +        print([(t.text, t.dep_, t.head.text) for t in doc if t.dep_ != '-'])
    +
    +
    +if __name__ == '__main__':
    +    plac.call(main)
    +
    +    # Expected output:
    +    # find a hotel with good wifi
    +    # [
    +    #   ('find', 'ROOT', 'find'),
    +    #   ('hotel', 'PLACE', 'find'),
    +    #   ('good', 'QUALITY', 'wifi'),
    +    #   ('wifi', 'ATTRIBUTE', 'hotel')
    +    # ]
    +    # find me the cheapest gym near work
    +    # [
    +    #   ('find', 'ROOT', 'find'),
    +    #   ('cheapest', 'QUALITY', 'gym'),
    +    #   ('gym', 'PLACE', 'find')
    +    # ]
    +    # show me the best hotel in berlin
    +    # [
    +    #   ('show', 'ROOT', 'show'),
    +    #   ('best', 'QUALITY', 'hotel'),
    +    #   ('hotel', 'PLACE', 'show'),
    +    #   ('berlin', 'LOCATION', 'hotel')
    +    # ]
    
    From 954c88f4d899ee10fc46147ae0c3e46e9e87bb0a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 04:48:41 +0200
    Subject: [PATCH 562/649] Fix formatting
    
    ---
     website/usage/examples.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index a97471dbe..9515e5ca3 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -136,7 +136,7 @@ include ../_includes/_mixins
         +github("spacy", "examples/training/train_textcat.py")
     
     +section("vectors")
    -    +h(3, "fasttext") Loading pre-trained FastText vectors
    +    +h(3, "fasttext") Loading pre-trained fastText vectors
     
         p
             |  This simple snippet is all you need to be able to use the Facebook's
    
    From b5643d857572e1ffcc92df4d59de76e704de38ac Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 04:49:05 +0200
    Subject: [PATCH 563/649] Update intent parser docs and add to usage docs
    
    ---
     examples/training/train_intent_parser.py    | 14 +--
     website/usage/_training/_tagger-parser.jade | 96 +++++++++++++++++++++
     website/usage/examples.jade                 | 14 +++
     3 files changed, 117 insertions(+), 7 deletions(-)
    
    diff --git a/examples/training/train_intent_parser.py b/examples/training/train_intent_parser.py
    index e67f26aff..def0ed370 100644
    --- a/examples/training/train_intent_parser.py
    +++ b/examples/training/train_intent_parser.py
    @@ -1,13 +1,13 @@
     #!/usr/bin/env python
     # coding: utf-8
    -"""Using the parser to recognise your own semantics spaCy's parser component
    -can be used to trained to predict any type of tree structure over your input
    -text. You can also predict trees over whole documents or chat logs, with
    -connections between the sentence-roots used to annotate discourse structure.
    +"""Using the parser to recognise your own semantics
     
    -In this example, we'll build a message parser for a common "chat intent":
    -finding local businesses. Our message semantics will have the following types
    -of relations: INTENT, PLACE, QUALITY, ATTRIBUTE, TIME, LOCATION. For example:
    +spaCy's parser component can be used to trained to predict any type of tree
    +structure over your input text. You can also predict trees over whole documents
    +or chat logs, with connections between the sentence-roots used to annotate
    +discourse structure. In this example, we'll build a message parser for a common
    +"chat intent": finding local businesses. Our message semantics will have the
    +following types of relations: ROOT, PLACE, QUALITY, ATTRIBUTE, TIME, LOCATION.
     
     "show me the best hotel in berlin"
     ('show', 'ROOT', 'show')
    diff --git a/website/usage/_training/_tagger-parser.jade b/website/usage/_training/_tagger-parser.jade
    index c32577a73..d8388f4d7 100644
    --- a/website/usage/_training/_tagger-parser.jade
    +++ b/website/usage/_training/_tagger-parser.jade
    @@ -95,6 +95,102 @@ p
         +item
             |  #[strong Test] the model to make sure the parser works as expected.
     
    ++h(3, "intent-parser") Training a parser for custom semantics
    +
    +p
    +    |  spaCy's parser component can be used to trained to predict any type
    +    |  of tree structure over your input text – including
    +    |  #[strong semantic relations] that are not syntactic dependencies. This
    +    |  can be useful to for #[strong conversational applications], which need to
    +    | predict trees over whole documents or chat logs, with connections between
    +    |  the sentence roots used to annotate discourse structure. For example, you
    +    |  can train spaCy's parser to label intents and their targets, like
    +    |  attributes, quality, time and locations. The result could look like this:
    +
    ++codepen("991f245ef90debb78c8fc369294f75ad", 300)
    +
    ++code.
    +    doc = nlp(u"find a hotel with good wifi")
    +    print([(t.text, t.dep_, t.head.text) for t in doc if t.dep_ != '-'])
    +    # [('find', 'ROOT', 'find'), ('hotel', 'PLACE', 'find'),
    +    #  ('good', 'QUALITY', 'wifi'), ('wifi', 'ATTRIBUTE', 'hotel')]
    +
    +p
    +    |  The above tree attaches "wifi" to "hotel" and assigns the dependency
    +    |  label #[code ATTRIBUTE]. This may not be a correct syntactic dependency –
    +    |  but in this case, it expresses exactly what we need: the user is looking
    +    |  for a hotel with the attribute "wifi" of the quality "good". This query
    +    |  can then be processed by your application and used to trigger the
    +    |  respective action – e.g. search the database for hotels with high ratings
    +    |  for their wifi offerings.
    +
    ++aside("Tip: merge phrases and entities")
    +    |  To achieve even better accuracy, try merging multi-word tokens and
    +    |  entities specific to your domain into one token before parsing your text.
    +    |  You can do this by running the entity recognizer or
    +    |  #[+a("/usage/linguistic-features#rule-based-matching") rule-based matcher]
    +    |  to find relevant spans, and merging them using
    +    |  #[+api("span#merge") #[code Span.merge]]. You could even add your own
    +    |  custom #[+a("/usage/processing-pipelines#custom-components") pipeline component]
    +    |  to do this automatically – just make sure to add it #[code before='parser'].
    +
    +p
    +    |  The following example example shows a full implementation of a training
    +    |  loop for a custom message parser for a common "chat intent": finding
    +    |  local businesses. Our message semantics will have the following types
    +    |  of relations: #[code ROOT], #[code PLACE], #[code QUALITY],
    +    |  #[code ATTRIBUTE], #[code TIME] and #[code LOCATION].
    +
    ++github("spacy", "examples/training/train_intent_parser.py")
    +
    ++h(4) Step by step guide
    +
    ++list("numbers")
    +    +item
    +        |  #[strong Create the training data] consisting of words, their heads
    +        |  and their dependency labels in order. A token's head is the index
    +        |  of the token it is attached to. The heads don't need to be
    +        |  syntactically correct – they should express the
    +        |  #[strong semantic relations] you want the parser to learn. For words
    +        |  that shouldn't receive a label, you can choose an arbitrary
    +        |  placeholder, for example #[code -].
    +
    +    +item
    +        |  #[strong Load the model] you want to start with, or create an
    +        |  #[strong empty model] using
    +        |  #[+api("spacy#blank") #[code spacy.blank]] with the ID of your
    +        |  language. If you're using a blank model, don't forget to add the
    +        |  parser to the pipeline. If you're using an existing model,
    +        |  make sure to disable all other pipeline components during training
    +        |  using #[+api("language#disable_pipes") #[code nlp.disable_pipes]].
    +        |  This way, you'll only be training the parser.
    +
    +    +item
    +        |  #[strong Add the dependency labels] to the parser using the
    +        |  #[+api("dependencyparser#add_label") #[code add_label]] method.
    +
    +    +item
    +        |  #[strong Shuffle and loop over] the examples and create a
    +        |  #[code Doc] and #[code GoldParse] object for each example. Make sure
    +        |  to pass in the #[code heads] and #[code deps] when you create the
    +        |  #[code GoldParse].
    +
    +    +item
    +        |  For each example, #[strong update the model]
    +        |  by calling #[+api("language#update") #[code nlp.update]], which steps
    +        |  through the words of the input. At each word, it makes a
    +        |  #[strong prediction]. It then consults the annotations provided on the
    +        |  #[code GoldParse] instance, to see whether it was
    +        |  right. If it was wrong, it adjusts its weights so that the correct
    +        |  action will score higher next time.
    +
    +    +item
    +        |  #[strong Save] the trained model using
    +        |  #[+api("language#to_disk") #[code nlp.to_disk]].
    +
    +    +item
    +        |  #[strong Test] the model to make sure the parser works as expected.
    +
     +h(3, "training-json") JSON format for training
     
     include ../../api/_annotation/_training
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 9515e5ca3..5e415af8f 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -122,6 +122,20 @@ include ../_includes/_mixins
     
         +github("spacy", "examples/training/train_tagger.py")
     
    +    +h(3, "intent-parser") Training a custom parser for chat intent semantics
    +
    +    p
    +        |  spaCy's parser component can be used to trained to predict any type
    +        |  of tree structure over your input text. You can also predict trees
    +        |  over whole documents or chat logs, with connections between the
    +        |  sentence-roots used to annotate discourse structure. In this example,
    +        |  we'll build a message parser for a common "chat intent": finding
    +        |  local businesses. Our message semantics will have the following types
    +        |  of relations: #[code ROOT], #[code PLACE], #[code QUALITY],
    +        |  #[code ATTRIBUTE], #[code TIME] and #[code LOCATION].
    +
    +    +github("spacy", "examples/training/train_intent_parser.py")
    +
         +h(3, "textcat") Training spaCy's text classifier
             +tag-new(2)
     
    
    From f6fef30adc217ed84dc658bc849cdee039663750 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 10:16:41 +0000
    Subject: [PATCH 564/649] Remove dead code from spacy._ml
    
    ---
     spacy/_ml.py | 71 ++--------------------------------------------------
     1 file changed, 2 insertions(+), 69 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index b85f6ef9d..dd80e5b1a 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -348,58 +348,12 @@ def reapply(layer, n_times):
         return wrap(reapply_fwd, layer)
     
     
    -
    -
     def asarray(ops, dtype):
         def forward(X, drop=0.):
             return ops.asarray(X, dtype=dtype), None
         return layerize(forward)
     
     
    -def foreach(layer):
    -    def forward(Xs, drop=0.):
    -        results = []
    -        backprops = []
    -        for X in Xs:
    -            result, bp = layer.begin_update(X, drop=drop)
    -            results.append(result)
    -            backprops.append(bp)
    -        def backward(d_results, sgd=None):
    -            dXs = []
    -            for d_result, backprop in zip(d_results, backprops):
    -                dXs.append(backprop(d_result, sgd))
    -            return dXs
    -        return results, backward
    -    model = layerize(forward)
    -    model._layers.append(layer)
    -    return model
    -
    -
    -def rebatch(size, layer):
    -    ops = layer.ops
    -    def forward(X, drop=0.):
    -        if X.shape[0] < size:
    -            return layer.begin_update(X)
    -        parts = _divide_array(X, size)
    -        results, bp_results = zip(*[layer.begin_update(p, drop=drop)
    -                                    for p in parts])
    -        y = ops.flatten(results)
    -        def backward(dy, sgd=None):
    -            d_parts = [bp(y, sgd=sgd) for bp, y in
    -                       zip(bp_results, _divide_array(dy, size))]
    -            try:
    -                dX = ops.flatten(d_parts)
    -            except TypeError:
    -                dX = None
    -            except ValueError:
    -                dX = None
    -            return dX
    -        return y, backward
    -    model = layerize(forward)
    -    model._layers.append(layer)
    -    return model
    -
    -
     def _divide_array(X, size):
         parts = []
         index = 0
    @@ -508,11 +462,13 @@ def preprocess_doc(docs, drop=0.):
         vals = ops.allocate(keys.shape[0]) + 1
         return (keys, vals, lengths), None
     
    +
     def getitem(i):
         def getitem_fwd(X, drop=0.):
             return X[i], None
         return layerize(getitem_fwd)
     
    +
     def build_tagger_model(nr_class, **cfg):
         embed_size = util.env_opt('embed_size', 7000)
         if 'token_vector_width' in cfg:
    @@ -552,29 +508,6 @@ def SpacyVectors(docs, drop=0.):
         return batch, None
     
     
    -def foreach(layer, drop_factor=1.0):
    -    '''Map a layer across elements in a list'''
    -    def foreach_fwd(Xs, drop=0.):
    -        drop *= drop_factor
    -        ys = []
    -        backprops = []
    -        for X in Xs:
    -            y, bp_y = layer.begin_update(X, drop=drop)
    -            ys.append(y)
    -            backprops.append(bp_y)
    -        def foreach_bwd(d_ys, sgd=None):
    -            d_Xs = []
    -            for d_y, bp_y in zip(d_ys, backprops):
    -                if bp_y is not None and bp_y is not None:
    -                    d_Xs.append(d_y, sgd=sgd)
    -                else:
    -                    d_Xs.append(None)
    -            return d_Xs
    -        return ys, foreach_bwd
    -    model = wrap(foreach_fwd, layer)
    -    return model
    -
    -
     def build_text_classifier(nr_class, width=64, **cfg):
         nr_vector = cfg.get('nr_vector', 5000)
         pretrained_dims = cfg.get('pretrained_dims', 0)
    
    From 642eb28c168ae1251459bf0a8960cf68cdc1004b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 10:16:58 +0000
    Subject: [PATCH 565/649] Don't compile with OpenMP by default
    
    ---
     setup.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/setup.py b/setup.py
    index 2e2b816b7..a33826c23 100755
    --- a/setup.py
    +++ b/setup.py
    @@ -67,7 +67,7 @@ LINK_OPTIONS = {
     
     # I don't understand this very well yet. See Issue #267
     # Fingers crossed!
    -USE_OPENMP_DEFAULT = '1' if sys.platform != 'darwin' else None
    +USE_OPENMP_DEFAULT = '0' if sys.platform != 'darwin' else None
     if os.environ.get('USE_OPENMP', USE_OPENMP_DEFAULT) == '1':
         if sys.platform == 'darwin':
             COMPILE_OPTIONS['other'].append('-fopenmp')
    
    From c9987cf131a5cc8d41437136dad1c765f20e5862 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 10:18:36 +0000
    Subject: [PATCH 566/649] Avoid use of numpy.tensordot
    
    ---
     spacy/_ml.py | 35 ++++++++++++++++++++++-------------
     1 file changed, 22 insertions(+), 13 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index dd80e5b1a..de2bd4b86 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -127,24 +127,34 @@ class PrecomputableAffine(Model):
             self.nF = nF
     
         def begin_update(self, X, drop=0.):
    -        tensordot = self.ops.xp.tensordot
    -        ascontiguous = self.ops.xp.ascontiguousarray
    -
    -        Yf = tensordot(X, self.W, axes=[[1], [3]])
    +        Yf = self.ops.dot(X,
    +                 self.W.reshape((self.nF*self.nO*self.nP, self.nI)).T)
    + 
    +        Yf = Yf.reshape((X.shape[0], self.nF, self.nO, self.nP))
     
             def backward(dY_ids, sgd=None):
                 dY, ids = dY_ids
                 Xf = X[ids]
    +            Xf = Xf.reshape((Xf.shape[0], self.nF * self.nI))
     
    -            dXf = tensordot(dY, self.W, axes=[[1,2], [1,2]])
    -            dW = tensordot(dY, Xf, axes=[[0], [0]])
    -            # (o, p, f, i) --> (f, o, p, i)
    -            self.d_W += dW.transpose((2, 0, 1, 3))
                 self.d_b += dY.sum(axis=0)
    +            dY = dY.reshape((dY.shape[0], self.nO*self.nP))
    +
    +            Wopfi = self.W.transpose((1, 2, 0, 3))
    +            Wopfi = self.ops.xp.ascontiguousarray(Wopfi)
    +            Wopfi = Wopfi.reshape((self.nO*self.nP, self.nF * self.nI))
    +            dXf = self.ops.dot(dY.reshape((dY.shape[0], self.nO*self.nP)), Wopfi)
    +            
    +            # Reuse the buffer
    +            dWopfi = Wopfi; dWopfi.fill(0.)
    +            self.ops.xp.dot(dY.T, Xf, out=dWopfi)
    +            dWopfi = dWopfi.reshape((self.nO, self.nP, self.nF, self.nI))
    +            # (o, p, f, i) --> (f, o, p, i)
    +            self.d_W += dWopfi.transpose((2, 0, 1, 3))
     
                 if sgd is not None:
                     sgd(self._mem.weights, self._mem.gradient, key=self.id)
    -            return dXf
    +            return dXf.reshape((dXf.shape[0], self.nF, self.nI))
             return Yf, backward
     
         @staticmethod
    @@ -168,9 +178,9 @@ class PrecomputableAffine(Model):
                         size=tokvecs.size).reshape(tokvecs.shape)
     
             def predict(ids, tokvecs):
    -            hiddens = model(tokvecs)
    +            hiddens = model(tokvecs) # (b, f, o, p)
                 vector = model.ops.allocate((hiddens.shape[0], model.nO, model.nP))
    -            model.ops.scatter_add(vector, ids, hiddens)
    +            model.ops.xp.add.at(vector, ids, hiddens)
                 vector += model.b
                 if model.nP >= 2:
                     return model.ops.maxout(vector)[0]
    @@ -318,8 +328,7 @@ def Tok2Vec(width, embed_size, **kwargs):
     
             tok2vec = (
                 FeatureExtracter(cols)
    -            >> with_flatten(
    -                embed >> (convolution ** 4), pad=4)
    +            >> with_flatten(embed >> (convolution ** 4), pad=4)
             )
     
             # Work around thinc API limitations :(. TODO: Revise in Thinc 7
    
    From 75a637fa439893d4d60e23a9aa3e2af241faf84a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 10:19:56 +0000
    Subject: [PATCH 567/649] Remove redundant imports from _ml
    
    ---
     spacy/pipeline.pyx         | 2 +-
     spacy/syntax/nn_parser.pyx | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 7c1976dfa..685c8ee00 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -42,7 +42,7 @@ from .syntax import nonproj
     from .compat import json_dumps
     
     from .attrs import ID, LOWER, PREFIX, SUFFIX, SHAPE, TAG, DEP, POS
    -from ._ml import rebatch, Tok2Vec, flatten
    +from ._ml import Tok2Vec, flatten
     from ._ml import build_text_classifier, build_tagger_model
     from ._ml import link_vectors_to_models
     from .parts_of_speech import X
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 96fdbab6d..773ab4e63 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -47,7 +47,7 @@ from thinc.neural.util import get_array_module
     from .. import util
     from ..util import get_async, get_cuda_stream
     from .._ml import zero_init, PrecomputableAffine
    -from .._ml import Tok2Vec, doc2feats, rebatch
    +from .._ml import Tok2Vec, doc2feats
     from .._ml import Residual, drop_layer, flatten
     from .._ml import link_vectors_to_models
     from .._ml import HistoryFeatures
    
    From 4d048e94d3eaa88e038e56967c0bf7599d11f6ae Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 10:23:49 +0000
    Subject: [PATCH 568/649] Add compat for thinc.neural.optimizers.Optimizer
    
    ---
     spacy/compat.py   |  4 ++++
     spacy/language.py | 11 ++++++-----
     2 files changed, 10 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/compat.py b/spacy/compat.py
    index 81243ce1b..31b33e771 100644
    --- a/spacy/compat.py
    +++ b/spacy/compat.py
    @@ -30,6 +30,10 @@ try:
     except ImportError:
         cupy = None
     
    +try:
    +    from thinc.optimizers import Optimizer
    +except ImportError:
    +    from thinc.optimizers import Adam as Optimizer
     
     pickle = pickle
     copy_reg = copy_reg
    diff --git a/spacy/language.py b/spacy/language.py
    index 933ca772d..adc2860eb 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -3,7 +3,6 @@ from __future__ import absolute_import, unicode_literals
     from contextlib import contextmanager
     
     from thinc.neural import Model
    -from thinc.neural.optimizers import Adam
     import random
     import ujson
     from collections import OrderedDict
    @@ -21,6 +20,7 @@ from .syntax.parser import get_templates
     from .pipeline import NeuralDependencyParser, TokenVectorEncoder, NeuralTagger
     from .pipeline import NeuralEntityRecognizer, SimilarityHook, TextCategorizer
     
    +from .compat import Optimizer
     from .compat import json_dumps, izip, copy_reg
     from .scorer import Scorer
     from ._ml import link_vectors_to_models
    @@ -359,7 +359,8 @@ class Language(object):
                 return
             if sgd is None:
                 if self._optimizer is None:
    -                self._optimizer = Adam(Model.ops, 0.001)
    +                self._optimizer = Optimizer(Model.ops, 0.001,
    +                                            beta1=0.9, beta2=0.0, nesterov=True)
                 sgd = self._optimizer
             grads = {}
             def get_grads(W, dW, key=None):
    @@ -400,8 +401,8 @@ class Language(object):
             eps = util.env_opt('optimizer_eps', 1e-08)
             L2 = util.env_opt('L2_penalty', 1e-6)
             max_grad_norm = util.env_opt('grad_norm_clip', 1.)
    -        self._optimizer = Adam(Model.ops, learn_rate, L2=L2, beta1=beta1,
    -                              beta2=beta2, eps=eps)
    +        self._optimizer = Optimizer(Model.ops, learn_rate, L2=L2, beta1=beta1,
    +                                    beta2=beta2, eps=eps, nesterov=True)
             self._optimizer.max_grad_norm = max_grad_norm
             self._optimizer.device = device
             return self._optimizer
    @@ -440,7 +441,7 @@ class Language(object):
             eps = util.env_opt('optimizer_eps', 1e-08)
             L2 = util.env_opt('L2_penalty', 1e-6)
             max_grad_norm = util.env_opt('grad_norm_clip', 1.)
    -        self._optimizer = Adam(Model.ops, learn_rate, L2=L2, beta1=beta1,
    +        self._optimizer = Optimizer(Model.ops, learn_rate, L2=L2, beta1=beta1,
                                   beta2=beta2, eps=eps)
             self._optimizer.max_grad_norm = max_grad_norm
             self._optimizer.device = device
    
    From 52f1bf2729bf62b05fa554d567986cc6b852fb44 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 12:30:59 +0200
    Subject: [PATCH 569/649] Adjust GitHub embeds
    
    ---
     website/_includes/_mixins.jade                              | 2 +-
     website/usage/_processing-pipelines/_custom-components.jade | 4 ++--
     website/usage/_processing-pipelines/_multithreading.jade    | 2 +-
     website/usage/_training/_ner.jade                           | 4 ++--
     website/usage/_training/_tagger-parser.jade                 | 6 +++---
     website/usage/_training/_textcat.jade                       | 2 +-
     website/usage/examples.jade                                 | 2 +-
     7 files changed, 11 insertions(+), 11 deletions(-)
    
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index b7375e2e0..692b47887 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -181,7 +181,7 @@ mixin codepen(slug, height, default_tab)
         alt_file - [string] alternative file path used in footer and link button
         height   - [integer] height of code preview in px
     
    -mixin github(repo, file, alt_file, height, language)
    +mixin github(repo, file, height, alt_file, language)
         - var branch = ALPHA ? "develop" : "master"
         - var height = height || 250
     
    diff --git a/website/usage/_processing-pipelines/_custom-components.jade b/website/usage/_processing-pipelines/_custom-components.jade
    index ea3ea9b97..79cd77eef 100644
    --- a/website/usage/_processing-pipelines/_custom-components.jade
    +++ b/website/usage/_processing-pipelines/_custom-components.jade
    @@ -234,7 +234,7 @@ p
         |  when you customise spaCy's tokenization rules. When you call #[code nlp]
         |  on a text, the custom pipeline component is applied to the #[code Doc]
     
    -+github("spacy", "examples/pipeline/custom_component_entities.py", false, 500)
    ++github("spacy", "examples/pipeline/custom_component_entities.py", 500)
     
     p
         |  Wrapping this functionality in a
    @@ -255,7 +255,7 @@ p
         |  #[code Token] – for example, the capital, latitude/longitude coordinates
         |  and even the country flag.
     
    -+github("spacy", "examples/pipeline/custom_component_countries_api.py", false, 500)
    ++github("spacy", "examples/pipeline/custom_component_countries_api.py", 500)
     
     p
         |  In this case, all data can be fetched on initialisation in one request.
    diff --git a/website/usage/_processing-pipelines/_multithreading.jade b/website/usage/_processing-pipelines/_multithreading.jade
    index a80768f38..4dff9c924 100644
    --- a/website/usage/_processing-pipelines/_multithreading.jade
    +++ b/website/usage/_processing-pipelines/_multithreading.jade
    @@ -50,4 +50,4 @@ p
         |  dataset and will be loaded automatically via Thinc's built-in dataset
         |  loader.
     
    -+github("spacy", "examples/pipeline/multi_processing.py")
    ++github("spacy", "examples/pipeline/multi_processing.py", 500)
    diff --git a/website/usage/_training/_ner.jade b/website/usage/_training/_ner.jade
    index 12f92dbce..c1002ecdf 100644
    --- a/website/usage/_training/_ner.jade
    +++ b/website/usage/_training/_ner.jade
    @@ -34,7 +34,7 @@ p
         |  #[strong character offsets] and #[strong labels] of each entity contained
         |  in the texts.
     
    -    +github("spacy", "examples/training/train_ner.py")
    +    +github("spacy", "examples/training/train_ner.py", 500)
     
     +h(4) Step by step guide
     
    @@ -88,7 +88,7 @@ p
         |  recognizer over unlabelled sentences, and adding their annotations to the
         |  training set.
     
    -+github("spacy", "examples/training/train_new_entity_type.py")
    ++github("spacy", "examples/training/train_new_entity_type.py", 500)
     
     +h(4) Step by step guide
     
    diff --git a/website/usage/_training/_tagger-parser.jade b/website/usage/_training/_tagger-parser.jade
    index d8388f4d7..f2fa4bab5 100644
    --- a/website/usage/_training/_tagger-parser.jade
    +++ b/website/usage/_training/_tagger-parser.jade
    @@ -8,7 +8,7 @@ p
         |  #[strong training examples] and the respective #[strong heads] and
         |  #[strong dependency label] for each token of the example texts.
     
    -+github("spacy", "examples/training/train_parser.py")
    ++github("spacy", "examples/training/train_parser.py", 500)
     
     +h(4) Step by step guide
     
    @@ -61,7 +61,7 @@ p
         |  #[strong custom tags], as well as a dictionary mapping those tags to the
         |  #[+a("http://universaldependencies.github.io/docs/u/pos/index.html") Universal Dependencies scheme].
     
    -+github("spacy", "examples/training/train_tagger.py")
    ++github("spacy", "examples/training/train_tagger.py", 500)
     
     +h(4) Step by step guide
     
    @@ -141,7 +141,7 @@ p
         |  of relations: #[code ROOT], #[code PLACE], #[code QUALITY],
         |  #[code ATTRIBUTE], #[code TIME] and #[code LOCATION].
     
    -+github("spacy", "examples/training/train_intent_parser.py")
    ++github("spacy", "examples/training/train_intent_parser.py", 500)
     
     +h(4) Step by step guide
     
    diff --git a/website/usage/_training/_textcat.jade b/website/usage/_training/_textcat.jade
    index 5ccff7a84..b7b47c3ba 100644
    --- a/website/usage/_training/_textcat.jade
    +++ b/website/usage/_training/_textcat.jade
    @@ -11,7 +11,7 @@ p
         |  loader. Predictions are available via
         |  #[+api("doc#attributes") #[code Doc.cats]].
     
    -+github("spacy", "examples/training/train_textcat.py")
    ++github("spacy", "examples/training/train_textcat.py", 500)
     
     +h(4) Step by step guide
     
    diff --git a/website/usage/examples.jade b/website/usage/examples.jade
    index 5e415af8f..9ad800954 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -179,4 +179,4 @@ include ../_includes/_mixins
             |  parameters, and was implemented using #[+a("https://keras.io") Keras]
             |  and spaCy.
     
    -    +github("spacy", "examples/keras_parikh_entailment/__main__.py", "examples/keras_parikh_entailment")
    +    +github("spacy", "examples/keras_parikh_entailment/__main__.py", false, "examples/keras_parikh_entailment")
    
    From 19a2b9bf27f768a2c3f8c8033b1679e950b493a6 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 27 Oct 2017 12:33:42 +0000
    Subject: [PATCH 570/649] Fix import of Optimizer
    
    ---
     spacy/compat.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/compat.py b/spacy/compat.py
    index 31b33e771..8dd3d6b03 100644
    --- a/spacy/compat.py
    +++ b/spacy/compat.py
    @@ -31,9 +31,9 @@ except ImportError:
         cupy = None
     
     try:
    -    from thinc.optimizers import Optimizer
    +    from thinc.neural.optimizers import Optimizer
     except ImportError:
    -    from thinc.optimizers import Adam as Optimizer
    +    from thinc.neural.optimizers import Adam as Optimizer
     
     pickle = pickle
     copy_reg = copy_reg
    
    From 9ff9afe889934d32cb888714c46af443499ca0c8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 14:37:42 +0200
    Subject: [PATCH 571/649] Update spacy convert CLI docs
    
    ---
     website/api/_top-level/_cli.jade | 31 ++++++++++++++++++++++++++++---
     1 file changed, 28 insertions(+), 3 deletions(-)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index fc573e0ec..f19eb43d0 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -134,11 +134,12 @@ p
     p
         |  Convert files into spaCy's #[+a("/api/annotation#json-input") JSON format]
         |  for use with the #[code train] command and other experiment management
    -    |  functions. The right converter is chosen based on the file extension of
    -    |  the input file. Currently only supports #[code .conllu].
    +    |  functions. The converter can be specified on the command line, or
    +    |  chosen based on the file extension of the input file.
     
     +code(false, "bash", "$", false, false, true).
    -    spacy convert [input_file] [output_dir] [--n-sents] [--morphology]
    +    spacy convert [input_file] [output_dir] [--converter] [--n-sents]
    +    [--morphology]
     
     +table(["Argument", "Type", "Description"])
         +row
    @@ -151,6 +152,11 @@ p
             +cell positional
             +cell Output directory for converted JSON file.
     
    +    +row
    +        +cell #[code converter], #[code -c]
    +        +cell option
    +        +cell #[+tag-new(2)] Name of converter to use (see below).
    +
         +row
             +cell #[code --n-sents], #[code -n]
             +cell option
    @@ -166,6 +172,25 @@ p
             +cell flag
             +cell Show help message and available arguments.
     
    +p The following converters are available:
    +
    ++table(["ID", "Description"])
    +    +row
    +        +cell #[code auto]
    +        +cell Automatically pick converter based on file extension (default).
    +
    +    +row
    +        +cell #[code conllu], #[code conll]
    +        +cell Universal Dependencies #[code .conllu] or #[code .conll] format.
    +
    +    +row
    +        +cell #[code ner]
    +        +cell Tab-based named entity recognition format.
    +
    +    +row
    +        +cell #[code iob]
    +        +cell IOB named entity recognition format.
    +
     +h(3, "train") Train
     
     p
    
    From 298c3d973ce3cbaf06d6f90d2e274c0dcca95bc5 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 14:37:53 +0200
    Subject: [PATCH 572/649] Document Doc.get_lca_matrix
    
    ---
     website/api/doc.jade | 20 ++++++++++++++++++++
     1 file changed, 20 insertions(+)
    
    diff --git a/website/api/doc.jade b/website/api/doc.jade
    index ceb564c7a..f2c73de9f 100644
    --- a/website/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -332,6 +332,26 @@ p
             +cell dict
             +cell A dictionary mapping attributes to integer counts.
     
    ++h(2, "get_lca_matrix") Doc.get_lca_matrix
    +    +tag method
    +
    +p
    +    |  Calculates the lowest common ancestor matrix for a given #[code Doc].
    +    |  Returns LCA matrix containing the integer index of the ancestor, or
    +    |  #[code -1] if no common ancestor is found, e.g. if span excludes a
    +    |  necessary ancestor.
    +
    ++aside-code("Example").
    +    doc = nlp(u"This is a test")
    +    matrix = doc.get_lca_matrix()
    +    # array([[0, 1, 1, 1], [1, 1, 1, 1], [1, 1, 2, 3], [1, 1, 3, 3]], dtype=int32)
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']]
    +        +cell The lowest common ancestor matrix of the #[code Doc].
    +
     +h(2, "to_array") Doc.to_array
         +tag method
     
    
    From d941fc36672bb08cfaf59c2301b98f27ff846667 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 14:38:39 +0200
    Subject: [PATCH 573/649] Tidy up CLI
    
    ---
     spacy/cli/convert.py                   | 12 +++----
     spacy/cli/converters/conll_ner2json.py |  3 +-
     spacy/cli/download.py                  | 46 ++++++++++++++------------
     spacy/cli/evaluate.py                  | 45 +++++++++++--------------
     spacy/cli/info.py                      |  3 +-
     spacy/cli/link.py                      |  8 ++---
     spacy/cli/package.py                   | 28 ++++++++++------
     spacy/cli/profile.py                   |  8 ++---
     spacy/cli/train.py                     | 36 ++++++++++----------
     spacy/cli/validate.py                  | 13 +++++---
     10 files changed, 103 insertions(+), 99 deletions(-)
    
    diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py
    index d9a812a15..ad17844a1 100644
    --- a/spacy/cli/convert.py
    +++ b/spacy/cli/convert.py
    @@ -7,10 +7,9 @@ from pathlib import Path
     from .converters import conllu2json, iob2json, conll_ner2json
     from ..util import prints
     
    -# Converters are matched by file extension. To add a converter, add a new entry
    -# to this dict with the file extension mapped to the converter function imported
    -# from /converters.
    -
    +# Converters are matched by file extension. To add a converter, add a new
    +# entry to this dict with the file extension mapped to the converter function
    +# imported from /converters.
     CONVERTERS = {
         'conllu': conllu2json,
         'conll': conllu2json,
    @@ -24,8 +23,7 @@ CONVERTERS = {
         output_dir=("output directory for converted file", "positional", None, str),
         n_sents=("Number of sentences per doc", "option", "n", int),
         converter=("Name of converter (auto, iob, conllu or ner)", "option", "c", str),
    -    morphology=("Enable appending morphology to tags", "flag", "m", bool)
    -)
    +    morphology=("Enable appending morphology to tags", "flag", "m", bool))
     def convert(cmd, input_file, output_dir, n_sents=1, morphology=False,
                 converter='auto'):
         """
    @@ -40,7 +38,7 @@ def convert(cmd, input_file, output_dir, n_sents=1, morphology=False,
             prints(output_path, title="Output directory not found", exits=1)
         if converter == 'auto':
             converter = input_path.suffix[1:]
    -    if not converter in CONVERTERS:
    +    if converter not in CONVERTERS:
                 prints("Can't find converter for %s" % converter,
                     title="Unknown format", exits=1)
         func = CONVERTERS[converter]
    diff --git a/spacy/cli/converters/conll_ner2json.py b/spacy/cli/converters/conll_ner2json.py
    index e3bd82e7e..fb2979652 100644
    --- a/spacy/cli/converters/conll_ner2json.py
    +++ b/spacy/cli/converters/conll_ner2json.py
    @@ -8,7 +8,8 @@ from ...gold import iob_to_biluo
     
     def conll_ner2json(input_path, output_path, n_sents=10, use_morphology=False):
         """
    -    Convert files in the CoNLL-2003 NER format into JSON format for use with train cli.
    +    Convert files in the CoNLL-2003 NER format into JSON format for use with
    +    train cli.
         """
         docs = read_conll_ner(input_path)
     
    diff --git a/spacy/cli/download.py b/spacy/cli/download.py
    index 28ae07865..0d3f11153 100644
    --- a/spacy/cli/download.py
    +++ b/spacy/cli/download.py
    @@ -13,10 +13,9 @@ from .. import about
     
     
     @plac.annotations(
    -    model=("model to download (shortcut or model name)", "positional", None, str),
    +    model=("model to download, shortcut or name)", "positional", None, str),
         direct=("force direct download. Needs model name with version and won't "
    -            "perform compatibility check", "flag", "d", bool)
    -)
    +            "perform compatibility check", "flag", "d", bool))
     def download(cmd, model, direct=False):
         """
         Download compatible model from default download path using pip. Model
    @@ -30,21 +29,25 @@ def download(cmd, model, direct=False):
             model_name = shortcuts.get(model, model)
             compatibility = get_compatibility()
             version = get_version(model_name, compatibility)
    -        dl = download_model('{m}-{v}/{m}-{v}.tar.gz'.format(m=model_name, v=version))
    +        dl = download_model('{m}-{v}/{m}-{v}.tar.gz'.format(m=model_name,
    +                                                            v=version))
             if dl == 0:
                 try:
                     # Get package path here because link uses
    -                # pip.get_installed_distributions() to check if model is a package,
    -                # which fails if model was just installed via subprocess
    +                # pip.get_installed_distributions() to check if model is a
    +                # package, which fails if model was just installed via
    +                # subprocess
                     package_path = get_package_path(model_name)
    -                link(None, model_name, model, force=True, model_path=package_path)
    +                link(None, model_name, model, force=True,
    +                     model_path=package_path)
                 except:
    -                # Dirty, but since spacy.download and the auto-linking is mostly
    -                # a convenience wrapper, it's best to show a success message and
    -                # loading instructions, even if linking fails.
    -                prints("Creating a shortcut link for 'en' didn't work (maybe you "
    -                    "don't have admin permissions?), but you can still load "
    -                    "the model via its full package name:",
    +                # Dirty, but since spacy.download and the auto-linking is
    +                # mostly a convenience wrapper, it's best to show a success
    +                # message and loading instructions, even if linking fails.
    +                prints(
    +                    "Creating a shortcut link for 'en' didn't work (maybe "
    +                    "you don't have admin permissions?), but you can still "
    +                    "load the model via its full package name:",
                         "nlp = spacy.load('%s')" % model_name,
                         title="Download successful")
     
    @@ -52,9 +55,10 @@ def download(cmd, model, direct=False):
     def get_json(url, desc):
         r = requests.get(url)
         if r.status_code != 200:
    -        prints("Couldn't fetch %s. Please find a model for your spaCy installation "
    -               "(v%s), and download it manually." % (desc, about.__version__),
    -               about.__docs_models__, title="Server error (%d)" % r.status_code, exits=1)
    +        msg = ("Couldn't fetch %s. Please find a model for your spaCy "
    +               "installation (v%s), and download it manually.")
    +        prints(msg % (desc, about.__version__), about.__docs_models__,
    +               title="Server error (%d)" % r.status_code, exits=1)
         return r.json()
     
     
    @@ -71,13 +75,13 @@ def get_compatibility():
     def get_version(model, comp):
         if model not in comp:
             version = about.__version__
    -        prints("No compatible model found for '%s' (spaCy v%s)." % (model, version),
    -               title="Compatibility error", exits=1)
    +        msg = "No compatible model found for '%s' (spaCy v%s)."
    +        prints(msg % (model, version), title="Compatibility error", exits=1)
         return comp[model][0]
     
     
     def download_model(filename):
         download_url = about.__download_url__ + '/' + filename
    -    return subprocess.call([sys.executable, '-m',
    -        'pip', 'install', '--no-cache-dir', download_url],
    -        env=os.environ.copy())
    +    return subprocess.call(
    +        [sys.executable, '-m', 'pip', 'install', '--no-cache-dir',
    +         download_url], env=os.environ.copy())
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index 29e30b7d2..d4d54d8aa 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -2,27 +2,15 @@
     from __future__ import unicode_literals, division, print_function
     
     import plac
    -import json
    -from collections import defaultdict
    -import cytoolz
    -from pathlib import Path
    -import dill
    -import tqdm
    -from thinc.neural._classes.model import Model
    -from thinc.neural.optimizers import linear_decay
     from timeit import default_timer as timer
     import random
     import numpy.random
     
    -from ..tokens.doc import Doc
    -from ..scorer import Scorer
    -from ..gold import GoldParse, merge_sents
    -from ..gold import GoldCorpus, minibatch
    +from ..gold import GoldCorpus
     from ..util import prints
     from .. import util
    -from .. import about
     from .. import displacy
    -from ..compat import json_dumps
    +
     
     random.seed(0)
     numpy.random.seed(0)
    @@ -30,17 +18,18 @@ numpy.random.seed(0)
     
     @plac.annotations(
         model=("Model name or path", "positional", None, str),
    -    data_path=("Location of JSON-formatted evaluation data", "positional", None, str),
    +    data_path=("Location of JSON-formatted evaluation data", "positional",
    +               None, str),
         gold_preproc=("Use gold preprocessing", "flag", "G", bool),
         gpu_id=("Use GPU", "option", "g", int),
    -    displacy_path=("Directory to output rendered parses as HTML", "option", "dp", str),
    -    displacy_limit=("Limit of parses to render as HTML", "option", "dl", int)
    -)
    +    displacy_path=("Directory to output rendered parses as HTML", "option",
    +                   "dp", str),
    +    displacy_limit=("Limit of parses to render as HTML", "option", "dl", int))
     def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False,
                  displacy_path=None, displacy_limit=25):
         """
    -    Evaluate a model. To render a sample of parses in a HTML file, set an output
    -    directory as the displacy_path argument.
    +    Evaluate a model. To render a sample of parses in a HTML file, set an
    +    output directory as the displacy_path argument.
         """
         if gpu_id >= 0:
             util.use_gpu(gpu_id)
    @@ -50,7 +39,8 @@ def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False,
         if not data_path.exists():
             prints(data_path, title="Evaluation data not found", exits=1)
         if displacy_path and not displacy_path.exists():
    -        prints(displacy_path, title="Visualization output directory not found", exits=1)
    +        prints(displacy_path, title="Visualization output directory not found",
    +               exits=1)
         corpus = GoldCorpus(data_path, data_path)
         nlp = util.load_model(model)
         dev_docs = list(corpus.dev_docs(nlp, gold_preproc=gold_preproc))
    @@ -64,12 +54,14 @@ def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False,
             docs, golds = zip(*dev_docs)
             render_deps = 'parser' in nlp.meta.get('pipeline', [])
             render_ents = 'ner' in nlp.meta.get('pipeline', [])
    -        render_parses(docs, displacy_path, model_name=model, limit=displacy_limit,
    -                      deps=render_deps, ents=render_ents)
    -        prints(displacy_path, title="Generated %s parses as HTML" % displacy_limit)
    +        render_parses(docs, displacy_path, model_name=model,
    +                      limit=displacy_limit, deps=render_deps, ents=render_ents)
    +        msg = "Generated %s parses as HTML" % displacy_limit
    +        prints(displacy_path, title=msg)
     
     
    -def render_parses(docs, output_path, model_name='', limit=250, deps=True, ents=True):
    +def render_parses(docs, output_path, model_name='', limit=250, deps=True,
    +                  ents=True):
         docs[0].user_data['title'] = model_name
         if ents:
             with (output_path / 'entities.html').open('w') as file_:
    @@ -77,7 +69,8 @@ def render_parses(docs, output_path, model_name='', limit=250, deps=True, ents=T
                 file_.write(html)
         if deps:
             with (output_path / 'parses.html').open('w') as file_:
    -            html = displacy.render(docs[:limit], style='dep', page=True, options={'compact': True})
    +            html = displacy.render(docs[:limit], style='dep', page=True,
    +                                   options={'compact': True})
                 file_.write(html)
     
     
    diff --git a/spacy/cli/info.py b/spacy/cli/info.py
    index 5d45b271c..3636494fb 100644
    --- a/spacy/cli/info.py
    +++ b/spacy/cli/info.py
    @@ -12,8 +12,7 @@ from .. import util
     
     @plac.annotations(
         model=("optional: shortcut link of model", "positional", None, str),
    -    markdown=("generate Markdown for GitHub issues", "flag", "md", str)
    -)
    +    markdown=("generate Markdown for GitHub issues", "flag", "md", str))
     def info(cmd, model=None, markdown=False):
         """Print info about spaCy installation. If a model shortcut link is
         speficied as an argument, print model information. Flag --markdown
    diff --git a/spacy/cli/link.py b/spacy/cli/link.py
    index 5b333dae5..cfbc97e3e 100644
    --- a/spacy/cli/link.py
    +++ b/spacy/cli/link.py
    @@ -12,8 +12,7 @@ from .. import util
     @plac.annotations(
         origin=("package name or local path to model", "positional", None, str),
         link_name=("name of shortuct link to create", "positional", None, str),
    -    force=("force overwriting of existing link", "flag", "f", bool)
    -)
    +    force=("force overwriting of existing link", "flag", "f", bool))
     def link(cmd, origin, link_name, force=False, model_path=None):
         """
         Create a symlink for models within the spacy/data directory. Accepts
    @@ -46,8 +45,9 @@ def link(cmd, origin, link_name, force=False, model_path=None):
             # This is quite dirty, but just making sure other errors are caught.
             prints("Creating a symlink in spacy/data failed. Make sure you have "
                    "the required permissions and try re-running the command as "
    -               "admin, or use a virtualenv. You can still import the model as a "
    -               "module and call its load() method, or create the symlink manually.",
    +               "admin, or use a virtualenv. You can still import the model as "
    +               "a module and call its load() method, or create the symlink "
    +               "manually.",
                    "%s --> %s" % (path2str(model_path), path2str(link_path)),
                    title="Error: Couldn't link model to '%s'" % link_name)
             raise
    diff --git a/spacy/cli/package.py b/spacy/cli/package.py
    index 6b0811459..d1984fe65 100644
    --- a/spacy/cli/package.py
    +++ b/spacy/cli/package.py
    @@ -16,10 +16,12 @@ from .. import about
         input_dir=("directory with model data", "positional", None, str),
         output_dir=("output parent directory", "positional", None, str),
         meta_path=("path to meta.json", "option", "m", str),
    -    create_meta=("create meta.json, even if one exists in directory", "flag", "c", bool),
    -    force=("force overwriting of existing folder in output directory", "flag", "f", bool)
    -)
    -def package(cmd, input_dir, output_dir, meta_path=None, create_meta=False, force=False):
    +    create_meta=("create meta.json, even if one exists in directory", "flag",
    +                 "c", bool),
    +    force=("force overwriting of existing folder in output directory", "flag",
    +           "f", bool))
    +def package(cmd, input_dir, output_dir, meta_path=None, create_meta=False,
    +            force=False):
         """
         Generate Python package for model data, including meta and required
         installation files. A new directory will be created in the specified
    @@ -52,13 +54,15 @@ def package(cmd, input_dir, output_dir, meta_path=None, create_meta=False, force
         package_path = main_path / model_name
     
         create_dirs(package_path, force)
    -    shutil.copytree(path2str(input_path), path2str(package_path / model_name_v))
    +    shutil.copytree(path2str(input_path),
    +                    path2str(package_path / model_name_v))
         create_file(main_path / 'meta.json', json_dumps(meta))
         create_file(main_path / 'setup.py', template_setup)
         create_file(main_path / 'MANIFEST.in', template_manifest)
         create_file(package_path / '__init__.py', template_init)
    -    prints(main_path, "To build the package, run `python setup.py sdist` in this "
    -           "directory.", title="Successfully created package '%s'" % model_name_v)
    +    prints(main_path, "To build the package, run `python setup.py sdist` in "
    +           "this directory.",
    +           title="Successfully created package '%s'" % model_name_v)
     
     
     def create_dirs(package_path, force):
    @@ -66,9 +70,10 @@ def create_dirs(package_path, force):
             if force:
                 shutil.rmtree(path2str(package_path))
             else:
    -            prints(package_path, "Please delete the directory and try again, or "
    -                   "use the --force flag to overwrite existing directories.",
    -                   title="Package directory already exists", exits=1)
    +            prints(package_path, "Please delete the directory and try again, "
    +                   "or use the --force flag to overwrite existing "
    +                   "directories.", title="Package directory already exists",
    +                   exits=1)
         Path.mkdir(package_path, parents=True)
     
     
    @@ -82,7 +87,8 @@ def generate_meta(model_path):
         settings = [('lang', 'Model language', 'en'),
                     ('name', 'Model name', 'model'),
                     ('version', 'Model version', '0.0.0'),
    -                ('spacy_version', 'Required spaCy version', '>=%s,<3.0.0' % about.__version__),
    +                ('spacy_version', 'Required spaCy version',
    +                 '>=%s,<3.0.0' % about.__version__),
                     ('description', 'Model description', False),
                     ('author', 'Author', False),
                     ('email', 'Author email', False),
    diff --git a/spacy/cli/profile.py b/spacy/cli/profile.py
    index db6fc5b41..a394989d0 100644
    --- a/spacy/cli/profile.py
    +++ b/spacy/cli/profile.py
    @@ -27,15 +27,15 @@ def read_inputs(loc):
     
     @plac.annotations(
         lang=("model/language", "positional", None, str),
    -    inputs=("Location of input file", "positional", None, read_inputs)
    -)
    +    inputs=("Location of input file", "positional", None, read_inputs))
     def profile(cmd, lang, inputs=None):
         """
         Profile a spaCy pipeline, to find out which functions take the most time.
         """
    -    nlp = spacy.load(lang) 
    +    nlp = spacy.load(lang)
         texts = list(cytoolz.take(10000, inputs))
    -    cProfile.runctx("parse_texts(nlp, texts)", globals(), locals(), "Profile.prof")
    +    cProfile.runctx("parse_texts(nlp, texts)", globals(), locals(),
    +                    "Profile.prof")
         s = pstats.Stats("Profile.prof")
         s.strip_dirs().sort_stats("time").print_stats()
     
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index da398751c..fb96e6c05 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -2,21 +2,14 @@
     from __future__ import unicode_literals, division, print_function
     
     import plac
    -import json
    -from collections import defaultdict
    -import cytoolz
     from pathlib import Path
     import dill
     import tqdm
     from thinc.neural._classes.model import Model
    -from thinc.neural.optimizers import linear_decay
     from timeit import default_timer as timer
     import random
     import numpy.random
     
    -from ..tokens.doc import Doc
    -from ..scorer import Scorer
    -from ..gold import GoldParse, merge_sents
     from ..gold import GoldCorpus, minibatch
     from ..util import prints
     from .. import util
    @@ -31,8 +24,10 @@ numpy.random.seed(0)
     @plac.annotations(
         lang=("model language", "positional", None, str),
         output_dir=("output directory to store model in", "positional", None, str),
    -    train_data=("location of JSON-formatted training data", "positional", None, str),
    -    dev_data=("location of JSON-formatted development data (optional)", "positional", None, str),
    +    train_data=("location of JSON-formatted training data", "positional",
    +                None, str),
    +    dev_data=("location of JSON-formatted development data (optional)",
    +              "positional", None, str),
         n_iter=("number of iterations", "option", "n", int),
         n_sents=("number of sentences", "option", "ns", int),
         use_gpu=("Use GPU", "option", "g", int),
    @@ -42,11 +37,12 @@ numpy.random.seed(0)
         no_entities=("Don't train NER", "flag", "N", bool),
         gold_preproc=("Use gold preprocessing", "flag", "G", bool),
         version=("Model version", "option", "V", str),
    -    meta_path=("Optional path to meta.json. All relevant properties will be overwritten.", "option", "m", Path)
    -)
    +    meta_path=("Optional path to meta.json. All relevant properties will be "
    +               "overwritten.", "option", "m", Path))
     def train(cmd, lang, output_dir, train_data, dev_data, n_iter=30, n_sents=0,
    -          use_gpu=-1, vectors=None, no_tagger=False, no_parser=False, no_entities=False,
    -          gold_preproc=False, version="0.0.0", meta_path=None):
    +          use_gpu=-1, vectors=None, no_tagger=False, no_parser=False,
    +          no_entities=False, gold_preproc=False, version="0.0.0",
    +          meta_path=None):
         """
         Train a model. Expects data in spaCy's JSON format.
         """
    @@ -72,9 +68,12 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=30, n_sents=0,
         meta.setdefault('name', 'unnamed')
     
         pipeline = ['tagger', 'parser', 'ner']
    -    if no_tagger and 'tagger' in pipeline: pipeline.remove('tagger')
    -    if no_parser and 'parser' in pipeline: pipeline.remove('parser')
    -    if no_entities and 'ner' in pipeline: pipeline.remove('ner')
    +    if no_tagger and 'tagger' in pipeline:
    +        pipeline.remove('tagger')
    +    if no_parser and 'parser' in pipeline:
    +        pipeline.remove('parser')
    +    if no_entities and 'ner' in pipeline:
    +        pipeline.remove('ner')
     
         # Take dropout and batch size as generators of values -- dropout
         # starts high and decays sharply, to force the optimizer to explore.
    @@ -139,7 +138,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=30, n_sents=0,
                             scorer = nlp_loaded.evaluate(dev_docs)
                             end_time = timer()
                             cpu_wps = nwords/(end_time-start_time)
    -                acc_loc =(output_path / ('model%d' % i) / 'accuracy.json')
    +                acc_loc = (output_path / ('model%d' % i) / 'accuracy.json')
                     with acc_loc.open('w') as file_:
                         file_.write(json_dumps(scorer.scores))
                     meta_loc = output_path / ('model%d' % i) / 'meta.json'
    @@ -157,7 +156,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=30, n_sents=0,
                     with meta_loc.open('w') as file_:
                         file_.write(json_dumps(meta))
                     util.set_env_log(True)
    -            print_progress(i, losses, scorer.scores, cpu_wps=cpu_wps, gpu_wps=gpu_wps)
    +            print_progress(i, losses, scorer.scores, cpu_wps=cpu_wps,
    +                           gpu_wps=gpu_wps)
         finally:
             print("Saving model...")
             try:
    diff --git a/spacy/cli/validate.py b/spacy/cli/validate.py
    index c1f992ed6..1c645a554 100644
    --- a/spacy/cli/validate.py
    +++ b/spacy/cli/validate.py
    @@ -1,5 +1,5 @@
     # coding: utf8
    -from __future__ import unicode_literals
    +from __future__ import unicode_literals, print_function
     
     import requests
     import pkg_resources
    @@ -29,8 +29,10 @@ def validate(cmd):
         model_links = get_model_links(current_compat)
         model_pkgs = get_model_pkgs(current_compat, all_models)
         incompat_links = {l for l, d in model_links.items() if not d['compat']}
    -    incompat_models = {d['name'] for _, d in model_pkgs.items() if not d['compat']}
    -    incompat_models.update([d['name'] for _, d in model_links.items() if not d['compat']])
    +    incompat_models = {d['name'] for _, d in model_pkgs.items()
    +                       if not d['compat']}
    +    incompat_models.update([d['name'] for _, d in model_links.items()
    +                            if not d['compat']])
         na_models = [m for m in incompat_models if m not in current_compat]
         update_models = [m for m in incompat_models if m in current_compat]
     
    @@ -90,7 +92,6 @@ def get_model_pkgs(compat, all_models):
     
     
     def get_model_row(compat, name, data, type='package'):
    -    tpl_row = '    {:<10}' + ('  {:<20}' * 4)
         tpl_red = '\x1b[38;5;1m{}\x1b[0m'
         tpl_green = '\x1b[38;5;2m{}\x1b[0m'
         if data['compat']:
    @@ -110,7 +111,8 @@ def get_row(*args):
     def is_model_path(model_path):
         exclude = ['cache', 'pycache', '__pycache__']
         name = model_path.parts[-1]
    -    return model_path.is_dir() and name not in exclude and not name.startswith('.')
    +    return (model_path.is_dir() and name not in exclude
    +            and not name.startswith('.'))
     
     
     def is_compat(compat, name, version):
    @@ -118,6 +120,7 @@ def is_compat(compat, name, version):
     
     
     def reformat_version(version):
    +    """Hack to reformat old versions ending on '-alpha' to match pip format."""
         if version.endswith('-alpha'):
             return version.replace('-alpha', 'a0')
         return version.replace('-alpha', 'a')
    
    From ea4a41c8fb573e3034daacdae117f39b18e82842 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 14:39:09 +0200
    Subject: [PATCH 574/649] Tidy up util and helpers
    
    ---
     spacy/compat.py            | 12 ++---
     spacy/deprecated.py        |  9 ++--
     spacy/glossary.py          |  1 -
     spacy/tokens/printers.py   |  9 ++--
     spacy/tokens/underscore.py |  4 ++
     spacy/util.py              | 99 ++++++++++++++++++++------------------
     6 files changed, 71 insertions(+), 63 deletions(-)
    
    diff --git a/spacy/compat.py b/spacy/compat.py
    index 81243ce1b..260c956fb 100644
    --- a/spacy/compat.py
    +++ b/spacy/compat.py
    @@ -87,15 +87,15 @@ def symlink_to(orig, dest):
     
     
     def is_config(python2=None, python3=None, windows=None, linux=None, osx=None):
    -    return ((python2 == None or python2 == is_python2) and
    -            (python3 == None or python3 == is_python3) and
    -            (windows == None or windows == is_windows) and
    -            (linux == None or linux == is_linux) and
    -            (osx == None or osx == is_osx))
    +    return ((python2 is None or python2 == is_python2) and
    +            (python3 is None or python3 == is_python3) and
    +            (windows is None or windows == is_windows) and
    +            (linux is None or linux == is_linux) and
    +            (osx is None or osx == is_osx))
     
     
     def normalize_string_keys(old):
    -    '''Given a dictionary, make sure keys are unicode strings, not bytes.'''
    +    """Given a dictionary, make sure keys are unicode strings, not bytes."""
         new = {}
         for key, value in old.items():
             if isinstance(key, bytes_):
    diff --git a/spacy/deprecated.py b/spacy/deprecated.py
    index ad52bfe24..a1143474a 100644
    --- a/spacy/deprecated.py
    +++ b/spacy/deprecated.py
    @@ -24,7 +24,7 @@ def depr_model_download(lang):
     
     
     def resolve_load_name(name, **overrides):
    -    """Resolve model loading if deprecated path kwarg is specified in overrides.
    +    """Resolve model loading if deprecated path kwarg in overrides.
     
         name (unicode): Name of model to load.
         **overrides: Overrides specified in spacy.load().
    @@ -32,8 +32,9 @@ def resolve_load_name(name, **overrides):
         """
         if overrides.get('path') not in (None, False, True):
             name = overrides.get('path')
    -        prints("To load a model from a path, you can now use the first argument. "
    -               "The model meta is used to load the required Language class.",
    -               "OLD: spacy.load('en', path='/some/path')", "NEW: spacy.load('/some/path')",
    +        prints("To load a model from a path, you can now use the first "
    +               "argument. The model meta is used to load the Language class.",
    +               "OLD: spacy.load('en', path='/some/path')",
    +               "NEW: spacy.load('/some/path')",
                    title="Warning: deprecated argument 'path'")
         return name
    diff --git a/spacy/glossary.py b/spacy/glossary.py
    index fd74d85e7..78e61f8a7 100644
    --- a/spacy/glossary.py
    +++ b/spacy/glossary.py
    @@ -264,7 +264,6 @@ GLOSSARY = {
         'nk':           'noun kernel element',
         'nmc':          'numerical component',
         'oa':           'accusative object',
    -    'oa':           'second accusative object',
         'oc':           'clausal object',
         'og':           'genitive object',
         'op':           'prepositional object',
    diff --git a/spacy/tokens/printers.py b/spacy/tokens/printers.py
    index 4bc7099d7..92b2cd84c 100644
    --- a/spacy/tokens/printers.py
    +++ b/spacy/tokens/printers.py
    @@ -43,8 +43,8 @@ def POS_tree(root, light=False, flat=False):
     
     
     def parse_tree(doc, light=False, flat=False):
    -    """Makes a copy of the doc, then construct a syntactic parse tree, similar to
    -    the one used in displaCy. Generates the POS tree for all sentences in a doc.
    +    """Make a copy of the doc and construct a syntactic parse tree similar to
    +    displaCy. Generates the POS tree for all sentences in a doc.
     
         doc (Doc): The doc for parsing.
         RETURNS (dict): The parse tree.
    @@ -66,8 +66,9 @@ def parse_tree(doc, light=False, flat=False):
                 'NE': '', 'word': 'ate', 'arc': 'ROOT', 'POS_coarse': 'VERB',
                 'POS_fine': 'VBD', 'lemma': 'eat'}
         """
    -    doc_clone  = Doc(doc.vocab, words=[w.text for w in doc])
    +    doc_clone = Doc(doc.vocab, words=[w.text for w in doc])
         doc_clone.from_array([HEAD, TAG, DEP, ENT_IOB, ENT_TYPE],
                              doc.to_array([HEAD, TAG, DEP, ENT_IOB, ENT_TYPE]))
         merge_ents(doc_clone)  # merge the entities into single tokens first
    -    return [POS_tree(sent.root, light=light, flat=flat) for sent in doc_clone.sents]
    +    return [POS_tree(sent.root, light=light, flat=flat)
    +            for sent in doc_clone.sents]
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    index 6e782647b..d80f50685 100644
    --- a/spacy/tokens/underscore.py
    +++ b/spacy/tokens/underscore.py
    @@ -1,5 +1,9 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
     import functools
     
    +
     class Underscore(object):
         doc_extensions = {}
         span_extensions = {}
    diff --git a/spacy/util.py b/spacy/util.py
    index ca5a40f97..a45d43c47 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -10,25 +10,27 @@ from pathlib import Path
     import sys
     import textwrap
     import random
    -import numpy
    -import io
    -import dill
     from collections import OrderedDict
     from thinc.neural._classes.model import Model
     import functools
     
    +from .symbols import ORTH
    +from .compat import cupy, CudaStream, path2str, basestring_, input_, unicode_
    +from .compat import import_file
    +
     import msgpack
     import msgpack_numpy
     msgpack_numpy.patch()
    -import ujson
    -
    -from .symbols import ORTH
    -from .compat import cupy, CudaStream, path2str, basestring_, input_, unicode_
    -from .compat import copy_array, normalize_string_keys, getattr_, import_file
     
     
     LANGUAGES = {}
     _data_path = Path(__file__).parent / 'data'
    +_PRINT_ENV = False
    +
    +
    +def set_env_log(value):
    +    global _PRINT_ENV
    +    _PRINT_ENV = value
     
     
     def get_lang_class(lang):
    @@ -38,11 +40,12 @@ def get_lang_class(lang):
         RETURNS (Language): Language class.
         """
         global LANGUAGES
    -    if not lang in LANGUAGES:
    +    if lang not in LANGUAGES:
             try:
                 module = importlib.import_module('.lang.%s' % lang, 'spacy')
             except ImportError:
    -            raise ImportError("Can't import language %s from spacy.lang." %lang)
    +            msg = "Can't import language %s from spacy.lang."
    +            raise ImportError(msg % lang)
             LANGUAGES[lang] = getattr(module, module.__all__[0])
         return LANGUAGES[lang]
     
    @@ -100,14 +103,14 @@ def load_model(name, **overrides):
         data_path = get_data_path()
         if not data_path or not data_path.exists():
             raise IOError("Can't find spaCy data path: %s" % path2str(data_path))
    -    if isinstance(name, basestring_):
    -        if name in set([d.name for d in data_path.iterdir()]): # in data dir / shortcut
    +    if isinstance(name, basestring_):  # in data dir / shortcut
    +        if name in set([d.name for d in data_path.iterdir()]):
                 return load_model_from_link(name, **overrides)
    -        if is_package(name): # installed as package
    +        if is_package(name):  # installed as package
                 return load_model_from_package(name, **overrides)
    -        if Path(name).exists(): # path to model data directory
    +        if Path(name).exists():  # path to model data directory
                 return load_model_from_path(Path(name), **overrides)
    -    elif hasattr(name, 'exists'): # Path or Path-like to model data
    +    elif hasattr(name, 'exists'):  # Path or Path-like to model data
             return load_model_from_path(name, **overrides)
         raise IOError("Can't find model '%s'" % name)
     
    @@ -120,7 +123,7 @@ def load_model_from_link(name, **overrides):
         except AttributeError:
             raise IOError(
                 "Cant' load '%s'. If you're using a shortcut link, make sure it "
    -            "points to a valid model package (not just a data directory)." % name)
    +            "points to a valid package (not just a data directory)." % name)
         return cls.load(**overrides)
     
     
    @@ -164,7 +167,8 @@ def load_model_from_init_py(init_file, **overrides):
         data_dir = '%s_%s-%s' % (meta['lang'], meta['name'], meta['version'])
         data_path = model_path / data_dir
         if not model_path.exists():
    -        raise ValueError("Can't find model directory: %s" % path2str(data_path))
    +        msg = "Can't find model directory: %s"
    +        raise ValueError(msg % path2str(data_path))
         return load_model_from_path(data_path, meta, **overrides)
     
     
    @@ -176,14 +180,16 @@ def get_model_meta(path):
         """
         model_path = ensure_path(path)
         if not model_path.exists():
    -        raise ValueError("Can't find model directory: %s" % path2str(model_path))
    +        msg = "Can't find model directory: %s"
    +        raise ValueError(msg % path2str(model_path))
         meta_path = model_path / 'meta.json'
         if not meta_path.is_file():
             raise IOError("Could not read meta.json from %s" % meta_path)
         meta = read_json(meta_path)
         for setting in ['lang', 'name', 'version']:
             if setting not in meta or not meta[setting]:
    -            raise ValueError("No valid '%s' setting found in model meta.json" % setting)
    +            msg = "No valid '%s' setting found in model meta.json"
    +            raise ValueError(msg % setting)
         return meta
     
     
    @@ -240,7 +246,7 @@ def get_async(stream, numpy_array):
             return numpy_array
         else:
             array = cupy.ndarray(numpy_array.shape, order='C',
    -                           dtype=numpy_array.dtype)
    +                             dtype=numpy_array.dtype)
             array.set(numpy_array, stream=stream)
             return array
     
    @@ -274,12 +280,6 @@ def itershuffle(iterable, bufsize=1000):
             raise StopIteration
     
     
    -_PRINT_ENV = False
    -def set_env_log(value):
    -    global _PRINT_ENV
    -    _PRINT_ENV = value
    -
    -
     def env_opt(name, default=None):
         if type(default) is float:
             type_convert = float
    @@ -305,17 +305,20 @@ def read_regex(path):
         path = ensure_path(path)
         with path.open() as file_:
             entries = file_.read().split('\n')
    -    expression = '|'.join(['^' + re.escape(piece) for piece in entries if piece.strip()])
    +    expression = '|'.join(['^' + re.escape(piece)
    +                           for piece in entries if piece.strip()])
         return re.compile(expression)
     
     
     def compile_prefix_regex(entries):
         if '(' in entries:
             # Handle deprecated data
    -        expression = '|'.join(['^' + re.escape(piece) for piece in entries if piece.strip()])
    +        expression = '|'.join(['^' + re.escape(piece)
    +                               for piece in entries if piece.strip()])
             return re.compile(expression)
         else:
    -        expression = '|'.join(['^' + piece for piece in entries if piece.strip()])
    +        expression = '|'.join(['^' + piece
    +                               for piece in entries if piece.strip()])
             return re.compile(expression)
     
     
    @@ -359,16 +362,15 @@ def update_exc(base_exceptions, *addition_dicts):
         exc = dict(base_exceptions)
         for additions in addition_dicts:
             for orth, token_attrs in additions.items():
    -            if not all(isinstance(attr[ORTH], unicode_) for attr in token_attrs):
    -                msg = "Invalid value for ORTH in exception: key='%s', orths='%s'"
    +            if not all(isinstance(attr[ORTH], unicode_)
    +                       for attr in token_attrs):
    +                msg = "Invalid ORTH value in exception: key='%s', orths='%s'"
                     raise ValueError(msg % (orth, token_attrs))
                 described_orth = ''.join(attr[ORTH] for attr in token_attrs)
                 if orth != described_orth:
    -                raise ValueError("Invalid tokenizer exception: ORTH values "
    -                                 "combined don't match original string. "
    -                                 "key='%s', orths='%s'" % (orth, described_orth))
    -        # overlap = set(exc.keys()).intersection(set(additions))
    -        # assert not overlap, overlap
    +                msg = ("Invalid tokenizer exception: ORTH values combined "
    +                       "don't match original string. key='%s', orths='%s'")
    +                raise ValueError(msg % (orth, described_orth))
             exc.update(additions)
         exc = expand_exc(exc, "'", "’")
         return exc
    @@ -401,17 +403,15 @@ def normalize_slice(length, start, stop, step=None):
             raise ValueError("Stepped slices not supported in Span objects."
                              "Try: list(tokens)[start:stop:step] instead.")
         if start is None:
    -       start = 0
    +        start = 0
         elif start < 0:
    -       start += length
    +        start += length
         start = min(length, max(0, start))
    -
         if stop is None:
    -       stop = length
    +        stop = length
         elif stop < 0:
    -       stop += length
    +        stop += length
         stop = min(length, max(start, stop))
    -
         assert 0 <= start <= stop <= length
         return start, stop
     
    @@ -428,7 +428,7 @@ def compounding(start, stop, compound):
           >>> assert next(sizes) == 1.5 * 1.5
         """
         def clip(value):
    -        return max(value, stop) if (start>stop) else min(value, stop)
    +        return max(value, stop) if (start > stop) else min(value, stop)
         curr = float(start)
         while True:
             yield clip(curr)
    @@ -438,7 +438,7 @@ def compounding(start, stop, compound):
     def decaying(start, stop, decay):
         """Yield an infinite series of linearly decaying values."""
         def clip(value):
    -        return max(value, stop) if (start>stop) else min(value, stop)
    +        return max(value, stop) if (start > stop) else min(value, stop)
         nr_upd = 1.
         while True:
             yield clip(start * 1./(1. + decay * nr_upd))
    @@ -530,17 +530,19 @@ def print_markdown(data, title=None):
     
         if isinstance(data, dict):
             data = list(data.items())
    -    markdown = ["* **{}:** {}".format(l, unicode_(v)) for l, v in data if not excl_value(v)]
    +    markdown = ["* **{}:** {}".format(l, unicode_(v))
    +                for l, v in data if not excl_value(v)]
         if title:
             print("\n## {}".format(title))
         print('\n{}\n'.format('\n'.join(markdown)))
     
     
     def prints(*texts, **kwargs):
    -    """Print formatted message (manual ANSI escape sequences to avoid dependency)
    +    """Print formatted message (manual ANSI escape sequences to avoid
    +    dependency)
     
         *texts (unicode): Texts to print. Each argument is rendered as paragraph.
    -    **kwargs: 'title' becomes coloured headline. 'exits'=True performs sys exit.
    +    **kwargs: 'title' becomes coloured headline. exits=True performs sys exit.
         """
         exits = kwargs.get('exits', None)
         title = kwargs.get('title', None)
    @@ -570,7 +572,8 @@ def _wrap(text, wrap_max=80, indent=4):
     
     def minify_html(html):
         """Perform a template-specific, rudimentary HTML minification for displaCy.
    -    Disclaimer: NOT a general-purpose solution, only removes indentation/newlines.
    +    Disclaimer: NOT a general-purpose solution, only removes indentation and
    +    newlines.
     
         html (unicode): Markup to minify.
         RETURNS (unicode): "Minified" HTML.
    
    From e3265998c07cc2a34d7ebeb6483dbe431bb8f8a2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 14:39:19 +0200
    Subject: [PATCH 575/649] Tidy up displaCy
    
    ---
     spacy/displacy/__init__.py | 26 +++++++++++++----------
     spacy/displacy/render.py   | 43 +++++++++++++++++++++++---------------
     2 files changed, 41 insertions(+), 28 deletions(-)
    
    diff --git a/spacy/displacy/__init__.py b/spacy/displacy/__init__.py
    index 7c479f94c..e160c31b6 100644
    --- a/spacy/displacy/__init__.py
    +++ b/spacy/displacy/__init__.py
    @@ -12,7 +12,7 @@ IS_JUPYTER = is_in_jupyter()
     
     
     def render(docs, style='dep', page=False, minify=False, jupyter=IS_JUPYTER,
    -          options={}, manual=False):
    +           options={}, manual=False):
         """Render displaCy visualisation.
     
         docs (list or Doc): Document(s) to visualise.
    @@ -21,7 +21,7 @@ def render(docs, style='dep', page=False, minify=False, jupyter=IS_JUPYTER,
         minify (bool): Minify HTML markup.
         jupyter (bool): Experimental, use Jupyter's `display()` to output markup.
         options (dict): Visualiser-specific options, e.g. colors.
    -    manual (bool): Don't parse `Doc` and instead, expect a dict or list of dicts.
    +    manual (bool): Don't parse `Doc` and instead expect a dict/list of dicts.
         RETURNS (unicode): Rendered HTML markup.
         """
         factories = {'dep': (DependencyRenderer, parse_deps),
    @@ -35,7 +35,7 @@ def render(docs, style='dep', page=False, minify=False, jupyter=IS_JUPYTER,
         parsed = [converter(doc, options) for doc in docs] if not manual else docs
         _html['parsed'] = renderer.render(parsed, page=page, minify=minify).strip()
         html = _html['parsed']
    -    if jupyter: # return HTML rendered by IPython display()
    +    if jupyter:  # return HTML rendered by IPython display()
             from IPython.core.display import display, HTML
             return display(HTML(html))
         return html
    @@ -50,13 +50,15 @@ def serve(docs, style='dep', page=True, minify=False, options={}, manual=False,
         page (bool): Render markup as full HTML page.
         minify (bool): Minify HTML markup.
         options (dict): Visualiser-specific options, e.g. colors.
    -    manual (bool): Don't parse `Doc` and instead, expect a dict or list of dicts.
    +    manual (bool): Don't parse `Doc` and instead expect a dict/list of dicts.
         port (int): Port to serve visualisation.
         """
         from wsgiref import simple_server
    -    render(docs, style=style, page=page, minify=minify, options=options, manual=manual)
    +    render(docs, style=style, page=page, minify=minify, options=options,
    +           manual=manual)
         httpd = simple_server.make_server('0.0.0.0', port, app)
    -    prints("Using the '%s' visualizer" % style, title="Serving on port %d..." % port)
    +    prints("Using the '%s' visualizer" % style,
    +           title="Serving on port %d..." % port)
         try:
             httpd.serve_forever()
         except KeyboardInterrupt:
    @@ -67,7 +69,8 @@ def serve(docs, style='dep', page=True, minify=False, options={}, manual=False,
     
     def app(environ, start_response):
         # headers and status need to be bytes in Python 2, see #1227
    -    headers = [(b_to_str(b'Content-type'), b_to_str(b'text/html; charset=utf-8'))]
    +    headers = [(b_to_str(b'Content-type'),
    +                b_to_str(b'text/html; charset=utf-8'))]
         start_response(b_to_str(b'200 OK'), headers)
         res = _html['parsed'].encode(encoding='utf-8')
         return [res]
    @@ -89,9 +92,9 @@ def parse_deps(orig_doc, options={}):
                 end = word.i + 1
                 while end < len(doc) and doc[end].is_punct:
                     end += 1
    -            span = doc[start : end]
    +            span = doc[start:end]
                 spans.append((span.start_char, span.end_char, word.tag_,
    -                            word.lemma_, word.ent_type_))
    +                          word.lemma_, word.ent_type_))
             for span_props in spans:
                 doc.merge(*span_props)
         words = [{'text': w.text, 'tag': w.tag_} for w in doc]
    @@ -113,6 +116,7 @@ def parse_ents(doc, options={}):
         RETURNS (dict): Generated entities keyed by text (original text) and ents.
         """
         ents = [{'start': ent.start_char, 'end': ent.end_char, 'label': ent.label_}
    -             for ent in doc.ents]
    -    title = doc.user_data.get('title', None) if hasattr(doc, 'user_data') else None
    +            for ent in doc.ents]
    +    title = (doc.user_data.get('title', None)
    +             if hasattr(doc, 'user_data') else None)
         return {'text': doc.text, 'ents': ents, 'title': title}
    diff --git a/spacy/displacy/render.py b/spacy/displacy/render.py
    index 1050ffa87..4a494591c 100644
    --- a/spacy/displacy/render.py
    +++ b/spacy/displacy/render.py
    @@ -14,13 +14,15 @@ class DependencyRenderer(object):
             """Initialise dependency renderer.
     
             options (dict): Visualiser-specific options (compact, word_spacing,
    -                        arrow_spacing, arrow_width, arrow_stroke, distance,
    -                        offset_x, color, bg, font)
    +            arrow_spacing, arrow_width, arrow_stroke, distance, offset_x,
    +            color, bg, font)
             """
             self.compact = options.get('compact', False)
             self.word_spacing = options.get('word_spacing', 45)
    -        self.arrow_spacing = options.get('arrow_spacing', 12 if self.compact else 20)
    -        self.arrow_width = options.get('arrow_width', 6 if self.compact else 10)
    +        self.arrow_spacing = options.get('arrow_spacing',
    +                                         12 if self.compact else 20)
    +        self.arrow_width = options.get('arrow_width',
    +                                       6 if self.compact else 10)
             self.arrow_stroke = options.get('arrow_stroke', 2)
             self.distance = options.get('distance', 150 if self.compact else 175)
             self.offset_x = options.get('offset_x', 50)
    @@ -39,7 +41,8 @@ class DependencyRenderer(object):
             rendered = [self.render_svg(i, p['words'], p['arcs'])
                         for i, p in enumerate(parsed)]
             if page:
    -            content = ''.join([TPL_FIGURE.format(content=svg) for svg in rendered])
    +            content = ''.join([TPL_FIGURE.format(content=svg)
    +                               for svg in rendered])
                 markup = TPL_PAGE.format(content=content)
             else:
                 markup = ''.join(rendered)
    @@ -63,12 +66,13 @@ class DependencyRenderer(object):
             self.id = render_id
             words = [self.render_word(w['text'], w['tag'], i)
                      for i, w in enumerate(words)]
    -        arcs = [self.render_arrow(a['label'], a['start'], a['end'], a['dir'], i)
    +        arcs = [self.render_arrow(a['label'], a['start'],
    +                                  a['end'], a['dir'], i)
                     for i, a in enumerate(arcs)]
             content = ''.join(words) + ''.join(arcs)
    -        return TPL_DEP_SVG.format(id=self.id, width=self.width, height=self.height,
    -                                  color=self.color, bg=self.bg, font=self.font,
    -                                  content=content)
    +        return TPL_DEP_SVG.format(id=self.id, width=self.width,
    +                                  height=self.height, color=self.color,
    +                                  bg=self.bg, font=self.font, content=content)
     
         def render_word(self, text, tag, i):
             """Render individual word.
    @@ -96,7 +100,7 @@ class DependencyRenderer(object):
             x_start = self.offset_x+start*self.distance+self.arrow_spacing
             y = self.offset_y
             x_end = (self.offset_x+(end-start)*self.distance+start*self.distance
    -                 -self.arrow_spacing*(self.highest_level-level)/4)
    +                 - self.arrow_spacing*(self.highest_level-level)/4)
             y_curve = self.offset_y-level*self.distance/2
             if self.compact:
                 y_curve = self.offset_y-level*self.distance/6
    @@ -133,8 +137,10 @@ class DependencyRenderer(object):
             if direction is 'left':
                 pos1, pos2, pos3 = (x, x-self.arrow_width+2, x+self.arrow_width-2)
             else:
    -            pos1, pos2, pos3 = (end, end+self.arrow_width-2, end-self.arrow_width+2)
    -        arrowhead = (pos1, y+2, pos2, y-self.arrow_width, pos3, y-self.arrow_width)
    +            pos1, pos2, pos3 = (end, end+self.arrow_width-2,
    +                                end-self.arrow_width+2)
    +        arrowhead = (pos1, y+2, pos2, y-self.arrow_width, pos3,
    +                     y-self.arrow_width)
             return "M{},{} L{},{} {},{}".format(*arrowhead)
     
         def get_levels(self, arcs):
    @@ -159,9 +165,10 @@ class EntityRenderer(object):
             """
             colors = {'ORG': '#7aecec', 'PRODUCT': '#bfeeb7', 'GPE': '#feca74',
                       'LOC': '#ff9561', 'PERSON': '#aa9cfc', 'NORP': '#c887fb',
    -                  'FACILITY': '#9cc9cc', 'EVENT': '#ffeb80', 'LANGUAGE': '#ff8197',
    -                  'WORK_OF_ART': '#f0d0ff', 'DATE': '#bfe1d9', 'TIME': '#bfe1d9',
    -                  'MONEY': '#e4e7d2', 'QUANTITY': '#e4e7d2', 'ORDINAL': '#e4e7d2',
    +                  'FACILITY': '#9cc9cc', 'EVENT': '#ffeb80', 'LAW': '#ff8197',
    +                  'LANGUAGE': '#ff8197', 'WORK_OF_ART': '#f0d0ff',
    +                  'DATE': '#bfe1d9', 'TIME': '#bfe1d9', 'MONEY': '#e4e7d2',
    +                  'QUANTITY': '#e4e7d2', 'ORDINAL': '#e4e7d2',
                       'CARDINAL': '#e4e7d2', 'PERCENT': '#e4e7d2'}
             colors.update(options.get('colors', {}))
             self.default_color = '#ddd'
    @@ -176,9 +183,11 @@ class EntityRenderer(object):
             minify (bool): Minify HTML markup.
             RETURNS (unicode): Rendered HTML markup.
             """
    -        rendered = [self.render_ents(p['text'], p['ents'], p.get('title', None)) for p in parsed]
    +        rendered = [self.render_ents(p['text'], p['ents'],
    +                    p.get('title', None)) for p in parsed]
             if page:
    -            docs = ''.join([TPL_FIGURE.format(content=doc) for doc in rendered])
    +            docs = ''.join([TPL_FIGURE.format(content=doc)
    +                            for doc in rendered])
                 markup = TPL_PAGE.format(content=docs)
             else:
                 markup = ''.join(rendered)
    
    From e33b7e0b3c8f7a205e093ff481a8d6bc6b402eb9 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 14:39:30 +0200
    Subject: [PATCH 576/649] Tidy up parser and ML
    
    ---
     spacy/_ml.py               | 295 +++++++++----------------------------
     spacy/syntax/nn_parser.pyx |  59 +++-----
     2 files changed, 94 insertions(+), 260 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 4c4e36412..89324b3b3 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -1,47 +1,42 @@
    -import ujson
    -from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +import numpy
    +from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu
     from thinc.i2v import HashEmbed, StaticVectors
     from thinc.t2t import ExtractWindow, ParametricAttention
    -from thinc.t2v import Pooling, max_pool, mean_pool, sum_pool
    +from thinc.t2v import Pooling, sum_pool
     from thinc.misc import Residual
    -from thinc.misc import BatchNorm as BN
     from thinc.misc import LayerNorm as LN
     
     from thinc.api import add, layerize, chain, clone, concatenate, with_flatten
    -from thinc.api import FeatureExtracter, with_getitem
    -from thinc.api import uniqued, wrap, flatten_add_lengths, noop
    +from thinc.api import FeatureExtracter, with_getitem, flatten_add_lengths
    +from thinc.api import uniqued, wrap, noop
     
     from thinc.linear.linear import LinearModel
     from thinc.neural.ops import NumpyOps, CupyOps
     from thinc.neural.util import get_array_module
     
    -import random
    -import cytoolz
    -
     from thinc import describe
     from thinc.describe import Dimension, Synapses, Biases, Gradient
     from thinc.neural._classes.affine import _set_dimensions_if_needed
     import thinc.extra.load_nlp
     
    -from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER
    -from .tokens.doc import Doc
    +from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE
     from . import util
     
    -import numpy
    -import io
    -
    -# TODO: Unset this once we don't want to support models previous models.
    -import thinc.neural._classes.layernorm
    -thinc.neural._classes.layernorm.set_compat_six_eight(False)
     
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
    +
     @layerize
     def _flatten_add_lengths(seqs, pad=0, drop=0.):
         ops = Model.ops
         lengths = ops.asarray([len(seq) for seq in seqs], dtype='i')
    +
         def finish_update(d_X, sgd=None):
             return ops.unflatten(d_X, lengths, pad=pad)
    +
         X = ops.flatten(seqs, pad=pad)
         return (X, lengths), finish_update
     
    @@ -55,33 +50,14 @@ def _logistic(X, drop=0.):
         X = xp.minimum(X, 10., X)
         X = xp.maximum(X, -10., X)
         Y = 1. / (1. + xp.exp(-X))
    +
         def logistic_bwd(dY, sgd=None):
             dX = dY * (Y * (1-Y))
             return dX
    +
         return Y, logistic_bwd
     
     
    -@layerize
    -def add_tuples(X, drop=0.):
    -    """Give inputs of sequence pairs, where each sequence is (vals, length),
    -    sum the values, returning a single sequence.
    -
    -    If input is:
    -    ((vals1, length), (vals2, length)
    -    Output is:
    -    (vals1+vals2, length)
    -
    -    vals are a single tensor for the whole batch.
    -    """
    -    (vals1, length1), (vals2, length2) = X
    -    assert length1 == length2
    -
    -    def add_tuples_bwd(dY, sgd=None):
    -        return (dY, dY)
    -
    -    return (vals1+vals2, length), add_tuples_bwd
    -
    -
     def _zero_init(model):
         def _zero_init_impl(self, X, y):
             self.W.fill(0)
    @@ -115,13 +91,12 @@ def _init_for_precomputed(W, ops):
         nF=Dimension("Number of features"),
         nO=Dimension("Output size"),
         W=Synapses("Weights matrix",
    -        lambda obj: (obj.nF, obj.nO, obj.nI),
    -        lambda W, ops: _init_for_precomputed(W, ops)),
    +               lambda obj: (obj.nF, obj.nO, obj.nI),
    +               lambda W, ops: _init_for_precomputed(W, ops)),
         b=Biases("Bias vector",
    -        lambda obj: (obj.nO,)),
    +             lambda obj: (obj.nO,)),
         d_W=Gradient("W"),
    -    d_b=Gradient("b")
    -)
    +    d_b=Gradient("b"))
     class PrecomputableAffine(Model):
         def __init__(self, nO=None, nI=None, nF=None, **kwargs):
             Model.__init__(self, **kwargs)
    @@ -134,18 +109,19 @@ class PrecomputableAffine(Model):
             # Yf: (b, f, i)
             # dY: (b, o)
             # dYf: (b, f, o)
    -        #Yf = numpy.einsum('bi,foi->bfo', X, self.W)
    +        # Yf = numpy.einsum('bi,foi->bfo', X, self.W)
             Yf = self.ops.xp.tensordot(
                     X, self.W, axes=[[1], [2]])
             Yf += self.b
    +
             def backward(dY_ids, sgd=None):
                 tensordot = self.ops.xp.tensordot
                 dY, ids = dY_ids
                 Xf = X[ids]
     
    -            #dXf = numpy.einsum('bo,foi->bfi', dY, self.W)
    +            # dXf = numpy.einsum('bo,foi->bfi', dY, self.W)
                 dXf = tensordot(dY, self.W, axes=[[1], [1]])
    -            #dW = numpy.einsum('bo,bfi->ofi', dY, Xf)
    +            # dW = numpy.einsum('bo,bfi->ofi', dY, Xf)
                 dW = tensordot(dY, Xf, axes=[[0], [0]])
                 # ofi -> foi
                 self.d_W += dW.transpose((1, 0, 2))
    @@ -154,6 +130,7 @@ class PrecomputableAffine(Model):
                 if sgd is not None:
                     sgd(self._mem.weights, self._mem.gradient, key=self.id)
                 return dXf
    +
             return Yf, backward
     
     
    @@ -164,13 +141,12 @@ class PrecomputableAffine(Model):
         nP=Dimension("Number of pieces"),
         nO=Dimension("Output size"),
         W=Synapses("Weights matrix",
    -        lambda obj: (obj.nF, obj.nO, obj.nP, obj.nI),
    -        lambda W, ops: ops.xavier_uniform_init(W)),
    +               lambda obj: (obj.nF, obj.nO, obj.nP, obj.nI),
    +               lambda W, ops: ops.xavier_uniform_init(W)),
         b=Biases("Bias vector",
    -        lambda obj: (obj.nO, obj.nP)),
    +             lambda obj: (obj.nO, obj.nP)),
         d_W=Gradient("W"),
    -    d_b=Gradient("b")
    -)
    +    d_b=Gradient("b"))
     class PrecomputableMaxouts(Model):
         def __init__(self, nO=None, nI=None, nF=None, nP=3, **kwargs):
             Model.__init__(self, **kwargs)
    @@ -186,114 +162,26 @@ class PrecomputableMaxouts(Model):
             # dYp: (b, o, p)
             # W: (f, o, p, i)
             # b: (o, p)
    -
             # bi,opfi->bfop
             # bop,fopi->bfi
             # bop,fbi->opfi : fopi
    -
             tensordot = self.ops.xp.tensordot
    -        ascontiguous = self.ops.xp.ascontiguousarray
    -
             Yfp = tensordot(X, self.W, axes=[[1], [3]])
             Yfp += self.b
     
             def backward(dYp_ids, sgd=None):
                 dYp, ids = dYp_ids
                 Xf = X[ids]
    -
    -            dXf = tensordot(dYp, self.W, axes=[[1, 2], [1,2]])
    +            dXf = tensordot(dYp, self.W, axes=[[1, 2], [1, 2]])
                 dW = tensordot(dYp, Xf, axes=[[0], [0]])
    -
                 self.d_W += dW.transpose((2, 0, 1, 3))
                 self.d_b += dYp.sum(axis=0)
    -
                 if sgd is not None:
                     sgd(self._mem.weights, self._mem.gradient, key=self.id)
                 return dXf
    +
             return Yfp, backward
     
    -# Thinc's Embed class is a bit broken atm, so drop this here.
    -from thinc import describe
    -from thinc.neural._classes.embed import _uniform_init
    -
    -
    -@describe.attributes(
    -    nV=describe.Dimension("Number of vectors"),
    -    nO=describe.Dimension("Size of output"),
    -    vectors=describe.Weights("Embedding table",
    -        lambda obj: (obj.nV, obj.nO),
    -        _uniform_init(-0.1, 0.1)
    -    ),
    -    d_vectors=describe.Gradient("vectors")
    -)
    -class Embed(Model):
    -    name = 'embed'
    -
    -    def __init__(self, nO, nV=None, **kwargs):
    -        if nV is not None:
    -            nV += 1
    -        Model.__init__(self, **kwargs)
    -        if 'name' in kwargs:
    -            self.name = kwargs['name']
    -        self.column = kwargs.get('column', 0)
    -        self.nO = nO
    -        self.nV = nV
    -
    -    def predict(self, ids):
    -        if ids.ndim == 2:
    -            ids = ids[:, self.column]
    -        return self.ops.xp.ascontiguousarray(self.vectors[ids], dtype='f')
    -
    -    def begin_update(self, ids, drop=0.):
    -        if ids.ndim == 2:
    -            ids = ids[:, self.column]
    -        vectors = self.ops.xp.ascontiguousarray(self.vectors[ids], dtype='f')
    -        def backprop_embed(d_vectors, sgd=None):
    -            n_vectors = d_vectors.shape[0]
    -            self.ops.scatter_add(self.d_vectors, ids, d_vectors)
    -            if sgd is not None:
    -                sgd(self._mem.weights, self._mem.gradient, key=self.id)
    -            return None
    -        return vectors, backprop_embed
    -
    -
    -def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
    -    '''Wrap a model, adding features representing action history.'''
    -    if hist_size == 0:
    -        return layerize(noop())
    -    embed_tables = [Embed(nr_dim, nr_class, column=i, name='embed%d')
    -                    for i in range(hist_size)]
    -    embed = chain(concatenate(*embed_tables),
    -                  LN(Maxout(hist_size*nr_dim, hist_size*nr_dim)))
    -    ops = embed.ops
    -    def add_history_fwd(vectors_hists, drop=0.):
    -        vectors, hist_ids = vectors_hists
    -        hist_feats, bp_hists = embed.begin_update(hist_ids, drop=drop)
    -        outputs = ops.xp.hstack((vectors, hist_feats))
    -
    -        def add_history_bwd(d_outputs, sgd=None):
    -            d_vectors = d_outputs[:, :vectors.shape[1]]
    -            d_hists = d_outputs[:, vectors.shape[1]:]
    -            bp_hists(d_hists, sgd=sgd)
    -            return embed.ops.xp.ascontiguousarray(d_vectors)
    -        return outputs, add_history_bwd
    -    return wrap(add_history_fwd, embed)
    -
    -
    -def drop_layer(layer, factor=2.):
    -    def drop_layer_fwd(X, drop=0.):
    -        if drop <= 0.:
    -            return layer.begin_update(X, drop=drop)
    -        else:
    -            coinflip = layer.ops.xp.random.random()
    -            if (coinflip / factor) >= drop:
    -                return layer.begin_update(X, drop=drop)
    -            else:
    -                return X, lambda dX, sgd=None: dX
    -
    -    model = wrap(drop_layer_fwd, layer)
    -    model.predict = layer
    -    return model
     
     def link_vectors_to_models(vocab):
         vectors = vocab.vectors
    @@ -308,16 +196,21 @@ def link_vectors_to_models(vocab):
         # (unideal, I know)
         thinc.extra.load_nlp.VECTORS[(ops.device, VECTORS_KEY)] = data
     
    +
     def Tok2Vec(width, embed_size, **kwargs):
         pretrained_dims = kwargs.get('pretrained_dims', 0)
         cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 2)
         cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH]
    -    with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add,
    -                                 '*': reapply}):
    -        norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm')
    -        prefix = HashEmbed(width, embed_size//2, column=cols.index(PREFIX), name='embed_prefix')
    -        suffix = HashEmbed(width, embed_size//2, column=cols.index(SUFFIX), name='embed_suffix')
    -        shape = HashEmbed(width, embed_size//2, column=cols.index(SHAPE), name='embed_shape')
    +    with Model.define_operators({'>>': chain, '|': concatenate, '**': clone,
    +                                 '+': add, '*': reapply}):
    +        norm = HashEmbed(width, embed_size, column=cols.index(NORM),
    +                         name='embed_norm')
    +        prefix = HashEmbed(width, embed_size//2, column=cols.index(PREFIX),
    +                           name='embed_prefix')
    +        suffix = HashEmbed(width, embed_size//2, column=cols.index(SUFFIX),
    +                           name='embed_suffix')
    +        shape = HashEmbed(width, embed_size//2, column=cols.index(SHAPE),
    +                          name='embed_shape')
             if pretrained_dims is not None and pretrained_dims >= 1:
                 glove = StaticVectors(VECTORS_KEY, width, column=cols.index(ID))
     
    @@ -329,7 +222,6 @@ def Tok2Vec(width, embed_size, **kwargs):
                     (norm | prefix | suffix | shape)
                     >> LN(Maxout(width, width*4, pieces=3)), column=5)
     
    -
             convolution = Residual(
                 ExtractWindow(nW=1)
                 >> LN(Maxout(width, width*3, pieces=cnn_maxout_pieces))
    @@ -354,6 +246,7 @@ def reapply(layer, n_times):
                 Y, backprop = layer.begin_update(X, drop=drop)
                 X = Y
                 backprops.append(backprop)
    +
             def reapply_bwd(dY, sgd=None):
                 dX = None
                 for backprop in reversed(backprops):
    @@ -363,39 +256,20 @@ def reapply(layer, n_times):
                     else:
                         dX += dY
                 return dX
    +
             return Y, reapply_bwd
         return wrap(reapply_fwd, layer)
     
     
    -
    -
     def asarray(ops, dtype):
         def forward(X, drop=0.):
             return ops.asarray(X, dtype=dtype), None
         return layerize(forward)
     
     
    -def foreach(layer):
    -    def forward(Xs, drop=0.):
    -        results = []
    -        backprops = []
    -        for X in Xs:
    -            result, bp = layer.begin_update(X, drop=drop)
    -            results.append(result)
    -            backprops.append(bp)
    -        def backward(d_results, sgd=None):
    -            dXs = []
    -            for d_result, backprop in zip(d_results, backprops):
    -                dXs.append(backprop(d_result, sgd))
    -            return dXs
    -        return results, backward
    -    model = layerize(forward)
    -    model._layers.append(layer)
    -    return model
    -
    -
     def rebatch(size, layer):
         ops = layer.ops
    +
         def forward(X, drop=0.):
             if X.shape[0] < size:
                 return layer.begin_update(X)
    @@ -403,6 +277,7 @@ def rebatch(size, layer):
             results, bp_results = zip(*[layer.begin_update(p, drop=drop)
                                         for p in parts])
             y = ops.flatten(results)
    +
             def backward(dy, sgd=None):
                 d_parts = [bp(y, sgd=sgd) for bp, y in
                            zip(bp_results, _divide_array(dy, size))]
    @@ -413,6 +288,7 @@ def rebatch(size, layer):
                 except ValueError:
                     dX = None
                 return dX
    +
             return y, backward
         model = layerize(forward)
         model._layers.append(layer)
    @@ -423,13 +299,14 @@ def _divide_array(X, size):
         parts = []
         index = 0
         while index < len(X):
    -        parts.append(X[index : index + size])
    +        parts.append(X[index:index + size])
             index += size
         return parts
     
     
     def get_col(idx):
         assert idx >= 0, idx
    +
         def forward(X, drop=0.):
             assert idx >= 0, idx
             if isinstance(X, numpy.ndarray):
    @@ -437,30 +314,28 @@ def get_col(idx):
             else:
                 ops = CupyOps()
             output = ops.xp.ascontiguousarray(X[:, idx], dtype=X.dtype)
    +
             def backward(y, sgd=None):
                 assert idx >= 0, idx
                 dX = ops.allocate(X.shape)
                 dX[:, idx] += y
                 return dX
    +
             return output, backward
    +
         return layerize(forward)
     
     
    -def zero_init(model):
    -    def _hook(self, X, y=None):
    -        self.W.fill(0)
    -    model.on_data_hooks.append(_hook)
    -    return model
    -
    -
     def doc2feats(cols=None):
         if cols is None:
             cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH]
    +
         def forward(docs, drop=0.):
             feats = []
             for doc in docs:
                 feats.append(doc.to_array(cols))
             return feats, None
    +
         model = layerize(forward)
         model.cols = cols
         return model
    @@ -474,28 +349,14 @@ def print_shape(prefix):
     
     @layerize
     def get_token_vectors(tokens_attrs_vectors, drop=0.):
    -    ops = Model.ops
         tokens, attrs, vectors = tokens_attrs_vectors
    +
         def backward(d_output, sgd=None):
             return (tokens, d_output)
    +
         return vectors, backward
     
     
    -@layerize
    -def flatten(seqs, drop=0.):
    -    if isinstance(seqs[0], numpy.ndarray):
    -        ops = NumpyOps()
    -    elif hasattr(CupyOps.xp, 'ndarray') and isinstance(seqs[0], CupyOps.xp.ndarray):
    -        ops = CupyOps()
    -    else:
    -        raise ValueError("Unable to flatten sequence of type %s" % type(seqs[0]))
    -    lengths = [len(seq) for seq in seqs]
    -    def finish_update(d_X, sgd=None):
    -        return ops.unflatten(d_X, lengths)
    -    X = ops.xp.vstack(seqs)
    -    return X, finish_update
    -
    -
     @layerize
     def logistic(X, drop=0.):
         xp = get_array_module(X)
    @@ -505,9 +366,11 @@ def logistic(X, drop=0.):
         X = xp.minimum(X, 10., X)
         X = xp.maximum(X, -10., X)
         Y = 1. / (1. + xp.exp(-X))
    +
         def logistic_bwd(dY, sgd=None):
             dX = dY * (Y * (1-Y))
             return dX
    +
         return Y, logistic_bwd
     
     
    @@ -517,6 +380,7 @@ def zero_init(model):
         model.on_data_hooks.append(_zero_init_impl)
         return model
     
    +
     @layerize
     def preprocess_doc(docs, drop=0.):
         keys = [doc.to_array([LOWER]) for doc in docs]
    @@ -526,11 +390,13 @@ def preprocess_doc(docs, drop=0.):
         vals = ops.allocate(keys.shape[0]) + 1
         return (keys, vals, lengths), None
     
    +
     def getitem(i):
         def getitem_fwd(X, drop=0.):
             return X[i], None
         return layerize(getitem_fwd)
     
    +
     def build_tagger_model(nr_class, **cfg):
         embed_size = util.env_opt('embed_size', 7000)
         if 'token_vector_width' in cfg:
    @@ -555,8 +421,6 @@ def build_tagger_model(nr_class, **cfg):
     
     @layerize
     def SpacyVectors(docs, drop=0.):
    -    xp = get_array_module(docs[0].vocab.vectors.data)
    -    width = docs[0].vocab.vectors.data.shape[1]
         batch = []
         for doc in docs:
             indices = numpy.zeros((len(doc),), dtype='i')
    @@ -570,29 +434,6 @@ def SpacyVectors(docs, drop=0.):
         return batch, None
     
     
    -def foreach(layer, drop_factor=1.0):
    -    '''Map a layer across elements in a list'''
    -    def foreach_fwd(Xs, drop=0.):
    -        drop *= drop_factor
    -        ys = []
    -        backprops = []
    -        for X in Xs:
    -            y, bp_y = layer.begin_update(X, drop=drop)
    -            ys.append(y)
    -            backprops.append(bp_y)
    -        def foreach_bwd(d_ys, sgd=None):
    -            d_Xs = []
    -            for d_y, bp_y in zip(d_ys, backprops):
    -                if bp_y is not None and bp_y is not None:
    -                    d_Xs.append(d_y, sgd=sgd)
    -                else:
    -                    d_Xs.append(None)
    -            return d_Xs
    -        return ys, foreach_bwd
    -    model = wrap(foreach_fwd, layer)
    -    return model
    -
    -
     def build_text_classifier(nr_class, width=64, **cfg):
         nr_vector = cfg.get('nr_vector', 5000)
         pretrained_dims = cfg.get('pretrained_dims', 0)
    @@ -602,9 +443,7 @@ def build_text_classifier(nr_class, width=64, **cfg):
                 model = (
                     SpacyVectors
                     >> flatten_add_lengths
    -                >> with_getitem(0,
    -                    Affine(width, pretrained_dims)
    -                )
    +                >> with_getitem(0, Affine(width, pretrained_dims))
                     >> ParametricAttention(width)
                     >> Pooling(sum_pool)
                     >> Residual(ReLu(width, width)) ** 2
    @@ -613,7 +452,6 @@ def build_text_classifier(nr_class, width=64, **cfg):
                 )
                 return model
     
    -
             lower = HashEmbed(width, nr_vector, column=1)
             prefix = HashEmbed(width//2, nr_vector, column=2)
             suffix = HashEmbed(width//2, nr_vector, column=3)
    @@ -671,33 +509,40 @@ def build_text_classifier(nr_class, width=64, **cfg):
         model.lsuv = False
         return model
     
    +
     @layerize
     def flatten(seqs, drop=0.):
         ops = Model.ops
         lengths = ops.asarray([len(seq) for seq in seqs], dtype='i')
    +
         def finish_update(d_X, sgd=None):
             return ops.unflatten(d_X, lengths, pad=0)
    +
         X = ops.flatten(seqs, pad=0)
         return X, finish_update
     
     
    -def concatenate_lists(*layers, **kwargs): # pragma: no cover
    -    '''Compose two or more models `f`, `g`, etc, such that their outputs are
    +def concatenate_lists(*layers, **kwargs):  # pragma: no cover
    +    """Compose two or more models `f`, `g`, etc, such that their outputs are
         concatenated, i.e. `concatenate(f, g)(x)` computes `hstack(f(x), g(x))`
    -    '''
    +    """
         if not layers:
             return noop()
         drop_factor = kwargs.get('drop_factor', 1.0)
         ops = layers[0].ops
         layers = [chain(layer, flatten) for layer in layers]
         concat = concatenate(*layers)
    +
         def concatenate_lists_fwd(Xs, drop=0.):
             drop *= drop_factor
             lengths = ops.asarray([len(X) for X in Xs], dtype='i')
             flat_y, bp_flat_y = concat.begin_update(Xs, drop=drop)
             ys = ops.unflatten(flat_y, lengths)
    +
             def concatenate_lists_bwd(d_ys, sgd=None):
                 return bp_flat_y(ops.flatten(d_ys), sgd=sgd)
    +
             return ys, concatenate_lists_bwd
    +
         model = wrap(concatenate_lists_fwd, concat)
         return model
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index c592cdc22..12332ab25 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -49,9 +49,8 @@ from .. import util
     from ..util import get_async, get_cuda_stream
     from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts
     from .._ml import Tok2Vec, doc2feats, rebatch
    -from .._ml import Residual, drop_layer, flatten
    +from .._ml import Residual, flatten
     from .._ml import link_vectors_to_models
    -from .._ml import HistoryFeatures
     from ..compat import json_dumps, copy_array
     
     from .stateclass cimport StateClass
    @@ -77,7 +76,7 @@ def set_debug(val):
     
     
     cdef class precompute_hiddens:
    -    '''Allow a model to be "primed" by pre-computing input features in bulk.
    +    """Allow a model to be "primed" by pre-computing input features in bulk.
     
         This is used for the parser, where we want to take a batch of documents,
         and compute vectors for each (token, position) pair. These vectors can then
    @@ -92,7 +91,7 @@ cdef class precompute_hiddens:
         so we can save the factor k. This also gives a nice CPU/GPU division:
         we can do all our hard maths up front, packed into large multiplications,
         and do the hard-to-program parsing on the CPU.
    -    '''
    +    """
         cdef int nF, nO, nP
         cdef bint _is_synchronized
         cdef public object ops
    @@ -280,23 +279,19 @@ cdef class Parser:
             return (tok2vec, lower, upper), cfg
     
         def __init__(self, Vocab vocab, moves=True, model=True, **cfg):
    -        """
    -        Create a Parser.
    +        """Create a Parser.
     
    -        Arguments:
    -            vocab (Vocab):
    -                The vocabulary object. Must be shared with documents to be processed.
    -                The value is set to the .vocab attribute.
    -            moves (TransitionSystem):
    -                Defines how the parse-state is created, updated and evaluated.
    -                The value is set to the .moves attribute unless True (default),
    -                in which case a new instance is created with Parser.Moves().
    -            model (object):
    -                Defines how the parse-state is created, updated and evaluated.
    -                The value is set to the .model attribute unless True (default),
    -                in which case a new instance is created with Parser.Model().
    -            **cfg:
    -                Arbitrary configuration parameters. Set to the .cfg attribute
    +        vocab (Vocab): The vocabulary object. Must be shared with documents
    +            to be processed. The value is set to the `.vocab` attribute.
    +        moves (TransitionSystem): Defines how the parse-state is created,
    +            updated and evaluated. The value is set to the .moves attribute
    +            unless True (default), in which case a new instance is created with
    +            `Parser.Moves()`.
    +        model (object): Defines how the parse-state is created, updated and
    +            evaluated. The value is set to the .model attribute unless True
    +            (default), in which case a new instance is created with
    +            `Parser.Model()`.
    +        **cfg: Arbitrary configuration parameters. Set to the `.cfg` attribute
             """
             self.vocab = vocab
             if moves is True:
    @@ -322,13 +317,10 @@ cdef class Parser:
             return (Parser, (self.vocab, self.moves, self.model), None, None)
     
         def __call__(self, Doc doc, beam_width=None, beam_density=None):
    -        """
    -        Apply the parser or entity recognizer, setting the annotations onto the Doc object.
    +        """Apply the parser or entity recognizer, setting the annotations onto
    +        the `Doc` object.
     
    -        Arguments:
    -            doc (Doc): The document to be processed.
    -        Returns:
    -            None
    +        doc (Doc): The document to be processed.
             """
             if beam_width is None:
                 beam_width = self.cfg.get('beam_width', 1)
    @@ -350,16 +342,13 @@ cdef class Parser:
     
         def pipe(self, docs, int batch_size=256, int n_threads=2,
                  beam_width=None, beam_density=None):
    -        """
    -        Process a stream of documents.
    +        """Process a stream of documents.
     
    -        Arguments:
    -            stream: The sequence of documents to process.
    -            batch_size (int):
    -                The number of documents to accumulate into a working set.
    -            n_threads (int):
    -                The number of threads with which to work on the buffer in parallel.
    -        Yields (Doc): Documents, in order.
    +        stream: The sequence of documents to process.
    +        batch_size (int): Number of documents to accumulate into a working set.
    +        n_threads (int): The number of threads with which to work on the buffer
    +            in parallel.
    +        YIELDS (Doc): Documents, in order.
             """
             if beam_width is None:
                 beam_width = self.cfg.get('beam_width', 1)
    
    From 778212efeab79f673c55c29e26b11a20c4c1d8be Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 14:39:51 +0200
    Subject: [PATCH 577/649] Tidy up init and main
    
    ---
     spacy/__init__.py | 2 --
     spacy/__main__.py | 2 +-
     2 files changed, 1 insertion(+), 3 deletions(-)
    
    diff --git a/spacy/__init__.py b/spacy/__init__.py
    index ba2479106..9acc566ad 100644
    --- a/spacy/__init__.py
    +++ b/spacy/__init__.py
    @@ -3,8 +3,6 @@ from __future__ import unicode_literals
     
     from .cli.info import info as cli_info
     from .glossary import explain
    -from .deprecated import resolve_load_name
    -#from .about import __version__
     from .about import __version__
     from . import util
     
    diff --git a/spacy/__main__.py b/spacy/__main__.py
    index 99d6b116c..48460c9e3 100644
    --- a/spacy/__main__.py
    +++ b/spacy/__main__.py
    @@ -1,7 +1,7 @@
     # coding: utf8
     from __future__ import print_function
     # NB! This breaks in plac on Python 2!!
    -#from __future__ import unicode_literals
    +# from __future__ import unicode_literals
     
     if __name__ == '__main__':
         import plac
    
    From 91899d337b541636b4be8042251e2ae3cb0e8ec2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 14:40:14 +0200
    Subject: [PATCH 578/649] Tidy up language, lemmatizer and scorer
    
    ---
     spacy/language.py   | 83 +++++++++++++++++++++++----------------------
     spacy/lemmatizer.py | 10 ++----
     spacy/scorer.py     | 10 ++++--
     3 files changed, 52 insertions(+), 51 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 0e398f585..7c60362a0 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -11,21 +11,18 @@ from collections import OrderedDict
     import itertools
     import weakref
     import functools
    -import tqdm
     
     from .tokenizer import Tokenizer
     from .vocab import Vocab
    -from .tagger import Tagger
     from .lemmatizer import Lemmatizer
    -
     from .pipeline import DependencyParser, Tensorizer, Tagger
     from .pipeline import EntityRecognizer, SimilarityHook, TextCategorizer
    -
    -from .compat import json_dumps, izip, copy_reg
    +from .compat import json_dumps, izip
     from .scorer import Scorer
     from ._ml import link_vectors_to_models
     from .attrs import IS_STOP
    -from .lang.punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES
    +from .lang.punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES
    +from .lang.punctuation import TOKENIZER_INFIXES
     from .lang.tokenizer_exceptions import TOKEN_MATCH
     from .lang.tag_map import TAG_MAP
     from .lang.lex_attrs import LEX_ATTRS, is_stop
    @@ -57,16 +54,18 @@ class BaseDefaults(object):
         def create_tokenizer(cls, nlp=None):
             rules = cls.tokenizer_exceptions
             token_match = cls.token_match
    -        prefix_search = util.compile_prefix_regex(cls.prefixes).search \
    -                        if cls.prefixes else None
    -        suffix_search = util.compile_suffix_regex(cls.suffixes).search \
    -                        if cls.suffixes else None
    -        infix_finditer = util.compile_infix_regex(cls.infixes).finditer \
    -                         if cls.infixes else None
    +        prefix_search = (util.compile_prefix_regex(cls.prefixes).search
    +                         if cls.prefixes else None)
    +        suffix_search = (util.compile_suffix_regex(cls.suffixes).search
    +                         if cls.suffixes else None)
    +        infix_finditer = (util.compile_infix_regex(cls.infixes).finditer
    +                          if cls.infixes else None)
             vocab = nlp.vocab if nlp is not None else cls.create_vocab(nlp)
             return Tokenizer(vocab, rules=rules,
    -                         prefix_search=prefix_search, suffix_search=suffix_search,
    -                         infix_finditer=infix_finditer, token_match=token_match)
    +                         prefix_search=prefix_search,
    +                         suffix_search=suffix_search,
    +                         infix_finditer=infix_finditer,
    +                         token_match=token_match)
     
         pipe_names = ['tensorizer', 'tagger', 'parser', 'ner']
         token_match = TOKEN_MATCH
    @@ -98,7 +97,7 @@ class Language(object):
     
         factories = {
             'tokenizer': lambda nlp: nlp.Defaults.create_tokenizer(nlp),
    -        'tensorizer': lambda nlp, **cfg: TokenVectorEncoder(nlp.vocab, **cfg),
    +        'tensorizer': lambda nlp, **cfg: Tensorizer(nlp.vocab, **cfg),
             'tagger': lambda nlp, **cfg: Tagger(nlp.vocab, **cfg),
             'parser': lambda nlp, **cfg: DependencyParser(nlp.vocab, **cfg),
             'ner': lambda nlp, **cfg: EntityRecognizer(nlp.vocab, **cfg),
    @@ -218,14 +217,14 @@ class Language(object):
         def add_pipe(self, component, name=None, before=None, after=None,
                      first=None, last=None):
             """Add a component to the processing pipeline. Valid components are
    -        callables that take a `Doc` object, modify it and return it. Only one of
    -        before, after, first or last can be set. Default behaviour is "last".
    +        callables that take a `Doc` object, modify it and return it. Only one
    +        of before/after/first/last can be set. Default behaviour is "last".
     
             component (callable): The pipeline component.
             name (unicode): Name of pipeline component. Overwrites existing
                 component.name attribute if available. If no name is set and
                 the component exposes no name attribute, component.__name__ is
    -            used. An error is raised if the name already exists in the pipeline.
    +            used. An error is raised if a name already exists in the pipeline.
             before (unicode): Component name to insert component directly before.
             after (unicode): Component name to insert component directly after.
             first (bool): Insert component first / not first in the pipeline.
    @@ -240,7 +239,8 @@ class Language(object):
                     name = component.name
                 elif hasattr(component, '__name__'):
                     name = component.__name__
    -            elif hasattr(component, '__class__') and hasattr(component.__class__, '__name__'):
    +            elif (hasattr(component, '__class__') and
    +                  hasattr(component.__class__, '__name__')):
                     name = component.__class__.__name__
                 else:
                     name = repr(component)
    @@ -269,7 +269,7 @@ class Language(object):
             `name in nlp.pipe_names`.
     
             name (unicode): Name of the component.
    -        RETURNS (bool): Whether a component of that name exists in the pipeline.
    +        RETURNS (bool): Whether a component of the name exists in the pipeline.
             """
             return name in self.pipe_names
     
    @@ -332,15 +332,12 @@ class Language(object):
             return doc
     
         def disable_pipes(self, *names):
    -        '''Disable one or more pipeline components.
    -
    -        If used as a context manager, the pipeline will be restored to the initial
    -        state at the end of the block. Otherwise, a DisabledPipes object is
    -        returned, that has a `.restore()` method you can use to undo your
    -        changes.
    +        """Disable one or more pipeline components. If used as a context
    +        manager, the pipeline will be restored to the initial state at the end
    +        of the block. Otherwise, a DisabledPipes object is returned, that has
    +        a `.restore()` method you can use to undo your changes.
     
             EXAMPLE:
    -
                 >>> nlp.add_pipe('parser')
                 >>> nlp.add_pipe('tagger')
                 >>> with nlp.disable_pipes('parser', 'tagger'):
    @@ -351,7 +348,7 @@ class Language(object):
                 >>> assert not nlp.has_pipe('parser')
                 >>> disabled.restore()
                 >>> assert nlp.has_pipe('parser')
    -        '''
    +        """
             return DisabledPipes(self, *names)
     
         def make_doc(self, text):
    @@ -367,14 +364,14 @@ class Language(object):
             RETURNS (dict): Results from the update.
     
             EXAMPLE:
    -            >>> with nlp.begin_training(gold, use_gpu=True) as (trainer, optimizer):
    +            >>> with nlp.begin_training(gold) as (trainer, optimizer):
                 >>>    for epoch in trainer.epochs(gold):
                 >>>        for docs, golds in epoch:
                 >>>            state = nlp.update(docs, golds, sgd=optimizer)
             """
             if len(docs) != len(golds):
                 raise IndexError("Update expects same number of docs and golds "
    -                "Got: %d, %d" % (len(docs), len(golds)))
    +                             "Got: %d, %d" % (len(docs), len(golds)))
             if len(docs) == 0:
                 return
             if sgd is None:
    @@ -382,8 +379,10 @@ class Language(object):
                     self._optimizer = Adam(Model.ops, 0.001)
                 sgd = self._optimizer
             grads = {}
    +
             def get_grads(W, dW, key=None):
                 grads[key] = (W, dW)
    +
             pipes = list(self.pipeline)
             random.shuffle(pipes)
             for name, proc in pipes:
    @@ -421,7 +420,7 @@ class Language(object):
             L2 = util.env_opt('L2_penalty', 1e-6)
             max_grad_norm = util.env_opt('grad_norm_clip', 1.)
             self._optimizer = Adam(Model.ops, learn_rate, L2=L2, beta1=beta1,
    -                              beta2=beta2, eps=eps)
    +                               beta2=beta2, eps=eps)
             self._optimizer.max_grad_norm = max_grad_norm
             self._optimizer.device = device
             return self._optimizer
    @@ -461,7 +460,7 @@ class Language(object):
             L2 = util.env_opt('L2_penalty', 1e-6)
             max_grad_norm = util.env_opt('grad_norm_clip', 1.)
             self._optimizer = Adam(Model.ops, learn_rate, L2=L2, beta1=beta1,
    -                              beta2=beta2, eps=eps)
    +                               beta2=beta2, eps=eps)
             self._optimizer.max_grad_norm = max_grad_norm
             self._optimizer.device = device
             return self._optimizer
    @@ -512,17 +511,17 @@ class Language(object):
                     pass
     
         def pipe(self, texts, as_tuples=False, n_threads=2, batch_size=1000,
    -            disable=[]):
    -        """Process texts as a stream, and yield `Doc` objects in order. Supports
    -        GIL-free multi-threading.
    +             disable=[]):
    +        """Process texts as a stream, and yield `Doc` objects in order.
    +        Supports GIL-free multi-threading.
     
             texts (iterator): A sequence of texts to process.
             as_tuples (bool):
                 If set to True, inputs should be a sequence of
                 (text, context) tuples. Output will then be a sequence of
                 (doc, context) tuples. Defaults to False.
    -        n_threads (int): The number of worker threads to use. If -1, OpenMP will
    -            decide how many to use at run time. Default is 2.
    +        n_threads (int): The number of worker threads to use. If -1, OpenMP
    +            will decide how many to use at run time. Default is 2.
             batch_size (int): The number of texts to buffer.
             disable (list): Names of the pipeline components to disable.
             YIELDS (Doc): Documents in the order of the original text.
    @@ -546,7 +545,8 @@ class Language(object):
                 if name in disable:
                     continue
                 if hasattr(proc, 'pipe'):
    -                docs = proc.pipe(docs, n_threads=n_threads, batch_size=batch_size)
    +                docs = proc.pipe(docs, n_threads=n_threads,
    +                                 batch_size=batch_size)
                 else:
                     # Apply the function, but yield the doc
                     docs = _pipe(proc, docs)
    @@ -583,7 +583,7 @@ class Language(object):
             will include the model.
     
             path (unicode or Path): A path to a directory, which will be created if
    -            it doesn't exist. Paths may be either strings or `Path`-like objects.
    +            it doesn't exist. Paths may be strings or `Path`-like objects.
             disable (list): Names of pipeline components to disable and prevent
                 from being saved.
     
    @@ -682,7 +682,7 @@ class Language(object):
     
     
     class DisabledPipes(list):
    -    '''Manager for temporary pipeline disabling.'''
    +    """Manager for temporary pipeline disabling."""
         def __init__(self, nlp, *names):
             self.nlp = nlp
             self.names = names
    @@ -702,7 +702,8 @@ class DisabledPipes(list):
         def restore(self):
             '''Restore the pipeline to its state when DisabledPipes was created.'''
             current, self.nlp.pipeline = self.nlp.pipeline, self.original_pipeline
    -        unexpected = [name for name, pipe in current if not self.nlp.has_pipe(name)]
    +        unexpected = [name for name, pipe in current
    +                      if not self.nlp.has_pipe(name)]
             if unexpected:
                 # Don't change the pipeline if we're raising an error.
                 self.nlp.pipeline = current
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index f3327a1d7..40cd995e2 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -43,16 +43,15 @@ class Lemmatizer(object):
             morphology = {} if morphology is None else morphology
             others = [key for key in morphology
                       if key not in (POS, 'Number', 'POS', 'VerbForm', 'Tense')]
    -        true_morph_key = morphology.get('morph', 0)
             if univ_pos == 'noun' and morphology.get('Number') == 'sing':
                 return True
             elif univ_pos == 'verb' and morphology.get('VerbForm') == 'inf':
                 return True
             # This maps 'VBP' to base form -- probably just need 'IS_BASE'
             # morphology
    -        elif univ_pos == 'verb' and (morphology.get('VerbForm') == 'fin' and \
    -                                     morphology.get('Tense') == 'pres' and \
    -                                     morphology.get('Number') is None and \
    +        elif univ_pos == 'verb' and (morphology.get('VerbForm') == 'fin' and
    +                                     morphology.get('Tense') == 'pres' and
    +                                     morphology.get('Number') is None and
                                          not others):
                 return True
             elif univ_pos == 'adj' and morphology.get('Degree') == 'pos':
    @@ -89,9 +88,6 @@ class Lemmatizer(object):
     def lemmatize(string, index, exceptions, rules):
         string = string.lower()
         forms = []
    -    # TODO: Is this correct? See discussion in Issue #435.
    -    #if string in index:
    -    #    forms.append(string)
         forms.extend(exceptions.get(string, []))
         oov_forms = []
         if not forms:
    diff --git a/spacy/scorer.py b/spacy/scorer.py
    index b1ce3faa4..0ecba6d26 100644
    --- a/spacy/scorer.py
    +++ b/spacy/scorer.py
    @@ -74,8 +74,11 @@ class Scorer(object):
         @property
         def scores(self):
             return {
    -            'uas': self.uas, 'las': self.las,
    -            'ents_p': self.ents_p, 'ents_r': self.ents_r, 'ents_f': self.ents_f,
    +            'uas': self.uas,
    +            'las': self.las,
    +            'ents_p': self.ents_p,
    +            'ents_r': self.ents_r,
    +            'ents_f': self.ents_f,
                 'tags_acc': self.tags_acc,
                 'token_acc': self.token_acc
             }
    @@ -85,7 +88,8 @@ class Scorer(object):
     
             gold_deps = set()
             gold_tags = set()
    -        gold_ents = set(tags_to_entities([annot[-1] for annot in gold.orig_annot]))
    +        gold_ents = set(tags_to_entities([annot[-1]
    +                        for annot in gold.orig_annot]))
             for id_, word, tag, head, dep, ner in gold.orig_annot:
                 gold_tags.add((id_, tag))
                 if dep not in (None, "") and dep.lower() not in punct_labels:
    
    From 1a559d4c9553597ab7e8722861781a7eaa165c65 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 15:34:35 +0200
    Subject: [PATCH 579/649] Remove old, unused file
    
    ---
     spacy/tokens/binder.pyx | 21 ---------------------
     1 file changed, 21 deletions(-)
     delete mode 100644 spacy/tokens/binder.pyx
    
    diff --git a/spacy/tokens/binder.pyx b/spacy/tokens/binder.pyx
    deleted file mode 100644
    index 0ee168579..000000000
    --- a/spacy/tokens/binder.pyx
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -cdef class Binder:
    -    def __init__(self, *docs):
    -        pass
    -
    -    def __iter__(self):
    -        pass
    -
    -    def __reduce__(self):
    -        pass
    -
    -    def to_bytes(self):
    -        pass
    -
    -    def from_bytes(cls, data):
    -        pass
    -
    -    def to_disk(self):
    -        pass
    -
    -    def from_disk(self, path):
    -        pass
    
    From 6a0483b7aae3fc94658bdf8918e066266b791d6e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 15:41:45 +0200
    Subject: [PATCH 580/649] Tidy up and document Doc, Token and Span
    
    ---
     spacy/tokens/__init__.py |   2 +-
     spacy/tokens/doc.pyx     | 162 +++++++++++++++---------------
     spacy/tokens/span.pyx    |  94 +++++++++---------
     spacy/tokens/token.pyx   | 208 +++++++++++++++++++++++++++++++--------
     website/api/span.jade    |  34 +++++++
     website/api/token.jade   |  29 +++++-
     6 files changed, 356 insertions(+), 173 deletions(-)
    
    diff --git a/spacy/tokens/__init__.py b/spacy/tokens/__init__.py
    index bc3794126..b4815abd2 100644
    --- a/spacy/tokens/__init__.py
    +++ b/spacy/tokens/__init__.py
    @@ -2,4 +2,4 @@ from .doc import Doc
     from .token import Token
     from .span import Span
     
    -__all__ = [Doc, Token, Span]
    +__all__ = ['Doc', 'Token', 'Span']
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 1bd61b256..7c276e3c2 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -23,9 +23,9 @@ from ..lexeme cimport Lexeme, EMPTY_LEXEME
     from ..typedefs cimport attr_t, flags_t
     from ..attrs import intify_attrs, IDS
     from ..attrs cimport attr_id_t
    -from ..attrs cimport ID, ORTH, NORM, LOWER, SHAPE, PREFIX, SUFFIX, LENGTH, CLUSTER
    -from ..attrs cimport LENGTH, POS, LEMMA, TAG, DEP, HEAD, SPACY, ENT_IOB, ENT_TYPE
    -from ..attrs cimport SENT_START
    +from ..attrs cimport ID, ORTH, NORM, LOWER, SHAPE, PREFIX, SUFFIX, CLUSTER
    +from ..attrs cimport LENGTH, POS, LEMMA, TAG, DEP, HEAD, SPACY, ENT_IOB
    +from ..attrs cimport ENT_TYPE, SENT_START
     from ..parts_of_speech cimport CCONJ, PUNCT, NOUN, univ_pos_t
     from ..util import normalize_slice
     from ..compat import is_config, copy_reg, pickle
    @@ -78,24 +78,25 @@ def _get_chunker(lang):
     
     cdef class Doc:
         """A sequence of Token objects. Access sentences and named entities, export
    -    annotations to numpy arrays, losslessly serialize to compressed binary strings.
    -    The `Doc` object holds an array of `TokenC` structs. The Python-level
    -    `Token` and `Span` objects are views of this array, i.e. they don't own
    -    the data themselves.
    +    annotations to numpy arrays, losslessly serialize to compressed binary
    +    strings. The `Doc` object holds an array of `TokenC` structs. The
    +    Python-level `Token` and `Span` objects are views of this array, i.e.
    +    they don't own the data themselves.
     
         EXAMPLE: Construction 1
             >>> doc = nlp(u'Some text')
     
             Construction 2
             >>> from spacy.tokens import Doc
    -        >>> doc = Doc(nlp.vocab, words=[u'hello', u'world', u'!'], spaces=[True, False, False])
    +        >>> doc = Doc(nlp.vocab, words=[u'hello', u'world', u'!'],
    +                      spaces=[True, False, False])
         """
         @classmethod
         def set_extension(cls, name, default=None, method=None,
                           getter=None, setter=None):
             nr_defined = sum(t is not None for t in (default, getter, setter, method))
             assert nr_defined == 1
    -        Underscore.doc_extensions[name] = (default, method, getter, setter) 
    +        Underscore.doc_extensions[name] = (default, method, getter, setter)
     
         @classmethod
         def get_extension(cls, name):
    @@ -109,15 +110,14 @@ cdef class Doc:
                      orths_and_spaces=None):
             """Create a Doc object.
     
    -        vocab (Vocab): A vocabulary object, which must match any models you want
    -            to use (e.g. tokenizer, parser, entity recognizer).
    +        vocab (Vocab): A vocabulary object, which must match any models you
    +            want to use (e.g. tokenizer, parser, entity recognizer).
             words (list or None): A list of unicode strings to add to the document
                 as words. If `None`, defaults to empty list.
             spaces (list or None): A list of boolean values, of the same length as
                 words. True means that the word is followed by a space, False means
                 it is not. If `None`, defaults to `[True]*len(words)`
             user_data (dict or None): Optional extra data to attach to the Doc.
    - 
             RETURNS (Doc): The newly constructed object.
             """
             self.vocab = vocab
    @@ -153,10 +153,10 @@ cdef class Doc:
                     spaces = [True] * len(words)
                 elif len(spaces) != len(words):
                     raise ValueError(
    -                    "Arguments 'words' and 'spaces' should be sequences of the "
    -                    "same length, or 'spaces' should be left default at None. "
    -                    "spaces should be a sequence of booleans, with True meaning "
    -                    "that the word owns a ' ' character following it.")
    +                    "Arguments 'words' and 'spaces' should be sequences of "
    +                    "the same length, or 'spaces' should be left default at "
    +                    "None. spaces should be a sequence of booleans, with True "
    +                    "meaning that the word owns a ' ' character following it.")
                 orths_and_spaces = zip(words, spaces)
             if orths_and_spaces is not None:
                 for orth_space in orths_and_spaces:
    @@ -166,7 +166,8 @@ cdef class Doc:
                     elif isinstance(orth_space, bytes):
                         raise ValueError(
                             "orths_and_spaces expects either List(unicode) or "
    -                        "List((unicode, bool)). Got bytes instance: %s" % (str(orth_space)))
    +                        "List((unicode, bool)). "
    +                        "Got bytes instance: %s" % (str(orth_space)))
                     else:
                         orth, has_space = orth_space
                     # Note that we pass self.mem here --- we have ownership, if LexemeC
    @@ -186,7 +187,8 @@ cdef class Doc:
         def __getitem__(self, object i):
             """Get a `Token` or `Span` object.
     
    -        i (int or tuple) The index of the token, or the slice of the document to get.
    +        i (int or tuple) The index of the token, or the slice of the document
    +            to get.
             RETURNS (Token or Span): The token at `doc[i]]`, or the span at
                 `doc[start : end]`.
     
    @@ -199,11 +201,11 @@ cdef class Doc:
                 >>> doc[start : end]]
                 Get a `Span` object, starting at position `start` and ending at
                 position `end`, where `start` and `end` are token indices. For
    -            instance, `doc[2:5]` produces a span consisting of tokens 2, 3 and 4.
    -            Stepped slices (e.g. `doc[start : end : step]`) are not supported,
    -            as `Span` objects must be contiguous (cannot have gaps). You can use
    -            negative indices and open-ended ranges, which have their normal
    -            Python semantics.
    +            instance, `doc[2:5]` produces a span consisting of tokens 2, 3 and
    +            4. Stepped slices (e.g. `doc[start : end : step]`) are not
    +            supported, as `Span` objects must be contiguous (cannot have gaps).
    +            You can use negative indices and open-ended ranges, which have
    +            their normal Python semantics.
             """
             if isinstance(i, slice):
                 start, stop = normalize_slice(len(self), i.start, i.stop, i.step)
    @@ -262,8 +264,10 @@ cdef class Doc:
             doc (Doc): The parent document.
             start (int): The index of the first character of the span.
             end (int): The index of the first character after the span.
    -        label (uint64 or string): A label to attach to the Span, e.g. for named entities.
    -        vector (ndarray[ndim=1, dtype='float32']): A meaning representation of the span.
    +        label (uint64 or string): A label to attach to the Span, e.g. for
    +            named entities.
    +        vector (ndarray[ndim=1, dtype='float32']): A meaning representation of
    +            the span.
             RETURNS (Span): The newly constructed object.
             """
             if not isinstance(label, int):
    @@ -377,13 +381,14 @@ cdef class Doc:
                 return self.text
     
         property ents:
    -        """Iterate over the entities in the document. Yields named-entity `Span`
    -        objects, if the entity recognizer has been applied to the document.
    +        """Iterate over the entities in the document. Yields named-entity
    +        `Span` objects, if the entity recognizer has been applied to the
    +        document.
     
             YIELDS (Span): Entities in the document.
     
    -        EXAMPLE: Iterate over the span to get individual Token objects, or access
    -            the label:
    +        EXAMPLE: Iterate over the span to get individual Token objects,
    +            or access the label:
     
                 >>> tokens = nlp(u'Mr. Best flew to New York on Saturday morning.')
                 >>> ents = list(tokens.ents)
    @@ -456,10 +461,11 @@ cdef class Doc:
     
         property noun_chunks:
             """Iterate over the base noun phrases in the document. Yields base
    -        noun-phrase #[code Span] objects, if the document has been syntactically
    -        parsed. A base noun phrase, or "NP chunk", is a noun phrase that does
    -        not permit other NPs to be nested within it – so no NP-level
    -        coordination, no prepositional phrases, and no relative clauses.
    +        noun-phrase #[code Span] objects, if the document has been
    +        syntactically parsed. A base noun phrase, or "NP chunk", is a noun
    +        phrase that does not permit other NPs to be nested within it – so no
    +        NP-level coordination, no prepositional phrases, and no relative
    +        clauses.
     
             YIELDS (Span): Noun chunks in the document.
             """
    @@ -467,12 +473,14 @@ cdef class Doc:
                 if not self.is_parsed:
                     raise ValueError(
                         "noun_chunks requires the dependency parse, which "
    -                    "requires data to be installed. For more info, see the "
    +                    "requires a statistical model to be installed and loaded. "
    +                    "For more info, see the "
                         "documentation: \n%s\n" % about.__docs_models__)
    -            # Accumulate the result before beginning to iterate over it. This prevents
    -            # the tokenisation from being changed out from under us during the iteration.
    -            # The tricky thing here is that Span accepts its tokenisation changing,
    -            # so it's okay once we have the Span objects. See Issue #375
    +            # Accumulate the result before beginning to iterate over it. This
    +            # prevents the tokenisation from being changed out from under us
    +            # during the iteration. The tricky thing here is that Span accepts
    +            # its tokenisation changing, so it's okay once we have the Span
    +            # objects. See Issue #375.
                 spans = []
                 for start, end, label in self.noun_chunks_iterator(self):
                     spans.append(Span(self, start, end, label=label))
    @@ -497,8 +505,9 @@ cdef class Doc:
     
                 if not self.is_parsed:
                     raise ValueError(
    -                    "sentence boundary detection requires the dependency parse, which "
    -                    "requires data to be installed. For more info, see the "
    +                    "Sentence boundary detection requires the dependency "
    +                    "parse, which requires a statistical model to be "
    +                    "installed and loaded. For more info, see the "
                         "documentation: \n%s\n" % about.__docs_models__)
                 cdef int i
                 start = 0
    @@ -537,12 +546,11 @@ cdef class Doc:
         @cython.boundscheck(False)
         cpdef np.ndarray to_array(self, object py_attr_ids):
             """Export given token attributes to a numpy `ndarray`.
    -
    -	If `attr_ids` is a sequence of M attributes, the output array will
    -	be of shape `(N, M)`, where N is the length of the `Doc`
    -	(in tokens). If `attr_ids` is a single attribute, the output shape will
    -	be (N,). You can specify attributes by integer ID (e.g. spacy.attrs.LEMMA)
    -	or string name (e.g. 'LEMMA' or 'lemma').
    +        If `attr_ids` is a sequence of M attributes, the output array will be
    +        of shape `(N, M)`, where N is the length of the `Doc` (in tokens). If
    +        `attr_ids` is a single attribute, the output shape will be (N,). You
    +        can specify attributes by integer ID (e.g. spacy.attrs.LEMMA) or
    +        string name (e.g. 'LEMMA' or 'lemma').
     
             attr_ids (list[]): A list of attributes (int IDs or string names).
             RETURNS (numpy.ndarray[long, ndim=2]): A feature matrix, with one row
    @@ -641,13 +649,12 @@ cdef class Doc:
         def from_array(self, attrs, array):
             if SENT_START in attrs and HEAD in attrs:
                 raise ValueError(
    -                "Conflicting attributes specified in doc.from_array():\n"
    +                "Conflicting attributes specified in doc.from_array(): "
                     "(HEAD, SENT_START)\n"
    -                "The HEAD attribute currently sets sentence boundaries implicitly,\n"
    -                "based on the tree structure. This means the HEAD attribute would "
    -                "potentially override the sentence boundaries set by SENT_START.\n"
    -                "See https://github.com/spacy-io/spaCy/issues/235 for details and "
    -                "workarounds, and to propose solutions.")
    +                "The HEAD attribute currently sets sentence boundaries "
    +                "implicitly, based on the tree structure. This means the HEAD "
    +                "attribute would potentially override the sentence boundaries "
    +                "set by SENT_START.")
             cdef int i, col
             cdef attr_id_t attr_id
             cdef TokenC* tokens = self.c
    @@ -675,18 +682,14 @@ cdef class Doc:
             return self
     
         def get_lca_matrix(self):
    -        '''
    -        Calculates the lowest common ancestor matrix
    -        for a given Spacy doc.
    -        Returns LCA matrix containing the integer index
    -        of the ancestor, or -1 if no common ancestor is
    -        found (ex if span excludes a necessary ancestor).
    -        Apologies about the recursion, but the
    -        impact on performance is negligible given
    -        the natural limitations on the depth of a typical human sentence.
    -        '''
    +        """Calculates the lowest common ancestor matrix for a given `Doc`.
    +        Returns LCA matrix containing the integer index of the ancestor, or -1
    +        if no common ancestor is found (ex if span excludes a necessary
    +        ancestor). Apologies about the recursion, but the impact on
    +        performance is negligible given the natural limitations on the depth
    +        of a typical human sentence.
    +        """
             # Efficiency notes:
    -        #
             # We can easily improve the performance here by iterating in Cython.
             # To loop over the tokens in Cython, the easiest way is:
             # for token in doc.c[:doc.c.length]:
    @@ -719,7 +722,6 @@ cdef class Doc:
                     token_k = self[k]
                     lca_matrix[j][k] = __pairwise_lca(token_j, token_k, lca_matrix)
                     lca_matrix[k][j] = lca_matrix[j][k]
    -
             return lca_matrix
     
         def to_disk(self, path, **exclude):
    @@ -819,14 +821,15 @@ cdef class Doc:
             return self
     
         def merge(self, int start_idx, int end_idx, *args, **attributes):
    -        """Retokenize the document, such that the span at `doc.text[start_idx : end_idx]`
    -        is merged into a single token. If `start_idx` and `end_idx `do not mark
    -        start and end token boundaries, the document remains unchanged.
    +        """Retokenize the document, such that the span at
    +        `doc.text[start_idx : end_idx]` is merged into a single token. If
    +        `start_idx` and `end_idx `do not mark start and end token boundaries,
    +        the document remains unchanged.
     
    -        start_idx (int): The character index of the start of the slice to merge.
    -        end_idx (int): The character index after the end of the slice to merge.
    +        start_idx (int): Character index of the start of the slice to merge.
    +        end_idx (int): Character index after the end of the slice to merge.
             **attributes: Attributes to assign to the merged token. By default,
    -            attributes are inherited from the syntactic root token of the span.
    +            attributes are inherited from the syntactic root of the span.
             RETURNS (Token): The newly merged token, or `None` if the start and end
                 indices did not fall at token boundaries.
             """
    @@ -847,10 +850,10 @@ cdef class Doc:
                     attributes[ENT_TYPE] = attributes['ent_type']
             elif args:
                 raise ValueError(
    -                "Doc.merge received %d non-keyword arguments. "
    -                "Expected either 3 arguments (deprecated), or 0 (use keyword arguments). "
    +                "Doc.merge received %d non-keyword arguments. Expected either "
    +                "3 arguments (deprecated), or 0 (use keyword arguments). "
                     "Arguments supplied:\n%s\n"
    -                "Keyword arguments:%s\n" % (len(args), repr(args), repr(attributes)))
    +                "Keyword arguments: %s\n" % (len(args), repr(args), repr(attributes)))
     
             # More deprecated attribute handling =/
             if 'label' in attributes:
    @@ -882,8 +885,9 @@ cdef class Doc:
                     Token.set_struct_attr(token, attr_name, attr_value)
             # Begin by setting all the head indices to absolute token positions
             # This is easier to work with for now than the offsets
    -        # Before thinking of something simpler, beware the case where a dependency
    -        # bridges over the entity. Here the alignment of the tokens changes.
    +        # Before thinking of something simpler, beware the case where a
    +        # dependency bridges over the entity. Here the alignment of the
    +        # tokens changes.
             span_root = span.root.i
             token.dep = span.root.dep
             # We update token.lex after keeping span root and dep, since
    @@ -932,8 +936,9 @@ cdef class Doc:
                 >>> trees = doc.print_tree()
                 >>> trees[1]
                 {'modifiers': [
    -                {'modifiers': [], 'NE': 'PERSON', 'word': 'Alice', 'arc': 'nsubj',
    -                'POS_coarse': 'PROPN', 'POS_fine': 'NNP', 'lemma': 'Alice'},
    +                {'modifiers': [], 'NE': 'PERSON', 'word': 'Alice',
    +                'arc': 'nsubj', 'POS_coarse': 'PROPN', 'POS_fine': 'NNP',
    +                'lemma': 'Alice'},
                     {'modifiers': [
                         {'modifiers': [], 'NE': '', 'word': 'the', 'arc': 'det',
                         'POS_coarse': 'DET', 'POS_fine': 'DT', 'lemma': 'the'}],
    @@ -1008,7 +1013,7 @@ def pickle_doc(doc):
     
     def unpickle_doc(vocab, hooks_and_data, bytes_data):
         user_data, doc_hooks, span_hooks, token_hooks = dill.loads(hooks_and_data)
    - 
    +
         doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data,
                                                          exclude='user_data')
         doc.user_hooks.update(doc_hooks)
    @@ -1018,4 +1023,3 @@ def unpickle_doc(vocab, hooks_and_data, bytes_data):
     
     
     copy_reg.pickle(Doc, pickle_doc, unpickle_doc)
    -
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 963292fdb..3b2d14b2b 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -35,15 +35,16 @@ cdef class Span:
         def has_extension(cls, name):
             return name in Underscore.span_extensions
     
    -    def __cinit__(self, Doc doc, int start, int end, attr_t label=0, vector=None,
    -                  vector_norm=None):
    +    def __cinit__(self, Doc doc, int start, int end, attr_t label=0,
    +                  vector=None, vector_norm=None):
             """Create a `Span` object from the slice `doc[start : end]`.
     
             doc (Doc): The parent document.
             start (int): The index of the first token of the span.
             end (int): The index of the first token after the span.
             label (uint64): A label to attach to the Span, e.g. for named entities.
    -        vector (ndarray[ndim=1, dtype='float32']): A meaning representation of the span.
    +        vector (ndarray[ndim=1, dtype='float32']): A meaning representation
    +            of the span.
             RETURNS (Span): The newly constructed object.
             """
             if not (0 <= start <= end <= len(doc)):
    @@ -162,7 +163,8 @@ cdef class Span:
                 attributes are inherited from the syntactic root token of the span.
             RETURNS (Token): The newly merged token.
             """
    -        return self.doc.merge(self.start_char, self.end_char, *args, **attributes)
    +        return self.doc.merge(self.start_char, self.end_char, *args,
    +                              **attributes)
     
         def similarity(self, other):
             """Make a semantic similarity estimate. The default estimate is cosine
    @@ -179,24 +181,19 @@ cdef class Span:
             return numpy.dot(self.vector, other.vector) / (self.vector_norm * other.vector_norm)
     
         def get_lca_matrix(self):
    -        '''
    -        Calculates the lowest common ancestor matrix
    -        for a given Spacy span.
    -        Returns LCA matrix containing the integer index
    -        of the ancestor, or -1 if no common ancestor is
    -        found (ex if span excludes a necessary ancestor).
    -        Apologies about the recursion, but the
    -        impact on performance is negligible given
    -        the natural limitations on the depth of a typical human sentence.
    -        '''
    -
    +        """Calculates the lowest common ancestor matrix for a given `Span`.
    +        Returns LCA matrix containing the integer index of the ancestor, or -1
    +        if no common ancestor is found (ex if span excludes a necessary
    +        ancestor). Apologies about the recursion, but the impact on
    +        performance is negligible given the natural limitations on the depth
    +        of a typical human sentence.
    +        """
             def __pairwise_lca(token_j, token_k, lca_matrix, margins):
                 offset = margins[0]
                 token_k_head = token_k.head if token_k.head.i in range(*margins) else token_k
                 token_j_head = token_j.head if token_j.head.i in range(*margins) else token_j
                 token_j_i = token_j.i - offset
                 token_k_i = token_k.i - offset
    -
                 if lca_matrix[token_j_i][token_k_i] != -2:
                     return lca_matrix[token_j_i][token_k_i]
                 elif token_j == token_k:
    @@ -209,23 +206,19 @@ cdef class Span:
                     lca_index = -1
                 else:
                     lca_index = __pairwise_lca(token_j_head, token_k_head, lca_matrix, margins)
    -
                 lca_matrix[token_j_i][token_k_i] = lca_index
                 lca_matrix[token_k_i][token_j_i] = lca_index
    -
                 return lca_index
     
             lca_matrix = numpy.empty((len(self), len(self)), dtype=numpy.int32)
             lca_matrix.fill(-2)
             margins = [self.start, self.end]
    -
             for j in range(len(self)):
                 token_j = self[j]
                 for k in range(len(self)):
                     token_k = self[k]
                     lca_matrix[j][k] = __pairwise_lca(token_j, token_k, lca_matrix, margins)
                     lca_matrix[k][j] = lca_matrix[j][k]
    -
             return lca_matrix
     
         cpdef np.ndarray to_array(self, object py_attr_ids):
    @@ -349,7 +342,8 @@ cdef class Span:
             """The text content of the span with a trailing whitespace character if
             the last token has one.
     
    -        RETURNS (unicode): The text content of the span (with trailing whitespace).
    +        RETURNS (unicode): The text content of the span (with trailing
    +            whitespace).
             """
             def __get__(self):
                 return u''.join([t.text_with_ws for t in self])
    @@ -358,7 +352,8 @@ cdef class Span:
             """Yields base noun-phrase `Span` objects, if the document has been
             syntactically parsed. A base noun phrase, or "NP chunk", is a noun
             phrase that does not permit other NPs to be nested within it – so no
    -        NP-level coordination, no prepositional phrases, and no relative clauses.
    +        NP-level coordination, no prepositional phrases, and no relative
    +        clauses.
     
             YIELDS (Span): Base noun-phrase `Span` objects
             """
    @@ -366,7 +361,8 @@ cdef class Span:
                 if not self.doc.is_parsed:
                     raise ValueError(
                         "noun_chunks requires the dependency parse, which "
    -                    "requires data to be installed. For more info, see the "
    +                    "requires a statistical model to be installed and loaded. "
    +                    "For more info, see the "
                         "documentation: \n%s\n" % about.__docs_models__)
                 # Accumulate the result before beginning to iterate over it. This prevents
                 # the tokenisation from being changed out from under us during the iteration.
    @@ -385,9 +381,9 @@ cdef class Span:
     
             RETURNS (Token): The root token.
     
    -        EXAMPLE: The root token has the shortest path to the root of the sentence
    -            (or is the root itself). If multiple words are equally high in the
    -            tree, the first word is taken. For example:
    +        EXAMPLE: The root token has the shortest path to the root of the
    +            sentence (or is the root itself). If multiple words are equally
    +            high in the tree, the first word is taken. For example:
     
                 >>> toks = nlp(u'I like New York in Autumn.')
     
    @@ -437,11 +433,11 @@ cdef class Span:
                     if self.doc.c[i].head == 0:
                         return self.doc[i]
                 # If we don't have a sentence root, we do something that's not so
    -            # algorithmically clever, but I think should be quite fast, especially
    -            # for short spans.
    +            # algorithmically clever, but I think should be quite fast,
    +            # especially for short spans.
                 # For each word, we count the path length, and arg min this measure.
    -            # We could use better tree logic to save steps here...But I think this
    -            # should be okay.
    +            # We could use better tree logic to save steps here...But I
    +            # think this should be okay.
                 cdef int current_best = self.doc.length
                 cdef int root = -1
                 for i in range(self.start, self.end):
    @@ -463,7 +459,7 @@ cdef class Span:
             YIELDS (Token):A left-child of a token of the span.
             """
             def __get__(self):
    -            for token in reversed(self): # Reverse, so we get the tokens in order
    +            for token in reversed(self): # Reverse, so we get tokens in order
                     for left in token.lefts:
                         if left.i < self.start:
                             yield left
    @@ -493,7 +489,7 @@ cdef class Span:
                     yield from word.subtree
     
         property ent_id:
    -        """An (integer) entity ID. Usually assigned by patterns in the `Matcher`.
    +        """An (integer) entity ID.
     
             RETURNS (uint64): The entity ID.
             """
    @@ -503,8 +499,8 @@ cdef class Span:
             def __set__(self, hash_t key):
                 # TODO
                 raise NotImplementedError(
    -                "Can't yet set ent_id from Span. Vote for this feature on the issue "
    -                "tracker: http://github.com/explosion/spaCy/issues")
    +                "Can't yet set ent_id from Span. Vote for this feature on "
    +                "the issue tracker: http://github.com/explosion/spaCy/issues")
     
         property ent_id_:
             """A (string) entity ID. Usually assigned by patterns in the `Matcher`.
    @@ -517,13 +513,16 @@ cdef class Span:
             def __set__(self, hash_t key):
                 # TODO
                 raise NotImplementedError(
    -                "Can't yet set ent_id_ from Span. Vote for this feature on the issue "
    -                "tracker: http://github.com/explosion/spaCy/issues")
    +                "Can't yet set ent_id_ from Span. Vote for this feature on the "
    +                "issue tracker: http://github.com/explosion/spaCy/issues")
     
         property orth_:
    -        # TODO: docstring
    +        """Verbatim text content (identical to Span.text). Exists mostly for
    +        consistency with other attributes.
    +
    +        RETURNS (unicode): The span's text."""
             def __get__(self):
    -            return ''.join([t.string for t in self]).strip()
    +            return ''.join([t.orth_ for t in self]).strip()
     
         property lemma_:
             """The span's lemma.
    @@ -534,19 +533,19 @@ cdef class Span:
                 return ' '.join([t.lemma_ for t in self]).strip()
     
         property upper_:
    -        # TODO: docstring
    +        """Deprecated. Use Span.text.upper() instead."""
             def __get__(self):
    -            return ''.join([t.string.upper() for t in self]).strip()
    +            return ''.join([t.text_with_ws.upper() for t in self]).strip()
     
         property lower_:
    -        # TODO: docstring
    +        """Deprecated. Use Span.text.lower() instead."""
             def __get__(self):
    -            return ''.join([t.string.lower() for t in self]).strip()
    +            return ''.join([t.text_with_ws.lower() for t in self]).strip()
     
         property string:
    -        # TODO: docstring
    +        """Deprecated: Use Span.text instead."""
             def __get__(self):
    -            return ''.join([t.string for t in self])
    +            return ''.join([t.text_with_ws for t in self])
     
         property label_:
             """The span's label.
    @@ -570,7 +569,8 @@ cdef int _count_words_to_root(const TokenC* token, int sent_length) except -1:
             n += 1
             if n >= sent_length:
                 raise RuntimeError(
    -                "Array bounds exceeded while searching for root word. This likely "
    -                "means the parse tree is in an invalid state. Please report this "
    -                "issue here: http://github.com/explosion/spaCy/issues")
    +                "Array bounds exceeded while searching for root word. This "
    +                "likely means the parse tree is in an invalid state. Please "
    +                "report this issue here: "
    +                "http://github.com/explosion/spaCy/issues")
         return n
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index 514934ca7..04aa3f582 100644
    --- a/spacy/tokens/token.pyx
    +++ b/spacy/tokens/token.pyx
    @@ -14,17 +14,18 @@ from ..typedefs cimport hash_t
     from ..lexeme cimport Lexeme
     from .. import parts_of_speech
     from ..attrs cimport IS_ALPHA, IS_ASCII, IS_DIGIT, IS_LOWER, IS_PUNCT, IS_SPACE
    -from ..attrs cimport IS_BRACKET, IS_QUOTE, IS_LEFT_PUNCT, IS_RIGHT_PUNCT, IS_OOV
    -from ..attrs cimport IS_TITLE, IS_UPPER, LIKE_URL, LIKE_NUM, LIKE_EMAIL, IS_STOP
    -from ..attrs cimport ID, ORTH, NORM, LOWER, SHAPE, PREFIX, SUFFIX, LENGTH, CLUSTER
    -from ..attrs cimport LEMMA, POS, TAG, DEP
    +from ..attrs cimport IS_BRACKET, IS_QUOTE, IS_LEFT_PUNCT, IS_RIGHT_PUNCT
    +from ..attrs cimport IS_OOV, IS_TITLE, IS_UPPER, LIKE_URL, LIKE_NUM, LIKE_EMAIL
    +from ..attrs cimport IS_STOP, ID, ORTH, NORM, LOWER, SHAPE, PREFIX, SUFFIX
    +from ..attrs cimport LENGTH, CLUSTER, LEMMA, POS, TAG, DEP
     from ..compat import is_config
     from .. import about
     from .underscore import Underscore
     
     
     cdef class Token:
    -    """An individual token – i.e. a word, punctuation symbol, whitespace, etc."""
    +    """An individual token – i.e. a word, punctuation symbol, whitespace,
    +    etc."""
         @classmethod
         def set_extension(cls, name, default=None, method=None,
                           getter=None, setter=None):
    @@ -171,10 +172,11 @@ cdef class Token:
                 return self.orth_
     
         property text_with_ws:
    -        """The text content of the token with a trailing whitespace character if
    -        it has one.
    +        """The text content of the token with a trailing whitespace character
    +        if it has one.
     
    -        RETURNS (unicode): The text content of the span (with trailing whitespace).
    +        RETURNS (unicode): The text content of the span (with trailing
    +            whitespace).
             """
             def __get__(self):
                 cdef unicode orth = self.vocab.strings[self.c.lex.orth]
    @@ -306,9 +308,8 @@ cdef class Token:
             def __set__(self, value):
                 if self.doc.is_parsed:
                     raise ValueError(
    -                    'Refusing to write to token.sent_start if its document is parsed, '
    -                    'because this may cause inconsistent state. '
    -                    'See https://github.com/spacy-io/spaCy/issues/235 for workarounds.')
    +                    "Refusing to write to token.sent_start if its document "
    +                    "is parsed, because this may cause inconsistent state.")
                 if value is None:
                     self.c.sent_start = 0
                 elif value is True:
    @@ -316,13 +317,12 @@ cdef class Token:
                 elif value is False:
                     self.c.sent_start = -1
                 else:
    -                raise ValueError("Invalid value for token.sent_start -- must be one of "
    -                                 "None, True, False")
    +                raise ValueError("Invalid value for token.sent_start. Must be "
    +                                 "one of: None, True, False")
     
         property lefts:
             def __get__(self):
    -            """
    -            The leftward immediate children of the word, in the syntactic
    +            """The leftward immediate children of the word, in the syntactic
                 dependency parse.
                 """
                 cdef int nr_iter = 0
    @@ -334,13 +334,12 @@ cdef class Token:
                     nr_iter += 1
                     # This is ugly, but it's a way to guard out infinite loops
                     if nr_iter >= 10000000:
    -                    raise RuntimeError(
    -                        "Possibly infinite loop encountered while looking for token.lefts")
    +                    raise RuntimeError("Possibly infinite loop encountered "
    +                                       "while looking for token.lefts")
     
         property rights:
             def __get__(self):
    -            """
    -            The rightward immediate children of the word, in the syntactic
    +            """The rightward immediate children of the word, in the syntactic
                 dependency parse.
                 """
                 cdef const TokenC* ptr = self.c + (self.c.r_edge - self.i)
    @@ -352,27 +351,26 @@ cdef class Token:
                     ptr -= 1
                     nr_iter += 1
                     if nr_iter >= 10000000:
    -                    raise RuntimeError(
    -                        "Possibly infinite loop encountered while looking for token.rights")
    +                    raise RuntimeError("Possibly infinite loop encountered "
    +                                       "while looking for token.rights")
                 tokens.reverse()
                 for t in tokens:
                     yield t
     
         property children:
    -        """
    -        A sequence of the token's immediate syntactic children.
    +        """A sequence of the token's immediate syntactic children.
     
    -        Yields: Token A child token such that child.head==self
    +        YIELDS (Token): A child token such that child.head==self
             """
             def __get__(self):
                 yield from self.lefts
                 yield from self.rights
     
         property subtree:
    -        """
    -        A sequence of all the token's syntactic descendents.
    +        """A sequence of all the token's syntactic descendents.
     
    -        Yields: Token A descendent token such that self.is_ancestor(descendent)
    +        YIELDS (Token): A descendent token such that
    +            `self.is_ancestor(descendent)`.
             """
             def __get__(self):
                 for word in self.lefts:
    @@ -456,13 +454,15 @@ cdef class Token:
                 if self.c.head > 0: # left dependent
                     old_head.c.l_kids -= 1
                     if self.c.l_edge == old_head.c.l_edge:
    -                    # the token dominates the left edge so the left edge of the head
    -                    # may change when the token is reattached
    -                    # it may not change if the new head is a descendant of the current head
    +                    # the token dominates the left edge so the left edge of
    +                    # the  head may change when the token is reattached, it may
    +                    # not change if the new head is a descendant of the current
    +                    # head
     
                         new_edge = self.c.l_edge
    -                    # the new l_edge is the left-most l_edge on any of the other dependents
    -                    # where the l_edge is left of the head, otherwise it is the head
    +                    # the new l_edge is the left-most l_edge on any of the
    +                    # other dependents where the l_edge is left of the head,
    +                    # otherwise it is the head
                         if not is_desc:
                             new_edge = old_head.i
                             for child in old_head.children:
    @@ -472,14 +472,15 @@ cdef class Token:
                                     new_edge = child.c.l_edge
                             old_head.c.l_edge = new_edge
     
    -                    # walk up the tree from old_head and assign new l_edge to ancestors
    -                    # until an ancestor already has an l_edge that's further left
    +                    # walk up the tree from old_head and assign new l_edge to
    +                    # ancestors until an ancestor already has an l_edge that's
    +                    # further left
                         for anc in old_head.ancestors:
                             if anc.c.l_edge <= new_edge:
                                 break
                             anc.c.l_edge = new_edge
     
    -            elif self.c.head < 0: # right dependent
    +            elif self.c.head < 0:  # right dependent
                     old_head.c.r_kids -= 1
                     # do the same thing as for l_edge
                     if self.c.r_edge == old_head.c.r_edge:
    @@ -500,7 +501,7 @@ cdef class Token:
                             anc.c.r_edge = new_edge
     
                 # update number of deps of new head
    -            if rel_newhead_i > 0: # left dependent
    +            if rel_newhead_i > 0:  # left dependent
                     new_head.c.l_kids += 1
                     # walk up the tree from new head and set l_edge to self.l_edge
                     # until you hit a token with an l_edge further to the left
    @@ -511,7 +512,7 @@ cdef class Token:
                                 break
                             anc.c.l_edge = self.c.l_edge
     
    -            elif rel_newhead_i < 0: # right dependent
    +            elif rel_newhead_i < 0:  # right dependent
                     new_head.c.r_kids += 1
                     # do the same as for l_edge
                     if self.c.r_edge > new_head.c.r_edge:
    @@ -572,8 +573,8 @@ cdef class Token:
     
         property ent_iob_:
             """IOB code of named entity tag. "B" means the token begins an entity,
    -        "I" means it is inside an entity, "O" means it is outside an entity, and
    -        "" means no entity tag is set.
    +        "I" means it is inside an entity, "O" means it is outside an entity,
    +        and "" means no entity tag is set.
     
             RETURNS (unicode): IOB code of named entity tag.
             """
    @@ -582,8 +583,7 @@ cdef class Token:
                 return iob_strings[self.c.ent_iob]
     
         property ent_id:
    -        """ID of the entity the token is an instance of, if any. Usually
    -        assigned by patterns in the Matcher.
    +        """ID of the entity the token is an instance of, if any.
     
             RETURNS (uint64): ID of the entity.
             """
    @@ -594,8 +594,7 @@ cdef class Token:
                 self.c.ent_id = key
     
         property ent_id_:
    -        """ID of the entity the token is an instance of, if any. Usually
    -        assigned by patterns in the Matcher.
    +        """ID of the entity the token is an instance of, if any.
     
             RETURNS (unicode): ID of the entity.
             """
    @@ -606,34 +605,70 @@ cdef class Token:
                 self.c.ent_id = self.vocab.strings.add(name)
     
         property whitespace_:
    +        """Trailing space character if present.
    +
    +        RETURNS (unicode): The whitespace character.
    +        """
             def __get__(self):
                 return ' ' if self.c.spacy else ''
     
         property orth_:
    +        """Verbatim text content (identical to `Token.text`). Existst mostly
    +        for consistency with the other attributes.
    +
    +        RETURNS (unicode): The token text.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.orth]
     
         property lower_:
    +        """Lowercase form of the token text. Equivalent to
    +        `Token.text.lower()`.
    +
    +        RETURNS (unicode): The lowercase token text.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.lower]
     
         property norm_:
    +        """The token's norm, i.e. a normalised form of the token text.
    +        Usually set in the language's tokenizer exceptions or norm exceptions.
    +
    +        RETURNS (unicode): The norm.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.norm]
     
         property shape_:
    +        """Transform of the tokens's string, to show orthographic features.
    +        For example, "Xxxx" or "dd".
    +
    +        RETURNS (unicode): The token shape.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.shape]
     
         property prefix_:
    +        """A length-N substring from the start of the token. Defaults to `N=1`.
    +
    +        RETURNS (unicode): The token's prefix.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.prefix]
     
         property suffix_:
    +        """A length-N substring from the end of the token. Defaults to `N=3`.
    +
    +        RETURNS (unicode): The token's suffix.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.suffix]
     
         property lang_:
    +        """Language of the parent document's vocabulary, e.g. 'en'.
    +
    +        RETURNS (unicode): The language code.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.lang]
     
    @@ -648,65 +683,152 @@ cdef class Token:
                 self.c.lemma = self.vocab.strings.add(lemma_)
     
         property pos_:
    +        """Coarse-grained part-of-speech.
    +
    +        RETURNS (unicode): The part-of-speech tag.
    +        """
             def __get__(self):
                 return parts_of_speech.NAMES[self.c.pos]
     
         property tag_:
    +        """Fine-grained part-of-speech.
    +
    +        RETURNS (unicode): The part-of-speech tag.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.tag]
             def __set__(self, tag):
                 self.tag = self.vocab.strings.add(tag)
     
         property dep_:
    +        """Syntactic dependency relation.
    +
    +        RETURNS (unicode): The dependency label.
    +        """
             def __get__(self):
                 return self.vocab.strings[self.c.dep]
             def __set__(self, unicode label):
                 self.c.dep = self.vocab.strings.add(label)
     
         property is_oov:
    +        """Is the token out-of-vocabulary?
    +
    +        RETURNS (bool): Whether the token is out-of-vocabulary.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_OOV)
     
         property is_stop:
    +        """Is the token part of a "stop list"? (defined by the language data)
    +
    +        RETURNS (bool): Whether the token is a stop word.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_STOP)
     
         property is_alpha:
    +        """Does the token consist of alphabetic characters? Equivalent to
    +        `token.text.isalpha()`.
    +
    +        RETURNS (bool): Whether the token consists of alpha characters.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_ALPHA)
     
         property is_ascii:
    +        """Does the token consist of ASCII characters? Equivalent to
    +        `[any(ord(c) >= 128 for c in token.text)]`.
    +
    +        RETURNS (bool): Whether the token consists of ASCII characters.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_ASCII)
     
         property is_digit:
    +        """Does the token consist of digits? Equivalent to
    +        `token.text.isdigit()`.
    +
    +        RETURNS (bool): Whether the token consists of digits.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_DIGIT)
     
         property is_lower:
    +        """Is the token in lowercase? Equivalent to `token.text.islower()`.
    +
    +        RETURNS (bool): Whether the token is in lowercase.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_LOWER)
     
    +    property is_upper:
    +        """Is the token in uppercase? Equivalent to `token.text.isupper()`.
    +
    +        RETURNS (bool): Whether the token is in uppercase.
    +        """
    +        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_UPPER)
    +
         property is_title:
    +        """Is the token in titlecase? Equivalent to `token.text.istitle()`.
    +
    +        RETURNS (bool): Whether the token is in titlecase.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_TITLE)
     
         property is_punct:
    +        """Is the token punctuation?
    +
    +        RETURNS (bool): Whether the token is punctuation.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_PUNCT)
     
         property is_space:
    +        """Does the token consist of whitespace characters? Equivalent to
    +        `token.text.isspace()`.
    +
    +        RETURNS (bool): Whether the token consists of whitespace characters.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_SPACE)
     
         property is_bracket:
    +        """Is the token a bracket?
    +
    +        RETURNS (bool): Whether the token is a bracket.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_BRACKET)
     
         property is_quote:
    +        """Is the token a quotation mark?
    +
    +        RETURNS (bool): Whether the token is a quotation mark.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_QUOTE)
     
         property is_left_punct:
    +        """Is the token a left punctuation mark, e.g. "("?
    +
    +        RETURNS (bool): Whether the token is a left punctuation mark.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_LEFT_PUNCT)
     
         property is_right_punct:
    +        """Is the token a left punctuation mark, e.g. "("?
    +
    +        RETURNS (bool): Whether the token is a left punctuation mark.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_RIGHT_PUNCT)
     
         property like_url:
    +        """Does the token resemble a URL?
    +
    +        RETURNS (bool): Whether the token resembles a URL.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, LIKE_URL)
     
         property like_num:
    +        """Does the token represent a number? e.g. "10.9", "10", "ten", etc.
    +
    +        RETURNS (bool): Whether the token resembles a number.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, LIKE_NUM)
     
         property like_email:
    +        """Does the token resemble an email address?
    +
    +        RETURNS (bool): Whether the token resembles an email address.
    +        """
             def __get__(self): return Lexeme.c_check_flag(self.c.lex, LIKE_EMAIL)
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 2a55409f1..f00cb936f 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -248,6 +248,28 @@ p
             +cell float
             +cell A scalar similarity score. Higher is more similar.
     
    ++h(2, "get_lca_matrix") Span.get_lca_matrix
    +    +tag method
    +
    +p
    +    |  Calculates the lowest common ancestor matrix for a given #[code Span].
    +    |  Returns LCA matrix containing the integer index of the ancestor, or
    +    |  #[code -1] if no common ancestor is found, e.g. if span excludes a
    +    |  necessary ancestor.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn')
    +    span = doc[1:4]
    +    matrix = span.get_lca_matrix()
    +    # array([[0, 0, 0], [0, 1, 2], [0, 2, 2]], dtype=int32)
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']]
    +        +cell The lowest common ancestor matrix of the #[code Span].
    +
    +
     +h(2, "to_array") Span.to_array
         +tag method
         +tag-new(2)
    @@ -495,6 +517,18 @@ p
                 |  The text content of the span with a trailing whitespace character
                 |  if the last token has one.
     
    +    +row
    +        +cell #[code orth]
    +        +cell int
    +        +cell ID of the verbatim text content.
    +
    +    +row
    +        +cell #[code orth_]
    +        +cell unicode
    +        +cell
    +            |  Verbatim text content (identical to #[code Span.text]). Existst
    +            |  mostly for consistency with the other attributes.
    +
         +row
             +cell #[code label]
             +cell int
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 4062594b4..3ce11d07a 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -489,15 +489,35 @@ p The L2 norm of the token's vector representation.
             +cell unicode
             +cell Base form of the token, with no inflectional suffixes.
     
    +    +row
    +        +cell #[code norm]
    +        +cell int
    +        +cell
    +            |  The token's norm, i.e. a normalised form of the token text.
    +            |  Usually set in the language's
    +            |  #[+a("/usage/adding-languages#tokenizer-exceptions") tokenizer exceptions] or
    +            |  #[+a("/usage/adding-languages#norm-exceptions") norm exceptions].
    +
    +    +row
    +        +cell #[code norm_]
    +        +cell unicode
    +        +cell
    +            |  The token's norm, i.e. a normalised form of the token text.
    +            |  Usually set in the language's
    +            |  #[+a("/usage/adding-languages#tokenizer-exceptions") tokenizer exceptions] or
    +            |  #[+a("/usage/adding-languages#norm-exceptions") norm exceptions].
    +
         +row
             +cell #[code lower]
             +cell int
    -        +cell Lower-case form of the token.
    +        +cell Lowercase form of the token.
     
         +row
             +cell #[code lower_]
             +cell unicode
    -        +cell Lower-case form of the token.
    +        +cell
    +            |  Lowercase form of the token text. Equivalent to
    +            |  #[code Token.text.lower()].
     
         +row
             +cell #[code shape]
    @@ -537,7 +557,9 @@ p The L2 norm of the token's vector representation.
         +row
             +cell #[code suffix_]
             +cell unicode
    -        +cell Length-N substring from the end of the token. Defaults to #[code N=3].
    +        +cell
    +            |  Length-N substring from the end of the token. Defaults to
    +            |  #[code N=3].
     
         +row
             +cell #[code is_alpha]
    @@ -672,6 +694,7 @@ p The L2 norm of the token's vector representation.
             +cell #[code lang]
             +cell int
             +cell Language of the parent document's vocabulary.
    +
         +row
             +cell #[code lang_]
             +cell unicode
    
    From a6135336f5e2ec66fe95b2dc7a9a54cfb29167ac Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 17:02:55 +0200
    Subject: [PATCH 581/649] Tidy up gold
    
    ---
     spacy/gold.pyx | 79 +++++++++++++++++++++++++++-----------------------
     1 file changed, 43 insertions(+), 36 deletions(-)
    
    diff --git a/spacy/gold.pyx b/spacy/gold.pyx
    index 5729af667..921c837ba 100644
    --- a/spacy/gold.pyx
    +++ b/spacy/gold.pyx
    @@ -54,7 +54,8 @@ def merge_sents(sents):
             m_deps[3].extend(head + i for head in heads)
             m_deps[4].extend(labels)
             m_deps[5].extend(ner)
    -        m_brackets.extend((b['first'] + i, b['last'] + i, b['label']) for b in brackets)
    +        m_brackets.extend((b['first'] + i, b['last'] + i, b['label'])
    +                          for b in brackets)
             i += len(ids)
         return [(m_deps, m_brackets)]
     
    @@ -80,6 +81,8 @@ def align(cand_words, gold_words):
     
     
     punct_re = re.compile(r'\W')
    +
    +
     def _min_edit_path(cand_words, gold_words):
         cdef:
             Pool mem
    @@ -98,9 +101,9 @@ def _min_edit_path(cand_words, gold_words):
         mem = Pool()
         n_cand = len(cand_words)
         n_gold = len(gold_words)
    -    # Levenshtein distance, except we need the history, and we may want different
    -    # costs.
    -    # Mark operations with a string, and score the history using _edit_cost.
    +    # Levenshtein distance, except we need the history, and we may want
    +    # different costs. Mark operations with a string, and score the history
    +    # using _edit_cost.
         previous_row = []
         prev_costs = mem.alloc(n_gold + 1, sizeof(int))
         curr_costs = mem.alloc(n_gold + 1, sizeof(int))
    @@ -144,9 +147,9 @@ def _min_edit_path(cand_words, gold_words):
     
     
     def minibatch(items, size=8):
    -    '''Iterate over batches of items. `size` may be an iterator,
    +    """Iterate over batches of items. `size` may be an iterator,
         so that batch-size can vary on each step.
    -    '''
    +    """
         if isinstance(size, int):
             size_ = itertools.repeat(8)
         else:
    @@ -168,6 +171,7 @@ class GoldCorpus(object):
     
             train_path (unicode or Path): File or directory of training data.
             dev_path (unicode or Path): File or directory of development data.
    +        RETURNS (GoldCorpus): The newly created object.
             """
             self.train_path = util.ensure_path(train_path)
             self.dev_path = util.ensure_path(dev_path)
    @@ -213,7 +217,7 @@ class GoldCorpus(object):
             train_tuples = self.train_tuples
             if projectivize:
                 train_tuples = nonproj.preprocess_training_data(
    -                               self.train_tuples, label_freq_cutoff=100)
    +                self.train_tuples, label_freq_cutoff=100)
             random.shuffle(train_tuples)
             gold_docs = self.iter_gold_docs(nlp, train_tuples, gold_preproc,
                                             max_length=max_length,
    @@ -222,7 +226,6 @@ class GoldCorpus(object):
     
         def dev_docs(self, nlp, gold_preproc=False):
             gold_docs = self.iter_gold_docs(nlp, self.dev_tuples, gold_preproc)
    -        #gold_docs = nlp.preprocess_gold(gold_docs)
             yield from gold_docs
     
         @classmethod
    @@ -233,7 +236,6 @@ class GoldCorpus(object):
                     raw_text = None
                 else:
                     paragraph_tuples = merge_sents(paragraph_tuples)
    -
                 docs = cls._make_docs(nlp, raw_text, paragraph_tuples,
                                       gold_preproc, noise_level=noise_level)
                 golds = cls._make_golds(docs, paragraph_tuples)
    @@ -248,17 +250,20 @@ class GoldCorpus(object):
                 raw_text = add_noise(raw_text, noise_level)
                 return [nlp.make_doc(raw_text)]
             else:
    -            return [Doc(nlp.vocab, words=add_noise(sent_tuples[1], noise_level))
    -                for (sent_tuples, brackets) in paragraph_tuples]
    +            return [Doc(nlp.vocab,
    +                        words=add_noise(sent_tuples[1], noise_level))
    +                    for (sent_tuples, brackets) in paragraph_tuples]
     
         @classmethod
         def _make_golds(cls, docs, paragraph_tuples):
             assert len(docs) == len(paragraph_tuples)
             if len(docs) == 1:
    -            return [GoldParse.from_annot_tuples(docs[0], paragraph_tuples[0][0])]
    +            return [GoldParse.from_annot_tuples(docs[0],
    +                                                paragraph_tuples[0][0])]
             else:
                 return [GoldParse.from_annot_tuples(doc, sent_tuples)
    -                    for doc, (sent_tuples, brackets) in zip(docs, paragraph_tuples)]
    +                    for doc, (sent_tuples, brackets)
    +                    in zip(docs, paragraph_tuples)]
     
         @staticmethod
         def walk_corpus(path):
    @@ -330,16 +335,16 @@ def read_json_file(loc, docs_filter=None, limit=None):
                         for i, token in enumerate(sent['tokens']):
                             words.append(token['orth'])
                             ids.append(i)
    -                        tags.append(token.get('tag','-'))
    -                        heads.append(token.get('head',0) + i)
    -                        labels.append(token.get('dep',''))
    +                        tags.append(token.get('tag', '-'))
    +                        heads.append(token.get('head', 0) + i)
    +                        labels.append(token.get('dep', ''))
                             # Ensure ROOT label is case-insensitive
                             if labels[-1].lower() == 'root':
                                 labels[-1] = 'ROOT'
                             ner.append(token.get('ner', '-'))
                         sents.append([
                             [ids, words, tags, heads, labels, ner],
    -                         sent.get('brackets', [])])
    +                        sent.get('brackets', [])])
                     if sents:
                         yield [paragraph.get('raw', None), sents]
     
    @@ -382,19 +387,21 @@ cdef class GoldParse:
         @classmethod
         def from_annot_tuples(cls, doc, annot_tuples, make_projective=False):
             _, words, tags, heads, deps, entities = annot_tuples
    -        return cls(doc, words=words, tags=tags, heads=heads, deps=deps, entities=entities,
    -                   make_projective=make_projective)
    +        return cls(doc, words=words, tags=tags, heads=heads, deps=deps,
    +                   entities=entities, make_projective=make_projective)
     
    -    def __init__(self, doc, annot_tuples=None, words=None, tags=None, heads=None,
    -                 deps=None, entities=None, make_projective=False,
    +    def __init__(self, doc, annot_tuples=None, words=None, tags=None,
    +                 heads=None, deps=None, entities=None, make_projective=False,
                      cats=None):
             """Create a GoldParse.
     
             doc (Doc): The document the annotations refer to.
             words (iterable): A sequence of unicode word strings.
             tags (iterable): A sequence of strings, representing tag annotations.
    -        heads (iterable): A sequence of integers, representing syntactic head offsets.
    -        deps (iterable): A sequence of strings, representing the syntactic relation types.
    +        heads (iterable): A sequence of integers, representing syntactic
    +            head offsets.
    +        deps (iterable): A sequence of strings, representing the syntactic
    +            relation types.
             entities (iterable): A sequence of named entity annotations, either as
                 BILUO tag strings, or as `(start_char, end_char, label)` tuples,
                 representing the entity positions.
    @@ -404,9 +411,10 @@ cdef class GoldParse:
                 document (usually a sentence). Unlike entity annotations, label
                 annotations can overlap, i.e. a single word can be covered by
                 multiple labelled spans. The TextCategorizer component expects
    -            true examples of a label to have the value 1.0, and negative examples
    -            of a label to have the value 0.0. Labels not in the dictionary are
    -            treated as missing -- the gradient for those labels will be zero.
    +            true examples of a label to have the value 1.0, and negative
    +            examples of a label to have the value 0.0. Labels not in the
    +            dictionary are treated as missing - the gradient for those labels
    +            will be zero.
             RETURNS (GoldParse): The newly constructed object.
             """
             if words is None:
    @@ -470,11 +478,11 @@ cdef class GoldParse:
                     self.ner[i] = entities[gold_i]
     
             cycle = nonproj.contains_cycle(self.heads)
    -        if cycle != None:
    +        if cycle is not None:
                 raise Exception("Cycle found: %s" % cycle)
     
             if make_projective:
    -            proj_heads,_ = nonproj.projectivize(self.heads, self.labels)
    +            proj_heads, _ = nonproj.projectivize(self.heads, self.labels)
                 self.heads = proj_heads
     
         def __len__(self):
    @@ -497,20 +505,19 @@ cdef class GoldParse:
     
     
     def biluo_tags_from_offsets(doc, entities, missing='O'):
    -    """Encode labelled spans into per-token tags, using the Begin/In/Last/Unit/Out
    -    scheme (BILUO).
    +    """Encode labelled spans into per-token tags, using the
    +    Begin/In/Last/Unit/Out scheme (BILUO).
     
         doc (Doc): The document that the entity offsets refer to. The output tags
             will refer to the token boundaries within the document.
    -    entities (iterable): A sequence of `(start, end, label)` triples. `start` and
    -        `end` should be character-offset integers denoting the slice into the
    -        original string.
    -
    +    entities (iterable): A sequence of `(start, end, label)` triples. `start`
    +        and `end` should be character-offset integers denoting the slice into
    +        the original string.
         RETURNS (list): A list of unicode strings, describing the tags. Each tag
             string will be of the form either "", "O" or "{action}-{label}", where
             action is one of "B", "I", "L", "U". The string "-" is used where the
    -        entity offsets don't align with the tokenization in the `Doc` object. The
    -        training algorithm will view these as missing values. "O" denotes a
    +        entity offsets don't align with the tokenization in the `Doc` object.
    +        The training algorithm will view these as missing values. "O" denotes a
             non-entity token. "B" denotes the beginning of a multi-token entity,
             "I" the inside of an entity of three or more tokens, and "L" the end
             of an entity of two or more tokens. "U" denotes a single-token entity.
    
    From 544a407b931181488b23b98ea4620fbe3cd7d4c1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 17:07:26 +0200
    Subject: [PATCH 582/649] Tidy up Doc, Token and Span and add missing docs
    
    ---
     spacy/tokens/doc.pyx                          |  35 +-
     spacy/tokens/span.pyx                         |  84 +++--
     spacy/tokens/token.pyx                        | 321 +++++++++---------
     website/api/doc.jade                          |   7 +
     website/api/span.jade                         |  54 ++-
     website/api/token.jade                        |  99 +++++-
     .../_dependency-parse.jade                    |  21 +-
     7 files changed, 384 insertions(+), 237 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 7c276e3c2..7a2e95e4b 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -326,7 +326,8 @@ cdef class Doc:
                 if self._vector is not None:
                     return self._vector
                 elif not len(self):
    -                self._vector = numpy.zeros((self.vocab.vectors_length,), dtype='f')
    +                self._vector = numpy.zeros((self.vocab.vectors_length,),
    +                                           dtype='f')
                     return self._vector
                 elif self.has_vector:
                     vector = numpy.zeros((self.vocab.vectors_length,), dtype='f')
    @@ -338,7 +339,8 @@ cdef class Doc:
                     self._vector = self.tensor.mean(axis=0)
                     return self._vector
                 else:
    -                return numpy.zeros((self.vocab.vectors_length,), dtype='float32')
    +                return numpy.zeros((self.vocab.vectors_length,),
    +                                   dtype='float32')
     
             def __set__(self, value):
                 self._vector = value
    @@ -424,7 +426,8 @@ cdef class Doc:
             def __set__(self, ents):
                 # TODO:
                 # 1. Allow negative matches
    -            # 2. Ensure pre-set NERs are not over-written during statistical prediction
    +            # 2. Ensure pre-set NERs are not over-written during statistical
    +            #    prediction
                 # 3. Test basic data-driven ORTH gazetteer
                 # 4. Test more nuanced date and currency regex
                 cdef int i
    @@ -433,7 +436,7 @@ cdef class Doc:
                     # At this point we don't know whether the NER has run over the
                     # Doc. If the ent_iob is missing, leave it missing.
                     if self.c[i].ent_iob != 0:
    -                    self.c[i].ent_iob = 2 # Means O. Non-O are set from ents.
    +                    self.c[i].ent_iob = 2  # Means O. Non-O are set from ents.
                 cdef attr_t ent_type
                 cdef int start, end
                 for ent_info in ents:
    @@ -574,18 +577,19 @@ cdef class Doc:
             # Allow strings, e.g. 'lemma' or 'LEMMA'
             py_attr_ids = [(IDS[id_.upper()] if hasattr(id_, 'upper') else id_)
                            for id_ in py_attr_ids]
    -        # Make an array from the attributes --- otherwise our inner loop is Python
    -        # dict iteration.
    +        # Make an array from the attributes --- otherwise our inner loop is
    +        # Python dict iteration.
             attr_ids = numpy.asarray(py_attr_ids, dtype=numpy.uint64)
    -        output = numpy.ndarray(shape=(self.length, len(attr_ids)), dtype=numpy.uint64)
    +        output = numpy.ndarray(shape=(self.length, len(attr_ids)),
    +                               dtype=numpy.uint64)
             for i in range(self.length):
                 for j, feature in enumerate(attr_ids):
                     output[i, j] = get_token_attr(&self.c[i], feature)
             # Handle 1d case
             return output if len(attr_ids) >= 2 else output.reshape((self.length,))
     
    -
    -    def count_by(self, attr_id_t attr_id, exclude=None, PreshCounter counts=None):
    +    def count_by(self, attr_id_t attr_id, exclude=None,
    +                 PreshCounter counts=None):
             """Count the frequencies of a given attribute. Produces a dict of
             `{attribute (int): count (ints)}` frequencies, keyed by the values of
             the given attribute ID.
    @@ -708,7 +712,8 @@ cdef class Doc:
                 elif (token_j.head == token_j) and (token_k.head == token_k):
                     lca_index = -1
                 else:
    -                lca_index = __pairwise_lca(token_j.head, token_k.head, lca_matrix)
    +                lca_index = __pairwise_lca(token_j.head, token_k.head,
    +                                           lca_matrix)
                 lca_matrix[token_j.i][token_k.i] = lca_index
                 lca_matrix[token_k.i][token_j.i] = lca_index
     
    @@ -728,7 +733,7 @@ cdef class Doc:
             """Save the current state to a directory.
     
             path (unicode or Path): A path to a directory, which will be created if
    -            it doesn't exist. Paths may be either strings or `Path`-like objects.
    +            it doesn't exist. Paths may be either strings or Path-like objects.
             """
             with path.open('wb') as file_:
                 file_.write(self.to_bytes(**exclude))
    @@ -751,7 +756,7 @@ cdef class Doc:
             RETURNS (bytes): A losslessly serialized copy of the `Doc`, including
                 all annotations.
             """
    -        array_head = [LENGTH,SPACY,TAG,LEMMA,HEAD,DEP,ENT_IOB,ENT_TYPE]
    +        array_head = [LENGTH, SPACY, TAG, LEMMA, HEAD, DEP, ENT_IOB, ENT_TYPE]
             # Msgpack doesn't distinguish between lists and tuples, which is
             # vexing for user data. As a best guess, we *know* that within
             # keys, we must have tuples. In values we just have to hope
    @@ -794,7 +799,8 @@ cdef class Doc:
             # keys, we must have tuples. In values we just have to hope
             # users don't mind getting a list instead of a tuple.
             if 'user_data' not in exclude and 'user_data_keys' in msg:
    -            user_data_keys = msgpack.loads(msg['user_data_keys'], use_list=False)
    +            user_data_keys = msgpack.loads(msg['user_data_keys'],
    +                                           use_list=False)
                 user_data_values = msgpack.loads(msg['user_data_values'])
                 for key, value in zip(user_data_keys, user_data_values):
                     self.user_data[key] = value
    @@ -853,7 +859,8 @@ cdef class Doc:
                     "Doc.merge received %d non-keyword arguments. Expected either "
                     "3 arguments (deprecated), or 0 (use keyword arguments). "
                     "Arguments supplied:\n%s\n"
    -                "Keyword arguments: %s\n" % (len(args), repr(args), repr(attributes)))
    +                "Keyword arguments: %s\n" % (len(args), repr(args),
    +                                             repr(attributes)))
     
             # More deprecated attribute handling =/
             if 'label' in attributes:
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 3b2d14b2b..6f760bfbc 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -128,14 +128,17 @@ cdef class Span:
     
         @property
         def _(self):
    +        """User space for adding custom attribute extensions."""
             return Underscore(Underscore.span_extensions, self,
                               start=self.start_char, end=self.end_char)
     
         def as_doc(self):
    -        '''Create a Doc object view of the Span's data.
    +        # TODO: fix
    +        """Create a `Doc` object view of the Span's data. This is mostly
    +        useful for C-typed interfaces.
     
    -        This is mostly useful for C-typed interfaces.
    -        '''
    +        RETURNS (Doc): The `Doc` view of the span.
    +        """
             cdef Doc doc = Doc(self.doc.vocab)
             doc.length = self.end-self.start
             doc.c = &self.doc.c[self.start]
    @@ -259,10 +262,7 @@ cdef class Span:
                 self.end = end + 1
     
         property sent:
    -        """The sentence span that this span is a part of.
    -
    -        RETURNS (Span): The sentence span that the span is a part of.
    -        """
    +        """RETURNS (Span): The sentence span that the span is a part of."""
             def __get__(self):
                 if 'sent' in self.doc.user_span_hooks:
                     return self.doc.user_span_hooks['sent'](self)
    @@ -275,13 +275,10 @@ cdef class Span:
                     n += 1
                     if n >= self.doc.length:
                         raise RuntimeError
    -            return self.doc[root.l_edge : root.r_edge + 1]
    +            return self.doc[root.l_edge:root.r_edge + 1]
     
         property has_vector:
    -        """A boolean value indicating whether a word vector is associated with
    -        the object.
    -
    -        RETURNS (bool): Whether a word vector is associated with the object.
    +        """RETURNS (bool): Whether a word vector is associated with the object.
             """
             def __get__(self):
                 if 'has_vector' in self.doc.user_span_hooks:
    @@ -303,10 +300,7 @@ cdef class Span:
                 return self._vector
     
         property vector_norm:
    -        """The L2 norm of the document's vector representation.
    -
    -        RETURNS (float): The L2 norm of the vector representation.
    -        """
    +        """RETURNS (float): The L2 norm of the vector representation."""
             def __get__(self):
                 if 'vector_norm' in self.doc.user_span_hooks:
                     return self.doc.user_span_hooks['vector'](self)
    @@ -320,7 +314,9 @@ cdef class Span:
                 return self._vector_norm
     
         property sentiment:
    -        # TODO: docstring
    +        """RETURNS (float): A scalar value indicating the positivity or
    +            negativity of the span.
    +        """
             def __get__(self):
                 if 'sentiment' in self.doc.user_span_hooks:
                     return self.doc.user_span_hooks['sentiment'](self)
    @@ -328,10 +324,7 @@ cdef class Span:
                     return sum([token.sentiment for token in self]) / len(self)
     
         property text:
    -        """A unicode representation of the span text.
    -
    -        RETURNS (unicode): The original verbatim text of the span.
    -        """
    +        """RETURNS (unicode): The original verbatim text of the span."""
             def __get__(self):
                 text = self.text_with_ws
                 if self[-1].whitespace_:
    @@ -364,10 +357,11 @@ cdef class Span:
                         "requires a statistical model to be installed and loaded. "
                         "For more info, see the "
                         "documentation: \n%s\n" % about.__docs_models__)
    -            # Accumulate the result before beginning to iterate over it. This prevents
    -            # the tokenisation from being changed out from under us during the iteration.
    -            # The tricky thing here is that Span accepts its tokenisation changing,
    -            # so it's okay once we have the Span objects. See Issue #375
    +            # Accumulate the result before beginning to iterate over it. This
    +            # prevents the tokenisation from being changed out from under us
    +            # during the iteration. The tricky thing here is that Span accepts
    +            # its tokenisation changing, so it's okay once we have the Span
    +            # objects. See Issue #375
                 spans = []
                 cdef attr_t label
                 for start, end, label in self.doc.noun_chunks_iterator(self):
    @@ -459,7 +453,7 @@ cdef class Span:
             YIELDS (Token):A left-child of a token of the span.
             """
             def __get__(self):
    -            for token in reversed(self): # Reverse, so we get tokens in order
    +            for token in reversed(self):  # Reverse, so we get tokens in order
                     for left in token.lefts:
                         if left.i < self.start:
                             yield left
    @@ -476,6 +470,20 @@ cdef class Span:
                         if right.i >= self.end:
                             yield right
     
    +    property n_lefts:
    +        """RETURNS (int): The number of leftward immediate children of the
    +            span, in the syntactic dependency parse.
    +        """
    +        # TODO: implement
    +        raise NotImplementedError()
    +
    +    property n_rights:
    +        """RETURNS (int): The number of rightward immediate children of the
    +            span, in the syntactic dependency parse.
    +        """
    +        # TODO: implement
    +        raise NotImplementedError()
    +
         property subtree:
             """Tokens that descend from tokens in the span, but fall outside it.
     
    @@ -489,29 +497,21 @@ cdef class Span:
                     yield from word.subtree
     
         property ent_id:
    -        """An (integer) entity ID.
    -
    -        RETURNS (uint64): The entity ID.
    -        """
    +        """RETURNS (uint64): The entity ID."""
             def __get__(self):
                 return self.root.ent_id
     
             def __set__(self, hash_t key):
    -            # TODO
                 raise NotImplementedError(
                     "Can't yet set ent_id from Span. Vote for this feature on "
                     "the issue tracker: http://github.com/explosion/spaCy/issues")
     
         property ent_id_:
    -        """A (string) entity ID. Usually assigned by patterns in the `Matcher`.
    -
    -        RETURNS (unicode): The entity ID.
    -        """
    +        """RETURNS (unicode): The (string) entity ID."""
             def __get__(self):
                 return self.root.ent_id_
     
             def __set__(self, hash_t key):
    -            # TODO
                 raise NotImplementedError(
                     "Can't yet set ent_id_ from Span. Vote for this feature on the "
                     "issue tracker: http://github.com/explosion/spaCy/issues")
    @@ -525,10 +525,7 @@ cdef class Span:
                 return ''.join([t.orth_ for t in self]).strip()
     
         property lemma_:
    -        """The span's lemma.
    -
    -        RETURNS (unicode): The span's lemma.
    -        """
    +        """RETURNS (unicode): The span's lemma."""
             def __get__(self):
                 return ' '.join([t.lemma_ for t in self]).strip()
     
    @@ -543,15 +540,12 @@ cdef class Span:
                 return ''.join([t.text_with_ws.lower() for t in self]).strip()
     
         property string:
    -        """Deprecated: Use Span.text instead."""
    +        """Deprecated: Use Span.text_with_ws instead."""
             def __get__(self):
                 return ''.join([t.text_with_ws for t in self])
     
         property label_:
    -        """The span's label.
    -
    -        RETURNS (unicode): The span's label.
    -        """
    +        """RETURNS (unicode): The span's label."""
             def __get__(self):
                 return self.doc.vocab.strings[self.label]
     
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index 04aa3f582..fa07d0e9e 100644
    --- a/spacy/tokens/token.pyx
    +++ b/spacy/tokens/token.pyx
    @@ -145,37 +145,32 @@ cdef class Token:
                 return self.doc.user_token_hooks['similarity'](self)
             if self.vector_norm == 0 or other.vector_norm == 0:
                 return 0.0
    -        return numpy.dot(self.vector, other.vector) / (self.vector_norm * other.vector_norm)
    +        return (numpy.dot(self.vector, other.vector) /
    +                (self.vector_norm * other.vector_norm))
     
         property lex_id:
    -        """ID of the token's lexical type.
    -
    -        RETURNS (int): ID of the token's lexical type."""
    +        """RETURNS (int): Sequential ID of the token's lexical type."""
             def __get__(self):
                 return self.c.lex.id
     
         property rank:
    -        # TODO: add docstring
    +        """RETURNS (int): Sequential ID of the token's lexical type, used to
    +        index into tables, e.g. for word vectors."""
             def __get__(self):
                 return self.c.lex.id
     
         property string:
    +        """Deprecated: Use Token.text_with_ws instead."""
             def __get__(self):
                 return self.text_with_ws
     
         property text:
    -        """A unicode representation of the token text.
    -
    -        RETURNS (unicode): The original verbatim text of the token.
    -        """
    +        """RETURNS (unicode): The original verbatim text of the token."""
             def __get__(self):
                 return self.orth_
     
         property text_with_ws:
    -        """The text content of the token with a trailing whitespace character
    -        if it has one.
    -
    -        RETURNS (unicode): The text content of the span (with trailing
    +        """RETURNS (unicode): The text content of the span (with trailing
                 whitespace).
             """
             def __get__(self):
    @@ -186,74 +181,104 @@ cdef class Token:
                     return orth
     
         property prob:
    +        """RETURNS (float): Smoothed log probability estimate of token type."""
             def __get__(self):
                 return self.c.lex.prob
     
         property sentiment:
    +        """RETURNS (float): A scalar value indicating the positivity or
    +            negativity of the token."""
             def __get__(self):
                 if 'sentiment' in self.doc.user_token_hooks:
                     return self.doc.user_token_hooks['sentiment'](self)
                 return self.c.lex.sentiment
     
         property lang:
    +        """RETURNS (uint64): ID of the language of the parent document's
    +            vocabulary.
    +        """
             def __get__(self):
                 return self.c.lex.lang
     
         property idx:
    +        """RETURNS (int): The character offset of the token within the parent
    +            document.
    +        """
             def __get__(self):
                 return self.c.idx
     
         property cluster:
    +        """RETURNS (int): Brown cluster ID."""
             def __get__(self):
                 return self.c.lex.cluster
     
         property orth:
    +        """RETURNS (uint64): ID of the verbatim text content."""
             def __get__(self):
                 return self.c.lex.orth
     
         property lower:
    +        """RETURNS (uint64): ID of the lowercase token text."""
             def __get__(self):
                 return self.c.lex.lower
     
         property norm:
    +        """RETURNS (uint64): ID of the token's norm, i.e. a normalised form of
    +            the token text. Usually set in the language's tokenizer exceptions
    +            or norm exceptions.
    +        """
             def __get__(self):
                 return self.c.lex.norm
     
         property shape:
    +        """RETURNS (uint64): ID of the token's shape, a transform of the
    +            tokens's string, to show orthographic features (e.g. "Xxxx", "dd").
    +        """
             def __get__(self):
                 return self.c.lex.shape
     
         property prefix:
    +        """RETURNS (uint64): ID of a length-N substring from the start of the
    +            token. Defaults to `N=1`.
    +        """
             def __get__(self):
                 return self.c.lex.prefix
     
         property suffix:
    +        """RETURNS (uint64): ID of a length-N substring from the end of the
    +            token. Defaults to `N=3`.
    +        """
             def __get__(self):
                 return self.c.lex.suffix
     
         property lemma:
    -        """Base form of the word, with no inflectional suffixes.
    -
    -        RETURNS (uint64): Token lemma.
    +        """RETURNS (uint64): ID of the base form of the word, with no
    +            inflectional suffixes.
             """
             def __get__(self):
                 return self.c.lemma
    +
             def __set__(self, attr_t lemma):
                 self.c.lemma = lemma
     
         property pos:
    +        """RETURNS (uint64): ID of coarse-grained part-of-speech tag."""
             def __get__(self):
                 return self.c.pos
     
         property tag:
    +        """RETURNS (uint64): ID of fine-grained part-of-speech tag."""
             def __get__(self):
                 return self.c.tag
    +
             def __set__(self, attr_t tag):
                 self.vocab.morphology.assign_tag(self.c, tag)
     
         property dep:
    +        """RETURNS (uint64): ID of syntactic dependency label."""
             def __get__(self):
                 return self.c.dep
    +
             def __set__(self, attr_t label):
                 self.c.dep = label
     
    @@ -294,14 +319,21 @@ cdef class Token:
                 return numpy.sqrt((vector ** 2).sum())
     
         property n_lefts:
    +        """RETURNS (int): The number of leftward immediate children of the
    +            word, in the syntactic dependency parse.
    +        """
             def __get__(self):
                 return self.c.l_kids
     
         property n_rights:
    +        """RETURNS (int): The number of rightward immediate children of the
    +            word, in the syntactic dependency parse.
    +        """
             def __get__(self):
                 return self.c.r_kids
     
         property sent_start:
    +        # TODO: fix and document
             def __get__(self):
                 return self.c.sent_start
     
    @@ -321,10 +353,12 @@ cdef class Token:
                                      "one of: None, True, False")
     
         property lefts:
    +        """The leftward immediate children of the word, in the syntactic
    +        dependency parse.
    +
    +        YIELDS (Token): A left-child of the token.
    +        """
             def __get__(self):
    -            """The leftward immediate children of the word, in the syntactic
    -            dependency parse.
    -            """
                 cdef int nr_iter = 0
                 cdef const TokenC* ptr = self.c - (self.i - self.c.l_edge)
                 while ptr < self.c:
    @@ -338,10 +372,12 @@ cdef class Token:
                                            "while looking for token.lefts")
     
         property rights:
    +        """The rightward immediate children of the word, in the syntactic
    +        dependency parse.
    +
    +        YIELDS (Token): A right-child of the token.
    +        """
             def __get__(self):
    -            """The rightward immediate children of the word, in the syntactic
    -            dependency parse.
    -            """
                 cdef const TokenC* ptr = self.c + (self.c.r_edge - self.i)
                 tokens = []
                 cdef int nr_iter = 0
    @@ -420,18 +456,17 @@ cdef class Token:
             """
             if self.doc is not descendant.doc:
                 return False
    -        return any( ancestor.i == self.i for ancestor in descendant.ancestors )
    +        return any(ancestor.i == self.i for ancestor in descendant.ancestors)
     
         property head:
             """The syntactic parent, or "governor", of this token.
     
    -        RETURNS (Token): The token head.
    +        RETURNS (Token): The token predicted by the parser to be the head of
    +            the current token.
             """
             def __get__(self):
    -            """The token predicted by the parser to be the head of the current
    -            token.
    -            """
                 return self.doc[self.i + self.c.head]
    +
             def __set__(self, Token new_head):
                 # this function sets the head of self to new_head
                 # and updates the counters for left/right dependents
    @@ -451,7 +486,7 @@ cdef class Token:
                 cdef Token anc, child
     
                 # update number of deps of old head
    -            if self.c.head > 0: # left dependent
    +            if self.c.head > 0:  # left dependent
                     old_head.c.l_kids -= 1
                     if self.c.l_edge == old_head.c.l_edge:
                         # the token dominates the left edge so the left edge of
    @@ -543,12 +578,10 @@ cdef class Token:
                                 yield from word.conjuncts
     
         property ent_type:
    -        """Named entity type.
    -
    -        RETURNS (uint64): Named entity type.
    -        """
    +        """RETURNS (uint64): Named entity type."""
             def __get__(self):
                 return self.c.ent_type
    +
             def __set__(self, ent_type):
                 self.c.ent_type = ent_type
     
    @@ -562,12 +595,10 @@ cdef class Token:
                 return self.c.ent_iob
     
         property ent_type_:
    -        """Named entity type.
    -
    -        RETURNS (unicode): Named entity type.
    -        """
    +        """RETURNS (unicode): Named entity type."""
             def __get__(self):
                 return self.vocab.strings[self.c.ent_type]
    +
             def __set__(self, ent_type):
                 self.c.ent_type = self.vocab.strings.add(ent_type)
     
    @@ -583,9 +614,8 @@ cdef class Token:
                 return iob_strings[self.c.ent_iob]
     
         property ent_id:
    -        """ID of the entity the token is an instance of, if any.
    -
    -        RETURNS (uint64): ID of the entity.
    +        """RETURNS (uint64): ID of the entity the token is an instance of,
    +            if any.
             """
             def __get__(self):
                 return self.c.ent_id
    @@ -594,9 +624,8 @@ cdef class Token:
                 self.c.ent_id = key
     
         property ent_id_:
    -        """ID of the entity the token is an instance of, if any.
    -
    -        RETURNS (unicode): ID of the entity.
    +        """RETURNS (unicode): ID of the entity the token is an instance of,
    +            if any.
             """
             def __get__(self):
                 return self.vocab.strings[self.c.ent_id]
    @@ -605,230 +634,192 @@ cdef class Token:
                 self.c.ent_id = self.vocab.strings.add(name)
     
         property whitespace_:
    -        """Trailing space character if present.
    -
    -        RETURNS (unicode): The whitespace character.
    +        """RETURNS (unicode): The trailing whitespace character, if present.
             """
             def __get__(self):
                 return ' ' if self.c.spacy else ''
     
         property orth_:
    -        """Verbatim text content (identical to `Token.text`). Existst mostly
    -        for consistency with the other attributes.
    -
    -        RETURNS (unicode): The token text.
    +        """RETURNS (unicode): Verbatim text content (identical to
    +            `Token.text`). Existst mostly for consistency with the other
    +            attributes.
             """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.orth]
     
         property lower_:
    -        """Lowercase form of the token text. Equivalent to
    -        `Token.text.lower()`.
    -
    -        RETURNS (unicode): The lowercase token text.
    +        """RETURNS (unicode): The lowercase token text. Equivalent to
    +            `Token.text.lower()`.
             """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.lower]
     
         property norm_:
    -        """The token's norm, i.e. a normalised form of the token text.
    -        Usually set in the language's tokenizer exceptions or norm exceptions.
    -
    -        RETURNS (unicode): The norm.
    +        """RETURNS (unicode): The token's norm, i.e. a normalised form of the
    +            token text. Usually set in the language's tokenizer exceptions or
    +            norm exceptions.
             """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.norm]
     
         property shape_:
    -        """Transform of the tokens's string, to show orthographic features.
    -        For example, "Xxxx" or "dd".
    -
    -        RETURNS (unicode): The token shape.
    +        """RETURNS (unicode): Transform of the tokens's string, to show
    +            orthographic features. For example, "Xxxx" or "dd".
             """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.shape]
     
         property prefix_:
    -        """A length-N substring from the start of the token. Defaults to `N=1`.
    -
    -        RETURNS (unicode): The token's prefix.
    +        """RETURNS (unicode): A length-N substring from the start of the token.
    +            Defaults to `N=1`.
             """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.prefix]
     
         property suffix_:
    -        """A length-N substring from the end of the token. Defaults to `N=3`.
    -
    -        RETURNS (unicode): The token's suffix.
    +        """RETURNS (unicode): A length-N substring from the end of the token.
    +            Defaults to `N=3`.
             """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.suffix]
     
         property lang_:
    -        """Language of the parent document's vocabulary, e.g. 'en'.
    -
    -        RETURNS (unicode): The language code.
    +        """RETURNS (unicode): Language of the parent document's vocabulary,
    +            e.g. 'en'.
             """
             def __get__(self):
                 return self.vocab.strings[self.c.lex.lang]
     
         property lemma_:
    -        """Base form of the word, with no inflectional suffixes.
    -
    -        RETURNS (unicode): Token lemma.
    +        """RETURNS (unicode): The token lemma, i.e. the base form of the word,
    +            with no inflectional suffixes.
             """
             def __get__(self):
                 return self.vocab.strings[self.c.lemma]
    +
             def __set__(self, unicode lemma_):
                 self.c.lemma = self.vocab.strings.add(lemma_)
     
         property pos_:
    -        """Coarse-grained part-of-speech.
    -
    -        RETURNS (unicode): The part-of-speech tag.
    -        """
    +        """RETURNS (unicode): Coarse-grained part-of-speech tag."""
             def __get__(self):
                 return parts_of_speech.NAMES[self.c.pos]
     
         property tag_:
    -        """Fine-grained part-of-speech.
    -
    -        RETURNS (unicode): The part-of-speech tag.
    -        """
    +        """RETURNS (unicode): Fine-grained part-of-speech tag."""
             def __get__(self):
                 return self.vocab.strings[self.c.tag]
    +
             def __set__(self, tag):
                 self.tag = self.vocab.strings.add(tag)
     
         property dep_:
    -        """Syntactic dependency relation.
    -
    -        RETURNS (unicode): The dependency label.
    -        """
    +        """RETURNS (unicode): The syntactic dependency label."""
             def __get__(self):
                 return self.vocab.strings[self.c.dep]
    +
             def __set__(self, unicode label):
                 self.c.dep = self.vocab.strings.add(label)
     
         property is_oov:
    -        """Is the token out-of-vocabulary?
    -
    -        RETURNS (bool): Whether the token is out-of-vocabulary.
    -        """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_OOV)
    +        """RETURNS (bool): Whether the token is out-of-vocabulary."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_OOV)
     
         property is_stop:
    -        """Is the token part of a "stop list"? (defined by the language data)
    -
    -        RETURNS (bool): Whether the token is a stop word.
    +        """RETURNS (bool): Whether the token is a stop word, i.e. part of a
    +            "stop list" defined by the language data.
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_STOP)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_STOP)
     
         property is_alpha:
    -        """Does the token consist of alphabetic characters? Equivalent to
    -        `token.text.isalpha()`.
    -
    -        RETURNS (bool): Whether the token consists of alpha characters.
    +        """RETURNS (bool): Whether the token consists of alpha characters.
    +            Equivalent to `token.text.isalpha()`.
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_ALPHA)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_ALPHA)
     
         property is_ascii:
    -        """Does the token consist of ASCII characters? Equivalent to
    -        `[any(ord(c) >= 128 for c in token.text)]`.
    -
    -        RETURNS (bool): Whether the token consists of ASCII characters.
    +        """RETURNS (bool): Whether the token consists of ASCII characters.
    +            Equivalent to `[any(ord(c) >= 128 for c in token.text)]`.
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_ASCII)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_ASCII)
     
         property is_digit:
    -        """Does the token consist of digits? Equivalent to
    -        `token.text.isdigit()`.
    -
    -        RETURNS (bool): Whether the token consists of digits.
    +        """RETURNS (bool): Whether the token consists of digits. Equivalent to
    +            `token.text.isdigit()`.
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_DIGIT)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_DIGIT)
     
         property is_lower:
    -        """Is the token in lowercase? Equivalent to `token.text.islower()`.
    -
    -        RETURNS (bool): Whether the token is in lowercase.
    +        """RETURNS (bool): Whether the token is in lowercase. Equivalent to
    +            `token.text.islower()`.
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_LOWER)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_LOWER)
     
         property is_upper:
    -        """Is the token in uppercase? Equivalent to `token.text.isupper()`.
    -
    -        RETURNS (bool): Whether the token is in uppercase.
    +        """RETURNS (bool): Whether the token is in uppercase. Equivalent to
    +            `token.text.isupper()`
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_UPPER)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_UPPER)
     
         property is_title:
    -        """Is the token in titlecase? Equivalent to `token.text.istitle()`.
    -
    -        RETURNS (bool): Whether the token is in titlecase.
    +        """RETURNS (bool): Whether the token is in titlecase. Equivalent to
    +            `token.text.istitle()`.
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_TITLE)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_TITLE)
     
         property is_punct:
    -        """Is the token punctuation?
    -
    -        RETURNS (bool): Whether the token is punctuation.
    -        """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_PUNCT)
    +        """RETURNS (bool): Whether the token is punctuation."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_PUNCT)
     
         property is_space:
    -        """Does the token consist of whitespace characters? Equivalent to
    -        `token.text.isspace()`.
    -
    -        RETURNS (bool): Whether the token consists of whitespace characters.
    +        """RETURNS (bool): Whether the token consists of whitespace characters.
    +            Equivalent to `token.text.isspace()`.
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_SPACE)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_SPACE)
     
         property is_bracket:
    -        """Is the token a bracket?
    -
    -        RETURNS (bool): Whether the token is a bracket.
    -        """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_BRACKET)
    +        """RETURNS (bool): Whether the token is a bracket."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_BRACKET)
     
         property is_quote:
    -        """Is the token a quotation mark?
    -
    -        RETURNS (bool): Whether the token is a quotation mark.
    -        """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_QUOTE)
    +        """RETURNS (bool): Whether the token is a quotation mark."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_QUOTE)
     
         property is_left_punct:
    -        """Is the token a left punctuation mark, e.g. "("?
    -
    -        RETURNS (bool): Whether the token is a left punctuation mark.
    -        """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_LEFT_PUNCT)
    +        """RETURNS (bool): Whether the token is a left punctuation mark."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_LEFT_PUNCT)
     
         property is_right_punct:
    -        """Is the token a left punctuation mark, e.g. "("?
    -
    -        RETURNS (bool): Whether the token is a left punctuation mark.
    -        """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_RIGHT_PUNCT)
    +        """RETURNS (bool): Whether the token is a left punctuation mark."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, IS_RIGHT_PUNCT)
     
         property like_url:
    -        """Does the token resemble a URL?
    -
    -        RETURNS (bool): Whether the token resembles a URL.
    -        """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, LIKE_URL)
    +        """RETURNS (bool): Whether the token resembles a URL."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, LIKE_URL)
     
         property like_num:
    -        """Does the token represent a number? e.g. "10.9", "10", "ten", etc.
    -
    -        RETURNS (bool): Whether the token resembles a number.
    +        """RETURNS (bool): Whether the token resembles a number, e.g. "10.9",
    +            "10", "ten", etc.
             """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, LIKE_NUM)
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, LIKE_NUM)
     
         property like_email:
    -        """Does the token resemble an email address?
    -
    -        RETURNS (bool): Whether the token resembles an email address.
    -        """
    -        def __get__(self): return Lexeme.c_check_flag(self.c.lex, LIKE_EMAIL)
    +        """RETURNS (bool): Whether the token resembles an email address."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c.lex, LIKE_EMAIL)
    diff --git a/website/api/doc.jade b/website/api/doc.jade
    index f2c73de9f..ac91ad427 100644
    --- a/website/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -784,3 +784,10 @@ p
             +cell
                 |  A dictionary that allows customisation of properties of
                 |  #[code Span] children.
    +
    +    +row
    +        +cell #[code _]
    +        +cell #[code Underscore]
    +        +cell
    +            |  User space for adding custom
    +            |  #[+a("/usage/processing-pipelines#custom-components-attributes") attribute extensions].
    diff --git a/website/api/span.jade b/website/api/span.jade
    index f00cb936f..266518076 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -369,7 +369,7 @@ p
         +tag property
         +tag-model("parse")
     
    -p Tokens that are to the left of the span, whose head is within the span.
    +p Tokens that are to the left of the span, whose heads are within the span.
     
     +aside-code("Example").
         doc = nlp(u'I like New York in Autumn.')
    @@ -386,7 +386,7 @@ p Tokens that are to the left of the span, whose head is within the span.
         +tag property
         +tag-model("parse")
     
    -p Tokens that are to the right of the span, whose head is within the span.
    +p Tokens that are to the right of the span, whose heads are within the span.
     
     +aside-code("Example").
         doc = nlp(u'I like New York in Autumn.')
    @@ -399,6 +399,42 @@ p Tokens that are to the right of the span, whose head is within the span.
             +cell #[code Token]
             +cell A right-child of a token of the span.
     
    ++h(2, "n_lefts") Span.n_lefts
    +    +tag property
    +    +tag-model("parse")
    +
    +p
    +    |  The number of tokens that are to the left of the span, whose heads are
    +    |  within the span.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn.')
    +    assert doc[3:7].n_lefts == 1
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell int
    +        +cell The number of left-child tokens.
    +
    ++h(2, "n_rights") Span.n_rights
    +    +tag property
    +    +tag-model("parse")
    +
    +p
    +    |  The number of tokens that are to the right of the span, whose heads are
    +    |  within the span.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn.')
    +    assert doc[2:4].n_rights == 1
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell int
    +        +cell The number of right-child tokens.
    +
     +h(2, "subtree") Span.subtree
         +tag property
         +tag-model("parse")
    @@ -553,3 +589,17 @@ p
             +cell #[code ent_id_]
             +cell unicode
             +cell The string ID of the named entity the token is an instance of.
    +
    +    +row
    +        +cell #[code sentiment]
    +        +cell float
    +        +cell
    +            |  A scalar value indicating the positivity or negativity of the
    +            |  span.
    +
    +    +row
    +        +cell #[code _]
    +        +cell #[code Underscore]
    +        +cell
    +            |  User space for adding custom
    +            |  #[+a("/usage/processing-pipelines#custom-components-attributes") attribute extensions].
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 3ce11d07a..e375e987d 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -302,6 +302,80 @@ p A sequence of the token's immediate syntactic children.
             +cell #[code Token]
             +cell A child token such that #[code child.head==self].
     
    ++h(2, "lefts") Token.lefts
    +    +tag property
    +    +tag-model("parse")
    +
    +p
    +    |  The leftward immediate children of the word, in the syntactic dependency
    +    |  parse.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn.')
    +    lefts = [t.text for t in doc[3].lefts]
    +    assert lefts == [u'New']
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell yields
    +        +cell #[code Token]
    +        +cell A left-child of the token.
    +
    ++h(2, "rights") Token.rights
    +    +tag property
    +    +tag-model("parse")
    +
    +p
    +    |  The rightward immediate children of the word, in the syntactic
    +    |  dependency parse.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn.')
    +    rights = [t.text for t in doc[3].rights]
    +    assert rights == [u'in']
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell yields
    +        +cell #[code Token]
    +        +cell A right-child of the token.
    +
    ++h(2, "n_lefts") Token.n_lefts
    +    +tag property
    +    +tag-model("parse")
    +
    +p
    +    |  The number of leftward immediate children of the word, in the syntactic
    +    |  dependency parse.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn.')
    +    assert doc[3].n_lefts == 1
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell int
    +        +cell The number of left-child tokens.
    +
    ++h(2, "n_rights") Token.n_rights
    +    +tag property
    +    +tag-model("parse")
    +
    +p
    +    |  The number of rightward immediate children of the word, in the syntactic
    +    |  dependency parse.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn.')
    +    assert doc[3].n_rights == 1
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell int
    +        +cell The number of right-child tokens.
    +
     +h(2, "subtree") Token.subtree
         +tag property
         +tag-model("parse")
    @@ -713,9 +787,30 @@ p The L2 norm of the token's vector representation.
         +row
             +cell #[code sentiment]
             +cell float
    -        +cell A scalar value indicating the positivity or negativity of the token.
    +        +cell
    +            |  A scalar value indicating the positivity or negativity of the
    +            |  token.
     
         +row
             +cell #[code lex_id]
             +cell int
    -        +cell ID of the token's lexical type.
    +        +cell Sequential ID of the token's lexical type.
    +
    +    +row
    +        +cell #[code rank]
    +        +cell int
    +        +cell
    +            |  Sequential ID of the token's lexical type, used to index into
    +            |  tagles, e.g. for word vectors.
    +
    +    +row
    +        +cell #[code cluster]
    +        +cell int
    +        +cell Brown cluster ID.
    +
    +    +row
    +        +cell #[code _]
    +        +cell #[code Underscore]
    +        +cell
    +            |  User space for adding custom
    +            |  #[+a("/usage/processing-pipelines#custom-components-attributes") attribute extensions].
    diff --git a/website/usage/_linguistic-features/_dependency-parse.jade b/website/usage/_linguistic-features/_dependency-parse.jade
    index 85d9179df..0fcdd4713 100644
    --- a/website/usage/_linguistic-features/_dependency-parse.jade
    +++ b/website/usage/_linguistic-features/_dependency-parse.jade
    @@ -111,11 +111,13 @@ p
     
     p
         |  A few more convenience attributes are provided for iterating around the
    -    |  local tree from the token. The #[code .lefts] and #[code .rights]
    -    |  attributes provide sequences of syntactic children that occur before and
    -    |  after the token. Both sequences are in sentences order. There are also
    -    |  two integer-typed attributes, #[code .n_rights] and #[code .n_lefts],
    -    |  that give the number of left and right children.
    +    |  local tree from the token. The #[+api("token#lefts") #[code Token.lefts]]
    +    |  and #[+api("token#rights") #[code Token.rights]] attributes provide
    +    |  sequences of syntactic children that occur before and after the token.
    +    |  Both sequences are in sentence order. There are also two integer-typed
    +    |  attributes, #[+api("token#n_rights") #[code Token.n_rights]] and
    +    |  #[+api("token#n_lefts") #[code Token.n_lefts]], that give the number of
    +    |  left and right children.
     
     +code.
         doc = nlp(u'bright red apples on the tree')
    @@ -126,10 +128,11 @@ p
     
     p
         |  You can get a whole phrase by its syntactic head using the
    -    |  #[code .subtree] attribute. This returns an ordered sequence of tokens.
    -    |  You can walk up the tree with the #[code .ancestors] attribute, and
    -    |  check dominance with the #[+api("token#is_ancestor") #[code .is_ancestor()]]
    -    |  method.
    +    |  #[+api("token#subtree") #[code Token.subtree]] attribute. This returns an
    +    |  ordered  sequence of tokens. You can walk up the tree with the
    +    |  #[+api("token#ancestors") #[code Token.ancestors]] attribute, and
    +    |  check dominance with
    +    |  #[+api("token#is_ancestor") #[code Token.is_ancestor()]].
     
     +aside("Projective vs. non-projective")
         |  For the #[+a("/models/en") default English model], the
    
    From d2df81d907caad92e3c393c68e696b02cf76d4d8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 18:09:28 +0200
    Subject: [PATCH 583/649] Fix not implemented Span getters
    
    ---
     spacy/tokens/span.pyx | 6 ++++--
     1 file changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 6f760bfbc..2ef1d1b82 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -475,14 +475,16 @@ cdef class Span:
                 span, in the syntactic dependency parse.
             """
             # TODO: implement
    -        raise NotImplementedError()
    +        def __get__(self):
    +            raise NotImplementedError()
     
         property n_rights:
             """RETURNS (int): The number of rightward immediate children of the
                 span, in the syntactic dependency parse.
             """
             # TODO: implement
    -        raise NotImplementedError()
    +        def __get__(self):
    +            raise NotImplementedError()
     
         property subtree:
             """Tokens that descend from tokens in the span, but fall outside it.
    
    From 9c89e2cdefb46dcf1979ccb2876dca61e313dec3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 18:09:53 +0200
    Subject: [PATCH 584/649] Remove unused syntax iterators (now in language data)
    
    ---
     spacy/syntax/iterators.pxd |   0
     spacy/syntax/iterators.pyx | 144 -------------------------------------
     2 files changed, 144 deletions(-)
     delete mode 100644 spacy/syntax/iterators.pxd
     delete mode 100644 spacy/syntax/iterators.pyx
    
    diff --git a/spacy/syntax/iterators.pxd b/spacy/syntax/iterators.pxd
    deleted file mode 100644
    index e69de29bb..000000000
    diff --git a/spacy/syntax/iterators.pyx b/spacy/syntax/iterators.pyx
    deleted file mode 100644
    index 557616d18..000000000
    --- a/spacy/syntax/iterators.pyx
    +++ /dev/null
    @@ -1,144 +0,0 @@
    -# coding: utf-8
    -from __future__ import unicode_literals
    -
    -from ..parts_of_speech cimport NOUN, PROPN, PRON, VERB, AUX
    -
    -
    -def english_noun_chunks(obj):
    -    """
    -    Detect base noun phrases from a dependency parse.
    -    Works on both Doc and Span.
    -    """
    -    labels = ['nsubj', 'dobj', 'nsubjpass', 'pcomp', 'pobj',
    -              'attr', 'ROOT']
    -    doc = obj.doc # Ensure works on both Doc and Span.
    -    np_deps = [doc.vocab.strings.add(label) for label in labels]
    -    conj = doc.vocab.strings.add('conj')
    -    np_label = doc.vocab.strings.add('NP')
    -    seen = set()
    -    for i, word in enumerate(obj):
    -        if word.pos not in (NOUN, PROPN, PRON):
    -            continue
    -        # Prevent nested chunks from being produced
    -        if word.i in seen:
    -            continue
    -        if word.dep in np_deps:
    -            if any(w.i in seen for w in word.subtree):
    -                continue
    -            seen.update(j for j in range(word.left_edge.i, word.i+1))
    -            yield word.left_edge.i, word.i+1, np_label
    -        elif word.dep == conj:
    -            head = word.head
    -            while head.dep == conj and head.head.i < head.i:
    -                head = head.head
    -            # If the head is an NP, and we're coordinated to it, we're an NP
    -            if head.dep in np_deps:
    -                if any(w.i in seen for w in word.subtree):
    -                    continue
    -                seen.update(j for j in range(word.left_edge.i, word.i+1))
    -                yield word.left_edge.i, word.i+1, np_label
    -
    -
    -# this iterator extracts spans headed by NOUNs starting from the left-most
    -# syntactic dependent until the NOUN itself
    -# for close apposition and measurement construction, the span is sometimes
    -# extended to the right of the NOUN
    -# example: "eine Tasse Tee" (a cup (of) tea) returns "eine Tasse Tee" and not
    -# just "eine Tasse", same for "das Thema Familie"
    -def german_noun_chunks(obj):
    -    labels = ['sb', 'oa', 'da', 'nk', 'mo', 'ag', 'ROOT', 'root', 'cj', 'pd', 'og', 'app']
    -    doc = obj.doc # Ensure works on both Doc and Span.
    -    np_label = doc.vocab.strings.add('NP')
    -    np_deps = set(doc.vocab.strings.add(label) for label in labels)
    -    close_app = doc.vocab.strings.add('nk')
    -
    -    rbracket = 0
    -    for i, word in enumerate(obj):
    -        if i < rbracket:
    -            continue
    -        if word.pos in (NOUN, PROPN, PRON) and word.dep in np_deps:
    -            rbracket = word.i+1
    -            # try to extend the span to the right
    -            # to capture close apposition/measurement constructions
    -            for rdep in doc[word.i].rights:
    -                if rdep.pos in (NOUN, PROPN) and rdep.dep == close_app:
    -                    rbracket = rdep.i+1
    -            yield word.left_edge.i, rbracket, np_label
    -
    -
    -def es_noun_chunks(obj):
    -    doc = obj.doc
    -    np_label = doc.vocab.strings['NP']
    -    left_labels = ['det', 'fixed', 'neg'] #['nunmod', 'det', 'appos', 'fixed']
    -    right_labels = ['flat', 'fixed', 'compound', 'neg']
    -    stop_labels = ['punct']
    -    np_left_deps = [doc.vocab.strings[label] for label in left_labels]
    -    np_right_deps = [doc.vocab.strings[label] for label in right_labels]
    -    stop_deps = [doc.vocab.strings[label] for label in stop_labels]
    -
    -    def next_token(token):
    -        try:
    -            return token.nbor()
    -        except:
    -            return None
    -
    -    def noun_bounds(root):
    -        def is_verb_token(token):
    -            return token.pos in [VERB, AUX]
    -
    -        left_bound = root
    -        for token in reversed(list(root.lefts)):
    -            if token.dep in np_left_deps:
    -                left_bound = token
    -        right_bound = root
    -        for token in root.rights:
    -            if (token.dep in np_right_deps):
    -                left, right = noun_bounds(token)
    -                if list(filter(lambda t: is_verb_token(t) or t.dep in stop_deps,
    -                               doc[left_bound.i: right.i])):
    -                    break
    -                else:
    -                    right_bound = right
    -        return left_bound, right_bound
    -
    -    token = doc[0]
    -    while token and token.i < len(doc):
    -        if token.pos in [PROPN, NOUN, PRON]:
    -            left, right = noun_bounds(token)
    -            yield left.i, right.i+1, np_label
    -            token = right
    -        token = next_token(token)
    -
    -
    -def french_noun_chunks(obj):
    -    labels = ['nsubj', 'nsubj:pass', 'obj', 'iobj', 'ROOT', 'appos', 'nmod', 'nmod:poss']
    -    doc = obj.doc  # Ensure works on both Doc and Span.
    -    np_deps = [doc.vocab.strings[label] for label in labels]
    -    conj = doc.vocab.strings.add('conj')
    -    np_label = doc.vocab.strings.add('NP')
    -    seen = set()
    -    for i, word in enumerate(obj):
    -        if word.pos not in (NOUN, PROPN, PRON):
    -            continue
    -        # Prevent nested chunks from being produced
    -        if word.i in seen:
    -            continue
    -        if word.dep in np_deps:
    -            if any(w.i in seen for w in word.subtree):
    -                continue
    -            seen.update(j for j in range(word.left_edge.i, word.right_edge.i+1))
    -            yield word.left_edge.i, word.right_edge.i+1, np_label
    -        elif word.dep == conj:
    -            head = word.head
    -            while head.dep == conj and head.head.i < head.i:
    -                head = head.head
    -            # If the head is an NP, and we're coordinated to it, we're an NP
    -            if head.dep in np_deps:
    -                if any(w.i in seen for w in word.subtree):
    -                    continue
    -                seen.update(j for j in range(word.left_edge.i, word.right_edge.i+1))
    -                yield word.left_edge.i, word.right_edge.i+1, np_label
    -
    -
    -CHUNKERS = {'en': english_noun_chunks, 'de': german_noun_chunks,
    -            'es': es_noun_chunks, 'fr': french_noun_chunks}
    
    From 5025d709e08a7755e20b9a13b8b22f83c37b9273 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 19:44:38 +0200
    Subject: [PATCH 585/649] Remove old, outdated files in /bin
    
    ---
     bin/get_freqs.py                  |  93 --------------
     bin/munge_ewtb.py                 |  89 -------------
     bin/ner_tag.py                    |  32 -----
     bin/parser/conll_train.py         | 157 -----------------------
     bin/parser/train.py               | 187 ---------------------------
     bin/parser/train_ud.py            | 201 ------------------------------
     bin/prepare_treebank.py           | 194 ----------------------------
     bin/prepare_vecs.py               |  13 --
     bin/tagger/train.py               | 175 --------------------------
     bin/tagger/train_german_tagger.py | 160 ------------------------
     10 files changed, 1301 deletions(-)
     delete mode 100755 bin/get_freqs.py
     delete mode 100755 bin/munge_ewtb.py
     delete mode 100644 bin/ner_tag.py
     delete mode 100755 bin/parser/conll_train.py
     delete mode 100755 bin/parser/train.py
     delete mode 100644 bin/parser/train_ud.py
     delete mode 100644 bin/prepare_treebank.py
     delete mode 100644 bin/prepare_vecs.py
     delete mode 100755 bin/tagger/train.py
     delete mode 100644 bin/tagger/train_german_tagger.py
    
    diff --git a/bin/get_freqs.py b/bin/get_freqs.py
    deleted file mode 100755
    index 54d90ef8c..000000000
    --- a/bin/get_freqs.py
    +++ /dev/null
    @@ -1,93 +0,0 @@
    -#!/usr/bin/env python
    -
    -from __future__ import unicode_literals, print_function
    -
    -import plac
    -import joblib
    -from os import path
    -import os
    -import bz2
    -import ujson
    -from preshed.counter import PreshCounter
    -from joblib import Parallel, delayed
    -import io
    -
    -from spacy.en import English
    -from spacy.strings import StringStore
    -from spacy.attrs import ORTH
    -from spacy.tokenizer import Tokenizer
    -from spacy.vocab import Vocab
    -
    -
    -def iter_comments(loc):
    -    with bz2.BZ2File(loc) as file_:
    -        for line in file_:
    -            yield ujson.loads(line)
    -
    -
    -def count_freqs(input_loc, output_loc):
    -    print(output_loc)
    -    vocab = English.default_vocab(get_lex_attr=None)
    -    tokenizer = Tokenizer.from_dir(vocab,
    -                    path.join(English.default_data_dir(), 'tokenizer'))
    -
    -    counts = PreshCounter()
    -    for json_comment in iter_comments(input_loc):
    -        doc = tokenizer(json_comment['body'])
    -        doc.count_by(ORTH, counts=counts)
    -
    -    with io.open(output_loc, 'w', 'utf8') as file_:
    -        for orth, freq in counts:
    -            string = tokenizer.vocab.strings[orth]
    -            if not string.isspace():
    -                file_.write('%d\t%s\n' % (freq, string))
    -
    -
    -def parallelize(func, iterator, n_jobs):
    -    Parallel(n_jobs=n_jobs)(delayed(func)(*item) for item in iterator)
    -
    -
    -def merge_counts(locs, out_loc):
    -    string_map = StringStore()
    -    counts = PreshCounter()
    -    for loc in locs:
    -        with io.open(loc, 'r', encoding='utf8') as file_:
    -            for line in file_:
    -                freq, word = line.strip().split('\t', 1)
    -                orth = string_map[word]
    -                counts.inc(orth, int(freq))
    -    with io.open(out_loc, 'w', encoding='utf8') as file_:
    -        for orth, count in counts:
    -            string = string_map[orth]
    -            file_.write('%d\t%s\n' % (count, string))
    -
    -
    -@plac.annotations(
    -    input_loc=("Location of input file list"),
    -    freqs_dir=("Directory for frequency files"),
    -    output_loc=("Location for output file"),
    -    n_jobs=("Number of workers", "option", "n", int),
    -    skip_existing=("Skip inputs where an output file exists", "flag", "s", bool),
    -)
    -def main(input_loc, freqs_dir, output_loc, n_jobs=2, skip_existing=False):
    -    tasks = []
    -    outputs = []
    -    for input_path in open(input_loc):
    -        input_path = input_path.strip()
    -        if not input_path:
    -            continue
    -        filename = input_path.split('/')[-1]
    -        output_path = path.join(freqs_dir, filename.replace('bz2', 'freq'))
    -        outputs.append(output_path)
    -        if not path.exists(output_path) or not skip_existing:
    -            tasks.append((input_path, output_path))
    -
    -    if tasks:
    -        parallelize(count_freqs, tasks, n_jobs)
    -
    -    print("Merge")
    -    merge_counts(outputs, output_loc)
    -                
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/bin/munge_ewtb.py b/bin/munge_ewtb.py
    deleted file mode 100755
    index 4e21ceb07..000000000
    --- a/bin/munge_ewtb.py
    +++ /dev/null
    @@ -1,89 +0,0 @@
    -#!/usr/bin/env python
    -from __future__ import unicode_literals
    -
    -from xml.etree import cElementTree as ElementTree
    -import json
    -import re
    -
    -import plac
    -from pathlib import Path
    -from os import path
    -
    -
    -escaped_tokens = {
    -    '-LRB-': '(',
    -    '-RRB-': ')',
    -    '-LSB-': '[',
    -    '-RSB-': ']',
    -    '-LCB-': '{',
    -    '-RCB-': '}',
    -}
    -
    -def read_parses(parse_loc):
    -    offset = 0
    -    doc = []
    -    for parse in open(str(parse_loc) + '.dep').read().strip().split('\n\n'):
    -        parse = _adjust_token_ids(parse, offset)
    -        offset += len(parse.split('\n'))
    -        doc.append(parse)
    -    return doc
    -
    -def _adjust_token_ids(parse, offset):
    -    output = []
    -    for line in parse.split('\n'):
    -        pieces = line.split()
    -        pieces[0] = str(int(pieces[0]) + offset)
    -        pieces[5] = str(int(pieces[5]) + offset) if pieces[5] != '0' else '0'
    -        output.append('\t'.join(pieces))
    -    return '\n'.join(output)
    -
    -
    -def _fmt_doc(filename, paras):
    -    return {'id': filename, 'paragraphs': [_fmt_para(*para) for para in paras]}
    -
    -
    -def _fmt_para(raw, sents):
    -    return {'raw': raw, 'sentences': [_fmt_sent(sent) for sent in sents]}
    -
    -
    -def _fmt_sent(sent):
    -    return {
    -        'tokens': [_fmt_token(*t.split()) for t in sent.strip().split('\n')],
    -        'brackets': []}
    -
    -
    -def _fmt_token(id_, word, hyph, pos, ner, head, dep, blank1, blank2, blank3):
    -    head = int(head) - 1
    -    id_ = int(id_) - 1
    -    head = (head - id_) if head != -1 else 0
    -    return {'id': id_, 'orth': word, 'tag': pos, 'dep': dep, 'head': head}
    -
    -
    -tags_re = re.compile(r'<[\w\?/][^>]+>')
    -def main(out_dir, ewtb_dir='/usr/local/data/eng_web_tbk'):
    -    ewtb_dir = Path(ewtb_dir)
    -    out_dir = Path(out_dir)
    -    if not out_dir.exists():
    -        out_dir.mkdir()
    -    for genre_dir in ewtb_dir.joinpath('data').iterdir():
    -        #if 'answers' in str(genre_dir): continue
    -        parse_dir = genre_dir.joinpath('penntree')
    -        docs = []
    -        for source_loc in genre_dir.joinpath('source').joinpath('source_original').iterdir():
    -            filename = source_loc.parts[-1].replace('.sgm.sgm', '')
    -            filename = filename.replace('.xml', '')
    -            filename = filename.replace('.txt', '')
    -            parse_loc = parse_dir.joinpath(filename + '.xml.tree')
    -            parses = read_parses(parse_loc)
    -            source = source_loc.open().read().strip()
    -            if 'answers' in str(genre_dir):
    -                source = tags_re.sub('', source).strip()
    -            docs.append(_fmt_doc(filename, [[source, parses]]))
    -
    -        out_loc = out_dir.joinpath(genre_dir.parts[-1] + '.json')
    -        with open(str(out_loc), 'w') as out_file:
    -            out_file.write(json.dumps(docs, indent=4))
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/bin/ner_tag.py b/bin/ner_tag.py
    deleted file mode 100644
    index f990f21a1..000000000
    --- a/bin/ner_tag.py
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -import io
    -import plac
    -
    -from spacy.en import English
    -
    -
    -def main(text_loc):
    -    with io.open(text_loc, 'r', encoding='utf8') as file_:
    -        text = file_.read()
    -    NLU = English()
    -    for paragraph in text.split('\n\n'):
    -        tokens = NLU(paragraph)
    -
    -        ent_starts = {}
    -        ent_ends = {}
    -        for span in tokens.ents:
    -            ent_starts[span.start] = span.label_
    -            ent_ends[span.end] = span.label_
    -
    -        output = []
    -        for token in tokens:
    -            if token.i in ent_starts:
    -                output.append('<%s>' % ent_starts[token.i])
    -            output.append(token.orth_)
    -            if (token.i+1) in ent_ends:
    -                output.append('' % ent_ends[token.i+1])
    -        output.append('\n\n')
    -    print ' '.join(output)
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/bin/parser/conll_train.py b/bin/parser/conll_train.py
    deleted file mode 100755
    index 8075dcd8a..000000000
    --- a/bin/parser/conll_train.py
    +++ /dev/null
    @@ -1,157 +0,0 @@
    -#!/usr/bin/env python
    -from __future__ import division
    -from __future__ import unicode_literals
    -
    -import os
    -from os import path
    -import shutil
    -import io
    -import random
    -import time
    -import gzip
    -
    -import plac
    -import cProfile
    -import pstats
    -
    -import spacy.util
    -from spacy.en import English
    -from spacy.gold import GoldParse
    -
    -from spacy.syntax.util import Config
    -from spacy.syntax.arc_eager import ArcEager
    -from spacy.syntax.parser import Parser
    -from spacy.scorer import Scorer
    -from spacy.tagger import Tagger
    -
    -# Last updated for spaCy v0.97
    -
    -
    -def read_conll(file_):
    -    """Read a standard CoNLL/MALT-style format"""
    -    sents = []
    -    for sent_str in file_.read().strip().split('\n\n'):
    -        ids = []
    -        words = []
    -        heads = []
    -        labels = []
    -        tags = []
    -        for i, line in enumerate(sent_str.split('\n')):
    -            word, pos_string, head_idx, label = _parse_line(line)
    -            words.append(word)
    -            if head_idx < 0:
    -                head_idx = i
    -            ids.append(i)
    -            heads.append(head_idx)
    -            labels.append(label)
    -            tags.append(pos_string)
    -        text = ' '.join(words)
    -        annot = (ids, words, tags, heads, labels, ['O'] * len(ids))
    -        sents.append((None, [(annot, [])]))
    -    return sents
    -
    -
    -def _parse_line(line):
    -    pieces = line.split()
    -    if len(pieces) == 4:
    -        word, pos, head_idx, label = pieces
    -        head_idx = int(head_idx)
    -    elif len(pieces) == 15:
    -        id_ = int(pieces[0].split('_')[-1])
    -        word = pieces[1]
    -        pos = pieces[4]
    -        head_idx = int(pieces[8])-1
    -        label = pieces[10]
    -    else:
    -        id_ = int(pieces[0].split('_')[-1])
    -        word = pieces[1]
    -        pos = pieces[4]
    -        head_idx = int(pieces[6])-1
    -        label = pieces[7]
    -    if head_idx == 0:
    -        label = 'ROOT'
    -    return word, pos, head_idx, label
    -
    -        
    -def score_model(scorer, nlp, raw_text, annot_tuples, verbose=False):
    -    tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
    -    nlp.tagger(tokens)
    -    nlp.parser(tokens)
    -    gold = GoldParse(tokens, annot_tuples, make_projective=False)
    -    scorer.score(tokens, gold, verbose=verbose, punct_labels=('--', 'p', 'punct'))
    -
    -
    -def train(Language, gold_tuples, model_dir, n_iter=15, feat_set=u'basic', seed=0,
    -          gold_preproc=False, force_gold=False):
    -    dep_model_dir = path.join(model_dir, 'deps')
    -    pos_model_dir = path.join(model_dir, 'pos')
    -    if path.exists(dep_model_dir):
    -        shutil.rmtree(dep_model_dir)
    -    if path.exists(pos_model_dir):
    -        shutil.rmtree(pos_model_dir)
    -    os.mkdir(dep_model_dir)
    -    os.mkdir(pos_model_dir)
    -
    -    Config.write(dep_model_dir, 'config', features=feat_set, seed=seed,
    -                 labels=ArcEager.get_labels(gold_tuples))
    -
    -    nlp = Language(data_dir=model_dir, tagger=False, parser=False, entity=False)
    -    nlp.tagger = Tagger.blank(nlp.vocab, Tagger.default_templates())
    -    nlp.parser = Parser.from_dir(dep_model_dir, nlp.vocab.strings, ArcEager)
    - 
    -    print("Itn.\tP.Loss\tUAS\tNER F.\tTag %\tToken %")
    -    for itn in range(n_iter):
    -        scorer = Scorer()
    -        loss = 0
    -        for _, sents in gold_tuples:
    -            for annot_tuples, _ in sents:
    -                if len(annot_tuples[1]) == 1:
    -                    continue
    -
    -                score_model(scorer, nlp, None, annot_tuples, verbose=False)
    -
    -                tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
    -                nlp.tagger(tokens)
    -                gold = GoldParse(tokens, annot_tuples, make_projective=True)
    -                if not gold.is_projective:
    -                    raise Exception(
    -                        "Non-projective sentence in training, after we should "
    -                        "have enforced projectivity: %s" % annot_tuples
    -                    )
    - 
    -                loss += nlp.parser.train(tokens, gold)
    -                nlp.tagger.train(tokens, gold.tags)
    -        random.shuffle(gold_tuples)
    -        print('%d:\t%d\t%.3f\t%.3f\t%.3f' % (itn, loss, scorer.uas,
    -                                             scorer.tags_acc, scorer.token_acc))
    -    print('end training')
    -    nlp.end_training(model_dir)
    -    print('done')
    -
    -
    -@plac.annotations(
    -    train_loc=("Location of CoNLL 09 formatted training file"),
    -    dev_loc=("Location of CoNLL 09 formatted development file"),
    -    model_dir=("Location of output model directory"),
    -    eval_only=("Skip training, and only evaluate", "flag", "e", bool),
    -    n_iter=("Number of training iterations", "option", "i", int),
    -)
    -def main(train_loc, dev_loc, model_dir, n_iter=15):
    -    with io.open(train_loc, 'r', encoding='utf8') as file_:
    -        train_sents = read_conll(file_)
    -    if not eval_only:
    -        train(English, train_sents, model_dir, n_iter=n_iter)
    -    nlp = English(data_dir=model_dir)
    -    dev_sents = read_conll(io.open(dev_loc, 'r', encoding='utf8'))
    -    scorer = Scorer()
    -    for _, sents in dev_sents:
    -        for annot_tuples, _ in sents:
    -            score_model(scorer, nlp, None, annot_tuples)
    -    print('TOK', 100-scorer.token_acc)
    -    print('POS', scorer.tags_acc)
    -    print('UAS', scorer.uas)
    -    print('LAS', scorer.las)
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/bin/parser/train.py b/bin/parser/train.py
    deleted file mode 100755
    index 26b545b6d..000000000
    --- a/bin/parser/train.py
    +++ /dev/null
    @@ -1,187 +0,0 @@
    -#!/usr/bin/env python
    -from __future__ import division
    -from __future__ import unicode_literals
    -from __future__ import print_function
    -
    -import os
    -from os import path
    -import shutil
    -import io
    -import random
    -
    -import plac
    -import re
    -
    -import spacy.util
    -
    -from spacy.syntax.util import Config
    -from spacy.gold import read_json_file
    -from spacy.gold import GoldParse
    -from spacy.gold import merge_sents
    -
    -from spacy.scorer import Scorer
    -
    -from spacy.syntax.arc_eager import ArcEager
    -from spacy.syntax.ner import BiluoPushDown
    -from spacy.tagger import Tagger
    -from spacy.syntax.parser import Parser
    -from spacy.syntax.nonproj import PseudoProjectivity
    -
    -
    -def _corrupt(c, noise_level):
    -    if random.random() >= noise_level:
    -        return c
    -    elif c == ' ':
    -        return '\n'
    -    elif c == '\n':
    -        return ' '
    -    elif c in ['.', "'", "!", "?"]:
    -        return ''
    -    else:
    -        return c.lower()
    -
    -
    -def add_noise(orig, noise_level):
    -    if random.random() >= noise_level:
    -        return orig
    -    elif type(orig) == list:
    -        corrupted = [_corrupt(word, noise_level) for word in orig]
    -        corrupted = [w for w in corrupted if w]
    -        return corrupted
    -    else:
    -        return ''.join(_corrupt(c, noise_level) for c in orig)
    -
    -
    -def score_model(scorer, nlp, raw_text, annot_tuples, verbose=False):
    -    if raw_text is None:
    -        tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
    -    else:
    -        tokens = nlp.tokenizer(raw_text)
    -    nlp.tagger(tokens)
    -    nlp.entity(tokens)
    -    nlp.parser(tokens)
    -    gold = GoldParse(tokens, annot_tuples)
    -    scorer.score(tokens, gold, verbose=verbose)
    -
    -
    -def train(Language, train_data, dev_data, model_dir, tagger_cfg, parser_cfg, entity_cfg,
    -        n_iter=15, seed=0, gold_preproc=False, n_sents=0, corruption_level=0):
    -    print("Itn.\tN weight\tN feats\tUAS\tNER F.\tTag %\tToken %")
    -    format_str = '{:d}\t{:d}\t{:d}\t{uas:.3f}\t{ents_f:.3f}\t{tags_acc:.3f}\t{token_acc:.3f}'
    -    with Language.train(model_dir, train_data,
    -            tagger_cfg, parser_cfg, entity_cfg) as trainer:
    -        loss = 0
    -        for itn, epoch in enumerate(trainer.epochs(n_iter, gold_preproc=gold_preproc,
    -                                                   augment_data=None)):
    -            for doc, gold in epoch:
    -                trainer.update(doc, gold)
    -            dev_scores = trainer.evaluate(dev_data, gold_preproc=gold_preproc)
    -            print(format_str.format(itn, trainer.nlp.parser.model.nr_weight,
    -                trainer.nlp.parser.model.nr_active_feat, **dev_scores.scores))
    -
    -
    -def evaluate(Language, gold_tuples, model_dir, gold_preproc=False, verbose=False,
    -             beam_width=None, cand_preproc=None):
    -    print("Load parser", model_dir)
    -    nlp = Language(path=model_dir)
    -    if nlp.lang == 'de':
    -        nlp.vocab.morphology.lemmatizer = lambda string,pos: set([string])
    -    if beam_width is not None:
    -        nlp.parser.cfg.beam_width = beam_width
    -    scorer = Scorer()
    -    for raw_text, sents in gold_tuples:
    -        if gold_preproc:
    -            raw_text = None
    -        else:
    -            sents = merge_sents(sents)
    -        for annot_tuples, brackets in sents:
    -            if raw_text is None:
    -                tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
    -                nlp.tagger(tokens)
    -                nlp.parser(tokens)
    -                nlp.entity(tokens)
    -            else:
    -                tokens = nlp(raw_text)
    -            gold = GoldParse.from_annot_tuples(tokens, annot_tuples)
    -            scorer.score(tokens, gold, verbose=verbose)
    -    return scorer
    -
    -
    -def write_parses(Language, dev_loc, model_dir, out_loc):
    -    nlp = Language(data_dir=model_dir)
    -    gold_tuples = read_json_file(dev_loc)
    -    scorer = Scorer()
    -    out_file = io.open(out_loc, 'w', 'utf8')
    -    for raw_text, sents in gold_tuples:
    -        sents = _merge_sents(sents)
    -        for annot_tuples, brackets in sents:
    -            if raw_text is None:
    -                tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
    -                nlp.tagger(tokens)
    -                nlp.entity(tokens)
    -                nlp.parser(tokens)
    -            else:
    -                tokens = nlp(raw_text)
    -            #gold = GoldParse(tokens, annot_tuples)
    -            #scorer.score(tokens, gold, verbose=False)
    -            for sent in tokens.sents:
    -                for t in sent:
    -                    if not t.is_space:
    -                        out_file.write(
    -                            '%d\t%s\t%s\t%s\t%s\n' % (t.i, t.orth_, t.tag_, t.head.orth_, t.dep_)
    -                        )
    -                out_file.write('\n')
    -
    -
    -@plac.annotations(
    -    language=("The language to train", "positional", None, str, ['en','de', 'zh']),
    -    train_loc=("Location of training file or directory"),
    -    dev_loc=("Location of development file or directory"),
    -    model_dir=("Location of output model directory",),
    -    eval_only=("Skip training, and only evaluate", "flag", "e", bool),
    -    corruption_level=("Amount of noise to add to training data", "option", "c", float),
    -    gold_preproc=("Use gold-standard sentence boundaries in training?", "flag", "g", bool),
    -    out_loc=("Out location", "option", "o", str),
    -    n_sents=("Number of training sentences", "option", "n", int),
    -    n_iter=("Number of training iterations", "option", "i", int),
    -    verbose=("Verbose error reporting", "flag", "v", bool),
    -    debug=("Debug mode", "flag", "d", bool),
    -    pseudoprojective=("Use pseudo-projective parsing", "flag", "p", bool),
    -    L1=("L1 regularization penalty", "option", "L", float),
    -)
    -def main(language, train_loc, dev_loc, model_dir, n_sents=0, n_iter=15, out_loc="", verbose=False,
    -         debug=False, corruption_level=0.0, gold_preproc=False, eval_only=False, pseudoprojective=False,
    -         L1=1e-6):
    -    parser_cfg = dict(locals())
    -    tagger_cfg = dict(locals())
    -    entity_cfg = dict(locals())
    -
    -    lang = spacy.util.get_lang_class(language)
    -
    -    parser_cfg['features'] = lang.Defaults.parser_features
    -    entity_cfg['features'] = lang.Defaults.entity_features
    -
    -    if not eval_only:
    -        gold_train = list(read_json_file(train_loc))
    -        gold_dev = list(read_json_file(dev_loc))
    -        if n_sents > 0:
    -            gold_train = gold_train[:n_sents]
    -        train(lang, gold_train, gold_dev, model_dir, tagger_cfg, parser_cfg, entity_cfg,
    -              n_sents=n_sents, gold_preproc=gold_preproc, corruption_level=corruption_level,
    -              n_iter=n_iter)
    -    if out_loc:
    -        write_parses(lang, dev_loc, model_dir, out_loc)
    -    scorer = evaluate(lang, list(read_json_file(dev_loc)),
    -                      model_dir, gold_preproc=gold_preproc, verbose=verbose)
    -    print('TOK', scorer.token_acc)
    -    print('POS', scorer.tags_acc)
    -    print('UAS', scorer.uas)
    -    print('LAS', scorer.las)
    -
    -    print('NER P', scorer.ents_p)
    -    print('NER R', scorer.ents_r)
    -    print('NER F', scorer.ents_f)
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/bin/parser/train_ud.py b/bin/parser/train_ud.py
    deleted file mode 100644
    index 53ef906d5..000000000
    --- a/bin/parser/train_ud.py
    +++ /dev/null
    @@ -1,201 +0,0 @@
    -from __future__ import unicode_literals, print_function
    -import plac
    -import json
    -import random
    -import pathlib
    -
    -from spacy.tokens import Doc
    -from spacy.syntax.nonproj import PseudoProjectivity
    -from spacy.language import Language
    -from spacy.gold import GoldParse
    -from spacy.tagger import Tagger
    -from spacy.pipeline import DependencyParser, TokenVectorEncoder
    -from spacy.syntax.parser import get_templates
    -from spacy.syntax.arc_eager import ArcEager
    -from spacy.scorer import Scorer
    -from spacy.language_data.tag_map import TAG_MAP as DEFAULT_TAG_MAP
    -import spacy.attrs
    -import io
    -from thinc.neural.ops import CupyOps
    -from thinc.neural import Model
    -from spacy.es import Spanish
    -from spacy.attrs import POS
    -
    -
    -from thinc.neural import Model
    -
    -
    -try:
    -    import cupy
    -    from thinc.neural.ops import CupyOps
    -except:
    -    cupy = None
    -
    -
    -def read_conllx(loc, n=0):
    -    with io.open(loc, 'r', encoding='utf8') as file_:
    -        text = file_.read()
    -    i = 0
    -    for sent in text.strip().split('\n\n'):
    -        lines = sent.strip().split('\n')
    -        if lines:
    -            while lines[0].startswith('#'):
    -                lines.pop(0)
    -            tokens = []
    -            for line in lines:
    -                id_, word, lemma, pos, tag, morph, head, dep, _1, \
    -                _2 = line.split('\t')
    -                if '-' in id_ or '.' in id_:
    -                    continue
    -                try:
    -                    id_ = int(id_) - 1
    -                    head = (int(head) - 1) if head != '0' else id_
    -                    dep = 'ROOT' if dep == 'root' else dep #'unlabelled'
    -                    tag = pos+'__'+dep+'__'+morph
    -                    Spanish.Defaults.tag_map[tag] = {POS: pos}
    -                    tokens.append((id_, word, tag, head, dep, 'O'))
    -                except:
    -                    raise
    -            tuples = [list(t) for t in zip(*tokens)]
    -            yield (None, [[tuples, []]])
    -            i += 1
    -            if n >= 1 and i >= n:
    -                break
    -
    -
    -def score_model(vocab, encoder, parser, Xs, ys, verbose=False):
    -    scorer = Scorer()
    -    correct = 0.
    -    total = 0.
    -    for doc, gold in zip(Xs, ys):
    -        doc = Doc(vocab, words=[w.text for w in doc])
    -        encoder(doc)
    -        parser(doc)
    -        PseudoProjectivity.deprojectivize(doc)
    -        scorer.score(doc, gold, verbose=verbose)
    -        for token, tag in zip(doc, gold.tags):
    -            if '_' in token.tag_:
    -                univ_guess, _ = token.tag_.split('_', 1)
    -            else:
    -                univ_guess = ''
    -            univ_truth, _ = tag.split('_', 1)
    -            correct += univ_guess == univ_truth
    -            total += 1
    -    return scorer
    -
    -
    -def organize_data(vocab, train_sents):
    -    Xs = []
    -    ys = []
    -    for _, doc_sents in train_sents:
    -        for (ids, words, tags, heads, deps, ner), _ in doc_sents:
    -            doc = Doc(vocab, words=words)
    -            gold = GoldParse(doc, tags=tags, heads=heads, deps=deps)
    -            Xs.append(doc)
    -            ys.append(gold)
    -    return Xs, ys
    -
    -
    -def main(lang_name, train_loc, dev_loc, model_dir, clusters_loc=None):
    -    LangClass = spacy.util.get_lang_class(lang_name)
    -    train_sents = list(read_conllx(train_loc))
    -    dev_sents = list(read_conllx(dev_loc))
    -    train_sents = PseudoProjectivity.preprocess_training_data(train_sents)
    -
    -    actions = ArcEager.get_actions(gold_parses=train_sents)
    -    features = get_templates('basic')
    -
    -    model_dir = pathlib.Path(model_dir)
    -    if not model_dir.exists():
    -        model_dir.mkdir()
    -    if not (model_dir / 'deps').exists():
    -        (model_dir / 'deps').mkdir()
    -    if not (model_dir / 'pos').exists():
    -        (model_dir / 'pos').mkdir()
    -    with (model_dir / 'deps' / 'config.json').open('wb') as file_:
    -        file_.write(
    -            json.dumps(
    -                {'pseudoprojective': True, 'labels': actions, 'features': features}).encode('utf8'))
    -
    -    vocab = LangClass.Defaults.create_vocab()
    -    if not (model_dir / 'vocab').exists():
    -        (model_dir / 'vocab').mkdir()
    -    else:
    -        if (model_dir / 'vocab' / 'strings.json').exists():
    -            with (model_dir / 'vocab' / 'strings.json').open() as file_:
    -                vocab.strings.load(file_)
    -            if (model_dir / 'vocab' / 'lexemes.bin').exists():
    -                vocab.load_lexemes(model_dir / 'vocab' / 'lexemes.bin')
    -
    -    if clusters_loc is not None:
    -        clusters_loc = pathlib.Path(clusters_loc)
    -        with clusters_loc.open() as file_:
    -            for line in file_:
    -                try:
    -                    cluster, word, freq = line.split()
    -                except ValueError:
    -                    continue
    -                lex = vocab[word]
    -                lex.cluster = int(cluster[::-1], 2)
    -    # Populate vocab
    -    for _, doc_sents in train_sents:
    -        for (ids, words, tags, heads, deps, ner), _ in doc_sents:
    -            for word in words:
    -                _ = vocab[word]
    -            for dep in deps:
    -                _ = vocab[dep]
    -            for tag in tags:
    -                _ = vocab[tag]
    -            if vocab.morphology.tag_map:
    -                for tag in tags:
    -                    vocab.morphology.tag_map[tag] = {POS: tag.split('__', 1)[0]}
    -    tagger = Tagger(vocab)
    -    encoder = TokenVectorEncoder(vocab, width=64)
    -    parser = DependencyParser(vocab, actions=actions, features=features, L1=0.0)
    -
    -    Xs, ys = organize_data(vocab, train_sents)
    -    dev_Xs, dev_ys = organize_data(vocab, dev_sents)
    -    with encoder.model.begin_training(Xs[:100], ys[:100]) as (trainer, optimizer):
    -        docs = list(Xs)
    -        for doc in docs:
    -            encoder(doc)
    -        nn_loss = [0.]
    -        def track_progress():
    -            with encoder.tagger.use_params(optimizer.averages):
    -                with parser.model.use_params(optimizer.averages):
    -                    scorer = score_model(vocab, encoder, parser, dev_Xs, dev_ys)
    -            itn = len(nn_loss)
    -            print('%d:\t%.3f\t%.3f\t%.3f' % (itn, nn_loss[-1], scorer.uas, scorer.tags_acc))
    -            nn_loss.append(0.)
    -        track_progress()
    -        trainer.each_epoch.append(track_progress)
    -        trainer.batch_size = 24
    -        trainer.nb_epoch = 40
    -        for docs, golds in trainer.iterate(Xs, ys, progress_bar=True):
    -            docs = [Doc(vocab, words=[w.text for w in doc]) for doc in docs]
    -            tokvecs, upd_tokvecs = encoder.begin_update(docs)
    -            for doc, tokvec in zip(docs, tokvecs):
    -                doc.tensor = tokvec
    -            d_tokvecs = parser.update(docs, golds, sgd=optimizer)
    -            upd_tokvecs(d_tokvecs, sgd=optimizer)
    -            encoder.update(docs, golds, sgd=optimizer)
    -    nlp = LangClass(vocab=vocab, parser=parser)
    -    scorer = score_model(vocab, encoder, parser, read_conllx(dev_loc))
    -    print('%d:\t%.3f\t%.3f\t%.3f' % (itn, scorer.uas, scorer.las, scorer.tags_acc))
    -    #nlp.end_training(model_dir)
    -    #scorer = score_model(vocab, tagger, parser, read_conllx(dev_loc))
    -    #print('%d:\t%.3f\t%.3f\t%.3f' % (itn, scorer.uas, scorer.las, scorer.tags_acc))
    -
    -
    -if __name__ == '__main__':
    -    import cProfile
    -    import pstats
    -    if 1:
    -        plac.call(main)
    -    else:
    -        cProfile.runctx("plac.call(main)", globals(), locals(), "Profile.prof")
    -    s = pstats.Stats("Profile.prof")
    -    s.strip_dirs().sort_stats("time").print_stats()
    -
    -
    -    plac.call(main)
    diff --git a/bin/prepare_treebank.py b/bin/prepare_treebank.py
    deleted file mode 100644
    index f9f4eec21..000000000
    --- a/bin/prepare_treebank.py
    +++ /dev/null
    @@ -1,194 +0,0 @@
    -"""Convert OntoNotes into a json format.
    -
    -doc: {
    -    id: string,
    -    paragraphs: [{
    -        raw: string,
    -        sents: [int],
    -        tokens: [{
    -            start: int,
    -            tag: string,
    -            head: int,
    -            dep: string}],
    -        ner: [{
    -            start: int,
    -            end: int,
    -            label: string}],
    -        brackets: [{
    -            start: int,
    -            end: int,
    -            label: string}]}]}
    -
    -Consumes output of spacy/munge/align_raw.py
    -"""
    -from __future__ import unicode_literals
    -import plac
    -import json
    -from os import path
    -import os
    -import re
    -import io
    -from collections import defaultdict
    -
    -from spacy.munge import read_ptb
    -from spacy.munge import read_conll
    -from spacy.munge import read_ner
    -
    -
    -def _iter_raw_files(raw_loc):
    -    files = json.load(open(raw_loc))
    -    for f in files:
    -        yield f
    -
    -
    -def format_doc(file_id, raw_paras, ptb_text, dep_text, ner_text):
    -    ptb_sents = read_ptb.split(ptb_text)
    -    dep_sents = read_conll.split(dep_text)
    -    if len(ptb_sents) != len(dep_sents):
    -        return None
    -    if ner_text is not None:
    -        ner_sents = read_ner.split(ner_text)
    -    else:
    -        ner_sents = [None] * len(ptb_sents)
    -
    -    i = 0
    -    doc = {'id': file_id}
    -    if raw_paras is None:
    -        doc['paragraphs'] = [format_para(None, ptb_sents, dep_sents, ner_sents)]
    -        #for ptb_sent, dep_sent, ner_sent in zip(ptb_sents, dep_sents, ner_sents):
    -        #    doc['paragraphs'].append(format_para(None, [ptb_sent], [dep_sent], [ner_sent]))
    -    else:
    -        doc['paragraphs'] = []
    -        for raw_sents in raw_paras:
    -            para = format_para(
    -                        ' '.join(raw_sents).replace('', ''),
    -                        ptb_sents[i:i+len(raw_sents)],
    -                        dep_sents[i:i+len(raw_sents)],
    -                        ner_sents[i:i+len(raw_sents)])
    -            if para['sentences']:
    -                doc['paragraphs'].append(para)
    -            i += len(raw_sents)
    -    return doc
    -
    -
    -def format_para(raw_text, ptb_sents, dep_sents, ner_sents):
    -    para = {'raw': raw_text, 'sentences': []}
    -    offset = 0
    -    assert len(ptb_sents) == len(dep_sents) == len(ner_sents)
    -    for ptb_text, dep_text, ner_text in zip(ptb_sents, dep_sents, ner_sents):
    -        _, deps = read_conll.parse(dep_text, strip_bad_periods=True)
    -        if deps and 'VERB' in [t['tag'] for t in deps]:
    -            continue
    -        if ner_text is not None:
    -            _, ner = read_ner.parse(ner_text, strip_bad_periods=True)
    -        else:
    -            ner = ['-' for _ in deps]
    -        _, brackets = read_ptb.parse(ptb_text, strip_bad_periods=True)
    -        # Necessary because the ClearNLP converter deletes EDITED words.
    -        if len(ner) != len(deps):
    -            ner = ['-' for _ in deps]
    -        para['sentences'].append(format_sentence(deps, ner, brackets))
    -    return para
    -
    -
    -def format_sentence(deps, ner, brackets):
    -    sent = {'tokens': [], 'brackets': []}
    -    for token_id, (token, token_ent) in enumerate(zip(deps, ner)):
    -        sent['tokens'].append(format_token(token_id, token, token_ent))
    -
    -    for label, start, end in brackets:
    -        if start != end:
    -            sent['brackets'].append({
    -                'label': label,
    -                'first': start,
    -                'last': (end-1)})
    -    return sent
    -
    -
    -def format_token(token_id, token, ner):
    -    assert token_id == token['id']
    -    head = (token['head'] - token_id) if token['head'] != -1 else 0
    -    return {
    -        'id': token_id,
    -        'orth': token['word'],
    -        'tag': token['tag'],
    -        'head': head,
    -        'dep': token['dep'],
    -        'ner': ner}
    -
    -
    -def read_file(*pieces):
    -    loc = path.join(*pieces)
    -    if not path.exists(loc):
    -        return None
    -    else:
    -        return io.open(loc, 'r', encoding='utf8').read().strip()
    -
    -
    -def get_file_names(section_dir, subsection):
    -    filenames = []
    -    for fn in os.listdir(path.join(section_dir, subsection)):
    -        filenames.append(fn.rsplit('.', 1)[0])
    -    return list(sorted(set(filenames)))
    -
    -
    -def read_wsj_with_source(onto_dir, raw_dir):
    -    # Now do WSJ, with source alignment
    -    onto_dir = path.join(onto_dir, 'data', 'english', 'annotations', 'nw', 'wsj')
    -    docs = {}
    -    for i in range(25):
    -        section = str(i) if i >= 10 else ('0' + str(i))
    -        raw_loc = path.join(raw_dir, 'wsj%s.json' % section)
    -        for j, (filename, raw_paras) in enumerate(_iter_raw_files(raw_loc)):
    -            if section == '00':
    -                j += 1
    -            if section == '04' and filename == '55':
    -                continue
    -            ptb = read_file(onto_dir, section, '%s.parse' % filename)
    -            dep = read_file(onto_dir, section, '%s.parse.dep' % filename)
    -            ner = read_file(onto_dir, section, '%s.name' % filename)
    -            if ptb is not None and dep is not None:
    -                docs[filename] = format_doc(filename, raw_paras, ptb, dep, ner)
    -    return docs
    -
    -
    -def get_doc(onto_dir, file_path, wsj_docs):
    -    filename = file_path.rsplit('/', 1)[1]
    -    if filename in wsj_docs:
    -        return wsj_docs[filename]
    -    else:
    -        ptb = read_file(onto_dir, file_path + '.parse')
    -        dep = read_file(onto_dir, file_path + '.parse.dep')
    -        ner = read_file(onto_dir, file_path + '.name')
    -        if ptb is not None and dep is not None:
    -            return format_doc(filename, None, ptb, dep, ner)
    -        else:
    -            return None
    -
    -
    -def read_ids(loc):
    -    return open(loc).read().strip().split('\n')
    -
    -
    -def main(onto_dir, raw_dir, out_dir):
    -    wsj_docs = read_wsj_with_source(onto_dir, raw_dir)
    -
    -    for partition in ('train', 'test', 'development'):
    -        ids = read_ids(path.join(onto_dir, '%s.id' % partition))
    -        docs_by_genre = defaultdict(list)
    -        for file_path in ids:
    -            doc = get_doc(onto_dir, file_path, wsj_docs)
    -            if doc is not None:
    -                genre = file_path.split('/')[3]
    -                docs_by_genre[genre].append(doc)
    -        part_dir = path.join(out_dir, partition)
    -        if not path.exists(part_dir):
    -            os.mkdir(part_dir)
    -        for genre, docs in sorted(docs_by_genre.items()):
    -            out_loc = path.join(part_dir, genre + '.json')
    -            with open(out_loc, 'w') as file_:
    -                json.dump(docs, file_, indent=4)
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/bin/prepare_vecs.py b/bin/prepare_vecs.py
    deleted file mode 100644
    index b55dafee3..000000000
    --- a/bin/prepare_vecs.py
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -"""Read a vector file, and prepare it as binary data, for easy consumption"""
    -
    -import plac
    -
    -from spacy.vocab import write_binary_vectors
    -
    -
    -def main(in_loc, out_loc):
    -    write_binary_vectors(in_loc, out_loc)
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/bin/tagger/train.py b/bin/tagger/train.py
    deleted file mode 100755
    index 9cd8cc011..000000000
    --- a/bin/tagger/train.py
    +++ /dev/null
    @@ -1,175 +0,0 @@
    -#!/usr/bin/env python
    -from __future__ import division
    -from __future__ import unicode_literals
    -from __future__ import print_function
    -
    -import os
    -from os import path
    -import shutil
    -import codecs
    -import random
    -
    -import plac
    -import re
    -
    -import spacy.util
    -from spacy.en import English
    -
    -from spacy.tagger import Tagger
    -
    -from spacy.syntax.util import Config
    -from spacy.gold import read_json_file
    -from spacy.gold import GoldParse
    -
    -from spacy.scorer import Scorer
    -
    -
    -def score_model(scorer, nlp, raw_text, annot_tuples):
    -    if raw_text is None:
    -        tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
    -    else:
    -        tokens = nlp.tokenizer(raw_text)
    -    nlp.tagger(tokens)
    -    gold = GoldParse(tokens, annot_tuples)
    -    scorer.score(tokens, gold)
    -
    -
    -def _merge_sents(sents):
    -    m_deps = [[], [], [], [], [], []]
    -    m_brackets = []
    -    i = 0
    -    for (ids, words, tags, heads, labels, ner), brackets in sents:
    -        m_deps[0].extend(id_ + i for id_ in ids)
    -        m_deps[1].extend(words)
    -        m_deps[2].extend(tags)
    -        m_deps[3].extend(head + i for head in heads)
    -        m_deps[4].extend(labels)
    -        m_deps[5].extend(ner)
    -        m_brackets.extend((b['first'] + i, b['last'] + i, b['label']) for b in brackets)
    -        i += len(ids)
    -    return [(m_deps, m_brackets)]
    -
    -
    -def train(Language, gold_tuples, model_dir, n_iter=15, feat_set=u'basic',
    -          seed=0, gold_preproc=False, n_sents=0, corruption_level=0,
    -          beam_width=1, verbose=False,
    -          use_orig_arc_eager=False):
    -    if n_sents > 0:
    -        gold_tuples = gold_tuples[:n_sents]
    -   
    -    templates = Tagger.default_templates()
    -    nlp = Language(data_dir=model_dir, tagger=False)
    -    nlp.tagger = Tagger.blank(nlp.vocab, templates)
    -
    -    print("Itn.\tP.Loss\tUAS\tNER F.\tTag %\tToken %")
    -    for itn in range(n_iter):
    -        scorer = Scorer()
    -        loss = 0
    -        for raw_text, sents in gold_tuples:
    -            if gold_preproc:
    -                raw_text = None
    -            else:
    -                sents = _merge_sents(sents)
    -            for annot_tuples, ctnt in sents:
    -                words = annot_tuples[1]
    -                gold_tags = annot_tuples[2]
    -                score_model(scorer, nlp, raw_text, annot_tuples)
    -                if raw_text is None:
    -                    tokens = nlp.tokenizer.tokens_from_list(words)
    -                else:
    -                    tokens = nlp.tokenizer(raw_text)
    -                loss += nlp.tagger.train(tokens, gold_tags)
    -        random.shuffle(gold_tuples)
    -        print('%d:\t%d\t%.3f\t%.3f\t%.3f\t%.3f' % (itn, loss, scorer.uas, scorer.ents_f,
    -                                                   scorer.tags_acc,
    -                                                   scorer.token_acc))
    -    nlp.end_training(model_dir)
    -
    -def evaluate(Language, gold_tuples, model_dir, gold_preproc=False, verbose=False,
    -             beam_width=None):
    -    nlp = Language(data_dir=model_dir)
    -    if beam_width is not None:
    -        nlp.parser.cfg.beam_width = beam_width
    -    scorer = Scorer()
    -    for raw_text, sents in gold_tuples:
    -        if gold_preproc:
    -            raw_text = None
    -        else:
    -            sents = _merge_sents(sents)
    -        for annot_tuples, brackets in sents:
    -            if raw_text is None:
    -                tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
    -                nlp.tagger(tokens)
    -                nlp.entity(tokens)
    -                nlp.parser(tokens)
    -            else:
    -                tokens = nlp(raw_text, merge_mwes=False)
    -            gold = GoldParse(tokens, annot_tuples)
    -            scorer.score(tokens, gold, verbose=verbose)
    -    return scorer
    -
    -
    -def write_parses(Language, dev_loc, model_dir, out_loc, beam_width=None):
    -    nlp = Language(data_dir=model_dir)
    -    if beam_width is not None:
    -        nlp.parser.cfg.beam_width = beam_width
    -    gold_tuples = read_json_file(dev_loc)
    -    scorer = Scorer()
    -    out_file = codecs.open(out_loc, 'w', 'utf8')
    -    for raw_text, sents in gold_tuples:
    -        sents = _merge_sents(sents)
    -        for annot_tuples, brackets in sents:
    -            if raw_text is None:
    -                tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
    -                nlp.tagger(tokens)
    -                nlp.entity(tokens)
    -                nlp.parser(tokens)
    -            else:
    -                tokens = nlp(raw_text, merge_mwes=False)
    -            gold = GoldParse(tokens, annot_tuples)
    -            scorer.score(tokens, gold, verbose=False)
    -            for t in tokens:
    -                out_file.write(
    -                    '%s\t%s\t%s\t%s\n' % (t.orth_, t.tag_, t.head.orth_, t.dep_)
    -                )
    -    return scorer
    -
    -
    -@plac.annotations(
    -    train_loc=("Location of training file or directory"),
    -    dev_loc=("Location of development file or directory"),
    -    model_dir=("Location of output model directory",),
    -    eval_only=("Skip training, and only evaluate", "flag", "e", bool),
    -    corruption_level=("Amount of noise to add to training data", "option", "c", float),
    -    gold_preproc=("Use gold-standard sentence boundaries in training?", "flag", "g", bool),
    -    out_loc=("Out location", "option", "o", str),
    -    n_sents=("Number of training sentences", "option", "n", int),
    -    n_iter=("Number of training iterations", "option", "i", int),
    -    verbose=("Verbose error reporting", "flag", "v", bool),
    -    debug=("Debug mode", "flag", "d", bool),
    -)
    -def main(train_loc, dev_loc, model_dir, n_sents=0, n_iter=15, out_loc="", verbose=False,
    -         debug=False, corruption_level=0.0, gold_preproc=False, eval_only=False):
    -    if not eval_only:
    -        gold_train = list(read_json_file(train_loc))
    -        train(English, gold_train, model_dir,
    -              feat_set='basic' if not debug else 'debug',
    -              gold_preproc=gold_preproc, n_sents=n_sents,
    -              corruption_level=corruption_level, n_iter=n_iter,
    -              verbose=verbose)
    -    #if out_loc:
    -    #    write_parses(English, dev_loc, model_dir, out_loc, beam_width=beam_width)
    -    scorer = evaluate(English, list(read_json_file(dev_loc)),
    -                      model_dir, gold_preproc=gold_preproc, verbose=verbose)
    -    print('TOK', scorer.token_acc)
    -    print('POS', scorer.tags_acc)
    -    print('UAS', scorer.uas)
    -    print('LAS', scorer.las)
    -
    -    print('NER P', scorer.ents_p)
    -    print('NER R', scorer.ents_r)
    -    print('NER F', scorer.ents_f)
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    diff --git a/bin/tagger/train_german_tagger.py b/bin/tagger/train_german_tagger.py
    deleted file mode 100644
    index 4927a6e9a..000000000
    --- a/bin/tagger/train_german_tagger.py
    +++ /dev/null
    @@ -1,160 +0,0 @@
    -#!/usr/bin/env python
    -from __future__ import division
    -from __future__ import unicode_literals
    -
    -import os
    -from os import path
    -import shutil
    -import io
    -import random
    -import time
    -import gzip
    -import ujson
    -
    -import plac
    -import cProfile
    -import pstats
    -
    -import spacy.util
    -from spacy.de import German
    -from spacy.gold import GoldParse
    -from spacy.tagger import Tagger
    -from spacy.scorer import PRFScore
    -
    -from spacy.tagger import P2_orth, P2_cluster, P2_shape, P2_prefix, P2_suffix, P2_pos, P2_lemma, P2_flags 
    -from spacy.tagger import P1_orth, P1_cluster, P1_shape, P1_prefix, P1_suffix, P1_pos, P1_lemma, P1_flags 
    -from spacy.tagger import W_orth, W_cluster, W_shape, W_prefix, W_suffix, W_pos, W_lemma, W_flags
    -from spacy.tagger import N1_orth, N1_cluster, N1_shape, N1_prefix, N1_suffix, N1_pos, N1_lemma, N1_flags
    -from spacy.tagger import N2_orth, N2_cluster, N2_shape, N2_prefix, N2_suffix, N2_pos, N2_lemma, N2_flags, N_CONTEXT_FIELDS
    -
    -
    -def default_templates():
    -    return spacy.tagger.Tagger.default_templates()
    -
    -def default_templates_without_clusters():
    -    return (
    -        (W_orth,),
    -        (P1_lemma, P1_pos),
    -        (P2_lemma, P2_pos),
    -        (N1_orth,),
    -        (N2_orth,),
    -
    -        (W_suffix,),
    -        (W_prefix,),
    -
    -        (P1_pos,),
    -        (P2_pos,),
    -        (P1_pos, P2_pos),
    -        (P1_pos, W_orth),
    -        (P1_suffix,),
    -        (N1_suffix,),
    -
    -        (W_shape,),
    -
    -        (W_flags,),
    -        (N1_flags,),
    -        (N2_flags,),
    -        (P1_flags,),
    -        (P2_flags,),
    -    )
    -
    -
    -def make_tagger(vocab, templates):
    -    model = spacy.tagger.TaggerModel(templates)
    -    return spacy.tagger.Tagger(vocab,model)
    -
    -
    -def read_conll(file_):
    -    def sentences():
    -        words, tags = [], []
    -        for line in file_:
    -            line = line.strip()
    -            if line:
    -                word, tag = line.split('\t')[1::3][:2] # get column 1 and 4 (CoNLL09)
    -                words.append(word)
    -                tags.append(tag)
    -            elif words:
    -                yield words, tags
    -                words, tags = [], []
    -        if words:
    -            yield words, tags
    -    return [ s for s in sentences() ]
    -
    -        
    -def score_model(score, nlp, words, gold_tags):
    -    tokens = nlp.tokenizer.tokens_from_list(words)
    -    assert(len(tokens) == len(gold_tags))
    -    nlp.tagger(tokens)
    -
    -    for token, gold_tag in zip(tokens,gold_tags):
    -        score.score_set(set([token.tag_]),set([gold_tag]))
    -
    -
    -def train(Language, train_sents, dev_sents, model_dir, n_iter=15, seed=21):
    -    # make shuffling deterministic
    -    random.seed(seed)
    -
    -    # set up directory for model
    -    pos_model_dir = path.join(model_dir, 'pos')
    -    if path.exists(pos_model_dir):
    -        shutil.rmtree(pos_model_dir)
    -    os.mkdir(pos_model_dir)
    -
    -    nlp = Language(data_dir=model_dir, tagger=False, parser=False, entity=False)
    -    nlp.tagger = make_tagger(nlp.vocab,default_templates())
    -     
    -    print("Itn.\ttrain acc %\tdev acc %")
    -    for itn in range(n_iter):
    -        # train on train set
    -        #train_acc = PRFScore()
    -        correct, total = 0., 0.
    -        for words, gold_tags in train_sents:
    -            tokens = nlp.tokenizer.tokens_from_list(words)
    -            correct += nlp.tagger.train(tokens, gold_tags)
    -            total += len(words)
    -        train_acc = correct/total
    -
    -        # test on dev set
    -        dev_acc = PRFScore()
    -        for words, gold_tags in dev_sents:
    -            score_model(dev_acc, nlp, words, gold_tags)
    -
    -        random.shuffle(train_sents)
    -        print('%d:\t%6.2f\t%6.2f' % (itn, 100*train_acc, 100*dev_acc.precision))
    -
    -
    -    print('end training')
    -    nlp.end_training(model_dir)
    -    print('done')
    -
    -
    -@plac.annotations(
    -    train_loc=("Location of CoNLL 09 formatted training file"),
    -    dev_loc=("Location of CoNLL 09 formatted development file"),
    -    model_dir=("Location of output model directory"),
    -    eval_only=("Skip training, and only evaluate", "flag", "e", bool),
    -    n_iter=("Number of training iterations", "option", "i", int),
    -)
    -def main(train_loc, dev_loc, model_dir, eval_only=False, n_iter=15):
    -    # training
    -    if not eval_only:
    -        with io.open(train_loc, 'r', encoding='utf8') as trainfile_, \
    -             io.open(dev_loc, 'r', encoding='utf8') as devfile_:
    -            train_sents = read_conll(trainfile_)
    -            dev_sents = read_conll(devfile_)
    -        train(German, train_sents, dev_sents, model_dir, n_iter=n_iter)
    -
    -    # testing
    -    with io.open(dev_loc, 'r', encoding='utf8') as file_:
    -        dev_sents = read_conll(file_)
    -        nlp = German(data_dir=model_dir)
    -
    -        dev_acc = PRFScore()
    -        for words, gold_tags in dev_sents:
    -            score_model(dev_acc, nlp, words, gold_tags)                
    -        
    -        print('POS: %6.2f %%' % (100*dev_acc.precision))
    -
    -
    -if __name__ == '__main__':
    -    plac.call(main)
    
    From 7946464742b8654c4815e3d6565b12e97d90437b Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 19:45:04 +0200
    Subject: [PATCH 586/649] Remove spacy.tagger (now in pipeline)
    
    ---
     setup.py         |   1 -
     spacy/tagger.pxd |  17 ----
     spacy/tagger.pyx | 253 -----------------------------------------------
     3 files changed, 271 deletions(-)
     delete mode 100644 spacy/tagger.pxd
     delete mode 100644 spacy/tagger.pyx
    
    diff --git a/setup.py b/setup.py
    index f7525a3ff..78b1f6c86 100755
    --- a/setup.py
    +++ b/setup.py
    @@ -24,7 +24,6 @@ MOD_NAMES = [
         'spacy.vocab',
         'spacy.attrs',
         'spacy.morphology',
    -    'spacy.tagger',
         'spacy.pipeline',
         'spacy.syntax.stateclass',
         'spacy.syntax._state',
    diff --git a/spacy/tagger.pxd b/spacy/tagger.pxd
    deleted file mode 100644
    index 6d2cef1f4..000000000
    --- a/spacy/tagger.pxd
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -from thinc.linear.avgtron cimport AveragedPerceptron
    -from thinc.extra.eg cimport Example
    -from thinc.structs cimport ExampleC
    -
    -from .structs cimport TokenC
    -from .vocab cimport Vocab
    -
    -
    -cdef class TaggerModel(AveragedPerceptron):
    -    cdef void set_featuresC(self, ExampleC* eg, const TokenC* tokens, int i) except *
    - 
    -
    -cdef class Tagger:
    -    cdef readonly Vocab vocab
    -    cdef readonly TaggerModel model
    -    cdef public dict freqs
    -    cdef public object cfg
    diff --git a/spacy/tagger.pyx b/spacy/tagger.pyx
    deleted file mode 100644
    index 0fadea15d..000000000
    --- a/spacy/tagger.pyx
    +++ /dev/null
    @@ -1,253 +0,0 @@
    -# coding: utf8
    -from __future__ import unicode_literals
    -
    -from collections import defaultdict
    -
    -from cymem.cymem cimport Pool
    -from thinc.typedefs cimport atom_t
    -from thinc.extra.eg cimport Example
    -from thinc.structs cimport ExampleC
    -from thinc.linear.avgtron cimport AveragedPerceptron
    -from thinc.linalg cimport VecVec
    -
    -from .tokens.doc cimport Doc
    -from .attrs cimport TAG
    -from .gold cimport GoldParse
    -from .attrs cimport *
    -
    -
    -cpdef enum:
    -    P2_orth
    -    P2_cluster
    -    P2_shape
    -    P2_prefix
    -    P2_suffix
    -    P2_pos
    -    P2_lemma
    -    P2_flags
    -
    -    P1_orth
    -    P1_cluster
    -    P1_shape
    -    P1_prefix
    -    P1_suffix
    -    P1_pos
    -    P1_lemma
    -    P1_flags
    -
    -    W_orth
    -    W_cluster
    -    W_shape
    -    W_prefix
    -    W_suffix
    -    W_pos
    -    W_lemma
    -    W_flags
    -
    -    N1_orth
    -    N1_cluster
    -    N1_shape
    -    N1_prefix
    -    N1_suffix
    -    N1_pos
    -    N1_lemma
    -    N1_flags
    -
    -    N2_orth
    -    N2_cluster
    -    N2_shape
    -    N2_prefix
    -    N2_suffix
    -    N2_pos
    -    N2_lemma
    -    N2_flags
    -
    -    N_CONTEXT_FIELDS
    -
    -
    -cdef class TaggerModel(AveragedPerceptron):
    -    def update(self, Example eg):
    -        self.time += 1
    -        guess = eg.guess
    -        best = VecVec.arg_max_if_zero(eg.c.scores, eg.c.costs, eg.c.nr_class)
    -        if guess != best:
    -            for feat in eg.c.features[:eg.c.nr_feat]:
    -                self.update_weight(feat.key, best, -feat.value)
    -                self.update_weight(feat.key, guess, feat.value)
    -
    -    cdef void set_featuresC(self, ExampleC* eg, const TokenC* tokens, int i) except *:
    -        _fill_from_token(&eg.atoms[P2_orth], &tokens[i-2])
    -        _fill_from_token(&eg.atoms[P1_orth], &tokens[i-1])
    -        _fill_from_token(&eg.atoms[W_orth], &tokens[i])
    -        _fill_from_token(&eg.atoms[N1_orth], &tokens[i+1])
    -        _fill_from_token(&eg.atoms[N2_orth], &tokens[i+2])
    -
    -        eg.nr_feat = self.extracter.set_features(eg.features, eg.atoms)
    -
    -
    -cdef inline void _fill_from_token(atom_t* context, const TokenC* t) nogil:
    -    context[0] = t.lex.lower
    -    context[1] = t.lex.cluster
    -    context[2] = t.lex.shape
    -    context[3] = t.lex.prefix
    -    context[4] = t.lex.suffix
    -    context[5] = t.tag
    -    context[6] = t.lemma
    -    if t.lex.flags & (1 << IS_ALPHA):
    -        context[7] = 1
    -    elif t.lex.flags & (1 << IS_PUNCT):
    -        context[7] = 2
    -    elif t.lex.flags & (1 << LIKE_URL):
    -        context[7] = 3
    -    elif t.lex.flags & (1 << LIKE_NUM):
    -        context[7] = 4
    -    else:
    -        context[7] = 0
    -
    -
    -cdef class Tagger:
    -    """Annotate part-of-speech tags on Doc objects."""
    -
    -    def __init__(self, Vocab vocab, TaggerModel model=None, **cfg):
    -        """Create a Tagger.
    -
    -        vocab (Vocab): The vocabulary object. Must be shared with documents to
    -            be processed.
    -        model (thinc.linear.AveragedPerceptron): The statistical model.
    -        RETURNS (Tagger): The newly constructed object.
    -        """
    -        if model is None:
    -            model = TaggerModel(cfg.get('features', self.feature_templates),
    -                                L1=0.0)
    -        self.vocab = vocab
    -        self.model = model
    -        self.model.l1_penalty = 0.0
    -        # TODO: Move this to tag map
    -        self.freqs = {TAG: defaultdict(int)}
    -        for tag in self.tag_names:
    -            self.freqs[TAG][self.vocab.strings[tag]] = 1
    -        self.freqs[TAG][0] = 1
    -        self.cfg = cfg
    -
    -    @property
    -    def tag_names(self):
    -        return self.vocab.morphology.tag_names
    -
    -    def __reduce__(self):
    -        return (self.__class__, (self.vocab, self.model), None, None)
    -
    -    def tag_from_strings(self, Doc tokens, object tag_strs):
    -        cdef int i
    -        for i in range(tokens.length):
    -            self.vocab.morphology.assign_tag(&tokens.c[i], tag_strs[i])
    -        tokens.is_tagged = True
    -        tokens._py_tokens = [None] * tokens.length
    -
    -    def __call__(self, Doc tokens):
    -        """Apply the tagger, setting the POS tags onto the Doc object.
    -
    -        doc (Doc): The tokens to be tagged.
    -        """
    -        if tokens.length == 0:
    -            return 0
    -
    -        cdef Pool mem = Pool()
    -
    -        cdef int i, tag
    -        cdef Example eg = Example(nr_atom=N_CONTEXT_FIELDS,
    -                                  nr_class=self.vocab.morphology.n_tags,
    -                                  nr_feat=self.model.nr_feat)
    -        for i in range(tokens.length):
    -            if tokens.c[i].pos == 0:
    -                self.model.set_featuresC(&eg.c, tokens.c, i)
    -                self.model.set_scoresC(eg.c.scores,
    -                    eg.c.features, eg.c.nr_feat)
    -                guess = VecVec.arg_max_if_true(eg.c.scores, eg.c.is_valid, eg.c.nr_class)
    -                self.vocab.morphology.assign_tag_id(&tokens.c[i], guess)
    -                eg.fill_scores(0, eg.c.nr_class)
    -        tokens.is_tagged = True
    -        tokens._py_tokens = [None] * tokens.length
    -
    -    def pipe(self, stream, batch_size=1000, n_threads=2):
    -        """Tag a stream of documents.
    -
    -        Arguments:
    -        stream: The sequence of documents to tag.
    -        batch_size (int): The number of documents to accumulate into a working set.
    -        n_threads (int): The number of threads with which to work on the buffer
    -            in parallel, if the Matcher implementation supports multi-threading.
    -        YIELDS (Doc): Documents, in order.
    -        """
    -        for doc in stream:
    -            self(doc)
    -            yield doc
    -
    -    def update(self, Doc tokens, GoldParse gold, itn=0):
    -        """Update the statistical model, with tags supplied for the given document.
    -
    -        doc (Doc): The document to update on.
    -        gold (GoldParse): Manager for the gold-standard tags.
    -        RETURNS (int): Number of tags predicted correctly.
    -        """
    -        gold_tag_strs = gold.tags
    -        assert len(tokens) == len(gold_tag_strs)
    -        for tag in gold_tag_strs:
    -            if tag != None and tag not in self.tag_names:
    -                msg = ("Unrecognized gold tag: %s. tag_map.json must contain all "
    -                       "gold tags, to maintain coarse-grained mapping.")
    -                raise ValueError(msg % tag)
    -        golds = [self.tag_names.index(g) if g is not None else -1 for g in gold_tag_strs]
    -        cdef int correct = 0
    -        cdef Pool mem = Pool()
    -        cdef Example eg = Example(
    -            nr_atom=N_CONTEXT_FIELDS,
    -            nr_class=self.vocab.morphology.n_tags,
    -            nr_feat=self.model.nr_feat)
    -        for i in range(tokens.length):
    -            self.model.set_featuresC(&eg.c, tokens.c, i)
    -            eg.costs = [ 1 if golds[i] not in (c, -1) else 0 for c in xrange(eg.nr_class) ]
    -            self.model.set_scoresC(eg.c.scores,
    -                eg.c.features, eg.c.nr_feat)
    -            self.model.update(eg)
    -
    -            self.vocab.morphology.assign_tag_id(&tokens.c[i], eg.guess)
    -
    -            correct += eg.cost == 0
    -            self.freqs[TAG][tokens.c[i].tag] += 1
    -            eg.fill_scores(0, eg.c.nr_class)
    -            eg.fill_costs(0, eg.c.nr_class)
    -        tokens.is_tagged = True
    -        tokens._py_tokens = [None] * tokens.length
    -        return correct
    -
    -
    -    feature_templates = (
    -        (W_orth,),
    -        (P1_lemma, P1_pos),
    -        (P2_lemma, P2_pos),
    -        (N1_orth,),
    -        (N2_orth,),
    -
    -        (W_suffix,),
    -        (W_prefix,),
    -
    -        (P1_pos,),
    -        (P2_pos,),
    -        (P1_pos, P2_pos),
    -        (P1_pos, W_orth),
    -        (P1_suffix,),
    -        (N1_suffix,),
    -
    -        (W_shape,),
    -        (W_cluster,),
    -        (N1_cluster,),
    -        (N2_cluster,),
    -        (P1_cluster,),
    -        (P2_cluster,),
    -
    -        (W_flags,),
    -        (N1_flags,),
    -        (N2_flags,),
    -        (P1_flags,),
    -        (P2_flags,),
    -    )
    
    From 5167a0cce2e1ffed425b849f2d88cedab459a683 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 19:45:19 +0200
    Subject: [PATCH 587/649] Tidy up Vectors and docs
    
    ---
     spacy/vectors.pyx        | 112 ++++++++++++++++++++++++++++---------
     spacy/vocab.pyx          | 118 ++++++++++++++++-----------------------
     website/api/vectors.jade |  23 +++++---
     3 files changed, 151 insertions(+), 102 deletions(-)
    
    diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx
    index fa5fcf624..155d7b9d2 100644
    --- a/spacy/vectors.pyx
    +++ b/spacy/vectors.pyx
    @@ -1,5 +1,6 @@
    +# coding: utf8
     from __future__ import unicode_literals
    -from libc.stdint cimport int32_t, uint64_t
    +
     import numpy
     from collections import OrderedDict
     import msgpack
    @@ -9,23 +10,20 @@ cimport numpy as np
     from thinc.neural.util import get_array_module
     from thinc.neural._classes.model import Model
     
    -from .typedefs cimport attr_t
     from .strings cimport StringStore
    -from . import util
     from .compat import basestring_, path2str
    +from . import util
     
     
     cdef class Vectors:
    -    '''Store, save and load word vectors.
    +    """Store, save and load word vectors.
     
         Vectors data is kept in the vectors.data attribute, which should be an
    -    instance of numpy.ndarray (for CPU vectors)
    -    or cupy.ndarray (for GPU vectors).
    -
    -    vectors.key2row is a dictionary mapping word hashes to rows
    -    in the vectors.data table. The array `vectors.keys` keeps
    -    the keys in order, such that keys[vectors.key2row[key]] == key.
    -    '''
    +    instance of numpy.ndarray (for CPU vectors) or cupy.ndarray
    +    (for GPU vectors). `vectors.key2row` is a dictionary mapping word hashes to
    +    rows in the vectors.data table. The array `vectors.keys` keeps the keys in
    +    order, such that `keys[vectors.key2row[key]] == key`.
    +    """
         cdef public object data
         cdef readonly StringStore strings
         cdef public object key2row
    @@ -33,6 +31,16 @@ cdef class Vectors:
         cdef public int i
     
         def __init__(self, strings, width=0, data=None):
    +        """Create a new vector store. To keep the vector table empty, pass
    +        `width=0`. You can also create the vector table and add vectors one by
    +        one, or set the vector values directly on initialisation.
    +
    +        strings (StringStore or list): List of strings or StringStore that maps
    +            strings to hash values, and vice versa.
    +        width (int): Number of dimensions.
    +        data (numpy.ndarray): The vector data.
    +        RETURNS (Vectors): The newly created object.
    +        """
             if isinstance(strings, StringStore):
                 self.strings = strings
             else:
    @@ -55,11 +63,13 @@ cdef class Vectors:
             return (Vectors, (self.strings, self.data))
     
         def __getitem__(self, key):
    -        '''Get a vector by key. If key is a string, it is hashed
    -        to an integer ID using the vectors.strings table.
    +        """Get a vector by key. If key is a string, it is hashed to an integer
    +        ID using the vectors.strings table. If the integer key is not found in
    +        the table, a KeyError is raised.
     
    -        If the integer key is not found in the table, a KeyError is raised.
    -        '''
    +        key (unicode / int): The key to get the vector for.
    +        RETURNS (numpy.ndarray): The vector for the key.
    +        """
             if isinstance(key, basestring):
                 key = self.strings[key]
             i = self.key2row[key]
    @@ -69,30 +79,47 @@ cdef class Vectors:
                 return self.data[i]
     
         def __setitem__(self, key, vector):
    -        '''Set a vector for the given key. If key is a string, it is hashed
    +        """Set a vector for the given key. If key is a string, it is hashed
             to an integer ID using the vectors.strings table.
    -        '''
    +
    +        key (unicode / int): The key to set the vector for.
    +        vector (numpy.ndarray): The vector to set.
    +        """
             if isinstance(key, basestring):
                 key = self.strings.add(key)
             i = self.key2row[key]
             self.data[i] = vector
     
         def __iter__(self):
    -        '''Yield vectors from the table.'''
    +        """Yield vectors from the table.
    +
    +        YIELDS (numpy.ndarray): A vector.
    +        """
             yield from self.data
     
         def __len__(self):
    -        '''Return the number of vectors that have been assigned.'''
    +        """Return the number of vectors that have been assigned.
    +
    +        RETURNS (int): The number of vectors in the data.
    +        """
             return self.i
     
         def __contains__(self, key):
    -        '''Check whether a key has a vector entry in the table.'''
    +        """Check whether a key has a vector entry in the table.
    +
    +        key (unicode / int): The key to check.
    +        RETURNS (bool): Whether the key has a vector entry.
    +        """
             if isinstance(key, basestring_):
                 key = self.strings[key]
             return key in self.key2row
     
         def add(self, key, vector=None):
    -        '''Add a key to the table, optionally setting a vector value as well.'''
    +        """Add a key to the table, optionally setting a vector value as well.
    +
    +        key (unicode / int): The key to add.
    +        vector (numpy.ndarray): An optional vector to add.
    +        """
             if isinstance(key, basestring_):
                 key = self.strings.add(key)
             if key not in self.key2row:
    @@ -110,24 +137,36 @@ cdef class Vectors:
             return i
     
         def items(self):
    -        '''Iterate over (string key, vector) pairs, in order.'''
    +        """Iterate over `(string key, vector)` pairs, in order.
    +
    +        YIELDS (tuple): A key/vector pair.
    +        """
             for i, key in enumerate(self.keys):
                 string = self.strings[key]
                 yield string, self.data[i]
     
         @property
         def shape(self):
    +        """Get `(rows, dims)` tuples of number of rows and number of dimensions
    +        in the vector table.
    +
    +        RETURNS (tuple): A `(rows, dims)` pair.
    +        """
             return self.data.shape
     
         def most_similar(self, key):
    +        # TODO: implement
             raise NotImplementedError
     
         def from_glove(self, path):
    -        '''Load GloVe vectors from a directory. Assumes binary format,
    +        """Load GloVe vectors from a directory. Assumes binary format,
             that the vocab is in a vocab.txt, and that vectors are named
             vectors.{size}.[fd].bin, e.g. vectors.128.f.bin for 128d float32
             vectors, vectors.300.d.bin for 300d float64 (double) vectors, etc.
    -        By default GloVe outputs 64-bit vectors.'''
    +        By default GloVe outputs 64-bit vectors.
    +
    +        path (unicode / Path): The path to load the GloVe vectors from.
    +        """
             path = util.ensure_path(path)
             for name in path.iterdir():
                 if name.parts[-1].startswith('vectors'):
    @@ -150,9 +189,15 @@ cdef class Vectors:
                 self.data
     
         def to_disk(self, path, **exclude):
    +        """Save the current state to a directory.
    +
    +        path (unicode / Path): A path to a directory, which will be created if
    +            it doesn't exists. Either a string or a Path-like object.
    +        """
             xp = get_array_module(self.data)
             if xp is numpy:
    -            save_array = lambda arr, file_: xp.save(file_, arr, allow_pickle=False)
    +            save_array = lambda arr, file_: xp.save(file_, arr,
    +                                                    allow_pickle=False)
             else:
                 save_array = lambda arr, file_: xp.save(file_, arr)
             serializers = OrderedDict((
    @@ -162,6 +207,12 @@ cdef class Vectors:
             return util.to_disk(path, serializers, exclude)
     
         def from_disk(self, path, **exclude):
    +        """Loads state from a directory. Modifies the object in place and
    +        returns it.
    +
    +        path (unicode / Path): Directory path, string or Path-like object.
    +        RETURNS (Vectors): The modified object.
    +        """
             def load_keys(path):
                 if path.exists():
                     self.keys = numpy.load(path2str(path))
    @@ -182,6 +233,11 @@ cdef class Vectors:
             return self
     
         def to_bytes(self, **exclude):
    +        """Serialize the current state to a binary string.
    +
    +        **exclude: Named attributes to prevent from being serialized.
    +        RETURNS (bytes): The serialized form of the `Vectors` object.
    +        """
             def serialize_weights():
                 if hasattr(self.data, 'to_bytes'):
                     return self.data.to_bytes()
    @@ -194,6 +250,12 @@ cdef class Vectors:
             return util.to_bytes(serializers, exclude)
     
         def from_bytes(self, data, **exclude):
    +        """Load state from a binary string.
    +
    +        data (bytes): The data to load from.
    +        **exclude: Named attributes to prevent from being loaded.
    +        RETURNS (Vectors): The `Vectors` object.
    +        """
             def deserialize_weights(b):
                 if hasattr(self.data, 'from_bytes'):
                     self.data.from_bytes()
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index 193509771..2eace9931 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -1,32 +1,23 @@
     # coding: utf8
     from __future__ import unicode_literals
     
    -import bz2
    -import ujson
    -import re
     import numpy
     import dill
     
    -from libc.string cimport memset, memcpy
    -from libc.stdint cimport int32_t
    -from libc.math cimport sqrt
    -from cymem.cymem cimport Address
     from collections import OrderedDict
     from .lexeme cimport EMPTY_LEXEME
     from .lexeme cimport Lexeme
     from .strings cimport hash_string
     from .typedefs cimport attr_t
     from .tokens.token cimport Token
    -from .attrs cimport PROB, LANG
    +from .attrs cimport PROB, LANG, ORTH, TAG
     from .structs cimport SerializedLexemeC
     
    -from .compat import copy_reg, pickle, basestring_
    +from .compat import copy_reg, basestring_
     from .lemmatizer import Lemmatizer
     from .attrs import intify_attrs
     from .vectors import Vectors
     from . import util
    -from . import attrs
    -from . import symbols
     from ._ml import link_vectors_to_models
     
     
    @@ -36,23 +27,22 @@ cdef class Vocab:
         C-data that is shared between `Doc` objects.
         """
         def __init__(self, lex_attr_getters=None, tag_map=None, lemmatizer=None,
    -            strings=tuple(), **deprecated_kwargs):
    +                 strings=tuple(), **deprecated_kwargs):
             """Create the vocabulary.
     
    -        lex_attr_getters (dict): A dictionary mapping attribute IDs to functions
    -            to compute them. Defaults to `None`.
    -        tag_map (dict): A dictionary mapping fine-grained tags to coarse-grained
    +        lex_attr_getters (dict): A dictionary mapping attribute IDs to
    +            functions to compute them. Defaults to `None`.
    +        tag_map (dict): Dictionary mapping fine-grained tags to coarse-grained
                 parts-of-speech, and optionally morphological attributes.
             lemmatizer (object): A lemmatizer. Defaults to `None`.
             strings (StringStore): StringStore that maps strings to integers, and
                 vice versa.
    -        RETURNS (Vocab): The newly constructed vocab object.
    +        RETURNS (Vocab): The newly constructed object.
             """
             lex_attr_getters = lex_attr_getters if lex_attr_getters is not None else {}
             tag_map = tag_map if tag_map is not None else {}
             if lemmatizer in (None, True, False):
                 lemmatizer = Lemmatizer({}, {}, {})
    -
             self.mem = Pool()
             self._by_hash = PreshMap()
             self._by_orth = PreshMap()
    @@ -84,19 +74,20 @@ cdef class Vocab:
     
             The flag_getter function will be called over the words currently in the
             vocab, and then applied to new words as they occur. You'll then be able
    -        to access the flag value on each token, using token.check_flag(flag_id).
    +        to access the flag value on each token using token.check_flag(flag_id).
             See also: `Lexeme.set_flag`, `Lexeme.check_flag`, `Token.set_flag`,
             `Token.check_flag`.
     
    -        flag_getter (callable): A function `f(unicode) -> bool`, to get the flag
    -            value.
    +        flag_getter (callable): A function `f(unicode) -> bool`, to get the
    +            flag value.
             flag_id (int): An integer between 1 and 63 (inclusive), specifying
                 the bit at which the flag will be stored. If -1, the lowest
                 available bit will be chosen.
             RETURNS (int): The integer ID by which the flag value can be checked.
     
             EXAMPLE:
    -            >>> MY_PRODUCT = nlp.vocab.add_flag(lambda text: text in ['spaCy', 'dislaCy'])
    +            >>> my_product_getter = lambda text: text in ['spaCy', 'dislaCy']
    +            >>> MY_PRODUCT = nlp.vocab.add_flag(my_product_getter)
                 >>> doc = nlp(u'I like spaCy')
                 >>> assert doc[2].check_flag(MY_PRODUCT) == True
             """
    @@ -107,9 +98,10 @@ cdef class Vocab:
                         break
                 else:
                     raise ValueError(
    -                    "Cannot find empty bit for new lexical flag. All bits between "
    -                    "0 and 63 are occupied. You can replace one by specifying the "
    -                    "flag_id explicitly, e.g. nlp.vocab.add_flag(your_func, flag_id=IS_ALPHA")
    +                    "Cannot find empty bit for new lexical flag. All bits "
    +                    "between 0 and 63 are occupied. You can replace one by "
    +                    "specifying the flag_id explicitly, e.g. "
    +                    "`nlp.vocab.add_flag(your_func, flag_id=IS_ALPHA`.")
             elif flag_id >= 64 or flag_id < 1:
                 raise ValueError(
                     "Invalid value for flag_id: %d. Flag IDs must be between "
    @@ -120,9 +112,9 @@ cdef class Vocab:
             return flag_id
     
         cdef const LexemeC* get(self, Pool mem, unicode string) except NULL:
    -        """Get a pointer to a `LexemeC` from the lexicon, creating a new `Lexeme`
    -        if necessary, using memory acquired from the given pool. If the pool
    -        is the lexicon's own memory, the lexeme is saved in the lexicon.
    +        """Get a pointer to a `LexemeC` from the lexicon, creating a new
    +        `Lexeme` if necessary using memory acquired from the given pool. If the
    +        pool is the lexicon's own memory, the lexeme is saved in the lexicon.
             """
             if string == u'':
                 return &EMPTY_LEXEME
    @@ -139,9 +131,9 @@ cdef class Vocab:
                 return self._new_lexeme(mem, string)
     
         cdef const LexemeC* get_by_orth(self, Pool mem, attr_t orth) except NULL:
    -        """Get a pointer to a `LexemeC` from the lexicon, creating a new `Lexeme`
    -        if necessary, using memory acquired from the given pool. If the pool
    -        is the lexicon's own memory, the lexeme is saved in the lexicon.
    +        """Get a pointer to a `LexemeC` from the lexicon, creating a new
    +        `Lexeme` if necessary using memory acquired from the given pool. If the
    +        pool is the lexicon's own memory, the lexeme is saved in the lexicon.
             """
             if orth == 0:
                 return &EMPTY_LEXEME
    @@ -203,8 +195,8 @@ cdef class Vocab:
             for orth, addr in self._by_orth.items():
                 yield Lexeme(self, orth)
     
    -    def __getitem__(self,  id_or_string):
    -        """Retrieve a lexeme, given an int ID or a unicode string.  If a
    +    def __getitem__(self, id_or_string):
    +        """Retrieve a lexeme, given an int ID or a unicode string. If a
             previously unseen unicode string is given, a new lexeme is created and
             stored.
     
    @@ -229,13 +221,14 @@ cdef class Vocab:
             cdef int i
             tokens = self.mem.alloc(len(substrings) + 1, sizeof(TokenC))
             for i, props in enumerate(substrings):
    -            props = intify_attrs(props, strings_map=self.strings, _do_deprecated=True)
    +            props = intify_attrs(props, strings_map=self.strings,
    +                                 _do_deprecated=True)
                 token = &tokens[i]
                 # Set the special tokens up to have arbitrary attributes
    -            lex = self.get_by_orth(self.mem, props[attrs.ORTH])
    +            lex = self.get_by_orth(self.mem, props[ORTH])
                 token.lex = lex
    -            if attrs.TAG in props:
    -                self.morphology.assign_tag(token, props[attrs.TAG])
    +            if TAG in props:
    +                self.morphology.assign_tag(token, props[TAG])
                 for attr_id, value in props.items():
                     Token.set_struct_attr(token, attr_id, value)
                     Lexeme.set_struct_attr(lex, attr_id, value)
    @@ -254,16 +247,13 @@ cdef class Vocab:
             self.vectors = Vectors(self.strings, width=new_dim)
     
         def get_vector(self, orth):
    -        """Retrieve a vector for a word in the vocabulary.
    +        """Retrieve a vector for a word in the vocabulary. Words can be looked
    +        up by string or int ID. If no vectors data is loaded, ValueError is
    +        raised.
     
    -        Words can be looked up by string or int ID.
    -
    -        RETURNS:
    -            A word vector. Size and shape determined by the
    -            vocab.vectors instance. Usually, a numpy ndarray
    -            of shape (300,) and dtype float32.
    -
    -        RAISES: If no vectors data is loaded, ValueError is raised.
    +        RETURNS (numpy.ndarray): A word vector. Size
    +            and shape determined by the `vocab.vectors` instance. Usually, a
    +            numpy ndarray of shape (300,) and dtype float32.
             """
             if isinstance(orth, basestring_):
                 orth = self.strings.add(orth)
    @@ -273,21 +263,16 @@ cdef class Vocab:
                 return numpy.zeros((self.vectors_length,), dtype='f')
     
         def set_vector(self, orth, vector):
    -        """Set a vector for a word in the vocabulary.
    -
    -        Words can be referenced by string or int ID.
    -
    -        RETURNS:
    -            None
    +        """Set a vector for a word in the vocabulary. Words can be referenced
    +        by string or int ID.
             """
             if not isinstance(orth, basestring_):
                 orth = self.strings[orth]
             self.vectors.add(orth, vector=vector)
     
         def has_vector(self, orth):
    -        """Check whether a word has a vector. Returns False if no
    -        vectors have been loaded. Words can be looked up by string
    -        or int ID."""
    +        """Check whether a word has a vector. Returns False if no vectors have
    +        been loaded. Words can be looked up by string or int ID."""
             if isinstance(orth, basestring_):
                 orth = self.strings.add(orth)
             return orth in self.vectors
    @@ -296,7 +281,7 @@ cdef class Vocab:
             """Save the current state to a directory.
     
             path (unicode or Path): A path to a directory, which will be created if
    -            it doesn't exist. Paths may be either strings or `Path`-like objects.
    +            it doesn't exist. Paths may be either strings or Path-like objects.
             """
             path = util.ensure_path(path)
             if not path.exists():
    @@ -421,16 +406,13 @@ def pickle_vocab(vocab):
         length = vocab.length
         data_dir = vocab.data_dir
         lex_attr_getters = dill.dumps(vocab.lex_attr_getters)
    -
         lexemes_data = vocab.lexemes_to_bytes()
    -
         return (unpickle_vocab,
    -        (sstore, morph, data_dir, lex_attr_getters,
    -            lexemes_data, length))
    +            (sstore, morph, data_dir, lex_attr_getters, lexemes_data, length))
     
     
     def unpickle_vocab(sstore, morphology, data_dir,
    -        lex_attr_getters, bytes lexemes_data, int length):
    +                   lex_attr_getters, bytes lexemes_data, int length):
         cdef Vocab vocab = Vocab()
         vocab.length = length
         vocab.strings = sstore
    @@ -450,12 +432,10 @@ class LookupError(Exception):
         @classmethod
         def mismatched_strings(cls, id_, id_string, original_string):
             return cls(
    -            "Error fetching a Lexeme from the Vocab. When looking up a string, "
    -            "the lexeme returned had an orth ID that did not match the query string. "
    -            "This means that the cached lexeme structs are mismatched to the "
    -            "string encoding table. The mismatched:\n"
    -            "Query string: {query}\n"
    -            "Orth cached: {orth_str}\n"
    -            "ID of orth: {orth_id}".format(
    -                query=repr(original_string), orth_str=repr(id_string), orth_id=id_)
    -        )
    +            "Error fetching a Lexeme from the Vocab. When looking up a "
    +            "string, the lexeme returned had an orth ID that did not match "
    +            "the query string. This means that the cached lexeme structs are "
    +            "mismatched to the string encoding table. The mismatched:\n"
    +            "Query string: {}\n"
    +            "Orth cached: {}\n"
    +            "Orth ID: {}".format(repr(original_string), repr(id_string), id_))
    diff --git a/website/api/vectors.jade b/website/api/vectors.jade
    index e08f34643..692bd1ca8 100644
    --- a/website/api/vectors.jade
    +++ b/website/api/vectors.jade
    @@ -36,12 +36,14 @@ p
                 |  that maps strings to hash values, and vice versa.
     
         +row
    -        +cell #[code data]
    -        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +        +cell #[code width]
    +        +cell int
    +        +cell Number of dimensions.
     
         +row
    -        +cell #[code width]
    -        +cell Number of dimensions.
    +        +cell #[code data]
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +        +cell The vector data.
     
         +row("foot")
             +cell returns
    @@ -208,7 +210,7 @@ p
         +row("foot")
             +cell returns
             +cell tuple
    -        +cell #[code (rows, dims)] pairs.
    +        +cell A #[code (rows, dims)] pair.
     
     +h(2, "from_glove") Vectors.from_glove
         +tag method
    @@ -238,11 +240,16 @@ p Save the current state to a directory.
     +table(["Name", "Type", "Description"])
         +row
             +cell #[code path]
    -        +cell unicode or #[code Path]
    +        +cell unicode / #[code Path]
             +cell
                 |  A path to a directory, which will be created if it doesn't exist.
                 |  Paths may be either strings or #[code Path]-like objects.
     
    +    +row
    +        +cell #[code **exclude]
    +        +cell -
    +        +cell Named attributes to prevent from being saved.
    +
     +h(2, "from_disk") Vectors.from_disk
         +tag method
     
    @@ -255,7 +262,7 @@ p Loads state from a directory. Modifies the object in place and returns it.
     +table(["Name", "Type", "Description"])
         +row
             +cell #[code path]
    -        +cell unicode or #[code Path]
    +        +cell unicode / #[code Path]
             +cell
                 |  A path to a directory. Paths may be either strings or
                 |  #[code Path]-like objects.
    @@ -297,7 +304,7 @@ p Load state from a binary string.
     
     +table(["Name", "Type", "Description"])
         +row
    -        +cell #[code bytes_data]
    +        +cell #[code data]
             +cell bytes
             +cell The data to load from.
     
    
    From b4d226a3f15ad33018ecddf4cc918dc4d19b2696 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 19:45:57 +0200
    Subject: [PATCH 588/649] Tidy up syntax
    
    ---
     spacy/syntax/_beam_utils.pyx       |  49 ++++++----
     spacy/syntax/_state.pyx            |   1 -
     spacy/syntax/arc_eager.pyx         |  63 ++++++-------
     spacy/syntax/ner.pyx               |  44 ++++-----
     spacy/syntax/nn_parser.pyx         | 145 +++++++++++++----------------
     spacy/syntax/nonproj.pyx           |  95 ++++++++++---------
     spacy/syntax/stateclass.pyx        |   9 --
     spacy/syntax/transition_system.pyx |  19 ++--
     8 files changed, 195 insertions(+), 230 deletions(-)
    
    diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx
    index da4efefbc..54e72a0e8 100644
    --- a/spacy/syntax/_beam_utils.pyx
    +++ b/spacy/syntax/_beam_utils.pyx
    @@ -2,7 +2,7 @@
     # cython: profile=True
     cimport numpy as np
     import numpy
    -from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF
    +from cpython.ref cimport PyObject, Py_XDECREF
     from thinc.extra.search cimport Beam
     from thinc.extra.search import MaxViolation
     from thinc.typedefs cimport hash_t, class_t
    @@ -11,7 +11,6 @@ from thinc.extra.search cimport MaxViolation
     from .transition_system cimport TransitionSystem, Transition
     from .stateclass cimport StateClass
     from ..gold cimport GoldParse
    -from ..tokens.doc cimport Doc
     
     
     # These are passed as callbacks to thinc.search.Beam
    @@ -50,7 +49,7 @@ cdef class ParserBeam(object):
         cdef public object dones
     
         def __init__(self, TransitionSystem moves, states, golds,
    -            int width, float density):
    +                 int width, float density):
             self.moves = moves
             self.states = states
             self.golds = golds
    @@ -59,7 +58,8 @@ cdef class ParserBeam(object):
             cdef StateClass state, st
             for state in states:
                 beam = Beam(self.moves.n_moves, width, density)
    -            beam.initialize(self.moves.init_beam_state, state.c.length, state.c._sent)
    +            beam.initialize(self.moves.init_beam_state, state.c.length,
    +                            state.c._sent)
                 for i in range(beam.width):
                     st = beam.at(i)
                     st.c.offset = state.c.offset
    @@ -74,7 +74,8 @@ cdef class ParserBeam(object):
     
         @property
         def is_done(self):
    -        return all(b.is_done or self.dones[i] for i, b in enumerate(self.beams))
    +        return all(b.is_done or self.dones[i]
    +                   for i, b in enumerate(self.beams))
     
         def __getitem__(self, i):
             return self.beams[i]
    @@ -126,7 +127,8 @@ cdef class ParserBeam(object):
             for i in range(beam.size):
                 state = beam.at(i)
                 if not state.c.is_final():
    -                self.moves.set_costs(beam.is_valid[i], beam.costs[i], state, gold)
    +                self.moves.set_costs(beam.is_valid[i], beam.costs[i],
    +                                     state, gold)
                     if follow_gold:
                         for j in range(beam.nr_class):
                             if beam.costs[i][j] >= 1:
    @@ -146,7 +148,10 @@ def get_token_ids(states, int n_tokens):
             c_ids += ids.shape[1]
         return ids
     
    +
     nr_update = 0
    +
    +
     def update_beam(TransitionSystem moves, int nr_feature, int max_steps,
                     states, golds,
                     state2vec, vec2scores,
    @@ -167,23 +172,27 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps,
             if pbeam.is_done and gbeam.is_done:
                 break
             # The beam maps let us find the right row in the flattened scores
    -        # arrays for each state. States are identified by (example id, history).
    -        # We keep a different beam map for each step (since we'll have a flat
    -        # scores array for each step). The beam map will let us take the per-state
    -        # losses, and compute the gradient for each (step, state, class).
    +        # arrays for each state. States are identified by (example id,
    +        # history). We keep a different beam map for each step (since we'll
    +        # have a flat scores array for each step). The beam map will let us
    +        # take the per-state losses, and compute the gradient for each (step,
    +        # state, class).
             beam_maps.append({})
             # Gather all states from the two beams in a list. Some stats may occur
             # in both beams. To figure out which beam each state belonged to,
             # we keep two lists of indices, p_indices and g_indices
    -        states, p_indices, g_indices = get_states(pbeam, gbeam, beam_maps[-1], nr_update)
    +        states, p_indices, g_indices = get_states(pbeam, gbeam, beam_maps[-1],
    +                                                  nr_update)
             if not states:
                 break
             # Now that we have our flat list of states, feed them through the model
             token_ids = get_token_ids(states, nr_feature)
             vectors, bp_vectors = state2vec.begin_update(token_ids, drop=drop)
             if hist_feats:
    -            hists = numpy.asarray([st.history[:hist_feats] for st in states], dtype='i')
    -            scores, bp_scores = vec2scores.begin_update((vectors, hists), drop=drop)
    +            hists = numpy.asarray([st.history[:hist_feats] for st in states],
    +                                  dtype='i')
    +            scores, bp_scores = vec2scores.begin_update((vectors, hists),
    +                                                        drop=drop)
             else:
                 scores, bp_scores = vec2scores.begin_update(vectors, drop=drop)
     
    @@ -192,8 +201,10 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps,
     
             # Unpack the flat scores into lists for the two beams. The indices arrays
             # tell us which example and state the scores-row refers to.
    -        p_scores = [numpy.ascontiguousarray(scores[indices], dtype='f') for indices in p_indices]
    -        g_scores = [numpy.ascontiguousarray(scores[indices], dtype='f')  for indices in g_indices]
    +        p_scores = [numpy.ascontiguousarray(scores[indices], dtype='f')
    +                    for indices in p_indices]
    +        g_scores = [numpy.ascontiguousarray(scores[indices], dtype='f')
    +                    for indices in g_indices]
             # Now advance the states in the beams. The gold beam is contrained to
             # to follow only gold analyses.
             pbeam.advance(p_scores)
    @@ -249,8 +260,7 @@ def get_states(pbeams, gbeams, beam_map, nr_update):
     
     
     def get_gradient(nr_class, beam_maps, histories, losses):
    -    """
    -    The global model assigns a loss to each parse. The beam scores
    +    """The global model assigns a loss to each parse. The beam scores
         are additive, so the same gradient is applied to each action
         in the history. This gives the gradient of a single *action*
         for a beam state -- so we have "the gradient of loss for taking
    @@ -270,7 +280,8 @@ def get_gradient(nr_class, beam_maps, histories, losses):
                 if loss != 0.0 and not numpy.isnan(loss):
                     nr_step = max(nr_step, len(hist))
         for i in range(nr_step):
    -        grads.append(numpy.zeros((max(beam_maps[i].values())+1, nr_class), dtype='f'))
    +        grads.append(numpy.zeros((max(beam_maps[i].values())+1, nr_class),
    +                                 dtype='f'))
         assert len(histories) == len(losses)
         for eg_id, hists in enumerate(histories):
             for loss, hist in zip(losses[eg_id], hists):
    @@ -287,5 +298,3 @@ def get_gradient(nr_class, beam_maps, histories, losses):
                     grads[j][i, clas] += loss
                     key = key + tuple([clas])
         return grads
    -
    -
    diff --git a/spacy/syntax/_state.pyx b/spacy/syntax/_state.pyx
    index 83c831f0b..e69de29bb 100644
    --- a/spacy/syntax/_state.pyx
    +++ b/spacy/syntax/_state.pyx
    @@ -1 +0,0 @@
    -# test
    diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx
    index 8adb8e52c..b3c9b5563 100644
    --- a/spacy/syntax/arc_eager.pyx
    +++ b/spacy/syntax/arc_eager.pyx
    @@ -4,24 +4,16 @@
     # coding: utf-8
     from __future__ import unicode_literals
     
    -from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF
    -import ctypes
    -from libc.stdint cimport uint32_t
    -from libc.string cimport memcpy
    +from cpython.ref cimport Py_INCREF
     from cymem.cymem cimport Pool
     from collections import OrderedDict
     from thinc.extra.search cimport Beam
    -import numpy
     
     from .stateclass cimport StateClass
    -from ._state cimport StateC, is_space_token
    +from ._state cimport StateC
     from .nonproj import is_nonproj_tree
    -from .transition_system cimport do_func_t, get_cost_func_t
     from .transition_system cimport move_cost_func_t, label_cost_func_t
    -from ..gold cimport GoldParse
    -from ..gold cimport GoldParseC
    -from ..attrs cimport TAG, HEAD, DEP, ENT_IOB, ENT_TYPE, IS_SPACE, IS_PUNCT
    -from ..lexeme cimport Lexeme
    +from ..gold cimport GoldParse, GoldParseC
     from ..structs cimport TokenC
     
     
    @@ -316,14 +308,13 @@ cdef class ArcEager(TransitionSystem):
     
         @classmethod
         def get_actions(cls, **kwargs):
    -        actions = kwargs.get('actions',
    -                    OrderedDict((
    -                        (SHIFT, ['']),
    -                        (REDUCE, ['']),
    -                        (RIGHT, []),
    -                        (LEFT, []),
    -                        (BREAK, ['ROOT'])
    -                    )))
    +        actions = kwargs.get('actions', OrderedDict((
    +            (SHIFT, ['']),
    +            (REDUCE, ['']),
    +            (RIGHT, []),
    +            (LEFT, []),
    +            (BREAK, ['ROOT']))
    +        ))
             seen_actions = set()
             for label in kwargs.get('left_labels', []):
                 if label.upper() != 'ROOT':
    @@ -363,7 +354,8 @@ cdef class ArcEager(TransitionSystem):
                 if gold.cand_to_gold[i] is None:
                     continue
                 if state.safe_get(i).dep:
    -                predicted.add((i, state.H(i), self.strings[state.safe_get(i).dep]))
    +                predicted.add((i, state.H(i),
    +                              self.strings[state.safe_get(i).dep]))
                 else:
                     predicted.add((i, state.H(i), 'ROOT'))
                 id_, word, tag, head, dep, ner = gold.orig_annot[gold.cand_to_gold[i]]
    @@ -381,7 +373,8 @@ cdef class ArcEager(TransitionSystem):
             if not self.has_gold(gold):
                 return None
             for i in range(gold.length):
    -            if gold.heads[i] is None or gold.labels[i] is None: # Missing values
    +            # Missing values
    +            if gold.heads[i] is None or gold.labels[i] is None:
                     gold.c.heads[i] = i
                     gold.c.has_dep[i] = False
                 else:
    @@ -517,14 +510,15 @@ cdef class ArcEager(TransitionSystem):
                 # Check projectivity --- leading cause
                 if is_nonproj_tree(gold.heads):
                     raise ValueError(
    -                    "Could not find a gold-standard action to supervise the dependency "
    -                    "parser.\n"
    -                    "Likely cause: the tree is non-projective (i.e. it has crossing "
    -                    "arcs -- see spacy/syntax/nonproj.pyx for definitions)\n"
    -                    "The ArcEager transition system only supports projective trees.\n"
    -                    "To learn non-projective representations, transform the data "
    -                    "before training and after parsing. Either pass make_projective=True "
    -                    "to the GoldParse class, or use PseudoProjectivity.preprocess_training_data")
    +                    "Could not find a gold-standard action to supervise the "
    +                    "dependency parser. Likely cause: the tree is "
    +                    "non-projective (i.e. it has crossing arcs -- see "
    +                    "spacy/syntax/nonproj.pyx for definitions). The ArcEager "
    +                    "transition system only supports projective trees. To "
    +                    "learn non-projective representations, transform the data "
    +                    "before training and after parsing. Either pass "
    +                    "make_projective=True to the GoldParse class, or use "
    +                    "spacy.syntax.nonproj.preprocess_training_data.")
                 else:
                     print(gold.orig_annot)
                     print(gold.words)
    @@ -532,12 +526,10 @@ cdef class ArcEager(TransitionSystem):
                     print(gold.labels)
                     print(gold.sent_starts)
                     raise ValueError(
    -                    "Could not find a gold-standard action to supervise the dependency "
    -                    "parser.\n"
    -                    "The GoldParse was projective.\n"
    -                    "The transition system has %d actions.\n"
    -                    "State at failure:\n"
    -                    "%s" % (self.n_moves, stcls.print_state(gold.words)))
    +                    "Could not find a gold-standard action to supervise the"
    +                    "dependency parser. The GoldParse was projective. The "
    +                    "transition system has %d actions. State at failure: %s"
    +                    % (self.n_moves, stcls.print_state(gold.words)))
             assert n_gold >= 1
     
         def get_beam_annot(self, Beam beam):
    @@ -558,4 +550,3 @@ cdef class ArcEager(TransitionSystem):
                         deps[j].setdefault(dep, 0.0)
                         deps[j][dep] += prob
             return heads, deps
    -
    diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx
    index 5c4e42176..e2e242aea 100644
    --- a/spacy/syntax/ner.pyx
    +++ b/spacy/syntax/ner.pyx
    @@ -4,17 +4,12 @@ from __future__ import unicode_literals
     from thinc.typedefs cimport weight_t
     from thinc.extra.search cimport Beam
     from collections import OrderedDict
    -import numpy
    -from thinc.neural.ops import NumpyOps
     
     from .stateclass cimport StateClass
     from ._state cimport StateC
     from .transition_system cimport Transition
     from .transition_system cimport do_func_t
    -from ..structs cimport TokenC, Entity
    -from ..gold cimport GoldParseC
    -from ..gold cimport GoldParse
    -from ..attrs cimport ENT_TYPE, ENT_IOB
    +from ..gold cimport GoldParseC, GoldParse
     
     
     cdef enum:
    @@ -69,15 +64,14 @@ cdef class BiluoPushDown(TransitionSystem):
     
         @classmethod
         def get_actions(cls, **kwargs):
    -        actions = kwargs.get('actions',
    -                    OrderedDict((
    -                        (MISSING, ['']),
    -                        (BEGIN, []),
    -                        (IN, []),
    -                        (LAST, []),
    -                        (UNIT, []),
    -                        (OUT, [''])
    -                    )))
    +        actions = kwargs.get('actions', OrderedDict((
    +            (MISSING, ['']),
    +            (BEGIN, []),
    +            (IN, []),
    +            (LAST, []),
    +            (UNIT, []),
    +            (OUT, [''])
    +        )))
             seen_entities = set()
             for entity_type in kwargs.get('entity_types', []):
                 if entity_type in seen_entities:
    @@ -160,7 +154,7 @@ cdef class BiluoPushDown(TransitionSystem):
     
         cdef Transition lookup_transition(self, object name) except *:
             cdef attr_t label
    -        if name == '-' or name == None:
    +        if name == '-' or name is None:
                 return Transition(clas=0, move=MISSING, label=0, score=0)
             elif name == '!O':
                 return Transition(clas=0, move=ISNT, label=0, score=0)
    @@ -328,8 +322,8 @@ cdef class In:
                 return False
             elif preset_ent_iob == 3:
                 return False
    -        # TODO: Is this quite right?
    -        # I think it's supposed to be ensuring the gazetteer matches are maintained
    +        # TODO: Is this quite right? I think it's supposed to be ensuring the
    +        # gazetteer matches are maintained
             elif st.B_(1).ent_iob != preset_ent_iob:
                 return False
             # Don't allow entities to extend across sentence boundaries
    @@ -354,10 +348,12 @@ cdef class In:
             if g_act == MISSING:
                 return 0
             elif g_act == BEGIN:
    -            # I, Gold B --> True (P of bad open entity sunk, R of this entity sunk)
    +            # I, Gold B --> True
    +            # (P of bad open entity sunk, R of this entity sunk)
                 return 0
             elif g_act == IN:
    -            # I, Gold I --> True (label forced by prev, if mismatch, P and R both sunk)
    +            # I, Gold I --> True
    +            # (label forced by prev, if mismatch, P and R both sunk)
                 return 0
             elif g_act == LAST:
                 # I, Gold L --> True iff this entity sunk and next tag == O
    @@ -505,11 +501,3 @@ cdef class Out:
                 return 1
             else:
                 return 1
    -
    -
    -class OracleError(Exception):
    -    pass
    -
    -
    -class UnknownMove(Exception):
    -    pass
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 12332ab25..ba9b5c94c 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -5,71 +5,48 @@
     # coding: utf-8
     from __future__ import unicode_literals, print_function
     
    -from collections import Counter, OrderedDict
    +from collections import OrderedDict
     import ujson
     import json
    -import contextlib
     import numpy
    -
    -from libc.math cimport exp
    -cimport cython
     cimport cython.parallel
     import cytoolz
    -import dill
    -
     import numpy.random
     cimport numpy as np
    -
    -from libcpp.vector cimport vector
    -from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF
    +from cpython.ref cimport PyObject, Py_XDECREF
     from cpython.exc cimport PyErr_CheckSignals, PyErr_SetFromErrno
    -from libc.stdint cimport uint32_t, uint64_t
    -from libc.string cimport memset, memcpy
    -from libc.stdlib cimport malloc, calloc, free
    -from thinc.typedefs cimport weight_t, class_t, feat_t, atom_t, hash_t
    -from thinc.linear.avgtron cimport AveragedPerceptron
    -from thinc.linalg cimport Vec, VecVec
    -from thinc.structs cimport SparseArrayC, FeatureC, ExampleC
    -from thinc.extra.eg cimport Example
    +from libc.math cimport exp
    +from libcpp.vector cimport vector
    +from libc.string cimport memset
    +from libc.stdlib cimport calloc, free
    +from cymem.cymem cimport Pool
    +from thinc.typedefs cimport weight_t, class_t, hash_t
     from thinc.extra.search cimport Beam
    -
    -from cymem.cymem cimport Pool, Address
    -from murmurhash.mrmr cimport hash64
    -from preshed.maps cimport MapStruct
    -from preshed.maps cimport map_get
    -
    -from thinc.api import layerize, chain, clone, with_flatten
    -from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU
    +from thinc.api import chain, clone
    +from thinc.v2v import Model, Maxout, Affine
     from thinc.misc import LayerNorm
    -
    -from thinc.neural.ops import NumpyOps, CupyOps
    +from thinc.neural.ops import CupyOps
     from thinc.neural.util import get_array_module
     
    -from .. import util
    -from ..util import get_async, get_cuda_stream
    -from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts
    -from .._ml import Tok2Vec, doc2feats, rebatch
    -from .._ml import Residual, flatten
    +from .._ml import zero_init, PrecomputableMaxouts, Tok2Vec, flatten
     from .._ml import link_vectors_to_models
     from ..compat import json_dumps, copy_array
    -
    +from ..tokens.doc cimport Doc
    +from ..gold cimport GoldParse
    +from .. import util
     from .stateclass cimport StateClass
     from ._state cimport StateC
    -from . import nonproj
    -from .transition_system import OracleError
    -from .transition_system cimport TransitionSystem, Transition
    -from ..structs cimport TokenC
    -from ..tokens.doc cimport Doc
    -from ..strings cimport StringStore
    -from ..gold cimport GoldParse
    -from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG
    -from . import _beam_utils
    +from .transition_system cimport Transition
    +from . import _beam_utils, nonproj
     
     
     def get_templates(*args, **kwargs):
         return []
     
    +
     DEBUG = False
    +
    +
     def set_debug(val):
         global DEBUG
         DEBUG = val
    @@ -100,7 +77,8 @@ cdef class precompute_hiddens:
         cdef object _cuda_stream
         cdef object _bp_hiddens
     
    -    def __init__(self, batch_size, tokvecs, lower_model, cuda_stream=None, drop=0.):
    +    def __init__(self, batch_size, tokvecs, lower_model, cuda_stream=None,
    +                 drop=0.):
             gpu_cached, bp_features = lower_model.begin_update(tokvecs, drop=drop)
             cdef np.ndarray cached
             if not isinstance(gpu_cached, numpy.ndarray):
    @@ -120,8 +98,7 @@ cdef class precompute_hiddens:
             self._bp_hiddens = bp_features
     
         cdef const float* get_feat_weights(self) except NULL:
    -        if not self._is_synchronized \
    -        and self._cuda_stream is not None:
    +        if not self._is_synchronized and self._cuda_stream is not None:
                 self._cuda_stream.synchronize()
                 self._is_synchronized = True
             return self._cached.data
    @@ -130,7 +107,8 @@ cdef class precompute_hiddens:
             return self.begin_update(X)[0]
     
         def begin_update(self, token_ids, drop=0.):
    -        cdef np.ndarray state_vector = numpy.zeros((token_ids.shape[0], self.nO*self.nP), dtype='f')
    +        cdef np.ndarray state_vector = numpy.zeros(
    +            (token_ids.shape[0], self.nO*self.nP), dtype='f')
             # This is tricky, but (assuming GPU available);
             # - Input to forward on CPU
             # - Output from forward on CPU
    @@ -141,8 +119,8 @@ cdef class precompute_hiddens:
             feat_weights = self.get_feat_weights()
             cdef int[:, ::1] ids = token_ids
             sum_state_features(state_vector.data,
    -            feat_weights, &ids[0,0],
    -            token_ids.shape[0], self.nF, self.nO*self.nP)
    +                           feat_weights, &ids[0, 0],
    +                           token_ids.shape[0], self.nF, self.nO*self.nP)
             state_vector, bp_nonlinearity = self._nonlinearity(state_vector)
     
             def backward(d_state_vector, sgd=None):
    @@ -161,10 +139,11 @@ cdef class precompute_hiddens:
             state_vector = state_vector.reshape(
                 (state_vector.shape[0], state_vector.shape[1]//self.nP, self.nP))
             best, which = self.ops.maxout(state_vector)
    +
             def backprop(d_best, sgd=None):
                 return self.ops.backprop_maxout(d_best, which, self.nP)
    -        return best, backprop
     
    +        return best, backprop
     
     
     cdef void sum_state_features(float* output,
    @@ -239,11 +218,15 @@ cdef class Parser:
             depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
             if depth != 1:
                 raise ValueError("Currently parser depth is hard-coded to 1.")
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces',
    +                                            cfg.get('maxout_pieces', 2))
             if parser_maxout_pieces != 2:
    -            raise ValueError("Currently parser_maxout_pieces is hard-coded to 2")
    -        token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128))
    -        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200))
    +            raise ValueError("Currently parser_maxout_pieces is hard-coded "
    +                             "to 2")
    +        token_vector_width = util.env_opt('token_vector_width',
    +                                          cfg.get('token_vector_width', 128))
    +        hidden_width = util.env_opt('hidden_width',
    +                                    cfg.get('hidden_width', 200))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
             hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0))
             hist_width = util.env_opt('history_width', cfg.get('hist_width', 0))
    @@ -365,8 +348,8 @@ cdef class Parser:
                         parse_states = self.parse_batch(subbatch)
                         beams = []
                     else:
    -                    beams = self.beam_parse(subbatch,
    -                                beam_width=beam_width, beam_density=beam_density)
    +                    beams = self.beam_parse(subbatch, beam_width=beam_width,
    +                                            beam_density=beam_density)
                         parse_states = []
                         for beam in beams:
                             parse_states.append(beam.at(0))
    @@ -386,9 +369,9 @@ cdef class Parser:
             if isinstance(docs, Doc):
                 docs = [docs]
     
    -        cuda_stream = get_cuda_stream()
    -        (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream,
    -                                                                            0.0)
    +        cuda_stream = util.get_cuda_stream()
    +        (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(
    +            docs, cuda_stream, 0.0)
             nr_state = len(docs)
             nr_class = self.moves.n_moves
             nr_dim = tokvecs.shape[1]
    @@ -402,7 +385,8 @@ cdef class Parser:
     
             feat_weights = state2vec.get_feat_weights()
             cdef int i
    -        cdef np.ndarray hidden_weights = numpy.ascontiguousarray(vec2scores._layers[-1].W.T)
    +        cdef np.ndarray hidden_weights = numpy.ascontiguousarray(
    +            vec2scores._layers[-1].W.T)
             cdef np.ndarray hidden_bias = vec2scores._layers[-1].b
     
             hW = hidden_weights.data
    @@ -462,9 +446,9 @@ cdef class Parser:
             cdef Doc doc
             cdef int nr_class = self.moves.n_moves
             cdef StateClass stcls, output
    -        cuda_stream = get_cuda_stream()
    -        (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream,
    -                                                                            0.0)
    +        cuda_stream = util.get_cuda_stream()
    +        (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(
    +            docs, cuda_stream, 0.0)
             beams = []
             cdef int offset = 0
             cdef int j = 0
    @@ -519,9 +503,7 @@ cdef class Parser:
             if isinstance(docs, Doc) and isinstance(golds, GoldParse):
                 docs = [docs]
                 golds = [golds]
    -
    -        cuda_stream = get_cuda_stream()
    -
    +        cuda_stream = util.get_cuda_stream()
             states, golds, max_steps = self._init_gold_batch(docs, golds)
             (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream,
                                                                                 drop)
    @@ -536,7 +518,6 @@ cdef class Parser:
             n_steps = 0
             while todo:
                 states, golds = zip(*todo)
    -
                 token_ids = self.get_token_ids(states)
                 vector, bp_vector = state2vec.begin_update(token_ids, drop=0.0)
                 if drop != 0:
    @@ -558,8 +539,8 @@ cdef class Parser:
                 and not isinstance(token_ids, state2vec.ops.xp.ndarray):
                     # Move token_ids and d_vector to GPU, asynchronously
                     backprops.append((
    -                    get_async(cuda_stream, token_ids),
    -                    get_async(cuda_stream, d_vector),
    +                    util.get_async(cuda_stream, token_ids),
    +                    util.get_async(cuda_stream, d_vector),
                         bp_vector
                     ))
                 else:
    @@ -592,15 +573,13 @@ cdef class Parser:
             states = self.moves.init_batch(docs)
             for gold in golds:
                 self.moves.preprocess_gold(gold)
    -
    -        cuda_stream = get_cuda_stream()
    -        (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, drop)
    -
    -        states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500,
    -                                        states, golds,
    -                                        state2vec, vec2scores,
    -                                        width, density, self.cfg.get('hist_size', 0),
    -                                        drop=drop, losses=losses)
    +        cuda_stream = util.get_cuda_stream()
    +        (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(
    +            docs, cuda_stream, drop)
    +        states_d_scores, backprops = _beam_utils.update_beam(
    +            self.moves, self.nr_feature, 500, states, golds, state2vec,
    +            vec2scores, width, density, self.cfg.get('hist_size', 0),
    +            drop=drop, losses=losses)
             backprop_lower = []
             cdef float batch_size = len(docs)
             for i, d_scores in enumerate(states_d_scores):
    @@ -612,13 +591,14 @@ cdef class Parser:
                 if isinstance(self.model[0].ops, CupyOps) \
                 and not isinstance(ids, state2vec.ops.xp.ndarray):
                     backprop_lower.append((
    -                    get_async(cuda_stream, ids),
    -                    get_async(cuda_stream, d_vector),
    +                    util.get_async(cuda_stream, ids),
    +                    util.get_async(cuda_stream, d_vector),
                         bp_vectors))
                 else:
                     backprop_lower.append((ids, d_vector, bp_vectors))
             d_tokvecs = self.model[0].ops.allocate(tokvecs.shape)
    -        self._make_updates(d_tokvecs, bp_tokvecs, backprop_lower, sgd, cuda_stream)
    +        self._make_updates(d_tokvecs, bp_tokvecs, backprop_lower, sgd,
    +                           cuda_stream)
     
         def _init_gold_batch(self, whole_docs, whole_golds):
             """Make a square batch, of length equal to the shortest doc. A long
    @@ -768,7 +748,8 @@ cdef class Parser:
         def begin_training(self, gold_tuples, pipeline=None, **cfg):
             if 'model' in cfg:
                 self.model = cfg['model']
    -        gold_tuples = nonproj.preprocess_training_data(gold_tuples, label_freq_cutoff=100)
    +        gold_tuples = nonproj.preprocess_training_data(gold_tuples,
    +                                                       label_freq_cutoff=100)
             actions = self.moves.get_actions(gold_parses=gold_tuples)
             for action, labels in actions.items():
                 for label in labels:
    diff --git a/spacy/syntax/nonproj.pyx b/spacy/syntax/nonproj.pyx
    index 499effcda..404f1bc90 100644
    --- a/spacy/syntax/nonproj.pyx
    +++ b/spacy/syntax/nonproj.pyx
    @@ -1,39 +1,37 @@
     # coding: utf-8
    -"""
    -Implements the projectivize/deprojectivize mechanism in Nivre & Nilsson 2005
    +"""Implements the projectivize/deprojectivize mechanism in Nivre & Nilsson 2005
     for doing pseudo-projective parsing implementation uses the HEAD decoration
     scheme.
     """
     from __future__ import unicode_literals
    +
     from copy import copy
     
    -from ..tokens.doc cimport Doc
    -from ..attrs import DEP, HEAD
     
     DELIMITER = '||'
     
     
     def ancestors(tokenid, heads):
    -    # returns all words going from the word up the path to the root
    -    # the path to root cannot be longer than the number of words in the sentence
    -    # this function ends after at most len(heads) steps
    -    # because it would otherwise loop indefinitely on cycles
    +    # Returns all words going from the word up the path to the root. The path
    +    # to root cannot be longer than the number of words in the  sentence. This
    +    # function ends after at most len(heads) steps, because it would otherwise
    +    # loop indefinitely on cycles.
         head = tokenid
         cnt = 0
         while heads[head] != head and cnt < len(heads):
             head = heads[head]
             cnt += 1
             yield head
    -        if head == None:
    +        if head is None:
                 break
     
     
     def contains_cycle(heads):
    -    # in an acyclic tree, the path from each word following
    -    # the head relation upwards always ends at the root node
    +    # in an acyclic tree, the path from each word following the head relation
    +    # upwards always ends at the root node
         for tokenid in range(len(heads)):
             seen = set([tokenid])
    -        for ancestor in ancestors(tokenid,heads):
    +        for ancestor in ancestors(tokenid, heads):
                 if ancestor in seen:
                     return seen
                 seen.add(ancestor)
    @@ -45,26 +43,26 @@ def is_nonproj_arc(tokenid, heads):
         # if there is a token k, h < k < d such that h is not
         # an ancestor of k. Same for h -> d, h > d
         head = heads[tokenid]
    -    if head == tokenid: # root arcs cannot be non-projective
    +    if head == tokenid:  # root arcs cannot be non-projective
             return False
    -    elif head == None: # unattached tokens cannot be non-projective
    +    elif head is None:  # unattached tokens cannot be non-projective
             return False
     
         start, end = (head+1, tokenid) if head < tokenid else (tokenid+1, head)
    -    for k in range(start,end):
    -        for ancestor in ancestors(k,heads):
    -            if ancestor == None: # for unattached tokens/subtrees
    +    for k in range(start, end):
    +        for ancestor in ancestors(k, heads):
    +            if ancestor is None:  # for unattached tokens/subtrees
                     break
    -            elif ancestor == head: # normal case: k dominated by h
    +            elif ancestor == head:  # normal case: k dominated by h
                     break
    -        else: # head not in ancestors: d -> h is non-projective
    +        else:  # head not in ancestors: d -> h is non-projective
                 return True
         return False
     
     
     def is_nonproj_tree(heads):
         # a tree is non-projective if at least one arc is non-projective
    -    return any( is_nonproj_arc(word,heads) for word in range(len(heads)) )
    +    return any(is_nonproj_arc(word, heads) for word in range(len(heads)))
     
     
     def decompose(label):
    @@ -81,32 +79,32 @@ def preprocess_training_data(gold_tuples, label_freq_cutoff=30):
         for raw_text, sents in gold_tuples:
             prepro_sents = []
             for (ids, words, tags, heads, labels, iob), ctnts in sents:
    -            proj_heads,deco_labels = projectivize(heads,labels)
    +            proj_heads, deco_labels = projectivize(heads, labels)
                 # set the label to ROOT for each root dependent
    -            deco_labels = [ 'ROOT' if head == i else deco_labels[i] for i,head in enumerate(proj_heads) ]
    +            deco_labels = ['ROOT' if head == i else deco_labels[i]
    +                           for i, head in enumerate(proj_heads)]
                 # count label frequencies
                 if label_freq_cutoff > 0:
                     for label in deco_labels:
                         if is_decorated(label):
    -                        freqs[label] = freqs.get(label,0) + 1
    -            prepro_sents.append(((ids,words,tags,proj_heads,deco_labels,iob), ctnts))
    +                        freqs[label] = freqs.get(label, 0) + 1
    +            prepro_sents.append(
    +                ((ids, words, tags, proj_heads, deco_labels, iob), ctnts))
             preprocessed.append((raw_text, prepro_sents))
    -
         if label_freq_cutoff > 0:
    -        return _filter_labels(preprocessed,label_freq_cutoff,freqs)
    +        return _filter_labels(preprocessed, label_freq_cutoff, freqs)
         return preprocessed
     
     
     def projectivize(heads, labels):
    -    # use the algorithm by Nivre & Nilsson 2005
    -    # assumes heads to be a proper tree, i.e. connected and cycle-free
    -    # returns a new pair (heads,labels) which encode
    -    # a projective and decorated tree
    +    # Use the algorithm by Nivre & Nilsson 2005. Assumes heads to be a proper
    +    # tree, i.e. connected and cycle-free. Returns a new pair (heads, labels)
    +    # which encode a projective and decorated tree.
         proj_heads = copy(heads)
         smallest_np_arc = _get_smallest_nonproj_arc(proj_heads)
    -    if smallest_np_arc == None: # this sentence is already projective
    +    if smallest_np_arc is None:  # this sentence is already projective
             return proj_heads, copy(labels)
    -    while smallest_np_arc != None:
    +    while smallest_np_arc is not None:
             _lift(smallest_np_arc, proj_heads)
             smallest_np_arc = _get_smallest_nonproj_arc(proj_heads)
         deco_labels = _decorate(heads, proj_heads, labels)
    @@ -114,24 +112,26 @@ def projectivize(heads, labels):
     
     
     def deprojectivize(tokens):
    -    # reattach arcs with decorated labels (following HEAD scheme)
    -    # for each decorated arc X||Y, search top-down, left-to-right,
    -    # breadth-first until hitting a Y then make this the new head
    +    # Reattach arcs with decorated labels (following HEAD scheme). For each
    +    # decorated arc X||Y, search top-down, left-to-right, breadth-first until
    +    # hitting a Y then make this the new head.
         for token in tokens:
             if is_decorated(token.dep_):
    -            newlabel,headlabel = decompose(token.dep_)
    -            newhead = _find_new_head(token,headlabel)
    +            newlabel, headlabel = decompose(token.dep_)
    +            newhead = _find_new_head(token, headlabel)
                 token.head = newhead
                 token.dep_ = newlabel
         return tokens
     
    +
     def _decorate(heads, proj_heads, labels):
         # uses decoration scheme HEAD from Nivre & Nilsson 2005
         assert(len(heads) == len(proj_heads) == len(labels))
         deco_labels = []
    -    for tokenid,head in enumerate(heads):
    +    for tokenid, head in enumerate(heads):
             if head != proj_heads[tokenid]:
    -            deco_labels.append('%s%s%s' % (labels[tokenid], DELIMITER, labels[head]))
    +            deco_labels.append(
    +                '%s%s%s' % (labels[tokenid], DELIMITER, labels[head]))
             else:
                 deco_labels.append(labels[tokenid])
         return deco_labels
    @@ -143,9 +143,9 @@ def _get_smallest_nonproj_arc(heads):
         # and ties are broken left to right
         smallest_size = float('inf')
         smallest_np_arc = None
    -    for tokenid,head in enumerate(heads):
    +    for tokenid, head in enumerate(heads):
             size = abs(tokenid-head)
    -        if size < smallest_size and is_nonproj_arc(tokenid,heads):
    +        if size < smallest_size and is_nonproj_arc(tokenid, heads):
                 smallest_size = size
                 smallest_np_arc = tokenid
         return smallest_np_arc
    @@ -168,8 +168,10 @@ def _find_new_head(token, headlabel):
             next_queue = []
             for qtoken in queue:
                 for child in qtoken.children:
    -                if child.is_space: continue
    -                if child == token: continue
    +                if child.is_space:
    +                    continue
    +                if child == token:
    +                    continue
                     if child.dep_ == headlabel:
                         return child
                     next_queue.append(child)
    @@ -184,7 +186,10 @@ def _filter_labels(gold_tuples, cutoff, freqs):
         for raw_text, sents in gold_tuples:
             filtered_sents = []
             for (ids, words, tags, heads, labels, iob), ctnts in sents:
    -            filtered_labels = [ decompose(label)[0] if freqs.get(label,cutoff) < cutoff else label for label in labels ]
    -            filtered_sents.append(((ids,words,tags,heads,filtered_labels,iob), ctnts))
    +            filtered_labels = [decompose(label)[0]
    +                               if freqs.get(label, cutoff) < cutoff
    +                               else label for label in labels]
    +            filtered_sents.append(
    +                ((ids, words, tags, heads, filtered_labels, iob), ctnts))
             filtered.append((raw_text, filtered_sents))
         return filtered
    diff --git a/spacy/syntax/stateclass.pyx b/spacy/syntax/stateclass.pyx
    index ddd1f558c..ea0ec77e5 100644
    --- a/spacy/syntax/stateclass.pyx
    +++ b/spacy/syntax/stateclass.pyx
    @@ -2,17 +2,8 @@
     # cython: infer_types=True
     from __future__ import unicode_literals
     
    -from libc.string cimport memcpy, memset
    -from libc.stdint cimport uint32_t, uint64_t
     import numpy
     
    -from ..vocab cimport EMPTY_LEXEME
    -from ..structs cimport Entity
    -from ..lexeme cimport Lexeme
    -from ..symbols cimport punct
    -from ..attrs cimport IS_SPACE
    -from ..attrs cimport attr_id_t
    -from ..tokens.token cimport Token
     from ..tokens.doc cimport Doc
     
     
    diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx
    index 922fdf97c..c351636c4 100644
    --- a/spacy/syntax/transition_system.pyx
    +++ b/spacy/syntax/transition_system.pyx
    @@ -2,17 +2,17 @@
     # coding: utf-8
     from __future__ import unicode_literals
     
    -from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF
    +from cpython.ref cimport Py_INCREF
     from cymem.cymem cimport Pool
     from thinc.typedefs cimport weight_t
    -from collections import defaultdict, OrderedDict
    +from collections import OrderedDict
     import ujson
     
    -from .. import util
     from ..structs cimport TokenC
     from .stateclass cimport StateClass
    -from ..attrs cimport TAG, HEAD, DEP, ENT_TYPE, ENT_IOB
     from ..typedefs cimport attr_t
    +from ..compat import json_dumps
    +from .. import util
     
     
     cdef weight_t MIN_SCORE = -90000
    @@ -136,11 +136,12 @@ cdef class TransitionSystem:
                 print([gold.c.ner[i].clas for i in range(gold.length)])
                 print([gold.c.ner[i].move for i in range(gold.length)])
                 print([gold.c.ner[i].label for i in range(gold.length)])
    -            print("Self labels", [self.c[i].label for i in range(self.n_moves)])
    +            print("Self labels",
    +                  [self.c[i].label for i in range(self.n_moves)])
                 raise ValueError(
                     "Could not find a gold-standard action to supervise "
    -                "the entity recognizer\n"
    -                "The transition system has %d actions." % (self.n_moves))
    +                "the entity recognizer. The transition system has "
    +                "%d actions." % (self.n_moves))
     
         def get_class_name(self, int clas):
             act = self.c[clas]
    @@ -149,7 +150,7 @@ cdef class TransitionSystem:
         def add_action(self, int action, label_name):
             cdef attr_t label_id
             if not isinstance(label_name, int) and \
    -        not isinstance(label_name, long):
    +           not isinstance(label_name, long):
                 label_id = self.strings.add(label_name)
             else:
                 label_id = label_name
    @@ -186,7 +187,7 @@ cdef class TransitionSystem:
                     'name': self.move_name(trans.move, trans.label)
                 })
             serializers = {
    -            'transitions': lambda: ujson.dumps(transitions),
    +            'transitions': lambda: json_dumps(transitions),
                 'strings': lambda: self.strings.to_bytes()
             }
             return util.to_bytes(serializers, exclude)
    
    From ba5e646219db6accc123145e0f9163494febee54 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 20:29:08 +0200
    Subject: [PATCH 589/649] Tidy up pipeline
    
    ---
     spacy/pipeline.pyx | 126 +++++++++++++++++++++------------------------
     1 file changed, 59 insertions(+), 67 deletions(-)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 89d99926a..842e27069 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -3,26 +3,17 @@
     # coding: utf8
     from __future__ import unicode_literals
     
    -from thinc.api import chain, layerize, with_getitem
     import numpy
     cimport numpy as np
     import cytoolz
    -import util
     from collections import OrderedDict
     import ujson
     import msgpack
     
    -from thinc.api import add, layerize, chain, clone, concatenate, with_flatten
    -from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU
    -from thinc.i2v import HashEmbed
    -from thinc.t2v import Pooling, max_pool, mean_pool, sum_pool
    -from thinc.t2t import ExtractWindow, ParametricAttention
    -from thinc.misc import Residual
    -from thinc.misc import BatchNorm as BN
    -from thinc.misc import LayerNorm as LN
    -
    +from thinc.api import chain
    +from thinc.v2v import Softmax
    +from thinc.t2v import Pooling, max_pool, mean_pool
     from thinc.neural.util import to_categorical
    -
     from thinc.neural._classes.difference import Siamese, CauchySimilarity
     
     from .tokens.doc cimport Doc
    @@ -30,29 +21,23 @@ from .syntax.nn_parser cimport Parser
     from .syntax import nonproj
     from .syntax.ner cimport BiluoPushDown
     from .syntax.arc_eager cimport ArcEager
    -from .tagger import Tagger
    -from .syntax.stateclass cimport StateClass
    -from .gold cimport GoldParse
     from .morphology cimport Morphology
     from .vocab cimport Vocab
     from .syntax import nonproj
     from .compat import json_dumps
     
    -from .attrs import ID, LOWER, PREFIX, SUFFIX, SHAPE, TAG, DEP, POS
    -from ._ml import rebatch, Tok2Vec, flatten
    -from ._ml import build_text_classifier, build_tagger_model
    -from ._ml import link_vectors_to_models
    +from .attrs import POS
     from .parts_of_speech import X
    +from ._ml import Tok2Vec, build_text_classifier, build_tagger_model
    +from ._ml import link_vectors_to_models
    +from . import util
     
     
     class SentenceSegmenter(object):
         """A simple spaCy hook, to allow custom sentence boundary detection logic
    -    (that doesn't require the dependency parse).
    -
    -    To change the sentence boundary detection strategy, pass a generator
    -    function `strategy` on initialization, or assign a new strategy to
    -    the .strategy attribute.
    -
    +    (that doesn't require the dependency parse). To change the sentence
    +    boundary detection strategy, pass a generator function `strategy` on
    +    initialization, or assign a new strategy to the .strategy attribute.
         Sentence detection strategies should be generators that take `Doc` objects
         and yield `Span` objects for each sentence.
         """
    @@ -74,16 +59,20 @@ class SentenceSegmenter(object):
             seen_period = False
             for i, word in enumerate(doc):
                 if seen_period and not word.is_punct:
    -                yield doc[start : word.i]
    +                yield doc[start:word.i]
                     start = word.i
                     seen_period = False
                 elif word.text in ['.', '!', '?']:
                     seen_period = True
             if start < len(doc):
    -            yield doc[start : len(doc)]
    +            yield doc[start:len(doc)]
     
     
     class Pipe(object):
    +    """This class is not instantiated directly. Components inherit from it, and
    +    it defines the interface that components should follow to function as
    +    components in a spaCy analysis pipeline.
    +    """
         name = None
     
         @classmethod
    @@ -149,8 +138,7 @@ class Pipe(object):
             link_vectors_to_models(self.vocab)
     
         def use_params(self, params):
    -        """Modify the pipe's model, to use the given parameter values.
    -        """
    +        """Modify the pipe's model, to use the given parameter values."""
             with self.model.use_params(params):
                 yield
     
    @@ -235,8 +223,8 @@ class Tensorizer(Pipe):
             """Construct a new statistical model. Weights are not allocated on
             initialisation.
     
    -        vocab (Vocab): A `Vocab` instance. The model must share the same `Vocab`
    -            instance with the `Doc` objects it will process.
    +        vocab (Vocab): A `Vocab` instance. The model must share the same
    +            `Vocab` instance with the `Doc` objects it will process.
             model (Model): A `Model` instance or `True` allocate one later.
             **cfg: Config parameters.
     
    @@ -280,7 +268,7 @@ class Tensorizer(Pipe):
             """Return a single tensor for a batch of documents.
     
             docs (iterable): A sequence of `Doc` objects.
    -        RETURNS (object): Vector representations for each token in the documents.
    +        RETURNS (object): Vector representations for each token in the docs.
             """
             tokvecs = self.model(docs)
             return tokvecs
    @@ -289,7 +277,7 @@ class Tensorizer(Pipe):
             """Set the tensor attribute for a batch of documents.
     
             docs (iterable): A sequence of `Doc` objects.
    -        tokvecs (object): Vector representation for each token in the documents.
    +        tokvecs (object): Vector representation for each token in the docs.
             """
             for doc, tokvecs in zip(docs, tokvecses):
                 assert tokvecs.shape[0] == len(doc)
    @@ -328,12 +316,14 @@ class Tensorizer(Pipe):
     
     class Tagger(Pipe):
         name = 'tagger'
    +
         def __init__(self, vocab, model=True, **cfg):
             self.vocab = vocab
             self.model = model
             self.cfg = dict(cfg)
             self.cfg.setdefault('cnn_maxout_pieces', 2)
    -        self.cfg.setdefault('pretrained_dims', self.vocab.vectors.data.shape[1])
    +        self.cfg.setdefault('pretrained_dims',
    +                            self.vocab.vectors.data.shape[1])
     
         def __call__(self, doc):
             tags = self.predict([doc])
    @@ -353,8 +343,7 @@ class Tagger(Pipe):
             guesses = scores.argmax(axis=1)
             if not isinstance(guesses, numpy.ndarray):
                 guesses = guesses.get()
    -        guesses = self.model.ops.unflatten(guesses,
    -                    [len(d) for d in docs])
    +        guesses = self.model.ops.unflatten(guesses, [len(d) for d in docs])
             return guesses
     
         def set_annotations(self, docs, batch_tag_ids):
    @@ -387,8 +376,8 @@ class Tagger(Pipe):
     
         def get_loss(self, docs, golds, scores):
             scores = self.model.ops.flatten(scores)
    -        tag_index = {tag: i for i, tag in enumerate(self.vocab.morphology.tag_names)}
    -
    +        tag_index = {tag: i
    +                     for i, tag in enumerate(self.vocab.morphology.tag_names)}
             cdef int idx = 0
             correct = numpy.zeros((scores.shape[0],), dtype='i')
             guesses = scores.argmax(axis=1)
    @@ -443,17 +432,18 @@ class Tagger(Pipe):
                 serialize['model'] = self.model.to_bytes
             serialize['vocab'] = self.vocab.to_bytes
     
    -        serialize['tag_map'] = lambda: msgpack.dumps(self.vocab.morphology.tag_map,
    -                                                     use_bin_type=True,
    -                                                     encoding='utf8')
    +        serialize['tag_map'] = lambda: msgpack.dumps(
    +            self.vocab.morphology.tag_map, use_bin_type=True, encoding='utf8')
             return util.to_bytes(serialize, exclude)
     
         def from_bytes(self, bytes_data, **exclude):
             def load_model(b):
                 if self.model is True:
    -                token_vector_width = util.env_opt('token_vector_width',
    -                        self.cfg.get('token_vector_width', 128))
    -                self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg)
    +                token_vector_width = util.env_opt(
    +                    'token_vector_width',
    +                    self.cfg.get('token_vector_width', 128))
    +                self.model = self.Model(self.vocab.morphology.n_tags,
    +                                        **self.cfg)
                 self.model.from_bytes(b)
     
             def load_tag_map(b):
    @@ -509,11 +499,11 @@ class Tagger(Pipe):
     
     
     class MultitaskObjective(Tagger):
    -    '''Assist training of a parser or tagger, by training a side-objective.
    -
    -    Experimental
    -    '''
    +    """Experimental: Assist training of a parser or tagger, by training a
    +    side-objective.
    +    """
         name = 'nn_labeller'
    +
         def __init__(self, vocab, model=True, target='dep_tag_offset', **cfg):
             self.vocab = vocab
             self.model = model
    @@ -530,12 +520,12 @@ class MultitaskObjective(Tagger):
             elif hasattr(target, '__call__'):
                 self.make_label = target
             else:
    -            raise ValueError(
    -                "MultitaskObjective target should be function or one of "
    -                "['dep', 'tag', 'ent', 'dep_tag_offset', 'ent_tag']")
    +            raise ValueError("MultitaskObjective target should be function or "
    +                             "one of: dep, tag, ent, dep_tag_offset, ent_tag.")
             self.cfg = dict(cfg)
             self.cfg.setdefault('cnn_maxout_pieces', 2)
    -        self.cfg.setdefault('pretrained_dims', self.vocab.vectors.data.shape[1])
    +        self.cfg.setdefault('pretrained_dims',
    +                            self.vocab.vectors.data.shape[1])
     
         @property
         def labels(self):
    @@ -623,20 +613,19 @@ class MultitaskObjective(Tagger):
     
     class SimilarityHook(Pipe):
         """
    -    Experimental
    +    Experimental: A pipeline component to install a hook for supervised
    +    similarity into `Doc` objects. Requires a `Tensorizer` to pre-process
    +    documents. The similarity model can be any object obeying the Thinc `Model`
    +    interface. By default, the model concatenates the elementwise mean and
    +    elementwise max of the two tensors, and compares them using the
    +    Cauchy-like similarity function from Chen (2013):
     
    -    A pipeline component to install a hook for supervised similarity into
    -    Doc objects. Requires a Tensorizer to pre-process documents. The similarity
    -    model can be any object obeying the Thinc Model interface. By default,
    -    the model concatenates the elementwise mean and elementwise max of the two
    -    tensors, and compares them using the Cauchy-like similarity function
    -    from Chen (2013):
    -
    -        similarity = 1. / (1. + (W * (vec1-vec2)**2).sum())
    +        >>> similarity = 1. / (1. + (W * (vec1-vec2)**2).sum())
     
         Where W is a vector of dimension weights, initialized to 1.
         """
         name = 'similarity'
    +
         def __init__(self, vocab, model=True, **cfg):
             self.vocab = vocab
             self.model = model
    @@ -662,8 +651,7 @@ class SimilarityHook(Pipe):
             sims, bp_sims = self.model.begin_update(doc1_doc2, drop=drop)
     
         def begin_training(self, _=tuple(), pipeline=None):
    -        """
    -        Allocate model, using width from tensorizer in pipeline.
    +        """Allocate model, using width from tensorizer in pipeline.
     
             gold_tuples (iterable): Gold-standard training data.
             pipeline (list): The pipeline the model is part of.
    @@ -763,12 +751,14 @@ cdef class DependencyParser(Parser):
             for target in []:
                 labeller = MultitaskObjective(self.vocab, target=target)
                 tok2vec = self.model[0]
    -            labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec)
    +            labeller.begin_training(gold_tuples, pipeline=pipeline,
    +                                    tok2vec=tok2vec)
                 pipeline.append(labeller)
                 self._multitasks.append(labeller)
     
         def __reduce__(self):
    -        return (DependencyParser, (self.vocab, self.moves, self.model), None, None)
    +        return (DependencyParser, (self.vocab, self.moves, self.model),
    +                None, None)
     
     
     cdef class EntityRecognizer(Parser):
    @@ -781,12 +771,14 @@ cdef class EntityRecognizer(Parser):
             for target in []:
                 labeller = MultitaskObjective(self.vocab, target=target)
                 tok2vec = self.model[0]
    -            labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec)
    +            labeller.begin_training(gold_tuples, pipeline=pipeline,
    +                                    tok2vec=tok2vec)
                 pipeline.append(labeller)
                 self._multitasks.append(labeller)
     
         def __reduce__(self):
    -        return (EntityRecognizer, (self.vocab, self.moves, self.model), None, None)
    +        return (EntityRecognizer, (self.vocab, self.moves, self.model),
    +                None, None)
     
     
     __all__ = ['Tagger', 'DependencyParser', 'EntityRecognizer', 'Tensorizer']
    
    From a8e10f94e47f6e01166622f04f9ef9200dc286d1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 21:07:50 +0200
    Subject: [PATCH 590/649] Tidy up Lexeme and update docs
    
    ---
     spacy/lexeme.pyx        | 344 +++++++++++++++++++++++++++++-----------
     website/api/lexeme.jade |  95 +++++++++--
     website/api/token.jade  |   2 +-
     3 files changed, 337 insertions(+), 104 deletions(-)
    
    diff --git a/spacy/lexeme.pyx b/spacy/lexeme.pyx
    index f0f5c6398..88748af33 100644
    --- a/spacy/lexeme.pyx
    +++ b/spacy/lexeme.pyx
    @@ -2,27 +2,17 @@
     # coding: utf8
     from __future__ import unicode_literals, print_function
     
    -from libc.math cimport sqrt
    -from cpython.ref cimport Py_INCREF
    -from cymem.cymem cimport Pool
    -from murmurhash.mrmr cimport hash64
    -
     # Compiler crashes on memory view coercion without this. Should report bug.
     from cython.view cimport array as cvarray
     cimport numpy as np
     np.import_array()
    -
     from libc.string cimport memset
     import numpy
     
     from .typedefs cimport attr_t, flags_t
     from .attrs cimport IS_ALPHA, IS_ASCII, IS_DIGIT, IS_LOWER, IS_PUNCT, IS_SPACE
     from .attrs cimport IS_TITLE, IS_UPPER, LIKE_URL, LIKE_NUM, LIKE_EMAIL, IS_STOP
    -from .attrs cimport IS_BRACKET
    -from .attrs cimport IS_QUOTE
    -from .attrs cimport IS_LEFT_PUNCT
    -from .attrs cimport IS_RIGHT_PUNCT
    -from .attrs cimport IS_OOV
    +from .attrs cimport IS_BRACKET, IS_QUOTE, IS_LEFT_PUNCT, IS_RIGHT_PUNCT, IS_OOV
     from . import about
     
     
    @@ -32,8 +22,8 @@ memset(&EMPTY_LEXEME, 0, sizeof(LexemeC))
     cdef class Lexeme:
         """An entry in the vocabulary. A `Lexeme` has no string context – it's a
         word-type, as opposed to a word token.  It therefore has no part-of-speech
    -    tag, dependency parse, or lemma (lemmatization depends on the part-of-speech
    -    tag).
    +    tag, dependency parse, or lemma (lemmatization depends on the
    +    part-of-speech tag).
         """
         def __init__(self, Vocab vocab, attr_t orth):
             """Create a Lexeme object.
    @@ -60,17 +50,17 @@ cdef class Lexeme:
             else:
                 a = 0
                 b = 1
    -        if op == 2: # ==
    +        if op == 2:  # ==
                 return a == b
    -        elif op == 3: # !=
    +        elif op == 3:  # !=
                 return a != b
    -        elif op == 0: # <
    +        elif op == 0:  # <
                 return a < b
    -        elif op == 1: # <=
    +        elif op == 1:  # <=
                 return a <= b
    -        elif op == 4: # >
    +        elif op == 4:  # >
                 return a > b
    -        elif op == 5: # >=
    +        elif op == 5:  # >=
                 return a >= b
             else:
                 raise NotImplementedError(op)
    @@ -104,7 +94,8 @@ cdef class Lexeme:
             """
             if self.vector_norm == 0 or other.vector_norm == 0:
                 return 0.0
    -        return numpy.dot(self.vector, other.vector) / (self.vector_norm * other.vector_norm)
    +        return (numpy.dot(self.vector, other.vector) /
    +                (self.vector_norm * other.vector_norm))
     
         def to_bytes(self):
             lex_data = Lexeme.c_to_bytes(self.c)
    @@ -130,19 +121,13 @@ cdef class Lexeme:
             self.orth = self.c.orth
     
         property has_vector:
    -        """A boolean value indicating whether a word vector is associated with
    -        the object.
    -
    -        RETURNS (bool): Whether a word vector is associated with the object.
    +        """RETURNS (bool): Whether a word vector is associated with the object.
             """
             def __get__(self):
                 return self.vocab.has_vector(self.c.orth)
     
         property vector_norm:
    -        """The L2 norm of the lexeme's vector representation.
    -
    -        RETURNS (float): The L2 norm of the vector representation.
    -        """
    +        """RETURNS (float): The L2 norm of the vector representation."""
             def __get__(self):
                 vector = self.vector
                 return numpy.sqrt((vector**2).sum())
    @@ -169,149 +154,320 @@ cdef class Lexeme:
                 self.vocab.set_vector(self.c.orth, vector)
     
         property rank:
    +        """RETURNS (unicode): Sequential ID of the lexemes's lexical type, used
    +            to index into tables, e.g. for word vectors."""
             def __get__(self):
                 return self.c.id
    +
             def __set__(self, value):
                 self.c.id = value
     
         property sentiment:
    +        """RETURNS (float): A scalar value indicating the positivity or
    +            negativity of the lexeme."""
             def __get__(self):
                 return self.c.sentiment
    +
             def __set__(self, float sentiment):
                 self.c.sentiment = sentiment
     
         property orth_:
    +        """RETURNS (unicode): The original verbatim text of the lexeme
    +            (identical to `Lexeme.text`). Exists mostly for consistency with
    +            the other attributes."""
             def __get__(self):
                 return self.vocab.strings[self.c.orth]
     
         property text:
    -        """A unicode representation of the token text.
    -
    -        RETURNS (unicode): The original verbatim text of the token.
    -        """
    +        """RETURNS (unicode): The original verbatim text of the lexeme."""
             def __get__(self):
                 return self.orth_
     
         property lower:
    -        def __get__(self): return self.c.lower
    -        def __set__(self, attr_t x): self.c.lower = x
    +        """RETURNS (unicode): Lowercase form of the lexeme."""
    +        def __get__(self):
    +            return self.c.lower
    +
    +        def __set__(self, attr_t x):
    +            self.c.lower = x
     
         property norm:
    -        def __get__(self): return self.c.norm
    -        def __set__(self, attr_t x): self.c.norm = x
    +        """RETURNS (uint64): The lexemes's norm, i.e. a normalised form of the
    +            lexeme text.
    +        """
    +        def __get__(self):
    +                return self.c.norm
    +
    +        def __set__(self, attr_t x):
    +            self.c.norm = x
     
         property shape:
    -        def __get__(self): return self.c.shape
    -        def __set__(self, attr_t x): self.c.shape = x
    +        """RETURNS (uint64): Transform of the word's string, to show
    +            orthographic features.
    +        """
    +        def __get__(self):
    +            return self.c.shape
    +
    +        def __set__(self, attr_t x):
    +            self.c.shape = x
     
         property prefix:
    -        def __get__(self): return self.c.prefix
    -        def __set__(self, attr_t x): self.c.prefix = x
    +        """RETURNS (uint64): Length-N substring from the start of the word.
    +            Defaults to `N=1`.
    +        """
    +        def __get__(self):
    +            return self.c.prefix
    +
    +        def __set__(self, attr_t x):
    +            self.c.prefix = x
     
         property suffix:
    -        def __get__(self): return self.c.suffix
    -        def __set__(self, attr_t x): self.c.suffix = x
    +        """RETURNS (uint64): Length-N substring from the end of the word.
    +            Defaults to `N=3`.
    +        """
    +        def __get__(self):
    +            return self.c.suffix
    +
    +        def __set__(self, attr_t x):
    +            self.c.suffix = x
     
         property cluster:
    -        def __get__(self): return self.c.cluster
    -        def __set__(self, attr_t x): self.c.cluster = x
    +        """RETURNS (int): Brown cluster ID."""
    +        def __get__(self):
    +            return self.c.cluster
    +
    +        def __set__(self, attr_t x):
    +            self.c.cluster = x
     
         property lang:
    -        def __get__(self): return self.c.lang
    -        def __set__(self, attr_t x): self.c.lang = x
    +        """RETURNS (uint64): Language of the parent vocabulary."""
    +        def __get__(self):
    +            return self.c.lang
    +
    +        def __set__(self, attr_t x):
    +            self.c.lang = x
     
         property prob:
    -        def __get__(self): return self.c.prob
    -        def __set__(self, float x): self.c.prob = x
    +        """RETURNS (float): Smoothed log probability estimate of the lexeme's
    +            type."""
    +        def __get__(self):
    +            return self.c.prob
    +
    +        def __set__(self, float x):
    +            self.c.prob = x
     
         property lower_:
    -        def __get__(self): return self.vocab.strings[self.c.lower]
    -        def __set__(self, unicode x): self.c.lower = self.vocab.strings.add(x)
    +        """RETURNS (unicode): Lowercase form of the word."""
    +        def __get__(self):
    +            return self.vocab.strings[self.c.lower]
    +
    +        def __set__(self, unicode x):
    +            self.c.lower = self.vocab.strings.add(x)
     
         property norm_:
    -        def __get__(self): return self.vocab.strings[self.c.norm]
    -        def __set__(self, unicode x): self.c.norm = self.vocab.strings.add(x)
    +        """RETURNS (unicode): The lexemes's norm, i.e. a normalised form of the
    +            lexeme text.
    +        """
    +        def __get__(self):
    +            return self.vocab.strings[self.c.norm]
    +
    +        def __set__(self, unicode x):
    +            self.c.norm = self.vocab.strings.add(x)
     
         property shape_:
    -        def __get__(self): return self.vocab.strings[self.c.shape]
    -        def __set__(self, unicode x): self.c.shape = self.vocab.strings.add(x)
    +        """RETURNS (unicode): Transform of the word's string, to show
    +            orthographic features.
    +        """
    +        def __get__(self):
    +            return self.vocab.strings[self.c.shape]
    +
    +        def __set__(self, unicode x):
    +            self.c.shape = self.vocab.strings.add(x)
     
         property prefix_:
    -        def __get__(self): return self.vocab.strings[self.c.prefix]
    -        def __set__(self, unicode x): self.c.prefix = self.vocab.strings.add(x)
    +        """RETURNS (unicode): Length-N substring from the start of the word.
    +            Defaults to `N=1`.
    +        """
    +        def __get__(self):
    +            return self.vocab.strings[self.c.prefix]
    +
    +        def __set__(self, unicode x):
    +            self.c.prefix = self.vocab.strings.add(x)
     
         property suffix_:
    -        def __get__(self): return self.vocab.strings[self.c.suffix]
    -        def __set__(self, unicode x): self.c.suffix = self.vocab.strings.add(x)
    +        """RETURNS (unicode): Length-N substring from the end of the word.
    +            Defaults to `N=3`.
    +        """
    +        def __get__(self):
    +            return self.vocab.strings[self.c.suffix]
    +
    +        def __set__(self, unicode x):
    +            self.c.suffix = self.vocab.strings.add(x)
     
         property lang_:
    -        def __get__(self): return self.vocab.strings[self.c.lang]
    -        def __set__(self, unicode x): self.c.lang = self.vocab.strings.add(x)
    +        """RETURNS (unicode): Language of the parent vocabulary."""
    +        def __get__(self):
    +            return self.vocab.strings[self.c.lang]
    +
    +        def __set__(self, unicode x):
    +            self.c.lang = self.vocab.strings.add(x)
     
         property flags:
    -        def __get__(self): return self.c.flags
    -        def __set__(self, flags_t x): self.c.flags = x
    +        """RETURNS (uint64): Container of the lexeme's binary flags."""
    +        def __get__(self):
    +            return self.c.flags
    +
    +        def __set__(self, flags_t x):
    +            self.c.flags = x
     
         property is_oov:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_OOV)
    -        def __set__(self, attr_t x): Lexeme.c_set_flag(self.c, IS_OOV, x)
    +        """RETURNS (bool): Whether the lexeme is out-of-vocabulary."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_OOV)
    +
    +        def __set__(self, attr_t x):
    +            Lexeme.c_set_flag(self.c, IS_OOV, x)
     
         property is_stop:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_STOP)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_STOP, x)
    +        """RETURNS (bool): Whether the lexeme is a stop word."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_STOP)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_STOP, x)
     
         property is_alpha:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_ALPHA)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_ALPHA, x)
    +        """RETURNS (bool): Whether the lexeme consists of alphanumeric
    +            characters. Equivalent to `lexeme.text.isalpha()`.
    +        """
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_ALPHA)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_ALPHA, x)
     
         property is_ascii:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_ASCII)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_ASCII, x)
    +        """RETURNS (bool): Whether the lexeme consists of ASCII characters.
    +            Equivalent to `[any(ord(c) >= 128 for c in lexeme.text)]`.
    +        """
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_ASCII)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_ASCII, x)
     
         property is_digit:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_DIGIT)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_DIGIT, x)
    +        """RETURNS (bool): Whether the lexeme consists of digits. Equivalent
    +            to `lexeme.text.isdigit()`.
    +        """
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_DIGIT)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_DIGIT, x)
     
         property is_lower:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_LOWER)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_LOWER, x)
    +        """RETURNS (bool): Whether the lexeme is in lowercase. Equivalent to
    +            `lexeme.text.islower()`.
    +        """
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_LOWER)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_LOWER, x)
    +
    +    property is_upper:
    +        """RETURNS (bool): Whether the lexeme is in uppercase. Equivalent to
    +            `lexeme.text.isupper()`.
    +        """
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_UPPER)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_UPPER, x)
     
         property is_title:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_TITLE)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_TITLE, x)
    +        """RETURNS (bool): Whether the lexeme is in titlecase. Equivalent to
    +            `lexeme.text.istitle()`.
    +        """
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_TITLE)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_TITLE, x)
     
         property is_punct:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_PUNCT)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_PUNCT, x)
    +        """RETURNS (bool): Whether the lexeme is punctuation."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_PUNCT)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_PUNCT, x)
     
         property is_space:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_SPACE)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_SPACE, x)
    +        """RETURNS (bool): Whether the lexeme consist of whitespace characters.
    +            Equivalent to `lexeme.text.isspace()`.
    +        """
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_SPACE)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_SPACE, x)
     
         property is_bracket:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_BRACKET)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_BRACKET, x)
    +        """RETURNS (bool): Whether the lexeme is a bracket."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_BRACKET)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_BRACKET, x)
     
         property is_quote:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_QUOTE)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_QUOTE, x)
    +        """RETURNS (bool): Whether the lexeme is a quotation mark."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_QUOTE)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_QUOTE, x)
     
         property is_left_punct:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_LEFT_PUNCT)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_LEFT_PUNCT, x)
    +        """RETURNS (bool): Whether the lexeme is left punctuation, e.g. )."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_LEFT_PUNCT)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_LEFT_PUNCT, x)
     
         property is_right_punct:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, IS_RIGHT_PUNCT)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, IS_RIGHT_PUNCT, x)
    +        """RETURNS (bool): Whether the lexeme is right punctuation, e.g. )."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, IS_RIGHT_PUNCT)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, IS_RIGHT_PUNCT, x)
     
         property like_url:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, LIKE_URL)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, LIKE_URL, x)
    +        """RETURNS (bool): Whether the lexeme resembles a URL."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, LIKE_URL)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, LIKE_URL, x)
     
         property like_num:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, LIKE_NUM)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, LIKE_NUM, x)
    +        """RETURNS (bool): Whether the lexeme represents a number, e.g. "10.9",
    +            "10", "ten", etc.
    +        """
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, LIKE_NUM)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, LIKE_NUM, x)
     
         property like_email:
    -        def __get__(self): return Lexeme.c_check_flag(self.c, LIKE_EMAIL)
    -        def __set__(self, bint x): Lexeme.c_set_flag(self.c, LIKE_EMAIL, x)
    +        """RETURNS (bool): Whether the lexeme resembles an email address."""
    +        def __get__(self):
    +            return Lexeme.c_check_flag(self.c, LIKE_EMAIL)
    +
    +        def __set__(self, bint x):
    +            Lexeme.c_set_flag(self.c, LIKE_EMAIL, x)
    diff --git a/website/api/lexeme.jade b/website/api/lexeme.jade
    index dddefd2d7..86fa18730 100644
    --- a/website/api/lexeme.jade
    +++ b/website/api/lexeme.jade
    @@ -157,27 +157,61 @@ p The L2 norm of the lexeme's vector representation.
         +row
             +cell #[code vocab]
             +cell #[code Vocab]
    -        +cell
    +        +cell The lexeme's vocabulary.
     
         +row
             +cell #[code text]
             +cell unicode
             +cell Verbatim text content.
     
    +    +row
    +        +cell #[code orth]
    +        +cell int
    +        +cell ID of the verbatim text content.
    +
    +    +row
    +        +cell #[code orth_]
    +        +cell unicode
    +        +cell
    +            |  Verbatim text content (identical to #[code Lexeme.text]). Existst
    +            |  mostly for consistency with the other attributes.
    +
         +row
             +cell #[code lex_id]
             +cell int
             +cell ID of the lexeme's lexical type.
     
    +    +row
    +        +cell #[code rank]
    +        +cell int
    +        +cell
    +            |  Sequential ID of the lexemes's lexical type, used to index into
    +            |  tables, e.g. for word vectors.
    +
    +    +row
    +        +cell #[code flags]
    +        +cell int
    +        +cell Container of the lexeme's binary flags.
    +
    +    +row
    +        +cell #[code norm]
    +        +cell int
    +        +cell The lexemes's norm, i.e. a normalised form of the lexeme text.
    +
    +    +row
    +        +cell #[code norm_]
    +        +cell unicode
    +        +cell The lexemes's norm, i.e. a normalised form of the lexeme text.
    +
         +row
             +cell #[code lower]
             +cell int
    -        +cell Lower-case form of the word.
    +        +cell Lowercase form of the word.
     
         +row
             +cell #[code lower_]
             +cell unicode
    -        +cell Lower-case form of the word.
    +        +cell Lowercase form of the word.
     
         +row
             +cell #[code shape]
    @@ -192,22 +226,30 @@ p The L2 norm of the lexeme's vector representation.
         +row
             +cell #[code prefix]
             +cell int
    -        +cell Length-N substring from the start of the word. Defaults to #[code N=1].
    +        +cell
    +            |  Length-N substring from the start of the word. Defaults to
    +            |  #[code N=1].
     
         +row
             +cell #[code prefix_]
             +cell unicode
    -        +cell Length-N substring from the start of the word. Defaults to #[code N=1].
    +        +cell
    +            |  Length-N substring from the start of the word. Defaults to
    +            |  #[code N=1].
     
         +row
             +cell #[code suffix]
             +cell int
    -        +cell Length-N substring from the end of the word. Defaults to #[code N=3].
    +        +cell
    +            |  Length-N substring from the end of the word. Defaults to
    +            |  #[code N=3].
     
         +row
             +cell #[code suffix_]
             +cell unicode
    -        +cell Length-N substring from the start of the word. Defaults to #[code N=3].
    +        +cell
    +            |  Length-N substring from the start of the word. Defaults to
    +            |  #[code N=3].
     
         +row
             +cell #[code is_alpha]
    @@ -237,6 +279,13 @@ p The L2 norm of the lexeme's vector representation.
                 |  Is the lexeme in lowercase? Equivalent to
                 |  #[code lexeme.text.islower()].
     
    +    +row
    +        +cell #[code is_upper]
    +        +cell bool
    +        +cell
    +            |  Is the lexeme in uppercase? Equivalent to
    +            |  #[code lexeme.text.isupper()].
    +
         +row
             +cell #[code is_title]
             +cell bool
    @@ -249,6 +298,16 @@ p The L2 norm of the lexeme's vector representation.
             +cell bool
             +cell Is the lexeme punctuation?
     
    +    +row
    +        +cell #[code is_left_punct]
    +        +cell bool
    +        +cell Is the lexeme a left punctuation mark, e.g. #[code (]?
    +
    +    +row
    +        +cell #[code is_right_punct]
    +        +cell bool
    +        +cell Is the lexeme a right punctuation mark, e.g. #[code )]?
    +
         +row
             +cell #[code is_space]
             +cell bool
    @@ -256,6 +315,16 @@ p The L2 norm of the lexeme's vector representation.
                 |  Does the lexeme consist of whitespace characters? Equivalent to
                 |  #[code lexeme.text.isspace()].
     
    +    +row
    +        +cell #[code is_bracket]
    +        +cell bool
    +        +cell Is the lexeme a bracket?
    +
    +    +row
    +        +cell #[code is_quote]
    +        +cell bool
    +        +cell Is the lexeme a quotation mark?
    +
         +row
             +cell #[code like_url]
             +cell bool
    @@ -285,6 +354,7 @@ p The L2 norm of the lexeme's vector representation.
             +cell #[code lang]
             +cell int
             +cell Language of the parent vocabulary.
    +
         +row
             +cell #[code lang_]
             +cell unicode
    @@ -293,9 +363,16 @@ p The L2 norm of the lexeme's vector representation.
         +row
             +cell #[code prob]
             +cell float
    -        +cell Smoothed log probability estimate of lexeme's type.
    +        +cell Smoothed log probability estimate of the lexeme's type.
    +
    +    +row
    +        +cell #[code cluster]
    +        +cell int
    +        +cell Brown cluster ID.
     
         +row
             +cell #[code sentiment]
             +cell float
    -        +cell A scalar value indicating the positivity or negativity of the lexeme.
    +        +cell
    +            |  A scalar value indicating the positivity or negativity of the
    +            |  lexeme.
    diff --git a/website/api/token.jade b/website/api/token.jade
    index e375e987d..f8fa15fe8 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -801,7 +801,7 @@ p The L2 norm of the token's vector representation.
             +cell int
             +cell
                 |  Sequential ID of the token's lexical type, used to index into
    -            |  tagles, e.g. for word vectors.
    +            |  tables, e.g. for word vectors.
     
         +row
             +cell #[code cluster]
    
    From d96e72f656e2b1caee0a6335521952090a86a8d9 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 27 Oct 2017 21:07:59 +0200
    Subject: [PATCH 591/649] Tidy up rest
    
    ---
     spacy/_ml.py              |   2 -
     spacy/attrs.pyx           |  17 +--
     spacy/gold.pyx            |   6 +-
     spacy/language.py         |  18 +--
     spacy/matcher.pyx         |  87 +++++------
     spacy/morphology.pyx      | 304 +++++++++++++++++++-------------------
     spacy/parts_of_speech.pyx |   2 +-
     spacy/scorer.py           |   1 -
     spacy/strings.pyx         |  12 +-
     spacy/symbols.pyx         |   4 +-
     spacy/tokenizer.pyx       |  34 ++---
     spacy/tokens/span.pyx     |   4 +-
     spacy/typedefs.pyx        |   1 -
     spacy/vocab.pyx           |   2 +-
     14 files changed, 233 insertions(+), 261 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 89324b3b3..5420067db 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -8,11 +8,9 @@ from thinc.t2t import ExtractWindow, ParametricAttention
     from thinc.t2v import Pooling, sum_pool
     from thinc.misc import Residual
     from thinc.misc import LayerNorm as LN
    -
     from thinc.api import add, layerize, chain, clone, concatenate, with_flatten
     from thinc.api import FeatureExtracter, with_getitem, flatten_add_lengths
     from thinc.api import uniqued, wrap, noop
    -
     from thinc.linear.linear import LinearModel
     from thinc.neural.ops import NumpyOps, CupyOps
     from thinc.neural.util import get_array_module
    diff --git a/spacy/attrs.pyx b/spacy/attrs.pyx
    index 8efd9e189..8113ffebe 100644
    --- a/spacy/attrs.pyx
    +++ b/spacy/attrs.pyx
    @@ -101,17 +101,12 @@ def intify_attrs(stringy_attrs, strings_map=None, _do_deprecated=False):
         """
         Normalize a dictionary of attributes, converting them to ints.
     
    -    Arguments:
    -        stringy_attrs (dict):
    -            Dictionary keyed by attribute string names. Values can be ints or strings.
    -
    -        strings_map (StringStore):
    -            Defaults to None. If provided, encodes string values into ints.
    -
    -    Returns:
    -        inty_attrs (dict):
    -            Attributes dictionary with keys and optionally values converted to
    -            ints.
    +    stringy_attrs (dict): Dictionary keyed by attribute string names. Values
    +        can be ints or strings.
    +    strings_map (StringStore): Defaults to None. If provided, encodes string
    +        values into ints.
    +    RETURNS (dict): Attributes dictionary with keys and optionally values
    +        converted to ints.
         """
         inty_attrs = {}
         if _do_deprecated:
    diff --git a/spacy/gold.pyx b/spacy/gold.pyx
    index 921c837ba..5adef7bf7 100644
    --- a/spacy/gold.pyx
    +++ b/spacy/gold.pyx
    @@ -2,7 +2,6 @@
     # coding: utf8
     from __future__ import unicode_literals, print_function
     
    -import io
     import re
     import ujson
     import random
    @@ -10,9 +9,8 @@ import cytoolz
     import itertools
     
     from .syntax import nonproj
    -from .util import ensure_path
    -from . import util
     from .tokens import Doc
    +from . import util
     
     
     def tags_to_entities(tags):
    @@ -310,7 +308,7 @@ def _corrupt(c, noise_level):
     
     
     def read_json_file(loc, docs_filter=None, limit=None):
    -    loc = ensure_path(loc)
    +    loc = util.ensure_path(loc)
         if loc.is_dir():
             for filename in loc.iterdir():
                 yield from read_json_file(loc / filename, limit=limit)
    diff --git a/spacy/language.py b/spacy/language.py
    index 7c60362a0..05546cde4 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -1,22 +1,22 @@
     # coding: utf8
     from __future__ import absolute_import, unicode_literals
    -from contextlib import contextmanager
    -import copy
     
    -from thinc.neural import Model
    -from thinc.neural.optimizers import Adam
     import random
     import ujson
    -from collections import OrderedDict
     import itertools
     import weakref
     import functools
    +from collections import OrderedDict
    +from contextlib import contextmanager
    +from copy import copy
    +from thinc.neural import Model
    +from thinc.neural.optimizers import Adam
     
     from .tokenizer import Tokenizer
     from .vocab import Vocab
     from .lemmatizer import Lemmatizer
    -from .pipeline import DependencyParser, Tensorizer, Tagger
    -from .pipeline import EntityRecognizer, SimilarityHook, TextCategorizer
    +from .pipeline import DependencyParser, Tensorizer, Tagger, EntityRecognizer
    +from .pipeline import SimilarityHook, TextCategorizer
     from .compat import json_dumps, izip
     from .scorer import Scorer
     from ._ml import link_vectors_to_models
    @@ -649,7 +649,7 @@ class Language(object):
             serializers = OrderedDict((
                 ('vocab', lambda: self.vocab.to_bytes()),
                 ('tokenizer', lambda: self.tokenizer.to_bytes(vocab=False)),
    -            ('meta', lambda: ujson.dumps(self.meta))
    +            ('meta', lambda: json_dumps(self.meta))
             ))
             for i, (name, proc) in enumerate(self.pipeline):
                 if name in disable:
    @@ -689,7 +689,7 @@ class DisabledPipes(list):
             # Important! Not deep copy -- we just want the container (but we also
             # want to support people providing arbitrarily typed nlp.pipeline
             # objects.)
    -        self.original_pipeline = copy.copy(nlp.pipeline)
    +        self.original_pipeline = copy(nlp.pipeline)
             list.__init__(self)
             self.extend(nlp.remove_pipe(name) for name in names)
     
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 401405c14..a6b02ba2c 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -4,12 +4,6 @@
     from __future__ import unicode_literals
     
     import ujson
    -
    -from .typedefs cimport attr_t
    -from .typedefs cimport hash_t
    -from .attrs cimport attr_id_t
    -from .structs cimport TokenC
    -
     from cymem.cymem cimport Pool
     from preshed.maps cimport PreshMap
     from libcpp.vector cimport vector
    @@ -17,14 +11,15 @@ from libcpp.pair cimport pair
     from murmurhash.mrmr cimport hash64
     from libc.stdint cimport int32_t
     
    -from .attrs cimport ID, NULL_ATTR, ENT_TYPE
    -from . import attrs
    -from .tokens.doc cimport get_token_attr
    -from .tokens.doc cimport Doc
    +from .typedefs cimport attr_t
    +from .typedefs cimport hash_t
    +from .structs cimport TokenC
    +from .tokens.doc cimport Doc, get_token_attr
     from .vocab cimport Vocab
     
    +from .attrs import IDS
    +from .attrs cimport attr_id_t, ID, NULL_ATTR
     from .attrs import FLAG61 as U_ENT
    -
     from .attrs import FLAG60 as B2_ENT
     from .attrs import FLAG59 as B3_ENT
     from .attrs import FLAG58 as B4_ENT
    @@ -34,7 +29,6 @@ from .attrs import FLAG55 as B7_ENT
     from .attrs import FLAG54 as B8_ENT
     from .attrs import FLAG53 as B9_ENT
     from .attrs import FLAG52 as B10_ENT
    -
     from .attrs import FLAG51 as I3_ENT
     from .attrs import FLAG50 as I4_ENT
     from .attrs import FLAG49 as I5_ENT
    @@ -43,7 +37,6 @@ from .attrs import FLAG47 as I7_ENT
     from .attrs import FLAG46 as I8_ENT
     from .attrs import FLAG45 as I9_ENT
     from .attrs import FLAG44 as I10_ENT
    -
     from .attrs import FLAG43 as L2_ENT
     from .attrs import FLAG42 as L3_ENT
     from .attrs import FLAG41 as L4_ENT
    @@ -153,7 +146,7 @@ cdef int get_action(const TokenPatternC* pattern, const TokenC* token) nogil:
     def _convert_strings(token_specs, string_store):
         # Support 'syntactic sugar' operator '+', as combination of ONE, ZERO_PLUS
         operators = {'!': (ZERO,), '*': (ZERO_PLUS,), '+': (ONE, ZERO_PLUS),
    -            '?': (ZERO_ONE,), '1': (ONE,)}
    +                 '?': (ZERO_ONE,), '1': (ONE,)}
         tokens = []
         op = ONE
         for spec in token_specs:
    @@ -168,10 +161,10 @@ def _convert_strings(token_specs, string_store):
                     if value in operators:
                         ops = operators[value]
                     else:
    -                    raise KeyError(
    -                        "Unknown operator '%s'. Options: %s" % (value, ', '.join(operators.keys())))
    +                    msg = "Unknown operator '%s'. Options: %s"
    +                    raise KeyError(msg % (value, ', '.join(operators.keys())))
                 if isinstance(attr, basestring):
    -                attr = attrs.IDS.get(attr.upper())
    +                attr = IDS.get(attr.upper())
                 if isinstance(value, basestring):
                     value = string_store.add(value)
                 if isinstance(value, bool):
    @@ -186,7 +179,7 @@ def _convert_strings(token_specs, string_store):
     def merge_phrase(matcher, doc, i, matches):
         """Callback to merge a phrase on match."""
         ent_id, label, start, end = matches[i]
    -    span = doc[start : end]
    +    span = doc[start:end]
         span.merge(ent_type=label, ent_id=ent_id)
     
     
    @@ -233,13 +226,13 @@ cdef class Matcher:
             return self._normalize_key(key) in self._patterns
     
         def add(self, key, on_match, *patterns):
    -        """Add a match-rule to the matcher. A match-rule consists of: an ID key,
    -        an on_match callback, and one or more patterns.
    +        """Add a match-rule to the matcher. A match-rule consists of: an ID
    +        key, an on_match callback, and one or more patterns.
     
             If the key exists, the patterns are appended to the previous ones, and
    -        the previous on_match callback is replaced. The `on_match` callback will
    -        receive the arguments `(matcher, doc, i, matches)`. You can also set
    -        `on_match` to `None` to not perform any actions.
    +        the previous on_match callback is replaced. The `on_match` callback
    +        will receive the arguments `(matcher, doc, i, matches)`. You can also
    +        set `on_match` to `None` to not perform any actions.
     
             A pattern consists of one or more `token_specs`, where a `token_spec`
             is a dictionary mapping attribute IDs to values, and optionally a
    @@ -253,8 +246,8 @@ cdef class Matcher:
             The + and * operators are usually interpretted "greedily", i.e. longer
             matches are returned where possible. However, if you specify two '+'
             and '*' patterns in a row and their matches overlap, the first
    -        operator will behave non-greedily. This quirk in the semantics
    -        makes the matcher more efficient, by avoiding the need for back-tracking.
    +        operator will behave non-greedily. This quirk in the semantics makes
    +        the matcher more efficient, by avoiding the need for back-tracking.
     
             key (unicode): The match ID.
             on_match (callable): Callback executed on match.
    @@ -268,7 +261,6 @@ cdef class Matcher:
             key = self._normalize_key(key)
             self._patterns.setdefault(key, [])
             self._callbacks[key] = on_match
    -
             for pattern in patterns:
                 specs = _convert_strings(pattern, self.vocab.strings)
                 self.patterns.push_back(init_pattern(self.mem, key, specs))
    @@ -315,9 +307,9 @@ cdef class Matcher:
             """Match a stream of documents, yielding them in turn.
     
             docs (iterable): A stream of documents.
    -        batch_size (int): The number of documents to accumulate into a working set.
    +        batch_size (int): Number of documents to accumulate into a working set.
             n_threads (int): The number of threads with which to work on the buffer
    -            in parallel, if the `Matcher` implementation supports multi-threading.
    +            in parallel, if the implementation supports multi-threading.
             YIELDS (Doc): Documents, in order.
             """
             for doc in docs:
    @@ -325,7 +317,7 @@ cdef class Matcher:
                 yield doc
     
         def __call__(self, Doc doc):
    -        """Find all token sequences matching the supplied patterns on the `Doc`.
    +        """Find all token sequences matching the supplied pattern.
     
             doc (Doc): The document to match over.
             RETURNS (list): A list of `(key, start, end)` tuples,
    @@ -342,8 +334,8 @@ cdef class Matcher:
             for token_i in range(doc.length):
                 token = &doc.c[token_i]
                 q = 0
    -            # Go over the open matches, extending or finalizing if able. Otherwise,
    -            # we over-write them (q doesn't advance)
    +            # Go over the open matches, extending or finalizing if able.
    +            # Otherwise, we over-write them (q doesn't advance)
                 for state in partials:
                     action = get_action(state.second, token)
                     if action == PANIC:
    @@ -356,8 +348,8 @@ cdef class Matcher:
     
                     if action == REPEAT:
                         # Leave the state in the queue, and advance to next slot
    -                    # (i.e. we don't overwrite -- we want to greedily match more
    -                    # pattern.
    +                    # (i.e. we don't overwrite -- we want to greedily match
    +                    # more pattern.
                         q += 1
                     elif action == REJECT:
                         pass
    @@ -366,8 +358,8 @@ cdef class Matcher:
                         partials[q].second += 1
                         q += 1
                     elif action in (ACCEPT, ACCEPT_PREV):
    -                    # TODO: What to do about patterns starting with ZERO? Need to
    -                    # adjust the start position.
    +                    # TODO: What to do about patterns starting with ZERO? Need
    +                    # to adjust the start position.
                         start = state.first
                         end = token_i+1 if action == ACCEPT else token_i
                         ent_id = state.second[1].attrs[0].value
    @@ -388,8 +380,8 @@ cdef class Matcher:
                         state.second = pattern
                         partials.push_back(state)
                     elif action == ADVANCE:
    -                    # TODO: What to do about patterns starting with ZERO? Need to
    -                    # adjust the start position.
    +                    # TODO: What to do about patterns starting with ZERO? Need
    +                    # to adjust the start position.
                         state.first = token_i
                         state.second = pattern + 1
                         partials.push_back(state)
    @@ -413,7 +405,6 @@ cdef class Matcher:
                 on_match = self._callbacks.get(ent_id)
                 if on_match is not None:
                     on_match(self, doc, i, matches)
    -        # TODO: only return (match_id, start, end)
             return matches
     
         def _normalize_key(self, key):
    @@ -441,7 +432,8 @@ def get_bilou(length):
         elif length == 8:
             return [B8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, L8_ENT]
         elif length == 9:
    -        return [B9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, L9_ENT]
    +        return [B9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT,
    +                L9_ENT]
         elif length == 10:
             return [B10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT,
                     I10_ENT, I10_ENT, L10_ENT]
    @@ -454,10 +446,8 @@ cdef class PhraseMatcher:
         cdef Vocab vocab
         cdef Matcher matcher
         cdef PreshMap phrase_ids
    -
         cdef int max_length
         cdef attr_t* _phrase_key
    -
         cdef public object _callbacks
         cdef public object _patterns
     
    @@ -470,7 +460,8 @@ cdef class PhraseMatcher:
             self.phrase_ids = PreshMap()
             abstract_patterns = []
             for length in range(1, max_length):
    -            abstract_patterns.append([{tag: True} for tag in get_bilou(length)])
    +            abstract_patterns.append([{tag: True}
    +                                      for tag in get_bilou(length)])
             self.matcher.add('Candidate', None, *abstract_patterns)
             self._callbacks = {}
     
    @@ -496,8 +487,8 @@ cdef class PhraseMatcher:
             return (self.__class__, (self.vocab,), None, None)
     
         def add(self, key, on_match, *docs):
    -        """Add a match-rule to the matcher. A match-rule consists of: an ID key,
    -        an on_match callback, and one or more patterns.
    +        """Add a match-rule to the matcher. A match-rule consists of: an ID
    +        key, an on_match callback, and one or more patterns.
     
             key (unicode): The match ID.
             on_match (callable): Callback executed on match.
    @@ -513,7 +504,6 @@ cdef class PhraseMatcher:
                     raise ValueError(msg % (len(doc), self.max_length))
             cdef hash_t ent_id = self.matcher._normalize_key(key)
             self._callbacks[ent_id] = on_match
    -
             cdef int length
             cdef int i
             cdef hash_t phrase_hash
    @@ -553,9 +543,9 @@ cdef class PhraseMatcher:
             """Match a stream of documents, yielding them in turn.
     
             docs (iterable): A stream of documents.
    -        batch_size (int): The number of documents to accumulate into a working set.
    +        batch_size (int): Number of documents to accumulate into a working set.
             n_threads (int): The number of threads with which to work on the buffer
    -            in parallel, if the `Matcher` implementation supports multi-threading.
    +            in parallel, if the implementation supports multi-threading.
             YIELDS (Doc): Documents, in order.
             """
             for doc in stream:
    @@ -569,7 +559,8 @@ cdef class PhraseMatcher:
                 self._phrase_key[i] = 0
             for i, j in enumerate(range(start, end)):
                 self._phrase_key[i] = doc.c[j].lex.orth
    -        cdef hash_t key = hash64(self._phrase_key, self.max_length * sizeof(attr_t), 0)
    +        cdef hash_t key = hash64(self._phrase_key,
    +                                 self.max_length * sizeof(attr_t), 0)
             ent_id = self.phrase_ids.get(key)
             if ent_id == 0:
                 return None
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 91befaa1b..b3989839d 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -4,17 +4,15 @@ from __future__ import unicode_literals
     
     from libc.string cimport memset
     
    -from .parts_of_speech cimport ADJ, VERB, NOUN, PUNCT, SPACE
     from .attrs cimport POS, IS_SPACE
    +from .attrs import LEMMA, intify_attrs
    +from .parts_of_speech cimport SPACE
     from .parts_of_speech import IDS as POS_IDS
     from .lexeme cimport Lexeme
    -from .attrs import LEMMA, intify_attrs
     
     
     def _normalize_props(props):
    -    """
    -    Transform deprecated string keys to correct names.
    -    """
    +    """Transform deprecated string keys to correct names."""
         out = {}
         for key, value in props.items():
             if key == POS:
    @@ -77,7 +75,8 @@ cdef class Morphology:
         cdef int assign_untagged(self, TokenC* token) except -1:
             """Set morphological attributes on a token without a POS tag. Uses
             the lemmatizer's lookup() method, which looks up the string in the
    -        table provided by the language data as lemma_lookup (if available)."""
    +        table provided by the language data as lemma_lookup (if available).
    +        """
             if token.lemma == 0:
                 orth_str = self.strings[token.lex.orth]
                 lemma = self.lemmatizer.lookup(orth_str)
    @@ -95,11 +94,10 @@ cdef class Morphology:
         cdef int assign_tag_id(self, TokenC* token, int tag_id) except -1:
             if tag_id > self.n_tags:
                 raise ValueError("Unknown tag ID: %s" % tag_id)
    -        # TODO: It's pretty arbitrary to put this logic here. I guess the justification
    -        # is that this is where the specific word and the tag interact. Still,
    -        # we should have a better way to enforce this rule, or figure out why
    -        # the statistical model fails.
    -        # Related to Issue #220
    +        # TODO: It's pretty arbitrary to put this logic here. I guess the
    +        # justification is that this is where the specific word and the tag
    +        # interact. Still, we should have a better way to enforce this rule, or
    +        # figure out why the statistical model fails. Related to Issue #220
             if Lexeme.c_check_flag(token.lex, IS_SPACE):
                 tag_id = self.reverse_index[self.strings.add('_SP')]
             rich_tag = self.rich_tags[tag_id]
    @@ -123,14 +121,13 @@ cdef class Morphology:
             else:
                 flags[0] &= ~(one << flag_id)
     
    -    def add_special_case(self, unicode tag_str, unicode orth_str, attrs, force=False):
    -        """
    -        Add a special-case rule to the morphological analyser. Tokens whose
    +    def add_special_case(self, unicode tag_str, unicode orth_str, attrs,
    +                         force=False):
    +        """Add a special-case rule to the morphological analyser. Tokens whose
             tag and orth match the rule will receive the specified properties.
     
    -        Arguments:
    -            tag (unicode): The part-of-speech tag to key the exception.
    -            orth (unicode): The word-form to key the exception.
    +        tag (unicode): The part-of-speech tag to key the exception.
    +        orth (unicode): The word-form to key the exception.
             """
             self.exc[(tag_str, orth_str)] = dict(attrs)
             tag = self.strings.add(tag_str)
    @@ -144,10 +141,9 @@ cdef class Morphology:
             elif force:
                 memset(cached, 0, sizeof(cached[0]))
             else:
    -            msg = ("Conflicting morphology exception for (%s, %s). Use force=True "
    -                   "to overwrite.")
    -            msg = msg % (tag_str, orth_str)
    -            raise ValueError(msg)
    +            raise ValueError(
    +                "Conflicting morphology exception for (%s, %s). Use "
    +                "force=True to overwrite." % (tag_str, orth_str))
     
             cached.tag = rich_tag
             # TODO: Refactor this to take arbitrary attributes.
    @@ -218,7 +214,7 @@ IDS = {
         "Definite_two": Definite_two,
         "Definite_def": Definite_def,
         "Definite_red": Definite_red,
    -    "Definite_cons": Definite_cons, # U20
    +    "Definite_cons": Definite_cons,  # U20
         "Definite_ind": Definite_ind,
         "Degree_cmp": Degree_cmp,
         "Degree_comp": Degree_comp,
    @@ -227,7 +223,7 @@ IDS = {
         "Degree_sup": Degree_sup,
         "Degree_abs": Degree_abs,
         "Degree_com": Degree_com,
    -    "Degree_dim ": Degree_dim, # du
    +    "Degree_dim ": Degree_dim,  # du
         "Gender_com": Gender_com,
         "Gender_fem": Gender_fem,
         "Gender_masc": Gender_masc,
    @@ -242,15 +238,15 @@ IDS = {
         "Negative_neg": Negative_neg,
         "Negative_pos": Negative_pos,
         "Negative_yes": Negative_yes,
    -    "Polarity_neg": Polarity_neg, # U20
    -    "Polarity_pos": Polarity_pos, # U20
    +    "Polarity_neg": Polarity_neg,  # U20
    +    "Polarity_pos": Polarity_pos,  # U20
         "Number_com": Number_com,
         "Number_dual": Number_dual,
         "Number_none": Number_none,
         "Number_plur": Number_plur,
         "Number_sing": Number_sing,
    -    "Number_ptan ": Number_ptan, # bg
    -    "Number_count ": Number_count, # bg
    +    "Number_ptan ": Number_ptan,  # bg
    +    "Number_count ": Number_count,  # bg
         "NumType_card": NumType_card,
         "NumType_dist": NumType_dist,
         "NumType_frac": NumType_frac,
    @@ -276,7 +272,7 @@ IDS = {
         "PronType_rel": PronType_rel,
         "PronType_tot": PronType_tot,
         "PronType_clit": PronType_clit,
    -    "PronType_exc ": PronType_exc, # es, ca, it, fa,
    +    "PronType_exc ": PronType_exc,  # es, ca, it, fa,
         "Reflex_yes": Reflex_yes,
         "Tense_fut": Tense_fut,
         "Tense_imp": Tense_imp,
    @@ -292,19 +288,19 @@ IDS = {
         "VerbForm_partPres": VerbForm_partPres,
         "VerbForm_sup": VerbForm_sup,
         "VerbForm_trans": VerbForm_trans,
    -    "VerbForm_conv": VerbForm_conv, # U20
    -    "VerbForm_gdv ": VerbForm_gdv, # la,
    +    "VerbForm_conv": VerbForm_conv,  # U20
    +    "VerbForm_gdv ": VerbForm_gdv,  # la,
         "Voice_act": Voice_act,
         "Voice_cau": Voice_cau,
         "Voice_pass": Voice_pass,
    -    "Voice_mid ": Voice_mid, # gkc,
    -    "Voice_int ": Voice_int, # hb,
    -    "Abbr_yes ": Abbr_yes, # cz, fi, sl, U,
    -    "AdpType_prep ": AdpType_prep, # cz, U,
    -    "AdpType_post ": AdpType_post, # U,
    -    "AdpType_voc ": AdpType_voc, # cz,
    -    "AdpType_comprep ": AdpType_comprep, # cz,
    -    "AdpType_circ ": AdpType_circ, # U,
    +    "Voice_mid ": Voice_mid,  # gkc,
    +    "Voice_int ": Voice_int,  # hb,
    +    "Abbr_yes ": Abbr_yes,  # cz, fi, sl, U,
    +    "AdpType_prep ": AdpType_prep,  # cz, U,
    +    "AdpType_post ": AdpType_post,  # U,
    +    "AdpType_voc ": AdpType_voc,  # cz,
    +    "AdpType_comprep ": AdpType_comprep,  # cz,
    +    "AdpType_circ ": AdpType_circ,  # U,
         "AdvType_man": AdvType_man,
         "AdvType_loc": AdvType_loc,
         "AdvType_tim": AdvType_tim,
    @@ -314,122 +310,122 @@ IDS = {
         "AdvType_sta": AdvType_sta,
         "AdvType_ex": AdvType_ex,
         "AdvType_adadj": AdvType_adadj,
    -    "ConjType_oper ": ConjType_oper, # cz, U,
    -    "ConjType_comp ": ConjType_comp, # cz, U,
    -    "Connegative_yes ": Connegative_yes, # fi,
    -    "Derivation_minen ": Derivation_minen, # fi,
    -    "Derivation_sti ": Derivation_sti, # fi,
    -    "Derivation_inen ": Derivation_inen, # fi,
    -    "Derivation_lainen ": Derivation_lainen, # fi,
    -    "Derivation_ja ": Derivation_ja, # fi,
    -    "Derivation_ton ": Derivation_ton, # fi,
    -    "Derivation_vs ": Derivation_vs, # fi,
    -    "Derivation_ttain ": Derivation_ttain, # fi,
    -    "Derivation_ttaa ": Derivation_ttaa, # fi,
    -    "Echo_rdp ": Echo_rdp, # U,
    -    "Echo_ech ": Echo_ech, # U,
    -    "Foreign_foreign ": Foreign_foreign, # cz, fi, U,
    -    "Foreign_fscript ": Foreign_fscript, # cz, fi, U,
    -    "Foreign_tscript ": Foreign_tscript, # cz, U,
    -    "Foreign_yes ": Foreign_yes, # sl,
    -    "Gender_dat_masc ": Gender_dat_masc, # bq, U,
    -    "Gender_dat_fem ": Gender_dat_fem, # bq, U,
    -    "Gender_erg_masc ": Gender_erg_masc, # bq,
    -    "Gender_erg_fem ": Gender_erg_fem, # bq,
    -    "Gender_psor_masc ": Gender_psor_masc, # cz, sl, U,
    -    "Gender_psor_fem ": Gender_psor_fem, # cz, sl, U,
    -    "Gender_psor_neut ": Gender_psor_neut, # sl,
    -    "Hyph_yes ": Hyph_yes, # cz, U,
    -    "InfForm_one ": InfForm_one, # fi,
    -    "InfForm_two ": InfForm_two, # fi,
    -    "InfForm_three ": InfForm_three, # fi,
    -    "NameType_geo ": NameType_geo, # U, cz,
    -    "NameType_prs ": NameType_prs, # U, cz,
    -    "NameType_giv ": NameType_giv, # U, cz,
    -    "NameType_sur ": NameType_sur, # U, cz,
    -    "NameType_nat ": NameType_nat, # U, cz,
    -    "NameType_com ": NameType_com, # U, cz,
    -    "NameType_pro ": NameType_pro, # U, cz,
    -    "NameType_oth ": NameType_oth, # U, cz,
    -    "NounType_com ": NounType_com, # U,
    -    "NounType_prop ": NounType_prop, # U,
    -    "NounType_class ": NounType_class, # U,
    -    "Number_abs_sing ": Number_abs_sing, # bq, U,
    -    "Number_abs_plur ": Number_abs_plur, # bq, U,
    -    "Number_dat_sing ": Number_dat_sing, # bq, U,
    -    "Number_dat_plur ": Number_dat_plur, # bq, U,
    -    "Number_erg_sing ": Number_erg_sing, # bq, U,
    -    "Number_erg_plur ": Number_erg_plur, # bq, U,
    -    "Number_psee_sing ": Number_psee_sing, # U,
    -    "Number_psee_plur ": Number_psee_plur, # U,
    -    "Number_psor_sing ": Number_psor_sing, # cz, fi, sl, U,
    -    "Number_psor_plur ": Number_psor_plur, # cz, fi, sl, U,
    -    "NumForm_digit ": NumForm_digit, # cz, sl, U,
    -    "NumForm_roman ": NumForm_roman, # cz, sl, U,
    -    "NumForm_word ": NumForm_word, # cz, sl, U,
    -    "NumValue_one ": NumValue_one, # cz, U,
    -    "NumValue_two ": NumValue_two, # cz, U,
    -    "NumValue_three ": NumValue_three, # cz, U,
    -    "PartForm_pres ": PartForm_pres, # fi,
    -    "PartForm_past ": PartForm_past, # fi,
    -    "PartForm_agt ": PartForm_agt, # fi,
    -    "PartForm_neg ": PartForm_neg, # fi,
    -    "PartType_mod ": PartType_mod, # U,
    -    "PartType_emp ": PartType_emp, # U,
    -    "PartType_res ": PartType_res, # U,
    -    "PartType_inf ": PartType_inf, # U,
    -    "PartType_vbp ": PartType_vbp, # U,
    -    "Person_abs_one ": Person_abs_one, # bq, U,
    -    "Person_abs_two ": Person_abs_two, # bq, U,
    -    "Person_abs_three ": Person_abs_three, # bq, U,
    -    "Person_dat_one ": Person_dat_one, # bq, U,
    -    "Person_dat_two ": Person_dat_two, # bq, U,
    -    "Person_dat_three ": Person_dat_three, # bq, U,
    -    "Person_erg_one ": Person_erg_one, # bq, U,
    -    "Person_erg_two ": Person_erg_two, # bq, U,
    -    "Person_erg_three ": Person_erg_three, # bq, U,
    -    "Person_psor_one ": Person_psor_one, # fi, U,
    -    "Person_psor_two ": Person_psor_two, # fi, U,
    -    "Person_psor_three ": Person_psor_three, # fi, U,
    -    "Polite_inf ": Polite_inf, # bq, U,
    -    "Polite_pol ": Polite_pol, # bq, U,
    -    "Polite_abs_inf ": Polite_abs_inf, # bq, U,
    -    "Polite_abs_pol ": Polite_abs_pol, # bq, U,
    -    "Polite_erg_inf ": Polite_erg_inf, # bq, U,
    -    "Polite_erg_pol ": Polite_erg_pol, # bq, U,
    -    "Polite_dat_inf ": Polite_dat_inf, # bq, U,
    -    "Polite_dat_pol ": Polite_dat_pol, # bq, U,
    -    "Prefix_yes ": Prefix_yes, # U,
    -    "PrepCase_npr ": PrepCase_npr, # cz,
    -    "PrepCase_pre ": PrepCase_pre, # U,
    -    "PunctSide_ini ": PunctSide_ini, # U,
    -    "PunctSide_fin ": PunctSide_fin, # U,
    -    "PunctType_peri ": PunctType_peri, # U,
    -    "PunctType_qest ": PunctType_qest, # U,
    -    "PunctType_excl ": PunctType_excl, # U,
    -    "PunctType_quot ": PunctType_quot, # U,
    -    "PunctType_brck ": PunctType_brck, # U,
    -    "PunctType_comm ": PunctType_comm, # U,
    -    "PunctType_colo ": PunctType_colo, # U,
    -    "PunctType_semi ": PunctType_semi, # U,
    -    "PunctType_dash ": PunctType_dash, # U,
    -    "Style_arch ": Style_arch, # cz, fi, U,
    -    "Style_rare ": Style_rare, # cz, fi, U,
    -    "Style_poet ": Style_poet, # cz, U,
    -    "Style_norm ": Style_norm, # cz, U,
    -    "Style_coll ": Style_coll, # cz, U,
    -    "Style_vrnc ": Style_vrnc, # cz, U,
    -    "Style_sing ": Style_sing, # cz, U,
    -    "Style_expr ": Style_expr, # cz, U,
    -    "Style_derg ": Style_derg, # cz, U,
    -    "Style_vulg ": Style_vulg, # cz, U,
    -    "Style_yes ": Style_yes, # fi, U,
    -    "StyleVariant_styleShort ": StyleVariant_styleShort, # cz,
    -    "StyleVariant_styleBound ": StyleVariant_styleBound, # cz, sl,
    -    "VerbType_aux ": VerbType_aux, # U,
    -    "VerbType_cop ": VerbType_cop, # U,
    -    "VerbType_mod ": VerbType_mod, # U,
    -    "VerbType_light ": VerbType_light, # U,
    +    "ConjType_oper ": ConjType_oper,  # cz, U,
    +    "ConjType_comp ": ConjType_comp,  # cz, U,
    +    "Connegative_yes ": Connegative_yes,  # fi,
    +    "Derivation_minen ": Derivation_minen,  # fi,
    +    "Derivation_sti ": Derivation_sti,  # fi,
    +    "Derivation_inen ": Derivation_inen,  # fi,
    +    "Derivation_lainen ": Derivation_lainen,  # fi,
    +    "Derivation_ja ": Derivation_ja,  # fi,
    +    "Derivation_ton ": Derivation_ton,  # fi,
    +    "Derivation_vs ": Derivation_vs,  # fi,
    +    "Derivation_ttain ": Derivation_ttain,  # fi,
    +    "Derivation_ttaa ": Derivation_ttaa,  # fi,
    +    "Echo_rdp ": Echo_rdp,  # U,
    +    "Echo_ech ": Echo_ech,  # U,
    +    "Foreign_foreign ": Foreign_foreign,  # cz, fi, U,
    +    "Foreign_fscript ": Foreign_fscript,  # cz, fi, U,
    +    "Foreign_tscript ": Foreign_tscript,  # cz, U,
    +    "Foreign_yes ": Foreign_yes,  # sl,
    +    "Gender_dat_masc ": Gender_dat_masc,  # bq, U,
    +    "Gender_dat_fem ": Gender_dat_fem,  # bq, U,
    +    "Gender_erg_masc ": Gender_erg_masc,  # bq,
    +    "Gender_erg_fem ": Gender_erg_fem,  # bq,
    +    "Gender_psor_masc ": Gender_psor_masc,  # cz, sl, U,
    +    "Gender_psor_fem ": Gender_psor_fem,  # cz, sl, U,
    +    "Gender_psor_neut ": Gender_psor_neut,  # sl,
    +    "Hyph_yes ": Hyph_yes,  # cz, U,
    +    "InfForm_one ": InfForm_one,  # fi,
    +    "InfForm_two ": InfForm_two,  # fi,
    +    "InfForm_three ": InfForm_three,  # fi,
    +    "NameType_geo ": NameType_geo,  # U, cz,
    +    "NameType_prs ": NameType_prs,  # U, cz,
    +    "NameType_giv ": NameType_giv,  # U, cz,
    +    "NameType_sur ": NameType_sur,  # U, cz,
    +    "NameType_nat ": NameType_nat,  # U, cz,
    +    "NameType_com ": NameType_com,  # U, cz,
    +    "NameType_pro ": NameType_pro,  # U, cz,
    +    "NameType_oth ": NameType_oth,  # U, cz,
    +    "NounType_com ": NounType_com,  # U,
    +    "NounType_prop ": NounType_prop,  # U,
    +    "NounType_class ": NounType_class,  # U,
    +    "Number_abs_sing ": Number_abs_sing,  # bq, U,
    +    "Number_abs_plur ": Number_abs_plur,  # bq, U,
    +    "Number_dat_sing ": Number_dat_sing,  # bq, U,
    +    "Number_dat_plur ": Number_dat_plur,  # bq, U,
    +    "Number_erg_sing ": Number_erg_sing,  # bq, U,
    +    "Number_erg_plur ": Number_erg_plur,  # bq, U,
    +    "Number_psee_sing ": Number_psee_sing,  # U,
    +    "Number_psee_plur ": Number_psee_plur,  # U,
    +    "Number_psor_sing ": Number_psor_sing,  # cz, fi, sl, U,
    +    "Number_psor_plur ": Number_psor_plur,  # cz, fi, sl, U,
    +    "NumForm_digit ": NumForm_digit,  # cz, sl, U,
    +    "NumForm_roman ": NumForm_roman,  # cz, sl, U,
    +    "NumForm_word ": NumForm_word,  # cz, sl, U,
    +    "NumValue_one ": NumValue_one,  # cz, U,
    +    "NumValue_two ": NumValue_two,  # cz, U,
    +    "NumValue_three ": NumValue_three,  # cz, U,
    +    "PartForm_pres ": PartForm_pres,  # fi,
    +    "PartForm_past ": PartForm_past,  # fi,
    +    "PartForm_agt ": PartForm_agt,  # fi,
    +    "PartForm_neg ": PartForm_neg,  # fi,
    +    "PartType_mod ": PartType_mod,  # U,
    +    "PartType_emp ": PartType_emp,  # U,
    +    "PartType_res ": PartType_res,  # U,
    +    "PartType_inf ": PartType_inf,  # U,
    +    "PartType_vbp ": PartType_vbp,  # U,
    +    "Person_abs_one ": Person_abs_one,  # bq, U,
    +    "Person_abs_two ": Person_abs_two,  # bq, U,
    +    "Person_abs_three ": Person_abs_three,  # bq, U,
    +    "Person_dat_one ": Person_dat_one,  # bq, U,
    +    "Person_dat_two ": Person_dat_two,  # bq, U,
    +    "Person_dat_three ": Person_dat_three,  # bq, U,
    +    "Person_erg_one ": Person_erg_one,  # bq, U,
    +    "Person_erg_two ": Person_erg_two,  # bq, U,
    +    "Person_erg_three ": Person_erg_three,  # bq, U,
    +    "Person_psor_one ": Person_psor_one,  # fi, U,
    +    "Person_psor_two ": Person_psor_two,  # fi, U,
    +    "Person_psor_three ": Person_psor_three,  # fi, U,
    +    "Polite_inf ": Polite_inf,  # bq, U,
    +    "Polite_pol ": Polite_pol,  # bq, U,
    +    "Polite_abs_inf ": Polite_abs_inf,  # bq, U,
    +    "Polite_abs_pol ": Polite_abs_pol,  # bq, U,
    +    "Polite_erg_inf ": Polite_erg_inf,  # bq, U,
    +    "Polite_erg_pol ": Polite_erg_pol,  # bq, U,
    +    "Polite_dat_inf ": Polite_dat_inf,  # bq, U,
    +    "Polite_dat_pol ": Polite_dat_pol,  # bq, U,
    +    "Prefix_yes ": Prefix_yes,  # U,
    +    "PrepCase_npr ": PrepCase_npr,  # cz,
    +    "PrepCase_pre ": PrepCase_pre,  # U,
    +    "PunctSide_ini ": PunctSide_ini,  # U,
    +    "PunctSide_fin ": PunctSide_fin,  # U,
    +    "PunctType_peri ": PunctType_peri,  # U,
    +    "PunctType_qest ": PunctType_qest,  # U,
    +    "PunctType_excl ": PunctType_excl,  # U,
    +    "PunctType_quot ": PunctType_quot,  # U,
    +    "PunctType_brck ": PunctType_brck,  # U,
    +    "PunctType_comm ": PunctType_comm,  # U,
    +    "PunctType_colo ": PunctType_colo,  # U,
    +    "PunctType_semi ": PunctType_semi,  # U,
    +    "PunctType_dash ": PunctType_dash,  # U,
    +    "Style_arch ": Style_arch,  # cz, fi, U,
    +    "Style_rare ": Style_rare,  # cz, fi, U,
    +    "Style_poet ": Style_poet,  # cz, U,
    +    "Style_norm ": Style_norm,  # cz, U,
    +    "Style_coll ": Style_coll,  # cz, U,
    +    "Style_vrnc ": Style_vrnc,  # cz, U,
    +    "Style_sing ": Style_sing,  # cz, U,
    +    "Style_expr ": Style_expr,  # cz, U,
    +    "Style_derg ": Style_derg,  # cz, U,
    +    "Style_vulg ": Style_vulg,  # cz, U,
    +    "Style_yes ": Style_yes,  # fi, U,
    +    "StyleVariant_styleShort ": StyleVariant_styleShort,  # cz,
    +    "StyleVariant_styleBound ": StyleVariant_styleBound,  # cz, sl,
    +    "VerbType_aux ": VerbType_aux,  # U,
    +    "VerbType_cop ": VerbType_cop,  # U,
    +    "VerbType_mod ": VerbType_mod,  # U,
    +    "VerbType_light ": VerbType_light,  # U,
     }
     
     
    diff --git a/spacy/parts_of_speech.pyx b/spacy/parts_of_speech.pyx
    index 38d5959b6..3925a6738 100644
    --- a/spacy/parts_of_speech.pyx
    +++ b/spacy/parts_of_speech.pyx
    @@ -8,7 +8,7 @@ IDS = {
         "ADP": ADP,
         "ADV": ADV,
         "AUX": AUX,
    -    "CONJ": CONJ, # U20
    +    "CONJ": CONJ,  # U20
         "CCONJ": CCONJ,
         "DET": DET,
         "INTJ": INTJ,
    diff --git a/spacy/scorer.py b/spacy/scorer.py
    index 0ecba6d26..673df132c 100644
    --- a/spacy/scorer.py
    +++ b/spacy/scorer.py
    @@ -85,7 +85,6 @@ class Scorer(object):
     
         def score(self, tokens, gold, verbose=False, punct_labels=('p', 'punct')):
             assert len(tokens) == len(gold)
    -
             gold_deps = set()
             gold_tags = set()
             gold_ents = set(tags_to_entities([annot[-1]
    diff --git a/spacy/strings.pyx b/spacy/strings.pyx
    index e6926a75d..647f140bb 100644
    --- a/spacy/strings.pyx
    +++ b/spacy/strings.pyx
    @@ -4,19 +4,15 @@ from __future__ import unicode_literals, absolute_import
     
     cimport cython
     from libc.string cimport memcpy
    -from libc.stdint cimport uint64_t, uint32_t
    -from murmurhash.mrmr cimport hash64, hash32
    -from preshed.maps cimport map_iter, key_t
     from libc.stdint cimport uint32_t
    +from murmurhash.mrmr cimport hash64, hash32
     import ujson
    -import dill
     
     from .symbols import IDS as SYMBOLS_BY_STR
     from .symbols import NAMES as SYMBOLS_BY_INT
    -
     from .typedefs cimport hash_t
    -from . import util
     from .compat import json_dumps
    +from . import util
     
     
     cpdef hash_t hash_string(unicode string) except 0:
    @@ -195,7 +191,7 @@ cdef class StringStore:
             """Save the current state to a directory.
     
             path (unicode or Path): A path to a directory, which will be created if
    -            it doesn't exist. Paths may be either strings or `Path`-like objects.
    +            it doesn't exist. Paths may be either strings or Path-like objects.
             """
             path = util.ensure_path(path)
             strings = list(self)
    @@ -225,7 +221,7 @@ cdef class StringStore:
             **exclude: Named attributes to prevent from being serialized.
             RETURNS (bytes): The serialized form of the `StringStore` object.
             """
    -        return ujson.dumps(list(self))
    +        return json_dumps(list(self))
     
         def from_bytes(self, bytes_data, **exclude):
             """Load state from a binary string.
    diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx
    index 0e0337b6e..56422771a 100644
    --- a/spacy/symbols.pyx
    +++ b/spacy/symbols.pyx
    @@ -1,8 +1,8 @@
     # coding: utf8
     #cython: optimize.unpack_method_calls=False
    -
     from __future__ import unicode_literals
     
    +
     IDS = {
         "": NIL,
         "IS_ALPHA": IS_ALPHA,
    @@ -464,9 +464,11 @@ IDS = {
         "LAW": LAW
     }
     
    +
     def sort_nums(x):
         return x[1]
     
    +
     NAMES = [it[0] for it in sorted(IDS.items(), key=sort_nums)]
     # Unfortunate hack here, to work around problem with long cpdef enum
     # (which is generating an enormous amount of C++ in Cython 0.24+)
    diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx
    index e865c60dd..ef31a5d5c 100644
    --- a/spacy/tokenizer.pyx
    +++ b/spacy/tokenizer.pyx
    @@ -8,12 +8,11 @@ from cython.operator cimport preincrement as preinc
     from cymem.cymem cimport Pool
     from preshed.maps cimport PreshMap
     import regex as re
    -
    -from .strings cimport hash_string
    -from . import util
     cimport cython
     
     from .tokens.doc cimport Doc
    +from .strings cimport hash_string
    +from . import util
     
     
     cdef class Tokenizer:
    @@ -21,7 +20,7 @@ cdef class Tokenizer:
         boundaries.
         """
         def __init__(self, Vocab vocab, rules=None, prefix_search=None,
    -            suffix_search=None, infix_finditer=None, token_match=None):
    +                 suffix_search=None, infix_finditer=None, token_match=None):
             """Create a `Tokenizer`, to create `Doc` objects given unicode text.
     
             vocab (Vocab): A storage container for lexical types.
    @@ -74,9 +73,8 @@ cdef class Tokenizer:
             RETURNS (Doc): A container for linguistic annotations.
             """
             if len(string) >= (2 ** 30):
    -            raise ValueError(
    -                "String is too long: %d characters. Max is 2**30." % len(string)
    -            )
    +            msg = "String is too long: %d characters. Max is 2**30."
    +            raise ValueError(msg % len(string))
             cdef int length = len(string)
             cdef Doc doc = Doc(self.vocab)
             if length == 0:
    @@ -122,8 +120,8 @@ cdef class Tokenizer:
             """Tokenize a stream of texts.
     
             texts: A sequence of unicode texts.
    -        batch_size (int): The number of texts to accumulate in an internal buffer.
    -        n_threads (int): The number of threads to use, if the implementation
    +        batch_size (int): Number of texts to accumulate in an internal buffer.
    +        n_threads (int): Number of threads to use, if the implementation
                 supports multi-threading. The default tokenizer is single-threaded.
             YIELDS (Doc): A sequence of Doc objects, in order.
             """
    @@ -232,8 +230,8 @@ cdef class Tokenizer:
                     if not matches:
                         tokens.push_back(self.vocab.get(tokens.mem, string), False)
                     else:
    -                    # let's say we have dyn-o-mite-dave
    -                    # the regex finds the start and end positions of the hyphens
    +                    # let's say we have dyn-o-mite-dave - the regex finds the
    +                    # start and end positions of the hyphens
                         start = 0
                         for match in matches:
                             infix_start = match.start()
    @@ -293,8 +291,8 @@ cdef class Tokenizer:
             return list(self.infix_finditer(string))
     
         def find_prefix(self, unicode string):
    -        """Find the length of a prefix that should be segmented from the string,
    -        or None if no prefix rules match.
    +        """Find the length of a prefix that should be segmented from the
    +        string, or None if no prefix rules match.
     
             string (unicode): The string to segment.
             RETURNS (int): The length of the prefix if present, otherwise `None`.
    @@ -305,8 +303,8 @@ cdef class Tokenizer:
             return (match.end() - match.start()) if match is not None else 0
     
         def find_suffix(self, unicode string):
    -        """Find the length of a suffix that should be segmented from the string,
    -        or None if no suffix rules match.
    +        """Find the length of a suffix that should be segmented from the
    +        string, or None if no suffix rules match.
     
             string (unicode): The string to segment.
             Returns (int): The length of the suffix if present, otherwise `None`.
    @@ -326,8 +324,8 @@ cdef class Tokenizer:
     
             string (unicode): The string to specially tokenize.
             token_attrs (iterable): A sequence of dicts, where each dict describes
    -            a token and its attributes. The `ORTH` fields of the attributes must
    -            exactly match the string when they are concatenated.
    +            a token and its attributes. The `ORTH` fields of the attributes
    +            must exactly match the string when they are concatenated.
             """
             substrings = list(substrings)
             cached = <_Cached*>self.mem.alloc(1, sizeof(_Cached))
    @@ -343,7 +341,7 @@ cdef class Tokenizer:
             """Save the current state to a directory.
     
             path (unicode or Path): A path to a directory, which will be created if
    -            it doesn't exist. Paths may be either strings or `Path`-like objects.
    +            it doesn't exist. Paths may be either strings or Path-like objects.
             """
             with path.open('wb') as file_:
                 file_.write(self.to_bytes(**exclude))
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 2ef1d1b82..efe511089 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -476,7 +476,7 @@ cdef class Span:
             """
             # TODO: implement
             def __get__(self):
    -            raise NotImplementedError()
    +            raise NotImplementedError
     
         property n_rights:
             """RETURNS (int): The number of rightward immediate children of the
    @@ -484,7 +484,7 @@ cdef class Span:
             """
             # TODO: implement
             def __get__(self):
    -            raise NotImplementedError()
    +            raise NotImplementedError
     
         property subtree:
             """Tokens that descend from tokens in the span, but fall outside it.
    diff --git a/spacy/typedefs.pyx b/spacy/typedefs.pyx
    index 8b1378917..e69de29bb 100644
    --- a/spacy/typedefs.pyx
    +++ b/spacy/typedefs.pyx
    @@ -1 +0,0 @@
    -
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index 2eace9931..8b09d7ee7 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -17,8 +17,8 @@ from .compat import copy_reg, basestring_
     from .lemmatizer import Lemmatizer
     from .attrs import intify_attrs
     from .vectors import Vectors
    -from . import util
     from ._ml import link_vectors_to_models
    +from . import util
     
     
     cdef class Vocab:
    
    From fb0c96f39a1c3f8a2cec8844effab950c6503088 Mon Sep 17 00:00:00 2001
    From: Explosion Bot 
    Date: Sat, 28 Oct 2017 11:58:16 +0200
    Subject: [PATCH 592/649] Fix optimizer loading
    
    ---
     spacy/language.py | 5 ++---
     1 file changed, 2 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 1b52829b6..959fee916 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -379,8 +379,7 @@ class Language(object):
                 return
             if sgd is None:
                 if self._optimizer is None:
    -                self._optimizer = Optimizer(Model.ops, 0.001,
    -                                            beta1=0.9, beta2=0.0, nesterov=True)
    +                self._optimizer = Adam(Model.ops, 0.001)
                 sgd = self._optimizer
             grads = {}
             def get_grads(W, dW, key=None):
    @@ -422,7 +421,7 @@ class Language(object):
             L2 = util.env_opt('L2_penalty', 1e-6)
             max_grad_norm = util.env_opt('grad_norm_clip', 1.)
             self._optimizer = Optimizer(Model.ops, learn_rate, L2=L2, beta1=beta1,
    -                                    beta2=beta2, eps=eps, nesterov=True)
    +                                    beta2=beta2, eps=eps)
             self._optimizer.max_grad_norm = max_grad_norm
             self._optimizer.device = device
             return self._optimizer
    
    From df4803cc6deedbbb19eff179f46a058753b95b98 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 28 Oct 2017 16:45:14 +0000
    Subject: [PATCH 593/649] Add learned missing values for parser
    
    ---
     spacy/_ml.py | 26 +++++++++++++++++++++-----
     1 file changed, 21 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index de89e04d0..c956de601 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -88,7 +88,11 @@ def _preprocess_doc(docs, drop=0.):
             lambda obj: (obj.nF, obj.nO, obj.nP, obj.nI)),
         b=Biases("Bias vector",
             lambda obj: (obj.nO, obj.nP)),
    +    pad=Synapses("Pad",
    +        lambda obj: (1, obj.nF, obj.nO, obj.nP),
    +        lambda M, ops: ops.normal_init(M, 1.)),
         d_W=Gradient("W"),
    +    d_pad=Gradient("pad"),
         d_b=Gradient("b"))
     class PrecomputableAffine(Model):
         def __init__(self, nO=None, nI=None, nF=None, nP=None, **kwargs):
    @@ -99,13 +103,14 @@ class PrecomputableAffine(Model):
             self.nF = nF
     
         def begin_update(self, X, drop=0.):
    -        Yf = self.ops.dot(X,
    -                 self.W.reshape((self.nF*self.nO*self.nP, self.nI)).T)
    - 
    -        Yf = Yf.reshape((X.shape[0], self.nF, self.nO, self.nP))
    +        Yf = self.ops.xp.dot(X,
    +            self.W.reshape((self.nF*self.nO*self.nP, self.nI)).T)
    +        Yf = Yf.reshape((Yf.shape[0], self.nF, self.nO, self.nP))
    +        Yf = self._add_padding(Yf)
     
             def backward(dY_ids, sgd=None):
                 dY, ids = dY_ids
    +            dY, ids = self._backprop_padding(dY, ids)
                 Xf = X[ids]
                 Xf = Xf.reshape((Xf.shape[0], self.nF * self.nI))
     
    @@ -116,7 +121,7 @@ class PrecomputableAffine(Model):
                 Wopfi = self.ops.xp.ascontiguousarray(Wopfi)
                 Wopfi = Wopfi.reshape((self.nO*self.nP, self.nF * self.nI))
                 dXf = self.ops.dot(dY.reshape((dY.shape[0], self.nO*self.nP)), Wopfi)
    -            
    +
                 # Reuse the buffer
                 dWopfi = Wopfi; dWopfi.fill(0.)
                 self.ops.xp.dot(dY.T, Xf, out=dWopfi)
    @@ -128,6 +133,17 @@ class PrecomputableAffine(Model):
                     sgd(self._mem.weights, self._mem.gradient, key=self.id)
                 return dXf.reshape((dXf.shape[0], self.nF, self.nI))
             return Yf, backward
    +    
    +    def _add_padding(self, Yf):
    +        Yf_padded = self.ops.xp.vstack((self.pad, Yf))
    +        return Yf_padded[1:]
    +
    +    def _backprop_padding(self, dY, ids):
    +        for i in range(ids.shape[0]):
    +            for j in range(ids.shape[1]):
    +                if ids[i, j] < 0:
    +                    self.d_pad[0, j] += dY[i, j]
    +        return dY, ids
     
         @staticmethod
         def init_weights(model):
    
    From 5414e2f14b7c0dbcbcec08b1d7a101c5521491e7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 28 Oct 2017 16:45:54 +0000
    Subject: [PATCH 594/649] Use missing features in parser
    
    ---
     spacy/syntax/nn_parser.pyx | 8 +++++---
     1 file changed, 5 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 1aa4443d0..558e88b3e 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -157,12 +157,14 @@ cdef void sum_state_features(float* output,
             const float* cached, const int* token_ids, int B, int F, int O) nogil:
         cdef int idx, b, f, i
         cdef const float* feature
    +    padding = cached - (F * O)
         for b in range(B):
             for f in range(F):
                 if token_ids[f] < 0:
    -                continue
    -            idx = token_ids[f] * F * O + f*O
    -            feature = &cached[idx]
    +                feature = &padding[f*O]
    +            else:
    +                idx = token_ids[f] * F * O + f*O
    +                feature = &cached[idx]
                 for i in range(O):
                     output[i] += feature[i]
             output += O
    
    From 6ef72864fa23199a837e9197db8005f059255cce Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 28 Oct 2017 17:05:01 +0000
    Subject: [PATCH 595/649] Improve initialization for hidden layers
    
    ---
     spacy/_ml.py | 16 ++++++++++------
     1 file changed, 10 insertions(+), 6 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index c956de601..018589537 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -166,14 +166,18 @@ class PrecomputableAffine(Model):
                         size=tokvecs.size).reshape(tokvecs.shape)
     
             def predict(ids, tokvecs):
    -            hiddens = model(tokvecs) # (b, f, o, p)
    -            vector = model.ops.allocate((hiddens.shape[0], model.nO, model.nP))
    -            model.ops.xp.add.at(vector, ids, hiddens)
    -            vector += model.b
    +            # nS ids. nW tokvecs
    +            hiddens = model(tokvecs) # (nW, f, o, p)
    +            # need nS vectors
    +            vectors = model.ops.allocate((ids.shape[0], model.nO, model.nP))
    +            for i, feats in enumerate(ids):
    +                for j, id_ in enumerate(feats):
    +                    vectors[i] += hiddens[id_, j]
    +            vectors += model.b
                 if model.nP >= 2:
    -                return model.ops.maxout(vector)[0]
    +                return model.ops.maxout(vectors)[0]
                 else:
    -                return vector * (vector >= 0)
    +                return vectors * (vectors >= 0)
     
             tol_var = 0.01
             tol_mean = 0.01
    
    From 3b910973213fb2d7d99be52e772561e980dd7b0c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 28 Oct 2017 17:05:11 +0000
    Subject: [PATCH 596/649] Whitespace
    
    ---
     spacy/_ml.py | 6 ++++--
     1 file changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 018589537..c99f840b7 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -241,9 +241,11 @@ def Tok2Vec(width, embed_size, **kwargs):
     
             tok2vec = (
                 FeatureExtracter(cols)
    -            >> with_flatten(embed >> (convolution ** 4), pad=4)
    +            >> with_flatten(
    +                embed
    +                >> convolution ** 4, pad=4
    +            )
             )
    -
             # Work around thinc API limitations :(. TODO: Revise in Thinc 7
             tok2vec.nO = width
             tok2vec.embed = embed
    
    From 314f5b9cdbcbaa0d188bd1a21402d6cfd890b534 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 28 Oct 2017 18:20:10 +0000
    Subject: [PATCH 597/649] Require thinc 6.10.0
    
    ---
     requirements.txt | 2 +-
     setup.py         | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/requirements.txt b/requirements.txt
    index 0b46b38d5..01e41c993 100644
    --- a/requirements.txt
    +++ b/requirements.txt
    @@ -3,7 +3,7 @@ pathlib
     numpy>=1.7
     cymem>=1.30,<1.32
     preshed>=1.0.0,<2.0.0
    -thinc>=6.9.0,<6.10.0
    +thinc>=6.10.0,<6.11.0
     murmurhash>=0.28,<0.29
     plac<1.0.0,>=0.9.6
     six
    diff --git a/setup.py b/setup.py
    index 37bfd0495..727df5e4e 100755
    --- a/setup.py
    +++ b/setup.py
    @@ -190,7 +190,7 @@ def setup_package():
                     'murmurhash>=0.28,<0.29',
                     'cymem>=1.30,<1.32',
                     'preshed>=1.0.0,<2.0.0',
    -                'thinc>=6.9.0,<6.10.0',
    +                'thinc>=6.10.0,<6.11.0',
                     'plac<1.0.0,>=0.9.6',
                     'six',
                     'pathlib',
    
    From b713d10d970a570d61eb553ea8e055974b36c949 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 28 Oct 2017 23:01:14 +0000
    Subject: [PATCH 598/649] Switch to 13 features in parser
    
    ---
     spacy/syntax/nn_parser.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 558e88b3e..e480bd1dc 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -680,7 +680,7 @@ cdef class Parser:
                                            lower, stream, drop=0.0)
             return (tokvecs, bp_tokvecs), state2vec, upper
     
    -    nr_feature = 8
    +    nr_feature = 13
     
         def get_token_ids(self, states):
             cdef StateClass state
    
    From a0c7dabb722d0985e0f53f09561e10092125ae69 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 28 Oct 2017 23:01:35 +0000
    Subject: [PATCH 599/649] Fix bug in 8-token parser features
    
    ---
     spacy/syntax/_state.pxd | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd
    index 803348b53..5470df470 100644
    --- a/spacy/syntax/_state.pxd
    +++ b/spacy/syntax/_state.pxd
    @@ -110,7 +110,7 @@ cdef cppclass StateC:
                 ids[3] = this.S(1)
                 ids[4] = this.H(this.S(0))
                 ids[5] = this.L(this.B(0), 1)
    -            ids[6] = this.L(this.S(0), 2)
    +            ids[6] = this.L(this.S(0), 1)
                 ids[7] = this.R(this.S(0), 1)
             elif n == 13:
                 ids[0] = this.B(0)
    
    From 4a4f9666b2dd68732facff9aff54b1b3235b4234 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 01:14:30 +0200
    Subject: [PATCH 600/649] Improve style/accessibility of yes/no/neutral icons
     (see #1471)
    
    Use distinctive icons instead of only colour, add proper handling of labels (hidden or visible, but always present) with optional custom text.
    ---
     website/_includes/_mixins-base.jade           |  9 ++---
     website/_includes/_svg.jade                   | 10 ++++--
     website/styleguide.jade                       |  2 +-
     .../_facts-figures/_feature-comparison.jade   | 36 +++++++++----------
     website/usage/_spacy-101/_similarity.jade     | 11 +++---
     website/usage/_training/_basics.jade          | 18 +++++-----
     .../_vectors-similarity/_in-context.jade      | 16 +++++----
     website/usage/spacy-101.jade                  | 22 ++++++------
     8 files changed, 67 insertions(+), 57 deletions(-)
    
    diff --git a/website/_includes/_mixins-base.jade b/website/_includes/_mixins-base.jade
    index 752423d79..31bb641cd 100644
    --- a/website/_includes/_mixins-base.jade
    +++ b/website/_includes/_mixins-base.jade
    @@ -45,10 +45,11 @@ mixin icon(name, width, height)
         icon - [string] "pro", "con" or "neutral" (default: "neutral")
         size - [integer] icon size (optional)
     
    -mixin procon(icon, size)
    -    - colors = { pro: "green", con: "red", neutral: "subtle" }
    -    +icon("circle", size || 16)(class="u-color-#{colors[icon] || 'subtle'}" aria-label=icon)&attributes(attributes)
    -
    +mixin procon(icon, label, show_label, size)
    +    - var colors = { yes: "green", no: "red", neutral: "subtle" }
    +    span.u-nowrap
    +        +icon(icon, size || 20)(class="u-color-#{colors[icon] || 'subtle'}").o-icon--inline&attributes(attributes)
    +        span.u-text-small(class=show_label ? null : "u-hidden")=(label || icon)
     
     //- Headlines Helper Mixin
         level - [integer] 1, 2, 3, 4, or 5
    diff --git a/website/_includes/_svg.jade b/website/_includes/_svg.jade
    index f9d7a2b53..144f9dc1a 100644
    --- a/website/_includes/_svg.jade
    +++ b/website/_includes/_svg.jade
    @@ -16,8 +16,14 @@ svg(style="position: absolute; visibility: hidden; width: 0; height: 0;" width="
             symbol#svg_book(viewBox="0 0 20 20")
                 path(d="M15.5 11h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM15.5 7h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM10.5 15h-6c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h6c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM15.5 3h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5z")
     
    -        symbol#svg_circle(viewBox="0 0 18 18")
    -            ellipse(rx="9" ry="9" cx="9" cy="9")
    +        symbol#svg_yes(viewBox="0 0 24 24")
    +            path(d="M9.984 17.016l9-9-1.406-1.453-7.594 7.594-3.563-3.563-1.406 1.406zM12 2.016c5.531 0 9.984 4.453 9.984 9.984s-4.453 9.984-9.984 9.984-9.984-4.453-9.984-9.984 4.453-9.984 9.984-9.984z")
    +
    +        symbol#svg_no(viewBox="0 0 24 24")
    +            path(d="M17.016 15.609l-3.609-3.609 3.609-3.609-1.406-1.406-3.609 3.609-3.609-3.609-1.406 1.406 3.609 3.609-3.609 3.609 1.406 1.406 3.609-3.609 3.609 3.609zM12 2.016c5.531 0 9.984 4.453 9.984 9.984s-4.453 9.984-9.984 9.984-9.984-4.453-9.984-9.984 4.453-9.984 9.984-9.984z")
    +
    +        symbol#svg_neutral(viewBox="0 0 24 24")
    +            path(d="M12 2.016c5.531 0 9.984 4.453 9.984 9.984s-4.453 9.984-9.984 9.984-9.984-4.453-9.984-9.984 4.453-9.984 9.984-9.984z")
     
             symbol#svg_chat(viewBox="0 0 30 30")
                 path(d="M28.74 25.2c-1.73-.3-3.77-1.46-4.74-3.6 3.64-2.2 6-5.68 6-9.6 0-6.63-6.72-12-15-12S0 5.37 0 12s6.72 12 15 12c1.1 0 2.2-.1 3.23-.3 2.86 2 6.25 2.62 10.4 2.15.26-.02.37-.15.37-.32 0-.16-.1-.3-.26-.32zM23 14c0 .55-.45 1-1 1H8c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1zm0-4c0 .55-.45 1-1 1H8c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1z")
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    index 42e70ed73..638e1aed1 100644
    --- a/website/styleguide.jade
    +++ b/website/styleguide.jade
    @@ -145,7 +145,7 @@ include _includes/_mixins
             |  mixin, using their name and an optional size value in #[code px].
     
         +infobox.u-text-center
    -        each icon in ["code", "arrow-right", "book", "circle", "chat", "star", "help", "accept", "reject", "markdown", "course", "github", "jupyter"]
    +        each icon in ["code", "arrow-right", "book", "chat", "star", "help_o", "help", "yes", "no", "neutral", "accept", "reject", "markdown", "course", "github", "jupyter"]
                 .u-inline-block.u-padding-small.u-color-dark(data-tooltip=icon data-tooltip-style="code" aria-label=icon)
                     +icon(icon, 20)
     
    diff --git a/website/usage/_facts-figures/_feature-comparison.jade b/website/usage/_facts-figures/_feature-comparison.jade
    index c8fa5ffbe..3f970f16c 100644
    --- a/website/usage/_facts-figures/_feature-comparison.jade
    +++ b/website/usage/_facts-figures/_feature-comparison.jade
    @@ -14,45 +14,45 @@ p
     
         +row
             +cell Neural network models
    -            each icon in ["pro", "pro", "con", "pro"]
    -                +cell.u-text-center #[+procon(icon)]
    +            each answer in ["yes", "yes", "no", "yes"]
    +                +cell.u-text-center #[+procon(answer)]
     
         +row
             +cell Integrated word vectors
    -        each icon in ["pro", "con", "con", "con"]
    -            +cell.u-text-center #[+procon(icon)]
    +        each answer in ["yes", "no", "no", "no"]
    +            +cell.u-text-center #[+procon(answer)]
     
         +row
             +cell Multi-language support
    -        each icon in ["pro", "pro", "pro", "pro"]
    -            +cell.u-text-center #[+procon(icon)]
    +        each answer in ["yes", "yes", "yes", "yes"]
    +            +cell.u-text-center #[+procon(answer)]
     
         +row
             +cell Tokenization
    -        each icon in ["pro", "pro", "pro", "pro"]
    -            +cell.u-text-center #[+procon(icon)]
    +        each answer in ["yes", "yes", "yes", "yes"]
    +            +cell.u-text-center #[+procon(answer)]
     
         +row
             +cell Part-of-speech tagging
    -        each icon in ["pro", "pro", "pro", "pro"]
    -            +cell.u-text-center #[+procon(icon)]
    +        each answer in ["yes", "yes", "yes", "yes"]
    +            +cell.u-text-center #[+procon(answer)]
     
         +row
             +cell Sentence segmentation
    -        each icon in ["pro", "pro", "pro", "pro"]
    -            +cell.u-text-center #[+procon(icon)]
    +        each answer in ["yes", "yes", "yes", "yes"]
    +            +cell.u-text-center #[+procon(answer)]
     
         +row
             +cell Dependency parsing
    -        each icon in ["pro", "pro", "con", "pro"]
    -            +cell.u-text-center #[+procon(icon)]
    +        each answer in ["yes", "yes", "no", "yes"]
    +            +cell.u-text-center #[+procon(answer)]
     
         +row
             +cell Entity recognition
    -        each icon in ["pro", "con", "pro", "pro"]
    -            +cell.u-text-center #[+procon(icon)]
    +        each answer in ["yes", "no", "yes", "yes"]
    +            +cell.u-text-center #[+procon(answer)]
     
         +row
             +cell Coreference resolution
    -        each icon in ["con", "con", "con", "pro"]
    -            +cell.u-text-center #[+procon(icon)]
    +        each answer in ["no", "no", "no", "yes"]
    +            +cell.u-text-center #[+procon(answer)]
    diff --git a/website/usage/_spacy-101/_similarity.jade b/website/usage/_spacy-101/_similarity.jade
    index e8ce692f0..cb3611f92 100644
    --- a/website/usage/_spacy-101/_similarity.jade
    +++ b/website/usage/_spacy-101/_similarity.jade
    @@ -24,17 +24,18 @@ p
                 print(token1.similarity(token2))
     
     +aside
    -    |  #[strong #[+procon("neutral", 16)] similarity:] identical#[br]
    -    |  #[strong #[+procon("pro", 16)] similarity:] similar (higher is more similar) #[br]
    -    |  #[strong #[+procon("con", 16)] similarity:] dissimilar (lower is less similar)
    +    |  #[strong #[+procon("neutral", "identical", false, 16)] similarity:] identical#[br]
    +    |  #[strong #[+procon("yes", "similar", false, 16)] similarity:] similar (higher is more similar) #[br]
    +    |  #[strong #[+procon("no", "dissimilar", false, 16)] similarity:] dissimilar (lower is less similar)
     
     +table(["", "dog", "cat", "banana"])
         each cells, label in {"dog": [1, 0.8, 0.24], "cat": [0.8, 1, 0.28], "banana": [0.24, 0.28, 1]}
             +row
                 +cell.u-text-label.u-color-theme=label
                 for cell in cells
    -                +cell.u-text-center #[code=cell.toFixed(2)]
    -                    |  #[+procon(cell < 0.5 ? "con" : cell != 1 ? "pro" : "neutral")]
    +                +cell.u-text-center
    +                    - var result = cell < 0.5 ? ["yes", "similar"] : cell != 1 ? ["no", "dissimilar"] : ["neutral", "identical"]
    +                    |  #[code=cell.toFixed(2)] #[+procon(...result)]
     
     p
         |  In this case, the model's predictions are pretty on point. A dog is very
    diff --git a/website/usage/_training/_basics.jade b/website/usage/_training/_basics.jade
    index 05e67c2c1..77df3c433 100644
    --- a/website/usage/_training/_basics.jade
    +++ b/website/usage/_training/_basics.jade
    @@ -30,15 +30,15 @@ p
     +table(["Text", "Entity", "Start", "End", "Label", ""])
         - var style = [0, 0, 1, 1, 1]
         +annotation-row(["Uber blew through $1 million a week", "Uber", 0, 4, "ORG"], style)
    -        +cell #[+procon("pro")]
    +        +cell #[+procon("yes", "right", true)]
         +annotation-row(["Android Pay expands to Canada", "Android", 0, 7, "PERSON"], style)
    -        +cell #[+procon("con")]
    +        +cell #[+procon("no", "wrong", true)]
         +annotation-row(["Android Pay expands to Canada", "Canada", 23, 30, "GPE"], style)
    -        +cell #[+procon("pro")]
    +        +cell #[+procon("yes", "right", true)]
         +annotation-row(["Spotify steps up Asia expansion", "Spotify", 0, 8, "ORG"], style)
    -        +cell #[+procon("pro")]
    +        +cell #[+procon("yes", "right", true)]
         +annotation-row(["Spotify steps up Asia expansion", "Asia", 17, 21, "NORP"], style)
    -        +cell #[+procon("con")]
    +        +cell #[+procon("no", "wrong", true)]
     
     p
         |  Alternatively, the
    @@ -50,13 +50,13 @@ p
     +table(["Text", "Entity", "Start", "End", "Label", ""])
         - var style = [0, 0, 1, 1, 1]
         +annotation-row(["let me google this for you", "google", 7, 13, "ORG"], style)
    -        +cell #[+procon("con")]
    +        +cell #[+procon("no", "wrong", true)]
         +annotation-row(["Google Maps launches location sharing", "Google", 0, 6, "ORG"], style)
    -        +cell #[+procon("con")]
    +        +cell #[+procon("no", "wrong", true)]
         +annotation-row(["Google rebrands its business apps", "Google", 0, 6, "ORG"], style)
    -        +cell #[+procon("pro")]
    +        +cell #[+procon("yes", "right", true)]
         +annotation-row(["look what i found on google! 😂", "google", 21, 27, "ORG"], style)
    -        +cell #[+procon("con")]
    +        +cell #[+procon("no", "wrong", true)]
     
     p
         |  Based on the few examples above, you can already create six training
    diff --git a/website/usage/_vectors-similarity/_in-context.jade b/website/usage/_vectors-similarity/_in-context.jade
    index d8e864d9d..6d4fb8b3d 100644
    --- a/website/usage/_vectors-similarity/_in-context.jade
    +++ b/website/usage/_vectors-similarity/_in-context.jade
    @@ -36,15 +36,15 @@ p
     +table(["Context", "labrador.similarity(dog)"])
         +row
             +cell The #[strong labrador] barked.
    -        +cell #[code 0.56] #[+procon("pro")]
    +        +cell #[code 0.56] #[+procon("yes", "similar")]
     
         +row
             +cell The #[strong labrador] swam.
    -        +cell #[code 0.48] #[+procon("con")]
    +        +cell #[code 0.48] #[+procon("no", "dissimilar")]
     
         +row
             +cell the #[strong labrador] people live in canada.
    -        +cell #[code 0.39] #[+procon("con")]
    +        +cell #[code 0.39] #[+procon("no", "dissimilar")]
     
     p
         |  The same also works for whole documents. Here, the variance of the
    @@ -81,8 +81,9 @@ p
             +row(counter ? null : "divider")
                 +cell=label
                 for cell in cells
    -                +cell.u-text-center #[code=cell.toFixed(2)]
    -                    |  #[+procon(cell < 0.7 ? "con" : cell != 1 ? "pro" : "neutral")]
    +                +cell.u-text-center
    +                    - var result = cell < 0.7 ? ["no", "dissimilar"] : cell != 1 ? ["yes", "similar"] : ["neutral", "identical"]
    +                    |  #[code=cell.toFixed(2)] #[+procon(...result)]
             - counter++
     
     p
    @@ -117,6 +118,7 @@ p
             +row(counter ? null : "divider")
                 +cell=label
                 for cell in cells
    -                +cell.u-text-center #[code=cell.toFixed(2)]
    -                    |  #[+procon(cell < 0.7 ? "con" : cell != 1 ? "pro" : "neutral")]
    +                +cell.u-text-center
    +                    - var result = cell < 0.7 ? ["no", "dissimilar"] : cell != 1 ? ["yes", "similar"] : ["neutral", "identical"]
    +                    |  #[code=cell.toFixed(2)] #[+procon(...result)]
             - counter++
    diff --git a/website/usage/spacy-101.jade b/website/usage/spacy-101.jade
    index 3b75202f7..8a2741e71 100644
    --- a/website/usage/spacy-101.jade
    +++ b/website/usage/spacy-101.jade
    @@ -99,69 +99,69 @@ p
             +row
                 +cell #[strong Tokenization]
                 +cell Segmenting text into words, punctuations marks etc.
    -            +cell #[+procon("con")]
    +            +cell #[+procon("no", "no", true)]
     
             +row
                 +cell #[strong Part-of-speech] (POS) #[strong Tagging]
                 +cell Assigning word types to tokens, like verb or noun.
    -            +cell #[+procon("pro")]
    +            +cell #[+procon("yes", "yes", true)]
     
             +row
                 +cell #[strong Dependency Parsing]
                 +cell
                     |  Assigning syntactic dependency labels, describing the
                     |  relations between individual tokens, like subject or object.
    -            +cell #[+procon("pro")]
    +            +cell #[+procon("yes", "yes", true)]
     
             +row
                 +cell #[strong Lemmatization]
                 +cell
                     |  Assigning the base forms of words. For example, the lemma of
                     |  "was" is "be", and the lemma of "rats" is "rat".
    -            +cell #[+procon("pro")]
    +            +cell #[+procon("no", "no", true)]
     
             +row
                 +cell #[strong Sentence Boundary Detection] (SBD)
                 +cell Finding and segmenting individual sentences.
    -            +cell #[+procon("pro")]
    +            +cell #[+procon("yes", "yes", true)]
     
             +row
                 +cell #[strong Named Entity Recongition] (NER)
                 +cell
                     |  Labelling named "real-world" objects, like persons, companies
                     |  or locations.
    -            +cell #[+procon("pro")]
    +            +cell #[+procon("yes", "yes", true)]
     
             +row
                 +cell #[strong Similarity]
                 +cell
                     |  Comparing words, text spans and documents and how similar
                     |  they are to each other.
    -            +cell #[+procon("pro")]
    +            +cell #[+procon("yes", "yes", true)]
     
             +row
                 +cell #[strong Text Classification]
                 +cell
                     |  Assigning categories or labels to a whole document, or parts
                     |  of a document.
    -            +cell #[+procon("pro")]
    +            +cell #[+procon("yes", "yes", true)]
     
             +row
                 +cell #[strong Rule-based Matching]
                 +cell
                     |  Finding sequences of tokens based on their texts and
                     |  linguistic annotations, similar to regular expressions.
    -            +cell #[+procon("con")]
    +            +cell #[+procon("no", "no", true)]
     
             +row
                 +cell #[strong Training]
                 +cell Updating and improving a statistical model's predictions.
    -            +cell #[+procon("neutral")]
    +            +cell #[+procon("no", "no", true)]
     
             +row
                 +cell #[strong Serialization]
                 +cell Saving objects to files or byte strings.
    -            +cell #[+procon("neutral")]
    +            +cell #[+procon("no", "no", true)]
     
         +h(2, "annotations") Linguistic annotations
     
    
    From 53bfcdba31956a6501f2ec327ea786dd37ba950a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 01:17:49 +0200
    Subject: [PATCH 601/649] Make tooltips/tags and old/new code blocks more
     accessible (see #(see #1471))
    
    Always add tooltip text as hidden label. Use different tooltip icons for tags and inline help icons. Add labels to old/new code blocks and add option to customise label text.
    ---
     website/_includes/_mixins.jade         | 38 ++++++++++++++++----------
     website/_includes/_svg.jade            |  7 +++--
     website/assets/css/_base/_objects.sass |  4 +++
     3 files changed, 33 insertions(+), 16 deletions(-)
    
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 692b47887..5dace47e0 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -58,7 +58,9 @@ mixin api(path)
     
     mixin help(tooltip, icon_size)
         span(data-tooltip=tooltip)&attributes(attributes)
    -        +icon("help", icon_size || 16).o-icon--inline
    +        if tooltip
    +            span.u-hidden(aria-role="tooltip")=tooltip
    +        +icon("help_o", icon_size || 16).o-icon--inline
     
     
     //- Aside for text
    @@ -147,18 +149,23 @@ mixin code(label, language, prompt, height, icon, wrap)
                 block
     
     
    -//- Code blocks to display old/new versions
    +//- Wrapper for code blocks to display old/new versions
     
     mixin code-wrapper()
         span.u-inline-block.u-padding-top.u-width-full
             block
     
    -mixin code-old()
    -    +code(false, false, false, false, "reject").o-block-small
    +//- Code blocks to display old/new versions
    +    label - [string] ARIA label for block. Defaults to "correct"/"incorrect".
    +
    +mixin code-old(label)
    +    - var label = label || 'incorrect'
    +    +code(false, false, false, false, "reject").o-block-small(aria-label=label)
             block
     
    -mixin code-new()
    -    +code(false, false, false, false, "accept").o-block-small
    +mixin code-new(label)
    +    - var label = label || 'correct'
    +    +code(false, false, false, false, "accept").o-block-small(aria-label=label)
             block
     
     
    @@ -244,10 +251,16 @@ mixin label-inline()
     
     
     //- Tag
    +    tooltip   - [string] optional tooltip text.
    +    hide_icon - [boolean] hide tooltip icon
     
    -mixin tag()
    -    span.u-text-tag.u-text-tag--spaced(aria-hidden="true")&attributes(attributes)
    +mixin tag(tooltip, hide_icon)
    +    div.u-text-tag.u-text-tag--spaced(data-tooltip=tooltip)&attributes(attributes)
             block
    +        if tooltip
    +            if !hide_icon
    +                |  #[+icon("help", 12).o-icon--tag]
    +            |  #[span.u-hidden(aria-role="tooltip")=tooltip]
     
     
     //- "Requires model" tag with tooltip and list of capabilities
    @@ -256,10 +269,7 @@ mixin tag()
     mixin tag-model(...capabs)
         - var intro = "To use this functionality, spaCy needs a model to be installed"
         - var ext = capabs.length ? " that supports the following capabilities: " + capabs.join(', ') : ""
    -
    -    span.u-nowrap
    -        +tag Needs model
    -        +help(intro + ext + ".").u-color-theme
    +    +tag(intro + ext + ".") Needs model
     
     
     //- "New" tag to label features new in a specific version
    @@ -269,8 +279,8 @@ mixin tag-model(...capabs)
     
     mixin tag-new(version)
         - var version = (typeof version == 'number') ? version.toFixed(1) : version
    -    +tag(data-tooltip="This feature is new and was introduced in spaCy v#{version}.")
    -        | v#{version}
    +    - var tooltip = "This feature is new and was introduced in spaCy v" + version
    +    +tag(tooltip, true) v#{version}
     
     
     //- List
    diff --git a/website/_includes/_svg.jade b/website/_includes/_svg.jade
    index 144f9dc1a..0f7266c0a 100644
    --- a/website/_includes/_svg.jade
    +++ b/website/_includes/_svg.jade
    @@ -31,8 +31,11 @@ svg(style="position: absolute; visibility: hidden; width: 0; height: 0;" width="
             symbol#svg_star(viewBox="0 0 24 24")
                 path(d="M12 17.25l-6.188 3.75 1.641-7.031-5.438-4.734 7.172-0.609 2.813-6.609 2.813 6.609 7.172 0.609-5.438 4.734 1.641 7.031z")
     
    -        symbol#svg_help(viewBox="0 0 24 24")
    -            path(d="M12 6c2.203 0 3.984 1.781 3.984 3.984 0 2.484-3 2.766-3 5.016h-1.969c0-3.234 3-3 3-5.016 0-1.078-0.938-1.969-2.016-1.969s-2.016 0.891-2.016 1.969h-1.969c0-2.203 1.781-3.984 3.984-3.984zM12 20.016c4.406 0 8.016-3.609 8.016-8.016s-3.609-8.016-8.016-8.016-8.016 3.609-8.016 8.016 3.609 8.016 8.016 8.016zM12 2.016c5.531 0 9.984 4.453 9.984 9.984s-4.453 9.984-9.984 9.984-9.984-4.453-9.984-9.984 4.453-9.984 9.984-9.984zM11.016 18v-2.016h1.969v2.016h-1.969z")
    +        symbol#svg_help(viewBox="0 0 24 28")
    +            path(d="M14 21.5v-3c0-0.281-0.219-0.5-0.5-0.5h-3c-0.281 0-0.5 0.219-0.5 0.5v3c0 0.281 0.219 0.5 0.5 0.5h3c0.281 0 0.5-0.219 0.5-0.5zM18 11c0-2.859-3-5-5.688-5-2.547 0-4.453 1.094-5.797 3.328-0.141 0.219-0.078 0.5 0.125 0.656l2.063 1.563c0.078 0.063 0.187 0.094 0.297 0.094 0.141 0 0.297-0.063 0.391-0.187 0.734-0.938 1.047-1.219 1.344-1.437 0.266-0.187 0.781-0.375 1.344-0.375 1 0 1.922 0.641 1.922 1.328 0 0.812-0.422 1.219-1.375 1.656-1.109 0.5-2.625 1.797-2.625 3.313v0.562c0 0.281 0.219 0.5 0.5 0.5h3c0.281 0 0.5-0.219 0.5-0.5v0c0-0.359 0.453-1.125 1.188-1.547 1.188-0.672 2.812-1.578 2.812-3.953zM24 14c0 6.625-5.375 12-12 12s-12-5.375-12-12 5.375-12 12-12 12 5.375 12 12z")
    +
    +        symbol#svg_help_o(viewBox="0 0 24 28")
    +            path(d="M13.75 18.75v2.5c0 0.281-0.219 0.5-0.5 0.5h-2.5c-0.281 0-0.5-0.219-0.5-0.5v-2.5c0-0.281 0.219-0.5 0.5-0.5h2.5c0.281 0 0.5 0.219 0.5 0.5zM17.75 11c0 2.219-1.547 3.094-2.688 3.734-0.812 0.469-1.313 0.766-1.313 1.266v0.5c0 0.281-0.219 0.5-0.5 0.5h-2.5c-0.281 0-0.5-0.219-0.5-0.5v-1.062c0-1.922 1.375-2.531 2.484-3.031 0.938-0.438 1.516-0.734 1.516-1.437 0-0.906-1.141-1.578-2.172-1.578-0.547 0-1.125 0.172-1.484 0.422-0.344 0.234-0.672 0.578-1.25 1.297-0.094 0.125-0.234 0.187-0.391 0.187-0.109 0-0.219-0.031-0.297-0.094l-1.687-1.281c-0.203-0.156-0.25-0.453-0.109-0.672 1.281-2.016 3.078-3 5.453-3v0c2.562 0 5.437 2.031 5.437 4.75zM12 4c-5.516 0-10 4.484-10 10s4.484 10 10 10 10-4.484 10-10-4.484-10-10-10zM24 14c0 6.625-5.375 12-12 12s-12-5.375-12-12 5.375-12 12-12v0c6.625 0 12 5.375 12 12z")
     
             symbol#svg_reject(viewBox="0 0 24 24")
                 path(d="M18.984 6.422l-5.578 5.578 5.578 5.578-1.406 1.406-5.578-5.578-5.578 5.578-1.406-1.406 5.578-5.578-5.578-5.578 1.406-1.406 5.578 5.578 5.578-5.578z")
    diff --git a/website/assets/css/_base/_objects.sass b/website/assets/css/_base/_objects.sass
    index 8494ee36a..afbf52f8d 100644
    --- a/website/assets/css/_base/_objects.sass
    +++ b/website/assets/css/_base/_objects.sass
    @@ -93,6 +93,10 @@
         &.o-icon--inline
             margin: 0 0.5rem 0 0.1rem
     
    +    &.o-icon--tag
    +        vertical-align: bottom
    +        height: 100%
    +
     .o-emoji
         margin-right: 0.75rem
         vertical-align: text-bottom
    
    From 5147cdc468703312befc0dce812ca2aadb702c95 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 01:18:09 +0200
    Subject: [PATCH 602/649] Fix formatting and add missing v2 label
    
    ---
     website/usage/_spacy-101/_lightning-tour.jade      | 1 +
     website/usage/_spacy-101/_similarity.jade          | 5 ++++-
     website/usage/_vectors-similarity/_in-context.jade | 3 +--
     3 files changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/website/usage/_spacy-101/_lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
    index acc7d5835..acf423c48 100644
    --- a/website/usage/_spacy-101/_lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -105,6 +105,7 @@ p
     
     +h(3, "lightning-tour-displacy") Visualize a dependency parse and named entities in your browser
         +tag-model("dependency parse", "NER")
    +    +tag-new(2)
     
     +aside
         .u-text-center(style="overflow: auto").
    diff --git a/website/usage/_spacy-101/_similarity.jade b/website/usage/_spacy-101/_similarity.jade
    index cb3611f92..74ed98941 100644
    --- a/website/usage/_spacy-101/_similarity.jade
    +++ b/website/usage/_spacy-101/_similarity.jade
    @@ -28,7 +28,10 @@ p
         |  #[strong #[+procon("yes", "similar", false, 16)] similarity:] similar (higher is more similar) #[br]
         |  #[strong #[+procon("no", "dissimilar", false, 16)] similarity:] dissimilar (lower is less similar)
     
    -+table(["", "dog", "cat", "banana"])
    ++table
    +    +row("head")
    +        for column in ["", "dog", "cat", "banana"]
    +            +head-cell.u-text-center=column
         each cells, label in {"dog": [1, 0.8, 0.24], "cat": [0.8, 1, 0.28], "banana": [0.24, 0.28, 1]}
             +row
                 +cell.u-text-label.u-color-theme=label
    diff --git a/website/usage/_vectors-similarity/_in-context.jade b/website/usage/_vectors-similarity/_in-context.jade
    index 6d4fb8b3d..becd74348 100644
    --- a/website/usage/_vectors-similarity/_in-context.jade
    +++ b/website/usage/_vectors-similarity/_in-context.jade
    @@ -108,8 +108,7 @@ p
         - var examples = {"dog bites man": [1, 0.9, 0.89, 0.92], "man bites dog": [0.9, 1, 0.93, 0.9], "man dog bites": [0.89, 0.93, 1, 0.92], "dog man bites": [0.92, 0.9, 0.92, 1]}
         - var counter = 0
     
    -    +row
    -    +row
    +    +row("head")
             +cell
             for _, label in examples
                 +cell.u-text-center=label
    
    From 3b1cfa34553e911268399550138c7f4a8e8e4f24 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 01:18:32 +0200
    Subject: [PATCH 603/649] Add GPL license link
    
    ---
     website/models/_data.json | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/website/models/_data.json b/website/models/_data.json
    index 339c9e690..020ca5315 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -54,7 +54,8 @@
             "CC BY-SA": "https://creativecommons.org/licenses/by-sa/3.0/",
             "CC BY-SA 3.0": "https://creativecommons.org/licenses/by-sa/3.0/",
             "CC BY-NC": "https://creativecommons.org/licenses/by-nc/3.0/",
    -        "CC BY-NC 3.0": "https://creativecommons.org/licenses/by-nc/3.0/"
    +        "CC BY-NC 3.0": "https://creativecommons.org/licenses/by-nc/3.0/",
    +        "GPL": "http://www.gnu.de/documents/gpl.en.html"
         },
     
         "MODEL_ACCURACY": {
    
    From 6c2d8d3b2a5e148085e65df66b9c66c543c2dcb0 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 01:28:31 +0200
    Subject: [PATCH 604/649] Use shortcuts-nightly.json to resolve model shortcuts
    
    ---
     spacy/about.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/about.py b/spacy/about.py
    index 45b91955a..6f029bd9d 100644
    --- a/spacy/about.py
    +++ b/spacy/about.py
    @@ -14,5 +14,5 @@ __release__ = False
     __docs_models__ = 'https://alpha.spacy.io/usage/models'
     __download_url__ = 'https://github.com/explosion/spacy-models/releases/download'
     __compatibility__ = 'https://raw.githubusercontent.com/explosion/spacy-models/master/compatibility.json'
    -__shortcuts__ = 'https://raw.githubusercontent.com/explosion/spacy-models/master/shortcuts.json'
    +__shortcuts__ = 'https://raw.githubusercontent.com/explosion/spacy-models/master/shortcuts-nightly.json'
     __model_files__ = 'https://raw.githubusercontent.com/explosion/spacy-dev-resources/develop/templates/model/'
    
    From e18744823b5885fdd15ffe232051f18a256b4f67 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 01:29:39 +0200
    Subject: [PATCH 605/649] Add placeholders for Italian and Portuguese models
    
    ---
     website/models/_data.json | 4 ++++
     website/models/it.jade    | 6 ++++++
     website/models/pt.jade    | 6 ++++++
     3 files changed, 16 insertions(+)
     create mode 100644 website/models/it.jade
     create mode 100644 website/models/pt.jade
    
    diff --git a/website/models/_data.json b/website/models/_data.json
    index 020ca5315..293477b9a 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -8,7 +8,9 @@
                 "English": "en",
                 "German": "de",
                 "Spanish": "es",
    +            "Portuguese": "pt",
                 "French": "fr",
    +            "Italian": "it",
                 "Multi-Language": "xx"
             }
         },
    @@ -28,7 +30,9 @@
             "en": ["en_core_web_sm", "en_core_web_lg", "en_vectors_web_lg"],
             "de": ["de_dep_news_sm"],
             "es": ["es_core_web_sm"],
    +        "pt": [],
             "fr": [],
    +        "it": [],
             "xx": ["xx_ent_wiki_sm"]
         },
     
    diff --git a/website/models/it.jade b/website/models/it.jade
    new file mode 100644
    index 000000000..f0a797c43
    --- /dev/null
    +++ b/website/models/it.jade
    @@ -0,0 +1,6 @@
    +//- 💫 DOCS > MODELS > IT
    +
    +include ../_includes/_mixins
    +
    +//- This is a placeholder. The page is rendered via the template at
    +//- /_includes/_page-model.jade.
    diff --git a/website/models/pt.jade b/website/models/pt.jade
    new file mode 100644
    index 000000000..0836dca6b
    --- /dev/null
    +++ b/website/models/pt.jade
    @@ -0,0 +1,6 @@
    +//- 💫 DOCS > MODELS > PT
    +
    +include ../_includes/_mixins
    +
    +//- This is a placeholder. The page is rendered via the template at
    +//- /_includes/_page-model.jade.
    
    From 9b6828bd83739aa1c24a27f8058e7d4af6c34f29 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 03:53:59 +0100
    Subject: [PATCH 606/649] Add height option to +chart and document
    
    ---
     website/_includes/_mixins-base.jade |  4 ++--
     website/styleguide.jade             | 27 +++++++++++++++++++++++++++
     2 files changed, 29 insertions(+), 2 deletions(-)
    
    diff --git a/website/_includes/_mixins-base.jade b/website/_includes/_mixins-base.jade
    index 31bb641cd..689d97a88 100644
    --- a/website/_includes/_mixins-base.jade
    +++ b/website/_includes/_mixins-base.jade
    @@ -149,9 +149,9 @@ mixin terminal(label)
     //- Chart.js
         id - [string] chart ID, will be assigned as #chart_{id}
     
    -mixin chart(id)
    +mixin chart(id, height)
         figure.o-block&attributes(attributes)
    -        canvas(id="chart_#{id}" width="800" height="400" style="max-width: 100%")
    +        canvas(id="chart_#{id}" width="800" height=(height || "400") style="max-width: 100%")
     
     
     //- Gitter chat button and widget
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    index 638e1aed1..56af8e843 100644
    --- a/website/styleguide.jade
    +++ b/website/styleguide.jade
    @@ -332,6 +332,33 @@ include _includes/_mixins
                 |  A new annotation tool for radically efficient machine teaching,
                 |  powered by active learning.
     
    +    +h(3, "chart") Chart
    +
    +    p
    +        |  Charts are powered by #[+a("http://www.chartjs.org") chart.js] and
    +        |  implemented via a mixin that creates the #[code canvas] element and
    +        |  assigns the chart ID. The chart data itself is supplied in JavaScript.
    +        |  Charts are mostly used to visualise and compare model accuracy scores
    +        |  and speed benchmarks.
    +
    +    +aside-code("Usage", "jade").
    +        +chart("accuracy")
    +        script(src="/assets/js/chart.min.js")
    +        script new Chart('chart_accuracy', { datasets: [] })
    +
    +    +grid
    +        +grid-col("half")
    +            +chart("accuracy", 400)
    +
    +        +grid-col("half")
    +            +chart("speed", 300)
    +
    +    script(src="/assets/js/chart.min.js")
    +    script.
    +        Chart.defaults.global.defaultFontFamily = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'";
    +        new Chart('chart_accuracy', { type: 'bar', options: { legend: false, responsive: true, scales: { yAxes: [{ label: 'Accuracy', ticks: { suggestedMin: 70 } }], xAxes: [{ barPercentage: 0.425 }]}}, data: { labels: ['UAS', 'LAS', 'POS', 'NER F', 'NER P', 'NER R'], datasets: [{ label: 'en_core_web_sm', data: [91.49, 89.66, 97.23, 86.46, 86.78, 86.15], backgroundColor: '#09a3d5' }]}});
    +        new Chart('chart_speed', { type: 'horizontalBar', options: { legend: false, responsive: true, scales: { xAxes: [{ label: 'Speed', ticks: { suggestedMin: 0 }}], yAxes: [{ barPercentage: 0.425 }]}}, data: { labels: ['w/s CPU', 'w/s GPU'], datasets: [{ label: 'en_core_web_sm', data: [9575, 25531], backgroundColor: '#09a3d5'}]}});
    +
     +section("embeds")
         +h(2, "embeds") Embeds
     
    
    From af0ba014d2e803c140fe8e906543450b200b6899 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 03:54:13 +0100
    Subject: [PATCH 607/649] Document +code-new and +code-old
    
    ---
     website/styleguide.jade | 13 +++++++++++++
     1 file changed, 13 insertions(+)
    
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    index 56af8e843..4ba89fd53 100644
    --- a/website/styleguide.jade
    +++ b/website/styleguide.jade
    @@ -275,6 +275,19 @@ include _includes/_mixins
             nlp = spacy.load('en')
             doc = nlp(u"This is a sentence.")
     
    +    +aside-code("Usage", "jade").
    +        +code-new nlp.to_disk('/model')
    +        +code-old nlp.save_to_directory('/model')
    +
    +    p
    +        |  Code blocks can also be displayed with a coloured icon to visualise
    +        |  correct and incorrect examples in comparison. This is useful to
    +        |  show best practices or backwards incompatibilities in the API.
    +
    +    .o-block
    +        +code-new nlp.to_disk('/model')
    +        +code-old nlp.save_to_directory('/model')
    +
         +h(3, "aside") Aside
     
         +aside-code("Usage", "jade").
    
    From b11928abc23a6ca2e2c2ecf481d80d91a6094745 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 03:56:09 +0100
    Subject: [PATCH 608/649] Adjust labels, spacing and hack specificity
    
    ---
     website/assets/css/_base/_objects.sass | 4 +++-
     website/styleguide.jade                | 2 +-
     2 files changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/website/assets/css/_base/_objects.sass b/website/assets/css/_base/_objects.sass
    index afbf52f8d..23dc14744 100644
    --- a/website/assets/css/_base/_objects.sass
    +++ b/website/assets/css/_base/_objects.sass
    @@ -66,7 +66,7 @@
     .o-block-small
         margin-bottom: 2rem
     
    -.o-no-block
    +.o-no-block.o-no-block
         margin-bottom: 0
     
     .o-card
    @@ -96,6 +96,8 @@
         &.o-icon--tag
             vertical-align: bottom
             height: 100%
    +        position: relative
    +        top: 1px
     
     .o-emoji
         margin-right: 0.75rem
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    index 4ba89fd53..88c88435f 100644
    --- a/website/styleguide.jade
    +++ b/website/styleguide.jade
    @@ -130,7 +130,7 @@ include _includes/_mixins
             |  capabilities and can be used to mark features that require a
             |  respective model to be installed.
     
    -    p.o-inline-list
    +    p.o-block.o-inline-list
             +tag I'm a tag
             +tag-new(2)
             +tag-model("Named entities")
    
    From 47fd254ba7bf29ab8829a8e1de7a4be5ebd00ef9 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 03:56:37 +0100
    Subject: [PATCH 609/649] Combine table scroll shadows if row has only one cell
    
    ---
     website/assets/css/_components/_tables.sass |  6 ++++++
     website/assets/css/_mixins.sass             | 15 +++++++++++----
     2 files changed, 17 insertions(+), 4 deletions(-)
    
    diff --git a/website/assets/css/_components/_tables.sass b/website/assets/css/_components/_tables.sass
    index 1878e2c5e..021b9521a 100644
    --- a/website/assets/css/_components/_tables.sass
    +++ b/website/assets/css/_components/_tables.sass
    @@ -62,9 +62,15 @@
             &:last-child
                 @include scroll-shadow-cover(right, $color-back)
     
    +        &:first-child:last-child
    +            @include scroll-shadow-cover(both, $color-back)
    +
         .c-table__row--foot .c-table__cell
             &:first-child
                 @include scroll-shadow-cover(left, lighten($color-subtle-light, 2))
     
             &:last-child
                 @include scroll-shadow-cover(right, lighten($color-subtle-light, 2))
    +
    +        &:first-child:last-child
    +            @include scroll-shadow-cover(both, lighten($color-subtle-light, 2))
    diff --git a/website/assets/css/_mixins.sass b/website/assets/css/_mixins.sass
    index 641f6e148..d1ea9c5d5 100644
    --- a/website/assets/css/_mixins.sass
    +++ b/website/assets/css/_mixins.sass
    @@ -42,6 +42,9 @@
     // $scroll-shadow-side       - side to cover shadow (left or right)
     // $scroll-shadow-background - original background color to match
     
    +@function scroll-shadow-gradient($scroll-gradient-direction, $scroll-shadow-background)
    +    @return linear-gradient(to #{$scroll-gradient-direction}, rgba($scroll-shadow-background, 1) 50%, rgba($scroll-shadow-background, 0) 100%)
    +
     @mixin scroll-shadow-base($scroll-shadow-color, $scroll-shadow-intensity: 0.2)
         background: radial-gradient(ellipse at 0 50%, rgba($scroll-shadow-color, $scroll-shadow-intensity) 0%, rgba(0,0,0,0) 75%) 0 center, radial-gradient(ellipse at 100% 50%, rgba($scroll-shadow-color, $scroll-shadow-intensity) 0%, transparent 75%) 100% center
         background-attachment: scroll, scroll
    @@ -50,15 +53,19 @@
     
     @mixin scroll-shadow-cover($scroll-shadow-side, $scroll-shadow-background)
         $scroll-gradient-direction: right !default
    +    background-repeat: no-repeat
     
         @if $scroll-shadow-side == right
             $scroll-gradient-direction: left
             background-position: 100% 0
     
    -    background-image: linear-gradient(to #{$scroll-gradient-direction}, rgba($scroll-shadow-background, 1) 50%, rgba($scroll-shadow-background, 0) 100%)
    -    background-repeat: no-repeat
    -    background-size: 20px 100%
    -
    +    @if $scroll-shadow-side == both
    +        background-image: scroll-shadow-gradient(left, $scroll-shadow-background), scroll-shadow-gradient(right, $scroll-shadow-background)
    +        background-position: 100% 0, 0 0
    +        background-size: 20px 100%, 20px 100%
    +    @else
    +        background-image: scroll-shadow-gradient($scroll-gradient-direction, $scroll-shadow-background)
    +        background-size: 20px 100%
     
     // Full vertical scroll shadows
     // adapted from: https://codepen.io/laustdeleuran/pen/DBaAu
    
    From ae2ad5becc6807c88276ce52c6f52a227cfc656a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sun, 29 Oct 2017 03:58:19 +0100
    Subject: [PATCH 610/649] Remove charts from model direcory and add speed
     benchmarks
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    With speed benchmarks, charts ended up taking up too much space – and they were mostly data porn and not particularly useful anyways. Instead, we might add a "Compare" page that fetches all models and lets the user compare two or more models in terms of accuracy, speed etc.
    ---
     website/_includes/_functions.jade   |  2 +-
     website/_includes/_page_models.jade | 34 +++++++++---------
     website/_includes/_scripts.jade     |  5 +--
     website/assets/js/main.js           | 56 +++++++++++++----------------
     website/models/_data.json           | 24 +++++++------
     website/styleguide.jade             |  4 +--
     6 files changed, 57 insertions(+), 68 deletions(-)
    
    diff --git a/website/_includes/_functions.jade b/website/_includes/_functions.jade
    index 5209dbbec..eb16d9659 100644
    --- a/website/_includes/_functions.jade
    +++ b/website/_includes/_functions.jade
    @@ -14,7 +14,7 @@
     
     - MODEL_META = public.models._data.MODEL_META
     - MODEL_LICENSES = public.models._data.MODEL_LICENSES
    -- MODEL_ACCURACY = public.models._data.MODEL_ACCURACY
    +- MODEL_BENCHMARKS = public.models._data.MODEL_BENCHMARKS
     - EXAMPLE_SENTENCES = public.models._data.EXAMPLE_SENTENCES
     
     - IS_PAGE = (SECTION != "index") && !landing
    diff --git a/website/_includes/_page_models.jade b/website/_includes/_page_models.jade
    index d4ce55f43..10e7e1746 100644
    --- a/website/_includes/_page_models.jade
    +++ b/website/_includes/_page_models.jade
    @@ -26,7 +26,7 @@ for id in CURRENT_MODELS
                     |  about this model, see the overview of the
                     |  #[+a(gh("spacy-models") + "/releases") latest model releases].
     
    -        +table(data-tpl=id data-tpl-key="table")
    +        +table.o-block-small(data-tpl=id data-tpl-key="table")
                 +row
                     +cell #[+label Language]
                     +cell #[+tag=comps.lang] #{LANGUAGES[comps.lang]}
    @@ -56,22 +56,20 @@ for id in CURRENT_MODELS
                             select.o-field__select.u-text-small(data-tpl=id data-tpl-key="compat")
                         .o-empty(data-tpl=id data-tpl-key="compat-versions")  
     
    -        section(data-tpl=id data-tpl-key="accuracy-wrapper" style="display: none")
    -            +grid.o-no-block
    -                +grid-col("third")
    -                    +h(4) Accuracy
    -                    +table.o-block-small
    -                        for label, field in MODEL_ACCURACY
    -                            +row(style="display: none")
    -                                +cell.u-nowrap
    -                                    +label=label
    -                                        if MODEL_META[field]
    -                                            |  #[+help(MODEL_META[field]).u-color-subtle]
    -                                +cell.u-text-right(data-tpl=id data-tpl-key=field)
    -                                    |  n/a
    -
    -                +grid-col("two-thirds")
    -                    +h(4) Comparison
    -                    +chart(id).u-padding-small
    +        section(data-tpl=id data-tpl-key="benchmarks" style="display: none")
    +            +grid.o-block-small
    +                for keys, label in MODEL_BENCHMARKS
    +                    .u-flex-full.u-padding-small(data-tpl=id data-tpl-key=label.toLowerCase() style="display: none")
    +                        +table.o-block-small
    +                            +row("head")
    +                                +head-cell(colspan="2")=(MODEL_META["benchmark_" + label] || label)
    +                            for label, field in keys
    +                                +row(style="display: none")
    +                                    +cell.u-nowrap
    +                                        +label=label
    +                                            if MODEL_META[field]
    +                                                |  #[+help(MODEL_META[field]).u-color-subtle]
    +                                    +cell.u-text-right(data-tpl=id data-tpl-key=field)
    +                                        |  n/a
     
             p.u-text-small.u-color-dark(data-tpl=id data-tpl-key="notes")
    diff --git a/website/_includes/_scripts.jade b/website/_includes/_scripts.jade
    index 4bb4d87ef..5ecdd0711 100644
    --- a/website/_includes/_scripts.jade
    +++ b/website/_includes/_scripts.jade
    @@ -6,9 +6,6 @@ if quickstart
     if IS_PAGE
         script(src="/assets/js/in-view.min.js")
     
    -if HAS_MODELS
    -    script(src="/assets/js/chart.min.js")
    -
     if environment == "deploy"
         script(async src="https://www.google-analytics.com/analytics.js")
     
    @@ -35,7 +32,7 @@ script
             | };
     
         if HAS_MODELS
    -        | new ModelLoader('!{MODELS_REPO}', !{JSON.stringify(CURRENT_MODELS)}, !{JSON.stringify(MODEL_LICENSES)}, !{JSON.stringify(MODEL_ACCURACY)});
    +        | new ModelLoader('!{MODELS_REPO}', !{JSON.stringify(CURRENT_MODELS)}, !{JSON.stringify(MODEL_LICENSES)}, !{JSON.stringify(MODEL_BENCHMARKS)});
     
         if environment == "deploy"
             | window.ga=window.ga||function(){
    diff --git a/website/assets/js/main.js b/website/assets/js/main.js
    index 5cbd4d807..d9465bb67 100644
    --- a/website/assets/js/main.js
    +++ b/website/assets/js/main.js
    @@ -108,22 +108,12 @@ class ModelLoader {
          * @param {Object} licenses - License IDs mapped to URLs.
          * @param {Object} accKeys - Available accuracy keys mapped to display labels.
          */
    -    constructor(repo, models = [], licenses = {}, accKeys = {}) {
    +    constructor(repo, models = [], licenses = {}, benchmarkKeys = {}) {
             this.url = `https://raw.githubusercontent.com/${repo}/master`;
             this.repo = `https://github.com/${repo}`;
             this.modelIds = models;
             this.licenses = licenses;
    -        this.accKeys = accKeys;
    -        this.chartColor = '#09a3d5';
    -        this.chartOptions = {
    -            type: 'bar',
    -            options: { responsive: true, scales: {
    -                yAxes: [{ label: 'Accuracy', ticks: { suggestedMin: 70 }}],
    -                xAxes: [{ barPercentage: 0.425 }]
    -            }}
    -        }
    -        Chart.defaults.global.legend.position = 'bottom';
    -        Chart.defaults.global.defaultFontFamily = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'";
    +        this.benchKeys = benchmarkKeys;
             this.init();
         }
     
    @@ -171,7 +161,7 @@ class ModelLoader {
         /**
          * Update model details in tables. Currently quite hacky :(
          */
    -    render({ lang, name, version, sources, pipeline, vectors, url, author, license, accuracy, size, description, notes }) {
    +    render({ lang, name, version, sources, pipeline, vectors, url, author, license, accuracy, speed, size, description, notes }) {
             const modelId = `${lang}_${name}`;
             const model = `${modelId}-${version}`;
             const template = new Templater(modelId);
    @@ -194,11 +184,31 @@ class ModelLoader {
             if (license) template.fill('license', this.licenses[license] ? getLink(license, this.licenses[license]) : license, true);
     
             template.get('download').setAttribute('href', `${this.repo}/releases/tag/${model}`);
    -        if (accuracy) this.renderAccuracy(template, accuracy, modelId);
    +
    +        this.renderBenchmarks(template, accuracy, speed);
             this.renderCompat(template, modelId);
             template.get('table').removeAttribute('data-loading');
         }
     
    +    renderBenchmarks(template, accuracy = {}, speed = {}) {
    +        if (!accuracy && !speed) return;
    +        template.get('benchmarks').style.display = 'block';
    +        this.renderTable(template, 'parser', accuracy, val => val.toFixed(2));
    +        this.renderTable(template, 'ner', accuracy, val => val.toFixed(2));
    +        this.renderTable(template, 'speed', speed, Math.round);
    +    }
    +
    +    renderTable(template, id, benchmarks, convertVal = val => val) {
    +        if (!this.benchKeys[id] || !Object.keys(this.benchKeys[id]).some(key => benchmarks[key])) return;
    +        const keys = Object.keys(this.benchKeys[id]).map(k => benchmarks[k] ? k : false).filter(k => k);
    +        template.get(id).style.display = 'block';
    +        for (let key of keys) {
    +            template
    +                .fill(key, this.convertNumber(convertVal(benchmarks[key])))
    +                .parentElement.style.display = 'table-row';
    +        }
    +    }
    +
         renderCompat(template, modelId) {
             template.get('compat-wrapper').style.display = 'table-row';
             const options = Object.keys(this.compat).map(v => ``).join('');
    @@ -211,24 +221,6 @@ class ModelLoader {
                 });
         }
     
    -    renderAccuracy(template, accuracy, modelId, compare=false) {
    -        template.get('accuracy-wrapper').style.display = 'block';
    -        const metaKeys = Object.keys(this.accKeys).map(k => accuracy[k] ? k : false).filter(k => k);
    -        for (let key of metaKeys) {
    -            template.fill(key, accuracy[key].toFixed(2)).parentElement.style.display = 'table-row';
    -        }
    -
    -        this.chartOptions.options.legend = { display: compare }
    -        new Chart(`chart_${modelId}`, Object.assign({}, this.chartOptions, { data: {
    -            datasets: [{
    -                label: modelId,
    -                data: metaKeys.map(key => accuracy[key].toFixed(2)),
    -                backgroundColor: this.chartColor
    -            }],
    -            labels: metaKeys.map(key => this.accKeys[key])
    -        }}))
    -    }
    -
         getLatestVersion(model, compat = {}) {
             for (let spacy_v of Object.keys(compat)) {
                 const models = compat[spacy_v];
    diff --git a/website/models/_data.json b/website/models/_data.json
    index 293477b9a..d41d45e8e 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -50,25 +50,27 @@
             "ents_f": "Entities (F-score)",
             "ents_p": "Entities (precision)",
             "ents_r": "Entities (recall)",
    +        "cpu": "words per second on CPU",
    +        "gpu": "words per second on GPU",
             "pipeline": "Processing pipeline components in order",
    -        "sources": "Sources of training data"
    +        "sources": "Sources of training data",
    +        "benchmark_parser": "Parser accuracy",
    +        "benchmark_ner": "NER accuracy",
    +        "benchmark_speed": "Speed"
         },
     
         "MODEL_LICENSES": {
    -        "CC BY-SA": "https://creativecommons.org/licenses/by-sa/3.0/",
    +        "CC BY-SA":     "https://creativecommons.org/licenses/by-sa/3.0/",
             "CC BY-SA 3.0": "https://creativecommons.org/licenses/by-sa/3.0/",
    -        "CC BY-NC": "https://creativecommons.org/licenses/by-nc/3.0/",
    +        "CC BY-NC":     "https://creativecommons.org/licenses/by-nc/3.0/",
             "CC BY-NC 3.0": "https://creativecommons.org/licenses/by-nc/3.0/",
    -        "GPL": "http://www.gnu.de/documents/gpl.en.html"
    +        "GPL":          "http://www.gnu.de/documents/gpl.en.html"
         },
     
    -    "MODEL_ACCURACY": {
    -        "uas": "UAS",
    -        "las": "LAS",
    -        "tags_acc": "POS",
    -        "ents_f": "NER F",
    -        "ents_p": "NER P",
    -        "ents_r": "NER R"
    +    "MODEL_BENCHMARKS": {
    +        "parser": { "uas": "UAS", "las": "LAS", "tags_acc": "POS" },
    +        "ner":    { "ents_f": "NER F", "ents_p": "NER P", "ents_r": "NER R" },
    +        "speed":  { "nwords": "Words", "cpu": "w/s CPU", "gpu": "w/s GPU" }
         },
     
         "LANGUAGES": {
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    index 88c88435f..b503569b7 100644
    --- a/website/styleguide.jade
    +++ b/website/styleguide.jade
    @@ -609,8 +609,8 @@ include _includes/_mixins
                     +code(false, "json").o-no-block "CC BY-SA 3.0": "http://..."
     
             +row
    -            +cell #[code MODEL_ACCURACY]
    -            +cell Display labels for accuracy keys.
    +            +cell #[code MODEL_BENCHMARKS]
    +            +cell Display labels for accuracy and speed.
                 +cell
                     +code(false, "json").o-no-block "ents_f": "NER F"
     
    
    From 72aea8f1057d251c88306c11146c2a9c0ca0c3c2 Mon Sep 17 00:00:00 2001
    From: Explosion Bot 
    Date: Mon, 30 Oct 2017 10:03:08 +0100
    Subject: [PATCH 611/649] Update vectors.add() to allow setting keys to rows
    
    ---
     spacy/tests/doc/test_doc_api.py   |  2 +-
     spacy/tests/doc/test_token_api.py |  4 +--
     spacy/vectors.pyx                 | 46 +++++++++++++++++++------------
     3 files changed, 32 insertions(+), 20 deletions(-)
    
    diff --git a/spacy/tests/doc/test_doc_api.py b/spacy/tests/doc/test_doc_api.py
    index 46c615973..8f881e811 100644
    --- a/spacy/tests/doc/test_doc_api.py
    +++ b/spacy/tests/doc/test_doc_api.py
    @@ -209,7 +209,7 @@ def test_doc_api_right_edge(en_tokenizer):
     def test_doc_api_has_vector():
         vocab = Vocab()
         vocab.clear_vectors(2)
    -    vocab.vectors.add('kitten', numpy.asarray([0., 2.], dtype='f'))
    +    vocab.vectors.add('kitten', vector=numpy.asarray([0., 2.], dtype='f'))
         doc = Doc(vocab, words=['kitten'])
         assert doc.has_vector
     
    diff --git a/spacy/tests/doc/test_token_api.py b/spacy/tests/doc/test_token_api.py
    index 0ab723f7a..a52be9731 100644
    --- a/spacy/tests/doc/test_token_api.py
    +++ b/spacy/tests/doc/test_token_api.py
    @@ -73,8 +73,8 @@ def test_doc_token_api_is_properties(en_vocab):
     def test_doc_token_api_vectors():
         vocab = Vocab()
         vocab.clear_vectors(2)
    -    vocab.vectors.add('apples', numpy.asarray([0., 2.], dtype='f'))
    -    vocab.vectors.add('oranges', numpy.asarray([0., 1.], dtype='f'))
    +    vocab.vectors.add('apples', vector=numpy.asarray([0., 2.], dtype='f'))
    +    vocab.vectors.add('oranges', vector=numpy.asarray([0., 1.], dtype='f'))
         doc = Doc(vocab, words=['apples', 'oranges', 'oov'])
         assert doc.has_vector
     
    diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx
    index 155d7b9d2..d6b59401e 100644
    --- a/spacy/vectors.pyx
    +++ b/spacy/vectors.pyx
    @@ -21,8 +21,10 @@ cdef class Vectors:
         Vectors data is kept in the vectors.data attribute, which should be an
         instance of numpy.ndarray (for CPU vectors) or cupy.ndarray
         (for GPU vectors). `vectors.key2row` is a dictionary mapping word hashes to
    -    rows in the vectors.data table. The array `vectors.keys` keeps the keys in
    -    order, such that `keys[vectors.key2row[key]] == key`.
    +    rows in the vectors.data table.
    +    
    +    Multiple keys can be mapped to the same vector, so len(keys) may be greater
    +    (but not smaller) than data.shape[0].
         """
         cdef public object data
         cdef readonly StringStore strings
    @@ -57,7 +59,7 @@ cdef class Vectors:
             for i, string in enumerate(self.strings):
                 if i >= self.data.shape[0]:
                     break
    -            self.add(self.strings[string], self.data[i])
    +            self.add(self.strings[string], vector=self.data[i])
     
         def __reduce__(self):
             return (Vectors, (self.strings, self.data))
    @@ -114,27 +116,36 @@ cdef class Vectors:
                 key = self.strings[key]
             return key in self.key2row
     
    -    def add(self, key, vector=None):
    -        """Add a key to the table, optionally setting a vector value as well.
    +    def add(self, key, *, vector=None, row=None):
    +        """Add a key to the table. Keys can be mapped to an existing vector
    +        by setting `row`, or a new vector can be added.
     
             key (unicode / int): The key to add.
    -        vector (numpy.ndarray): An optional vector to add.
    +        vector (numpy.ndarray / None): A vector to add for the key.
    +        row (int / None): The row-number of a vector to map the key to.
             """
    +        if row is not None and vector is not None:
    +            raise ValueError("Only one of 'row' and 'vector' may be set")
             if isinstance(key, basestring_):
                 key = self.strings.add(key)
    -        if key not in self.key2row:
    -            i = self.i
    -            if i >= self.keys.shape[0]:
    -                self.keys.resize((self.keys.shape[0]*2,))
    -                self.data.resize((self.data.shape[0]*2, self.data.shape[1]))
    -            self.key2row[key] = self.i
    +        if key in self.key2row and vector is not None:
    +            row = self.key2row[key]
    +        elif key in self.key2row and row is not None:
    +            self.key2row[key] = row
    +        elif key not in self.key2row:
    +            if row is not None:
    +                self.key2row[key] = row
    +            else:
    +                self.key2row[key] = self.i
    +                row = self.i
    +            if row >= self.keys.shape[0]:
    +                self.keys.resize((row*2,))
    +                self.data.resize((row*2, self.data.shape[1]))
                 self.keys[self.i] = key
                 self.i += 1
    -        else:
    -            i = self.key2row[key]
             if vector is not None:
    -            self.data[i] = vector
    -        return i
    +            self.data[row] = vector
    +        return row
     
         def items(self):
             """Iterate over `(string key, vector)` pairs, in order.
    @@ -143,7 +154,8 @@ cdef class Vectors:
             """
             for i, key in enumerate(self.keys):
                 string = self.strings[key]
    -            yield string, self.data[i]
    +            row = self.key2row[key]
    +            yield string, self.data[row]
     
         @property
         def shape(self):
    
    From 5ede7cec9b45a6edf873fbb442369b503592237e Mon Sep 17 00:00:00 2001
    From: Explosion Bot 
    Date: Mon, 30 Oct 2017 11:49:11 +0100
    Subject: [PATCH 612/649] Improve Lexeme.set_attrs method
    
    ---
     spacy/lexeme.pyx | 13 +++++++++++++
     1 file changed, 13 insertions(+)
    
    diff --git a/spacy/lexeme.pyx b/spacy/lexeme.pyx
    index 88748af33..a64e394c3 100644
    --- a/spacy/lexeme.pyx
    +++ b/spacy/lexeme.pyx
    @@ -13,6 +13,8 @@ from .typedefs cimport attr_t, flags_t
     from .attrs cimport IS_ALPHA, IS_ASCII, IS_DIGIT, IS_LOWER, IS_PUNCT, IS_SPACE
     from .attrs cimport IS_TITLE, IS_UPPER, LIKE_URL, LIKE_NUM, LIKE_EMAIL, IS_STOP
     from .attrs cimport IS_BRACKET, IS_QUOTE, IS_LEFT_PUNCT, IS_RIGHT_PUNCT, IS_OOV
    +from .attrs cimport PROB
    +from .attrs import intify_attrs
     from . import about
     
     
    @@ -68,6 +70,17 @@ cdef class Lexeme:
         def __hash__(self):
             return self.c.orth
     
    +    def set_attrs(self, **attrs):
    +        cdef attr_id_t attr
    +        attrs = intify_attrs(attrs)
    +        for attr, value in attrs.items():
    +            if attr == PROB:
    +                self.c.prob = value
    +            elif isinstance(value, int) or isinstance(value, long):
    +                Lexeme.set_struct_attr(self.c, attr, value)
    +            else:
    +                Lexeme.set_struct_attr(self.c, attr, self.vocab.strings.add(value))
    +
         def set_flag(self, attr_id_t flag_id, bint value):
             """Change the value of a boolean flag.
     
    
    From 08869c19fd38dd9d46932ddb2bd0443834116eb5 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 30 Oct 2017 13:15:13 +0100
    Subject: [PATCH 613/649] Merge mixins and mixins-base
    
    The distinction was never clear anyways and it was progressively getting messier. So all mixins live in one file now.
    ---
     website/_includes/_mixins-base.jade | 244 ----------------------------
     website/_includes/_mixins.jade      | 231 +++++++++++++++++++++++++-
     2 files changed, 230 insertions(+), 245 deletions(-)
     delete mode 100644 website/_includes/_mixins-base.jade
    
    diff --git a/website/_includes/_mixins-base.jade b/website/_includes/_mixins-base.jade
    deleted file mode 100644
    index 689d97a88..000000000
    --- a/website/_includes/_mixins-base.jade
    +++ /dev/null
    @@ -1,244 +0,0 @@
    -//- 💫 MIXINS > BASE
    -
    -//- Section
    -    id - [string] anchor assigned to section (used for breadcrumb navigation)
    -
    -mixin section(id)
    -    section.o-section(id="section-" + id data-section=id)
    -        block
    -
    -
    -//- Aside wrapper
    -    label - [string] aside label
    -
    -mixin aside-wrapper(label)
    -    aside.c-aside
    -        .c-aside__content(role="complementary")&attributes(attributes)
    -            if label
    -                h4.u-text-label.u-text-label--dark=label
    -
    -            block
    -
    -
    -//- SVG from map (uses embedded SVG sprite)
    -    name   - [string] SVG symbol id
    -    width  - [integer] width in px
    -    height - [integer] height in px (default: same as width)
    -
    -mixin svg(name, width, height)
    -    svg(aria-hidden="true" viewBox="0 0 #{width} #{height || width}" width=width height=(height || width))&attributes(attributes)
    -        use(xlink:href="#svg_#{name}")
    -
    -
    -//- Icon
    -    name   - [string] icon name (will be used as symbol id: #svg_{name})
    -    width  - [integer] icon width (default: 20)
    -    height - [integer] icon height (defaults to width)
    -
    -mixin icon(name, width, height)
    -    - var width = width || 20
    -    - var height = height || width
    -    +svg(name, width, height).o-icon(style="min-width: #{width}px")&attributes(attributes)
    -
    -
    -//- Pro/Con/Neutral icon
    -    icon - [string] "pro", "con" or "neutral" (default: "neutral")
    -    size - [integer] icon size (optional)
    -
    -mixin procon(icon, label, show_label, size)
    -    - var colors = { yes: "green", no: "red", neutral: "subtle" }
    -    span.u-nowrap
    -        +icon(icon, size || 20)(class="u-color-#{colors[icon] || 'subtle'}").o-icon--inline&attributes(attributes)
    -        span.u-text-small(class=show_label ? null : "u-hidden")=(label || icon)
    -
    -//- Headlines Helper Mixin
    -    level - [integer] 1, 2, 3, 4, or 5
    -
    -mixin headline(level)
    -    if level == 1
    -        h1.u-heading-1&attributes(attributes)
    -            block
    -
    -    else if level == 2
    -        h2.u-heading-2&attributes(attributes)
    -            block
    -
    -    else if level == 3
    -        h3.u-heading-3&attributes(attributes)
    -            block
    -
    -    else if level == 4
    -        h4.u-heading-4&attributes(attributes)
    -            block
    -
    -    else if level == 5
    -        h5.u-heading-5&attributes(attributes)
    -            block
    -
    -
    -//- Permalink rendering
    -    id - [string] permalink ID used for link anchor
    -
    -mixin permalink(id)
    -    if id
    -        a.u-permalink(href="##{id}")
    -            block
    -
    -    else
    -        block
    -
    -
    -//- Quickstart widget
    -    quickstart.js with manual markup, inspired by PyTorch's "Getting started"
    -    groups - [object] option groups, uses global variable QUICKSTART
    -    headline - [string] optional text to be rendered as widget headline
    -
    -mixin quickstart(groups, headline, description, hide_results)
    -    .c-quickstart.o-block-small#qs
    -        .c-quickstart__content
    -            if headline
    -                +h(2)=headline
    -            if description
    -                p=description
    -            for group in groups
    -                .c-quickstart__group.u-text-small(data-qs-group=group.id)
    -                    if group.title
    -                        .c-quickstart__legend=group.title
    -                            if group.help
    -                                |  #[+help(group.help)]
    -                    .c-quickstart__fields
    -                        for option in group.options
    -                            input.c-quickstart__input(class="c-quickstart__input--" + (group.input_style ? group.input_style : group.multiple ? "check" : "radio") type=group.multiple ? "checkbox" : "radio" name=group.id id="qs-#{option.id}" value=option.id checked=option.checked)
    -                            label.c-quickstart__label.u-text-tiny(for="qs-#{option.id}")!=option.title
    -                                if option.meta
    -                                    |  #[span.c-quickstart__label__meta (#{option.meta})]
    -                                if option.help
    -                                    |  #[+help(option.help)]
    -
    -        if hide_results
    -            block
    -        else
    -            pre.c-code-block
    -                code.c-code-block__content.c-quickstart__code(data-qs-results="")
    -                    block
    -
    -
    -//- Quickstart code item
    -    data  - [object] Rendering conditions (keyed by option group ID, value: option)
    -    style - [string] modifier ID for line style
    -
    -mixin qs(data, style)
    -    - args = {}
    -    for value, setting in data
    -        - args['data-qs-' + setting] = value
    -    span.c-quickstart__line(class="c-quickstart__line--#{style || 'bash'}")&attributes(args)
    -        block
    -
    -
    -//- Terminal-style code window
    -    label - [string] title displayed in top bar of terminal window
    -
    -mixin terminal(label)
    -    .x-terminal
    -        .x-terminal__icons: span
    -        .u-padding-small.u-text-label.u-text-center=label
    -
    -        +code.x-terminal__code
    -            block
    -
    -//- Chart.js
    -    id - [string] chart ID, will be assigned as #chart_{id}
    -
    -mixin chart(id, height)
    -    figure.o-block&attributes(attributes)
    -        canvas(id="chart_#{id}" width="800" height=(height || "400") style="max-width: 100%")
    -
    -
    -//- Gitter chat button and widget
    -    button - [string] text shown on button
    -    label  - [string] title of chat window (default: same as button)
    -
    -mixin gitter(button, label)
    -    aside.js-gitter.c-chat.is-collapsed(data-title=(label || button))
    -
    -    button.js-gitter-button.c-chat__button.u-text-tag
    -        +icon("chat", 16).o-icon--inline
    -        !=button
    -
    -
    -//- Badge
    -    image - [string] path to badge image
    -    url   - [string] badge link
    -
    -mixin badge(image, url)
    -    +a(url).u-padding-small.u-hide-link&attributes(attributes)
    -        img.o-badge(src=image alt=url height="20")
    -
    -
    -//- spaCy logo
    -
    -mixin logo()
    -    +svg("spacy", 675, 215).o-logo&attributes(attributes)
    -
    -
    -//- Landing
    -
    -mixin landing-header()
    -    header.c-landing
    -        .c-landing__wrapper
    -            .c-landing__content
    -                block
    -
    -mixin landing-banner(headline, label)
    -    .c-landing__banner.u-padding.o-block.u-color-light
    -        +grid.c-landing__banner__content.o-no-block
    -            +grid-col("third")
    -                h3.u-heading.u-heading-1
    -                    if label
    -                        div
    -                            span.u-text-label.u-text-label--light=label
    -                    !=headline
    -
    -            +grid-col("two-thirds").c-landing__banner__text
    -                block
    -
    -
    -mixin landing-logos(title, logos)
    -    .o-content.u-text-center&attributes(attributes)
    -        h3.u-heading.u-text-label.u-color-dark=title
    -
    -        each row, i in logos
    -            - var is_last = i == logos.length - 1
    -            +grid("center").o-inline-list.o-no-block(class=is_last ? "o-no-block" : null)
    -                each details, name in row
    -                    +a(details[0]).u-padding-medium
    -                        +icon(name, details[1], details[2])
    -
    -                if is_last
    -                    block
    -
    -
    -//- Under construction (temporary)
    -    Marks sections that still need to be completed for the v2.0 release.
    -
    -mixin under-construction()
    -    +infobox("Under construction", "🚧")
    -        |  This section is still being written and will be updated for the v2.0
    -        |  release. Is there anything that you think should definitely mentioned or
    -        |  explained here? Any examples you'd like to see? #[strong Let us know]
    -        |  on the #[+a(gh("spacy") + "/issues/1105") v2.0 alpha thread] on GitHub!
    -
    -
    -//- Alpha infobox (temporary)
    -    Added in the templates to notify user that they're visiting the alpha site.
    -
    -mixin alpha-info()
    -    +infobox("You are viewing the spaCy v2.0.0 alpha docs", "⚠️")
    -        strong This page is part of the alpha documentation for spaCy v2.0.
    -        |  It does not reflect the state of the latest stable release.
    -        |  Because v2.0 is still under development, the implementation
    -        |  may differ from the intended state described here. See the
    -        |  #[+a(gh("spaCy") + "/releases/tag/v2.0.0-alpha") release notes]
    -        |  for details on how to install and test the new version. To
    -        |  read the official docs for spaCy v1.x,
    -        |  #[+a("https://spacy.io/docs") go here].
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 5dace47e0..902328906 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -1,7 +1,39 @@
     //- 💫 INCLUDES > MIXINS
     
     include _functions
    -include _mixins-base
    +
    +
    +//- Section
    +    id - [string] anchor assigned to section (used for breadcrumb navigation)
    +
    +mixin section(id)
    +    section.o-section(id="section-" + id data-section=id)
    +        block
    +
    +
    +//- Headlines Helper Mixin
    +    level - [integer] 1, 2, 3, 4, or 5
    +
    +mixin headline(level)
    +    if level == 1
    +        h1.u-heading-1&attributes(attributes)
    +            block
    +
    +    else if level == 2
    +        h2.u-heading-2&attributes(attributes)
    +            block
    +
    +    else if level == 3
    +        h3.u-heading-3&attributes(attributes)
    +            block
    +
    +    else if level == 4
    +        h4.u-heading-4&attributes(attributes)
    +            block
    +
    +    else if level == 5
    +        h5.u-heading-5&attributes(attributes)
    +            block
     
     
     //- Headlines
    @@ -18,6 +50,18 @@ mixin h(level, id, source)
                     span Source #[+icon("code", 14).o-icon--inline]
     
     
    +//- Permalink rendering
    +    id - [string] permalink ID used for link anchor
    +
    +mixin permalink(id)
    +    if id
    +        a.u-permalink(href="##{id}")
    +            block
    +
    +    else
    +        block
    +
    +
     //- External links
         url     - [string] link href
         trusted - [boolean] if not set / false, rel="noopener nofollow" is added
    @@ -63,6 +107,18 @@ mixin help(tooltip, icon_size)
             +icon("help_o", icon_size || 16).o-icon--inline
     
     
    +//- Aside wrapper
    +    label - [string] aside label
    +
    +mixin aside-wrapper(label)
    +    aside.c-aside
    +        .c-aside__content(role="complementary")&attributes(attributes)
    +            if label
    +                h4.u-text-label.u-text-label--dark=label
    +
    +            block
    +
    +
     //- Aside for text
         label - [string] aside title (optional)
     
    @@ -112,6 +168,37 @@ mixin infobox-logos(...logos)
                     |  #[+icon(logo[0], logo[1], logo[2]).u-color-dark]
     
     
    +//- SVG from map (uses embedded SVG sprite)
    +    name   - [string] SVG symbol id
    +    width  - [integer] width in px
    +    height - [integer] height in px (default: same as width)
    +
    +mixin svg(name, width, height)
    +    svg(aria-hidden="true" viewBox="0 0 #{width} #{height || width}" width=width height=(height || width))&attributes(attributes)
    +        use(xlink:href="#svg_#{name}")
    +
    +
    +//- Icon
    +    name   - [string] icon name (will be used as symbol id: #svg_{name})
    +    width  - [integer] icon width (default: 20)
    +    height - [integer] icon height (defaults to width)
    +
    +mixin icon(name, width, height)
    +    - var width = width || 20
    +    - var height = height || width
    +    +svg(name, width, height).o-icon(style="min-width: #{width}px")&attributes(attributes)
    +
    +
    +//- Pro/Con/Neutral icon
    +    icon - [string] "pro", "con" or "neutral" (default: "neutral")
    +    size - [integer] icon size (optional)
    +
    +mixin procon(icon, label, show_label, size)
    +    - var colors = { yes: "green", no: "red", neutral: "subtle" }
    +    span.u-nowrap
    +        +icon(icon, size || 20)(class="u-color-#{colors[icon] || 'subtle'}").o-icon--inline&attributes(attributes)
    +        span.u-text-small(class=show_label ? null : "u-hidden")=(label || icon)
    +
     
     //- Link button
         url      - [string] link href
    @@ -238,6 +325,14 @@ mixin graphic(original)
                     +button(original, false, "secondary", "small") View large graphic
     
     
    +//- Chart.js
    +    id - [string] chart ID, will be assigned as #chart_{id}
    +
    +mixin chart(id, height)
    +    figure.o-block&attributes(attributes)
    +        canvas(id="chart_#{id}" width="800" height=(height || "400") style="max-width: 100%")
    +
    +
     //- Labels
     
     mixin label()
    @@ -445,3 +540,137 @@ mixin annotation-row(annots, style)
                 else
                     +cell=cell
             block
    +
    +
    +//- spaCy logo
    +
    +mixin logo()
    +    +svg("spacy", 675, 215).o-logo&attributes(attributes)
    +
    +
    +//- Gitter chat button and widget
    +    button - [string] text shown on button
    +    label  - [string] title of chat window (default: same as button)
    +
    +mixin gitter(button, label)
    +    aside.js-gitter.c-chat.is-collapsed(data-title=(label || button))
    +
    +    button.js-gitter-button.c-chat__button.u-text-tag
    +        +icon("chat", 16).o-icon--inline
    +        !=button
    +
    +
    +//- Badge
    +    image - [string] path to badge image
    +    url   - [string] badge link
    +
    +mixin badge(image, url)
    +    +a(url).u-padding-small.u-hide-link&attributes(attributes)
    +        img.o-badge(src=image alt=url height="20")
    +
    +
    +//- Quickstart widget
    +    quickstart.js with manual markup, inspired by PyTorch's "Getting started"
    +    groups - [object] option groups, uses global variable QUICKSTART
    +    headline - [string] optional text to be rendered as widget headline
    +
    +mixin quickstart(groups, headline, description, hide_results)
    +    .c-quickstart.o-block-small#qs
    +        .c-quickstart__content
    +            if headline
    +                +h(2)=headline
    +            if description
    +                p=description
    +            for group in groups
    +                .c-quickstart__group.u-text-small(data-qs-group=group.id)
    +                    if group.title
    +                        .c-quickstart__legend=group.title
    +                            if group.help
    +                                |  #[+help(group.help)]
    +                    .c-quickstart__fields
    +                        for option in group.options
    +                            input.c-quickstart__input(class="c-quickstart__input--" + (group.input_style ? group.input_style : group.multiple ? "check" : "radio") type=group.multiple ? "checkbox" : "radio" name=group.id id="qs-#{option.id}" value=option.id checked=option.checked)
    +                            label.c-quickstart__label.u-text-tiny(for="qs-#{option.id}")!=option.title
    +                                if option.meta
    +                                    |  #[span.c-quickstart__label__meta (#{option.meta})]
    +                                if option.help
    +                                    |  #[+help(option.help)]
    +
    +        if hide_results
    +            block
    +        else
    +            pre.c-code-block
    +                code.c-code-block__content.c-quickstart__code(data-qs-results="")
    +                    block
    +
    +
    +//- Quickstart code item
    +    data  - [object] Rendering conditions (keyed by option group ID, value: option)
    +    style - [string] modifier ID for line style
    +
    +mixin qs(data, style)
    +    - args = {}
    +    for value, setting in data
    +        - args['data-qs-' + setting] = value
    +    span.c-quickstart__line(class="c-quickstart__line--#{style || 'bash'}")&attributes(args)
    +        block
    +
    +
    +//- Terminal-style code window
    +    label - [string] title displayed in top bar of terminal window
    +
    +mixin terminal(label)
    +    .x-terminal
    +        .x-terminal__icons: span
    +        .u-padding-small.u-text-label.u-text-center=label
    +
    +        +code.x-terminal__code
    +            block
    +
    +
    +//- Landing
    +
    +mixin landing-header()
    +    header.c-landing
    +        .c-landing__wrapper
    +            .c-landing__content
    +                block
    +
    +mixin landing-banner(headline, label)
    +    .c-landing__banner.u-padding.o-block.u-color-light
    +        +grid.c-landing__banner__content.o-no-block
    +            +grid-col("third")
    +                h3.u-heading.u-heading-1
    +                    if label
    +                        div
    +                            span.u-text-label.u-text-label--light=label
    +                    !=headline
    +
    +            +grid-col("two-thirds").c-landing__banner__text
    +                block
    +
    +
    +mixin landing-logos(title, logos)
    +    .o-content.u-text-center&attributes(attributes)
    +        h3.u-heading.u-text-label.u-color-dark=title
    +
    +        each row, i in logos
    +            - var is_last = i == logos.length - 1
    +            +grid("center").o-inline-list.o-no-block(class=is_last ? "o-no-block" : null)
    +                each details, name in row
    +                    +a(details[0]).u-padding-medium
    +                        +icon(name, details[1], details[2])
    +
    +                if is_last
    +                    block
    +
    +
    +//- Under construction (temporary)
    +    Marks sections that still need to be completed for the v2.0 release.
    +
    +mixin under-construction()
    +    +infobox("Under construction", "🚧")
    +        |  This section is still being written and will be updated for the v2.0
    +        |  release. Is there anything that you think should definitely mentioned or
    +        |  explained here? Any examples you'd like to see? #[strong Let us know]
    +        |  on the #[+a(gh("spacy") + "/issues/1105") v2.0 alpha thread] on GitHub!
    
    From 25f6331550bae1fb25685ffe3e6a3a525aee2a1a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 30 Oct 2017 13:15:30 +0100
    Subject: [PATCH 614/649] Allow other style arguments on +grid-col
    
    ---
     website/_includes/_mixins.jade      | 4 ++--
     website/assets/css/_base/_grid.sass | 3 +++
     2 files changed, 5 insertions(+), 2 deletions(-)
    
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 902328906..94d84b4fe 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -448,8 +448,8 @@ mixin grid(...style)
         width - [string] "quarter", "third", "half", "two-thirds", "three-quarters"
         see $grid in assets/css/_variables.sass
     
    -mixin grid-col(width)
    -    .o-grid__col(class="o-grid__col--#{width}")&attributes(attributes)
    +mixin grid-col(...style)
    +    .o-grid__col(class=prefixArgs(style, "o-grid__col"))&attributes(attributes)
             block
     
     
    diff --git a/website/assets/css/_base/_grid.sass b/website/assets/css/_base/_grid.sass
    index 536c657db..16cf40f71 100644
    --- a/website/assets/css/_base/_grid.sass
    +++ b/website/assets/css/_base/_grid.sass
    @@ -48,6 +48,9 @@
             flex: 0 0 100%
             flex-flow: column wrap
     
    +    &.o-grid__col--no-gutter
    +        margin-top: 0
    +
         // Fix overflow issue in old browsers
     
         & > *
    
    From ae454469789c537e5b9ce710883bee01d311e497 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 30 Oct 2017 13:15:46 +0100
    Subject: [PATCH 615/649] Remove comment
    
    ---
     website/_includes/_page-docs.jade | 3 ---
     1 file changed, 3 deletions(-)
    
    diff --git a/website/_includes/_page-docs.jade b/website/_includes/_page-docs.jade
    index 703102487..6295491a6 100644
    --- a/website/_includes/_page-docs.jade
    +++ b/website/_includes/_page-docs.jade
    @@ -25,9 +25,6 @@ main.o-main.o-main--sidebar.o-main--aside
                         +button(gh("spacy", source), false, "secondary", "small").u-nowrap
                             |  Source #[+icon("code", 14)]
     
    -        //-if ALPHA
    -        //-    +alpha-info
    -
             if IS_MODELS
                 include _page_models
             else
    
    From 74dd0ee2c2418f26a263773ded2171ac2eaf44da Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 30 Oct 2017 13:16:06 +0100
    Subject: [PATCH 616/649] Prevent responsive tables form scrolling vertically
    
    ---
     website/assets/css/_components/_tables.sass | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/website/assets/css/_components/_tables.sass b/website/assets/css/_components/_tables.sass
    index 021b9521a..99ae998ff 100644
    --- a/website/assets/css/_components/_tables.sass
    +++ b/website/assets/css/_components/_tables.sass
    @@ -51,6 +51,7 @@
             @include scroll-shadow-base($color-front)
             display: inline-block
             overflow-x: auto
    +        overflow-y: hidden
             width: auto
             -webkit-overflow-scrolling: touch
     
    
    From df149455f9b2c8acb371a0fb96acfae982565173 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 30 Oct 2017 13:16:20 +0100
    Subject: [PATCH 617/649] Don't ever wrap navigation bar contents
    
    ---
     website/assets/css/_components/_navigation.sass | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/assets/css/_components/_navigation.sass b/website/assets/css/_components/_navigation.sass
    index 1543de5fb..2f1cfb6e3 100644
    --- a/website/assets/css/_components/_navigation.sass
    +++ b/website/assets/css/_components/_navigation.sass
    @@ -8,7 +8,7 @@
         align-items: center
         display: flex
         justify-content: space-between
    -    flex-flow: row wrap
    +    flex-flow: row nowrap
         padding: 0 2rem 0 1rem
         z-index: 30
         width: 100%
    
    From 5453821a9f93390c3cefbc4d976aad823594ff7c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 30 Oct 2017 13:53:49 +0100
    Subject: [PATCH 618/649] Update NER annotation scheme
    
    Add note on training data sources and include coarse-grained Wikipedia scheme
    ---
     spacy/glossary.py                            | 12 +++++-
     website/api/_annotation/_named-entities.jade | 40 ++++++++++++++++++--
     website/usage/_install/_changelog.jade       |  2 +-
     3 files changed, 48 insertions(+), 6 deletions(-)
    
    diff --git a/spacy/glossary.py b/spacy/glossary.py
    index 78e61f8a7..c17cb7467 100644
    --- a/spacy/glossary.py
    +++ b/spacy/glossary.py
    @@ -300,5 +300,15 @@ GLOSSARY = {
         'MONEY':        'Monetary values, including unit',
         'QUANTITY':     'Measurements, as of weight or distance',
         'ORDINAL':      '"first", "second", etc.',
    -    'CARDINAL':     'Numerals that do not fall under another type'
    +    'CARDINAL':     'Numerals that do not fall under another type',
    +
    +
    +    # Named Entity Recognition
    +    # Wikipedia
    +    # http://www.sciencedirect.com/science/article/pii/S0004370212000276
    +    # https://pdfs.semanticscholar.org/5744/578cc243d92287f47448870bb426c66cc941.pdf
    +
    +    'PER':          'Named person or family.',
    +    'MISC':         ('Miscellaneous entities, e.g. events, nationalities, '
    +                     'products or works of art'),
     }
    diff --git a/website/api/_annotation/_named-entities.jade b/website/api/_annotation/_named-entities.jade
    index 93e705c72..4cc8a707f 100644
    --- a/website/api/_annotation/_named-entities.jade
    +++ b/website/api/_annotation/_named-entities.jade
    @@ -1,6 +1,11 @@
     //- 💫 DOCS > API > ANNOTATION > NAMED ENTITIES
     
    -+table([ "Type", "Description" ])
    +p
    +    |  Models trained on the
    +    |  #[+a("https://catalog.ldc.upenn.edu/ldc2013t19") OntoNotes 5] corpus
    +    |  support the following entity types:
    +
    ++table(["Type", "Description"])
         +row
             +cell #[code PERSON]
             +cell People, including fictional.
    @@ -45,9 +50,6 @@
             +cell #[code LANGUAGE]
             +cell Any named language.
     
    -p The following values are also annotated in a style similar to names:
    -
    -+table([ "Type", "Description" ])
         +row
             +cell #[code DATE]
             +cell Absolute or relative dates or periods.
    @@ -75,3 +77,33 @@ p The following values are also annotated in a style similar to names:
         +row
             +cell #[code CARDINAL]
             +cell Numerals that do not fall under another type.
    +
    ++h(4, "ner-wikipedia-scheme") Wikipedia scheme
    +
    +p
    +    |  Models trained on Wikipedia corpus
    +    |  (#[+a("http://www.sciencedirect.com/science/article/pii/S0004370212000276") Nothman et al., 2013])
    +    |  use a less fine-grained NER annotation scheme and recognise the
    +    |  following entities:
    +
    ++table(["Type", "Description"])
    +    +row
    +        +cell #[code PER]
    +        +cell Named person or family.
    +
    +    +row
    +        +cell #[code LOC]
    +        +cell
    +            |  Name of politically or geographically defined location (cities,
    +            |  provinces, countries, international regions, bodies of water,
    +            |  mountains).
    +
    +    +row
    +        +cell #[code ORG]
    +        +cell Named corporate, governmental, or other organizational entity.
    +
    +    +row
    +        +cell #[code MISC]
    +        +cell
    +            |  Miscellaneous entities, e.g. events, nationalities, products or
    +            |  works of art.
    diff --git a/website/usage/_install/_changelog.jade b/website/usage/_install/_changelog.jade
    index e966b6695..7b802ce63 100644
    --- a/website/usage/_install/_changelog.jade
    +++ b/website/usage/_install/_changelog.jade
    @@ -3,7 +3,7 @@
     +h(2, "changelog") Changelog
         +button(gh("spacy") + "/releases", false, "secondary", "small").u-float-right.u-nowrap View releases
     
    -div(data-tpl="changelog" data-tpl-key="error")
    +div(data-tpl="changelog" data-tpl-key="error" style="display: none")
         +infobox
             |  Unable to load changelog from GitHub. Please see the
             |  #[+a(gh("spacy") + "/releases") releases page] instead.
    
    From 8db3da3c3dbe70687ba39030b2fa513cb74d8749 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 30 Oct 2017 14:06:25 +0100
    Subject: [PATCH 619/649] Refactor JS, split into modules and add nomodule
     option
    
    rollup.js will be compiled by the rollup package and Babel on build, and will be loaded if a browser doesn't yet support JS modules
    ---
     website/_harp.json                            |   4 +-
     website/_includes/_scripts.jade               |  81 +++--
     website/assets/js/changelog.js                |  72 ++++
     website/assets/js/github-embed.js             |  36 ++
     website/assets/js/main.js                     | 323 ------------------
     website/assets/js/models.js                   | 160 +++++++++
     website/assets/js/nav-highlighter.js          |  33 ++
     website/assets/js/progress.js                 |  52 +++
     website/assets/js/rollup.js                   |  23 ++
     website/assets/js/util.js                     |  56 +++
     website/assets/js/{ => vendor}/chart.min.js   |   0
     website/assets/js/{ => vendor}/in-view.min.js |   0
     website/assets/js/{ => vendor}/prism.min.js   |   0
     .../assets/js/{ => vendor}/quickstart.min.js  |   0
     14 files changed, 493 insertions(+), 347 deletions(-)
     create mode 100644 website/assets/js/changelog.js
     create mode 100644 website/assets/js/github-embed.js
     delete mode 100644 website/assets/js/main.js
     create mode 100644 website/assets/js/models.js
     create mode 100644 website/assets/js/nav-highlighter.js
     create mode 100644 website/assets/js/progress.js
     create mode 100644 website/assets/js/rollup.js
     create mode 100644 website/assets/js/util.js
     rename website/assets/js/{ => vendor}/chart.min.js (100%)
     rename website/assets/js/{ => vendor}/in-view.min.js (100%)
     rename website/assets/js/{ => vendor}/prism.min.js (100%)
     rename website/assets/js/{ => vendor}/quickstart.min.js (100%)
    
    diff --git a/website/_harp.json b/website/_harp.json
    index 7c69beef0..bc1a0b5e5 100644
    --- a/website/_harp.json
    +++ b/website/_harp.json
    @@ -84,8 +84,8 @@
             ],
     
             "ALPHA": true,
    -        "V_CSS": "2.0a1",
    -        "V_JS": "2.0a0",
    +        "V_CSS": "2.0a2",
    +        "V_JS": "2.0a1",
             "DEFAULT_SYNTAX": "python",
             "ANALYTICS": "UA-58931649-1",
             "MAILCHIMP": {
    diff --git a/website/_includes/_scripts.jade b/website/_includes/_scripts.jade
    index 5ecdd0711..e1d9f773a 100644
    --- a/website/_includes/_scripts.jade
    +++ b/website/_includes/_scripts.jade
    @@ -1,43 +1,80 @@
     //- 💫 INCLUDES > SCRIPTS
     
     if quickstart
    -        script(src="/assets/js/quickstart.min.js")
    +    script(src="/assets/js/vendor/quickstart.min.js")
     
     if IS_PAGE
    -    script(src="/assets/js/in-view.min.js")
    +    script(src="/assets/js/vendor/in-view.min.js")
     
     if environment == "deploy"
         script(async src="https://www.google-analytics.com/analytics.js")
     
    -script(src="/assets/js/prism.min.js")
    -script(src="/assets/js/main.js?v#{V_JS}")
    +script(src="/assets/js/vendor/prism.min.js")
    +
    +if SECTION == "models"
    +    script(src="/assets/js/vendor/chart.min.js")
    +    script(src="/assets/js/models.js?v#{V_JS}" type="module")
     
     script
    -    | new ProgressBar('.js-progress');
    -
    -    if changelog
    -        | new Changelog('!{SOCIAL.github}', 'spacy');
    -
         if quickstart
             | new Quickstart("#qs");
     
    -    if IS_PAGE
    -        | new SectionHighlighter('data-section', 'data-nav');
    -        | new GitHubEmbed('!{SOCIAL.github}', 'data-gh-embed');
    -        | ((window.gitter = {}).chat = {}).options = {
    -        |     useStyles: false,
    -        |     activationElement: '.js-gitter-button',
    -        |     targetElement: '.js-gitter',
    -        |     room: '!{SOCIAL.gitter}'
    -        | };
    -
    -    if HAS_MODELS
    -        | new ModelLoader('!{MODELS_REPO}', !{JSON.stringify(CURRENT_MODELS)}, !{JSON.stringify(MODEL_LICENSES)}, !{JSON.stringify(MODEL_BENCHMARKS)});
    -
         if environment == "deploy"
             | window.ga=window.ga||function(){
             | (ga.q=ga.q||[]).push(arguments)}; ga.l=+new Date;
             | ga('create', '#{ANALYTICS}', 'auto'); ga('send', 'pageview');
     
    +
     if IS_PAGE
    +    script
    +        | ((window.gitter = {}).chat = {}).options = {
    +        |     useStyles: false,
    +        |     activationElement: '.js-gitter-button',
    +        |     targetElement: '.js-gitter',
    +        |     room: '!{SOCIAL.gitter}'
    +        | };
         script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer)
    +
    +
    +//- JS modules – slightly hacky, but necessary to dynamically instantiate the
    +    classes with data from the Harp JSON files, while still being able to
    +    support older browsers that can't handle JS modules. More details:
    +    https://medium.com/dev-channel/es6-modules-in-chrome-canary-m60-ba588dfb8ab7
    +
    +- ProgressBar = "new ProgressBar('.js-progress');"
    +- Changelog = "new Changelog('" + SOCIAL.github + "', 'spacy');"
    +- NavHighlighter = "new NavHighlighter('data-section', 'data-nav');"
    +- GitHubEmbed = "new GitHubEmbed('" + SOCIAL.github + "', 'data-gh-embed');"
    +- ModelLoader = "new ModelLoader('" + MODELS_REPO + "'," + JSON.stringify(CURRENT_MODELS) + "," + JSON.stringify(MODEL_LICENSES) + "," + JSON.stringify(MODEL_BENCHMARKS) + ");"
    +
    +//- Browsers with JS module support.
    +    Will be ignored otherwise.
    +
    +script(type="module")
    +    | import ProgressBar from '/assets/js/progress.js';
    +    !=ProgressBar
    +    if changelog
    +        | import Changelog from '/assets/js/changelog.js';
    +        !=Changelog
    +    if IS_PAGE
    +        | import NavHighlighter from '/assets/js/nav-highlighter.js';
    +        !=NavHighlighter
    +        | import GitHubEmbed from '/assets/js/github-embed.js';
    +        !=GitHubEmbed
    +    if HAS_MODELS
    +        | import { ModelLoader } from '/assets/js/models.js';
    +        !=ModelLoader
    +
    +//- Browsers with no JS module support.
    +    Won't be fetched or interpreted otherwise.
    +
    +script(nomodule src="/assets/js/rollup.js")
    +script(nomodule)
    +    !=ProgressBar
    +    if changelog
    +        !=Changelog
    +    if IS_PAGE
    +        !=NavHighlighter
    +        !=GitHubEmbed
    +    if HAS_MODELS
    +        !=ModeLoader
    diff --git a/website/assets/js/changelog.js b/website/assets/js/changelog.js
    new file mode 100644
    index 000000000..94f2149ad
    --- /dev/null
    +++ b/website/assets/js/changelog.js
    @@ -0,0 +1,72 @@
    +'use strict';
    +
    +import { Templater, handleResponse } from './util.js';
    +
    +export default class Changelog {
    +    /**
    +     * Fetch and render changelog from GitHub. Clones a template node (table row)
    +     * to avoid doubling templating markup in JavaScript.
    +     * @param {string} user - GitHub username.
    +     * @param {string} repo - Repository to fetch releases from.
    +     */
    +    constructor(user, repo) {
    +        this.url = `https://api.github.com/repos/${user}/${repo}/releases`;
    +        this.template = new Templater('changelog');
    +        this.fetchChangelog()
    +            .then(json => this.render(json))
    +            .catch(this.showError.bind(this));
    +        // make sure scroll positions for progress bar etc. are recalculated
    +        window.dispatchEvent(new Event('resize'));
    +    }
    +
    +    fetchChangelog() {
    +        return new Promise((resolve, reject) =>
    +            fetch(this.url)
    +                .then(res => handleResponse(res))
    +                .then(json => json.ok ? resolve(json) : reject()))
    +    }
    +
    +    showError() {
    +        this.template.get('error').style.display = 'block';
    +    }
    +
    +    /**
    +     * Get template section from template row. Hacky, but does make sense.
    +     * @param {node} item - Parent element.
    +     * @param {string} id - ID of child element, set via data-changelog.
    +     */
    +    getField(item, id) {
    +        return item.querySelector(`[data-changelog="${id}"]`);
    +    }
    +
    +    render(json) {
    +        this.template.get('table').style.display = 'block';
    +        this.row = this.template.get('item');
    +        this.releases = this.template.get('releases');
    +        this.prereleases = this.template.get('prereleases');
    +        Object.values(json)
    +            .filter(release => release.name)
    +            .forEach(release => this.renderRelease(release));
    +        this.row.remove();
    +    }
    +
    +    /**
    +     * Clone the template row and populate with content from API response.
    +     * https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository
    +     * @param {string} name - Release title.
    +     * @param {string} tag (tag_name) - Release tag.
    +     * @param {string} url (html_url) - URL to the release page on GitHub.
    +     * @param {string} date (published_at) - Timestamp of release publication.
    +     * @param {boolean} prerelease - Whether the release is a prerelease.
    +     */
    +    renderRelease({ name, tag_name: tag, html_url: url, published_at: date, prerelease }) {
    +        const container = prerelease ? this.prereleases : this.releases;
    +        const tagLink = `${tag}`;
    +        const title = (name.split(': ').length == 2) ? name.split(': ')[1] : name;
    +        const row = this.row.cloneNode(true);
    +        this.getField(row, 'date').textContent = date.split('T')[0];
    +        this.getField(row, 'tag').innerHTML = tagLink;
    +        this.getField(row, 'title').textContent = title;
    +        container.appendChild(row);
    +    }
    +}
    diff --git a/website/assets/js/github-embed.js b/website/assets/js/github-embed.js
    new file mode 100644
    index 000000000..58e80ee1a
    --- /dev/null
    +++ b/website/assets/js/github-embed.js
    @@ -0,0 +1,36 @@
    +'use strict';
    +
    +import { $$ } from './util.js';
    +
    +export default class GitHubEmbed {
    +    /**
    +     * Embed code from GitHub repositories, similar to Gist embeds. Fetches the
    +     * raw text and places it inside element.
    +     * Usage: 
    +     * @param {string} user - GitHub user or organization.
    +     * @param {string} attr - Data attribute used to select containers. Attribute
    +     *                        value should be path to file relative to user.
    +     */
    +    constructor(user, attr) {
    +        this.url = `https://raw.githubusercontent.com/${user}`;
    +        this.attr = attr;
    +        this.error = `\nCan't fetch code example from GitHub :(\n\nPlease use the link below to view the example. If you've come across\na broken link, we always appreciate a pull request to the repository,\nor a report on the issue tracker. Thanks!`;
    +        [...$$(`[${this.attr}]`)].forEach(el => this.embed(el));
    +    }
    +
    +    /**
    +     * Fetch code from GitHub and insert it as element content. File path is
    +     * read off the container's data attribute.
    +     * @param {node} el - The element.
    +     */
    +    embed(el) {
    +        el.parentElement.setAttribute('data-loading', '');
    +        fetch(`${this.url}/${el.getAttribute(this.attr)}`)
    +            .then(res => res.text().then(text => ({ text, ok: res.ok })))
    +            .then(({ text, ok }) => {
    +                el.textContent = ok ? text : this.error;
    +                if (ok && window.Prism) Prism.highlightElement(el);
    +            })
    +        el.parentElement.removeAttribute('data-loading');
    +    }
    +}
    diff --git a/website/assets/js/main.js b/website/assets/js/main.js
    deleted file mode 100644
    index d9465bb67..000000000
    --- a/website/assets/js/main.js
    +++ /dev/null
    @@ -1,323 +0,0 @@
    -//- 💫 MAIN JAVASCRIPT
    -//- Note: Will be compiled using Babel before deployment.
    -
    -'use strict'
    -
    -const $ = document.querySelector.bind(document);
    -const $$ = document.querySelectorAll.bind(document);
    -
    -
    -class ProgressBar {
    -    /**
    -     * Animated reading progress bar.
    -     * @param {String} selector – CSS selector of progress bar element.
    -     */
    -    constructor(selector) {
    -        this.el = $(selector);
    -        this.scrollY = 0;
    -        this.sizes = this.updateSizes();
    -        this.el.setAttribute('max', 100);
    -        this.init();
    -    }
    -
    -    init() {
    -        window.addEventListener('scroll', () => {
    -            this.scrollY = (window.pageYOffset || document.scrollTop) - (document.clientTop || 0);
    -            requestAnimationFrame(this.update.bind(this));
    -        }, false);
    -        window.addEventListener('resize', () => {
    -            this.sizes = this.updateSizes();
    -            requestAnimationFrame(this.update.bind(this));
    -        })
    -    }
    -
    -    update() {
    -        const offset = 100 - ((this.sizes.height - this.scrollY - this.sizes.vh) / this.sizes.height * 100);
    -        this.el.setAttribute('value', (this.scrollY == 0) ? 0 : offset || 0);
    -    }
    -
    -    updateSizes() {
    -        const body = document.body;
    -        const html = document.documentElement;
    -        return {
    -            height: Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight),
    -            vh: Math.max(html.clientHeight, window.innerHeight || 0)
    -        }
    -    }
    -}
    -
    -
    -class SectionHighlighter {
    -    /**
    -     * Hightlight section in viewport in sidebar, using in-view library.
    -     * @param {String} sectionAttr - Data attribute of sections.
    -     * @param {String} navAttr - Data attribute of navigation items.
    -     * @param {String} activeClass – Class name of active element.
    -     */
    -    constructor(sectionAttr, navAttr, activeClass = 'is-active') {
    -        this.sections = [...$$(`[${navAttr}]`)];
    -        this.navAttr = navAttr;
    -        this.sectionAttr = sectionAttr;
    -        this.activeClass = activeClass;
    -        inView(`[${sectionAttr}]`).on('enter', this.highlightSection.bind(this));
    -    }
    -
    -    highlightSection(section) {
    -        const id = section.getAttribute(this.sectionAttr);
    -        const el = $(`[${this.navAttr}="${id}"]`);
    -        if (el) {
    -            this.sections.forEach(el => el.classList.remove(this.activeClass));
    -            el.classList.add(this.activeClass);
    -        }
    -    }
    -}
    -
    -
    -class Templater {
    -    /**
    -     * Mini templating engine based on data attributes. Selects elements based
    -     * on a data-tpl and data-tpl-key attribute and can set textContent
    -     * and innterHtml.
    -     *
    -     * @param {String} templateId - Template section, e.g. value of data-tpl.
    -     */
    -    constructor(templateId) {
    -        this.templateId = templateId;
    -    }
    -
    -    get(key) {
    -        return $(`[data-tpl="${this.templateId}"][data-tpl-key="${key}"]`);
    -    }
    -
    -    fill(key, value, html = false) {
    -        const el = this.get(key);
    -        if (html) el.innerHTML = value || '';
    -        else el.textContent = value || '';
    -        return el;
    -    }
    -}
    -
    -
    -class ModelLoader {
    -    /**
    -     * Load model meta from GitHub and update model details on site. Uses the
    -     * Templater mini template engine to update DOM.
    -     *
    -     * @param {String} repo - Path tp GitHub repository containing releases.
    -     * @param {Array} models - List of model IDs, e.g. "en_core_web_sm".
    -     * @param {Object} licenses - License IDs mapped to URLs.
    -     * @param {Object} accKeys - Available accuracy keys mapped to display labels.
    -     */
    -    constructor(repo, models = [], licenses = {}, benchmarkKeys = {}) {
    -        this.url = `https://raw.githubusercontent.com/${repo}/master`;
    -        this.repo = `https://github.com/${repo}`;
    -        this.modelIds = models;
    -        this.licenses = licenses;
    -        this.benchKeys = benchmarkKeys;
    -        this.init();
    -    }
    -
    -    init() {
    -        this.modelIds.forEach(modelId =>
    -            new Templater(modelId).get('table').setAttribute('data-loading', ''));
    -        fetch(`${this.url}/compatibility.json`)
    -            .then(res => this.handleResponse(res))
    -            .then(json => json.ok ? this.getModels(json['spacy']) : this.modelIds.forEach(modelId => this.showError(modelId)))
    -    }
    -
    -    handleResponse(res) {
    -        if (res.ok) return res.json().then(json => Object.assign({}, json, { ok: res.ok }))
    -        else return ({ ok: res.ok })
    -    }
    -
    -    convertNumber(num, separator = ',') {
    -        return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, separator);
    -    }
    -
    -    getModels(compat) {
    -        this.compat = compat;
    -        for (let modelId of this.modelIds) {
    -            const version = this.getLatestVersion(modelId, compat);
    -            if (!version) {
    -                this.showError(modelId); return;
    -            }
    -            fetch(`${this.url}/meta/${modelId}-${version}.json`)
    -                .then(res => this.handleResponse(res))
    -                .then(json => json.ok ? this.render(json) : this.showError(modelId))
    -        }
    -        // make sure scroll positions for progress bar etc. are recalculated
    -        window.dispatchEvent(new Event('resize'));
    -    }
    -
    -    showError(modelId) {
    -        const template = new Templater(modelId);
    -        template.get('table').removeAttribute('data-loading');
    -        template.get('error').style.display = 'block';
    -        for (let key of ['sources', 'pipeline', 'vectors', 'author', 'license']) {
    -            template.get(key).parentElement.parentElement.style.display = 'none';
    -        }
    -    }
    -
    -    /**
    -     * Update model details in tables. Currently quite hacky :(
    -     */
    -    render({ lang, name, version, sources, pipeline, vectors, url, author, license, accuracy, speed, size, description, notes }) {
    -        const modelId = `${lang}_${name}`;
    -        const model = `${modelId}-${version}`;
    -        const template = new Templater(modelId);
    -
    -        const getSources = s => (s instanceof Array) ? s.join(', ') : s;
    -        const getPipeline = p => p.map(comp => `${comp}`).join(', ');
    -        const getVectors = v => `${this.convertNumber(v.entries)} (${v.width} dimensions)`;
    -        const getLink = (t, l) => `${t}`;
    -
    -        const keys = { version, size, description, notes }
    -        Object.keys(keys).forEach(key => template.fill(key, keys[key]));
    -
    -        if (sources) template.fill('sources', getSources(sources));
    -        if (pipeline && pipeline.length) template.fill('pipeline', getPipeline(pipeline), true);
    -        else template.get('pipeline').parentElement.parentElement.style.display = 'none';
    -        if (vectors) template.fill('vectors', getVectors(vectors));
    -        else template.get('vectors').parentElement.parentElement.style.display = 'none';
    -
    -        if (author) template.fill('author', url ? getLink(author, url) : author, true);
    -        if (license) template.fill('license', this.licenses[license] ? getLink(license, this.licenses[license]) : license, true);
    -
    -        template.get('download').setAttribute('href', `${this.repo}/releases/tag/${model}`);
    -
    -        this.renderBenchmarks(template, accuracy, speed);
    -        this.renderCompat(template, modelId);
    -        template.get('table').removeAttribute('data-loading');
    -    }
    -
    -    renderBenchmarks(template, accuracy = {}, speed = {}) {
    -        if (!accuracy && !speed) return;
    -        template.get('benchmarks').style.display = 'block';
    -        this.renderTable(template, 'parser', accuracy, val => val.toFixed(2));
    -        this.renderTable(template, 'ner', accuracy, val => val.toFixed(2));
    -        this.renderTable(template, 'speed', speed, Math.round);
    -    }
    -
    -    renderTable(template, id, benchmarks, convertVal = val => val) {
    -        if (!this.benchKeys[id] || !Object.keys(this.benchKeys[id]).some(key => benchmarks[key])) return;
    -        const keys = Object.keys(this.benchKeys[id]).map(k => benchmarks[k] ? k : false).filter(k => k);
    -        template.get(id).style.display = 'block';
    -        for (let key of keys) {
    -            template
    -                .fill(key, this.convertNumber(convertVal(benchmarks[key])))
    -                .parentElement.style.display = 'table-row';
    -        }
    -    }
    -
    -    renderCompat(template, modelId) {
    -        template.get('compat-wrapper').style.display = 'table-row';
    -        const options = Object.keys(this.compat).map(v => ``).join('');
    -        template
    -            .fill('compat', '' + options, true)
    -            .addEventListener('change', ev => {
    -                const result = this.compat[ev.target.value][modelId];
    -                if (result) template.fill('compat-versions', `${modelId}-${result[0]}`, true);
    -                else template.fill('compat-versions', '');
    -            });
    -    }
    -
    -    getLatestVersion(model, compat = {}) {
    -        for (let spacy_v of Object.keys(compat)) {
    -            const models = compat[spacy_v];
    -            if (models[model]) return models[model][0];
    -        }
    -    }
    -}
    -
    -
    -class Changelog {
    -    /**
    -     * Fetch and render changelog from GitHub. Clones a template node (table row)
    -     * to avoid doubling templating markup in JavaScript.
    -     *
    -     * @param {String} user - GitHub username.
    -     * @param {String} repo - Repository to fetch releases from.
    -     */
    -    constructor(user, repo) {
    -        this.url = `https://api.github.com/repos/${user}/${repo}/releases`;
    -        this.template = new Templater('changelog');
    -        fetch(this.url)
    -            .then(res => this.handleResponse(res))
    -            .then(json => json.ok ? this.render(json) : false)
    -    }
    -
    -    /**
    -     * Get template section from template row. Slightly hacky, but does make sense.
    -     */
    -    $(item, id) {
    -        return item.querySelector(`[data-changelog="${id}"]`);
    -    }
    -
    -    handleResponse(res) {
    -        if (res.ok) return res.json().then(json => Object.assign({}, json, { ok: res.ok }))
    -        else return ({ ok: res.ok })
    -    }
    -
    -    render(json) {
    -        this.template.get('error').style.display = 'none';
    -        this.template.get('table').style.display = 'block';
    -        this.row = this.template.get('item');
    -        this.releases = this.template.get('releases');
    -        this.prereleases = this.template.get('prereleases');
    -        Object.values(json)
    -            .filter(release => release.name)
    -            .forEach(release => this.renderRelease(release));
    -        this.row.remove();
    -        // make sure scroll positions for progress bar etc. are recalculated
    -        window.dispatchEvent(new Event('resize'));
    -    }
    -
    -    /**
    -     * Clone the template row and populate with content from API response.
    -     * https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository
    -     *
    -     * @param {String} name - Release title.
    -     * @param {String} tag (tag_name) - Release tag.
    -     * @param {String} url (html_url) - URL to the release page on GitHub.
    -     * @param {String} date (published_at) - Timestamp of release publication.
    -     * @param {Boolean} pre (prerelease) - Whether the release is a prerelease.
    -     */
    -    renderRelease({ name, tag_name: tag, html_url: url, published_at: date, prerelease: pre }) {
    -        const container = pre ? this.prereleases : this.releases;
    -        const row = this.row.cloneNode(true);
    -        this.$(row, 'date').textContent = date.split('T')[0];
    -        this.$(row, 'tag').innerHTML = `${tag}`;
    -        this.$(row, 'title').textContent = (name.split(': ').length == 2) ? name.split(': ')[1] : name;
    -        container.appendChild(row);
    -    }
    -}
    -
    -
    -class GitHubEmbed {
    -    /**
    -     * Embed code from GitHub repositories, similar to Gist embeds. Fetches the
    -     * raw text and places it inside element.
    -     * Usage: 
    -     *
    -     * @param {String} user - GitHub user or organization.
    -     * @param {String} attr - Data attribute used to select containers. Attribute
    -     *                        value should be path to file relative to user.
    -     */
    -    constructor(user, attr) {
    -        this.url = `https://raw.githubusercontent.com/${user}`;
    -        this.attr = attr;
    -        this.error = `\nCan't fetch code example from GitHub :(\n\nPlease use the link below to view the example. If you've come across\na broken link, we always appreciate a pull request to the repository,\nor a report on the issue tracker. Thanks!`;
    -        [...$$(`[${this.attr}]`)].forEach(el => this.embed(el));
    -    }
    -
    -    embed(el) {
    -        el.parentElement.setAttribute('data-loading', '');
    -        fetch(`${this.url}/${el.getAttribute(this.attr)}`)
    -            .then(res => res.text().then(text => ({ text, ok: res.ok })))
    -            .then(({ text, ok }) => {
    -                el.textContent = ok ? text : this.error;
    -                if (ok && window.Prism) Prism.highlightElement(el);
    -            })
    -        el.parentElement.removeAttribute('data-loading');
    -    }
    -}
    diff --git a/website/assets/js/models.js b/website/assets/js/models.js
    new file mode 100644
    index 000000000..5fe7ff54a
    --- /dev/null
    +++ b/website/assets/js/models.js
    @@ -0,0 +1,160 @@
    +'use strict';
    +
    +import { Templater, handleResponse, convertNumber } from './util.js';
    +
    +/**
    + * Chart.js defaults
    + */
    +Chart.defaults.global.legend.position = 'bottom';
    +Chart.defaults.global.defaultFontFamily = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'";
    +const CHART_COLORS = { model1: '#09a3d5', model2: '#066B8C' };
    +
    +/**
    + * Formatters for model details.
    + * @property {function} author – Format model author with optional link.
    + * @property {function} license - Format model license with optional link.
    + * @property {function} sources - Format training data sources (list or string).
    + * @property {function} pipeline - Format list of pipeline components.
    + * @property {function} vectors - Format vector data (entries and dimensions).
    + * @property {function} version - Format model version number.
    + */
    +export const formats = {
    +    author: (author, url) => url ? `${author}` : author,
    +    license: (license, url) => url ? `${license}` : license,
    +    sources: sources => (sources instanceof Array) ? sources.join(', ') : sources,
    +    pipeline: pipes => (pipes && pipes.length) ? pipes.map(p => `${p}`).join(', ') : '-',
    +    vectors: vec => vec ? `${convertNumber(vec.entries)} (${vec.width} dimensions)` : 'n/a',
    +    version: version => `v${version}`
    +};
    +
    +/**
    + * Find the latest version of a model in a compatibility table.
    + * @param {string} model - The model name.
    + * @param {Object} compat - Compatibility table, keyed by spaCy version.
    + */
    +export const getLatestVersion = (model, compat = {}) => {
    +    for (let [spacy_v, models] of Object.entries(compat)) {
    +        if (models[model]) return models[model][0];
    +    }
    +};
    +
    +export class ModelLoader {
    +    /**
    +     * Load model meta from GitHub and update model details on site. Uses the
    +     * Templater mini template engine to update DOM.
    +     * @param {string} repo - Path tp GitHub repository containing releases.
    +     * @param {Array} models - List of model IDs, e.g. "en_core_web_sm".
    +     * @param {Object} licenses - License IDs mapped to URLs.
    +     * @param {Object} benchmarkKeys - Objects of available keys by type, e.g.
    +     *                                 'parser', 'ner', 'speed', mapped to labels.
    +     */
    +    constructor(repo, models = [], licenses = {}, benchmarkKeys = {}) {
    +        this.url = `https://raw.githubusercontent.com/${repo}/master`;
    +        this.repo = `https://github.com/${repo}`;
    +        this.modelIds = models;
    +        this.licenses = licenses;
    +        this.benchKeys = benchmarkKeys;
    +        this.init();
    +    }
    +
    +    init() {
    +        this.modelIds.forEach(modelId =>
    +            new Templater(modelId).get('table').setAttribute('data-loading', ''));
    +        this.fetch(`${this.url}/compatibility.json`)
    +            .then(json => this.getModels(json.spacy))
    +            .catch(_ => this.modelIds.forEach(modelId => this.showError(modelId)));
    +        // make sure scroll positions for progress bar etc. are recalculated
    +        window.dispatchEvent(new Event('resize'));
    +    }
    +
    +    fetch(url) {
    +        return new Promise((resolve, reject) =>
    +            fetch(url).then(res => handleResponse(res))
    +                .then(json => json.ok ? resolve(json) : reject()))
    +    }
    +
    +    getModels(compat) {
    +        this.compat = compat;
    +        for (let modelId of this.modelIds) {
    +            const version = getLatestVersion(modelId, compat);
    +            if (version) this.fetch(`${this.url}/meta/${modelId}-${version}.json`)
    +                .then(json => this.render(json))
    +                .catch(_ => this.showError(modelId))
    +            else this.showError(modelId);
    +        }
    +    }
    +
    +    showError(modelId) {
    +        const tpl = new Templater(modelId);
    +        tpl.get('table').removeAttribute('data-loading');
    +        tpl.get('error').style.display = 'block';
    +        for (let key of ['sources', 'pipeline', 'vectors', 'author', 'license']) {
    +            tpl.get(key).parentElement.parentElement.style.display = 'none';
    +        }
    +    }
    +
    +    /**
    +     * Update model details in tables. Currently quite hacky :(
    +     */
    +    render(data) {
    +        const modelId = `${data.lang}_${data.name}`;
    +        const model = `${modelId}-${data.version}`;
    +        const tpl = new Templater(modelId);
    +        this.renderDetails(tpl, data)
    +        this.renderBenchmarks(tpl, data.accuracy, data.speed);
    +        this.renderCompat(tpl, modelId);
    +        tpl.get('download').setAttribute('href', `${this.repo}/releases/tag/${model}`);
    +        tpl.get('table').removeAttribute('data-loading');
    +    }
    +
    +    renderDetails(tpl, { version, size, description, notes, author, url,
    +        license, sources, vectors, pipeline }) {
    +        const basics = { version, size, description, notes }
    +        for (let [key, value] of Object.entries(basics)) {
    +            if (value) tpl.fill(key, value);
    +        }
    +        if (author) tpl.fill('author', formats.author(author, url), true);
    +        if (license) tpl.fill('license', formats.license(license, this.licenses[license]), true);
    +        if (sources) tpl.fill('sources', formats.sources(sources));
    +        if (vectors) tpl.fill('vectors', formats.vectors(vectors));
    +        else tpl.get('vectors').parentElement.parentElement.style.display = 'none';
    +        if (pipeline && pipeline.length) tpl.fill('pipeline', formats.pipeline(pipeline), true);
    +        else tpl.get('pipeline').parentElement.parentElement.style.display = 'none';
    +    }
    +
    +    renderBenchmarks(tpl, accuracy = {}, speed = {}) {
    +        if (!accuracy && !speed) return;
    +        this.renderTable(tpl, 'parser', accuracy, val => val.toFixed(2));
    +        this.renderTable(tpl, 'ner', accuracy, val => val.toFixed(2));
    +        this.renderTable(tpl, 'speed', speed, Math.round);
    +        tpl.get('benchmarks').style.display = 'block';
    +    }
    +
    +    renderTable(tpl, id, benchmarks, converter = val => val) {
    +        if (!this.benchKeys[id] || !Object.keys(this.benchKeys[id]).some(key => benchmarks[key])) return;
    +        for (let key of Object.keys(this.benchKeys[id])) {
    +            if (benchmarks[key]) tpl
    +                .fill(key, convertNumber(converter(benchmarks[key])))
    +                .parentElement.style.display = 'table-row';
    +        }
    +        tpl.get(id).style.display = 'block';
    +    }
    +
    +    renderCompat(tpl, modelId) {
    +        tpl.get('compat-wrapper').style.display = 'table-row';
    +        const header = '';
    +        const options = Object.keys(this.compat)
    +            .map(v => ``)
    +            .join('');
    +        tpl
    +            .fill('compat', header + options, true)
    +            .addEventListener('change', ({ target: { value }}) =>
    +                tpl.fill('compat-versions', this.getCompat(value, modelId), true))
    +    }
    +
    +    getCompat(version, model) {
    +        const res = this.compat[version][model];
    +        return res ? `${model}-${res[0]}` : 'not compatible';
    +    }
    +}
    +
    diff --git a/website/assets/js/nav-highlighter.js b/website/assets/js/nav-highlighter.js
    new file mode 100644
    index 000000000..40f708e5e
    --- /dev/null
    +++ b/website/assets/js/nav-highlighter.js
    @@ -0,0 +1,33 @@
    +'use strict';
    +
    +import { $, $$ } from './util.js';
    +
    +export default class NavHighlighter {
    +    /**
    +     * Hightlight section in viewport in sidebar, using in-view library.
    +     * @param {string} sectionAttr - Data attribute of sections.
    +     * @param {string} navAttr - Data attribute of navigation items.
    +     * @param {string} activeClass – Class name of active element.
    +     */
    +    constructor(sectionAttr, navAttr, activeClass = 'is-active') {
    +        this.sections = [...$$(`[${navAttr}]`)];
    +        this.navAttr = navAttr;
    +        this.sectionAttr = sectionAttr;
    +        this.activeClass = activeClass;
    +        if (window.inView) inView(`[${sectionAttr}]`)
    +            .on('enter', this.highlightSection.bind(this));
    +    }
    +
    +    /**
    +     * Check if section in view exists in sidebar and mark as active.
    +     * @param {node} section - The section in view.
    +     */
    +    highlightSection(section) {
    +        const id = section.getAttribute(this.sectionAttr);
    +        const el = $(`[${this.navAttr}="${id}"]`);
    +        if (el) {
    +            this.sections.forEach(el => el.classList.remove(this.activeClass));
    +            el.classList.add(this.activeClass);
    +        }
    +    }
    +}
    diff --git a/website/assets/js/progress.js b/website/assets/js/progress.js
    new file mode 100644
    index 000000000..1497547d8
    --- /dev/null
    +++ b/website/assets/js/progress.js
    @@ -0,0 +1,52 @@
    +'use strict';
    +
    +import { $ } from './util.js';
    +
    +export default class ProgressBar {
    +    /**
    +     * Animated reading progress bar.
    +     * @param {string} selector – CSS selector of progress bar element.
    +     */
    +    constructor(selector) {
    +        this.scrollY = 0;
    +        this.sizes = this.updateSizes();
    +        this.el = $(selector);
    +        this.el.setAttribute('max', 100);
    +        window.addEventListener('scroll', this.onScroll.bind(this));
    +        window.addEventListener('resize', this.onResize.bind(this));
    +    }
    +
    +    onScroll(ev) {
    +        this.scrollY = (window.pageYOffset || document.scrollTop) - (document.clientTop || 0);
    +        requestAnimationFrame(this.update.bind(this));
    +    }
    +
    +    onResize(ev) {
    +        this.sizes = this.updateSizes();
    +        requestAnimationFrame(this.update.bind(this));
    +    }
    +
    +    update() {
    +        const offset = 100 - ((this.sizes.height - this.scrollY - this.sizes.vh) / this.sizes.height * 100);
    +        this.el.setAttribute('value', (this.scrollY == 0) ? 0 : offset || 0);
    +    }
    +
    +    /**
    +     * Update scroll and viewport height. Called on load and window resize.
    +     */
    +    updateSizes() {
    +        return {
    +            height: Math.max(
    +                document.body.scrollHeight,
    +                document.body.offsetHeight,
    +                document.documentElement.clientHeight,
    +                document.documentElement.scrollHeight,
    +                document.documentElement.offsetHeight
    +            ),
    +            vh: Math.max(
    +                document.documentElement.clientHeight,
    +                window.innerHeight || 0
    +            )
    +        }
    +    }
    +}
    diff --git a/website/assets/js/rollup.js b/website/assets/js/rollup.js
    new file mode 100644
    index 000000000..00ff92fa9
    --- /dev/null
    +++ b/website/assets/js/rollup.js
    @@ -0,0 +1,23 @@
    +/**
    + * This file is bundled by Rollup, compiled with Babel and included as
    + * 

    lVZMLzun{&8k zn@zj~Hooswq_S8#TneP-n-oJ$433`+hU6<7t|3*iD)v+g#B0a>m5tat$zWP4#YzG&HVs ze{FSC+udTh+af1w-|Mz`OZ;>&=vlY#!~NgYy$mTa6nC>F?fcypX;5gcD;-Tf{nNS! zT8eeu>6(b*w5xQ1!6_gtk#~al4#f6jLkB@T0Ne~%&kK?D7pEQoa+gwPf7%!+-AXlo z$yxiV!l8E4OLbm(o`u=ypyWR5AwvygYuN>Lv#44rs=LglhXWvBkJdG?w1nU%0|7l_ z+iqGAKtfdj5YK^Y4M~!mKnbC7i<0u=5lYF9|0u_J0yVCL??X9WK0(%((AF8Y+ven;xlg#ED}(}^D#??T*KdcPpjvhm3Y3z4uKfW(Wua-;63UXAiJf83$E-GUh^1 z^f#rUVOV1LYurr%#q($paSs8-MLX?sNh61+VCErqB5o9tt491aGGgYw5FeKJP&aG5 zST@HH8sp*Tb`1A07oSnMB39b3#A*dwadBa)2({S6&4;H38kvxOV_h09f+)SxWuTeu zgpDX~yZB%fa8<5fp&C|a$Q?YQjn&nNsp)a}*asERl7WE3I^lt+wsY|sG$zQ1VB{CQ zhPf1@YT7n-ULlW;V8fJp4cF)9mrrPAyI~GK9z*;974lDiFO@+)z0~TIsxGf-PN3)R zzm&~BFhSgcIi3&0MAzX$-8@-}REwlxD5P|F*+%cIfgHJ{C&1A@zmmSh|( z^A7a$&s(%y)mu9Jl4&lp<5JGA!P1)*TdUa0JY8aSaK>`2udo1H3{GUF^$9E(oH!$6 z)A|N70Zf2Gwge?08Cp=jFoFhw1Y>2ggYII&kohjV2Lx*_dx~{7b?C}?5X8t(-}E*a r@Q@%?M}wQlZ7CInEl)vdE0R&!$|TgbDiMvfW(=%sl?Le2PhuwkGL}3^ literal 0 HcmV?d00001 diff --git a/website/assets/fonts/hkgrotesk-semibolditalic.woff b/website/assets/fonts/hkgrotesk-semibolditalic.woff new file mode 100755 index 0000000000000000000000000000000000000000..3fce4cf35a2c0850a86d8e22e742b341c1e81e74 GIT binary patch literal 34196 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�Ke^&QWz)g8Cf-E0kd1dK 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 diff --git a/website/assets/fonts/sourcecodepro-semibold.svg b/website/assets/fonts/sourcecodepro-semibold.svg deleted file mode 100644 index 0515c3ad5..000000000 --- a/website/assets/fonts/sourcecodepro-semibold.svg +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcecodepro-semibold.ttf b/website/assets/fonts/sourcecodepro-semibold.ttf deleted file mode 100644 index ff2206e58e57e83414c00aad7a17c1e3dd6dd971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55544 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 RErH~@sI<*ri@IN_{{lla#sB~S diff --git a/website/assets/fonts/sourcecodepro-semibold.woff b/website/assets/fonts/sourcecodepro-semibold.woff deleted file mode 100644 index 83cd2c3ea6ad1b86ff5a074ac963d907dbf8dc72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27952 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