From 10e67b400c91467b7eaf03bd8b7f49359b2c47ca Mon Sep 17 00:00:00 2001 From: svlandeg Date: Tue, 18 Aug 2020 13:38:43 +0200 Subject: [PATCH 01/10] output_file required, spacy-transformers prefered instead of required --- spacy/cli/init_config.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/spacy/cli/init_config.py b/spacy/cli/init_config.py index 7d80eb289..79c4acd11 100644 --- a/spacy/cli/init_config.py +++ b/spacy/cli/init_config.py @@ -39,7 +39,7 @@ class RecommendationSchema(BaseModel): @init_cli.command("config") def init_config_cli( # fmt: off - output_file: Path = Arg("-", help="File to save config.cfg to (or - for stdout)", allow_dash=True), + output_file: Path = Arg(..., help="File to save config.cfg to (or - for stdout, disabling logging)", allow_dash=True), lang: Optional[str] = Opt("en", "--lang", "-l", help="Two-letter code of the language to use"), pipeline: Optional[str] = Opt("tagger,parser,ner", "--pipeline", "-p", help="Comma-separated names of trainable pipeline components to include in the model (without 'tok2vec' or 'transformer')"), optimize: Optimizations = Opt(Optimizations.efficiency.value, "--optimize", "-o", help="Whether to optimize for efficiency (faster inference, smaller model, lower memory consumption) or higher accuracy (potentially larger and slower model). This will impact the choice of architecture, pretrained weights and related hyperparameters."), @@ -128,6 +128,8 @@ def init_config( "word_vectors": reco["word_vectors"], "has_letters": has_letters, } + if variables["transformer_data"] and not cpu: + variables["transformer_data"] = prefer_spacy_transformers(msg) base_template = template.render(variables).strip() # Giving up on getting the newlines right in jinja for now base_template = re.sub(r"\n\n\n+", "\n\n", base_template) @@ -144,8 +146,6 @@ def init_config( for label, value in use_case.items(): msg.text(f"- {label}: {value}") use_transformer = bool(template_vars.use_transformer) - if use_transformer: - require_spacy_transformers(msg) with show_validation_error(hint_fill=False): config = util.load_config_from_str(base_template) nlp, _ = util.load_model_from_config(config, auto_fill=True) @@ -167,12 +167,13 @@ def save_config(config: Config, output_file: Path, is_stdout: bool = False) -> N print(f"{COMMAND} train {output_file.parts[-1]} {' '.join(variables)}") -def require_spacy_transformers(msg: Printer) -> None: +def prefer_spacy_transformers(msg: Printer) -> bool: try: import spacy_transformers # noqa: F401 except ImportError: - msg.fail( - "Using a transformer-based pipeline requires spacy-transformers " - "to be installed.", - exits=1, + msg.info( + "Recommend to install 'spacy-transformers' to create a more efficient " + "transformer-based pipeline." ) + return False + return True From 2253d26b8211e1cb09ee2e59d187e03d6e0c5fc7 Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Wed, 19 Aug 2020 21:18:26 +0200 Subject: [PATCH 02/10] Update vectors and similarity docs [ci skip] --- website/docs/images/sense2vec.jpg | Bin 0 -> 229159 bytes website/docs/usage/101/_vectors-similarity.md | 72 +++++++++++++++--- website/docs/usage/linguistic-features.md | 17 ----- website/src/components/link.js | 4 +- website/src/components/util.js | 11 +++ 5 files changed, 73 insertions(+), 31 deletions(-) create mode 100644 website/docs/images/sense2vec.jpg diff --git a/website/docs/images/sense2vec.jpg b/website/docs/images/sense2vec.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a1772582cf90f02b565c71e1d18a4c4b27a4291 GIT binary patch literal 229159 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

Xi%bg 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

w)KLQu{ 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 JKXCqD{Xf_6lcfLv literal 0 HcmV?d00001 diff --git a/website/docs/usage/101/_vectors-similarity.md b/website/docs/usage/101/_vectors-similarity.md index a04c96236..92df1b331 100644 --- a/website/docs/usage/101/_vectors-similarity.md +++ b/website/docs/usage/101/_vectors-similarity.md @@ -80,25 +80,73 @@ duplicate if it's very similar to an already existing one. Each [`Doc`](/api/doc), [`Span`](/api/span), [`Token`](/api/token) and [`Lexeme`](/api/lexeme) comes with a [`.similarity`](/api/token#similarity) method that lets you compare it with another object, and determine the -similarity. Of course similarity is always subjective – whether "dog" and "cat" -are similar really depends on how you're looking at it. spaCy's similarity model -usually assumes a pretty general-purpose definition of similarity. +similarity. Of course similarity is always subjective – whether two words, spans +or documents are similar really depends on how you're looking at it. spaCy's +similarity model usually assumes a pretty general-purpose definition of +similarity. - +> #### 📝 Things to try +> +> 1. Compare two different tokens and try to find the two most _dissimilar_ +> tokens in the texts with the lowest similarity score (according to the +> vectors). +> 2. Compare the similarity of two [`Lexeme`](/api/lexeme) objects, entries in +> the vocabulary. You can get a lexeme via the `.lex` attribute of a token. +> You should see that the similarity results are identical to the token +> similarity. ```python ### {executable="true"} import spacy nlp = spacy.load("en_core_web_md") # make sure to use larger model! -tokens = nlp("dog cat banana") +doc1 = nlp("I like salty fries and hamburgers.") +doc2 = nlp("Fast food tastes very good.") -for token1 in tokens: - for token2 in tokens: - print(token1.text, token2.text, token1.similarity(token2)) +# Similarity of two documents +print(doc1, "<->", doc2, doc1.similarity(doc2)) +# Similarity of tokens and spans +french_fries = doc1[2:4] +burgers = doc1[5] +print(french_fries, "<->", burgers, french_fries.similarity(burgers)) ``` -In this case, the model's predictions are pretty on point. A dog is very similar -to a cat, whereas a banana is not very similar to either of them. Identical -tokens are obviously 100% similar to each other (just not always exactly `1.0`, -because of vector math and floating point imprecisions). +### What to expect from similarity results {#similarity-expectations} + +Computing similarity scores can be helpful in many situations, but it's also +important to maintain **realistic expectations** about what information it can +provide. Words can be related to each over in many ways, so a single +"similarity" score will always be a **mix of different signals**, and vectors +trained on different data can produce very different results that may not be +useful for your purpose. Here are some important considerations to keep in mind: + +- There's no objective definition of similarity. Whether "I like burgers" and "I + like pasta" is similar **depends on your application**. Both talk about food + preferences, which makes them very similar – but if you're analyzing mentions + of food, those sentences are pretty dissimilar, because they talk about very + different foods. +- The similarity of [`Doc`](/api/doc) and [`Span`](/api/span) objects defaults + to the **average** of the token vectors. This means that the vector for "fast + food" is the average of the vectors for "fast" and "food", which isn't + necessarily representative of the phrase "fast food". +- Vector averaging means that the vector of multiple tokens is **insensitive to + the order** of the words. Two documents expressing the same meaning with + dissimilar wording will return a lower similarity score than two documents + that happen to contain the same words while expressing different meanings. + + + +[![](../../images/sense2vec.jpg)](https://github.com/explosion/sense2vec) + +[`sense2vec`](https://github.com/explosion/sense2vec) is a library developed by +us that builds on top of spaCy and lets you train and query more interesting and +detailed word vectors. It combines noun phrases like "fast food" or "fair game" +and includes the part-of-speech tags and entity labels. The library also +includes annotation recipes for our annotation tool [Prodigy](https://prodi.gy) +that let you evaluate vector models and create terminology lists. For more +details, check out +[our blog post](https://explosion.ai/blog/sense2vec-reloaded). To explore the +semantic similarities across all Reddit comments of 2015 and 2019, see the +[interactive demo](https://explosion.ai/demos/sense2vec). + + diff --git a/website/docs/usage/linguistic-features.md b/website/docs/usage/linguistic-features.md index 10efcf875..3aa0df7b4 100644 --- a/website/docs/usage/linguistic-features.md +++ b/website/docs/usage/linguistic-features.md @@ -1547,23 +1547,6 @@ import Vectors101 from 'usage/101/\_vectors-similarity.md' - - -Computing similarity scores can be helpful in many situations, but it's also -important to maintain **realistic expectations** about what information it can -provide. Words can be related to each over in many ways, so a single -"similarity" score will always be a **mix of different signals**, and vectors -trained on different data can produce very different results that may not be -useful for your purpose. - -Also note that the similarity of `Doc` or `Span` objects defaults to the -**average** of the token vectors. This means it's insensitive to the order of -the words. Two documents expressing the same meaning with dissimilar wording -will return a lower similarity score than two documents that happen to contain -the same words while expressing different meanings. - - - ### Adding word vectors {#adding-vectors} Custom word vectors can be trained using a number of open-source libraries, such diff --git a/website/src/components/link.js b/website/src/components/link.js index 3644479c5..acded7d0d 100644 --- a/website/src/components/link.js +++ b/website/src/components/link.js @@ -6,7 +6,7 @@ import classNames from 'classnames' import Icon from './icon' import classes from '../styles/link.module.sass' -import { isString } from './util' +import { isString, isImage } from './util' const internalRegex = /(http(s?)):\/\/(prodi.gy|spacy.io|irl.spacy.io|explosion.ai|course.spacy.io)/gi @@ -39,7 +39,7 @@ export default function Link({ const dest = to || href const external = forceExternal || /(http(s?)):\/\//gi.test(dest) const icon = getIcon(dest) - const withIcon = !hidden && !hideIcon && !!icon + const withIcon = !hidden && !hideIcon && !!icon && !isImage(children) const sourceWithText = withIcon && isString(children) const linkClassNames = classNames(classes.root, className, { [classes.hidden]: hidden, diff --git a/website/src/components/util.js b/website/src/components/util.js index 844f2c133..a9c6efcf5 100644 --- a/website/src/components/util.js +++ b/website/src/components/util.js @@ -46,6 +46,17 @@ export function isString(obj) { return typeof obj === 'string' || obj instanceof String } +/** + * @param obj - The object to check. + * @returns {boolean} – Whether the object is an image + */ +export function isImage(obj) { + if (!obj || !React.isValidElement(obj)) { + return false + } + return obj.props.name == 'img' || obj.props.className == 'gatsby-resp-image-wrapper' +} + /** * @param obj - The object to check. * @returns {boolean} - Whether the object is empty. From fb51b55eb9634de544175ff6cca7c7e6712a1716 Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Thu, 20 Aug 2020 11:20:43 +0200 Subject: [PATCH 03/10] Add comment [ci skip] --- website/docs/usage/training.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/usage/training.md b/website/docs/usage/training.md index 8951b9396..d4f380c10 100644 --- a/website/docs/usage/training.md +++ b/website/docs/usage/training.md @@ -104,10 +104,10 @@ workflows, from data preprocessing to training and packaging your model. ## Training config {#config} -> #### Migration from spaCy v2.x + Training config files include all **settings and hyperparameters** for training your model. Instead of providing lots of arguments on the command line, you only From 6ad59d59fe5f923ce23cb66d7fb71ca511fd656b Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Thu, 20 Aug 2020 11:20:58 +0200 Subject: [PATCH 04/10] Merge branch 'develop' of https://github.com/explosion/spaCy into develop [ci skip] --- pyproject.toml | 2 +- requirements.txt | 2 +- setup.cfg | 4 ++-- spacy/cli/templates/quickstart_training.jinja | 12 +++++----- spacy/default_config.cfg | 14 +++++------ .../tests/serialize/test_serialize_config.py | 12 +++++----- website/docs/api/architectures.md | 2 +- website/docs/api/corpus.md | 2 +- website/docs/api/data-formats.md | 12 +++++----- website/docs/api/top-level.md | 2 +- website/docs/usage/training.md | 24 ++++++------------- 11 files changed, 39 insertions(+), 49 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1b4972bd5..9a646d0d7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ requires = [ "cymem>=2.0.2,<2.1.0", "preshed>=3.0.2,<3.1.0", "murmurhash>=0.28.0,<1.1.0", - "thinc>=8.0.0a27,<8.0.0a30", + "thinc>=8.0.0a28,<8.0.0a30", "blis>=0.4.0,<0.5.0", "pytokenizations", "smart_open>=2.0.0,<3.0.0" diff --git a/requirements.txt b/requirements.txt index b4901a692..181cb2101 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # Our libraries cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 -thinc>=8.0.0a27,<8.0.0a30 +thinc>=8.0.0a28,<8.0.0a30 blis>=0.4.0,<0.5.0 ml_datasets>=0.1.1 murmurhash>=0.28.0,<1.1.0 diff --git a/setup.cfg b/setup.cfg index a34c34e23..d56eab3a6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -34,13 +34,13 @@ setup_requires = cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 murmurhash>=0.28.0,<1.1.0 - thinc>=8.0.0a27,<8.0.0a30 + thinc>=8.0.0a28,<8.0.0a30 install_requires = # Our libraries murmurhash>=0.28.0,<1.1.0 cymem>=2.0.2,<2.1.0 preshed>=3.0.2,<3.1.0 - thinc>=8.0.0a27,<8.0.0a30 + thinc>=8.0.0a28,<8.0.0a30 blis>=0.4.0,<0.5.0 wasabi>=0.7.1,<1.1.0 srsly>=2.1.0,<3.0.0 diff --git a/spacy/cli/templates/quickstart_training.jinja b/spacy/cli/templates/quickstart_training.jinja index 4f5a2226e..674099abc 100644 --- a/spacy/cli/templates/quickstart_training.jinja +++ b/spacy/cli/templates/quickstart_training.jinja @@ -105,7 +105,7 @@ factory = "tok2vec" [components.tok2vec.model.embed] @architectures = "spacy.MultiHashEmbed.v1" -width = ${components.tok2vec.model.encode:width} +width = ${components.tok2vec.model.encode.width} rows = {{ 2000 if optimize == "efficiency" else 7000 }} also_embed_subwords = {{ true if has_letters else false }} also_use_static_vectors = {{ true if optimize == "accuracy" else false }} @@ -127,7 +127,7 @@ nO = null [components.tagger.model.tok2vec] @architectures = "spacy.Tok2VecListener.v1" -width = ${components.tok2vec.model.encode:width} +width = ${components.tok2vec.model.encode.width} {%- endif %} {% if "parser" in components -%} @@ -144,7 +144,7 @@ nO = null [components.parser.model.tok2vec] @architectures = "spacy.Tok2VecListener.v1" -width = ${components.tok2vec.model.encode:width} +width = ${components.tok2vec.model.encode.width} {%- endif %} {% if "ner" in components %} @@ -161,7 +161,7 @@ nO = null [components.ner.model.tok2vec] @architectures = "spacy.Tok2VecListener.v1" -width = ${components.tok2vec.model.encode:width} +width = ${components.tok2vec.model.encode.width} {% endif %} {% endif %} @@ -194,12 +194,12 @@ initial_rate = 5e-5 [training.train_corpus] @readers = "spacy.Corpus.v1" -path = ${paths:train} +path = ${paths.train} max_length = {{ 500 if hardware == "gpu" else 0 }} [training.dev_corpus] @readers = "spacy.Corpus.v1" -path = ${paths:dev} +path = ${paths.dev} max_length = 0 {% if use_transformer %} diff --git a/spacy/default_config.cfg b/spacy/default_config.cfg index 8aadad668..3eab21888 100644 --- a/spacy/default_config.cfg +++ b/spacy/default_config.cfg @@ -23,12 +23,12 @@ after_pipeline_creation = null # Training hyper-parameters and additional features. [training] -seed = ${system:seed} +seed = ${system.seed} dropout = 0.1 accumulate_gradient = 1 # Extra resources for transfer-learning or pseudo-rehearsal -init_tok2vec = ${paths:init_tok2vec} -raw_text = ${paths:raw} +init_tok2vec = ${paths.init_tok2vec} +raw_text = ${paths.raw} vectors = null # Controls early-stopping. 0 or -1 mean unlimited. patience = 1600 @@ -42,7 +42,7 @@ frozen_components = [] [training.train_corpus] @readers = "spacy.Corpus.v1" -path = ${paths:train} +path = ${paths.train} # Whether to train on sequences with 'gold standard' sentence boundaries # and tokens. If you set this to true, take care to ensure your run-time # data is passed in sentence-by-sentence via some prior preprocessing. @@ -54,7 +54,7 @@ limit = 0 [training.dev_corpus] @readers = "spacy.Corpus.v1" -path = ${paths:dev} +path = ${paths.dev} # Whether to train on sequences with 'gold standard' sentence boundaries # and tokens. If you set this to true, take care to ensure your run-time # data is passed in sentence-by-sentence via some prior preprocessing. @@ -98,8 +98,8 @@ max_length = 500 dropout = 0.2 n_save_every = null batch_size = 3000 -seed = ${system:seed} -use_pytorch_for_gpu_memory = ${system:use_pytorch_for_gpu_memory} +seed = ${system.seed} +use_pytorch_for_gpu_memory = ${system.use_pytorch_for_gpu_memory} tok2vec_model = "components.tok2vec.model" [pretraining.objective] diff --git a/spacy/tests/serialize/test_serialize_config.py b/spacy/tests/serialize/test_serialize_config.py index 1de137e81..f2b496d71 100644 --- a/spacy/tests/serialize/test_serialize_config.py +++ b/spacy/tests/serialize/test_serialize_config.py @@ -20,11 +20,11 @@ dev = "" [training.train_corpus] @readers = "spacy.Corpus.v1" -path = ${paths:train} +path = ${paths.train} [training.dev_corpus] @readers = "spacy.Corpus.v1" -path = ${paths:dev} +path = ${paths.dev} [training.batcher] @batchers = "batch_by_words.v1" @@ -57,7 +57,7 @@ factory = "tagger" [components.tagger.model.tok2vec] @architectures = "spacy.Tok2VecListener.v1" -width = ${components.tok2vec.model:width} +width = ${components.tok2vec.model.width} """ @@ -284,13 +284,13 @@ def test_config_overrides(): def test_config_interpolation(): config = Config().from_str(nlp_config_string, interpolate=False) - assert config["training"]["train_corpus"]["path"] == "${paths:train}" + assert config["training"]["train_corpus"]["path"] == "${paths.train}" interpolated = config.interpolate() assert interpolated["training"]["train_corpus"]["path"] == "" nlp = English.from_config(config) - assert nlp.config["training"]["train_corpus"]["path"] == "${paths:train}" + assert nlp.config["training"]["train_corpus"]["path"] == "${paths.train}" # Ensure that variables are preserved in nlp config - width = "${components.tok2vec.model:width}" + width = "${components.tok2vec.model.width}" assert config["components"]["tagger"]["model"]["tok2vec"]["width"] == width assert nlp.config["components"]["tagger"]["model"]["tok2vec"]["width"] == width interpolated2 = nlp.config.interpolate() diff --git a/website/docs/api/architectures.md b/website/docs/api/architectures.md index 25a44245d..acdf4cb19 100644 --- a/website/docs/api/architectures.md +++ b/website/docs/api/architectures.md @@ -94,7 +94,7 @@ blog post for background. > > [components.tagger.model.tok2vec] > @architectures = "spacy.Tok2VecListener.v1" -> width = ${components.tok2vec.model:width} +> width = ${components.tok2vec.model.width} > ``` A listener is used as a sublayer within a component such as a diff --git a/website/docs/api/corpus.md b/website/docs/api/corpus.md index 8c530ab6d..86cfa9121 100644 --- a/website/docs/api/corpus.md +++ b/website/docs/api/corpus.md @@ -28,7 +28,7 @@ streaming. > > [training.train_corpus] > @readers = "spacy.Corpus.v1" -> path = ${paths:train} +> path = ${paths.train} > gold_preproc = false > max_length = 0 > limit = 0 diff --git a/website/docs/api/data-formats.md b/website/docs/api/data-formats.md index ff106b229..87f3ecbf2 100644 --- a/website/docs/api/data-formats.md +++ b/website/docs/api/data-formats.md @@ -111,7 +111,7 @@ model to copy components from). See the docs on ### paths, system {#config-variables tag="variables"} These sections define variables that can be referenced across the other sections -as variables. For example `${paths:train}` uses the value of `train` defined in +as variables. For example `${paths.train}` uses the value of `train` defined in the block `[paths]`. If your config includes custom registered functions that need paths, you can define them here. All config values can also be [overwritten](/usage/training#config-overrides) on the CLI when you run @@ -131,11 +131,11 @@ process that are used when you run [`spacy train`](/api/cli#train). | Name | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `seed` | The random seed. Defaults to variable `${system:seed}`. ~~int~~ | +| `seed` | The random seed. Defaults to variable `${system.seed}`. ~~int~~ | | `dropout` | The dropout rate. Defaults to `0.1`. ~~float~~ | | `accumulate_gradient` | Whether to divide the batch up into substeps. Defaults to `1`. ~~int~~ | -| `init_tok2vec` | Optional path to pretrained tok2vec weights created with [`spacy pretrain`](/api/cli#pretrain). Defaults to variable `${paths:init_tok2vec}`. ~~Optional[str]~~ | -| `raw_text` | TODO: ... Defaults to variable `${paths:raw}`. ~~Optional[str]~~ | +| `init_tok2vec` | Optional path to pretrained tok2vec weights created with [`spacy pretrain`](/api/cli#pretrain). Defaults to variable `${paths.init_tok2vec}`. ~~Optional[str]~~ | +| `raw_text` | TODO: ... Defaults to variable `${paths.raw}`. ~~Optional[str]~~ | | `vectors` | Model name or path to model containing pretrained word vectors to use, e.g. created with [`init model`](/api/cli#init-model). Defaults to `null`. ~~Optional[str]~~ | | `patience` | How many steps to continue without improvement in evaluation score. Defaults to `1600`. ~~int~~ | | `max_epochs` | Maximum number of epochs to train for. Defaults to `0`. ~~int~~ | @@ -162,8 +162,8 @@ run [`spacy pretrain`](/api/cli#pretrain). | `dropout` | The dropout rate. Defaults to `0.2`. ~~float~~ | | `n_save_every` | Saving frequency. Defaults to `null`. ~~Optional[int]~~ | | `batch_size` | The batch size or batch size [schedule](https://thinc.ai/docs/api-schedules). Defaults to `3000`. ~~Union[int, Sequence[int]]~~ | -| `seed` | The random seed. Defaults to variable `${system:seed}`. ~~int~~ | -| `use_pytorch_for_gpu_memory` | Allocate memory via PyTorch. Defaults to variable `${system:use_pytorch_for_gpu_memory}`. ~~bool~~ | +| `seed` | The random seed. Defaults to variable `${system.seed}`. ~~int~~ | +| `use_pytorch_for_gpu_memory` | Allocate memory via PyTorch. Defaults to variable `${system.use_pytorch_for_gpu_memory}`. ~~bool~~ | | `tok2vec_model` | The model section of the embedding component in the config. Defaults to `"components.tok2vec.model"`. ~~str~~ | | `objective` | The pretraining objective. Defaults to `{"type": "characters", "n_characters": 4}`. ~~Dict[str, Any]~~ | | `optimizer` | The optimizer. Defaults to [`Adam`](https://thinc.ai/docs/api-optimizers#adam). ~~Optimizer~~ | diff --git a/website/docs/api/top-level.md b/website/docs/api/top-level.md index b33d7f022..325a94f5c 100644 --- a/website/docs/api/top-level.md +++ b/website/docs/api/top-level.md @@ -612,7 +612,7 @@ components are created, as well as all training settings and hyperparameters. | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `path` | Path to the model's `config.cfg`. ~~Union[str, Path]~~ | | `overrides` | Optional config overrides to replace in loaded config. Can be provided as nested dict, or as flat dict with keys in dot notation, e.g. `"nlp.pipeline"`. ~~Dict[str, Any]~~ | -| `interpolate` | Whether to interpolate the config and replace variables like `${paths:train}` with their values. Defaults to `False`. ~~bool~~ | +| `interpolate` | Whether to interpolate the config and replace variables like `${paths.train}` with their values. Defaults to `False`. ~~bool~~ | | **RETURNS** | The model's config. ~~Config~~ | ### util.load_meta {#util.load_meta tag="function" new="3"} diff --git a/website/docs/usage/training.md b/website/docs/usage/training.md index d4f380c10..348e42b41 100644 --- a/website/docs/usage/training.md +++ b/website/docs/usage/training.md @@ -157,8 +157,8 @@ sections of a config file are: | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `nlp` | Definition of the `nlp` object, its tokenizer and [processing pipeline](/usage/processing-pipelines) component names. | | `components` | Definitions of the [pipeline components](/usage/processing-pipelines) and their models. | -| `paths` | Paths to data and other assets. Re-used across the config as variables, e.g. `${paths:train}`, and can be [overwritten](#config-overrides) on the CLI. | -| `system` | Settings related to system and hardware. Re-used across the config as variables, e.g. `${system:seed}`, and can be [overwritten](#config-overrides) on the CLI. | +| `paths` | Paths to data and other assets. Re-used across the config as variables, e.g. `${paths.train}`, and can be [overwritten](#config-overrides) on the CLI. | +| `system` | Settings related to system and hardware. Re-used across the config as variables, e.g. `${system.seed}`, and can be [overwritten](#config-overrides) on the CLI. | | `training` | Settings and controls for the training and evaluation process. | | `pretraining` | Optional settings and controls for the [language model pretraining](#pretraining). | @@ -325,19 +325,9 @@ compound = 1.001 Another very useful feature of the config system is that it supports variable interpolation for both **values and sections**. This means that you only need to define a setting once and can reference it across your config using the -`${section:value}` or `${section.block}` syntax. In this example, the value of -`seed` is reused within the `[training]` block, and the whole block of -`[training.optimizer]` is reused in `[pretraining]` and will become -`pretraining.optimizer`. - -> #### Note on syntax -> -> There are two different ways to format your variables, depending on whether -> you want to reference a single value or a block. Values are specified after a -> `:`, while blocks are specified with a `.`: -> -> 1. `${section:value}`, `${section.subsection:value}` -> 2. `${section.block}`, `${section.subsection.block}` +`${section.value}` syntax. In this example, the value of `seed` is reused within +the `[training]` block, and the whole block of `[training.optimizer]` is reused +in `[pretraining]` and will become `pretraining.optimizer`. ```ini ### config.cfg (excerpt) {highlight="5,18"} @@ -345,7 +335,7 @@ define a setting once and can reference it across your config using the seed = 0 [training] -seed = ${system:seed} +seed = ${system.seed} [training.optimizer] @optimizers = "Adam.v1" @@ -369,7 +359,7 @@ to a string. [paths] version = 5 root = "/Users/you/data" -train = "${paths:root}/train_${paths:version}.spacy" +train = "${paths.root}/train_${paths.version}.spacy" # Result: /Users/you/data/train_5.spacy ``` From 04e4d592357c75537717433b7ad785c4dabfd17a Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Thu, 20 Aug 2020 16:17:25 +0200 Subject: [PATCH 05/10] Update docs [ci skip] --- .gitignore | 2 -- website/docs/api/architectures.md | 6 ++---- website/docs/usage/training.md | 12 ++++++++---- website/src/widgets/quickstart-training-generator.js | 12 ------------ 4 files changed, 10 insertions(+), 22 deletions(-) delete mode 100644 website/src/widgets/quickstart-training-generator.js diff --git a/.gitignore b/.gitignore index 136a8f26d..4dbcd67f7 100644 --- a/.gitignore +++ b/.gitignore @@ -18,8 +18,6 @@ website/.npm website/logs *.log npm-debug.log* -website/www/ -website/_deploy.sh quickstart-training-generator.js # Cython / C extensions diff --git a/website/docs/api/architectures.md b/website/docs/api/architectures.md index acdf4cb19..835815496 100644 --- a/website/docs/api/architectures.md +++ b/website/docs/api/architectures.md @@ -399,7 +399,7 @@ one component. > subword_features = true > ``` -Build a transition-based parser model. Can apply to NER or dependency-parsing. +Build a transition-based parser model. Can apply to NER or dependency parsing. Transition-based parsing is an approach to structured prediction where the task of predicting the structure is mapped to a series of state transitions. You might find [this tutorial](https://explosion.ai/blog/parsing-english-in-python) @@ -416,8 +416,6 @@ consists of either two or three subnetworks: state representation. If not present, the output from the lower model is used as action scores directly. - - | Name | Description | | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `tok2vec` | Subnetwork to map tokens into vector representations. ~~Model[List[Doc], List[Floats2d]]~~ | @@ -426,7 +424,7 @@ consists of either two or three subnetworks: | `maxout_pieces` | How many pieces to use in the state prediction layer. Recommended values are `1`, `2` or `3`. If `1`, the maxout non-linearity is replaced with a [`Relu`](https://thinc.ai/docs/api-layers#relu) non-linearity if `use_upper` is `True`, and no non-linearity if `False`. ~~int~~ | | `use_upper` | Whether to use an additional hidden layer after the state vector in order to predict the action scores. It is recommended to set this to `False` for large pretrained models such as transformers, and `True` for smaller networks. The upper layer is computed on CPU, which becomes a bottleneck on larger GPU-based models, where it's also less necessary. ~~bool~~ | | `nO` | The number of actions the model will predict between. Usually inferred from data at the beginning of training, or loaded from disk. ~~int~~ | -| **CREATES** | The model using the architecture. ~~Model~~ | +| **CREATES** | The model using the architecture. ~~Model[List[Docs], List[List[Floats2d]]]~~ | ### spacy.BILUOTagger.v1 {#BILUOTagger source="spacy/ml/models/simple_ner.py"} diff --git a/website/docs/usage/training.md b/website/docs/usage/training.md index 348e42b41..892fb7f48 100644 --- a/website/docs/usage/training.md +++ b/website/docs/usage/training.md @@ -404,11 +404,15 @@ recipe once the dish has already been prepared. You have to make a new one. spaCy includes a variety of built-in [architectures](/api/architectures) for different tasks. For example: - + -| Architecture | Description | -| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [HashEmbedCNN](/api/architectures#HashEmbedCNN) | Build spaCy’s “standard” embedding layer, which uses hash embedding with subword features and a CNN with layer-normalized maxout. ~~Model[List[Doc], List[Floats2d]]~~ | +| Architecture | Description | +| ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [HashEmbedCNN](/api/architectures#HashEmbedCNN) | Build spaCy’s "standard" embedding layer, which uses hash embedding with subword features and a CNN with layer-normalized maxout. ~~Model[List[Doc], List[Floats2d]]~~ | +| [TransitionBasedParser](/api/architectures#TransitionBasedParser) | Build a [transition-based parser](https://explosion.ai/blog/parsing-english-in-python) model used in the default [`EntityRecognizer`](/api/entityrecognizer) and [`DependencyParser`](/api/dependencyparser). ~~Model[List[Docs], List[List[Floats2d]]]~~ | +| [TextCatEnsemble](/api/architectures#TextCatEnsemble) | Stacked ensemble of a bag-of-words model and a neural network model with an internal CNN embedding layer. Used in the default [`TextCategorizer`](/api/textcategorizer). ~~Model~~ | + + ### Metrics, training output and weighted scores {#metrics} diff --git a/website/src/widgets/quickstart-training-generator.js b/website/src/widgets/quickstart-training-generator.js deleted file mode 100644 index b5389d4d7..000000000 --- a/website/src/widgets/quickstart-training-generator.js +++ /dev/null @@ -1,12 +0,0 @@ -// This file was auto-generated by jinja_to_js.py based on quickstart_training.jinja -import jinjaToJS from "jinja-to-js";export default function templateQuickstartTraining(ctx) { - var __result = ""; - var __tmp; - var __runtime = jinjaToJS.runtime; - var __filters = jinjaToJS.filters; - var __globals = jinjaToJS.globals; - var context = jinjaToJS.createContext(ctx); - var use_transformer = context.transformer_data && context.hardware!=="cpu";var transformer = (use_transformer ? context.transformer_data[context.optimize] : {});__result += "[paths]\ntrain = \"\"\ndev = \"\"\n\n[system]\nuse_pytorch_for_gpu_memory = ";__result += "" + __runtime.escape((__tmp = ((use_transformer ? "true" : "false"))) == null ? "" : __tmp);__result += "\n\n[nlp]\nlang = \"";__result += "" + __runtime.escape((__tmp = (context.lang)) == null ? "" : __tmp);__result += "\"";var full_pipeline = [(use_transformer ? "transformer" : "tok2vec")].concat(context.components);__result += "\npipeline = ";__result += "" + ((__tmp = (JSON.stringify(full_pipeline).split("'").join("\""))) == null ? "" : __tmp);__result += "\ntokenizer = {\"@tokenizers\": \"spacy.Tokenizer.v1\"}\n\n[components]\n\n";if(__runtime.boolean(use_transformer)){__result += "[components.transformer]\nfactory = \"transformer\"\n\n[components.transformer.model]\n@architectures = \"spacy-transformers.TransformerModel.v1\"\nname = \"";__result += "" + __runtime.escape((__tmp = (transformer["name"])) == null ? "" : __tmp);__result += "\"\ntokenizer_config = {\"use_fast\": true}\n\n[components.transformer.model.get_spans]\n@span_getters = \"strided_spans.v1\"\nwindow = 128\nstride = 96\n\n";if(context.components.includes("tagger")){__result += "\n[components.tagger]\nfactory = \"tagger\"\n\n[components.tagger.model]\n@architectures = \"spacy.Tagger.v1\"\nnO = null\n\n[components.tagger.model.tok2vec]\n@architectures = \"spacy-transformers.Tok2VecListener.v1\"\ngrad_factor = 1.0\n\n[components.tagger.model.tok2vec.pooling]\n@layers = \"reduce_mean.v1\"";}__result += "\n\n";if(context.components.includes("parser")){__result += "[components.parser]\nfactory = \"parser\"\n\n[components.parser.model]\n@architectures = \"spacy.TransitionBasedParser.v1\"\nnr_feature_tokens = 8\nhidden_width = 128\nmaxout_pieces = 3\nuse_upper = false\nnO = null\n\n[components.parser.model.tok2vec]\n@architectures = \"spacy-transformers.Tok2VecListener.v1\"\ngrad_factor = 1.0\n\n[components.parser.model.tok2vec.pooling]\n@layers = \"reduce_mean.v1\"";}__result += "\n\n";if(context.components.includes("ner")){__result += "[components.ner]\nfactory = \"ner\"\n\n[components.ner.model]\n@architectures = \"spacy.TransitionBasedParser.v1\"\nnr_feature_tokens = 3\nhidden_width = 64\nmaxout_pieces = 2\nuse_upper = false\nnO = null\n\n[components.ner.model.tok2vec]\n@architectures = \"spacy-transformers.Tok2VecListener.v1\"\ngrad_factor = 1.0\n\n[components.ner.model.tok2vec.pooling]\n@layers = \"reduce_mean.v1\"\n";}__result += "\n";} else {if(context.hardware==="gpu"){__result += "# There are no recommended transformer weights available for language '";__result += "" + __runtime.escape((__tmp = (context.lang)) == null ? "" : __tmp);__result += "'\n# yet, so the pipeline described here is not transformer-based.";}__result += "\n\n[components.tok2vec]\nfactory = \"tok2vec\"\n\n[components.tok2vec.model]\n@architectures = \"spacy.Tok2Vec.v1\"\n\n[components.tok2vec.model.embed]\n@architectures = \"spacy.MultiHashEmbed.v1\"\nwidth = ${components.tok2vec.model.encode:width}\nrows = ";__result += "" + __runtime.escape((__tmp = ((context.optimize==="efficiency" ? 2000 : 7000))) == null ? "" : __tmp);__result += "\nalso_embed_subwords = ";__result += "" + __runtime.escape((__tmp = ((context.has_letters ? true : false))) == null ? "" : __tmp);__result += "\nalso_use_static_vectors = ";__result += "" + __runtime.escape((__tmp = ((context.optimize==="accuracy" ? true : false))) == null ? "" : __tmp);__result += "\n\n[components.tok2vec.model.encode]\n@architectures = \"spacy.MaxoutWindowEncoder.v1\"\nwidth = ";__result += "" + __runtime.escape((__tmp = ((context.optimize==="efficiency" ? 96 : 256))) == null ? "" : __tmp);__result += "\ndepth = ";__result += "" + __runtime.escape((__tmp = ((context.optimize==="efficiency" ? 4 : 8))) == null ? "" : __tmp);__result += "\nwindow_size = 1\nmaxout_pieces = 3\n\n";if(context.components.includes("tagger")){__result += "\n[components.tagger]\nfactory = \"tagger\"\n\n[components.tagger.model]\n@architectures = \"spacy.Tagger.v1\"\nnO = null\n\n[components.tagger.model.tok2vec]\n@architectures = \"spacy.Tok2VecListener.v1\"\nwidth = ${components.tok2vec.model.encode:width}";}__result += "\n\n";if(context.components.includes("parser")){__result += "[components.parser]\nfactory = \"parser\"\n\n[components.parser.model]\n@architectures = \"spacy.TransitionBasedParser.v1\"\nnr_feature_tokens = 8\nhidden_width = 128\nmaxout_pieces = 3\nuse_upper = true\nnO = null\n\n[components.parser.model.tok2vec]\n@architectures = \"spacy.Tok2VecListener.v1\"\nwidth = ${components.tok2vec.model.encode:width}";}__result += "\n\n";if(context.components.includes("ner")){__result += "\n[components.ner]\nfactory = \"ner\"\n\n[components.ner.model]\n@architectures = \"spacy.TransitionBasedParser.v1\"\nnr_feature_tokens = 6\nhidden_width = 64\nmaxout_pieces = 2\nuse_upper = true\nnO = null\n\n[components.ner.model.tok2vec]\n@architectures = \"spacy.Tok2VecListener.v1\"\nwidth = ${components.tok2vec.model.encode:width}\n";}__result += "\n";}__result += "\n\n";__runtime.each(context.components,function(pipe){var __$0 = context.pipe;context.pipe = pipe;__result += "\n";if(!["tagger","parser","ner"].includes(pipe)){__result += "\n";__result += "\n[components.";__result += "" + __runtime.escape((__tmp = (pipe)) == null ? "" : __tmp);__result += "]\nfactory = \"";__result += "" + __runtime.escape((__tmp = (pipe)) == null ? "" : __tmp);__result += "\"\n";}__result += "\n";context.pipe = __$0;});__result += "\n\n[training]\n";if(__runtime.boolean(use_transformer) || context.optimize==="efficiency" || !__runtime.boolean(context.word_vectors)){__result += "vectors = null\n";} else {__result += "vectors = \"";__result += "" + __runtime.escape((__tmp = (context.word_vectors)) == null ? "" : __tmp);__result += "\"\n";}if(__runtime.boolean(use_transformer)){__result += "accumulate_gradient = ";__result += "" + __runtime.escape((__tmp = (transformer["size_factor"])) == null ? "" : __tmp);__result += "\n";}__result += "\n\n[training.optimizer]\n@optimizers = \"Adam.v1\"\n\n[training.optimizer.learn_rate]\n@schedules = \"warmup_linear.v1\"\nwarmup_steps = 250\ntotal_steps = 20000\ninitial_rate = 5e-5\n\n[training.train_corpus]\n@readers = \"spacy.Corpus.v1\"\npath = ${paths:train}\nmax_length = ";__result += "" + __runtime.escape((__tmp = ((context.hardware==="gpu" ? 500 : 0))) == null ? "" : __tmp);__result += "\n\n[training.dev_corpus]\n@readers = \"spacy.Corpus.v1\"\npath = ${paths:dev}\nmax_length = 0\n\n";if(__runtime.boolean(use_transformer)){__result += "\n[training.batcher]\n@batchers = \"batch_by_padded.v1\"\ndiscard_oversize = true\nsize = 2000\nbuffer = 256";} else {__result += "\n[training.batcher]\n@batchers = \"batch_by_words.v1\"\ndiscard_oversize = false\ntolerance = 0.2\n\n[training.batcher.size]\n@schedules = \"compounding.v1\"\nstart = 100\nstop = 1000\ncompound = 1.001\n";}__result += "\n\n[training.score_weights]";if(context.components.includes("tagger")){__result += "\ntag_acc = ";__result += "" + __runtime.escape((__tmp = (Math.round((1.0 / __filters.size(context.components)+ Number.EPSILON) * 10**2) / 10**2)) == null ? "" : __tmp);}if(context.components.includes("parser")){__result += "\ndep_uas = 0.0\ndep_las = ";__result += "" + __runtime.escape((__tmp = (Math.round((1.0 / __filters.size(context.components)+ Number.EPSILON) * 10**2) / 10**2)) == null ? "" : __tmp);__result += "\nsents_f = 0.0";}if(context.components.includes("ner")){__result += "\nents_f = ";__result += "" + __runtime.escape((__tmp = (Math.round((1.0 / __filters.size(context.components)+ Number.EPSILON) * 10**2) / 10**2)) == null ? "" : __tmp);__result += "\nents_p = 0.0\nents_r = 0.0";} - return __result; -} -export const DATA = {"en":{"word_vectors":"en_vectors_web_lg","transformer":{"efficiency":{"name":"roberta-base","size_factor":3},"accuracy":{"name":"roberta-base","size_factor":3}}},"de":{"word_vectors":null,"transformer":{"efficiency":{"name":"bert-base-german-cased","size_factor":3},"accuracy":{"name":"bert-base-german-cased","size_factor":3}}},"fr":{"word_vectors":null,"transformer":{"efficiency":{"name":"camembert-base","size_factor":3},"accuracy":{"name":"camembert-base","size_factor":3}}},"es":{"word_vectors":null,"transformer":{"efficiency":{"name":"mrm8488/RuPERTa-base","size_factor":3},"accuracy":{"name":"mrm8488/RuPERTa-base","size_factor":3}}},"sv":{"word_vectors":null,"transformer":{"efficiency":{"name":"KB/bert-base-swedish-cased","size_factor":3},"accuracy":{"name":"KB/bert-base-swedish-cased","size_factor":3}}},"fi":{"word_vectors":null,"transformer":{"efficiency":{"name":"TurkuNLP/bert-base-finnish-cased-v1","size_factor":3},"accuracy":{"name":"TurkuNLP/bert-base-finnish-cased-v1","size_factor":3}}},"el":{"word_vectors":null,"transformer":{"efficiency":{"name":"nlpaueb/bert-base-greek-uncased-v1","size_factor":3},"accuracy":{"name":"nlpaueb/bert-base-greek-uncased-v1","size_factor":3}}},"tr":{"word_vectors":null,"transformer":{"efficiency":{"name":"dbmdz/bert-base-turkish-cased","size_factor":3},"accuracy":{"name":"dbmdz/bert-base-turkish-cased","size_factor":3}}},"zh":{"word_vectors":null,"transformer":{"efficiency":{"name":"bert-base-chinese","size_factor":3},"accuracy":{"name":"bert-base-chinese","size_factor":3}},"has_letters":false},"ar":{"word_vectors":null,"transformer":{"efficiency":{"name":"asafaya/bert-base-arabic","size_factor":3},"accuracy":{"name":"asafaya/bert-base-arabic","size_factor":3}}},"pl":{"word_vectors":null,"transformer":{"efficiency":{"name":"dkleczek/bert-base-polish-cased-v1","size_factor":3},"accuracy":{"name":"dkleczek/bert-base-polish-cased-v1","size_factor":3}}}} \ No newline at end of file From c356e6290872824c669c1dee22e0f068d442b46a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 21 Aug 2020 00:10:21 +0200 Subject: [PATCH 06/10] Minor adjustments to quickstart template --- spacy/cli/templates/quickstart_training.jinja | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/cli/templates/quickstart_training.jinja b/spacy/cli/templates/quickstart_training.jinja index 674099abc..0071f1b1a 100644 --- a/spacy/cli/templates/quickstart_training.jinja +++ b/spacy/cli/templates/quickstart_training.jinja @@ -107,8 +107,8 @@ factory = "tok2vec" @architectures = "spacy.MultiHashEmbed.v1" width = ${components.tok2vec.model.encode.width} rows = {{ 2000 if optimize == "efficiency" else 7000 }} -also_embed_subwords = {{ true if has_letters else false }} -also_use_static_vectors = {{ true if optimize == "accuracy" else false }} +also_embed_subwords = {{ "true" if has_letters else "false" }} +also_use_static_vectors = {{ "true" if optimize == "accuracy" else "false" }} [components.tok2vec.model.encode] @architectures = "spacy.MaxoutWindowEncoder.v1" @@ -195,7 +195,7 @@ initial_rate = 5e-5 [training.train_corpus] @readers = "spacy.Corpus.v1" path = ${paths.train} -max_length = {{ 500 if hardware == "gpu" else 0 }} +max_length = {{ 500 if hardware == "gpu" else 2000 }} [training.dev_corpus] @readers = "spacy.Corpus.v1" From e60442d83a0129762959bca92119d79818f760b4 Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Fri, 21 Aug 2020 11:51:31 +0200 Subject: [PATCH 07/10] Adjust label casing in displaCy NER visualizer (resolves #4866) - Accept any case for label names in ents and colors option, even if actual predicted label uses different casing - Don't text-transform: uppercase visually, if it's important to users that the label is represented as-is in the UI --- spacy/displacy/render.py | 4 +++- spacy/displacy/templates.py | 4 ++-- spacy/tests/test_displacy.py | 16 +++++++++++++++- website/docs/api/top-level.md | 2 +- website/docs/usage/visualizers.md | 8 ++++---- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/spacy/displacy/render.py b/spacy/displacy/render.py index 69f6df8f0..07550f9aa 100644 --- a/spacy/displacy/render.py +++ b/spacy/displacy/render.py @@ -252,8 +252,10 @@ class EntityRenderer: colors.update(user_color) colors.update(options.get("colors", {})) self.default_color = DEFAULT_ENTITY_COLOR - self.colors = colors + self.colors = {label.upper(): color for label, color in colors.items()} self.ents = options.get("ents", None) + if self.ents is not None: + self.ents = [ent.upper() for ent in self.ents] self.direction = DEFAULT_DIR self.lang = DEFAULT_LANG template = options.get("template") diff --git a/spacy/displacy/templates.py b/spacy/displacy/templates.py index ff99000f4..b9cbf717b 100644 --- a/spacy/displacy/templates.py +++ b/spacy/displacy/templates.py @@ -51,14 +51,14 @@ TPL_ENTS = """ TPL_ENT = """ {text} - {label} + {label} """ TPL_ENT_RTL = """ {text} - {label} + {label} """ diff --git a/spacy/tests/test_displacy.py b/spacy/tests/test_displacy.py index adac0f7c3..1fa0eeaa1 100644 --- a/spacy/tests/test_displacy.py +++ b/spacy/tests/test_displacy.py @@ -1,6 +1,6 @@ import pytest from spacy import displacy -from spacy.displacy.render import DependencyRenderer +from spacy.displacy.render import DependencyRenderer, EntityRenderer from spacy.tokens import Span from spacy.lang.fa import Persian @@ -97,3 +97,17 @@ def test_displacy_render_wrapper(en_vocab): assert html.endswith("/div>TEST") # Restore displacy.set_render_wrapper(lambda html: html) + + +def test_displacy_options_case(): + ents = ["foo", "BAR"] + colors = {"FOO": "red", "bar": "green"} + renderer = EntityRenderer({"ents": ents, "colors": colors}) + text = "abcd" + labels = ["foo", "bar", "FOO", "BAR"] + spans = [{"start": i, "end": i + 1, "label": labels[i]} for i in range(len(text))] + result = renderer.render_ents("abcde", spans, None).split("\n\n") + assert "red" in result[0] and "foo" in result[0] + assert "green" in result[1] and "bar" in result[1] + assert "red" in result[2] and "FOO" in result[2] + assert "green" in result[3] and "BAR" in result[3] diff --git a/website/docs/api/top-level.md b/website/docs/api/top-level.md index 61fca6ec5..89c53cce3 100644 --- a/website/docs/api/top-level.md +++ b/website/docs/api/top-level.md @@ -257,7 +257,7 @@ If a setting is not present in the options, the default value will be used. | Name | Description | | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ents` | Entity types to highlight or `None` for all types (default). ~~Optional[List[str]]~~ | -| `colors` | Color overrides. Entity types in uppercase should be mapped to color names or values. ~~Dict[str, str]~~ | +| `colors` | Color overrides. Entity types should be mapped to color names or values. ~~Dict[str, str]~~ | | `template` 2.2 | Optional template to overwrite the HTML used to render entity spans. Should be a format string and can use `{bg}`, `{text}` and `{label}`. See [`templates.py`](https://github.com/explosion/spaCy/blob/master/spacy/displacy/templates.py) for examples. ~~Optional[str]~~ | By default, displaCy comes with colors for all entity types used by diff --git a/website/docs/usage/visualizers.md b/website/docs/usage/visualizers.md index f33340063..4ba0112b6 100644 --- a/website/docs/usage/visualizers.md +++ b/website/docs/usage/visualizers.md @@ -121,10 +121,10 @@ import DisplacyEntHtml from 'images/displacy-ent2.html' The entity visualizer lets you customize the following `options`: -| Argument | Description | -| -------- | -------------------------------------------------------------------------------------------------------------------------- | -| `ents` | Entity types to highlight (`None` for all types). Defaults to `None`. ~~Optional[List[str]]~~ | `None` | -| `colors` | Color overrides. Entity types in uppercase should be mapped to color names or values. Defaults to `{}`. ~~Dict[str, str]~~ | +| Argument | Description | +| -------- | ------------------------------------------------------------------------------------------------------------- | +| `ents` | Entity types to highlight (`None` for all types). Defaults to `None`. ~~Optional[List[str]]~~ | `None` | +| `colors` | Color overrides. Entity types should be mapped to color names or values. Defaults to `{}`. ~~Dict[str, str]~~ | If you specify a list of `ents`, only those entity types will be rendered – for example, you can choose to display `PERSON` entities. Internally, the visualizer From 79af7dcd6dfbd5c73c3a667f236c440e85f132fc Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Fri, 21 Aug 2020 12:06:19 +0200 Subject: [PATCH 08/10] Small wording adjustments [ci skip] --- spacy/cli/init_config.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/spacy/cli/init_config.py b/spacy/cli/init_config.py index 79c4acd11..273838906 100644 --- a/spacy/cli/init_config.py +++ b/spacy/cli/init_config.py @@ -39,7 +39,7 @@ class RecommendationSchema(BaseModel): @init_cli.command("config") def init_config_cli( # fmt: off - output_file: Path = Arg(..., help="File to save config.cfg to (or - for stdout, disabling logging)", allow_dash=True), + output_file: Path = Arg(..., help="File to save config.cfg to or - for stdout (will only output config and no additional logging info)", allow_dash=True), lang: Optional[str] = Opt("en", "--lang", "-l", help="Two-letter code of the language to use"), pipeline: Optional[str] = Opt("tagger,parser,ner", "--pipeline", "-p", help="Comma-separated names of trainable pipeline components to include in the model (without 'tok2vec' or 'transformer')"), optimize: Optimizations = Opt(Optimizations.efficiency.value, "--optimize", "-o", help="Whether to optimize for efficiency (faster inference, smaller model, lower memory consumption) or higher accuracy (potentially larger and slower model). This will impact the choice of architecture, pretrained weights and related hyperparameters."), @@ -128,8 +128,13 @@ def init_config( "word_vectors": reco["word_vectors"], "has_letters": has_letters, } - if variables["transformer_data"] and not cpu: - variables["transformer_data"] = prefer_spacy_transformers(msg) + if variables["transformer_data"] and not has_spacy_transformers(): + msg.warn( + "To generate a more effective transformer-based config (GPU-only), " + "install the spacy-transformers package and re-run this command. " + "The config generated now does not use transformers." + ) + variables["transformer_data"] = None base_template = template.render(variables).strip() # Giving up on getting the newlines right in jinja for now base_template = re.sub(r"\n\n\n+", "\n\n", base_template) @@ -167,13 +172,10 @@ def save_config(config: Config, output_file: Path, is_stdout: bool = False) -> N print(f"{COMMAND} train {output_file.parts[-1]} {' '.join(variables)}") -def prefer_spacy_transformers(msg: Printer) -> bool: +def has_spacy_transformers() -> bool: try: import spacy_transformers # noqa: F401 + + return True except ImportError: - msg.info( - "Recommend to install 'spacy-transformers' to create a more efficient " - "transformer-based pipeline." - ) return False - return True From 52bd3a8b48d354de57c1eb59d78abdb32c3e3a30 Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Fri, 21 Aug 2020 13:22:59 +0200 Subject: [PATCH 09/10] Update docs [ci skip] --- website/docs/api/morphology.md | 2 +- website/docs/api/token.md | 4 +- website/docs/api/top-level.md | 17 ++ website/docs/usage/embeddings-transformers.md | 4 + website/docs/usage/v3.md | 182 ++++++++++++++++-- 5 files changed, 190 insertions(+), 19 deletions(-) diff --git a/website/docs/api/morphology.md b/website/docs/api/morphology.md index 1b2e159d0..5d5324061 100644 --- a/website/docs/api/morphology.md +++ b/website/docs/api/morphology.md @@ -7,7 +7,7 @@ source: spacy/morphology.pyx Store the possible morphological analyses for a language, and index them by hash. To save space on each token, tokens only know the hash of their morphological analysis, so queries of morphological attributes are delegated to -this class. See [`MorphAnalysis`](/api/morphology#morphansalysis) for the +this class. See [`MorphAnalysis`](/api/morphology#morphanalysis) for the container storing a single morphological analysis. ## Morphology.\_\_init\_\_ {#init tag="method"} diff --git a/website/docs/api/token.md b/website/docs/api/token.md index 4a8e6eba7..0860797aa 100644 --- a/website/docs/api/token.md +++ b/website/docs/api/token.md @@ -450,8 +450,8 @@ The L2 norm of the token's vector representation. | `pos_` | Coarse-grained part-of-speech from the [Universal POS tag set](https://universaldependencies.org/docs/u/pos/). ~~str~~ | | `tag` | Fine-grained part-of-speech. ~~int~~ | | `tag_` | Fine-grained part-of-speech. ~~str~~ | -| `morph` | Morphological analysis. ~~MorphAnalysis~~ | -| `morph_` | Morphological analysis in the Universal Dependencies [FEATS]https://universaldependencies.org/format.html#morphological-annotation format. ~~str~~ | +| `morph` 3 | Morphological analysis. ~~MorphAnalysis~~ | +| `morph_` 3 | Morphological analysis in the Universal Dependencies [FEATS]https://universaldependencies.org/format.html#morphological-annotation format. ~~str~~ | | `dep` | Syntactic dependency relation. ~~int~~ | | `dep_` | Syntactic dependency relation. ~~str~~ | | `lang` | Language of the parent document's vocabulary. ~~int~~ | diff --git a/website/docs/api/top-level.md b/website/docs/api/top-level.md index 89c53cce3..9c65b2982 100644 --- a/website/docs/api/top-level.md +++ b/website/docs/api/top-level.md @@ -632,6 +632,23 @@ validate its contents. | `path` | Path to the model's `meta.json`. ~~Union[str, Path]~~ | | **RETURNS** | The model's meta data. ~~Dict[str, Any]~~ | +### util.get_installed_models {#util.get_installed_models tag="function" new="3"} + +List all model packages installed in the current environment. This will include +any spaCy model that was packaged with [`spacy package`](/api/cli#package). +Under the hood, model packages expose a Python entry point that spaCy can check, +without having to load the model. + +> #### Example +> +> ```python +> model_names = util.get_installed_models() +> ``` + +| Name | Description | +| ----------- | ---------------------------------------------------------------------------------- | +| **RETURNS** | The string names of the models installed in the current environment. ~~List[str]~~ | + ### util.is_package {#util.is_package tag="function"} Check if string maps to a package installed via pip. Mainly used to validate diff --git a/website/docs/usage/embeddings-transformers.md b/website/docs/usage/embeddings-transformers.md index c2727f5b1..70562cf7e 100644 --- a/website/docs/usage/embeddings-transformers.md +++ b/website/docs/usage/embeddings-transformers.md @@ -11,6 +11,10 @@ next: /usage/training +If you're looking for details on using word vectors and semantic similarity, +check out the +[linguistic features docs](/usage/linguistic-features#vectors-similarity). + The key difference between [word vectors](#word-vectors) and contextual language diff --git a/website/docs/usage/v3.md b/website/docs/usage/v3.md index 837818a83..3111bf38e 100644 --- a/website/docs/usage/v3.md +++ b/website/docs/usage/v3.md @@ -10,6 +10,32 @@ menu: ## Summary {#summary} + + +

+ +
+ + + +- [Summary](#summary) +- [New features](#features) +- [Training & config system](#features-training) +- [Transformer-based pipelines](#features-transformers) +- [Custom models](#features-custom-models) +- [End-to-end project workflows](#features-projects) +- [New built-in components](#features-pipeline-components) +- [New custom component API](#features-components) +- [Python type hints](#features-types) +- [New methods & attributes](#new-methods) +- [New & updated documentation](#new-docs) +- [Backwards incompatibilities](#incompat) +- [Migrating from spaCy v2.x](#migrating) + + + + + ## New Features {#features} ### New training workflow and config system {#features-training} @@ -28,6 +54,8 @@ menu: ### Transformer-based pipelines {#features-transformers} +![Pipeline components listening to shared embedding component](../images/tok2vec-listener.svg) + - **Usage:** [Embeddings & Transformers](/usage/embeddings-transformers), @@ -46,8 +74,53 @@ menu: ### Custom models using any framework {#features-custom-models} + + + + +- **Thinc: ** + [Wrapping PyTorch, TensorFlow & MXNet](https://thinc.ai/docs/usage-frameworks) +- **API:** [Model architectures](/api/architectures), [`Pipe`](/api/pipe) + + + ### Manage end-to-end workflows with projects {#features-projects} + + +> #### Example +> +> ```cli +> # Clone a project template +> $ python -m spacy project clone example +> $ cd example +> # Download data assets +> $ python -m spacy project assets +> # Run a workflow +> $ python -m spacy project run train +> ``` + +spaCy projects let you manage and share **end-to-end spaCy workflows** for +different **use cases and domains**, and orchestrate training, packaging and +serving your custom models. You can start off by cloning a pre-defined project +template, adjust it to fit your needs, load in your data, train a model, export +it as a Python package and share the project templates with your team. spaCy +projects also make it easy to **integrate with other tools** in the data science +and machine learning ecosystem, including [DVC](/usage/projects#dvc) for data +version control, [Prodigy](/usage/projects#prodigy) for creating labelled data, +[Streamlit](/usage/projects#streamlit) for building interactive apps, +[FastAPI](/usage/projects#fastapi) for serving models in production, +[Ray](/usage/projects#ray) for parallel training, +[Weights & Biases](/usage/projects#wandb) for experiment tracking, and more! + + + - **Usage:** [spaCy projects](/usage/projects), @@ -59,6 +132,16 @@ menu: ### New built-in pipeline components {#features-pipeline-components} +spaCy v3.0 includes several new trainable and rule-based components that you can +add to your pipeline and customize for your use case: + +> #### Example +> +> ```python +> nlp = spacy.blank("en") +> nlp.add_pipe("lemmatizer") +> ``` + | Name | Description | | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [`SentenceRecognizer`](/api/sentencerecognizer) | Trainable component for sentence segmentation. | @@ -78,15 +161,37 @@ menu: ### New and improved pipeline component APIs {#features-components} -- `Language.factory`, `Language.component` -- `Language.analyze_pipes` -- Adding components from other models +> #### Example +> +> ```python +> @Language.component("my_component") +> def my_component(doc): +> return doc +> +> nlp.add_pipe("my_component") +> nlp.add_pipe("ner", source=other_nlp) +> nlp.analyze_pipes(pretty=True) +> ``` + +Defining, configuring, reusing, training and analyzing pipeline components is +now easier and more convenient. The `@Language.component` and +`@Language.factory` decorators let you register your component, define its +default configuration and meta data, like the attribute values it assigns and +requires. Any custom component can be included during training, and sourcing +components from existing pretrained models lets you **mix and match custom +pipelines**. The `nlp.analyze_pipes` method outputs structured information about +the current pipeline and its components, including the attributes they assign, +the scores they compute during training and whether any required attributes +aren't set. - **Usage:** [Custom components](/usage/processing-pipelines#custom_components), - [Defining components during training](/usage/training#config-components) -- **API:** [`Language`](/api/language) + [Defining components for training](/usage/training#config-components) +- **API:** [`@Language.component`](/api/language#component), + [`@Language.factory`](/api/language#factory), + [`Language.add_pipe`](/api/language#add_pipe), + [`Language.analyze_pipes`](/api/language#analyze_pipes) - **Implementation:** [`spacy/language.py`](https://github.com/explosion/spaCy/tree/develop/spacy/language.py) @@ -136,13 +241,14 @@ in your config and see validation errors if the argument values don't match. -### New methods, attributes and commands +### New methods, attributes and commands {#new-methods} The following methods, attributes and commands are new in spaCy v3.0. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | [`Token.lex`](/api/token#attributes) | Access a token's [`Lexeme`](/api/lexeme). | +| [`Token.morph`](/api/token#attributes) [`Token.morph_`](/api/token#attributes) | Access a token's morphological analysis. | | [`Language.select_pipes`](/api/language#select_pipes) | Contextmanager for enabling or disabling specific pipeline components for a block. | | [`Language.analyze_pipes`](/api/language#analyze_pipes) | [Analyze](/usage/processing-pipelines#analysis) components and their interdependencies. | | [`Language.resume_training`](/api/language#resume_training) | Experimental: continue training a pretrained model and initialize "rehearsal" for components that implement a `rehearse` method to prevent catastrophic forgetting. | @@ -153,9 +259,52 @@ The following methods, attributes and commands are new in spaCy v3.0. | [`Pipe.score`](/api/pipe#score) | Method on trainable pipeline components that returns a dictionary of evaluation scores. | | [`registry`](/api/top-level#registry) | Function registry to map functions to string names that can be referenced in [configs](/usage/training#config). | | [`util.load_meta`](/api/top-level#util.load_meta) [`util.load_config`](/api/top-level#util.load_config) | Updated helpers for loading a model's [`meta.json`](/api/data-formats#meta) and [`config.cfg`](/api/data-formats#config). | +| [`util.get_installed_models`](/api/top-level#util.get_installed_models) | Names of all models installed in the environment. | | [`init config`](/api/cli#init-config) [`init fill-config`](/api/cli#init-fill-config) [`debug config`](/api/cli#debug-config) | CLI commands for initializing, auto-filling and debugging [training configs](/usage/training). | | [`project`](/api/cli#project) | Suite of CLI commands for cloning, running and managing [spaCy projects](/usage/projects). | +### New and updated documentation {#new-docs} + + + +
+ +To help you get started with spaCy v3.0 and the new features, we've added +several new or rewritten documentation pages, including a new usage guide on +[embeddings, transformers and transfer learning](/usage/embeddings-transformers), +a guide on [training models](/usage/training) rewritten from scratch, a page +explaining the new [spaCy projects](/usage/projects) and updated usage +documentation on +[custom pipeline components](/usage/processing-pipelines#custom-components). +We've also added a bunch of new illustrations and new API reference pages +documenting spaCy's machine learning [model architectures](/api/architectures) +and the expected [data formats](/api/data-formats). API pages about +[pipeline components](/api/#architecture-pipeline) now include more information, +like the default config and implementation, and we've adopted a more detailed +format for documenting argument and return types. + +
+ +[![Library architecture](../images/architecture.svg)](/api) + +
+ + + +- **Usage: ** [Embeddings & Transformers](/usage/embeddings-transformers), + [Training models](/usage/training), [Projects](/usage/projects), + [Custom pipeline components](/usage/processing-pipelines#custom-components) +- **API Reference: ** [Library architecture](/api), + [Model architectures](/api/architectures), [Data formats](/api/data-formats) +- **New Classes: ** [`Example`](/api/example), [`Tok2Vec`](/api/tok2vec), + [`Transformer`](/api/transformer), [`Lemmatizer`](/api/lemmatizer), + [`Morphologizer`](/api/morphologizer), + [`AttributeRuler`](/api/attributeruler), + [`SentenceRecognizer`](/api/sentencerecognizer), [`Pipe`](/api/pipe), + [`Corpus`](/api/corpus) + + + ## Backwards Incompatibilities {#incompat} As always, we've tried to keep the breaking changes to a minimum and focus on @@ -212,15 +361,16 @@ Note that spaCy v3.0 now requires **Python 3.6+**. ### Removed or renamed API {#incompat-removed} -| Removed | Replacement | -| ------------------------------------------------------ | ----------------------------------------------------------------------------------------- | -| `Language.disable_pipes` | [`Language.select_pipes`](/api/language#select_pipes) | -| `GoldParse` | [`Example`](/api/example) | -| `GoldCorpus` | [`Corpus`](/api/corpus) | -| `KnowledgeBase.load_bulk` `KnowledgeBase.dump` | [`KnowledgeBase.from_disk`](/api/kb#from_disk) [`KnowledgeBase.to_disk`](/api/kb#to_disk) | -| `spacy debug-data` | [`spacy debug data`](/api/cli#debug-data) | -| `spacy profile` | [`spacy debug profile`](/api/cli#debug-profile) | -| `spacy link` `util.set_data_path` `util.get_data_path` | not needed, model symlinks are deprecated | +| Removed | Replacement | +| -------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| `Language.disable_pipes` | [`Language.select_pipes`](/api/language#select_pipes) | +| `GoldParse` | [`Example`](/api/example) | +| `GoldCorpus` | [`Corpus`](/api/corpus) | +| `KnowledgeBase.load_bulk` `KnowledgeBase.dump` | [`KnowledgeBase.from_disk`](/api/kb#from_disk) [`KnowledgeBase.to_disk`](/api/kb#to_disk) | +| `spacy init-model` | [`spacy init model`](/api/cli#init-model) | +| `spacy debug-data` | [`spacy debug data`](/api/cli#debug-data) | +| `spacy profile` | [`spacy debug profile`](/api/cli#debug-profile) | +| `spacy link`, `util.set_data_path`, `util.get_data_path` | not needed, model symlinks are deprecated | The following deprecated methods, attributes and arguments were removed in v3.0. Most of them have been **deprecated for a while** and many would previously @@ -236,7 +386,7 @@ on them. | `Language.tagger`, `Language.parser`, `Language.entity` | [`Language.get_pipe`](/api/language#get_pipe) | | keyword-arguments like `vocab=False` on `to_disk`, `from_disk`, `to_bytes`, `from_bytes` | `exclude=["vocab"]` | | `n_threads` argument on [`Tokenizer`](/api/tokenizer), [`Matcher`](/api/matcher), [`PhraseMatcher`](/api/phrasematcher) | `n_process` | -| `verbose` argument on [`Language.evaluate`] | logging | +| `verbose` argument on [`Language.evaluate`](/api/language#evaluate) | logging (`DEBUG`) | | `SentenceSegmenter` hook, `SimilarityHook` | [user hooks](/usage/processing-pipelines#custom-components-user-hooks), [`Sentencizer`](/api/sentencizer), [`SentenceRecognizer`](/api/sentenceregognizer) | ## Migrating from v2.x {#migrating} From aa6a7cd6e72bfd8515b7c3b6ddb4c0951c6513e6 Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Fri, 21 Aug 2020 13:49:18 +0200 Subject: [PATCH 10/10] Update docs and consistency [ci skip] --- CONTRIBUTING.md | 12 +++++------ README.md | 5 ++--- spacy/tokenizer.pyx | 4 ++-- website/docs/usage/embeddings-transformers.md | 2 +- website/docs/usage/index.md | 4 ++-- website/docs/usage/linguistic-features.md | 14 ++++++------- website/docs/usage/processing-pipelines.md | 20 +++++++++---------- website/docs/usage/rule-based-matching.md | 10 +++++----- website/docs/usage/training.md | 2 +- website/docs/usage/v3.md | 5 +++-- website/src/styles/layout.sass | 5 ++++- 11 files changed, 43 insertions(+), 40 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 81cfbf8cb..0abde2abf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ Thanks for your interest in contributing to spaCy 🎉 The project is maintained by [@honnibal](https://github.com/honnibal) and [@ines](https://github.com/ines), and we'll do our best to help you get started. This page will give you a quick -overview of how things are organised and most importantly, how to get involved. +overview of how things are organized and most importantly, how to get involved. ## Table of contents @@ -195,7 +195,7 @@ modules in `.py` files, not Cython modules in `.pyx` and `.pxd` files.** ### Code formatting [`black`](https://github.com/ambv/black) is an opinionated Python code -formatter, optimised to produce readable code and small diffs. You can run +formatter, optimized to produce readable code and small diffs. You can run `black` from the command-line, or via your code editor. For example, if you're using [Visual Studio Code](https://code.visualstudio.com/), you can add the following to your `settings.json` to use `black` for formatting and auto-format @@ -286,7 +286,7 @@ Code that interacts with the file-system should accept objects that follow the If the function is user-facing and takes a path as an argument, it should check whether the path is provided as a string. Strings should be converted to `pathlib.Path` objects. Serialization and deserialization functions should always -accept **file-like objects**, as it makes the library io-agnostic. Working on +accept **file-like objects**, as it makes the library IO-agnostic. Working on buffers makes the code more general, easier to test, and compatible with Python 3's asynchronous IO. @@ -384,7 +384,7 @@ of Python and C++, with additional complexity and syntax from numpy. The many "traps for new players". 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 +Python optimization generally requires a lot of experimentation. Is it faster to have an `if item in my_dict` check, or to use `.get()`? What about `try`/`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 @@ -400,7 +400,7 @@ Python. If it's not fast enough the first time, just switch to Cython. - [PEP 8 Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/) (python.org) - [Official Cython documentation](http://docs.cython.org/en/latest/) (cython.org) - [Writing C in Cython](https://explosion.ai/blog/writing-c-in-cython) (explosion.ai) -- [Multi-threading spaCy’s parser and named entity recogniser](https://explosion.ai/blog/multithreading-with-cython) (explosion.ai) +- [Multi-threading spaCy’s parser and named entity recognizer](https://explosion.ai/blog/multithreading-with-cython) (explosion.ai) ## Adding tests @@ -412,7 +412,7 @@ name. For example, tests for the `Tokenizer` can be found in all test files and test functions need to be prefixed with `test_`. When adding tests, make sure to use descriptive names, keep the code short and -concise and only test for one behaviour at a time. Try to `parametrize` test +concise and only test for one behavior at a time. Try to `parametrize` test cases wherever possible, use our pre-defined fixtures for spaCy components and avoid unnecessary imports. diff --git a/README.md b/README.md index 1fece1e5a..cef2a1fdd 100644 --- a/README.md +++ b/README.md @@ -49,9 +49,8 @@ It's commercial open-source software, released under the MIT license. ## 💬 Where to ask questions -The spaCy project is maintained by [@honnibal](https://github.com/honnibal) and -[@ines](https://github.com/ines), along with core contributors -[@svlandeg](https://github.com/svlandeg) and +The spaCy project is maintained by [@honnibal](https://github.com/honnibal), +[@ines](https://github.com/ines), [@svlandeg](https://github.com/svlandeg) and [@adrianeboyd](https://github.com/adrianeboyd). 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 diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx index a13299fff..9fda1800b 100644 --- a/spacy/tokenizer.pyx +++ b/spacy/tokenizer.pyx @@ -47,9 +47,9 @@ cdef class Tokenizer: `infix_finditer` (callable): A function matching the signature of `re.compile(string).finditer` to find infixes. token_match (callable): A boolean function matching strings to be - recognised as tokens. + recognized as tokens. url_match (callable): A boolean function matching strings to be - recognised as tokens after considering prefixes and suffixes. + recognized as tokens after considering prefixes and suffixes. EXAMPLE: >>> tokenizer = Tokenizer(nlp.vocab) diff --git a/website/docs/usage/embeddings-transformers.md b/website/docs/usage/embeddings-transformers.md index 70562cf7e..33385ff51 100644 --- a/website/docs/usage/embeddings-transformers.md +++ b/website/docs/usage/embeddings-transformers.md @@ -184,7 +184,7 @@ yourself. For details on how to get started with training your own model, check out the [training quickstart](/usage/training#quickstart).