From e597110d31c41642a01d4c22e485bd5204ac7c81 Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Sun, 17 Feb 2019 19:31:19 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=92=AB=20Update=20website=20(#3285)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description The new website is implemented using [Gatsby](https://www.gatsbyjs.org) with [Remark](https://github.com/remarkjs/remark) and [MDX](https://mdxjs.com/). This allows authoring content in **straightforward Markdown** without the usual limitations. Standard elements can be overwritten with powerful [React](http://reactjs.org/) components and wherever Markdown syntax isn't enough, JSX components can be used. Hopefully, this update will also make it much easier to contribute to the docs. Once this PR is merged, I'll implement auto-deployment via [Netlify](https://netlify.com) on a specific branch (to avoid building the website on every PR). There's a bunch of other cool stuff that the new setup will allow us to do – including writing front-end tests, service workers, offline support, implementing a search and so on. This PR also includes various new docs pages and content. Resolves #3270. Resolves #3222. Resolves #2947. Resolves #2837. ### Types of change enhancement ## Checklist - [x] I have submitted the spaCy Contributor Agreement. - [x] I ran the tests, and all new and existing tests passed. - [x] My changes don't require a change to the documentation, or if they do, I've added all required information. --- .gitignore | 8 +- website/.prettierrc | 38 + website/404.jade | 12 - website/README.md | 644 +- website/_data.json | 59 - website/_harp.json | 97 - website/_includes/_footer.jade | 28 - website/_includes/_functions.jade | 95 - website/_includes/_mixins.jade | 749 - website/_includes/_navigation.jade | 16 - website/_includes/_newsletter.jade | 16 - website/_includes/_page-docs.jade | 54 - website/_includes/_page_models.jade | 109 - website/_includes/_scripts.jade | 28 - website/_includes/_sidebar.jade | 23 - website/_includes/_svg.jade | 180 - website/_layout.jade | 57 - website/api/_annotation/_biluo.jade | 43 - website/api/_annotation/_dep-labels.jade | 158 - website/api/_annotation/_named-entities.jade | 109 - website/api/_annotation/_pos-tags.jade | 179 - website/api/_annotation/_text-processing.jade | 55 - website/api/_annotation/_training.jade | 104 - website/api/_cython/_doc.jade | 71 - website/api/_cython/_lexeme.jade | 30 - website/api/_cython/_lexemec.jade | 200 - website/api/_cython/_span.jade | 43 - website/api/_cython/_stringstore.jade | 23 - website/api/_cython/_token.jade | 73 - website/api/_cython/_tokenc.jade | 270 - website/api/_cython/_vocab.jade | 88 - website/api/_data.json | 251 - website/api/_top-level/_compat.jade | 84 - website/api/_top-level/_displacy.jade | 259 - website/api/_top-level/_spacy.jade | 201 - website/api/_top-level/_util.jade | 454 - website/api/annotation.jade | 46 - website/api/cli.jade | 738 - website/api/cython-classes.jade | 39 - website/api/cython-structs.jade | 15 - website/api/cython.jade | 176 - website/api/dependencyparser.jade | 6 - website/api/doc.jade | 827 - website/api/entityrecognizer.jade | 6 - website/api/goldcorpus.jade | 35 - website/api/goldparse.jade | 203 - website/api/index.jade | 157 - website/api/language.jade | 702 - website/api/lemmatizer.jade | 160 - website/api/lexeme.jade | 384 - website/api/matcher.jade | 281 - website/api/phrasematcher.jade | 181 - website/api/pipe.jade | 449 - website/api/span.jade | 655 - website/api/stringstore.jade | 239 - website/api/tagger.jade | 6 - website/api/textcategorizer.jade | 19 - website/api/token.jade | 890 - website/api/tokenizer.jade | 229 - website/api/top-level.jade | 20 - website/api/vectors.jade | 476 - website/api/vocab.jade | 411 - website/assets/css/_base/_animations.sass | 28 - website/assets/css/_base/_fonts.sass | 27 - website/assets/css/_base/_grid.sass | 59 - website/assets/css/_base/_layout.sass | 43 - website/assets/css/_base/_objects.sass | 249 - website/assets/css/_base/_reset.sass | 103 - website/assets/css/_base/_utilities.sass | 267 - website/assets/css/_components/_asides.sass | 43 - website/assets/css/_components/_buttons.sass | 52 - website/assets/css/_components/_chat.sass | 105 - website/assets/css/_components/_code.sass | 202 - website/assets/css/_components/_landing.sass | 63 - website/assets/css/_components/_lists.sass | 39 - website/assets/css/_components/_misc.sass | 68 - .../assets/css/_components/_navigation.sass | 61 - .../assets/css/_components/_quickstart.sass | 100 - website/assets/css/_components/_sidebar.sass | 95 - website/assets/css/_components/_tables.sass | 86 - website/assets/css/_components/_tooltips.sass | 39 - website/assets/css/_mixins.sass | 80 - website/assets/css/_variables.sass | 51 - website/assets/css/style.sass | 37 - website/assets/css/style_green.sass | 4 - website/assets/css/style_purple.sass | 4 - website/assets/img/favicon.ico | Bin 1150 -> 0 bytes website/assets/img/logo.svg | 1 - website/assets/img/pattern_blue.jpg | Bin 230088 -> 0 bytes website/assets/img/pattern_green.jpg | Bin 232481 -> 0 bytes website/assets/img/pattern_landing.jpg | Bin 186575 -> 0 bytes website/assets/img/pattern_purple.jpg | Bin 208938 -> 0 bytes website/assets/img/pattern_red.jpg | Bin 184784 -> 0 bytes website/assets/img/profile_matt.png | Bin 110069 -> 0 bytes website/assets/img/resources/displacy-ent.jpg | Bin 32314 -> 0 bytes website/assets/img/resources/displacy.jpg | Bin 16049 -> 0 bytes website/assets/img/resources/neuralcoref.jpg | Bin 31380 -> 0 bytes website/assets/img/resources/sense2vec.jpg | Bin 32686 -> 0 bytes website/assets/img/resources/spacy-vis.jpg | Bin 8693 -> 0 bytes website/assets/img/social/preview_101.jpg | Bin 383381 -> 0 bytes website/assets/js/changelog.vue.js | 40 - website/assets/js/main.js | 158 - website/assets/js/models.vue.js | 150 - website/assets/js/universe.vue.js | 125 - website/assets/js/vendor/in-view.min.js | 6 - website/assets/js/vendor/juniper.min.js | 9 - website/assets/js/vendor/prism.min.js | 28 - website/assets/js/vendor/quickstart.min.js | 7 - website/assets/js/vendor/vue-markdown.min.js | 6 - website/assets/js/vendor/vue.min.js | 6 - website/docs/api/annotation.md | 620 + website/docs/api/cli.md | 361 + website/docs/api/cython-classes.md | 210 + website/docs/api/cython-structs.md | 256 + website/docs/api/cython.md | 134 + website/docs/api/dependencyparser.md | 311 + website/docs/api/doc.md | 608 + website/docs/api/entityrecognizer.md | 311 + website/docs/api/entityruler.md | 210 + website/docs/api/goldcorpus.md | 24 + website/docs/api/goldparse.md | 125 + website/docs/api/index.md | 10 + website/docs/api/language.md | 440 + website/docs/api/lemmatizer.md | 98 + website/docs/api/lexeme.md | 166 + website/docs/api/matcher.md | 208 + website/docs/api/phrasematcher.md | 155 + website/docs/api/pipeline-functions.md | 119 + website/docs/api/sentencesegmenter.md | 78 + website/docs/api/span.md | 467 + website/docs/api/stringstore.md | 193 + website/docs/api/tagger.md | 312 + website/docs/api/textcategorizer.md | 312 + website/docs/api/token.md | 475 + website/docs/api/tokenizer.md | 127 + website/docs/api/top-level.md | 633 + website/docs/api/vectors.md | 375 + website/docs/api/vocab.md | 293 + .../img => docs/images}/architecture.svg | 6 +- website/docs/images/displacy-compact.svg | 123 + .../docs/images/displacy-custom-parser.svg | 55 + website/docs/images/displacy-ent-custom.html | 9 + website/docs/images/displacy-ent.html | 18 + website/docs/images/displacy-long.html | 105 + website/docs/images/displacy-long2.html | 84 + website/docs/images/displacy-model-rules.svg | 45 + website/docs/images/displacy-model-rules2.svg | 58 + website/docs/images/displacy-small.svg | 33 + website/docs/images/displacy.svg | 45 + .../img => docs/images}/displacy_jupyter.jpg | Bin .../img => docs/images}/language_data.svg | 8 +- website/docs/images/matcher-demo.jpg | Bin 0 -> 173293 bytes .../{assets/img => docs/images}/pipeline.svg | 2 +- website/docs/images/prodigy.jpg | Bin 0 -> 79656 bytes .../img => docs/images}/tokenization.svg | 0 .../img => docs/images}/training-loop.svg | 0 .../{assets/img => docs/images}/training.svg | 2 +- .../img => docs/images}/vocab_stringstore.svg | 0 website/docs/index.md | 6 + website/docs/models/index.md | 166 + website/docs/styleguide.md | 28 + website/docs/usage/101/_architecture.md | 52 + website/docs/usage/101/_language-data.md | 60 + website/docs/usage/101/_named-entities.md | 38 + website/docs/usage/101/_pipelines.md | 42 + website/docs/usage/101/_pos-deps.md | 62 + website/docs/usage/101/_serialization.md | 29 + website/docs/usage/101/_tokenization.md | 50 + website/docs/usage/101/_training.md | 38 + website/docs/usage/101/_vectors-similarity.md | 102 + website/docs/usage/_benchmarks-choi.md | 10 + website/docs/usage/adding-languages.md | 675 + website/docs/usage/examples.md | 192 + website/docs/usage/facts-figures.md | 260 + website/docs/usage/index.md | 425 + website/docs/usage/linguistic-features.md | 1189 + website/docs/usage/models.md | 371 + website/docs/usage/processing-pipelines.md | 836 + website/docs/usage/rule-based-matching.md | 1213 + website/docs/usage/saving-loading.md | 642 + website/docs/usage/spacy-101.md | 911 + website/docs/usage/training.md | 675 + website/docs/usage/v2-1.md | 260 + website/docs/usage/v2.md | 616 + website/docs/usage/vectors-similarity.md | 257 + website/docs/usage/visualizers.md | 399 + website/gatsby-browser.js | 50 + website/gatsby-config.js | 145 + website/gatsby-node.js | 270 + website/index.jade | 162 - website/meta/languages.json | 165 + website/meta/logos.json | 36 + website/meta/sidebars.json | 106 + website/meta/site.json | 72 + website/{universe => meta}/universe.json | 200 +- website/models/_data.json | 141 - website/models/de.jade | 6 - website/models/el.jade | 6 - website/models/en.jade | 6 - website/models/es.jade | 6 - website/models/fr.jade | 6 - website/models/index.jade | 102 - website/models/it.jade | 6 - website/models/nl.jade | 6 - website/models/pt.jade | 6 - website/models/xx.jade | 6 - website/netlify.toml | 43 + website/package-lock.json | 22880 ++++++++++++++++ website/package.json | 100 +- website/robots.txt.jade | 9 - website/src/components/accordion.js | 64 + website/src/components/alert.js | 35 + website/src/components/aside.js | 22 + website/src/components/button.js | 37 + website/src/components/card.js | 42 + website/src/components/code.js | 169 + website/src/components/embed.js | 120 + website/src/components/footer.js | 95 + website/src/components/github.js | 69 + website/src/components/grid.js | 30 + website/src/components/icon.js | 76 + website/src/components/infobox.js | 39 + website/src/components/juniper.js | 273 + website/src/components/landing.js | 148 + website/src/components/link.js | 105 + website/src/components/list.js | 7 + website/src/components/main.js | 51 + website/src/components/navigation.js | 57 + website/src/components/newsletter.js | 50 + website/src/components/progress.js | 60 + website/src/components/quickstart.js | 183 + website/src/components/readnext.js | 27 + website/src/components/section.js | 29 + website/src/components/seo.js | 137 + website/src/components/sidebar.js | 107 + website/src/components/table.js | 71 + website/src/components/tag.js | 57 + website/src/components/title.js | 52 + website/src/components/typography.js | 141 + website/src/components/util.js | 125 + .../{assets => src}/fonts/hkgrotesk-bold.woff | Bin .../fonts/hkgrotesk-bold.woff2 | Bin .../fonts/hkgrotesk-bolditalic.woff | Bin .../fonts/hkgrotesk-bolditalic.woff2 | Bin .../fonts/hkgrotesk-semibold.woff | Bin .../fonts/hkgrotesk-semibold.woff2 | Bin .../fonts/hkgrotesk-semibolditalic.woff | Bin .../fonts/hkgrotesk-semibolditalic.woff2 | Bin website/src/images/explosion.svg | 3 + website/src/images/icon.png | Bin 0 -> 30847 bytes website/src/images/icons/accept.svg | 3 + website/src/images/icons/arrow-right.svg | 3 + website/src/images/icons/code.svg | 3 + website/src/images/icons/docs.svg | 3 + website/src/images/icons/github.svg | 3 + website/src/images/icons/help-outline.svg | 3 + website/src/images/icons/help.svg | 3 + website/src/images/icons/info.svg | 3 + website/src/images/icons/neutral.svg | 3 + website/src/images/icons/no.svg | 3 + website/src/images/icons/offline.svg | 4 + website/src/images/icons/reject.svg | 3 + website/src/images/icons/twitter.svg | 3 + website/src/images/icons/warning.svg | 3 + website/src/images/icons/website.svg | 3 + website/src/images/icons/yes.svg | 3 + website/src/images/logo.svg | 3 + website/src/images/logos/airbnb.svg | 3 + website/src/images/logos/allenai.svg | 18 + website/src/images/logos/bbc.svg | 3 + website/src/images/logos/chartbeat.svg | 6 + website/src/images/logos/index.js | 29 + website/src/images/logos/microsoft.svg | 7 + website/src/images/logos/quora.svg | 3 + website/src/images/logos/recode.svg | 3 + website/src/images/logos/retriever.svg | 3 + website/src/images/logos/stitchfix.svg | 3 + website/src/images/logos/thoughtworks.svg | 3 + website/src/images/logos/venturebeat.svg | 4 + website/src/images/logos/wapo.svg | 3 + website/src/images/pattern_blue.jpg | Bin 0 -> 116280 bytes website/src/images/pattern_green.jpg | Bin 0 -> 121676 bytes website/src/images/pattern_landing.jpg | Bin 0 -> 103423 bytes website/src/images/pattern_purple.jpg | Bin 0 -> 114852 bytes .../images/social_api.jpg} | Bin .../images/social_default.jpg} | Bin .../images/social_universe.jpg} | Bin website/src/pages/404.md | 7 + website/src/plugins/remark-code-blocks.js | 71 + website/src/plugins/remark-custom-attrs.js | 52 + website/src/plugins/remark-wrap-section.js | 75 + website/src/styles/accordion.module.sass | 48 + website/src/styles/alert.module.sass | 21 + website/src/styles/aside.module.sass | 90 + website/src/styles/base.sass | 57 + website/src/styles/button.module.sass | 41 + website/src/styles/card.module.sass | 14 + website/src/styles/code.module.sass | 126 + website/src/styles/embed.module.sass | 34 + website/src/styles/footer.module.sass | 45 + website/src/styles/grid.module.sass | 39 + website/src/styles/icon.module.sass | 20 + website/src/styles/infobox.module.sass | 42 + website/src/styles/landing.module.sass | 150 + website/src/styles/layout.sass | 485 + website/src/styles/link.module.sass | 30 + website/src/styles/list.module.sass | 37 + website/src/styles/main.module.sass | 40 + website/src/styles/navigation.module.sass | 70 + website/src/styles/newsletter.module.sass | 22 + .../styles/progress.module.sass} | 12 +- website/src/styles/quickstart.module.sass | 125 + website/src/styles/readnext.module.sass | 21 + website/src/styles/section.module.sass | 9 + website/src/styles/sidebar.module.sass | 118 + website/src/styles/table.module.sass | 80 + website/src/styles/tag.module.sass | 16 + website/src/styles/title.module.sass | 33 + website/src/styles/typography.module.sass | 84 + website/src/templates/docs.js | 149 + website/src/templates/index.js | 198 + website/src/templates/mdx-renderer.js | 21 + website/src/templates/models.js | 320 + website/src/templates/universe.js | 352 + website/src/widgets/404.js | 19 + website/src/widgets/changelog.js | 113 + website/src/widgets/landing.js | 281 + website/src/widgets/languages.js | 105 + website/src/widgets/quickstart-install.js | 116 + website/src/widgets/quickstart-models.js | 107 + website/src/widgets/styleguide.js | 111 + website/styleguide.jade | 659 - website/universe/README.md | 95 - website/universe/_data.json | 9 - website/universe/index.jade | 146 - .../_adding-languages/_language-data.jade | 558 - website/usage/_adding-languages/_testing.jade | 51 - .../usage/_adding-languages/_training.jade | 93 - website/usage/_data.json | 168 - website/usage/_deep-learning.jade | 29 - 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 | 103 - website/usage/_facts-figures/_benchmarks.jade | 212 - .../_facts-figures/_feature-comparison.jade | 58 - .../_facts-figures/_other-libraries.jade | 70 - website/usage/_install/_changelog.jade | 37 - website/usage/_install/_instructions.jade | 256 - website/usage/_install/_quickstart.jade | 26 - website/usage/_install/_troubleshooting.jade | 199 - .../_dependency-parse.jade | 274 - .../_linguistic-features/_named-entities.jade | 220 - .../_linguistic-features/_pos-tagging.jade | 74 - .../_rule-based-matching.jade | 706 - .../_sentence-segmentation.jade | 129 - .../_linguistic-features/_tokenization.jade | 367 - website/usage/_models/_available-models.jade | 19 - website/usage/_models/_install-basics.jade | 43 - website/usage/_models/_install.jade | 183 - website/usage/_models/_languages.jade | 76 - website/usage/_models/_production.jade | 81 - website/usage/_models/_quickstart.jade | 18 - .../_custom-components.jade | 130 - .../_processing-pipelines/_extensions.jade | 438 - .../_multithreading.jade | 53 - .../_processing-pipelines/_pipelines.jade | 154 - .../_processing-pipelines/_serialization.jade | 38 - website/usage/_spacy-101/_architecture.jade | 134 - website/usage/_spacy-101/_community-faq.jade | 133 - website/usage/_spacy-101/_language-data.jade | 107 - website/usage/_spacy-101/_lightning-tour.jade | 362 - website/usage/_spacy-101/_named-entities.jade | 41 - website/usage/_spacy-101/_pipelines.jade | 82 - website/usage/_spacy-101/_pos-deps.jade | 65 - website/usage/_spacy-101/_serialization.jade | 64 - website/usage/_spacy-101/_similarity.jade | 51 - website/usage/_spacy-101/_tokenization.jade | 64 - website/usage/_spacy-101/_training.jade | 50 - website/usage/_spacy-101/_vocab.jade | 122 - website/usage/_spacy-101/_word-vectors.jade | 159 - website/usage/_training/_basics.jade | 280 - website/usage/_training/_ner.jade | 127 - website/usage/_training/_saving-loading.jade | 192 - website/usage/_training/_tagger-parser.jade | 184 - website/usage/_training/_textcat.jade | 63 - website/usage/_training/_tips.jade | 162 - website/usage/_v2/_features.jade | 249 - website/usage/_v2/_incompat.jade | 170 - website/usage/_v2/_migrating.jade | 250 - website/usage/_v2/_summary.jade | 76 - .../usage/_vectors-similarity/_custom.jade | 241 - website/usage/_vectors-similarity/_gpu.jade | 30 - website/usage/_visualizers/_dep.jade | 85 - website/usage/_visualizers/_ent.jade | 80 - website/usage/_visualizers/_html.jade | 164 - website/usage/_visualizers/_jupyter.jade | 36 - website/usage/adding-languages.jade | 58 - website/usage/examples.jade | 181 - website/usage/facts-figures.jade | 32 - website/usage/index.jade | 29 - website/usage/linguistic-features.jade | 42 - website/usage/models.jade | 41 - website/usage/processing-pipelines.jade | 26 - website/usage/spacy-101.jade | 321 - website/usage/training.jade | 33 - website/usage/v2.jade | 22 - website/usage/vectors-similarity.jade | 23 - website/usage/visualizers.jade | 48 - 413 files changed, 49007 insertions(+), 25375 deletions(-) create mode 100644 website/.prettierrc delete mode 100644 website/404.jade delete mode 100644 website/_data.json delete mode 100644 website/_harp.json delete mode 100644 website/_includes/_footer.jade delete mode 100644 website/_includes/_functions.jade delete mode 100644 website/_includes/_mixins.jade delete mode 100644 website/_includes/_navigation.jade delete mode 100644 website/_includes/_newsletter.jade delete mode 100644 website/_includes/_page-docs.jade delete mode 100644 website/_includes/_page_models.jade delete mode 100644 website/_includes/_scripts.jade delete mode 100644 website/_includes/_sidebar.jade delete mode 100644 website/_includes/_svg.jade delete mode 100644 website/_layout.jade delete mode 100644 website/api/_annotation/_biluo.jade delete mode 100644 website/api/_annotation/_dep-labels.jade delete mode 100644 website/api/_annotation/_named-entities.jade delete mode 100644 website/api/_annotation/_pos-tags.jade delete mode 100644 website/api/_annotation/_text-processing.jade delete mode 100644 website/api/_annotation/_training.jade delete mode 100644 website/api/_cython/_doc.jade delete mode 100644 website/api/_cython/_lexeme.jade delete mode 100644 website/api/_cython/_lexemec.jade delete mode 100644 website/api/_cython/_span.jade delete mode 100644 website/api/_cython/_stringstore.jade delete mode 100644 website/api/_cython/_token.jade delete mode 100644 website/api/_cython/_tokenc.jade delete mode 100644 website/api/_cython/_vocab.jade delete mode 100644 website/api/_data.json delete mode 100644 website/api/_top-level/_compat.jade delete mode 100644 website/api/_top-level/_displacy.jade delete mode 100644 website/api/_top-level/_spacy.jade delete mode 100644 website/api/_top-level/_util.jade delete mode 100644 website/api/annotation.jade delete mode 100644 website/api/cli.jade delete mode 100644 website/api/cython-classes.jade delete mode 100644 website/api/cython-structs.jade delete mode 100644 website/api/cython.jade delete mode 100644 website/api/dependencyparser.jade delete mode 100644 website/api/doc.jade delete mode 100644 website/api/entityrecognizer.jade delete mode 100644 website/api/goldcorpus.jade delete mode 100644 website/api/goldparse.jade delete mode 100644 website/api/index.jade delete mode 100644 website/api/language.jade delete mode 100644 website/api/lemmatizer.jade delete mode 100644 website/api/lexeme.jade delete mode 100644 website/api/matcher.jade delete mode 100644 website/api/phrasematcher.jade delete mode 100644 website/api/pipe.jade delete mode 100644 website/api/span.jade delete mode 100644 website/api/stringstore.jade delete mode 100644 website/api/tagger.jade delete mode 100644 website/api/textcategorizer.jade delete mode 100644 website/api/token.jade delete mode 100644 website/api/tokenizer.jade delete mode 100644 website/api/top-level.jade delete mode 100644 website/api/vectors.jade delete mode 100644 website/api/vocab.jade delete mode 100644 website/assets/css/_base/_animations.sass delete mode 100644 website/assets/css/_base/_fonts.sass delete mode 100644 website/assets/css/_base/_grid.sass delete mode 100644 website/assets/css/_base/_layout.sass delete mode 100644 website/assets/css/_base/_objects.sass delete mode 100644 website/assets/css/_base/_reset.sass delete mode 100644 website/assets/css/_base/_utilities.sass delete mode 100644 website/assets/css/_components/_asides.sass delete mode 100644 website/assets/css/_components/_buttons.sass delete mode 100644 website/assets/css/_components/_chat.sass delete mode 100644 website/assets/css/_components/_code.sass delete mode 100644 website/assets/css/_components/_landing.sass delete mode 100644 website/assets/css/_components/_lists.sass delete mode 100644 website/assets/css/_components/_misc.sass delete mode 100644 website/assets/css/_components/_navigation.sass delete mode 100644 website/assets/css/_components/_quickstart.sass delete mode 100644 website/assets/css/_components/_sidebar.sass delete mode 100644 website/assets/css/_components/_tables.sass delete mode 100644 website/assets/css/_components/_tooltips.sass delete mode 100644 website/assets/css/_mixins.sass delete mode 100644 website/assets/css/_variables.sass delete mode 100644 website/assets/css/style.sass delete mode 100644 website/assets/css/style_green.sass delete mode 100644 website/assets/css/style_purple.sass delete mode 100644 website/assets/img/favicon.ico delete mode 100644 website/assets/img/logo.svg delete mode 100644 website/assets/img/pattern_blue.jpg delete mode 100644 website/assets/img/pattern_green.jpg delete mode 100644 website/assets/img/pattern_landing.jpg delete mode 100644 website/assets/img/pattern_purple.jpg delete mode 100644 website/assets/img/pattern_red.jpg delete mode 100644 website/assets/img/profile_matt.png delete mode 100644 website/assets/img/resources/displacy-ent.jpg delete mode 100644 website/assets/img/resources/displacy.jpg delete mode 100644 website/assets/img/resources/neuralcoref.jpg delete mode 100644 website/assets/img/resources/sense2vec.jpg delete mode 100644 website/assets/img/resources/spacy-vis.jpg delete mode 100644 website/assets/img/social/preview_101.jpg delete mode 100644 website/assets/js/changelog.vue.js delete mode 100644 website/assets/js/main.js delete mode 100644 website/assets/js/models.vue.js delete mode 100644 website/assets/js/universe.vue.js delete mode 100644 website/assets/js/vendor/in-view.min.js delete mode 100644 website/assets/js/vendor/juniper.min.js delete mode 100644 website/assets/js/vendor/prism.min.js delete mode 100644 website/assets/js/vendor/quickstart.min.js delete mode 100644 website/assets/js/vendor/vue-markdown.min.js delete mode 100644 website/assets/js/vendor/vue.min.js create mode 100644 website/docs/api/annotation.md create mode 100644 website/docs/api/cli.md create mode 100644 website/docs/api/cython-classes.md create mode 100644 website/docs/api/cython-structs.md create mode 100644 website/docs/api/cython.md create mode 100644 website/docs/api/dependencyparser.md create mode 100644 website/docs/api/doc.md create mode 100644 website/docs/api/entityrecognizer.md create mode 100644 website/docs/api/entityruler.md create mode 100644 website/docs/api/goldcorpus.md create mode 100644 website/docs/api/goldparse.md create mode 100644 website/docs/api/index.md create mode 100644 website/docs/api/language.md create mode 100644 website/docs/api/lemmatizer.md create mode 100644 website/docs/api/lexeme.md create mode 100644 website/docs/api/matcher.md create mode 100644 website/docs/api/phrasematcher.md create mode 100644 website/docs/api/pipeline-functions.md create mode 100644 website/docs/api/sentencesegmenter.md create mode 100644 website/docs/api/span.md create mode 100644 website/docs/api/stringstore.md create mode 100644 website/docs/api/tagger.md create mode 100644 website/docs/api/textcategorizer.md create mode 100644 website/docs/api/token.md create mode 100644 website/docs/api/tokenizer.md create mode 100644 website/docs/api/top-level.md create mode 100644 website/docs/api/vectors.md create mode 100644 website/docs/api/vocab.md rename website/{assets/img => docs/images}/architecture.svg (98%) create mode 100644 website/docs/images/displacy-compact.svg create mode 100644 website/docs/images/displacy-custom-parser.svg create mode 100644 website/docs/images/displacy-ent-custom.html create mode 100644 website/docs/images/displacy-ent.html create mode 100644 website/docs/images/displacy-long.html create mode 100644 website/docs/images/displacy-long2.html create mode 100644 website/docs/images/displacy-model-rules.svg create mode 100644 website/docs/images/displacy-model-rules2.svg create mode 100644 website/docs/images/displacy-small.svg create mode 100644 website/docs/images/displacy.svg rename website/{assets/img => docs/images}/displacy_jupyter.jpg (100%) rename website/{assets/img => docs/images}/language_data.svg (97%) create mode 100644 website/docs/images/matcher-demo.jpg rename website/{assets/img => docs/images}/pipeline.svg (96%) create mode 100644 website/docs/images/prodigy.jpg rename website/{assets/img => docs/images}/tokenization.svg (100%) rename website/{assets/img => docs/images}/training-loop.svg (100%) rename website/{assets/img => docs/images}/training.svg (98%) rename website/{assets/img => docs/images}/vocab_stringstore.svg (100%) create mode 100644 website/docs/index.md create mode 100644 website/docs/models/index.md create mode 100644 website/docs/styleguide.md create mode 100644 website/docs/usage/101/_architecture.md create mode 100644 website/docs/usage/101/_language-data.md create mode 100644 website/docs/usage/101/_named-entities.md create mode 100644 website/docs/usage/101/_pipelines.md create mode 100644 website/docs/usage/101/_pos-deps.md create mode 100644 website/docs/usage/101/_serialization.md create mode 100644 website/docs/usage/101/_tokenization.md create mode 100644 website/docs/usage/101/_training.md create mode 100644 website/docs/usage/101/_vectors-similarity.md create mode 100644 website/docs/usage/_benchmarks-choi.md create mode 100644 website/docs/usage/adding-languages.md create mode 100644 website/docs/usage/examples.md create mode 100644 website/docs/usage/facts-figures.md create mode 100644 website/docs/usage/index.md create mode 100644 website/docs/usage/linguistic-features.md create mode 100644 website/docs/usage/models.md create mode 100644 website/docs/usage/processing-pipelines.md create mode 100644 website/docs/usage/rule-based-matching.md create mode 100644 website/docs/usage/saving-loading.md create mode 100644 website/docs/usage/spacy-101.md create mode 100644 website/docs/usage/training.md create mode 100644 website/docs/usage/v2-1.md create mode 100644 website/docs/usage/v2.md create mode 100644 website/docs/usage/vectors-similarity.md create mode 100644 website/docs/usage/visualizers.md create mode 100644 website/gatsby-browser.js create mode 100644 website/gatsby-config.js create mode 100644 website/gatsby-node.js delete mode 100644 website/index.jade create mode 100644 website/meta/languages.json create mode 100644 website/meta/logos.json create mode 100644 website/meta/sidebars.json create mode 100644 website/meta/site.json rename website/{universe => meta}/universe.json (87%) delete mode 100644 website/models/_data.json delete mode 100644 website/models/de.jade delete mode 100644 website/models/el.jade delete mode 100644 website/models/en.jade delete mode 100644 website/models/es.jade delete mode 100644 website/models/fr.jade delete mode 100644 website/models/index.jade delete mode 100644 website/models/it.jade delete mode 100644 website/models/nl.jade delete mode 100644 website/models/pt.jade delete mode 100644 website/models/xx.jade create mode 100644 website/netlify.toml create mode 100644 website/package-lock.json delete mode 100644 website/robots.txt.jade create mode 100644 website/src/components/accordion.js create mode 100644 website/src/components/alert.js create mode 100644 website/src/components/aside.js create mode 100644 website/src/components/button.js create mode 100644 website/src/components/card.js create mode 100644 website/src/components/code.js create mode 100644 website/src/components/embed.js create mode 100644 website/src/components/footer.js create mode 100644 website/src/components/github.js create mode 100644 website/src/components/grid.js create mode 100644 website/src/components/icon.js create mode 100644 website/src/components/infobox.js create mode 100644 website/src/components/juniper.js create mode 100644 website/src/components/landing.js create mode 100644 website/src/components/link.js create mode 100644 website/src/components/list.js create mode 100644 website/src/components/main.js create mode 100644 website/src/components/navigation.js create mode 100644 website/src/components/newsletter.js create mode 100644 website/src/components/progress.js create mode 100644 website/src/components/quickstart.js create mode 100644 website/src/components/readnext.js create mode 100644 website/src/components/section.js create mode 100644 website/src/components/seo.js create mode 100644 website/src/components/sidebar.js create mode 100644 website/src/components/table.js create mode 100644 website/src/components/tag.js create mode 100644 website/src/components/title.js create mode 100644 website/src/components/typography.js create mode 100644 website/src/components/util.js rename website/{assets => src}/fonts/hkgrotesk-bold.woff (100%) rename website/{assets => src}/fonts/hkgrotesk-bold.woff2 (100%) rename website/{assets => src}/fonts/hkgrotesk-bolditalic.woff (100%) rename website/{assets => src}/fonts/hkgrotesk-bolditalic.woff2 (100%) rename website/{assets => src}/fonts/hkgrotesk-semibold.woff (100%) rename website/{assets => src}/fonts/hkgrotesk-semibold.woff2 (100%) rename website/{assets => src}/fonts/hkgrotesk-semibolditalic.woff (100%) rename website/{assets => src}/fonts/hkgrotesk-semibolditalic.woff2 (100%) create mode 100644 website/src/images/explosion.svg create mode 100644 website/src/images/icon.png create mode 100644 website/src/images/icons/accept.svg create mode 100644 website/src/images/icons/arrow-right.svg create mode 100644 website/src/images/icons/code.svg create mode 100644 website/src/images/icons/docs.svg create mode 100644 website/src/images/icons/github.svg create mode 100644 website/src/images/icons/help-outline.svg create mode 100644 website/src/images/icons/help.svg create mode 100644 website/src/images/icons/info.svg create mode 100644 website/src/images/icons/neutral.svg create mode 100644 website/src/images/icons/no.svg create mode 100644 website/src/images/icons/offline.svg create mode 100644 website/src/images/icons/reject.svg create mode 100644 website/src/images/icons/twitter.svg create mode 100644 website/src/images/icons/warning.svg create mode 100644 website/src/images/icons/website.svg create mode 100644 website/src/images/icons/yes.svg create mode 100644 website/src/images/logo.svg create mode 100644 website/src/images/logos/airbnb.svg create mode 100644 website/src/images/logos/allenai.svg create mode 100644 website/src/images/logos/bbc.svg create mode 100644 website/src/images/logos/chartbeat.svg create mode 100644 website/src/images/logos/index.js create mode 100644 website/src/images/logos/microsoft.svg create mode 100644 website/src/images/logos/quora.svg create mode 100644 website/src/images/logos/recode.svg create mode 100644 website/src/images/logos/retriever.svg create mode 100644 website/src/images/logos/stitchfix.svg create mode 100644 website/src/images/logos/thoughtworks.svg create mode 100644 website/src/images/logos/venturebeat.svg create mode 100644 website/src/images/logos/wapo.svg create mode 100644 website/src/images/pattern_blue.jpg create mode 100644 website/src/images/pattern_green.jpg create mode 100644 website/src/images/pattern_landing.jpg create mode 100644 website/src/images/pattern_purple.jpg rename website/{assets/img/social/preview_api.jpg => src/images/social_api.jpg} (100%) rename website/{assets/img/social/preview_default.jpg => src/images/social_default.jpg} (100%) rename website/{assets/img/social/preview_universe.jpg => src/images/social_universe.jpg} (100%) create mode 100644 website/src/pages/404.md create mode 100644 website/src/plugins/remark-code-blocks.js create mode 100644 website/src/plugins/remark-custom-attrs.js create mode 100644 website/src/plugins/remark-wrap-section.js create mode 100644 website/src/styles/accordion.module.sass create mode 100644 website/src/styles/alert.module.sass create mode 100644 website/src/styles/aside.module.sass create mode 100644 website/src/styles/base.sass create mode 100644 website/src/styles/button.module.sass create mode 100644 website/src/styles/card.module.sass create mode 100644 website/src/styles/code.module.sass create mode 100644 website/src/styles/embed.module.sass create mode 100644 website/src/styles/footer.module.sass create mode 100644 website/src/styles/grid.module.sass create mode 100644 website/src/styles/icon.module.sass create mode 100644 website/src/styles/infobox.module.sass create mode 100644 website/src/styles/landing.module.sass create mode 100644 website/src/styles/layout.sass create mode 100644 website/src/styles/link.module.sass create mode 100644 website/src/styles/list.module.sass create mode 100644 website/src/styles/main.module.sass create mode 100644 website/src/styles/navigation.module.sass create mode 100644 website/src/styles/newsletter.module.sass rename website/{assets/css/_components/_progress.sass => src/styles/progress.module.sass} (64%) create mode 100644 website/src/styles/quickstart.module.sass create mode 100644 website/src/styles/readnext.module.sass create mode 100644 website/src/styles/section.module.sass create mode 100644 website/src/styles/sidebar.module.sass create mode 100644 website/src/styles/table.module.sass create mode 100644 website/src/styles/tag.module.sass create mode 100644 website/src/styles/title.module.sass create mode 100644 website/src/styles/typography.module.sass create mode 100644 website/src/templates/docs.js create mode 100644 website/src/templates/index.js create mode 100644 website/src/templates/mdx-renderer.js create mode 100644 website/src/templates/models.js create mode 100644 website/src/templates/universe.js create mode 100644 website/src/widgets/404.js create mode 100644 website/src/widgets/changelog.js create mode 100644 website/src/widgets/landing.js create mode 100644 website/src/widgets/languages.js create mode 100644 website/src/widgets/quickstart-install.js create mode 100644 website/src/widgets/quickstart-models.js create mode 100644 website/src/widgets/styleguide.js delete mode 100644 website/styleguide.jade delete mode 100644 website/universe/README.md delete mode 100644 website/universe/_data.json delete mode 100644 website/universe/index.jade delete mode 100644 website/usage/_adding-languages/_language-data.jade delete mode 100644 website/usage/_adding-languages/_testing.jade delete mode 100644 website/usage/_adding-languages/_training.jade delete mode 100644 website/usage/_data.json delete mode 100644 website/usage/_deep-learning.jade delete mode 100644 website/usage/_deep-learning/_dynet.jade delete mode 100644 website/usage/_deep-learning/_pre-processing.jade delete mode 100644 website/usage/_deep-learning/_pytorch.jade delete mode 100644 website/usage/_deep-learning/_scikit-learn.jade delete mode 100644 website/usage/_deep-learning/_tensorflow-keras.jade delete mode 100644 website/usage/_deep-learning/_thinc.jade delete mode 100644 website/usage/_facts-figures/_benchmarks-choi-2015.jade delete mode 100644 website/usage/_facts-figures/_benchmarks-models.jade delete mode 100644 website/usage/_facts-figures/_benchmarks.jade delete mode 100644 website/usage/_facts-figures/_feature-comparison.jade delete mode 100644 website/usage/_facts-figures/_other-libraries.jade delete mode 100644 website/usage/_install/_changelog.jade delete mode 100644 website/usage/_install/_instructions.jade delete mode 100644 website/usage/_install/_quickstart.jade delete mode 100644 website/usage/_install/_troubleshooting.jade delete mode 100644 website/usage/_linguistic-features/_dependency-parse.jade delete mode 100644 website/usage/_linguistic-features/_named-entities.jade delete mode 100644 website/usage/_linguistic-features/_pos-tagging.jade delete mode 100644 website/usage/_linguistic-features/_rule-based-matching.jade delete mode 100644 website/usage/_linguistic-features/_sentence-segmentation.jade delete mode 100644 website/usage/_linguistic-features/_tokenization.jade delete mode 100644 website/usage/_models/_available-models.jade delete mode 100644 website/usage/_models/_install-basics.jade delete mode 100644 website/usage/_models/_install.jade delete mode 100644 website/usage/_models/_languages.jade delete mode 100644 website/usage/_models/_production.jade delete mode 100644 website/usage/_models/_quickstart.jade delete mode 100644 website/usage/_processing-pipelines/_custom-components.jade delete mode 100644 website/usage/_processing-pipelines/_extensions.jade delete mode 100644 website/usage/_processing-pipelines/_multithreading.jade delete mode 100644 website/usage/_processing-pipelines/_pipelines.jade delete mode 100644 website/usage/_processing-pipelines/_serialization.jade delete mode 100644 website/usage/_spacy-101/_architecture.jade delete mode 100644 website/usage/_spacy-101/_community-faq.jade delete mode 100644 website/usage/_spacy-101/_language-data.jade delete mode 100644 website/usage/_spacy-101/_lightning-tour.jade delete mode 100644 website/usage/_spacy-101/_named-entities.jade delete mode 100644 website/usage/_spacy-101/_pipelines.jade delete mode 100644 website/usage/_spacy-101/_pos-deps.jade delete mode 100644 website/usage/_spacy-101/_serialization.jade delete mode 100644 website/usage/_spacy-101/_similarity.jade delete mode 100644 website/usage/_spacy-101/_tokenization.jade delete mode 100644 website/usage/_spacy-101/_training.jade delete mode 100644 website/usage/_spacy-101/_vocab.jade delete mode 100644 website/usage/_spacy-101/_word-vectors.jade delete mode 100644 website/usage/_training/_basics.jade delete mode 100644 website/usage/_training/_ner.jade delete mode 100644 website/usage/_training/_saving-loading.jade delete mode 100644 website/usage/_training/_tagger-parser.jade delete mode 100644 website/usage/_training/_textcat.jade delete mode 100644 website/usage/_training/_tips.jade delete mode 100644 website/usage/_v2/_features.jade delete mode 100644 website/usage/_v2/_incompat.jade delete mode 100644 website/usage/_v2/_migrating.jade delete mode 100644 website/usage/_v2/_summary.jade delete mode 100644 website/usage/_vectors-similarity/_custom.jade delete mode 100644 website/usage/_vectors-similarity/_gpu.jade delete mode 100644 website/usage/_visualizers/_dep.jade delete mode 100644 website/usage/_visualizers/_ent.jade delete mode 100644 website/usage/_visualizers/_html.jade delete mode 100644 website/usage/_visualizers/_jupyter.jade delete mode 100644 website/usage/adding-languages.jade delete mode 100644 website/usage/examples.jade delete mode 100644 website/usage/facts-figures.jade delete mode 100644 website/usage/index.jade delete mode 100644 website/usage/linguistic-features.jade delete mode 100644 website/usage/models.jade delete mode 100644 website/usage/processing-pipelines.jade delete mode 100644 website/usage/spacy-101.jade delete mode 100644 website/usage/training.jade delete mode 100644 website/usage/v2.jade delete mode 100644 website/usage/vectors-similarity.jade delete mode 100644 website/usage/visualizers.jade diff --git a/.gitignore b/.gitignore index 55f3de909..ef586ac8d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,9 +5,15 @@ corpora/ keys/ # Website +website/.cache/ +website/public/ +website/node_modules +website/.npm +website/logs +*.log +npm-debug.log* website/www/ website/_deploy.sh -website/.gitignore # Cython / C extensions cythonize.json diff --git a/website/.prettierrc b/website/.prettierrc new file mode 100644 index 000000000..7555c734a --- /dev/null +++ b/website/.prettierrc @@ -0,0 +1,38 @@ +{ + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "tabWidth": 4, + "printWidth": 100, + "overrides": [ + { + "files": "*.sass", + "options": { + "printWidth": 999 + } + }, + { + "files": "*.mdx", + "options": { + "tabWidth": 2, + "printWidth": 80, + "proseWrap": "always" + } + }, + { + "files": "*.md", + "options": { + "tabWidth": 2, + "printWidth": 80, + "proseWrap": "always", + "htmlWhitespaceSensitivity": "strict" + } + }, + { + "files": "*.html", + "options": { + "htmlWhitespaceSensitivity": "strict" + } + } + ] +} diff --git a/website/404.jade b/website/404.jade deleted file mode 100644 index af4e7d0f2..000000000 --- a/website/404.jade +++ /dev/null @@ -1,12 +0,0 @@ -//- 💫 404 ERROR - -include _includes/_mixins - -+landing-header - h1.c-landing__title.u-heading-0 - | Ooops, this page#[br] - | does not exist! - - h2.c-landing__title.u-heading-3.u-padding-small - +button(false, true, "secondary-light")(href="javascript:history.go(-1)") - | Click here to go back diff --git a/website/README.md b/website/README.md index 15e73c651..7c38d0371 100644 --- a/website/README.md +++ b/website/README.md @@ -1,143 +1,559 @@ - + # spacy.io website and docs -The [spacy.io](https://spacy.io) website is implemented in [Jade (aka Pug)](https://www.jade-lang.org), and is built or served by [Harp](https://harpjs.com). 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, ["Rebuilding a Website with Modular Markup"](https://explosion.ai/blog/modular-markup). +_This page contains the documentation and styleguide for the spaCy website. Its +rendered version is available at https://spacy.io/styleguide._ +--- -## Viewing the site locally + + +The [spacy.io](https://spacy.io) website is implemented using +[Gatsby](https://www.gatsbyjs.org) with +[Remark](https://github.com/remarkjs/remark) and [MDX](https://mdxjs.com/). This +allows authoring content in **straightforward Markdown** without the usual +limitations. Standard elements can be overwritten with powerful +[React](http://reactjs.org/) components and wherever Markdown syntax isn't +enough, JSX components can be used. + +> #### Contributing to the site +> +> The docs can always use another example or more detail, and they should always +> be up to date and not misleading. We always appreciate a +> [pull request](https://github.com/explosion/spaCy/pulls). To quickly find the +> correct file to edit, simply click on the "Suggest edits" button at the bottom +> of a page. +> +> For more details on editing the site locally, see the installation +> instructions and markdown reference below. + +## Logo {#logo source="website/src/images/logo.svg"} + +import { Logos } from 'widgets/styleguide' + +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 +[spaCy badges](/usage/spacy-101#faq-project-with-spacy). + + + +## Colors {#colors} + +import { Colors, Patterns } from 'widgets/styleguide' + + + +### Patterns + + + +## Typography {#typography} + +import { H1, H2, H3, H4, H5, Label, InlineList, Comment } from +'components/typography' + +> #### Markdown +> +> ```markdown_ +> ## Headline 2 +> ## Headline 2 {#some_id} +> ## Headline 2 {#some_id tag="method"} +> ``` +> +> #### JSX +> +> ```jsx +>

Headline 2

+>

Headline 2

+>

Headline 2

+> ``` + +Headlines are set in +[HK Grotesk](http://cargocollective.com/hanken/HK-Grotesk-Open-Source-Font) by +Hanken Design. All other body text and code uses the best-matching default +system font to provide a "native" reading experience. + + + +Level 2 headings are automatically wrapped in `
` elements at compile +time, using a custom +[Markdown transformer](https://github.com/explosion/spaCy/tree/master/website/plugins/remark-wrap-section.js). +This makes it easier to highlight the section that's currently in the viewpoint +in the sidebar menu. + + + +
+

Headline 1

+

Headline 2

+

Headline 3

+

Headline 4

+
Headline 5
+ +
+ +--- + +The following optional attributes can be set on the headline to modify it. For +example, to add a tag for the documented type or mark features that have been +introduced in a specific version or require statistical models to be loaded. +Tags are also available as standalone `` components. + +| Argument | Example | Result | +| -------- | -------------------------- | ----------------------------------------- | +| `tag` | `{tag="method"}` | method | +| `new` | `{new="2"}` | 2 | +| `model` | `{model="tagger, parser"}` | tagger, parser | +| `hidden` | `{hidden="true"}` | | + +## Elements {#elements} + +### Links {#links} + +> #### Markdown +> +> ```markdown +> [I am a link](https://spacy.io) +> ``` +> +> #### JSX +> +> ```jsx +> I am a link +> ``` + +Special link styles are used depending on the link URL. + +- [I am a regular external link](https://explosion.ai) +- [I am a link to the documentation](/api/doc) +- [I am a link to GitHub](https://github.com/explosion/spaCy) + +### Abbreviations {#abbr} + +import { Abbr } from 'components/typography' + +> #### JSX +> +> ```jsx +> Abbreviation +> ``` + +Some text with an abbreviation. On small +screens, I collapse and the explanation text is displayed next to the +abbreviation. + +### Tags {#tags} + +import Tag from 'components/tag' + +> ```jsx +> method +> 2.1 +> tagger, parser +> ``` + +Tags can be used together with headlines, or next to properties across the +documentation, and combined with tooltips to provide additional information. An +optional `variant` argument can be used for special tags. `variant="new"` makes +the tag take a version number to mark new features. Using the component, +visibility of this tag can later be toggled once the feature isn't considered +new anymore. Setting `variant="model"` takes a description of model capabilities +and can be used to mark features that require a respective model to be +installed. + + + +method 2 tagger, +parser + + + +### Buttons {#buttons} + +import Button from 'components/button' + +> ```jsx +> +> +> ``` + +Link buttons come in two variants, `primary` and `secondary` and two sizes, with +an optional `large` size modifier. Since they're mostly used as enhanced links, +the buttons are implemented as styled links instead of native button elements. + + + + + + + +## Components + +### Table + +> #### Markdown +> +> ```markdown_ +> | Header 1 | Header 2 | +> | --- | --- | +> | Column 1 | Column 2 | +> ``` +> +> #### JSX +> +> ```markup +> +> +> +>
Header 1Header 2
Column 1Column 2
+> ``` + +Tables are used to present data and API documentation. Certain keywords can be +used to mark a footer row with a distinct style, for example to visualise the +return values of a documented function. + +| Header 1 | Header 2 | Header 3 | Header 4 | +| ----------- | -------- | :------: | -------: | +| Column 1 | Column 2 | Column 3 | Column 4 | +| Column 1 | Column 2 | Column 3 | Column 4 | +| Column 1 | Column 2 | Column 3 | Column 4 | +| Column 1 | Column 2 | Column 3 | Column 4 | +| **RETURNS** | Column 2 | Column 3 | Column 4 | + +### List + +> #### Markdown +> +> ```markdown_ +> 1. One +> 2. Two +> ``` +> +> #### JSX +> +> ```markup +>
    +>
  1. One
  2. +>
  3. Two
  4. +>
+> ``` + +Lists are available as bulleted and numbered. Markdown lists are transformed +automatically. + +- I am a bulleted list +- I have nice bullets +- Lorem ipsum dolor +- consectetur adipiscing elit + +1. I am an ordered list +2. I have nice numbers +3. Lorem ipsum dolor +4. consectetur adipiscing elit + +### Aside + +> #### Markdown +> +> ```markdown_ +> > #### Aside title +> > This is aside text. +> ``` +> +> #### JSX +> +> ```jsx +> +> ``` + +Asides can be used to display additional notes and content in the right-hand +column. Asides can contain text, code and other elements if needed. 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. + +To make them easier to use in Markdown, paragraphs formatted as blockquotes will +turn into asides by default. Level 4 headlines (with a leading `####`) will +become aside titles. + +### Code Block + +> #### Markdown +> +> ````markdown_ +> ```python +> ### This is a title +> import spacy +> ``` +> ```` +> +> #### JSX +> +> ```jsx +> +> import spacy +> +> ``` + +Code blocks use the [Prism](http://prismjs.com/) syntax highlighter with a +custom theme. The language can be set individually on each block, and defaults +to raw text with no highlighting. An optional label can be added as the first +line with the prefix `####` (Python-like) and `///` (JavaScript-like). the +indented block as plain text and preserve whitespace. + +```python +### Using spaCy +import spacy +nlp = spacy.load("en_core_web_sm") +doc = nlp(u"This is a sentence.") +for token in doc: + print(token.text, token.pos_) +``` + +Code blocks and also specify an optional range of line numbers to highlight by +adding `{highlight="..."}` to the headline. Acceptable ranges are spans like +`5-7`, but also `5-7,10` or `5-7,10,13-14`. + +> #### Markdown +> +> ````markdown_ +> ```python +> ### This is a title {highlight="1-2"} +> import spacy +> nlp = spacy.load("en_core_web_sm") +> ``` +> ```` + +```python +### Using the matcher {highlight="5-7"} +import spacy +from spacy.matcher import Matcher + +nlp = spacy.load('en_core_web_sm') +matcher = Matcher(nlp.vocab) +pattern = [{'LOWER': 'hello'}, {'IS_PUNCT': True}, {'LOWER': 'world'}] +matcher.add('HelloWorld', None, pattern) +doc = nlp(u'Hello, world! Hello world!') +matches = matcher(doc) +``` + +Adding `{executable="true"}` to the title turns the code into an executable +block, powered by [Binder](https://mybinder.org) and +[Juniper](https://github.com/ines/juniper). If JavaScript is disabled, the +interactive widget defaults to a regular code block. + +> #### Markdown +> +> ````markdown_ +> ```python +> ### {executable="true"} +> import spacy +> nlp = spacy.load("en_core_web_sm") +> ``` +> ```` + +```python +### {executable="true"} +import spacy +nlp = spacy.load("en_core_web_sm") +doc = nlp(u"This is a sentence.") +for token in doc: + print(token.text, token.pos_) +``` + +If a code block only contains a URL to a GitHub file, the raw file contents are +embedded automatically and syntax highlighting is applied. The link to the +original file is shown at the top of the widget. + +> #### Markdown +> +> ````markdown_ +> ```python +> https://github.com/... +> ``` +> ```` +> +> #### JSX +> +> ```jsx +> +> ``` + +```python +https://github.com/explosion/spaCy/tree/master/examples/pipeline/custom_component_countries_api.py +``` + +### Infobox + +import Infobox from 'components/infobox' + +> #### JSX +> +> ```jsx +> Regular infobox +> This is a warning. +> This is dangerous. +> ``` + +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 +`aside` element. Infoboxes can take an optional `title` argument, as well as an +optional `variant` (either `"warning"` or `"danger"`). + + + +If needed, an infobox can contain regular text, `inline code`, lists and other +blocks. + + + + + +If needed, an infobox can contain regular text, `inline code`, lists and other +blocks. + + + + + +If needed, an infobox can contain regular text, `inline code`, lists and other +blocks. + + + +### Accordion + +import Accordion from 'components/accordion' + +> #### JSX +> +> ```jsx +> +> Accordion content goes here. +> +> ``` + +Accordions are collapsible sections that are mostly used for lengthy tables, +like the tag and label annotation schemes for different languages. They all need +to be presented – but chances are the user doesn't actually care about _all_ of +them, especially not at the same time. So it's fairly reasonable to hide them +begin a click. This particular implementation was inspired by the amazing +[Inclusive Components blog](https://inclusive-components.design/collapsible-sections/). + + + +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. Nam at turpis finibus tortor +gravida sodales tincidunt sit amet est. Nullam euismod arcu in tortor auctor, +sit amet dignissim justo congue. + + + +## Setup and installation {#setup} + +Before running the setup, make sure your versions of +[Node](https://nodejs.org/en/) and [npm](https://www.npmjs.com/) are up to date. ```bash -sudo npm install --global harp +# Clone the repository git clone https://github.com/explosion/spaCy cd spaCy/website -harp server + +# Install Gatsby's command-line tool +npm install --global gatsby-cli + +# Install the dependencies +npm install + +# Start the development server +npm run dev ``` -This will serve the site on [http://localhost:9000](http://localhost:9000). +If you are planning on making edits to the site, you should also set up the +[Prettier](https://prettier.io/) code formatter. It takes care of formatting +Markdown and other files automatically. +[See here](https://prettier.io/docs/en/editors.html) for the available +extensions for your code editor. The +[`.prettierrc`](https://github.com/explosion/spaCy/tree/master/website/.prettierrc) +file in the root defines the settings used in this codebase. +## Markdown reference {#markdown} -## Making changes to the site +All page content and page meta lives in the `.md` files in the `/docs` +directory. The frontmatter block at the top of each file defines the page title +and other settings like the sidebar menu. -The docs can always use another example or more detail, and they should always be up to date and not misleading. If you see something, say something – we always appreciate a [pull request](https://github.com/explosion/spaCy/pulls). To quickly find the correct file to edit, simply click on the "Suggest edits" button at the bottom of a page. +````markdown +--- +title: Page title +--- -### File structure +## Headline starting a section {#some_id} -While all page content lives in the `.jade` files, article meta (page titles, sidebars etc.) is stored as JSON. Each folder contains a `_data.json` with all required meta for its files. +This is a regular paragraph with a [link](https://spacy.io) and **bold text**. -### Markup language and conventions +> #### This is an aside title +> +> This is aside text. -Jade/Pug is a whitespace-sensitive markup language that compiles to HTML. Indentation is used to nest elements, and for template logic, like `if`/`else` or `for`, mainly used to iterate over objects and arrays in the meta data. It also allows inline JavaScript expressions. +### Subheadline -For an overview of Harp and Jade, see [this blog post](https://ines.io/blog/the-ultimate-guide-static-websites-harp-jade). For more info on the Jade/Pug syntax, check out their [documentation](https://pugjs.org). +| Header 1 | Header 2 | +| -------- | -------- | +| Column 1 | Column 2 | -In the [spacy.io](https://spacy.io) source, we use 4 spaces to indent and hard-wrap at 80 characters. - -```pug -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]. +```python +### Code block title {highlight="2-3"} +import spacy +nlp = spacy.load("en_core_web_sm") +doc = nlp("Hello world") ``` -Note that for external links, `+a("...")` is used instead of `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. The only plain HTML elements we use are: + -| Element | Description | -| --- | --- | -| `p` | paragraphs | -| `code` | inline `code` | -| `em` | *italicized* text | -| `strong` | **bold** text | +This is content in the infobox. -### Mixins + +```` -Each file includes a collection of [custom mixins](_includes/_mixins.jade) that make it easier to add content components – no HTML or class names required. +In addition to the native markdown elements, you can use the components +[``][infobox], [``][accordion], [``][abbr] and +[``][tag] via their JSX syntax. -For example: -```pug -//- Bulleted list +[infobox]: https://spacy.io/styleguide#infobox +[accordion]: https://spacy.io/styleguide#accordion +[abbr]: https://spacy.io/styleguide#abbr +[tag]: https://spacy.io/styleguide#tag -+list - +item This is a list item. - +item This is another list item. +## Project structure {#structure} -//- Table with header - -+table([ "Header one", "Header two" ]) - +row - +cell Table cell - +cell Another one - - +row - +cell And one more. - +cell And the last one. - -//- Headlines with optional permalinks - -+h(2, "link-id") Headline 2 with link to #link-id +```yaml +### Directory structure +├── docs # the actual markdown content +├── meta # JSON-formatted site metadata +| ├── languages.json # supported languages and statistical models +| ├── logos.json # logos and links for landing page +| ├── sidebars.json # sidebar navigations for different sections +| ├── site.json # general site metadata +| └── universe.json # data for the spaCy universe section +├── public # compiled site +├── src # source +| ├── components # React components +| ├── fonts # webfonts +| ├── images # images used in the layout +| ├── plugins # custom plugins to transform Markdown +| ├── styles # CSS modules and global styles +| ├── templates # page layouts +| | ├── docs.js # layout template for documentation pages +| | ├── index.js # global layout template +| | ├── models.js # layout template for model pages +| | └── universe.js # layout templates for universe +| └── widgets # non-reusable components with content, e.g. changelog +├── gatsby-browser.js # browser-specific hooks for Gatsby +├── gatsby-config.js # Gatsby configuration +├── gatsby-node.js # Node-specific hooks for Gatsby +└── package.json # package settings and dependencies ``` - -Code blocks are implemented using `+code` or `+aside-code` (to display them in the right sidebar). A `.` is added after the mixin call to preserve whitespace: - -```pug -+code("This is a label"). - import spacy - en_nlp = spacy.load('en') - en_doc = en_nlp(u'Hello, world. Here are two sentences.') -``` - -You can find the documentation for the available mixins in [`_includes/_mixins.jade`](_includes/_mixins.jade). - -### Helpers for linking to content - -Aside from the `+a()` mixin, there are three other helpers to make linking to content more convenient. - -#### Linking to GitHub - -Since GitHub links can be long and tricky, you can use the `gh()` function to generate them automatically for spaCy and all repositories owned by [explosion](https://github.com/explosion): - -```javascript -// Syntax: gh(repo, [file], [branch]) - -gh("spaCy", "spacy/matcher.pyx") -// https://github.com/explosion/spaCy/blob/master/spacy/matcher.pyx - -``` - -#### Linking to source - -`+src()` generates a link with a little source icon to indicate it's linking to a code source. Ideally, it's used in combination with `gh()`: - -```pug -+src(gh("spaCy", "spacy/matcher.pyx")) matcher.pxy -``` - -#### Linking to API reference - -`+api()` generates a link to a page in the API docs, with an added icon. It should only be used across the workflows in the usage section, and only on the first mention of the respective class. - -It takes the slug of an API page as the argument. You can also use anchors to link to specific sections – they're usually the method or property names. - -```pug -+api("tokenizer") #[code Tokenizer] -+api("doc#similarity") #[code Doc.similarity()] -``` - -### Most common causes of compile errors - -| Problem | Fix | -| --- | --- | -| JSON formatting errors | make sure last elements of objects don't end with commas and/or use a JSON linter | -| unescaped characters like `<` or `>` and sometimes `'` in inline elements | replace with encoded version: `<`, `>` etc. | -| "Cannot read property 'call' of undefined" / "foo is not a function" | make sure mixin names are spelled correctly and mixins file is included with the correct path | -| "no closing bracket found" | make sure inline elements end with a `]`, like `#[code spacy.load('en')]` and for nested inline elements, make sure they're all on the same line and contain spaces between them (**bad:** `#[+api("doc")#[code Doc]]`) | - -If Harp fails and throws a Jade error, don't take the reported line number at face value – it's often wrong, as the page is compiled from templates and several files. diff --git a/website/_data.json b/website/_data.json deleted file mode 100644 index 573d18ba0..000000000 --- a/website/_data.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "index": { - "landing": true, - "logos": [ - { - "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 ] - }, - { - "chartbeat": [ "https://chartbeat.com", 180, 25 ], - "allenai": [ "https://allenai.org", 220, 37 ] - } - ], - "features": [ - { - "recode": ["https://www.recode.net/2017/6/22/15855492/ai-artificial-intelligence-nonprofit-good-human-chatbots-machine-learning", 100, 25], - "wapo": ["https://www.washingtonpost.com/news/wonk/wp/2016/05/18/googles-new-artificial-intelligence-cant-understand-these-sentences-can-you/", 100, 77], - "bbc": ["http://www.bbc.co.uk/rd/blog/2017-08-irfs-weeknotes-number-250", 90, 26], - "microsoft": ["https://www.microsoft.com/developerblog/2016/09/13/training-a-classifier-for-relation-extraction-from-medical-literature/", 130, 28] - }, - { - "venturebeat": ["https://venturebeat.com/2017/01/27/4-ai-startups-that-analyze-customer-reviews/", 150, 19], - "thoughtworks": ["https://www.thoughtworks.com/radar/tools", 150, 28] - } - ] - }, - - "robots.txt": { - "layout": false - }, - - "404": { - "title": "404 Error", - "landing": true - }, - - "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 deleted file mode 100644 index 9c4d155c6..000000000 --- a/website/_harp.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "globals": { - "title": "spaCy", - "description": "spaCy is a free open-source library for Natural Language Processing in Python. It features NER, POS tagging, dependency parsing, word vectors and more.", - - "SITENAME": "spaCy", - "SLOGAN": "Industrial-strength Natural Language Processing in Python", - "SITE_URL": "https://spacy.io", - "EMAIL": "contact@explosion.ai", - - "COMPANY": "Explosion AI", - "COMPANY_URL": "https://explosion.ai", - "DEMOS_URL": "https://explosion.ai/demos", - "MODELS_REPO": "explosion/spacy-models", - - "SPACY_VERSION": "2.1", - "BINDER_VERSION": "2.0.16", - - "SOCIAL": { - "twitter": "spacy_io", - "github": "explosion", - "reddit": "spacynlp", - "codepen": "explosion", - "gitter": "explosion/spaCy" - }, - - "NAVIGATION": { - "Usage": "/usage", - "Models": "/models", - "API": "/api", - "Universe": "/universe" - }, - - "FOOTER": { - "spaCy": { - "Usage": "/usage", - "Models": "/models", - "API Reference": "/api", - "Universe": "/universe" - }, - "Support": { - "Issue Tracker": "https://github.com/explosion/spaCy/issues", - "Stack Overflow": "http://stackoverflow.com/questions/tagged/spacy", - "Reddit Usergroup": "https://www.reddit.com/r/spacynlp/", - "Gitter Chat": "https://gitter.im/explosion/spaCy" - }, - "Connect": { - "Twitter": "https://twitter.com/spacy_io", - "GitHub": "https://github.com/explosion/spaCy", - "Blog": "https://explosion.ai/blog", - "Contact": "mailto:contact@explosion.ai" - } - }, - - "QUICKSTART": [ - { "id": "os", "title": "Operating system", "options": [ - { "id": "mac", "title": "macOS / OSX", "checked": true }, - { "id": "windows", "title": "Windows" }, - { "id": "linux", "title": "Linux" }] - }, - { "id": "package", "title": "Package manager", "options": [ - { "id": "pip", "title": "pip", "checked": true }, - { "id": "conda", "title": "conda" }, - { "id": "source", "title": "from source" }] - }, - { "id": "python", "title": "Python version", "options": [ - { "id": 2, "title": "2.x" }, - { "id": 3, "title": "3.x", "checked": true }] - }, - { "id": "config", "title": "Configuration", "multiple": true, "options": [ - {"id": "venv", "title": "virtualenv", "help": "Use a virtual environment and install spaCy into a user directory" }] - }, - { "id": "model", "title": "Models", "multiple": true } - ], - - "QUICKSTART_MODELS": [ - { "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." }] - }, - { "id": "config", "title": "Options", "multiple": true, "options": [ - { "id": "example", "title": "Show usage example" }] - } - ], - - "V_CSS": "2.2.1", - "V_JS": "2.2.4", - "DEFAULT_SYNTAX": "python", - "ANALYTICS": "UA-58931649-1", - "MAILCHIMP": { - "user": "spacy.us12", - "id": "83b0498b1e7fa3c91ce68c3f1", - "list": "89ad33e698" - } - } -} diff --git a/website/_includes/_footer.jade b/website/_includes/_footer.jade deleted file mode 100644 index 4d0d34cb5..000000000 --- a/website/_includes/_footer.jade +++ /dev/null @@ -1,28 +0,0 @@ -//- 💫 INCLUDES > FOOTER - -footer.o-footer.u-text - +grid.o-content - each group, label in FOOTER - +grid-col("quarter") - ul - li.u-text-label.u-color-subtle=label - - each url, item in group - li - +a(url)=item - - if SECTION == "index" - +grid-col("quarter") - include _newsletter - - 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)(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 deleted file mode 100644 index a80fd716d..000000000 --- a/website/_includes/_functions.jade +++ /dev/null @@ -1,95 +0,0 @@ -//- 💫 INCLUDES > FUNCTIONS - -//- Descriptive variables, available in the global scope - -- CURRENT = current.source -- SECTION = current.path[0] -- 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 - 1 - -- MODEL_META = public.models._data.MODEL_META -- MODEL_LICENSES = public.models._data.MODEL_LICENSES -- MODEL_BENCHMARKS = public.models._data.MODEL_BENCHMARKS -- EXAMPLE_SENT_LANGS = public.models._data.EXAMPLE_SENT_LANGS -- 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 - -//- Get page URL - -- function getPageUrl() { -- var path = current.path; -- if(path[path.length - 1] == 'index') path = path.slice(0, path.length - 1); -- return `${SITE_URL}/${path.join('/')}`; -- } - -//- Get pretty page title depending on section - -- function getPageTitle() { -- var sections = ['api', 'usage', 'models']; -- if (sections.includes(SECTION)) { -- var titleSection = (SECTION == "api") ? 'API' : SECTION.charAt(0).toUpperCase() + SECTION.slice(1); -- return `${title} · ${SITENAME} ${titleSection} Documentation`; -- } -- else if (SECTION != 'index') return `${title} · ${SITENAME}`; -- return `${SITENAME} · ${SLOGAN}`; -- } - -//- Get social image based on section and settings - -- function getPageImage() { -- var img = (SECTION == 'api') ? 'api' : 'default'; -- return `${SITE_URL}/assets/img/social/preview_${preview || img}.jpg`; -- } - -//- 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(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]; -- } -- 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 : '' ); -- } diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade deleted file mode 100644 index ab995ceee..000000000 --- a/website/_includes/_mixins.jade +++ /dev/null @@ -1,749 +0,0 @@ -//- 💫 INCLUDES > MIXINS - -include _functions - - -//- Section - id - [string] anchor assigned to section (used for breadcrumb navigation) - -mixin section(id) - section.o-section(id=id ? "section-" + id : null data-section=id)&attributes(attributes) - block - - -//- Accordion (collapsible sections) - title - [string] Section title. - id - [string] Optional section ID for permalinks. - level - [integer] Headline level for section title. - -mixin accordion(title, id, level) - section.o-accordion.o-block - +h(level || 4).o-no-block(id=id) - button.o-accordion__button.o-grid.o-grid--vcenter.o-grid--space.js-accordion(aria-expanded="false")=title - svg.o-accordion__icon(width="20" height="20" viewBox="0 0 10 10" aria-hidden="true" focusable="false") - rect.o-accordion__hide(height="8" width="2" y="1" x="4") - rect(height="2" width="8" y="4" x="1") - - .o-accordion__content(hidden="") - 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 - level - [integer] headline level, corresponds to h1, h2, h3 etc. - id - [string] unique identifier, creates permalink (optional) - -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] - - -//- 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 - info: https://mathiasbynens.github.io/rel-noopener/ - -mixin a(url, trusted) - - external = url.includes("http") - a(href=url target=external ? "_blank" : null rel=external && !trusted ? "noopener nofollow" : null)&attributes(attributes) - block - - -//- Source link (with added icon for "code") - url - [string] link href, can also be gh() function to generate GitHub link - see _functions.jade for more info - -mixin src(url) - span.u-inline-block.u-nowrap - +a(url) - block - - | #[+icon("code", 16).o-icon--inline.u-color-theme] - - -//- API link (with added tag and automatically generated path) - path - [string] path to API docs page relative to /api/ - -mixin api(path) - - path = convertAPIPath(path) - +a("/api/" + path, true)(target="_self").u-no-border.u-inline-block.u-nowrap - block - - | #[+icon("book", 16).o-icon--inline.u-color-theme] - - -//- Help icon with tooltip - tooltip - [string] Tooltip text - icon_size - [integer] Optional size of help icon in px. - -mixin help(tooltip, icon_size) - span(data-tooltip=tooltip)&attributes(attributes) - if tooltip - span.u-hidden(aria-role="tooltip")=tooltip - +icon("help_o", icon_size || 16).o-icon--inline - - -//- Abbreviation - -mixin abbr(title) - abbr.o-abbr(data-tooltip=title data-tooltip-style="code" aria-label=title)&attributes(attributes) - block - -//- Aside wrapper - label - [string] aside label - -mixin aside-wrapper(label, emoji) - aside.c-aside - .c-aside__content(role="complementary")&attributes(attributes) - if label - h4.u-text-label.u-text-label--dark - if emoji - span.o-emoji=emoji - | #{label} - block - - -//- Aside for text - label - [string] aside title (optional) - -mixin aside(label, emoji) - +aside-wrapper(label, emoji) - .c-aside__text.u-text-small&attributes(attributes) - block - - -//- Aside for code - 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, prompt) - +aside-wrapper(label)&attributes(attributes) - +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, emoji) - aside.o-box.o-block.u-text-small&attributes(attributes) - if 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] - - -//- 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 - trusted - [boolean] if not set / false, rel="noopener nofollow" is added - info: https://mathiasbynens.github.io/rel-noopener/ - ...style - all other arguments are added as class names c-button--argument - see assets/css/_components/_buttons.sass - -mixin button(url, trusted, ...style) - - 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 - - -//- Code block - 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. "$" - 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, icon, wrap) - - var lang = (language != "none") ? (language || DEFAULT_SYNTAX) : null - - var lang_class = (language != "none") ? "lang-" + (language || DEFAULT_SYNTAX) : null - pre.c-code-block.o-block(data-language=lang class=lang_class 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 - 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(class=wrap ? "u-wrap" : null data-prompt=prompt) - block - -//- Executable code - -mixin code-exec(label, large) - - label = (label || "Editable code example") + " (experimental)" - +terminal-wrapper(label, !large) - figure.juniper-wrapper - span.juniper-wrapper__text.u-text-tiny v#{BINDER_VERSION} · Python 3 · via #[+a("https://mybinder.org/").u-hide-link Binder] - +code(data-executable="true")&attributes(attributes) - block - -//- Wrapper for code blocks to display old/new versions - -mixin code-wrapper() - span.u-inline-block.u-padding-top.u-width-full - block - -//- Code blocks to display old/new versions - label - [string] ARIA label for block. Defaults to "correct"/"incorrect". - -mixin code-old(label, lang, prompt) - - var label = label || 'incorrect' - +code(false, lang, prompt, false, "reject").o-block-small(aria-label=label) - block - -mixin code-new(label, lang, prompt) - - var label = label || 'correct' - +code(false, lang, prompt, false, "accept").o-block-small(aria-label=label) - block - - -//- CodePen embed - slug - [string] ID of CodePen demo (taken from URL) - height - [integer] height of demo embed iframe - default_tab - [string] code tab(s) visible on load (default: "result") - -mixin codepen(slug, height, default_tab) - figure.o-block(style="min-height: #{height}px")&attributes(attributes) - .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, height, alt_file, language) - - 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}"). - Can't fetch code example from GitHub :( - - Please use the link below to view the example. If you've come across - a broken link, we always appreciate a pull request to the repository, - or a report on the issue tracker. Thanks! - - footer.o-grid.u-text - .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 - - -//- Youtube video embed - id - [string] ID of YouTube video. - ratio - [string] Video ratio, "16x9" or "4x3". - -mixin youtube(id, ratio) - figure.o-video.o-block(class="o-video--" + (ratio || "16x9")) - iframe.o-video__iframe(src="https://www.youtube.com/embed/#{id}" frameborder="0" height="500" allowfullscreen) - - -//- Images / figures - url - [string] url or path to image - width - [integer] image width in px, for better rendering (default: 500) - caption - [string] image caption - alt - [string] alternative image text, defaults to caption - -mixin image(url, width, caption, alt) - figure.o-block&attributes(attributes) - if url - img(src=url alt=(alt || caption) width="#{width || 500}") - - if caption - +image-caption=caption - - block - - -//- Image caption - -mixin image-caption() - figcaption.u-text-small.u-color-subtle.u-padding-small&attributes(attributes) - block - - -//- 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 - - -//- 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() - .u-text-label.u-color-dark&attributes(attributes) - block - - -mixin label-inline() - strong.u-text-label.u-color-dark&attributes(attributes) - block - - -//- Tag - tooltip - [string] optional tooltip text. - hide_icon - [boolean] hide tooltip icon - -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 - ...capabs - [string] Required model capabilities, e.g. "vectors". - -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(intro + ext + ".") Needs model - - -//- "New" tag to label features new in a specific version - By using a separate mixin with a version ID, it becomes easy to quickly - enable/disable tags without having to modify the markup in the docs. - version - [string or integer] version number, without "v" prefix - -mixin tag-new(version) - - var version = (typeof version == 'number') ? version.toFixed(1) : version - - var tooltip = "This feature is new and was introduced in spaCy v" + version - +tag(tooltip, true) v#{version} - - -//- List - type - [string] "numbers", "letters", "roman" (bulleted list if none set) - start - [integer] start number - -mixin list(type, start) - if type - ol.c-list.o-block.u-text(class="c-list--#{type}" style=(start === 0 || start) ? "counter-reset: li #{(start - 1)}" : null)&attributes(attributes) - block - - else - ul.c-list.c-list--bullets.o-block.u-text&attributes(attributes) - block - - -//- List item (only used within +list) - -mixin item() - li.c-list__item&attributes(attributes) - block - - -//- Table - head - [array] table headings (should match number of columns) - -mixin table(head) - table.c-table.o-block&attributes(attributes) - - if head - +row("head") - each column in head - +head-cell=column - - block - - -//- Table row (only used within +table) - -mixin row(...style) - tr.c-table__row(class=prefixArgs(style, "c-table__row"))&attributes(attributes) - block - - - -//- Header table cell (only used within +row) - -mixin head-cell() - th.c-table__head-cell.u-text-label&attributes(attributes) - block - - -//- Table cell (only used within +row in +table) - -mixin cell(...style) - td.c-table__cell.u-text(class=prefixArgs(style, "c-table__cell"))&attributes(attributes) - block - - -//- Grid Container - ...style - all arguments are added as class names o-grid--argument - see assets/css/_base/_grid.sass - -mixin grid(...style) - .o-grid.o-block(class=prefixArgs(style, "o-grid"))&attributes(attributes) - block - - -//- Grid Column (only used within +grid) - width - [string] "quarter", "third", "half", "two-thirds", "three-quarters" - see $grid in assets/css/_variables.sass - -mixin grid-col(...style) - .o-grid__col(class=prefixArgs(style, "o-grid__col"))&attributes(attributes) - block - - -//- Card (only used within +grid) - 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, 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} - - -//- 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 - - -//- Bibliography - id - [string] ID of bibliography component, for anchor links. Can be used if - there's more than one bibliography on one page. - -mixin bibliography(id) - section(id=id || "bibliography") - +infobox - +label.o-block-small Bibliography - +list("numbers").u-text-small.o-no-block - block - - -//- 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 - -mixin pos-row(tag, pos, morph, desc) - +row - +cell #[code(class=(tag.length > 10) ? "u-break u-break--all" : null)=tag] - +cell #[code=pos] - +cell - - var morphs = morph.includes("|") ? morph.split("|") : morph.split(" ") - for m in morphs - if m - | #[code=m] - +cell.u-text-small=desc - -mixin ud-row(tag, desc, example) - +row - +cell #[code=tag] - +cell.u-text-small=desc - if example - +cell.u-text-small - em=example - -mixin dep-row(label, desc) - +row - +cell #[code=label] - +cell=desc - - -//- Table rows for linguistic annotations - annots [array] - array of cell content - style [array] array of 1 (display as code) or 0 (display as text) - -mixin annotation-row(annots, style) - +row - for cell, i in annots - if style && style[i] - - cell = (typeof(cell) != 'boolean') ? cell : cell ? 'True' : 'False' - +cell #[code=cell] - 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-wrapper(label, small) - .x-terminal(class=small ? "x-terminal--small" : null) - .x-terminal__icons(class=small ? "x-terminal__icons--small" : null): span - .u-padding-small.u-text-center(class=small ? "u-text-tiny" : "u-text") - strong=label - block - -mixin terminal(label, button_text, button_url, exec) - +terminal-wrapper(label) - +code.x-terminal__code(data-executable=exec ? "" : null) - block - - if button_text && button_url - +button(button_url, true, "primary", "small").x-terminal__button=button_text - - -//- 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 as soon as - | possible. 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") issue tracker]! - - -//- Legacy docs - -mixin legacy() - +aside("Looking for the old docs?", "📖") - | To help you make the transition from v1.x to v2.0, we've uploaded the - | old website to #[strong #[+a("https://legacy.spacy.io/docs") legacy.spacy.io]]. - | Wherever possible, the new docs also include notes on features that have - | changed in v2.0, and features that were introduced in the new version. diff --git a/website/_includes/_navigation.jade b/website/_includes/_navigation.jade deleted file mode 100644 index 71868987a..000000000 --- a/website/_includes/_navigation.jade +++ /dev/null @@ -1,16 +0,0 @@ -//- 💫 INCLUDES > TOP NAVIGATION - -nav.c-nav.u-text.js-nav(class=landing ? "c-nav--theme" : null) - a(href="/" aria-label=SITENAME) #[+logo] - - ul.c-nav__menu - - var current_url = '/' + current.path[0] - each url, item in NAVIGATION - - var is_active = (current_url == url) - li.c-nav__menu__item(class=is_active ? "is-active" : null) - +a(url)(tabindex=is_active ? "-1" : null)=item - - li.c-nav__menu__item - +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 deleted file mode 100644 index 352cb7c36..000000000 --- a/website/_includes/_newsletter.jade +++ /dev/null @@ -1,16 +0,0 @@ -//- 💫 INCLUDES > NEWSLETTER - -ul.o-block-small - li.u-text-label.u-color-subtle Stay in the loop! - li Receive updates about new releases, tutorials and more. - -form.o-grid#mc-embedded-subscribe-form(action="//#{MAILCHIMP.user}.list-manage.com/subscribe/post?u=#{MAILCHIMP.id}&id=#{MAILCHIMP.list}" method="post" name="mc-embedded-subscribe-form" target="_blank" novalidate) - - //- MailChimp spam protection - div(style="position: absolute; left: -5000px;" aria-hidden="true") - input(type="text" name="b_#{MAILCHIMP.id}_#{MAILCHIMP.list}" tabindex="-1" value="") - - .o-grid-col.o-grid.o-grid--nowrap.o-field.u-padding-small - div - 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 deleted file mode 100644 index 6295491a6..000000000 --- a/website/_includes/_page-docs.jade +++ /dev/null @@ -1,54 +0,0 @@ -//- 💫 INCLUDES > DOCS PAGE TEMPLATE - -- 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 - +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 - .o-block.u-text-right - +button(gh("spacy", source), false, "secondary", "small").u-nowrap - | Source #[+icon("code", 14)] - - if IS_MODELS - include _page_models - else - !=yield - - +grid.o-content.u-text - +grid-col("half") - if !IS_MODELS - .o-inline-list - +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 - 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") - - include _footer diff --git a/website/_includes/_page_models.jade b/website/_includes/_page_models.jade deleted file mode 100644 index fc49bdb85..000000000 --- a/website/_includes/_page_models.jade +++ /dev/null @@ -1,109 +0,0 @@ -//- 💫 INCLUDES > MODELS PAGE TEMPLATE - -for id in CURRENT_MODELS - - var comps = getModelComponents(id) - +section(id) - section(data-vue=id data-model=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")(v-bind:href="releaseUrl") - | Release details - .u-padding-small Latest: #[code(v-text="version") n/a] - - +aside-code("Installation", "bash", "$"). - python -m spacy download #{id} - - p(v-if="description" v-text="description") - - +infobox(v-if="error") - | 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.o-block-small(v-bind:data-loading="loading") - +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(v-text="sizeFull" v-if="sizeFull")] #[em(v-else="") n/a] - - +row(v-if="pipeline && pipeline.length" v-cloak="") - +cell - +label Pipeline #[+help(MODEL_META.pipeline).u-color-subtle] - +cell - span(v-for="(pipe, index) in pipeline" v-if="pipeline") - code(v-text="pipe") - span(v-if="index != pipeline.length - 1") ,  - - +row(v-if="vectors" v-cloak="") - +cell - +label Vectors #[+help(MODEL_META.vectors).u-color-subtle] - +cell(v-text="vectors") - - +row(v-if="sources && sources.length" v-cloak="") - +cell - +label Sources #[+help(MODEL_META.sources).u-color-subtle] - +cell - span(v-for="(source, index) in sources") {{ source }} - span(v-if="index != sources.length - 1") ,  - - +row(v-if="author" v-cloak="") - +cell #[+label Author] - +cell - +a("")(v-bind:href="url" v-if="url" v-text="author") - span(v-else="" v-text="author") {{ model.author }} - - +row(v-if="license" v-cloak="") - +cell #[+label License] - +cell - +a("")(v-bind:href="modelLicenses[license]" v-if="modelLicenses[license]") {{ license }} - span(v-else="") {{ license }} - - +row(v-cloak="") - +cell #[+label Compat #[+help(MODEL_META.compat).u-color-subtle]] - +cell - .o-field.u-float-left - select.o-field__select.u-text-small(v-model="spacyVersion") - option(v-for="version in orderedCompat" v-bind:value="version") spaCy v{{ version }} - code(v-if="compatVersion" v-text="compatVersion") - em(v-else="") not compatible - - +grid.o-block-small(v-cloak="" v-if="hasAccuracy") - for keys, label in MODEL_BENCHMARKS - .u-flex-full.u-padding-small - +table.o-block-small - +row("head") - +head-cell(colspan="2")=(MODEL_META["benchmark_" + label] || label) - for label, field in keys - +row - +cell.u-nowrap - +label=label - if MODEL_META[field] - | #[+help(MODEL_META[field]).u-color-subtle] - +cell("num") - span(v-if="#{field}" v-text="#{field}") - em(v-if="!#{field}") n/a - - p.u-text-small.u-color-dark(v-if="notes" v-text="notes" v-cloak="") - - if comps.size == "sm" && EXAMPLE_SENT_LANGS.includes(comps.lang) - section - +code-exec("Test the model live"). - import spacy - from spacy.lang.#{comps.lang}.examples import sentences - - nlp = spacy.load('#{id}') - doc = nlp(sentences[0]) - print(doc.text) - for token in doc: - print(token.text, token.pos_, token.dep_) diff --git a/website/_includes/_scripts.jade b/website/_includes/_scripts.jade deleted file mode 100644 index c486cfa84..000000000 --- a/website/_includes/_scripts.jade +++ /dev/null @@ -1,28 +0,0 @@ -//- 💫 INCLUDES > SCRIPTS - -- scripts = ["vendor/prism.min", "vendor/vue.min"] -- if (SECTION == "universe") scripts.push("vendor/vue-markdown.min") -- if (quickstart) scripts.push("vendor/quickstart.min") -- if (IS_PAGE) scripts.push("vendor/in-view.min") -- if (IS_PAGE || SECTION == "index") scripts.push("vendor/juniper.min") - -for script in scripts - script(src="/assets/js/" + script + ".js") -script(src="/assets/js/main.js?v#{V_JS}" type=(environment == "deploy") ? null : "module") - -if environment == "deploy" - script(src="https://www.google-analytics.com/analytics.js", async) - script - | 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(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer) - script - | ((window.gitter = {}).chat = {}).options = { - | useStyles: false, - | activationElement: '.js-gitter-button', - | targetElement: '.js-gitter', - | room: '!{SOCIAL.gitter}' - | }; diff --git a/website/_includes/_sidebar.jade b/website/_includes/_sidebar.jade deleted file mode 100644 index 6bce6630c..000000000 --- a/website/_includes/_sidebar.jade +++ /dev/null @@ -1,23 +0,0 @@ -//- 💫 INCLUDES > SIDEBAR - -menu.c-sidebar.js-sidebar.u-text - if sidebar_content - 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 - - var is_current = CURRENT == url || (CURRENT == "index" && url == "./") - li.c-sidebar__item - +a(url)(class=is_current ? "is-active" : null tabindex=is_current ? "-1" : null data-sidebar-active=is_current ? "" : 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) - +a("#section-" + id)=title diff --git a/website/_includes/_svg.jade b/website/_includes/_svg.jade deleted file mode 100644 index b7b988db9..000000000 --- a/website/_includes/_svg.jade +++ /dev/null @@ -1,180 +0,0 @@ -//- 💫 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_twitter(viewBox="0 0 30 32") - path(d="M28.929 7.286q-1.196 1.75-2.893 2.982 0.018 0.25 0.018 0.75 0 2.321-0.679 4.634t-2.063 4.437-3.295 3.759-4.607 2.607-5.768 0.973q-4.839 0-8.857-2.589 0.625 0.071 1.393 0.071 4.018 0 7.161-2.464-1.875-0.036-3.357-1.152t-2.036-2.848q0.589 0.089 1.089 0.089 0.768 0 1.518-0.196-2-0.411-3.313-1.991t-1.313-3.67v-0.071q1.214 0.679 2.607 0.732-1.179-0.786-1.875-2.054t-0.696-2.75q0-1.571 0.786-2.911 2.161 2.661 5.259 4.259t6.634 1.777q-0.143-0.679-0.143-1.321 0-2.393 1.688-4.080t4.080-1.688q2.5 0 4.214 1.821 1.946-0.375 3.661-1.393-0.661 2.054-2.536 3.179 1.661-0.179 3.321-0.893z") - - symbol#svg_website(viewBox="0 0 32 32") - path(d="M22.658 10.988h5.172c0.693 1.541 1.107 3.229 1.178 5.012h-5.934c-0.025-1.884-0.181-3.544-0.416-5.012zM20.398 3.896c2.967 1.153 5.402 3.335 6.928 6.090h-4.836c-0.549-2.805-1.383-4.799-2.092-6.090zM16.068 9.986v-6.996c1.066 0.047 2.102 0.216 3.092 0.493 0.75 1.263 1.719 3.372 2.33 6.503h-5.422zM9.489 22.014c-0.234-1.469-0.396-3.119-0.421-5.012h5.998v5.012h-5.577zM9.479 10.988h5.587v5.012h-6.004c0.025-1.886 0.183-3.543 0.417-5.012zM11.988 3.461c0.987-0.266 2.015-0.435 3.078-0.469v6.994h-5.422c0.615-3.148 1.591-5.265 2.344-6.525zM3.661 9.986c1.551-2.8 4.062-4.993 7.096-6.131-0.715 1.29-1.559 3.295-2.114 6.131h-4.982zM8.060 16h-6.060c0.066-1.781 0.467-3.474 1.158-5.012h5.316c-0.233 1.469-0.39 3.128-0.414 5.012zM8.487 22.014h-5.29c-0.694-1.543-1.139-3.224-1.204-5.012h6.071c0.024 1.893 0.188 3.541 0.423 5.012zM8.651 23.016c0.559 2.864 1.416 4.867 2.134 6.142-3.045-1.133-5.557-3.335-7.11-6.142h4.976zM15.066 23.016v6.994c-1.052-0.033-2.067-0.199-3.045-0.46-0.755-1.236-1.736-3.363-2.356-6.534h5.401zM21.471 23.016c-0.617 3.152-1.592 5.271-2.344 6.512-0.979 0.271-2.006 0.418-3.059 0.465v-6.977h5.403zM16.068 17.002h5.998c-0.023 1.893-0.188 3.542-0.422 5.012h-5.576v-5.012zM22.072 16h-6.004v-5.012h5.586c0.235 1.469 0.393 3.126 0.418 5.012zM23.070 17.002h5.926c-0.066 1.787-0.506 3.468-1.197 5.012h-5.152c0.234-1.471 0.398-3.119 0.423-5.012zM27.318 23.016c-1.521 2.766-3.967 4.949-6.947 6.1 0.715-1.276 1.561-3.266 2.113-6.1h4.834z") - - 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_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") - - 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 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") - - 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") - - symbol#svg_prodigy(viewBox="0 0 538.5 157.6") - path(fill="currentColor" d="M70.6 48.6c7 7.3 10.5 17.1 10.5 29.2S77.7 99.7 70.6 107c-6.9 7.3-15.9 11.1-27 11.1-9.4 0-16.8-2.7-21.7-8.2v44.8H0V39h20.7v8.1c4.8-6.4 12.4-9.6 22.9-9.6 11.1 0 20.1 3.7 27 11.1zM21.9 76v3.6c0 12.1 7.3 19.8 18.3 19.8 11.2 0 18.7-7.9 18.7-21.6s-7.5-21.6-18.7-21.6c-11 0-18.3 7.7-18.3 19.8zM133.8 59.4c-12.6 0-20.5 7-20.5 17.8v39.3h-22V39h21.1v8.8c4-6.4 11.2-9.6 21.3-9.6v21.2zM209.5 107.1c-7.6 7.3-17.5 11.1-29.5 11.1s-21.9-3.8-29.7-11.1c-7.6-7.5-11.5-17.2-11.5-29.2 0-12.1 3.9-21.9 11.5-29.2 7.8-7.3 17.7-11.1 29.7-11.1s21.9 3.8 29.5 11.1c7.8 7.3 11.7 17.1 11.7 29.2 0 11.9-3.9 21.7-11.7 29.2zM180 56.2c-5.7 0-10.3 1.9-13.8 5.8-3.5 3.8-5.2 9-5.2 15.7 0 6.7 1.8 12 5.2 15.7 3.4 3.8 8.1 5.7 13.8 5.7s10.3-1.9 13.8-5.7 5.2-9 5.2-15.7c0-6.8-1.8-12-5.2-15.7-3.5-3.8-8.1-5.8-13.8-5.8zM313 116.5h-20.5v-7.9c-4.4 5.5-12.7 9.6-23.1 9.6-10.9 0-19.9-3.8-27-11.1C235.5 99.7 232 90 232 77.8s3.5-21.9 10.3-29.2c7-7.3 16-11.1 27-11.1 9.7 0 17.1 2.7 21.9 8.2V0H313v116.5zm-58.8-38.7c0 13.6 7.5 21.4 18.7 21.4 10.9 0 18.3-7.3 18.3-19.8V76c0-12.2-7.3-19.8-18.3-19.8-11.2 0-18.7 8-18.7 21.6zM354.1 13.6c0 3.6-1.3 6.8-3.9 9.3-5 4.9-13.6 4.9-18.6 0-8.4-7.5-1.6-23.1 9.3-22.5 7.4 0 13.2 5.9 13.2 13.2zm-2.2 102.9H330V39h21.9v77.5zM425.1 47.1V39h20.5v80.4c0 11.2-3.6 20.1-10.6 26.8-7 6.7-16.6 10-28.5 10-23.4 0-36.9-11.4-39.9-29.8l21.7-.8c1 7.6 7.6 12 17.4 12 11.2 0 18.1-5.8 18.1-16.6v-11.1c-5.1 5.5-12.5 8.2-21.9 8.2-10.9 0-19.9-3.8-27-11.1-6.9-7.3-10.3-17.1-10.3-29.2s3.5-21.9 10.3-29.2c7-7.3 16-11.1 27-11.1 10.7 0 18.4 3.1 23.2 9.6zm-38.3 30.7c0 13.6 7.5 21.6 18.7 21.6 11 0 18.3-7.6 18.3-19.8V76c0-12.2-7.3-19.8-18.3-19.8-11.2 0-18.7 8-18.7 21.6zM488.8 154.8H465l19.8-45.1L454.5 39h24.1l17.8 46.2L514.2 39h24.3l-49.7 115.8z") - - - //- 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,iVBORw0KGgoAAAANSUhEUgAAAJYAAABQCAYAAAD7sIxLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAADElJREFUeNrsXQuUVVUZ3jMNqMP4YDSRhzIkYSryMKwIH4MKkhpioi3x sULwUaJpgpXDwpnEwAxFZZbSkuVIiqJEFMpr5SQwhIoOKILNKAppGJoEihYMj76v85/u5nI5r3su 955z9r/Wt8695+69z95nf3c//v3vfxepmMpGVX4QLmcAvYAy4AtgLbC4g9r8WcjP6o3LmUBbYDPw ErACz9mjEipFMSRUZ1zuBq5wCPY2MB54FpX/7yyeNRSXh4GjMvy8G5gD3A8sSxrJimJGqi64LAK6 eozyAnAJKn1rgGddisszHoPXA1V4zktJIVZxzMrzax+kopzjgxzp8isfYc8GloCMo0yLFc0WK2h3 8+z/ojvLDhmn2XJnwGd9Hy3XM3EnVtxarG0B47X3EKY1cISGpoDPuiEJLVZJzMrzCDA6QLxRaEVe 99k6nsKZH3CQz2cdbcZY0ZOJwDs+4/zRL6koiLMal6uB//iMOt8QK2KCyv5EWbqr2cAul+C7ZeA+ JIvnMf4JMuvzMr7jWK7KDN6jPZDn7PBG4Ba5tV1ZyssNomaYA2K8GuLzvo7Ld4XY/Hy49nMDMAHP m6eMxIJcgzlTBGbl4dltgW7AB8Am4KumRuJBqlbASiHW6XnMR3dgM7ABOCIp7784xmU7S1nrhG8C f8njuI/PvwboxLEfyPUlQ6xoy0/k+iQqd3eeJxVcM7wH6A9MMv1JdLvB9tIFsgs6vIDyNV/yNTru dRDXFqtGrguCLDDnUNglvgHcC3JdYNQN0WqtSnF5D/gyx1gg1hsFlj9q7JcCO4GeyN/fDbEKk0gc DNMe6jBlreFdCdwMvIxK+1aB5pka+8eVtSR0teSfC9zNyPM2Q6z8VQzX5y4Cfgqcup9gNOaboixj vg8LLP/9cPkd0C7Dz7RunUriyYzSEOsAVQoVjbXAAI9R1gHDUEmvFEj+Oc561OO7nwHcjbyvNcTK baUcKYPfDj6jsps5AxXUmOf8d8eFBD/ERzROPqYg72PNrDB3MisAqSgc0M9ExZblOf/f80kqCtUl Vcj7oihp7iNDLLzUb+BSmUUSXJQemediVGQRl13/LLyHIkOscGVgCGn0znMZXssyPm30qw2xwpWS AkkjG1mo9rabDyIjZFZsiBWSbAghjTX5LAAG4LRunZBlMh2BPoZY4cnTyr/ZcboUwu4YbhvL1tqi tSFWeP927li+I8tkarhAneeidA4wM9SFCtQVhljhkos248OVv21etEXn7mjqj4ZxgglyTQQ65WFm +yPpjjmJ2KKsjRV+l3CmRmHZJ3LWDXipdbj0VdaGCbcNDLRpH4Q45wHfxOeLlbXUw6WgVajocUDJ ASDUscAflLVi0Epmh5XI0/lCsgeVtSjtJLQpm4w4Y6JQT5FehEZl9VSWpSgr6CTgUGXtaObmBS6H LE038kOcNsraNPpLGausByYi3FQPz2svXRnf2zrE+chDnMHKWrM81m5xSOx0cx6Eq5CyXCBkO0pa My7ncBPGfMRpjkrdxHaXjocK5/LQfcqyhmDL/S4wGpX3+7Rwx+EyTlm2VEUZWhFu/XoAeEH3XIN4 JAa93lwnt/4J/BBhZiXh/SaWWBoBaFrzM2VZS1C4NWw8CPAifmML8luttXGSt6Tlmy4L5ZyB9pLf aH81Ar+9nZT3mnhiCbmKpDtll1UhLRFdDnFc5nfzA+N1VSmfWfdyNgpSfZ6kd2qItS/JODimoWC2 s8b3gWtBqIVJfI/Fhkr7zDrZwjwWQlJN0q0qQywjtvQPIY1zlaVzM8Qy8n/5Skjp3GOIZUSXf4SU Dv03nGuIZcSWJSGm9R1DLCO21IeYVidDLCP2zHCushauw5CNhlhGdKElwhchpDPTEMuI3mpxPyIX kHdkkczKJB0aYIjlnVxUcNJp2/oA0f8GXJrUd2eI5U4uWmuerCwLBq+t15+AgdLqJVLMWqGvUXh5 B+ker1cpywVbPgVockMLz+VJf1eGWNmRjBp6WqDSzHgtCLXDvBkjRowYMWLEiBEjRozEa1aI2c8x yjJYq1SWnylugTpSfuauXDpn5QlY1Nk8BdQ7nX+M9Hio0dPydYZYbBqJmZQ4EICHDdFQra9DfDoC s3ewkHgjgG2IS+f90/bjuJ/by20d0OKIqhqqVeqE1YvlgAAjTsTCSytX1tnK6Wa1XPOiRnmXtFRs 7cokDW6Tss+r4T06yH/UvF5DLJtUdEvIPXAnabcnSevzlsu/mMse3Jx5E7s6p+7QSIKIJT4MntdI RfPcK2Uh1lUQjs4ufox0uLX9rzF/b3XAi/L5TUMj5xbrIaCffF6vLC/DH/hNEHFejvtLQxnXq2AW D4mRYmmteihrYZXyMTAkCKmMGElvsX6uqR5qgxy+HcJMi16RaTnQW9QaStQY9LYyl74UAqZ7sEwu 2BrTp0I7KSsdePDA8JkH0v+7bOenq8f+Wn7oJedTKetsMdXJ9jmchJ0NdFOWVx1Oumgjtlha3GzS biP57yNaAboh4AI8zzBahPRfK+JJpCplZ9TCSsUPO3P4YqlqWClfn5QxCol9mEtUemu5GXl7yiOZ 6FN9jNrXvCVzFGs7/DyXdKlS+XPa7f5OpBc94NfkKz3WDFPu/iBYQSORbr3Pd8u6vAz4hXLeG7lF 1CWP4RmfeUiX5a6UPyP//N92iVJTovb2nb4wl6TKIFekfd+kLN9WzUJ2ku0SgK6E6GRjBgq5Uzz7 OclAIa0tW0VV0iR/Hgr1aRfKZIUmMM8h7eFI+/GQyzhIZd6yT99aqwCe89NGWi622vSI3IX5RX5u Q37u90iqo3H5jUp5zVFChCYhUlvgRGm9qH+k4eIQxLsQz3Cz7a9UKb2dLi3yp9wj9WMf0NBSIs2l Lc/loTveKSoNkqUxXU2Bgt+uLN/mVXKrWsI6CXfZ8J9Iz3njSVakuz1DZdB90bXAI9I91uLeEwi7 az/prpIu4EZgaMDykvBTMtnCi2M3buIYK/mZhHtzxduym8zWJl90lzQKWK63SEiLXS430NJz8wlS lmnA5T7LMFlZm0QabRs06eJ5ZB7dQq3hjTly6uceafJyPcbopT2vGejoMd48Ld5pHsIf6iNPt2tp n+8h/GSv7wy//0ALO9pjfu7S4tR5CD9GC98gZzY6jpGAFVqcQS7hq7Ww13udFebzaNs1Pg6C1Mc2 rucQehk7aKKfDNYlh+V91WO4h7Vxb2cP4UdoXf41bl2b+OqqSuvqvEqTZ3VDROQ97XNoLrXlIM1y 7VarAtCTbdQmOB1c8t9PujXKUq9+ShFukYxlKafmQt3QEhFi6ZOK0gAEKpUxBdc0u8tAs0wGtG0K sLz24Z1uhwWcqX1u8HlC2EeijuiaC2K9r31vFyclnagd6IKb7rd7OgTdraK7FU4/V2eiwK+0zQWx GkW/ouQfPTMmpOom0++ztNtcVaDrxnUyhmmW8nMcUx8DYgWV1rkg1gLtO5VrN8SAVGUy2LfHJ9Rh 1SjrAPKWDOGPi3BxD9YnHtlq1cOSYtmtu8VuEvGSz4lBg1WrkWoCyjgAaMhEqhiIfhDBMYWSKXtc MUm798CBOAYkx2Ifu8a1sWoVb9EnNQMKjVi09rT1PifL2CTK0k2u7yZgd7Ku3xtcUMTCy6dRH5cA 7OWU4Wi1pgc53BpxTgROz3O5bB+iFTFofR0FdbdMpY4E7oPy3llILRYzOD1tqnoVQLX/dV6OipUT rnh2zCsF0OLZZtQVwG0u+S4VlUSUZaz2mcsv9wGHuJSbf7paOegqdClJY/8deBCXA+6SW1Sc8bQq Hr9Gc+PVMkXnqnmpDBa58MiVbe7msc1B2GoNzeOBRDXaeINnE3LFnwvTPIhpu5SbvkGptab91/ER b7UWoIw0lRknt24FLsc9WvMuF/UKx2JcvuslZT5N6vBfwOs5JZZkcjwyxA0VPEOvh9zuKPA6Y+Re wSV5fNHLUIaRylpzayWk7xvzsRaJxWUvmpiXyZ/+IrW3GU0mOT7nLZZWMdzv1xOVQ2bfIi1XD5Wy t9GFg2NupKDykZsxprkcSMSZ2nDts1dp1OKt9UCuacg/N8ZSL3ee/DvbqdQy1seSd7bET8hYxavQ D5atL3IzaWnQ8u1nkwkJwsMzt3n8M9HUp042s4yU7p1lpp1WuZR1q4w/GZYmQHWIt9pD8gvkfX3u tQy+/GNxHKVSu6A50P8E2BRT/ZCRLOS/AgwAG01541UNsGkAAAAASUVORK5CYII=") - - 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_recode(viewBox="0 0 824 203") - path(fill="#EE2C24" d="M84.8 90V49c-18 0-30.7 7.6-38 22.8v-20H4.6v148.1h45v-72.4c0-27.9 5.9-37.4 34.1-37.4h1.1zM823.4 137c0-54.5-31.9-88-78.5-88-19.9 0-39.2 8.2-54 22.9-7.9 7.9-13.8 17.1-17.6 27.2V4.2h-44.5v63.9c-10-13-24.1-19.1-42.4-19.1-19.1 0-36.3 7-50.4 20.8-10.2 9.8-17.3 21.3-21 34.1-3.8-12.5-10.8-24.2-20.8-33.7-14.7-13.9-33-21.3-54.3-21.3-19.9 0-39.3 8.2-54 22.9C378 79.7 372 89 368.2 99.2c-12.8-32.6-38.6-50.2-73-50.2-15.5 0-29.3 4.2-41.5 12.5l-21.2 51.3c-8.1-40-36.9-63.8-76.1-63.8-19.9 0-39.2 8.2-54 22.9C87.9 86.3 80 105.1 80 125.5c0 20.7 7.4 39.2 21.5 54.2 15 15.8 33 23.4 55.3 23.4 16.7 0 31.2-4.1 43.3-12.1l14-34h-33.6c-6.5 5.7-13.6 8.2-22.3 8.2-18.8 0-30-8.2-33.8-23.7h96.2c2.9 14.2 9.5 27.3 19.9 38.2 15 15.8 32.9 23.4 55.2 23.4 33.5 0 60.4-18.5 72.6-49.8 3.6 9.7 9.2 18.5 16.6 26.3 15 15.8 33 23.5 55.4 23.5 22.1 0 40.7-7.9 55.7-22.9 9.1-9.1 15.4-19.5 18.8-31.4 4 14 11.8 26.3 23.3 36.6 13.2 11.8 29 17.7 47.3 17.7 18 0 31.5-4.8 44.7-17.7v14.4h43.1v-47c3.6 9.8 9.2 18.9 16.8 26.9 15 15.8 33 23.4 55.3 23.4 32.7 0 57-15.5 71.1-46.1H769c-6.5 5.7-13.6 8.2-22.3 8.2-18.8 0-30-8.2-33.8-23.7h110.4V137zm-700.3-25.9c3-13.9 15.8-23.2 33.8-23.2 17.2 0 29.4 8.2 34.6 23.2h-68.4zm201.5 36c-7.1 9.5-16.6 14.4-28.3 14.4-20.7 0-34.8-13.9-34.8-36.2 0-20.1 14.1-34.8 33.5-34.8 14.1 0 24.2 5.4 30.2 15.5H366c-1.7 6.3-2.5 12.8-2.5 19.6 0 7.4 1 14.6 2.9 21.5h-41.8zm116.1 16.1c-19.3 0-35.6-16.5-35.6-37 0-20.7 16-37.3 35.6-37.3s35.6 16.5 35.6 37.3c0 20.5-16 37-35.6 37m154.7 0c-22.7 0-39-16-39-37 0-20.2 16.3-37.3 37.3-37.3 20.7 0 36.7 16.3 36.7 37.8.1 20.8-15.9 36.5-35 36.5m116.3-52.1c3-13.9 15.8-23.2 33.8-23.2 17.2 0 29.4 8.2 34.6 23.2h-68.4z") - - 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") - - symbol#svg_bbc(viewBox="0 0 1000 285") - path(fill="#111" d="M542.1 184.3c0 30.97-38.56 29.14-38.56 29.14H465v-56h38.54c39.7-.23 38.56 26.85 38.56 26.85M465 72.05h29.36c30.53 1.6 29.38 24.33 29.38 24.33 0 28.22-33.74 28.68-33.74 28.68h-25V72.06zm70 64.03s26.38-11.25 26.15-41.1c0 0 4-48.87-60.76-54.84h-71.9V245.1h82.4s68.84.24 68.84-57.83c0 0 1.6-39.47-44.75-51.18M348.95 0h302.6v285.17h-302.6V0zM193.14 184.3c0 30.97-38.56 29.14-38.56 29.14h-38.56v-56h38.56c39.7-.23 38.56 26.85 38.56 26.85M116.02 72.05h29.38c30.52 1.6 29.38 24.33 29.38 24.33 0 28.22-33.74 28.68-33.74 28.68h-25.02V72.06zm70 64.03s26.4-11.25 26.17-41.1c0 0 4-48.87-60.78-54.84h-71.9V245.1h82.4s68.86.24 68.86-57.83c0 0 1.6-39.47-44.76-51.18M0 0h302.6v285.17H0V0zM938.8 54.85v37.87S901.85 70 861 69.54c0 0-76.2-1.5-79.64 73.04 0 0-2.75 68.57 78.72 72.47 0 0 34.2 4.13 80.56-25.48v39.25s-62.2 36.95-134.26 8.5c0 0-60.6-22.15-62.9-94.74 0 0-2.52-74.65 78.27-99.43 0 0 21.58-8.26 60.36-4.6 0 0 23.2 2.3 56.7 16.3M697.93 285.17h302.6V0h-302.6v285.17z") - - //- 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 deleted file mode 100644 index b0a1342e5..000000000 --- a/website/_layout.jade +++ /dev/null @@ -1,57 +0,0 @@ -//- 💫 GLOBAL LAYOUT - -include _includes/_mixins - -- title = IS_MODELS ? LANGUAGES[current.source] || title : title - -- PAGE_URL = getPageUrl() -- PAGE_TITLE = getPageTitle() -- PAGE_IMAGE = getPageImage() - -doctype html -html(lang="en") - head - title=PAGE_TITLE - meta(charset="utf-8") - meta(name="viewport" content="width=device-width, initial-scale=1.0") - meta(name="referrer" content="always") - meta(name="description" content=description) - - meta(property="og:type" content="website") - meta(property="og:site_name" content=sitename) - meta(property="og:url" content=PAGE_URL) - meta(property="og:title" content=PAGE_TITLE) - meta(property="og:description" content=description) - meta(property="og:image" content=PAGE_IMAGE) - - meta(name="twitter:card" content="summary_large_image") - meta(name="twitter:site" content="@" + SOCIAL.twitter) - meta(name="twitter:title" content=PAGE_TITLE) - meta(name="twitter:description" content=description) - meta(name="twitter:image" content=PAGE_IMAGE) - - link(rel="shortcut icon" href="/assets/img/favicon.ico") - link(rel="icon" type="image/x-icon" href="/assets/img/favicon.ico") - - if SECTION == "api" - link(href="/assets/css/style_green.css?v#{V_CSS}" rel="stylesheet") - else if SECTION == "universe" - link(href="/assets/css/style_purple.css?v#{V_CSS}" rel="stylesheet") - else - link(href="/assets/css/style.css?v#{V_CSS}" rel="stylesheet") - - body - include _includes/_svg - include _includes/_navigation - - if !landing - include _includes/_page-docs - - else if SECTION == "universe" - !=yield - - else - main!=yield - include _includes/_footer - - include _includes/_scripts diff --git a/website/api/_annotation/_biluo.jade b/website/api/_annotation/_biluo.jade deleted file mode 100644 index 34d93f768..000000000 --- a/website/api/_annotation/_biluo.jade +++ /dev/null @@ -1,43 +0,0 @@ -//- 💫 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/api/_annotation/_dep-labels.jade b/website/api/_annotation/_dep-labels.jade deleted file mode 100644 index 3c7d73eb6..000000000 --- a/website/api/_annotation/_dep-labels.jade +++ /dev/null @@ -1,158 +0,0 @@ -//- 💫 DOCS > API > ANNOTATION > DEPENDENCY LABELS - -p - | This section lists the syntactic dependency labels assigned by - | spaCy's #[+a("/models") models]. The individual labels are - | language-specific and depend on the training corpus. - -+accordion("Universal Dependency Labels") - p - | The #[+a("http://universaldependencies.org/u/dep/") Universal Dependencies scheme] - | is used in all languages trained on Universal Dependency Corpora. - - +table(["Dep", "Description"]) - +ud-row("acl", "clausal modifier of noun (adjectival clause)") - +ud-row("advcl", "adverbial clause modifier") - +ud-row("advmod", "adverbial modifier") - +ud-row("amod", "adjectival modifier") - +ud-row("appos", "appositional modifier") - +ud-row("aux", "auxiliary") - +ud-row("case", "case marking") - +ud-row("cc", "coordinating conjunction") - +ud-row("ccomp", "clausal complement") - +ud-row("clf", "classifier") - +ud-row("compound", "compound") - +ud-row("conj", "conjunct") - +ud-row("cop", "copula") - +ud-row("csubj", "clausal subject") - +ud-row("dep", "unspecified dependency") - +ud-row("det", "determiner") - +ud-row("discourse", "discourse element") - +ud-row("dislocated", "dislocated elements") - +ud-row("expl", "expletive") - +ud-row("fixed", "fixed multiword expression") - +ud-row("flat", "flat multiword expression") - +ud-row("goeswith", "goes with") - +ud-row("iobj", "indirect object") - +ud-row("list", "list") - +ud-row("mark", "marker") - +ud-row("nmod", "nominal modifier") - +ud-row("nsubj", "nominal subject") - +ud-row("nummod", "numeric modifier") - +ud-row("obj", "object") - +ud-row("obl", "oblique nominal") - +ud-row("orphan", "orphan") - +ud-row("parataxis", "parataxis") - +ud-row("punct", "punctuation") - +ud-row("reparandum", "overridden disfluency") - +ud-row("root", "root") - +ud-row("vocative", "vocative") - +ud-row("xcomp", "open clausal complement") - -+accordion("English", "dependency-parsing-english") - p - | The English dependency labels use the - | #[+a("https://github.com/clir/clearnlp-guidelines/blob/master/md/specifications/dependency_labels.md") CLEAR Style] - | by #[+a("http://www.clearnlp.com") ClearNLP]. - - +table(["Label", "Description"]) - +dep-row("acl", "clausal modifier of noun (adjectival clause)") - +dep-row("acomp", "adjectival complement") - +dep-row("advcl", "adverbial clause modifier") - +dep-row("advmod", "adverbial modifier") - +dep-row("agent", "agent") - +dep-row("amod", "adjectival modifier") - +dep-row("appos", "appositional modifier") - +dep-row("attr", "attribute") - +dep-row("aux", "auxiliary") - +dep-row("auxpass", "auxiliary (passive)") - +dep-row("case", "case marking") - +dep-row("cc", "coordinating conjunction") - +dep-row("ccomp", "clausal complement") - +dep-row("compound", "compound") - +dep-row("conj", "conjunct") - +dep-row("cop", "copula") - +dep-row("csubj", "clausal subject") - +dep-row("csubjpass", "clausal subject (passive)") - +dep-row("dative", "dative") - +dep-row("dep", "unclassified dependent") - +dep-row("det", "determiner") - +dep-row("dobj", "direct object") - +dep-row("expl", "expletive") - +dep-row("intj", "interjection") - +dep-row("mark", "marker") - +dep-row("meta", "meta modifier") - +dep-row("neg", "negation modifier") - +dep-row("nn", "noun compound modifier") - +dep-row("nounmod", "modifier of nominal") - +dep-row("npmod", "noun phrase as adverbial modifier") - +dep-row("nsubj", "nominal subject") - +dep-row("nsubjpass", "nominal subject (passive)") - +dep-row("nummod", "numeric modifier") - +dep-row("oprd", "object predicate") - +dep-row("obj", "object") - +dep-row("obl", "oblique nominal") - +dep-row("parataxis", "parataxis") - +dep-row("pcomp", "complement of preposition") - +dep-row("pobj", "object of preposition") - +dep-row("poss", "possession modifier") - +dep-row("preconj", "pre-correlative conjunction") - +dep-row("prep", "prepositional modifier") - +dep-row("prt", "particle") - +dep-row("punct", "punctuation") - +dep-row("quantmod", "modifier of quantifier") - +dep-row("relcl", "relative clause modifier") - +dep-row("root", "root") - +dep-row("xcomp", "open clausal complement") - -+accordion("German", "dependency-parsing-german") - p - | The German dependency labels use the - | #[+a("http://www.ims.uni-stuttgart.de/forschung/ressourcen/korpora/TIGERCorpus/annotation/index.html") TIGER Treebank] - | annotation scheme. - - +table(["Label", "Description"]) - +dep-row("ac", "adpositional case marker") - +dep-row("adc", "adjective component") - +dep-row("ag", "genitive attribute") - +dep-row("ams", "measure argument of adjective") - +dep-row("app", "apposition") - +dep-row("avc", "adverbial phrase component") - +dep-row("cc", "comparative complement") - +dep-row("cd", "coordinating conjunction") - +dep-row("cj", "conjunct") - +dep-row("cm", "comparative conjunction") - +dep-row("cp", "complementizer") - +dep-row("cvc", "collocational verb construction") - +dep-row("da", "dative") - +dep-row("dh", "discourse-level head") - +dep-row("dm", "discourse marker") - +dep-row("ep", "expletive es") - +dep-row("hd", "head") - +dep-row("ju", "junctor") - +dep-row("mnr", "postnominal modifier") - +dep-row("mo", "modifier") - +dep-row("ng", "negation") - +dep-row("nk", "noun kernel element") - +dep-row("nmc", "numerical component") - +dep-row("oa", "accusative object") - +dep-row("oa", "second accusative object") - +dep-row("oc", "clausal object") - +dep-row("og", "genitive object") - +dep-row("op", "prepositional object") - +dep-row("par", "parenthetical element") - +dep-row("pd", "predicate") - +dep-row("pg", "phrasal genitive") - +dep-row("ph", "placeholder") - +dep-row("pm", "morphological particle") - +dep-row("pnc", "proper noun component") - +dep-row("rc", "relative clause") - +dep-row("re", "repeated element") - +dep-row("rs", "reported speech") - +dep-row("sb", "subject") - +dep-row("sbp", "passivised subject") - +dep-row("sp", "subject or predicate") - +dep-row("svp", "separable verb prefix") - +dep-row("uc", "unit component") - +dep-row("vo", "vocative") - +dep-row("ROOT", "root") diff --git a/website/api/_annotation/_named-entities.jade b/website/api/_annotation/_named-entities.jade deleted file mode 100644 index fa8bc842b..000000000 --- a/website/api/_annotation/_named-entities.jade +++ /dev/null @@ -1,109 +0,0 @@ -//- 💫 DOCS > API > ANNOTATION > NAMED ENTITIES - -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. - - +row - +cell #[code NORP] - +cell Nationalities or religious or political groups. - - +row - +cell #[code FAC] - +cell Buildings, airports, highways, bridges, etc. - - +row - +cell #[code ORG] - +cell Companies, agencies, institutions, etc. - - +row - +cell #[code GPE] - +cell Countries, cities, states. - - +row - +cell #[code LOC] - +cell Non-GPE locations, mountain ranges, bodies of water. - - +row - +cell #[code PRODUCT] - +cell Objects, vehicles, foods, etc. (Not services.) - - +row - +cell #[code EVENT] - +cell Named hurricanes, battles, wars, sports events, etc. - - +row - +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. - - +row - +cell #[code DATE] - +cell Absolute or relative dates or periods. - - +row - +cell #[code TIME] - +cell Times smaller than a day. - - +row - +cell #[code PERCENT] - +cell Percentage, including "%". - - +row - +cell #[code MONEY] - +cell Monetary values, including unit. - - +row - +cell #[code QUANTITY] - +cell Measurements, as of weight or distance. - - +row - +cell #[code ORDINAL] - +cell "first", "second", etc. - - +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/api/_annotation/_pos-tags.jade b/website/api/_annotation/_pos-tags.jade deleted file mode 100644 index 6aa8b4466..000000000 --- a/website/api/_annotation/_pos-tags.jade +++ /dev/null @@ -1,179 +0,0 @@ -//- 💫 DOCS > API > ANNOTATION > POS TAGS - -p - | This section lists the fine-grained and coarse-grained part-of-speech - | tags assigned by spaCy's #[+a("/models") models]. The individual mapping - | is specific to the training corpus and can be defined in the respective - | language data's #[+a("/usage/adding-languages#tag-map") #[code tag_map.py]]. - -+accordion("Universal Part-of-speech Tags") - p - | spaCy also maps all language-specific part-of-speech tags to a small, - | fixed set of word type tags following the - | #[+a("http://universaldependencies.org/u/pos/") Universal Dependencies scheme]. - | The universal tags don't code for any morphological features and only - | cover the word type. They're available as the - | #[+api("token#attributes") #[code Token.pos]] and - | #[+api("token#attributes") #[code Token.pos_]] attributes. - - +table(["POS", "Description", "Examples"]) - +ud-row("ADJ", "adjective", "big, old, green, incomprehensible, first") - +ud-row("ADP", "adposition", "in, to, during") - +ud-row("ADV", "adverb", "very, tomorrow, down, where, there") - +ud-row("AUX", "auxiliary", "is, has (done), will (do), should (do)") - +ud-row("CONJ", "conjunction", "and, or, but") - +ud-row("CCONJ", "coordinating conjunction", "and, or, but") - +ud-row("DET", "determiner", "a, an, the") - +ud-row("INTJ", "interjection", "psst, ouch, bravo, hello") - +ud-row("NOUN", "noun", "girl, cat, tree, air, beauty") - +ud-row("NUM", "numeral", "1, 2017, one, seventy-seven, IV, MMXIV") - +ud-row("PART", "particle", "'s, not, ") - +ud-row("PRON", "pronoun", "I, you, he, she, myself, themselves, somebody") - +ud-row("PROPN", "proper noun", "Mary, John, London, NATO, HBO") - +ud-row("PUNCT", "punctuation", "., (, ), ?") - +ud-row("SCONJ", "subordinating conjunction", "if, while, that") - +ud-row("SYM", "symbol", "$, %, §, ©, +, −, ×, ÷, =, :), 😝") - +ud-row("VERB", "verb", "run, runs, running, eat, ate, eating") - +ud-row("X", "other", "sfpksdpsxmsa") - +ud-row("SPACE", "space", "") - -+accordion("English", "pos-en") - p - | The English part-of-speech tagger uses the - | #[+a("https://catalog.ldc.upenn.edu/LDC2013T19") OntoNotes 5] version of - | the Penn Treebank tag set. We also map the tags to the simpler Google - | Universal POS tag set. - - +table(["Tag", "POS", "Morphology", "Description"]) - +pos-row("-LRB-", "PUNCT", "PunctType=brck PunctSide=ini", "left round bracket") - +pos-row("-RRB-", "PUNCT", "PunctType=brck PunctSide=fin", "right round bracket") - +pos-row(",", "PUNCT", "PunctType=comm", "punctuation mark, comma") - +pos-row(":", "PUNCT", "", "punctuation mark, colon or ellipsis") - +pos-row(".", "PUNCT", "PunctType=peri", "punctuation mark, sentence closer") - +pos-row("''", "PUNCT", "PunctType=quot PunctSide=fin", "closing quotation mark") - +pos-row("\"\"", "PUNCT", "PunctType=quot PunctSide=fin", "closing quotation mark") - +pos-row("#", "SYM", "SymType=numbersign", "symbol, number sign") - +pos-row("``", "PUNCT", "PunctType=quot PunctSide=ini", "opening quotation mark") - +pos-row("$", "SYM", "SymType=currency", "symbol, currency") - +pos-row("ADD", "X", "", "email") - +pos-row("AFX", "ADJ", "Hyph=yes", "affix") - +pos-row("BES", "VERB", "", 'auxiliary "be"') - +pos-row("CC", "CONJ", "ConjType=coor", "conjunction, coordinating") - +pos-row("CD", "NUM", "NumType=card", "cardinal number") - +pos-row("DT", "DET", "determiner") - +pos-row("EX", "ADV", "AdvType=ex", "existential there") - +pos-row("FW", "X", "Foreign=yes", "foreign word") - +pos-row("GW", "X", "", "additional word in multi-word expression") - +pos-row("HVS", "VERB", "", 'forms of "have"') - +pos-row("HYPH", "PUNCT", "PunctType=dash", "punctuation mark, hyphen") - +pos-row("IN", "ADP", "", "conjunction, subordinating or preposition") - +pos-row("JJ", "ADJ", "Degree=pos", "adjective") - +pos-row("JJR", "ADJ", "Degree=comp", "adjective, comparative") - +pos-row("JJS", "ADJ", "Degree=sup", "adjective, superlative") - +pos-row("LS", "PUNCT", "NumType=ord", "list item marker") - +pos-row("MD", "VERB", "VerbType=mod", "verb, modal auxiliary") - +pos-row("NFP", "PUNCT", "", "superfluous punctuation") - +pos-row("NIL", "", "", "missing tag") - +pos-row("NN", "NOUN", "Number=sing", "noun, singular or mass") - +pos-row("NNP", "PROPN", "NounType=prop Number=sign", "noun, proper singular") - +pos-row("NNPS", "PROPN", "NounType=prop Number=plur", "noun, proper plural") - +pos-row("NNS", "NOUN", "Number=plur", "noun, plural") - +pos-row("PDT", "ADJ", "AdjType=pdt PronType=prn", "predeterminer") - +pos-row("POS", "PART", "Poss=yes", "possessive ending") - +pos-row("PRP", "PRON", "PronType=prs", "pronoun, personal") - +pos-row("PRP$", "ADJ", "PronType=prs Poss=yes", "pronoun, possessive") - +pos-row("RB", "ADV", "Degree=pos", "adverb") - +pos-row("RBR", "ADV", "Degree=comp", "adverb, comparative") - +pos-row("RBS", "ADV", "Degree=sup", "adverb, superlative") - +pos-row("RP", "PART", "", "adverb, particle") - +pos-row("_SP", "SPACE", "", "space") - +pos-row("SYM", "SYM", "", "symbol") - +pos-row("TO", "PART", "PartType=inf VerbForm=inf", "infinitival to") - +pos-row("UH", "INTJ", "", "interjection") - +pos-row("VB", "VERB", "VerbForm=inf", "verb, base form") - +pos-row("VBD", "VERB", "VerbForm=fin Tense=past", "verb, past tense") - +pos-row("VBG", "VERB", "VerbForm=part Tense=pres Aspect=prog", "verb, gerund or present participle") - +pos-row("VBN", "VERB", "VerbForm=part Tense=past Aspect=perf", "verb, past participle") - +pos-row("VBP", "VERB", "VerbForm=fin Tense=pres", "verb, non-3rd person singular present") - +pos-row("VBZ", "VERB", "VerbForm=fin Tense=pres Number=sing Person=3", "verb, 3rd person singular present") - +pos-row("WDT", "ADJ", "PronType=int|rel", "wh-determiner") - +pos-row("WP", "NOUN", "PronType=int|rel", "wh-pronoun, personal") - +pos-row("WP$", "ADJ", "Poss=yes PronType=int|rel", "wh-pronoun, possessive") - +pos-row("WRB", "ADV", "PronType=int|rel", "wh-adverb") - +pos-row("XX", "X", "", "unknown") - -+accordion("German", "pos-de") - p - | The German part-of-speech tagger uses the - | #[+a("http://www.ims.uni-stuttgart.de/forschung/ressourcen/korpora/TIGERCorpus/annotation/index.html") TIGER Treebank] - | annotation scheme. We also map the tags to the simpler Google - | Universal POS tag set. - - +table(["Tag", "POS", "Morphology", "Description"]) - +pos-row("$(", "PUNCT", "PunctType=brck", "other sentence-internal punctuation mark") - +pos-row("$,", "PUNCT", "PunctType=comm", "comma") - +pos-row("$.", "PUNCT", "PunctType=peri", "sentence-final punctuation mark") - +pos-row("ADJA", "ADJ", "", "adjective, attributive") - +pos-row("ADJD", "ADJ", "Variant=short", "adjective, adverbial or predicative") - +pos-row("ADV", "ADV", "", "adverb") - +pos-row("APPO", "ADP", "AdpType=post", "postposition") - +pos-row("APPR", "ADP", "AdpType=prep", "preposition; circumposition left") - +pos-row("APPRART", "ADP", "AdpType=prep PronType=art", "preposition with article") - +pos-row("APZR", "ADP", "AdpType=circ", "circumposition right") - +pos-row("ART", "DET", "PronType=art", "definite or indefinite article") - +pos-row("CARD", "NUM", "NumType=card", "cardinal number") - +pos-row("FM", "X", "Foreign=yes", "foreign language material") - +pos-row("ITJ", "INTJ", "", "interjection") - +pos-row("KOKOM", "CONJ", "ConjType=comp", "comparative conjunction") - +pos-row("KON", "CONJ", "", "coordinate conjunction") - +pos-row("KOUI", "SCONJ", "", 'subordinate conjunction with "zu" and infinitive') - +pos-row("KOUS", "SCONJ", "", "subordinate conjunction with sentence") - +pos-row("NE", "PROPN", "", "proper noun") - +pos-row("NNE", "PROPN", "", "proper noun") - +pos-row("NN", "NOUN", "", "noun, singular or mass") - +pos-row("PAV", "ADV", "PronType=dem", "pronominal adverb") - +pos-row("PROAV", "ADV", "PronType=dem", "pronominal adverb") - +pos-row("PDAT", "DET", "PronType=dem", "attributive demonstrative pronoun") - +pos-row("PDS", "PRON", "PronType=dem", "substituting demonstrative pronoun") - +pos-row("PIAT", "DET", "PronType=ind|neg|tot", "attributive indefinite pronoun without determiner") - +pos-row("PIDAT", "DET", "AdjType=pdt PronType=ind|neg|tot", "attributive indefinite pronoun with determiner") - +pos-row("PIS", "PRON", "PronType=ind|neg|tot", "substituting indefinite pronoun") - +pos-row("PPER", "PRON", "PronType=prs", "non-reflexive personal pronoun") - +pos-row("PPOSAT", "DET", "Poss=yes PronType=prs", "attributive possessive pronoun") - +pos-row("PPOSS", "PRON", "PronType=rel", "substituting possessive pronoun") - +pos-row("PRELAT", "DET", "PronType=rel", "attributive relative pronoun") - +pos-row("PRELS", "PRON", "PronType=rel", "substituting relative pronoun") - +pos-row("PRF", "PRON", "PronType=prs Reflex=yes", "reflexive personal pronoun") - +pos-row("PTKA", "PART", "", "particle with adjective or adverb") - +pos-row("PTKANT", "PART", "PartType=res", "answer particle") - +pos-row("PTKNEG", "PART", "Negative=yes", "negative particle") - +pos-row("PTKVZ", "PART", "PartType=vbp", "separable verbal particle") - +pos-row("PTKZU", "PART", "PartType=inf", '"zu" before infinitive') - +pos-row("PWAT", "DET", "PronType=int", "attributive interrogative pronoun") - +pos-row("PWAV", "ADV", "PronType=int", "adverbial interrogative or relative pronoun") - +pos-row("PWS", "PRON", "PronType=int", "substituting interrogative pronoun") - +pos-row("TRUNC", "X", "Hyph=yes", "word remnant") - +pos-row("VAFIN", "AUX", "Mood=ind VerbForm=fin", "finite verb, auxiliary") - +pos-row("VAIMP", "AUX", "Mood=imp VerbForm=fin", "imperative, auxiliary") - +pos-row("VAINF", "AUX", "VerbForm=inf", "infinitive, auxiliary") - +pos-row("VAPP", "AUX", "Aspect=perf VerbForm=fin", "perfect participle, auxiliary") - +pos-row("VMFIN", "VERB", "Mood=ind VerbForm=fin VerbType=mod", "finite verb, modal") - +pos-row("VMINF", "VERB", "VerbForm=fin VerbType=mod", "infinitive, modal") - +pos-row("VMPP", "VERB", "Aspect=perf VerbForm=part VerbType=mod", "perfect participle, modal") - +pos-row("VVFIN", "VERB", "Mood=ind VerbForm=fin", "finite verb, full") - +pos-row("VVIMP", "VERB", "Mood=imp VerbForm=fin", "imperative, full") - +pos-row("VVINF", "VERB", "VerbForm=inf", "infinitive, full") - +pos-row("VVIZU", "VERB", "VerbForm=inf", 'infinitive with "zu", full') - +pos-row("VVPP", "VERB", "Aspect=perf VerbForm=part", "perfect participle, full") - +pos-row("XY", "X", "", "non-word containing non-letter") - +pos-row("SP", "SPACE", "", "space") - -for _, lang in MODELS - - var exclude = ["en", "de", "xx"] - if !exclude.includes(lang) - - var lang_name = LANGUAGES[lang] - - var file_path = "lang/" + lang + "/tag_map.py" - +accordion(lang_name, "pos-" + lang) - p - | For details on the #{lang_name} tag map, see - | #[+src(gh("spacy", "spacy/" + file_path)) #[code=file_path]]. diff --git a/website/api/_annotation/_text-processing.jade b/website/api/_annotation/_text-processing.jade deleted file mode 100644 index 564e76f08..000000000 --- a/website/api/_annotation/_text-processing.jade +++ /dev/null @@ -1,55 +0,0 @@ -//- 💫 DOCS > API > ANNOTATION > TEXT PROCESSING - -+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 - | Tokenization standards are based on the - | #[+a("https://catalog.ldc.upenn.edu/LDC2013T19") OntoNotes 5] corpus. - | The tokenizer differs from most by including - | #[strong tokens for significant whitespace]. Any sequence of - | whitespace characters beyond a single space (#[code ' ']) is included - | as a token. 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 #[strong no information is lost] during processing. - -+h(3, "lemmatization") Lemmatization - -+aside("Examples") - | In English, this means:#[br] - | #[strong Adjectives]: happier, happiest → happy#[br] - | #[strong Adverbs]: worse, worst → badly#[br] - | #[strong Nouns]: dogs, children → dog, child#[br] - | #[strong Verbs]: writes, wirting, wrote, written → write - - -p - | A lemma is the uninflected form of a word. The English lemmatization - | data is taken from #[+a("https://wordnet.princeton.edu") WordNet]. - | Lookup tables are taken from - | #[+a("http://www.lexiconista.com/datasets/lemmatization/") Lexiconista]. - | spaCy also adds a #[strong 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(3, "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. diff --git a/website/api/_annotation/_training.jade b/website/api/_annotation/_training.jade deleted file mode 100644 index 8658866aa..000000000 --- a/website/api/_annotation/_training.jade +++ /dev/null @@ -1,104 +0,0 @@ -//- 💫 DOCS > API > ANNOTATION > TRAINING - -+h(3, "json-input") JSON input format for 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. 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"). - [{ - "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") - -+h(3, "vocab-jsonl") Lexical data for vocabulary - +tag-new(2) - -p - | To populate a model's vocabulary, you can use the - | #[+api("cli#vocab") #[code spacy vocab]] command and load in a - | #[+a("https://jsonlines.readthedocs.io/en/latest/") newline-delimited JSON] - | (JSONL) file containing one lexical entry per line. The first line - | defines the language and vocabulary settings. All other lines are - | expected to be JSON objects describing an individual lexeme. The lexical - | attributes will be then set as attributes on spaCy's - | #[+api("lexeme#attributes") #[code Lexeme]] object. The #[code vocab] - | command outputs a ready-to-use spaCy model with a #[code Vocab] - | containing the lexical data. - -+code("First line"). - {"lang": "en", "settings": {"oov_prob": -20.502029418945312}} - -+code("Entry structure"). - { - "orth": string, - "id": int, - "lower": string, - "norm": string, - "shape": string - "prefix": string, - "suffix": string, - "length": int, - "cluster": string, - "prob": float, - "is_alpha": bool, - "is_ascii": bool, - "is_digit": bool, - "is_lower": bool, - "is_punct": bool, - "is_space": bool, - "is_title": bool, - "is_upper": bool, - "like_url": bool, - "like_num": bool, - "like_email": bool, - "is_stop": bool, - "is_oov": bool, - "is_quote": bool, - "is_left_punct": bool, - "is_right_punct": bool - } - -p - | Here's an example of the 20 most frequent lexemes in the English - | training data: - -+github("spacy", "examples/training/vocab-data.jsonl", false, false, "json") diff --git a/website/api/_cython/_doc.jade b/website/api/_cython/_doc.jade deleted file mode 100644 index e54f09b70..000000000 --- a/website/api/_cython/_doc.jade +++ /dev/null @@ -1,71 +0,0 @@ -//- 💫 DOCS > API > CYTHON > CLASSES > DOC - -p - | The #[code Doc] object holds an array of - | #[+api("cython-structs#tokenc") #[code TokenC]] structs. - -+infobox - | This section documents the extra C-level attributes and methods that - | can't be accessed from Python. For the Python documentation, see - | #[+api("doc") #[code Doc]]. - -+h(3, "doc_attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code mem] - +cell #[code cymem.Pool] - +cell - | A memory pool. Allocated memory will be freed once the - | #[code Doc] object is garbage collected. - - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell A reference to the shared #[code Vocab] object. - - +row - +cell #[code c] - +cell #[code TokenC*] - +cell - | A pointer to a #[+api("cython-structs#tokenc") #[code TokenC]] - | struct. - - +row - +cell #[code length] - +cell #[code int] - +cell The number of tokens in the document. - - +row - +cell #[code max_length] - +cell #[code int] - +cell The underlying size of the #[code Doc.c] array. - -+h(3, "doc_push_back") Doc.push_back - +tag method - -p - | Append a token to the #[code Doc]. The token can be provided as a - | #[+api("cython-structs#lexemec") #[code LexemeC]] or - | #[+api("cython-structs#tokenc") #[code TokenC]] pointer, using Cython's - | #[+a("http://cython.readthedocs.io/en/latest/src/userguide/fusedtypes.html") fused types]. - -+aside-code("Example"). - from spacy.tokens cimport Doc - from spacy.vocab cimport Vocab - - doc = Doc(Vocab()) - lexeme = doc.vocab.get(u'hello') - doc.push_back(lexeme, True) - assert doc.text == u'hello ' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code lex_or_tok] - +cell #[code LexemeOrToken] - +cell The word to append to the #[code Doc]. - - +row - +cell #[code has_space] - +cell #[code bint] - +cell Whether the word has trailing whitespace. diff --git a/website/api/_cython/_lexeme.jade b/website/api/_cython/_lexeme.jade deleted file mode 100644 index 219c7ec45..000000000 --- a/website/api/_cython/_lexeme.jade +++ /dev/null @@ -1,30 +0,0 @@ -//- 💫 DOCS > API > CYTHON > CLASSES > LEXEME - -p - | A Cython class providing access and methods for an entry in the - | vocabulary. - -+infobox - | This section documents the extra C-level attributes and methods that - | can't be accessed from Python. For the Python documentation, see - | #[+api("lexeme") #[code Lexeme]]. - -+h(3, "lexeme_attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code c] - +cell #[code LexemeC*] - +cell - | A pointer to a #[+api("cython-structs#lexemec") #[code LexemeC]] - | struct. - - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell A reference to the shared #[code Vocab] object. - - +row - +cell #[code orth] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell ID of the verbatim text content. diff --git a/website/api/_cython/_lexemec.jade b/website/api/_cython/_lexemec.jade deleted file mode 100644 index be574a235..000000000 --- a/website/api/_cython/_lexemec.jade +++ /dev/null @@ -1,200 +0,0 @@ -//- 💫 DOCS > API > CYTHON > STRUCTS > LEXEMEC - -p - | Struct holding information about a lexical type. #[code LexemeC] - | structs are usually owned by the #[code Vocab], and accessed through a - | read-only pointer on the #[code TokenC] struct. - -+aside-code("Example"). - lex = doc.c[3].lex - -+table(["Name", "Type", "Description"]) - +row - +cell #[code flags] - +cell #[+abbr("uint64_t") #[code flags_t]] - +cell Bit-field for binary lexical flag values. - - +row - +cell #[code id] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell - | Usually used to map lexemes to rows in a matrix, e.g. for word - | vectors. Does not need to be unique, so currently misnamed. - - +row - +cell #[code length] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell Number of unicode characters in the lexeme. - - +row - +cell #[code orth] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell ID of the verbatim text content. - - +row - +cell #[code lower] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell ID of the lowercase form of the lexeme. - - +row - +cell #[code norm] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell ID of the lexeme's norm, i.e. a normalised form of the text. - - +row - +cell #[code shape] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell Transform of the lexeme's string, to show orthographic features. - - +row - +cell #[code prefix] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell - | Length-N substring from the start of the lexeme. Defaults to - | #[code N=1]. - - +row - +cell #[code suffix] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell - | Length-N substring from the end of the lexeme. Defaults to - | #[code N=3]. - - +row - +cell #[code cluster] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell Brown cluster ID. - - +row - +cell #[code prob] - +cell #[code float] - +cell Smoothed log probability estimate of the lexeme's type. - - +row - +cell #[code sentiment] - +cell #[code float] - +cell A scalar value indicating positivity or negativity. - -+h(3, "lexeme_get_struct_attr", "spacy/lexeme.pxd") Lexeme.get_struct_attr - +tag staticmethod - +tag nogil - -p Get the value of an attribute from the #[code LexemeC] struct by attribute ID. - -+aside-code("Example"). - from spacy.attrs cimport IS_ALPHA - from spacy.lexeme cimport Lexeme - - lexeme = doc.c[3].lex - is_alpha = Lexeme.get_struct_attr(lexeme, IS_ALPHA) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code lex] - +cell #[code const LexemeC*] - +cell A pointer to a #[code LexemeC] struct. - - +row - +cell #[code feat_name] - +cell #[code attr_id_t] - +cell - | The ID of the attribute to look up. The attributes are - | enumerated in #[code spacy.typedefs]. - - +row("foot") - +cell returns - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell The value of the attribute. - -+h(3, "lexeme_set_struct_attr", "spacy/lexeme.pxd") Lexeme.set_struct_attr - +tag staticmethod - +tag nogil - -p Set the value of an attribute of the #[code LexemeC] struct by attribute ID. - -+aside-code("Example"). - from spacy.attrs cimport NORM - from spacy.lexeme cimport Lexeme - - lexeme = doc.c[3].lex - Lexeme.set_struct_attr(lexeme, NORM, lexeme.lower) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code lex] - +cell #[code const LexemeC*] - +cell A pointer to a #[code LexemeC] struct. - - +row - +cell #[code feat_name] - +cell #[code attr_id_t] - +cell - | The ID of the attribute to look up. The attributes are - | enumerated in #[code spacy.typedefs]. - - +row - +cell #[code value] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell The value to set. - -+h(3, "lexeme_c_check_flag", "spacy/lexeme.pxd") Lexeme.c_check_flag - +tag staticmethod - +tag nogil - -p Check the value of a binary flag attribute. - -+aside-code("Example"). - from spacy.attrs cimport IS_STOP - from spacy.lexeme cimport Lexeme - - lexeme = doc.c[3].lex - is_stop = Lexeme.c_check_flag(lexeme, IS_STOP) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code lexeme] - +cell #[code const LexemeC*] - +cell A pointer to a #[code LexemeC] struct. - - +row - +cell #[code flag_id] - +cell #[code attr_id_t] - +cell - | The ID of the flag to look up. The flag IDs are enumerated in - | #[code spacy.typedefs]. - - +row("foot") - +cell returns - +cell #[code bint] - +cell The boolean value of the flag. - -+h(3, "lexeme_c_set_flag", "spacy/lexeme.pxd") Lexeme.c_set_flag - +tag staticmethod - +tag nogil - -p Set the value of a binary flag attribute. - -+aside-code("Example"). - from spacy.attrs cimport IS_STOP - from spacy.lexeme cimport Lexeme - - lexeme = doc.c[3].lex - Lexeme.c_set_flag(lexeme, IS_STOP, 0) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code lexeme] - +cell #[code const LexemeC*] - +cell A pointer to a #[code LexemeC] struct. - - +row - +cell #[code flag_id] - +cell #[code attr_id_t] - +cell - | The ID of the flag to look up. The flag IDs are enumerated in - | #[code spacy.typedefs]. - - +row - +cell #[code value] - +cell #[code bint] - +cell The value to set. diff --git a/website/api/_cython/_span.jade b/website/api/_cython/_span.jade deleted file mode 100644 index 0899081a7..000000000 --- a/website/api/_cython/_span.jade +++ /dev/null @@ -1,43 +0,0 @@ -//- 💫 DOCS > API > CYTHON > CLASSES > SPAN - -p - | A Cython class providing access and methods for a slice of a #[code Doc] - | object. - -+infobox - | This section documents the extra C-level attributes and methods that - | can't be accessed from Python. For the Python documentation, see - | #[+api("span") #[code Span]]. - -+h(3, "span_attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code doc] - +cell #[code Doc] - +cell The parent document. - - +row - +cell #[code start] - +cell #[code int] - +cell The index of the first token of the span. - - +row - +cell #[code end] - +cell #[code int] - +cell The index of the first token after the span. - - +row - +cell #[code start_char] - +cell #[code int] - +cell The index of the first character of the span. - - +row - +cell #[code end_char] - +cell #[code int] - +cell The index of the last character of the span. - - +row - +cell #[code label] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell A label to attach to the span, e.g. for named entities. diff --git a/website/api/_cython/_stringstore.jade b/website/api/_cython/_stringstore.jade deleted file mode 100644 index 0fed5fd59..000000000 --- a/website/api/_cython/_stringstore.jade +++ /dev/null @@ -1,23 +0,0 @@ -//- 💫 DOCS > API > CYTHON > CLASSES > STRINGSTORE - -p A lookup table to retrieve strings by 64-bit hashes. - -+infobox - | This section documents the extra C-level attributes and methods that - | can't be accessed from Python. For the Python documentation, see - | #[+api("stringstore") #[code StringStore]]. - -+h(3, "stringstore_attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code mem] - +cell #[code cymem.Pool] - +cell - | A memory pool. Allocated memory will be freed once the - | #[code StringStore] object is garbage collected. - - +row - +cell #[code keys] - +cell #[+abbr("vector[uint64_t]") #[code vector[hash_t]]] - +cell A list of hash values in the #[code StringStore]. diff --git a/website/api/_cython/_token.jade b/website/api/_cython/_token.jade deleted file mode 100644 index 1ed2bc552..000000000 --- a/website/api/_cython/_token.jade +++ /dev/null @@ -1,73 +0,0 @@ -//- 💫 DOCS > API > CYTHON > CLASSES > TOKEN - -p - | A Cython class providing access and methods for a - | #[+api("cython-structs#tokenc") #[code TokenC]] struct. Note that the - | #[code Token] object does not own the struct. It only receives a pointer - | to it. - -+infobox - | This section documents the extra C-level attributes and methods that - | can't be accessed from Python. For the Python documentation, see - | #[+api("token") #[code Token]]. - -+h(3, "token_attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell A reference to the shared #[code Vocab] object. - - +row - +cell #[code c] - +cell #[code TokenC*] - +cell - | A pointer to a #[+api("cython-structs#tokenc") #[code TokenC]] - | struct. - - +row - +cell #[code i] - +cell #[code int] - +cell The offset of the token within the document. - - +row - +cell #[code doc] - +cell #[code Doc] - +cell The parent document. - -+h(3, "token_cinit") Token.cinit - +tag method - -p Create a #[code Token] object from a #[code TokenC*] pointer. - -+aside-code("Example"). - token = Token.cinit(&doc.c[3], doc, 3) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell A reference to the shared #[code Vocab]. - - +row - +cell #[code c] - +cell #[code TokenC*] - +cell - | A pointer to a #[+api("cython-structs#tokenc") #[code TokenC]] - | struct. - - +row - +cell #[code offset] - +cell #[code int] - +cell The offset of the token within the document. - - +row - +cell #[code doc] - +cell #[code Doc] - +cell The parent document. - - +row("foot") - +cell returns - +cell #[code Token] - +cell The newly constructed object. diff --git a/website/api/_cython/_tokenc.jade b/website/api/_cython/_tokenc.jade deleted file mode 100644 index 967012843..000000000 --- a/website/api/_cython/_tokenc.jade +++ /dev/null @@ -1,270 +0,0 @@ -//- 💫 DOCS > API > CYTHON > STRUCTS > TOKENC - -p - | Cython data container for the #[code Token] object. - -+aside-code("Example"). - token = &doc.c[3] - token_ptr = &doc.c[3] - -+table(["Name", "Type", "Description"]) - +row - +cell #[code lex] - +cell #[code const LexemeC*] - +cell A pointer to the lexeme for the token. - - +row - +cell #[code morph] - +cell #[code uint64_t] - +cell An ID allowing lookup of morphological attributes. - - +row - +cell #[code pos] - +cell #[code univ_pos_t] - +cell Coarse-grained part-of-speech tag. - - +row - +cell #[code spacy] - +cell #[code bint] - +cell A binary value indicating whether the token has trailing whitespace. - - +row - +cell #[code tag] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell Fine-grained part-of-speech tag. - - +row - +cell #[code idx] - +cell #[code int] - +cell The character offset of the token within the parent document. - - +row - +cell #[code lemma] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell Base form of the token, with no inflectional suffixes. - - +row - +cell #[code sense] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell Space for storing a word sense ID, currently unused. - - +row - +cell #[code head] - +cell #[code int] - +cell Offset of the syntactic parent relative to the token. - - +row - +cell #[code dep] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell Syntactic dependency relation. - - +row - +cell #[code l_kids] - +cell #[code uint32_t] - +cell Number of left children. - - +row - +cell #[code r_kids] - +cell #[code uint32_t] - +cell Number of right children. - - +row - +cell #[code l_edge] - +cell #[code uint32_t] - +cell Offset of the leftmost token of this token's syntactic descendents. - - +row - +cell #[code r_edge] - +cell #[code uint32_t] - +cell Offset of the rightmost token of this token's syntactic descendents. - - +row - +cell #[code sent_start] - +cell #[code int] - +cell - | Ternary value indicating whether the token is the first word of - | a sentence. #[code 0] indicates a missing value, #[code -1] - | indicates #[code False] and #[code 1] indicates #[code True]. The default value, 0, - | is interpretted as no sentence break. Sentence boundary detectors will usually - | set 0 for all tokens except tokens that follow a sentence boundary. - - +row - +cell #[code ent_iob] - +cell #[code int] - +cell - | IOB code of named entity tag. #[code 0] indicates a missing - | value, #[code 1] indicates #[code I], #[code 2] indicates - | #[code 0] and #[code 3] indicates #[code B]. - - +row - +cell #[code ent_type] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell Named entity type. - - +row - +cell #[code ent_id] - +cell #[+abbr("uint64_t") #[code hash_t]] - +cell - | ID of the entity the token is an instance of, if any. Currently - | not used, but potentially for coreference resolution. - -+h(3, "token_get_struct_attr", "spacy/tokens/token.pxd") Token.get_struct_attr - +tag staticmethod - +tag nogil - -p Get the value of an attribute from the #[code TokenC] struct by attribute ID. - -+aside-code("Example"). - from spacy.attrs cimport IS_ALPHA - from spacy.tokens cimport Token - - is_alpha = Token.get_struct_attr(&doc.c[3], IS_ALPHA) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code token] - +cell #[code const TokenC*] - +cell A pointer to a #[code TokenC] struct. - - +row - +cell #[code feat_name] - +cell #[code attr_id_t] - +cell - | The ID of the attribute to look up. The attributes are - | enumerated in #[code spacy.typedefs]. - - +row("foot") - +cell returns - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell The value of the attribute. - -+h(3, "token_set_struct_attr", "spacy/tokens/token.pxd") Token.set_struct_attr - +tag staticmethod - +tag nogil - -p Set the value of an attribute of the #[code TokenC] struct by attribute ID. - -+aside-code("Example"). - from spacy.attrs cimport TAG - from spacy.tokens cimport Token - - token = &doc.c[3] - Token.set_struct_attr(token, TAG, 0) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code token] - +cell #[code const TokenC*] - +cell A pointer to a #[code TokenC] struct. - - +row - +cell #[code feat_name] - +cell #[code attr_id_t] - +cell - | The ID of the attribute to look up. The attributes are - | enumerated in #[code spacy.typedefs]. - - +row - +cell #[code value] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell The value to set. - -+h(3, "token_by_start", "spacy/tokens/doc.pxd") token_by_start - +tag function - -p Find a token in a #[code TokenC*] array by the offset of its first character. - -+aside-code("Example"). - from spacy.tokens.doc cimport Doc, token_by_start - from spacy.vocab cimport Vocab - - doc = Doc(Vocab(), words=[u'hello', u'world']) - assert token_by_start(doc.c, doc.length, 6) == 1 - assert token_by_start(doc.c, doc.length, 4) == -1 - -+table(["Name", "Type", "Description"]) - +row - +cell #[code tokens] - +cell #[code const TokenC*] - +cell A #[code TokenC*] array. - - +row - +cell #[code length] - +cell #[code int] - +cell The number of tokens in the array. - - +row - +cell #[code start_char] - +cell #[code int] - +cell The start index to search for. - - +row("foot") - +cell returns - +cell #[code int] - +cell The index of the token in the array or #[code -1] if not found. - -+h(3, "token_by_end", "spacy/tokens/doc.pxd") token_by_end - +tag function - -p Find a token in a #[code TokenC*] array by the offset of its final character. - -+aside-code("Example"). - from spacy.tokens.doc cimport Doc, token_by_end - from spacy.vocab cimport Vocab - - doc = Doc(Vocab(), words=[u'hello', u'world']) - assert token_by_end(doc.c, doc.length, 5) == 0 - assert token_by_end(doc.c, doc.length, 1) == -1 - -+table(["Name", "Type", "Description"]) - +row - +cell #[code tokens] - +cell #[code const TokenC*] - +cell A #[code TokenC*] array. - - +row - +cell #[code length] - +cell #[code int] - +cell The number of tokens in the array. - - +row - +cell #[code end_char] - +cell #[code int] - +cell The end index to search for. - - +row("foot") - +cell returns - +cell #[code int] - +cell The index of the token in the array or #[code -1] if not found. - -+h(3, "set_children_from_heads", "spacy/tokens/doc.pxd") set_children_from_heads - +tag function - -p - | Set attributes that allow lookup of syntactic children on a - | #[code TokenC*] array. This function must be called after making changes - | to the #[code TokenC.head] attribute, in order to make the parse tree - | navigation consistent. - -+aside-code("Example"). - from spacy.tokens.doc cimport Doc, set_children_from_heads - from spacy.vocab cimport Vocab - - doc = Doc(Vocab(), words=[u'Baileys', u'from', u'a', u'shoe']) - doc.c[0].head = 0 - doc.c[1].head = 0 - doc.c[2].head = 3 - doc.c[3].head = 1 - set_children_from_heads(doc.c, doc.length) - assert doc.c[3].l_kids == 1 - -+table(["Name", "Type", "Description"]) - +row - +cell #[code tokens] - +cell #[code const TokenC*] - +cell A #[code TokenC*] array. - - +row - +cell #[code length] - +cell #[code int] - +cell The number of tokens in the array. diff --git a/website/api/_cython/_vocab.jade b/website/api/_cython/_vocab.jade deleted file mode 100644 index b0b975577..000000000 --- a/website/api/_cython/_vocab.jade +++ /dev/null @@ -1,88 +0,0 @@ -//- 💫 DOCS > API > CYTHON > CLASSES > VOCAB - -p - | A Cython class providing access and methods for a vocabulary and other - | data shared across a language. - -+infobox - | This section documents the extra C-level attributes and methods that - | can't be accessed from Python. For the Python documentation, see - | #[+api("vocab") #[code Vocab]]. - -+h(3, "vocab_attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code mem] - +cell #[code cymem.Pool] - +cell - | A memory pool. Allocated memory will be freed once the - | #[code Vocab] object is garbage collected. - - +row - +cell #[code strings] - +cell #[code StringStore] - +cell - | A #[code StringStore] that maps string to hash values and vice - | versa. - - +row - +cell #[code length] - +cell #[code int] - +cell The number of entries in the vocabulary. - -+h(3, "vocab_get") Vocab.get - +tag method - -p - | Retrieve a #[+api("cython-structs#lexemec") #[code LexemeC*]] pointer - | from the vocabulary. - -+aside-code("Example"). - lexeme = vocab.get(vocab.mem, u'hello') - -+table(["Name", "Type", "Description"]) - +row - +cell #[code mem] - +cell #[code cymem.Pool] - +cell - | A memory pool. Allocated memory will be freed once the - | #[code Vocab] object is garbage collected. - - +row - +cell #[code string] - +cell #[code unicode] - +cell The string of the word to look up. - - +row("foot") - +cell returns - +cell #[code const LexemeC*] - +cell The lexeme in the vocabulary. - -+h(3, "vocab_get_by_orth") Vocab.get_by_orth - +tag method - -p - | Retrieve a #[+api("cython-structs#lexemec") #[code LexemeC*]] pointer - | from the vocabulary. - -+aside-code("Example"). - lexeme = vocab.get_by_orth(doc[0].lex.norm) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code mem] - +cell #[code cymem.Pool] - +cell - | A memory pool. Allocated memory will be freed once the - | #[code Vocab] object is garbage collected. - - +row - +cell #[code orth] - +cell #[+abbr("uint64_t") #[code attr_t]] - +cell ID of the verbatim text content. - - +row("foot") - +cell returns - +cell #[code const LexemeC*] - +cell The lexeme in the vocabulary. diff --git a/website/api/_data.json b/website/api/_data.json deleted file mode 100644 index 6e269f074..000000000 --- a/website/api/_data.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "sidebar": { - "Overview": { - "Architecture": "./", - "Annotation Specs": "annotation", - "Command Line": "cli", - "Functions": "top-level" - }, - - "Containers": { - "Doc": "doc", - "Token": "token", - "Span": "span", - "Lexeme": "lexeme" - }, - - "Pipeline": { - "Language": "language", - "Pipe": "pipe", - "Tagger": "tagger", - "DependencyParser": "dependencyparser", - "EntityRecognizer": "entityrecognizer", - "TextCategorizer": "textcategorizer", - "Tokenizer": "tokenizer", - "Lemmatizer": "lemmatizer", - "Matcher": "matcher", - "PhraseMatcher": "phrasematcher" - }, - - "Other": { - "Vocab": "vocab", - "StringStore": "stringstore", - "Vectors": "vectors", - "GoldParse": "goldparse", - "GoldCorpus": "goldcorpus" - }, - - "Cython": { - "Architecture": "cython", - "Structs": "cython-structs", - "Classes": "cython-classes" - } - }, - - "index": { - "title": "Architecture", - "next": "annotation", - "menu": { - "Basics": "basics", - "Neural Network Model": "nn-model" - } - }, - - "cli": { - "title": "Command Line Interface", - "teaser": "Download, train and package models, and debug spaCy.", - "source": "spacy/cli" - }, - - "top-level": { - "title": "Top-level Functions", - "menu": { - "spacy": "spacy", - "displacy": "displacy", - "Utility Functions": "util", - "Compatibility": "compat" - } - }, - - "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" - }, - - "token": { - "title": "Token", - "tag": "class", - "source": "spacy/tokens/token.pyx" - }, - - "span": { - "title": "Span", - "tag": "class", - "source": "spacy/tokens/span.pyx" - }, - - "lexeme": { - "title": "Lexeme", - "tag": "class", - "source": "spacy/lexeme.pyx" - }, - - "vocab": { - "title": "Vocab", - "teaser": "A storage class for vocabulary and other data shared across a language.", - "tag": "class", - "source": "spacy/vocab.pyx" - }, - - "stringstore": { - "title": "StringStore", - "tag": "class", - "source": "spacy/strings.pyx" - }, - - "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", - "source": "spacy/pipeline.pyx" - }, - - "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" - }, - - "tokenizer": { - "title": "Tokenizer", - "teaser": "Segment text into words, punctuations marks etc.", - "tag": "class", - "source": "spacy/tokenizer.pyx" - }, - - "lemmatizer": { - "title": "Lemmatizer", - "teaser": "Assign the base forms of words.", - "tag": "class", - "source": "spacy/lemmatizer.py" - }, - - "tagger": { - "title": "Tagger", - "teaser": "Annotate part-of-speech tags on documents.", - "tag": "class", - "source": "spacy/pipeline.pyx" - }, - - "goldparse": { - "title": "GoldParse", - "tag": "class", - "source": "spacy/gold.pyx" - }, - - "goldcorpus": { - "title": "GoldCorpus", - "teaser": "An annotated corpus, using the JSON file format.", - "tag": "class", - "tag_new": 2, - "source": "spacy/gold.pyx" - }, - - "vectors": { - "title": "Vectors", - "teaser": "Store, save and load word vectors.", - "tag": "class", - "tag_new": 2, - "source": "spacy/vectors.pyx" - }, - - "annotation": { - "title": "Annotation Specifications", - "teaser": "Schemes used for labels, tags and training data.", - "menu": { - "Text Processing": "text-processing", - "POS Tagging": "pos-tagging", - "Dependencies": "dependency-parsing", - "Named Entities": "named-entities", - "Models & Training": "training" - } - }, - - "cython": { - "title": "Cython Architecture", - "next": "cython-structs", - "menu": { - "Overview": "overview", - "Conventions": "conventions" - } - }, - - "cython-structs": { - "title": "Cython Structs", - "teaser": "C-language objects that let you group variables together in a single contiguous block.", - "next": "cython-classes", - "menu": { - "TokenC": "tokenc", - "LexemeC": "lexemec" - } - }, - - "cython-classes": { - "title": "Cython Classes", - "menu": { - "Doc": "doc", - "Token": "token", - "Span": "span", - "Lexeme": "lexeme", - "Vocab": "vocab", - "StringStore": "stringstore" - } - } -} diff --git a/website/api/_top-level/_compat.jade b/website/api/_top-level/_compat.jade deleted file mode 100644 index 7de2f4102..000000000 --- a/website/api/_top-level/_compat.jade +++ /dev/null @@ -1,84 +0,0 @@ -//- 💫 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 - | underscore, e.e #[code unicode_]. - -+aside-code("Example"). - from spacy.compat import unicode_ - - compatible_unicode = unicode_('hello world') - -+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.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/api/_top-level/_displacy.jade b/website/api/_top-level/_displacy.jade deleted file mode 100644 index f0e2dc93f..000000000 --- a/website/api/_top-level/_displacy.jade +++ /dev/null @@ -1,259 +0,0 @@ -//- 💫 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("/usage/visualizers") visualizing spaCy]. - - -+h(3, "displacy.serve") displacy.serve - +tag method - +tag-new(2) - -p - | Serve a dependency parse tree or named entity visualization to view it - | in your browser. Will run a simple web server. - -+aside-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.') - displacy.serve([doc1, doc2], style='dep') - -+table(["Name", "Type", "Description", "Default"]) - +row - +cell #[code docs] - +cell list, #[code Doc], #[code Span] - +cell Document(s) to visualize. - +cell - - +row - +cell #[code style] - +cell unicode - +cell Visualization style, #[code 'dep'] or #[code 'ent']. - +cell #[code 'dep'] - - +row - +cell #[code page] - +cell bool - +cell Render markup as full HTML page. - +cell #[code True] - - +row - +cell #[code minify] - +cell bool - +cell Minify HTML markup. - +cell #[code False] - - +row - +cell #[code options] - +cell dict - +cell #[+a("#options") Visualizer-specific options], e.g. colors. - +cell #[code {}] - - +row - +cell #[code manual] - +cell bool - +cell - | Don't parse #[code Doc] and instead, expect a dict or list of - | dicts. #[+a("/usage/visualizers#manual-usage") See here] - | for formats and examples. - +cell #[code False] - - +row - +cell #[code port] - +cell int - +cell Port to serve visualization. - +cell #[code 5000] - - +row - +cell #[code host] - +cell unicode - +cell Host to serve visualization. - +cell #[code '0.0.0.0'] - -+h(3, "displacy.render") displacy.render - +tag method - +tag-new(2) - -p Render a dependency parse tree or named entity visualization. - -+aside-code("Example"). - import spacy - from spacy import displacy - nlp = spacy.load('en') - doc = nlp(u'This is a sentence.') - html = displacy.render(doc, style='dep') - -+table(["Name", "Type", "Description", "Default"]) - +row - +cell #[code docs] - +cell list, #[code Doc], #[code Span] - +cell Document(s) to visualize. - +cell - - +row - +cell #[code style] - +cell unicode - +cell Visualization style, #[code 'dep'] or #[code 'ent']. - +cell #[code 'dep'] - - +row - +cell #[code page] - +cell bool - +cell Render markup as full HTML page. - +cell #[code False] - - +row - +cell #[code minify] - +cell bool - +cell Minify HTML markup. - +cell #[code False] - - +row - +cell #[code jupyter] - +cell bool - +cell - | Explicitly enable "#[+a("http://jupyter.org/") Jupyter] mode" to - | return markup ready to be rendered in a notebook. - +cell detected automatically - - +row - +cell #[code options] - +cell dict - +cell #[+a("#options") Visualizer-specific options], e.g. colors. - +cell #[code {}] - - +row - +cell #[code manual] - +cell bool - +cell - | Don't parse #[code Doc] and instead, expect a dict or list of - | dicts. #[+a("/usage/visualizers#manual-usage") See here] - | for formats and examples. - +cell #[code False] - - +row("foot") - +cell returns - +cell unicode - +cell Rendered HTML markup. - +cell - -+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(4, "options-dep") Dependency Visualizer options - -+aside-code("Example"). - options = {'compact': True, 'color': 'blue'} - displacy.serve(doc, style='dep', options=options) - -+table(["Name", "Type", "Description", "Default"]) - +row - +cell #[code collapse_punct] - +cell bool - +cell - | Attach punctuation to tokens. Can make the parse more readable, - | as it prevents long arcs to attach punctuation. - +cell #[code True] - - +row - +cell #[code collapse_phrases] - +cell bool - +cell Merge noun phrases into one token. - +cell #[code False] - - +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'] - - +row - +cell #[code offset_x] - +cell int - +cell Spacing on left side of the SVG in px. - +cell #[code 50] - - +row - +cell #[code arrow_stroke] - +cell int - +cell Width of arrow path in px. - +cell #[code 2] - - +row - +cell #[code arrow_width] - +cell int - +cell Width of arrow head in px. - +cell #[code 10] / #[code 8] (compact) - - +row - +cell #[code arrow_spacing] - +cell int - +cell Spacing between arrows in px to avoid overlaps. - +cell #[code 20] / #[code 12] (compact) - - +row - +cell #[code word_spacing] - +cell int - +cell Vertical spacing between words and arcs in px. - +cell #[code 45] - - +row - +cell #[code distance] - +cell int - +cell Distance between words in px. - +cell #[code 175] / #[code 85] (compact) - -+h(4, "displacy_options-ent") Named Entity Visualizer options - -+aside-code("Example"). - options = {'ents': ['PERSON', 'ORG', 'PRODUCT'], - 'colors': {'ORG': 'yellow'}} - displacy.serve(doc, style='ent', options=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 uppercase should be mapped to - | color names or values. - +cell #[code {}] - -p - | 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. diff --git a/website/api/_top-level/_spacy.jade b/website/api/_top-level/_spacy.jade deleted file mode 100644 index c838d51ba..000000000 --- a/website/api/_top-level/_spacy.jade +++ /dev/null @@ -1,201 +0,0 @@ -//- 💫 DOCS > API > TOP-LEVEL > SPACY - -+h(3, "spacy.load") spacy.load - +tag function - +tag-model - -p - | Load a model via its #[+a("/usage/models#usage") shortcut link], - | the name of an installed - | #[+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 - | call the model's own #[code load()] method. If a model is loaded from a - | path, spaCy will assume it's a data directory, read the language and - | pipeline settings off the meta.json and initialise the #[code Language] - | class. The data will be loaded in via - | #[+api("language#from_disk") #[code Language.from_disk()]]. - -+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 = spacy.load('en', disable=['parser', 'tagger']) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code name] - +cell unicode or #[code Path] - +cell Model to load, i.e. shortcut link, package name or path. - - +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 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 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 - nlp.from_disk(model_data_path) # load in model data - -+infobox("Changed in v2.0", "⚠️") - | 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 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-wrapper - +code-new nlp = spacy.load('/model') - +code-old nlp = spacy.load('en', path='/model') - -+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 - | #[+a("https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes") 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 - | The same as the #[+api("cli#info") #[code info] command]. Pretty-print - | information about your installation, models and local setup from within - | spaCy. To get the model meta data as a dictionary instead, you can - | use the #[code meta] attribute on your #[code nlp] object with a - | loaded model, e.g. #[code nlp.meta]. - -+aside-code("Example"). - spacy.info() - spacy.info('en') - spacy.info('de', markdown=True) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code model] - +cell unicode - +cell A model, i.e. shortcut link, package name or path (optional). - - +row - +cell #[code markdown] - +cell bool - +cell Print information as Markdown. - - -+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")) #[code glossary.py]]. - -+aside-code("Example"). - spacy.explain(u'NORP') - # Nationalities or religious or political groups - - doc = nlp(u'Hello world') - for word in doc: - print(word.text, word.tag_, spacy.explain(word.tag_)) - # Hello UH interjection - # world NN noun, singular or mass - -+table(["Name", "Type", "Description"]) - +row - +cell #[code term] - +cell unicode - +cell Term to explain. - - +row("foot") - +cell returns - +cell unicode - +cell The explanation, or #[code None] if not found in the glossary. - -+h(3, "spacy.prefer_gpu") spacy.prefer_gpu - +tag function - +tag-new("2.0.14") - -p - | Allocate data and perform operations on #[+a("/usage/#gpu") GPU], if - | available. If data has already been allocated on CPU, it will not be - | moved. Ideally, this function should be called right after - | importing spaCy and #[em before] loading any models. - -+aside-code("Example"). - import spacy - activated = spacy.prefer_gpu() - nlp = spacy.load('en_core_web_sm') - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell Whether the GPU was activated. - -+h(3, "spacy.require_gpu") spacy.require_gpu - +tag function - +tag-new("2.0.14") - -p - | Allocate data and perform operations on #[+a("/usage/#gpu") GPU]. Will - | raise an error if no GPU is available. If data has already been allocated - | on CPU, it will not be moved. Ideally, this function should be called - | right after importing spaCy and #[em before] loading any models. - -+aside-code("Example"). - import spacy - spacy.require_gpu() - nlp = spacy.load('en_core_web_sm') - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell #[code True] diff --git a/website/api/_top-level/_util.jade b/website/api/_top-level/_util.jade deleted file mode 100644 index e2204ae6f..000000000 --- a/website/api/_top-level/_util.jade +++ /dev/null @@ -1,454 +0,0 @@ -//- 💫 DOCS > API > TOP-LEVEL > UTIL - -p - | spaCy comes with a small collection of utility functions located in - | #[+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 - | to use and we'll try to ensure backwards compatibility. However, we - | recommend having additional tests in place if your application depends on - | any of spaCy's utilities. - -+h(3, "util.get_data_path") util.get_data_path - +tag function - -p - | Get path to the data directory where spaCy looks for models. Defaults to - | #[code spacy/data]. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code require_exists] - +cell bool - +cell Only return path if it exists, otherwise return #[code None]. - - +row("foot") - +cell returns - +cell #[code Path] / #[code None] - +cell Data path or #[code None]. - -+h(3, "util.set_data_path") util.set_data_path - +tag function - -p - | Set custom path to the data directory where spaCy looks for models. - -+aside-code("Example"). - util.set_data_path('/custom/path') - util.get_data_path() - # PosixPath('/custom/path') - -+table(["Name", "Type", "Description"]) - +row - +cell #[code path] - +cell unicode or #[code Path] - +cell Path to new data directory. - -+h(3, "util.get_lang_class") util.get_lang_class - +tag function - -p - | Import and load a #[code Language] class. Allows lazy-loading - | #[+a("/usage/adding-languages") language data] and importing - | languages using the two-letter language code. To add a language code - | for a custom language class, you can use the - | #[+api("top-level#util.set_lang_class") #[code set_lang_class]] helper. - -+aside-code("Example"). - for lang_id in ['en', 'de']: - lang_class = util.get_lang_class(lang_id) - lang = lang_class() - tokenizer = lang.Defaults.create_tokenizer() - -+table(["Name", "Type", "Description"]) - +row - +cell #[code lang] - +cell unicode - +cell Two-letter language code, e.g. #[code 'en']. - - +row("foot") - +cell returns - +cell #[code Language] - +cell Language class. - -+h(3, "util.set_lang_class") util.set_lang_class - +tag function - -p - | Set a custom #[code Language] class name that can be loaded via - | #[+api("top-level#util.get_lang_class") #[code get_lang_class]]. If - | your model uses a custom language, this is required so that spaCy can - | load the correct class from the two-letter language code. - -+aside-code("Example"). - from spacy.lang.xy import CustomLanguage - - util.set_lang_class('xy', CustomLanguage) - lang_class = util.get_lang_class('xy') - nlp = lang_class() - -+table(["Name", "Type", "Description"]) - +row - +cell #[code name] - +cell unicode - +cell Two-letter language code, e.g. #[code 'en']. - - +row - +cell #[code cls] - +cell #[code Language] - +cell The language class, e.g. #[code English]. - -+h(3, "util.load_model") util.load_model - +tag function - +tag-new(2) - -p - | Load a model from a shortcut link, package or data path. If called with a - | shortcut link or package name, spaCy will assume the model is a Python - | package and import and call its #[code load()] method. If called with a - | path, spaCy will assume it's a data directory, read the language and - | pipeline settings from the meta.json and initialise a #[code Language] - | class. The model data will then be loaded in via - | #[+api("language#from_disk") #[code Language.from_disk()]]. - -+aside-code("Example"). - nlp = util.load_model('en') - nlp = util.load_model('en_core_web_sm', disable=['ner']) - nlp = util.load_model('/path/to/data') - -+table(["Name", "Type", "Description"]) - +row - +cell #[code name] - +cell unicode - +cell Package name, shortcut link or model path. - - +row - +cell #[code **overrides] - +cell - - +cell Specific overrides, like pipeline components to disable. - - +row("foot") - +cell returns - +cell #[code Language] - +cell #[code Language] class with the loaded model. - -+h(3, "util.load_model_from_path") util.load_model_from_path - +tag function - +tag-new(2) - -p - | Load a model from a data directory path. Creates the - | #[+api("language") #[code Language]] class and pipeline based on the - | directory's meta.json and then calls - | #[+api("language#from_disk") #[code from_disk()]] with the path. This - | function also makes it easy to test a new model that you haven't packaged - | yet. - -+aside-code("Example"). - nlp = load_model_from_path('/path/to/data') - -+table(["Name", "Type", "Description"]) - +row - +cell #[code model_path] - +cell unicode - +cell Path to model data directory. - - +row - +cell #[code meta] - +cell dict - +cell - | Model meta data. If #[code False], spaCy will try to load the - | meta from a meta.json in the same directory. - - +row - +cell #[code **overrides] - +cell - - +cell Specific overrides, like pipeline components to disable. - - +row("foot") - +cell returns - +cell #[code Language] - +cell #[code Language] class with the loaded model. - -+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-models", "template/model/xx_model_name/__init__.py")) #[code __init__.py]]. - -+aside-code("Example"). - from spacy.util import load_model_from_init_py - - def load(**overrides): - return load_model_from_init_py(__file__, **overrides) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code init_file] - +cell unicode - +cell Path to model's __init__.py, i.e. #[code __file__]. - - +row - +cell #[code **overrides] - +cell - - +cell Specific overrides, like pipeline components to disable. - - +row("foot") - +cell returns - +cell #[code Language] - +cell #[code Language] class with the loaded model. - -+h(3, "util.get_model_meta") util.get_model_meta - +tag function - +tag-new(2) - -p - | Get a model's meta.json from a directory path and validate its contents. - -+aside-code("Example"). - meta = util.get_model_meta('/path/to/model') - -+table(["Name", "Type", "Description"]) - +row - +cell #[code path] - +cell unicode or #[code Path] - +cell Path to model directory. - - +row("foot") - +cell returns - +cell dict - +cell The model's meta data. - -+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("/usage/models") model packages]. - -+aside-code("Example"). - util.is_package('en_core_web_sm') # True - util.is_package('xyz') # False - -+table(["Name", "Type", "Description"]) - +row - +cell #[code name] - +cell unicode - +cell Name of package. - - +row("foot") - +cell returns - +cell #[code bool] - +cell #[code True] if installed package, #[code False] if not. - -+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("/usage/models") model packages]. Currently imports the package - | to find its path. - -+aside-code("Example"). - util.get_package_path('en_core_web_sm') - # /usr/lib/python3.6/site-packages/en_core_web_sm - -+table(["Name", "Type", "Description"]) - +row - +cell #[code package_name] - +cell unicode - +cell Name of installed package. - - +row("foot") - +cell returns - +cell #[code Path] - +cell Path to model package directory. - -+h(3, "util.is_in_jupyter") util.is_in_jupyter - +tag function - +tag-new(2) - -p - | Check if user is running spaCy from a #[+a("https://jupyter.org") Jupyter] - | notebook by detecting the IPython kernel. Mainly used for the - | #[+api("top-level#displacy") #[code displacy]] visualizer. - -+aside-code("Example"). - html = '<h1>Hello world!</h1>' - if util.is_in_jupyter(): - from IPython.core.display import display, HTML - display(HTML(html)) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell #[code True] if in Jupyter, #[code False] if not. - -+h(3, "util.update_exc") util.update_exc - +tag function - -p - | Update, validate and overwrite - | #[+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. - -+aside-code("Example"). - BASE = {"a.": [{ORTH: "a."}], ":)": [{ORTH: ":)"}]} - NEW = {"a.": [{ORTH: "a.", LEMMA: "all"}]} - exceptions = util.update_exc(BASE, NEW) - # {"a.": [{ORTH: "a.", LEMMA: "all"}], ":)": [{ORTH: ":)"}]} - -+table(["Name", "Type", "Description"]) - +row - +cell #[code base_exceptions] - +cell dict - +cell Base tokenizer exceptions. - - +row - +cell #[code *addition_dicts] - +cell dicts - +cell Exception dictionaries to add to the base exceptions, in order. - - +row("foot") - +cell returns - +cell dict - +cell Combined tokenizer exceptions. - -+h(3, "util.minibatch") util.minibatch - +tag function - +tag-new(2) - -p - | Iterate over batches of items. #[code size] may be an iterator, so that - | batch-size can vary on each step. - -+aside-code("Example"). - batches = minibatch(train_data) - for batch in batches: - texts, annotations = zip(*batch) - nlp.update(texts, annotations) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code items] - +cell iterable - +cell The items to batch up. - - +row - +cell #[code size] - +cell int / iterable - +cell - | The batch size(s). Use - | #[+api("top-level#util.compounding") #[code util.compounding]] or - | #[+api("top-level#util.decaying") #[code util.decaying]] or - | for an infinite series of compounding or decaying values. - - +row("foot") - +cell yields - +cell list - +cell The batches. - -+h(3, "util.compounding") util.compounding - +tag function - +tag-new(2) - -p - | Yield an infinite series of compounding values. Each time the generator - | is called, a value is produced by multiplying the previous value by the - | compound rate. - -+aside-code("Example"). - sizes = compounding(1., 10., 1.5) - assert next(sizes) == 1. - assert next(sizes) == 1. * 1.5 - assert next(sizes) == 1.5 * 1.5 - -+table(["Name", "Type", "Description"]) - +row - +cell #[code start] - +cell int / float - +cell The first value. - - +row - +cell #[code stop] - +cell int / float - +cell The maximum value. - - +row - +cell #[code compound] - +cell int / float - +cell The compounding factor. - - +row("foot") - +cell yields - +cell int - +cell Compounding values. - -+h(3, "util.decaying") util.decaying - +tag function - +tag-new(2) - -p - | Yield an infinite series of linearly decaying values. - -+aside-code("Example"). - sizes = decaying(1., 10., 0.001) - assert next(sizes) == 1. - assert next(sizes) == 1. - 0.001 - assert next(sizes) == 0.999 - 0.001 - -+table(["Name", "Type", "Description"]) - +row - +cell #[code start] - +cell int / float - +cell The first value. - - +row - +cell #[code end] - +cell int / float - +cell The maximum value. - - +row - +cell #[code decay] - +cell int / float - +cell The decaying factor. - - +row("foot") - +cell yields - +cell int - +cell The decaying values. - -+h(3, "util.itershuffle") util.itershuffle - +tag function - +tag-new(2) - -p - | Shuffle an iterator. This works by holding #[code bufsize] items back and - | yielding them sometime later. Obviously, this is not unbiased – but - | should be good enough for batching. Larger bufsize means less bias. - -+aside-code("Example"). - values = range(1000) - shuffled = itershuffle(values) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code iterable] - +cell iterable - +cell Iterator to shuffle. - - +row - +cell #[code buffsize] - +cell int - +cell Items to hold back. - - +row("foot") - +cell yields - +cell iterable - +cell The shuffled iterator. diff --git a/website/api/annotation.jade b/website/api/annotation.jade deleted file mode 100644 index bff9a71cb..000000000 --- a/website/api/annotation.jade +++ /dev/null @@ -1,46 +0,0 @@ -//- 💫 DOCS > API > ANNOTATION SPECS - -include ../_includes/_mixins - -+section("text-processing") - +h(2, "text-processing") Text Processing - include _annotation/_text-processing - -+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("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, "training") Models and training data - - include _annotation/_training diff --git a/website/api/cli.jade b/website/api/cli.jade deleted file mode 100644 index 3fbeb5ece..000000000 --- a/website/api/cli.jade +++ /dev/null @@ -1,738 +0,0 @@ -//- 💫 DOCS > API > COMMAND LINE INTERFACE - -include ../_includes/_mixins - -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]. - -+h(3, "download") Download - -p - | 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("/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-2.0.0]). - -+aside("Downloading best practices") - | The #[code download] command is mostly intended as a convenient, - | interactive wrapper – it performs compatibility checks and prints - | 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("/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. - -+code(false, "bash", "$"). - python -m spacy download [model] [--direct] - -+table(["Argument", "Type", "Description"]) - +row - +cell #[code model] - +cell positional - +cell - | Model name or shortcut (#[code en], #[code de], - | #[code en_core_web_sm]). - - +row - +cell #[code --direct], #[code -d] - +cell flag - +cell Force direct download of exact model version. - - +row - +cell other - +tag-new(2.1) - +cell - - +cell - | Additional installation options to be passed to - | #[code pip install] when installing the model package. For - | example, #[code --user] to install to the user home directory. - - +row - +cell #[code --help], #[code -h] - +cell flag - +cell Show help message and available arguments. - - +row("foot") - +cell creates - +cell directory, symlink - +cell - | The installed model package in your #[code site-packages] - | directory and a shortcut link as a symlink in #[code spacy/data]. - -+h(3, "link") Link - -p - | 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()]]. - -+infobox("Important note") - | In spaCy v1.x, you had to use the model data directory to set up a shortcut - | link for a local path. As of v2.0, spaCy expects all shortcut links to - | be #[strong loadable model packages]. If you want to load a data directory, - | call #[+api("spacy#load") #[code spacy.load()]] or - | #[+api("language#from_disk") #[code Language.from_disk()]] with the path, - | or use the #[+api("cli#package") #[code package]] command to create a - | model package. - -+code(false, "bash", "$"). - python -m spacy link [origin] [link_name] [--force] - -+table(["Argument", "Type", "Description"]) - +row - +cell #[code origin] - +cell positional - +cell Model name if package, or path to local directory. - - +row - +cell #[code link_name] - +cell positional - +cell Name of the shortcut link to create. - - +row - +cell #[code --force], #[code -f] - +cell flag - +cell Force overwriting of existing link. - - +row - +cell #[code --help], #[code -h] - +cell flag - +cell Show help message and available arguments. - - +row("foot") - +cell creates - +cell symlink - +cell - | A shortcut link of the given name as a symlink in - | #[code spacy/data]. - -+h(3, "info") Info - -p - | Print information about your spaCy installation, models and local setup, - | and generate #[+a("https://en.wikipedia.org/wiki/Markdown") Markdown]-formatted - | markup to copy-paste into #[+a(gh("spacy") + "/issues") GitHub issues]. - -+code(false, "bash"). - python -m spacy info [--markdown] - python -m spacy info [model] [--markdown] - -+table(["Argument", "Type", "Description"]) - +row - +cell #[code model] - +cell positional - +cell A model, i.e. shortcut link, package name or path (optional). - - +row - +cell #[code --markdown], #[code -md] - +cell flag - +cell Print information as Markdown. - - +row - +cell #[code --silent], #[code -s] - +tag-new("2.0.12") - +cell flag - +cell Don't print anything, just return the values. - - +row - +cell #[code --help], #[code -h] - +cell flag - +cell Show help message and available arguments. - - +row("foot") - +cell prints - +cell #[code stdout] - +cell Information about your spaCy installation. - -+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. It will a list of models, the installed versions, the - | latest compatible version (if out of date) and the commands for updating. - -+aside("Automated validation") - | You can also use the #[code validate] command as part of your build - | process or test suite, to ensure all models are up to date before - | proceeding. If incompatible models or shortcut links are found, it will - | return #[code 1]. - -+code(false, "bash", "$"). - python -m spacy validate - -+table(["Argument", "Type", "Description"]) - +row("foot") - +cell prints - +cell #[code stdout] - +cell Details about the compatibility of your installed models. - -+h(3, "convert") Convert - -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 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). - python -m spacy convert [input_file] [output_dir] [--converter] [--n-sents] - [--morphology] - -+table(["Argument", "Type", "Description"]) - +row - +cell #[code input_file] - +cell positional - +cell Input file. - - +row - +cell #[code output_dir] - +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 - +cell Number of sentences per document. - - +row - +cell #[code --morphology], #[code -m] - +cell option - +cell Enable appending morphology to tags. - - +row - +cell #[code --help], #[code -h] - +cell flag - +cell Show help message and available arguments. - - +row("foot") - +cell creates - +cell JSON - +cell Data in spaCy's #[+a("/api/annotation#json-input") JSON format]. - -p The following file format 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 or IOB2 named entity recognition format. - -+h(3, "train") Train - -p - | Train a model. Expects data in spaCy's - | #[+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. - -+infobox("Changed in v2.1", "⚠️") - | As of spaCy 2.1, the #[code --no-tagger], #[code --no-parser] and - | #[code --no-parser] flags have been replaced by a #[code --pipeline] - | option, which lets you define comma-separated names of pipeline - | components to train. For example, #[code --pipeline tagger,parser] will - | only train the tagger and parser. - -+code(false, "bash", "$", false, false, true). - python -m spacy train [lang] [output_path] [train_path] [dev_path] - [--base-model] [--pipeline] [--vectors] [--n-iter] [--n-examples] [--use-gpu] - [--version] [--meta-path] [--init-tok2vec] [--parser-multitasks] - [--entity-multitasks] [--gold-preproc] [--noise-level] [--learn-tokens] - [--verbose] - -+table(["Argument", "Type", "Description"]) - +row - +cell #[code lang] - +cell positional - +cell Model language. - - +row - +cell #[code output_path] - +cell positional - +cell Directory to store model in. Will be created if it doesn't exist. - - +row - +cell #[code train_path] - +cell positional - +cell Location of JSON-formatted training data. - - +row - +cell #[code dev_path] - +cell positional - +cell Location of JSON-formatted development data for evaluation. - - +row - +cell #[code --base-model], #[code -b] - +cell option - +cell - | Optional name of base model to update. Can be any loadable - | spaCy model. - - +row - +cell #[code --pipeline], #[code -p] - +tag-new("2.1.0") - +cell option - +cell - | Comma-separated names of pipeline components to train. Defaults - | to #[code 'tagger,parser,ner']. - - +row - +cell #[code --vectors], #[code -v] - +cell option - +cell Model to load vectors from. - - +row - +cell #[code --n-iter], #[code -n] - +cell option - +cell Number of iterations (default: #[code 30]). - - +row - +cell #[code --n-examples], #[code -ns] - +cell option - +cell Number of examples to use (defaults to #[code 0] for all examples). - - +row - +cell #[code --use-gpu], #[code -g] - +cell option - +cell - | Whether to use GPU. Can be either #[code 0], #[code 1] or - | #[code -1]. - - +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 --meta-path], #[code -m] - +tag-new(2) - +cell option - +cell - | 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 --init-tok2vec], #[code -t2v] - +tag-new("2.1.0") - +cell option - +cell - | Path to pretrained weights for the token-to-vector parts of the - | models. See #[code spacy pretrain]. Experimental. - - +row - +cell #[code --parser-multitasks], #[code -pt] - +cell option - +cell - | Side objectives for parser CNN, e.g. #[code 'dep'] or - | #[code 'dep,tag'] - - +row - +cell #[code --entity-multitasks], #[code -et] - +cell option - +cell - | Side objectives for NER CNN, e.g. #[code 'dep'] or - | #[code 'dep,tag'] - - +row - +cell #[code --noise-level], #[code -nl] - +cell option - +cell Float indicating the amount of corruption for data agumentation. - - +row - +cell #[code --gold-preproc], #[code -G] - +cell flag - +cell Use gold preprocessing. - - +row - +cell #[code --learn-tokens], #[code -T] - +cell flag - +cell - | Make parser learn gold-standard tokenization by merging - ] subtokens. Typically used for languages like Chinese. - - +row - +cell #[code --verbose], #[code -VV] - +tag-new("2.0.13") - +cell flag - +cell Show more detailed messages during training. - - +row - +cell #[code --help], #[code -h] - +cell flag - +cell Show help message and available arguments. - - +row("foot") - +cell creates - +cell model, pickle - +cell A spaCy model on each epoch. - -+h(4, "train-hyperparams") Environment variables for hyperparameters - +tag-new(2) - -p - | spaCy lets you set hyperparameters for training via environment variables. - | This is useful, because it keeps the command simple and allows you to - | #[+a("https://askubuntu.com/questions/17536/how-do-i-create-a-permanent-bash-alias/17537#17537") create an alias] - | for your custom #[code train] command while still being able to easily - | tweak the hyperparameters. For example: - -+code(false, "bash", "$"). - parser_hidden_depth=2 parser_maxout_pieces=1 spacy train [...] - -+code("Usage with alias", "bash", "$"). - alias train-parser="spacy train en /output /data /train /dev -n 1000" - parser_maxout_pieces=1 train-parser - -+table(["Name", "Description", "Default"]) - +row - +cell #[code dropout_from] - +cell Initial dropout rate. - +cell #[code 0.2] - - +row - +cell #[code dropout_to] - +cell Final dropout rate. - +cell #[code 0.2] - - +row - +cell #[code dropout_decay] - +cell Rate of dropout change. - +cell #[code 0.0] - - +row - +cell #[code batch_from] - +cell Initial batch size. - +cell #[code 1] - - +row - +cell #[code batch_to] - +cell Final batch size. - +cell #[code 64] - - +row - +cell #[code batch_compound] - +cell Rate of batch size acceleration. - +cell #[code 1.001] - - +row - +cell #[code token_vector_width] - +cell Width of embedding tables and convolutional layers. - +cell #[code 128] - - +row - +cell #[code embed_size] - +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_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_width] - //- +cell Number of embedding dimensions for each action ID. - //- +cell #[code 128] - - +row - +cell #[code learn_rate] - +cell Learning rate. - +cell #[code 0.001] - - +row - +cell #[code optimizer_B1] - +cell Momentum for the Adam solver. - +cell #[code 0.9] - - +row - +cell #[code optimizer_B2] - +cell Adagrad-momentum for the Adam solver. - +cell #[code 0.999] - - +row - +cell #[code optimizer_eps] - +cell Epsilon value for the Adam solver. - +cell #[code 1e-08] - - +row - +cell #[code L2_penalty] - +cell L2 regularisation penalty. - +cell #[code 1e-06] - - +row - +cell #[code grad_norm_clip] - +cell Gradient L2 norm constraint. - +cell #[code 1.0] - -+h(3, "vocab") Vocab - +tag-new(2) - -p - | Compile a vocabulary from a - | #[+a("/api/annotation#vocab-jsonl") lexicon JSONL] file and optional - | word vectors. Will save out a valid spaCy model that you can load via - | #[+api("spacy#load") #[code spacy.load]] or package using the - | #[+api("cli#package") #[code package]] command. - -+code(false, "bash", "$"). - python -m spacy vocab [lang] [output_dir] [lexemes_loc] [vectors_loc] - -+table(["Argument", "Type", "Description"]) - +row - +cell #[code lang] - +cell positional - +cell - | Model language - | #[+a("https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes") ISO code], - | e.g. #[code en]. - - +row - +cell #[code output_dir] - +cell positional - +cell Model output directory. Will be created if it doesn't exist. - - +row - +cell #[code lexemes_loc] - +cell positional - +cell - | Location of lexical data in spaCy's - | #[+a("/api/annotation#vocab-jsonl") JSONL format]. - - +row - +cell #[code vectors_loc] - +cell positional - +cell Optional location of vectors data as numpy #[code .npz] file. - - +row("foot") - +cell creates - +cell model - +cell A spaCy model containing the vocab and vectors. - -+h(3, "init-model") Init Model - +tag-new(2) - -p - | Create a new model directory from raw data, like word frequencies, Brown - | clusters and word vectors. This command is similar to the - | #[code spacy model] command in v1.x. - -+code(false, "bash", "$", false, false, true). - python -m spacy init-model [lang] [output_dir] [freqs_loc] [--clusters-loc] [--vectors-loc] [--prune-vectors] - -+table(["Argument", "Type", "Description"]) - +row - +cell #[code lang] - +cell positional - +cell - | Model language - | #[+a("https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes") ISO code], - | e.g. #[code en]. - - +row - +cell #[code output_dir] - +cell positional - +cell Model output directory. Will be created if it doesn't exist. - - +row - +cell #[code freqs_loc] - +cell positional - +cell - | Location of word frequencies file. Should be a tab-separated - | file with three columns: frequency, document frequency and - | frequency count. - - +row - +cell #[code --clusters-loc], #[code -c] - +cell option - +cell - | Optional location of clusters file. Should be a tab-separated - | file with three columns: cluster, word and frequency. - - +row - +cell #[code --vectors-loc], #[code -v] - +cell option - +cell - | Optional location of vectors file. Should be a tab-separated - | file in Word2Vec format where the first column contains the word - | and the remaining columns the values. File can be provided in - | #[code .txt] format or as a zipped text file in #[code .zip] or - | #[code .tar.gz] format. - - +row - +cell #[code --prune-vectors], #[code -V] - +cell flag - +cell - | Number of vectors to prune the vocabulary to. Defaults to - | #[code -1] for no pruning. - - +row("foot") - +cell creates - +cell model - +cell A spaCy model containing the vocab and vectors. - -+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). - python -m 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. - - +row("foot") - +cell prints / creates - +cell #[code stdout], HTML - +cell Training results and optional displaCy visualizations. - - -+h(3, "package") Package - -p - | 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 #[code meta.json] is supplied, or a #[code meta.json] is - | found in the input directory, this file is used. Otherwise, the data can - | be entered directly from the command line. After packaging, you can run - | #[code python setup.py sdist] from the newly created directory to turn - | your model into an installable archive file. - -+code(false, "bash", "$", false, false, true). - python -m spacy package [input_dir] [output_dir] [--meta-path] [--create-meta] [--force] - -+aside-code("Example", "bash"). - python -m spacy package /input /output - cd /output/en_model-0.0.0 - python setup.py sdist - pip install dist/en_model-0.0.0.tar.gz - -+table(["Argument", "Type", "Description"]) - +row - +cell #[code input_dir] - +cell positional - +cell Path to directory containing model data. - - +row - +cell #[code output_dir] - +cell positional - +cell Directory to create package folder in. - - +row - +cell #[code --meta-path], #[code -m] - +cell option - +cell #[+tag-new(2)] Path to #[code meta.json] file (optional). - - +row - +cell #[code --create-meta], #[code -c] - +cell flag - +cell - | #[+tag-new(2)] Create a #[code meta.json] file on the command - | line, even if one already exists in the directory. If an - | existing file is found, its entries will be shown as the defaults - | in the command line prompt. - +row - +cell #[code --force], #[code -f] - +cell flag - +cell Force overwriting of existing folder in output directory. - - +row - +cell #[code --help], #[code -h] - +cell flag - +cell Show help message and available arguments. - - +row("foot") - +cell creates - +cell directory - +cell A Python package containing the spaCy model. diff --git a/website/api/cython-classes.jade b/website/api/cython-classes.jade deleted file mode 100644 index 9d7d8cc53..000000000 --- a/website/api/cython-classes.jade +++ /dev/null @@ -1,39 +0,0 @@ -//- 💫 DOCS > API > CYTHON > CLASSES - -include ../_includes/_mixins - -+section("doc") - +h(2, "doc", "spacy/tokens/doc.pxd") Doc - +tag cdef class - - include _cython/_doc - -+section("token") - +h(2, "token", "spacy/tokens/token.pxd") Token - +tag cdef class - - include _cython/_token - -+section("span") - +h(2, "span", "spacy/tokens/span.pxd") Span - +tag cdef class - - include _cython/_span - -+section("lexeme") - +h(2, "lexeme", "spacy/lexeme.pxd") Lexeme - +tag cdef class - - include _cython/_lexeme - -+section("vocab") - +h(2, "vocab", "spacy/vocab.pxd") Vocab - +tag cdef class - - include _cython/_vocab - -+section("stringstore") - +h(2, "stringstore", "spacy/strings.pxd") StringStore - +tag cdef class - - include _cython/_stringstore diff --git a/website/api/cython-structs.jade b/website/api/cython-structs.jade deleted file mode 100644 index bdaf01ac4..000000000 --- a/website/api/cython-structs.jade +++ /dev/null @@ -1,15 +0,0 @@ -//- 💫 DOCS > API > CYTHON > STRUCTS - -include ../_includes/_mixins - -+section("tokenc") - +h(2, "tokenc", "spacy/structs.pxd") TokenC - +tag C struct - - include _cython/_tokenc - -+section("lexemec") - +h(2, "lexemec", "spacy/structs.pxd") LexemeC - +tag C struct - - include _cython/_lexemec diff --git a/website/api/cython.jade b/website/api/cython.jade deleted file mode 100644 index 5a1853046..000000000 --- a/website/api/cython.jade +++ /dev/null @@ -1,176 +0,0 @@ -//- 💫 DOCS > API > CYTHON > ARCHITECTURE - -include ../_includes/_mixins - -+section("overview") - +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 - | This section documents spaCy's C-level data structures and - | interfaces, intended for use from Cython. Some of the attributes are - | primarily for internal use, and all C-level functions and methods are - | designed for speed over safety – if you make a mistake and access an - | array out-of-bounds, the program may crash abruptly. - - p - | With Cython there are four ways of declaring complex data types. - | Unfortunately we use all four in different places, as they all have - | different utility: - - +table(["Declaration", "Description", "Example"]) - +row - +cell #[code class] - +cell A normal Python class. - +cell #[+api("language") #[code Language]] - - +row - +cell #[code cdef class] - +cell - | A Python extension type. Differs from a normal Python class - | in that its attributes can be defined on the underlying - | struct. Can have C-level objects as attributes (notably - | structs and pointers), and can have methods which have - | C-level objects as arguments or return types. - +cell #[+api("cython-classes#lexeme") #[code Lexeme]] - - +row - +cell #[code cdef struct] - +cell - | A struct is just a collection of variables, sort of like a - | named tuple, except the memory is contiguous. Structs can't - | have methods, only attributes. - +cell #[+api("cython-structs#lexemec") #[code LexemeC]] - - +row - +cell #[code cdef cppclass] - +cell - | A C++ class. Like a struct, this can be allocated on the - | stack, but can have methods, a constructor and a destructor. - | Differs from `cdef class` in that it can be created and - | destroyed without acquiring the Python global interpreter - | lock. This style is the most obscure. - +cell #[+src(gh("spacy", "spacy/syntax/_state.pxd")) #[code StateC]] - - p - | The most important classes in spaCy are defined as #[code cdef class] - | objects. The underlying data for these objects is usually gathered - | into a struct, which is usually named #[code c]. For instance, the - | #[+api("cython-classses#lexeme") #[code Lexeme]] class holds a - | #[+api("cython-structs#lexemec") #[code LexemeC]] struct, at - | #[code Lexeme.c]. This lets you shed the Python container, and pass - | a pointer to the underlying data into C-level functions. - -+section("conventions") - +h(2, "conventions") Conventions - - 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/dependencyparser.jade b/website/api/dependencyparser.jade deleted file mode 100644 index e557ef9da..000000000 --- a/website/api/dependencyparser.jade +++ /dev/null @@ -1,6 +0,0 @@ -//- 💫 DOCS > API > DEPENDENCYPARSER - -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/doc.jade b/website/api/doc.jade deleted file mode 100644 index 7d304926c..000000000 --- a/website/api/doc.jade +++ /dev/null @@ -1,827 +0,0 @@ -//- 💫 DOCS > API > DOC - -include ../_includes/_mixins - -p - | A #[code Doc] is a sequence of #[+api("token") #[code Token]] objects. - | Access sentences and named entities, export annotations to numpy arrays, - | losslessly serialize to compressed binary strings. The #[code Doc] object - | holds an array of #[code TokenC] structs. The Python-level #[code Token] - | and #[+api("span") #[code Span]] objects are views of this array, i.e. - | they don't own the data themselves. - -+aside-code("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]) - -+h(2, "init") Doc.__init__ - +tag method - -p - | Construct a #[code Doc] object. The most common way to get a #[code Doc] - | object is via the #[code nlp] object. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell A storage container for lexical types. - - +row - +cell #[code words] - +cell - - +cell A list of strings to add to the container. - - +row - +cell #[code spaces] - +cell - - +cell - | A list of boolean values indicating whether each word has a - | subsequent space. Must have the same length as #[code words], if - | specified. Defaults to a sequence of #[code True]. - - +row("foot") - +cell returns - +cell #[code Doc] - +cell The newly constructed object. - -+h(2, "getitem") Doc.__getitem__ - +tag method - -p - | Get a #[+api("token") #[code Token]] object at position #[code i], where - | #[code i] is an integer. Negative indexing is supported, and follows the - | usual Python semantics, i.e. #[code doc[-2]] is #[code doc[len(doc) - 2]]. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - assert doc[0].text == 'Give' - assert doc[-1].text == '.' - span = doc[1:3] - assert span.text == 'it back' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code i] - +cell int - +cell The index of the token. - - +row("foot") - +cell returns - +cell #[code Token] - +cell The token at #[code doc[i]]. - -p - | Get a #[+api("span") #[code Span]] object, starting at position - | #[code start] (token index) and ending at position #[code end] (token - | index). - -p - | For instance, #[code doc[2:5]] produces a span consisting of tokens 2, 3 - | and 4. Stepped slices (e.g. #[code doc[start : end : step]]) are not - | supported, as #[code Span] objects must be contiguous (cannot have gaps). - | You can use negative indices and open-ended ranges, which have their - | normal Python semantics. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code start_end] - +cell tuple - +cell The slice of the document to get. - - +row("foot") - +cell returns - +cell #[code Span] - +cell The span at #[code doc[start : end]]. - -+h(2, "iter") Doc.__iter__ - +tag method - -p - | Iterate over #[code Token] objects, from which the annotations can be - | easily accessed. - -+aside-code("Example"). - doc = nlp(u'Give it back') - assert [t.text for t in doc] == [u'Give', u'it', u'back'] - -p - | This is the main way of accessing #[+api("token") #[code Token]] objects, - | which are the main way annotations are accessed from Python. If - | faster-than-Python speeds are required, you can instead access the - | annotations as a numpy array, or access the underlying C data directly - | from Cython. - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Token] - +cell A #[code Token] object. - -+h(2, "len") Doc.__len__ - +tag method - -p Get the number of tokens in the document. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - assert len(doc) == 7 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +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 import Doc - city_getter = lambda doc: any(city in doc.text for city 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 import Doc - Doc.set_extension('has_city', default=False) - extension = Doc.get_extension('has_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 import Doc - Doc.set_extension('has_city', default=False) - assert Doc.has_extension('has_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, "remove_extension") Doc.remove_extension - +tag classmethod - +tag-new("2.0.12") - -p Remove a previously registered extension. - -+aside-code("Example"). - from spacy.tokens import Doc - Doc.set_extension('has_city', default=False) - removed = Doc.remove_extension('has_city') - assert not Doc.has_extension('has_city') - -+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 - | removed extension. - -+h(2, "char_span") Doc.char_span - +tag method - +tag-new(2) - -p - | Create a #[code Span] object from the slice #[code doc.text[start : end]]. - | Returns #[code None] if the character indices don't map to a valid span. - -+aside-code("Example"). - doc = nlp(u'I like New York') - span = doc.char_span(7, 15, label=u'GPE') - assert span.text == 'New York' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code start] - +cell int - +cell The index of the first character of the span. - - +row - +cell #[code end] - +cell int - +cell The index of the last character after the span. - - +row - +cell #[code label] - +cell uint64 / unicode - +cell A label to attach to the Span, e.g. for named entities. - - +row - +cell #[code vector] - +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] - +cell A meaning representation of the span. - - +row("foot") - +cell returns - +cell #[code Span] - +cell The newly constructed object or #[code None]. - -+h(2, "similarity") Doc.similarity - +tag method - +tag-model("vectors") - -p - | Make a semantic similarity estimate. The default estimate is cosine - | similarity using an average of word vectors. - -+aside-code("Example"). - apples = nlp(u'I like apples') - oranges = nlp(u'I like oranges') - apples_oranges = apples.similarity(oranges) - oranges_apples = oranges.similarity(apples) - assert apples_oranges == oranges_apples - -+table(["Name", "Type", "Description"]) - +row - +cell #[code other] - +cell - - +cell - | The object to compare with. By default, accepts #[code Doc], - | #[code Span], #[code Token] and #[code Lexeme] objects. - - +row("foot") - +cell returns - +cell float - +cell A scalar similarity score. Higher is more similar. - -+h(2, "count_by") Doc.count_by - +tag method - -p - | Count the frequencies of a given attribute. Produces a dict of - | #[code {attr (int): count (ints)}] frequencies, keyed by the values - | of the given attribute ID. - -+aside-code("Example"). - from spacy.attrs import ORTH - doc = nlp(u'apple apple orange banana') - assert doc.count_by(ORTH) == {7024L: 1, 119552L: 1, 2087L: 2} - doc.to_array([attrs.ORTH]) - # array([[11880], [11880], [7561], [12800]]) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code attr_id] - +cell int - +cell The attribute ID - - +row("foot") - +cell returns - +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 - -p - | 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 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='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 (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 - -p - | Load attributes from a numpy array. Write to a #[code Doc] object, from - | an #[code (M, N)] array of attributes. - -+aside-code("Example"). - from spacy.attrs import LOWER, POS, ENT_TYPE, IS_ALPHA - from spacy.tokens import Doc - doc = nlp("Hello world!") - np_array = doc.to_array([LOWER, POS, ENT_TYPE, IS_ALPHA]) - doc2 = Doc(doc.vocab, words=[t.text for t in doc]) - doc2.from_array([LOWER, POS, ENT_TYPE, IS_ALPHA], np_array) - assert doc[0].pos_ == doc2[0].pos_ - -+table(["Name", "Type", "Description"]) - +row - +cell #[code attrs] - +cell ints - +cell A list of attribute ID ints. - - +row - +cell #[code array] - +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']] - +cell The attribute values to load. - - +row("foot") - +cell returns - +cell #[code Doc] - +cell Itself. - -+h(2, "to_disk") Doc.to_disk - +tag method - +tag-new(2) - -p Save the current state to a directory. - -+aside-code("Example"). - doc.to_disk('/path/to/doc') - -+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") Doc.from_disk - +tag method - +tag-new(2) - -p Loads state from a directory. Modifies the object in place and returns it. - -+aside-code("Example"). - from spacy.tokens import Doc - from spacy.vocab import Vocab - doc = Doc(Vocab()).from_disk('/path/to/doc') - -+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 Doc] - +cell The modified #[code Doc] object. - -+h(2, "to_bytes") Doc.to_bytes - +tag method - -p Serialize, i.e. export the document contents to a binary string. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - doc_bytes = doc.to_bytes() - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bytes - +cell - | A losslessly serialized copy of the #[code Doc], including all - | annotations. - -+h(2, "from_bytes") Doc.from_bytes - +tag method - -p Deserialize, i.e. import the document contents from a binary string. - -+aside-code("Example"). - from spacy.tokens import Doc - text = u'Give it back! He pleaded.' - doc = nlp(text) - bytes = doc.to_bytes() - doc2 = Doc(doc.vocab).from_bytes(bytes) - assert doc.text == doc2.text - -+table(["Name", "Type", "Description"]) - +row - +cell #[code data] - +cell bytes - +cell The string to load from. - - +row("foot") - +cell returns - +cell #[code Doc] - +cell The #[code Doc] object. - -+h(2, "merge") Doc.merge - +tag method - -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 #[code end_idx] do not mark start and end token - | boundaries, the document remains unchanged. - -+aside-code("Example"). - doc = nlp(u'Los Angeles start.') - doc.merge(0, len('Los Angeles'), 'NNP', 'Los Angeles', 'GPE') - assert [t.text for t in doc] == [u'Los Angeles', u'start', u'.'] - -+table(["Name", "Type", "Description"]) - +row - +cell #[code start_idx] - +cell int - +cell The character index of the start of the slice to merge. - - +row - +cell #[code end_idx] - +cell int - +cell The character index after the end of the slice to merge. - - +row - +cell #[code **attributes] - +cell - - +cell - | Attributes to assign to the merged token. By default, - | attributes are inherited from the syntactic root token of - | the span. - - +row("foot") - +cell returns - +cell #[code Token] - +cell - | The newly merged token, or #[code None] if the start and end - | indices did not fall at token boundaries - -+h(2, "print_tree") Doc.print_tree - +tag method - +tag-model("parse") - -p - | Returns the parse trees in JSON (dict) format. Especially useful for - | web applications. - -+aside-code("Example"). - doc = nlp(u'Alice ate the pizza.') - trees = doc.print_tree() - # {'modifiers': [ - # {'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'}], 'NE': '', 'word': 'pizza', 'arc': 'dobj', 'POS_coarse': 'NOUN', 'POS_fine': 'NN', 'lemma': 'pizza'}, - # {'modifiers': [], 'NE': '', 'word': '.', 'arc': 'punct', 'POS_coarse': 'PUNCT', 'POS_fine': '.', 'lemma': '.'} - # ], 'NE': '', 'word': 'ate', 'arc': 'ROOT', 'POS_coarse': 'VERB', 'POS_fine': 'VBD', 'lemma': 'eat'} - -+table(["Name", "Type", "Description"]) - +row - +cell #[code light] - +cell bool - +cell Don't include lemmas or entities. - - +row - +cell #[code flat] - +cell bool - +cell Don't include arcs or modifiers. - - +row("foot") - +cell returns - +cell dict - +cell Parse tree as dict. - -+h(2, "ents") Doc.ents - +tag property - +tag-model("NER") - -p - | Iterate over the entities in the document. Yields named-entity - | #[code Span] objects, if the entity recognizer has been applied to the - | document. - -+aside-code("Example"). - doc = nlp(u'Mr. Best flew to New York on Saturday morning.') - ents = list(doc.ents) - assert ents[0].label == 346 - assert ents[0].label_ == 'PERSON' - assert ents[0].text == 'Mr. Best' - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Span] - +cell Entities in the document. - -+h(2, "noun_chunks") Doc.noun_chunks - +tag property - +tag-model("parse") - -p - | 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. - -+aside-code("Example"). - doc = nlp(u'A phrase with another phrase occurs.') - chunks = list(doc.noun_chunks) - assert chunks[0].text == "A phrase" - assert chunks[1].text == "another phrase" - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Span] - +cell Noun chunks in the document. - -+h(2, "sents") Doc.sents - +tag property - +tag-model("parse") - -p - | Iterate over the sentences in the document. Sentence spans have no label. - | To improve accuracy on informal texts, spaCy calculates sentence boundaries - | from the syntactic dependency parse. If the parser is disabled, - | the #[code sents] iterator will be unavailable. - -+aside-code("Example"). - doc = nlp(u"This is a sentence. Here's another...") - sents = list(doc.sents) - assert len(sents) == 2 - assert [s.root.text for s in sents] == ["is", "'s"] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Span] - +cell Sentences in the document. - -+h(2, "has_vector") Doc.has_vector - +tag property - +tag-model("vectors") - -p - | A boolean value indicating whether a word vector is associated with the - | object. - -+aside-code("Example"). - doc = nlp(u'I like apples') - assert doc.has_vector - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell Whether the document has a vector data attached. - -+h(2, "vector") Doc.vector - +tag property - +tag-model("vectors") - -p - | A real-valued meaning representation. Defaults to an average of the - | token vectors. - -+aside-code("Example"). - doc = nlp(u'I like apples') - assert doc.vector.dtype == 'float32' - assert doc.vector.shape == (300,) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] - +cell A 1D numpy array representing the document's semantics. - -+h(2, "vector_norm") Doc.vector_norm - +tag property - +tag-model("vectors") - -p - | The L2 norm of the document's vector representation. - -+aside-code("Example"). - doc1 = nlp(u'I like apples') - doc2 = nlp(u'I like oranges') - doc1.vector_norm # 4.54232424414368 - doc2.vector_norm # 3.304373298575751 - assert doc1.vector_norm != doc2.vector_norm - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell float - +cell The L2 norm of the vector representation. - -+h(2, "attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code text] - +cell unicode - +cell A unicode representation of the document text. - - +row - +cell #[code text_with_ws] - +cell unicode - +cell - | An alias of #[code Doc.text], provided for duck-type compatibility - | with #[code Span] and #[code Token]. - - +row - +cell #[code mem] - +cell #[code Pool] - +cell The document's local memory heap, for all C data it owns. - - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell The store of lexical types. - - +row - +cell #[code tensor] #[+tag-new(2)] - +cell object - +cell Container for dense vector representations. - - +row - +cell #[code cats] #[+tag-new(2)] - +cell dictionary - +cell - | Maps either a label to a score for categories applied to whole - | document, or #[code (start_char, end_char, label)] to score for - | categories applied to spans. #[code start_char] and #[code end_char] - | should be character offsets, label can be either a string or an - | integer ID, and score should be a float. - - +row - +cell #[code user_data] - +cell - - +cell A generic storage area, for user custom data. - - +row - +cell #[code is_tagged] - +cell bool - +cell - | A flag indicating that the document has been part-of-speech - | tagged. - - +row - +cell #[code is_parsed] - +cell bool - +cell A flag indicating that the document has been syntactically parsed. - - +row - +cell #[code is_sentenced] - +cell bool - +cell - | A flag indicating that sentence boundaries have been applied to - | the document. - - +row - +cell #[code sentiment] - +cell float - +cell The document's positivity/negativity score, if available. - - +row - +cell #[code user_hooks] - +cell dict - +cell - | A dictionary that allows customisation of the #[code Doc]'s - | properties. - - +row - +cell #[code user_token_hooks] - +cell dict - +cell - | A dictionary that allows customisation of properties of - | #[code Token] children. - - +row - +cell #[code user_span_hooks] - +cell dict - +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/entityrecognizer.jade b/website/api/entityrecognizer.jade deleted file mode 100644 index a8b68e453..000000000 --- a/website/api/entityrecognizer.jade +++ /dev/null @@ -1,6 +0,0 @@ -//- 💫 DOCS > API > ENTITYRECOGNIZER - -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/goldcorpus.jade b/website/api/goldcorpus.jade deleted file mode 100644 index 5609c2530..000000000 --- a/website/api/goldcorpus.jade +++ /dev/null @@ -1,35 +0,0 @@ -//- 💫 DOCS > API > GOLDCORPUS - -include ../_includes/_mixins - -p - | This class manages annotations for tagging, dependency parsing and NER. - -+h(2, "init") GoldCorpus.__init__ - +tag method - -p Create a #[code GoldCorpus]. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code train] - +cell unicode or #[code Path] or iterable - +cell - | Training data, as a path (file or directory) or iterable. If an - | iterable, each item should be a #[code (text, paragraphs)] - | tuple, where each paragraph is a tuple - | #[code.u-break (sentences, brackets)],and each sentence is a - | tuple #[code.u-break (ids, words, tags, heads, ner)]. See the - | implementation of - | #[+src(gh("spacy", "spacy/gold.pyx")) #[code gold.read_json_file]] - | for further details. - - +row - +cell #[code dev] - +cell unicode or #[code Path] or iterable - +cell Development data, as a path (file or directory) or iterable. - - +row("foot") - +cell returns - +cell #[code GoldCorpus] - +cell The newly constructed object. diff --git a/website/api/goldparse.jade b/website/api/goldparse.jade deleted file mode 100644 index c96c0ccc0..000000000 --- a/website/api/goldparse.jade +++ /dev/null @@ -1,203 +0,0 @@ -//- 💫 DOCS > API > GOLDPARSE - -include ../_includes/_mixins - -p Collection for training annotations. - -+h(2, "init") GoldParse.__init__ - +tag method - -p Create a #[code GoldParse]. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code doc] - +cell #[code Doc] - +cell The document the annotations refer to. - - +row - +cell #[code words] - +cell iterable - +cell A sequence of unicode word strings. - - +row - +cell #[code tags] - +cell iterable - +cell A sequence of strings, representing tag annotations. - - +row - +cell #[code heads] - +cell iterable - +cell A sequence of integers, representing syntactic head offsets. - - +row - +cell #[code deps] - +cell iterable - +cell A sequence of strings, representing the syntactic relation types. - - +row - +cell #[code entities] - +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. - - +row("foot") - +cell returns - +cell #[code GoldParse] - +cell The newly constructed object. - -+h(2, "len") GoldParse.__len__ - +tag method - -p Get the number of gold-standard tokens. - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell int - +cell The number of gold-standard tokens. - -+h(2, "is_projective") GoldParse.is_projective - +tag property - -p - | Whether the provided syntactic annotations form a projective dependency - | tree. - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell Whether annotations form projective tree. - - -+h(2, "attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code tags] - +cell list - +cell The part-of-speech tag annotations. - - +row - +cell #[code heads] - +cell list - +cell The syntactic head annotations. - - +row - +cell #[code labels] - +cell list - +cell The syntactic relation-type annotations. - - +row - +cell #[code ents] - +cell list - +cell The named entity annotations. - - +row - +cell #[code cand_to_gold] - +cell list - +cell The alignment from candidate tokenization to gold tokenization. - - +row - +cell #[code gold_to_cand] - +cell list - +cell The alignment from gold tokenization to candidate tokenization. - - +row - +cell #[code cats] #[+tag-new(2)] - +cell list - +cell - | Entries in the list should be either a label, or a - | #[code (start, end, label)] triple. The tuple form is used for - | categories applied to spans of the document. - - -+h(2, "util") Utilities - -+h(3, "biluo_tags_from_offsets") gold.biluo_tags_from_offsets - +tag function - -p - | Encode labelled spans into per-token tags, using the - | #[+a("/api/annotation#biluo") BILUO scheme] (Begin/In/Last/Unit/Out). - -p - | Returns a list of unicode strings, describing the tags. Each tag string - | will be of the form of either #[code ""], #[code "O"] or - | #[code "{action}-{label}"], where action is one of #[code "B"], - | #[code "I"], #[code "L"], #[code "U"]. The string #[code "-"] - | is used where the entity offsets don't align with the tokenization in the - | #[code Doc] object. The training algorithm will view these as missing - | values. #[code O] denotes a non-entity token. #[code B] denotes the - | beginning of a multi-token entity, #[code I] the inside of an entity - | of three or more tokens, and #[code L] the end of an entity of two or - | more tokens. #[code U] denotes a single-token entity. - -+aside-code("Example"). - from spacy.gold import biluo_tags_from_offsets - - doc = nlp(u'I like London.') - entities = [(7, 13, 'LOC')] - tags = biluo_tags_from_offsets(doc, entities) - assert tags == ['O', 'O', 'U-LOC', 'O'] - -+table(["Name", "Type", "Description"]) - +row - +cell #[code doc] - +cell #[code Doc] - +cell - | The document that the entity offsets refer to. The output tags - | will refer to the token boundaries within the document. - - +row - +cell #[code entities] - +cell iterable - +cell - | A sequence of #[code (start, end, label)] triples. #[code start] - | and #[code end] should be character-offset integers denoting the - | slice into the original string. - - +row("foot") - +cell returns - +cell list - +cell - | Unicode strings, describing the - | #[+a("/api/annotation#biluo") BILUO] tags. - -+h(3, "offsets_from_biluo_tags") gold.offsets_from_biluo_tags - -p - | Encode per-token tags following the - | #[+a("/api/annotation#biluo") BILUO scheme] into entity offsets. - -+aside-code("Example"). - from spacy.gold import offsets_from_biluo_tags - - doc = nlp('I like London.') - tags = ['O', 'O', 'U-LOC', 'O'] - entities = offsets_from_biluo_tags(doc, tags) - assert entities == [(7, 13, 'LOC')] - -+table(["Name", "Type", "Description"]) - +row - +cell #[code doc] - +cell #[code Doc] - +cell The document that the BILUO tags refer to. - - +row - +cell #[code entities] - +cell iterable - +cell - | A sequence of #[+a("/api/annotation#biluo") BILUO] tags with - | each tag describing one token. Each tag string will be of the - | form of either #[code ""], #[code "O"] or - | #[code "{action}-{label}"], where action is one of #[code "B"], - | #[code "I"], #[code "L"], #[code "U"]. - - +row("foot") - +cell returns - +cell list - +cell - | A sequence of #[code (start, end, label)] triples. #[code start] - | and #[code end] will be character-offset integers denoting the - | slice into the original string. diff --git a/website/api/index.jade b/website/api/index.jade deleted file mode 100644 index 441d185e5..000000000 --- a/website/api/index.jade +++ /dev/null @@ -1,157 +0,0 @@ -//- 💫 DOCS > API > ARCHITECTURE - -include ../_includes/_mixins - -+section("basics") - include ../usage/_spacy-101/_architecture - -+section("nn-model") - +h(2, "nn-model") Neural network model architecture - - p - | spaCy's statistical models have been custom-designed to give a - | high-performance mix of speed and accuracy. The current architecture - | hasn't been published yet, but in the meantime we prepared a video that - | explains how the models work, with particular focus on NER. - - +youtube("sqDHBH9IjRU") - - 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 - | #[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 - | #[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/api/language.jade b/website/api/language.jade deleted file mode 100644 index 417e3543c..000000000 --- a/website/api/language.jade +++ /dev/null @@ -1,702 +0,0 @@ -//- 💫 DOCS > API > LANGUAGE - -include ../_includes/_mixins - -p - | Usually you'll load this once per process as #[code nlp] and pass the - | 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 - -p Initialise a #[code Language] object. - -+aside-code("Example"). - from spacy.vocab import Vocab - from spacy.language import Language - nlp = Language(Vocab()) - - from spacy.lang.en import English - nlp = English() - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell - | A #[code Vocab] object. If #[code True], a vocab is created via - | #[code Language.Defaults.create_vocab]. - - +row - +cell #[code make_doc] - +cell callable - +cell - | A function that takes text and returns a #[code Doc] object. - | Usually a #[code Tokenizer]. - - +row - +cell #[code meta] - +cell dict - +cell - | Custom meta data for the #[code Language] class. Is written to by - | models to add model meta data. - - +row("foot") - +cell returns - +cell #[code Language] - +cell The newly constructed object. - -+h(2, "call") Language.__call__ - +tag method - -p - | Apply the pipeline to some text. The text can span multiple sentences, - | and can contain arbtrary whitespace. Alignment into the original string - | is preserved. - -+aside-code("Example"). - doc = nlp(u'An example sentence. Another sentence.') - assert (doc[0].text, doc[0].head.tag_) == ('An', 'NN') - -+table(["Name", "Type", "Description"]) - +row - +cell #[code text] - +cell unicode - +cell The text to be processed. - - +row - +cell #[code disable] - +cell list - +cell - | Names of pipeline components to - | #[+a("/usage/processing-pipelines#disabling") disable]. - - +row("foot") - +cell returns - +cell #[code Doc] - +cell A container for accessing the annotations. - -+infobox("Changed in v2.0", "⚠️") - | Pipeline components to prevent from being loaded can now be added as - | a list to #[code disable], instead of specifying one keyword argument - | per component. - - +code-wrapper - +code-new doc = nlp(u"I don't want parsed", disable=['parser']) - +code-old doc = nlp(u"I don't want parsed", parse=False) - -+h(2, "pipe") Language.pipe - +tag method - -p - | Process texts as a stream, and yield #[code Doc] objects in order. - | Supports GIL-free multi-threading. - -+infobox("Important note for spaCy v2.0.x", "⚠️") - | By default, multiple threads will be launched for matrix multiplication, - | which may be inefficient on multi-core machines. Setting - | #[code OPENBLAS_NUM_THREADS=1] should fix this problem. spaCy v2.1.x - | will be switching to single-thread by default. - -+aside-code("Example"). - texts = [u'One document.', u'...', u'Lots of documents'] - for doc in nlp.pipe(texts, batch_size=50, n_threads=4): - assert doc.is_parsed - -+table(["Name", "Type", "Description"]) - +row - +cell #[code texts] - +cell - - +cell A sequence of unicode objects. - - +row - +cell #[code as_tuples] - +cell bool - +cell - | If set to #[code True], inputs should be a sequence of - | #[code (text, context)] tuples. Output will then be a sequence of - | #[code (doc, context)] tuples. Defaults to #[code False]. - - +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 2]. - - +row - +cell #[code batch_size] - +cell int - +cell The number of texts to buffer. - - +row - +cell #[code disable] - +cell list - +cell - | Names of pipeline components to - | #[+a("/usage/processing-pipelines#disabling") disable]. - - +row("foot") - +cell yields - +cell #[code Doc] - +cell Documents in the order of the original text. - -+h(2, "update") Language.update - +tag method - -p Update the models in the pipeline. - -+aside-code("Example"). - 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) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code docs] - +cell iterable - +cell - | A batch of #[code Doc] objects or unicode. If unicode, a - | #[code Doc] object will be created from the text. - - +row - +cell #[code golds] - +cell iterable - +cell - | A batch of #[code GoldParse] objects or dictionaries. - | Dictionaries will be used to create - | #[+api("goldparse") #[code GoldParse]] objects. For the available - | keys and their usage, see - | #[+api("goldparse#init") #[code GoldParse.__init__]]. - - +row - +cell #[code drop] - +cell float - +cell The dropout rate. - - +row - +cell #[code sgd] - +cell callable - +cell An optimizer. - - +row("foot") - +cell returns - +cell dict - +cell Results from the update. - -+h(2, "begin_training") Language.begin_training - +tag method - -p - | Allocate models, pre-process training data and acquire an optimizer. - -+aside-code("Example"). - optimizer = nlp.begin_training(gold_tuples) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code gold_tuples] - +cell iterable - +cell Gold-standard training data. - - +row - +cell #[code **cfg] - +cell - - +cell Config parameters. - - +row("foot") - +cell returns - +cell callable - +cell An optimizer. - -+h(2, "use_params") Language.use_params - +tag contextmanager - +tag method - -p - | Replace weights of models in the pipeline with those provided in the - | params dictionary. Can be used as a contextmanager, in which case, models - | go back to their original weights after the block. - -+aside-code("Example"). - with nlp.use_params(optimizer.averages): - nlp.to_disk('/tmp/checkpoint') - -+table(["Name", "Type", "Description"]) - +row - +cell #[code params] - +cell dict - +cell A dictionary of parameters keyed by model ID. - - +row - +cell #[code **cfg] - +cell - - +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 - | handles nonprojectivity and adds missing tags to the tag map. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code docs_golds] - +cell iterable - +cell Tuples of #[code Doc] and #[code GoldParse] objects. - - +row("foot") - +cell yields - +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, "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) - -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, "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) - -p - | Save the current state to a directory. If a model is loaded, this will - | #[strong include the model]. - -+aside-code("Example"). - nlp.to_disk('/path/to/models') - -+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. - - +row - +cell #[code disable] - +cell list - +cell - | Names of pipeline components to - | #[+a("/usage/processing-pipelines#disabling") disable] - | and prevent from being saved. - -+h(2, "from_disk") Language.from_disk - +tag method - +tag-new(2) - -p - | Loads state from a directory. Modifies the object in place and returns - | it. If the saved #[code Language] object contains a model, the - | model will be loaded. Note that this method is commonly used via the - | subclasses like #[code English] or #[code German] to make - | language-specific functionality like the - | #[+a("/usage/adding-languages#lex-attrs") lexical attribute getters] - | available to the loaded object. - -+aside-code("Example"). - from spacy.language import Language - nlp = Language().from_disk('/path/to/model') - - # using language-specific subclass - from spacy.lang.en import English - nlp = English().from_disk('/path/to/en_model') - -+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 - +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 The modified #[code Language] object. - -+infobox("Changed in v2.0", "⚠️") - | As of spaCy v2.0, the #[code save_to_directory] method has been - | renamed to #[code to_disk], to improve consistency across classes. - | Pipeline components to prevent from being loaded can now be added as - | a list to #[code disable], instead of specifying one keyword argument - | per component. - - +code-wrapper - +code-new nlp = English().from_disk(disable=['tagger', 'ner']) - +code-old nlp = spacy.load('en', tagger=False, entity=False) - -+h(2, "to_bytes") Language.to_bytes - +tag method - -p Serialize the current state to a binary string. - -+aside-code("Example"). - nlp_bytes = nlp.to_bytes() - -+table(["Name", "Type", "Description"]) - +row - +cell #[code disable] - +cell list - +cell - | Names of pipeline components to - | #[+a("/usage/processing-pipelines#disabling") disable] - | and prevent from being serialized. - - +row("foot") - +cell returns - +cell bytes - +cell The serialized form of the #[code Language] object. - -+h(2, "from_bytes") Language.from_bytes - +tag method - -p - | Load state from a binary string. Note that this method is commonly used - | via the subclasses like #[code English] or #[code German] to make - | language-specific functionality like the - | #[+a("/usage/adding-languages#lex-attrs") lexical attribute getters] - | available to the loaded object. - -+aside-code("Example"). - from spacy.lang.en import English - nlp_bytes = nlp.to_bytes() - nlp2 = English() - nlp2.from_bytes(nlp_bytes) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code bytes_data] - +cell bytes - +cell The data to load from. - - +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 The #[code Language] object. - -+infobox("Changed in v2.0", "⚠️") - | Pipeline components to prevent from being loaded can now be added as - | a list to #[code disable], instead of specifying one keyword argument - | per component. - - +code-wrapper - +code-new nlp = English().from_bytes(bytes, disable=['tagger', 'ner']) - +code-old nlp = English().from_bytes('en', tagger=False, entity=False) - -+h(2, "attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell A container for the lexical types. - - +row - +cell #[code tokenizer] - +cell #[code Tokenizer] - +cell The tokenizer. - - +row - +cell #[code make_doc] - +cell #[code lambda text: Doc] - +cell Create a #[code Doc] object from unicode text. - - +row - +cell #[code pipeline] - +cell list - +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] - +cell dict - +cell - | 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"]) - +row - +cell #[code Defaults] - +cell class - +cell - | Settings, data and factory methods for creating the - | #[code nlp] object and processing pipeline. - - +row - +cell #[code lang] - +cell unicode - +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. diff --git a/website/api/lemmatizer.jade b/website/api/lemmatizer.jade deleted file mode 100644 index eb061f10a..000000000 --- a/website/api/lemmatizer.jade +++ /dev/null @@ -1,160 +0,0 @@ -//- 💫 DOCS > API > LEMMATIZER - -include ../_includes/_mixins - -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. diff --git a/website/api/lexeme.jade b/website/api/lexeme.jade deleted file mode 100644 index c4da5b43e..000000000 --- a/website/api/lexeme.jade +++ /dev/null @@ -1,384 +0,0 @@ -//- 💫 DOCS > API > LEXEME - -include ../_includes/_mixins - -p - | An entry in the vocabulary. A #[code 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 (if lemmatization depends - | on the part-of-speech tag). - -+h(2, "init") Lexeme.__init__ - +tag method - -p Create a #[code Lexeme] object. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell The parent vocabulary. - - +row - +cell #[code orth] - +cell int - +cell The orth id of the lexeme. - - +row("foot") - +cell returns - +cell #[code Lexeme] - +cell The newly constructed object. - -+h(2, "set_flag") Lexeme.set_flag - +tag method - -p Change the value of a boolean flag. - -+aside-code("Example"). - COOL_FLAG = nlp.vocab.add_flag(lambda text: False) - nlp.vocab[u'spaCy'].set_flag(COOL_FLAG, True) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code flag_id] - +cell int - +cell The attribute ID of the flag to set. - - +row - +cell #[code value] - +cell bool - +cell The new value of the flag. - -+h(2, "check_flag") Lexeme.check_flag - +tag method - -p Check the value of a boolean flag. - -+aside-code("Example"). - is_my_library = lambda text: text in ['spaCy', 'Thinc'] - MY_LIBRARY = nlp.vocab.add_flag(is_my_library) - assert nlp.vocab[u'spaCy'].check_flag(MY_LIBRARY) == True - -+table(["Name", "Type", "Description"]) - +row - +cell #[code flag_id] - +cell int - +cell The attribute ID of the flag to query. - - +row("foot") - +cell returns - +cell bool - +cell The value of the flag. - -+h(2, "similarity") Lexeme.similarity - +tag method - +tag-model("vectors") - -p Compute a semantic similarity estimate. Defaults to cosine over vectors. - -+aside-code("Example"). - apple = nlp.vocab[u'apple'] - orange = nlp.vocab[u'orange'] - apple_orange = apple.similarity(orange) - orange_apple = orange.similarity(apple) - assert apple_orange == orange_apple - -+table(["Name", "Type", "Description"]) - +row - +cell other - +cell - - +cell - | The object to compare with. By default, accepts #[code Doc], - | #[code Span], #[code Token] and #[code Lexeme] objects. - - +row("foot") - +cell returns - +cell float - +cell A scalar similarity score. Higher is more similar. - - -+h(2, "has_vector") Lexeme.has_vector - +tag property - +tag-model("vectors") - -p - | A boolean value indicating whether a word vector is associated with the - | lexeme. - -+aside-code("Example"). - apple = nlp.vocab[u'apple'] - assert apple.has_vector - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell Whether the lexeme has a vector data attached. - -+h(2, "vector") Lexeme.vector - +tag property - +tag-model("vectors") - -p A real-valued meaning representation. - -+aside-code("Example"). - apple = nlp.vocab[u'apple'] - assert apple.vector.dtype == 'float32' - assert apple.vector.shape == (300,) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] - +cell A 1D numpy array representing the lexeme's semantics. - -+h(2, "vector_norm") Lexeme.vector_norm - +tag property - +tag-model("vectors") - -p The L2 norm of the lexeme's vector representation. - -+aside-code("Example"). - apple = nlp.vocab[u'apple'] - pasta = nlp.vocab[u'pasta'] - apple.vector_norm # 7.1346845626831055 - pasta.vector_norm # 7.759851932525635 - assert apple.vector_norm != pasta.vector_norm - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell float - +cell The L2 norm of the vector representation. - -+h(2, "attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +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]). Exists - | 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 Lowercase form of the word. - - +row - +cell #[code lower_] - +cell unicode - +cell Lowercase form of the word. - - +row - +cell #[code shape] - +cell int - +cell Transform of the word's string, to show orthographic features. - - +row - +cell #[code shape_] - +cell unicode - +cell Transform of the word's string, to show orthographic features. - - +row - +cell #[code prefix] - +cell int - +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]. - - +row - +cell #[code suffix] - +cell int - +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]. - - +row - +cell #[code is_alpha] - +cell bool - +cell - | Does the lexeme consist of alphabetic characters? Equivalent to - | #[code lexeme.text.isalpha()]. - - +row - +cell #[code is_ascii] - +cell bool - +cell - | Does the lexeme consist of ASCII characters? Equivalent to - | #[code [any(ord(c) >= 128 for c in lexeme.text)]]. - - +row - +cell #[code is_digit] - +cell bool - +cell - | Does the lexeme consist of digits? Equivalent to - | #[code lexeme.text.isdigit()]. - - +row - +cell #[code is_lower] - +cell bool - +cell - | 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 - +cell - | Is the lexeme in titlecase? Equivalent to - | #[code lexeme.text.istitle()]. - - +row - +cell #[code is_punct] - +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 - +cell - | 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 is_currency] - +tag-new("2.0.8") - +cell bool - +cell Is the lexeme a currency symbol? - - +row - +cell #[code like_url] - +cell bool - +cell Does the lexeme resemble a URL? - - +row - +cell #[code like_num] - +cell bool - +cell Does the lexeme represent a number? e.g. "10.9", "10", "ten", etc. - - +row - +cell #[code like_email] - +cell bool - +cell Does the lexeme resemble an email address? - - +row - +cell #[code is_oov] - +cell bool - +cell Is the lexeme out-of-vocabulary? - - +row - +cell #[code is_stop] - +cell bool - +cell Is the lexeme part of a "stop list"? - - +row - +cell #[code lang] - +cell int - +cell Language of the parent vocabulary. - - +row - +cell #[code lang_] - +cell unicode - +cell Language of the parent vocabulary. - - +row - +cell #[code prob] - +cell float - +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. diff --git a/website/api/matcher.jade b/website/api/matcher.jade deleted file mode 100644 index 00260a109..000000000 --- a/website/api/matcher.jade +++ /dev/null @@ -1,281 +0,0 @@ -//- 💫 DOCS > API > MATCHER - -include ../_includes/_mixins - -+infobox("Changed in v2.0", "⚠️") - | 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 - | patterns and a callback for a given match ID. #[code Matcher.get_entity] - | is now called #[+api("matcher#get") #[code matcher.get]]. - | #[code Matcher.load] (not useful, as it didn't allow specifying callbacks), - | and #[code Matcher.has_entity] (now redundant) have been removed. The - | concept of "acceptor functions" has also been retired – this logic can - | now be handled in the callback functions. - -+h(2, "init") Matcher.__init__ - +tag method - -p Create the rule-based #[code Matcher]. - -+aside-code("Example"). - from spacy.matcher import Matcher - - patterns = {'HelloWorld': [{'LOWER': 'hello'}, {'LOWER': 'world'}]} - matcher = Matcher(nlp.vocab) - -+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 patterns] - +cell dict - +cell Patterns to add to the matcher, keyed by ID. - - +row("foot") - +cell returns - +cell #[code Matcher] - +cell The newly constructed object. - -+h(2, "call") Matcher.__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) - pattern = [{'LOWER': "hello"}, {'LOWER': "world"}] - matcher.add("HelloWorld", None, pattern) - doc = nlp(u'hello world!') - 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. - -+infobox("Important note") - | By default, the matcher #[strong does not perform any action] on matches, - | like tagging matched phrases with entity types. Instead, actions need to - | be specified when #[strong adding patterns or entities], by - | passing in a callback function as the #[code on_match] argument on - | #[+api("matcher#add") #[code add]]. This allows you to define custom - | 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("/usage/linguistic-features#rule-based-matching") rule-based matching]. - -+h(2, "pipe") Matcher.pipe - +tag method - -p Match a stream of documents, yielding them in turn. - -+aside-code("Example"). - from spacy.matcher import Matcher - matcher = Matcher(nlp.vocab) - for doc in matcher.pipe(docs, 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 Matcher] implementation supports - | multi-threading. - - +row - +cell #[code return_matches] - +tag-new(2.1) - +cell bool - +cell - | Yield the match lists along with the docs, making results - | #[code (doc, matches)] tuples. - - +row - +cell #[code as_tuples] - +tag-new(2.1) - +cell bool - +cell - | Interpret the input stream as #[code (doc, context)] tuples, and - | yield #[code (result, context)] tuples out. If both - | #[code return_matches] and #[code as_tuples] are #[code True], - | the output will be a sequence of - | #[code ((doc, matches), context)] tuples. - - +row("foot") - +cell yields - +cell #[code Doc] - +cell Documents, in order. - -+h(2, "len") Matcher.__len__ - +tag method - +tag-new(2) - -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 = Matcher(nlp.vocab) - assert len(matcher) == 0 - matcher.add('Rule', None, [{'ORTH': 'test'}]) - assert len(matcher) == 1 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell int - +cell The number of rules. - -+h(2, "contains") Matcher.__contains__ - +tag method - +tag-new(2) - -p Check whether the matcher contains rules for a match ID. - -+aside-code("Example"). - matcher = Matcher(nlp.vocab) - assert 'Rule' not in matcher - matcher.add('Rule', None, [{'ORTH': 'test'}]) - assert 'Rule' in matcher - -+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") Matcher.add - +tag method - +tag-new(2) - -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 = Matcher(nlp.vocab) - matcher.add('HelloWorld', on_match, [{'LOWER': 'hello'}, {'LOWER': 'world'}]) - matcher.add('GoogleMaps', on_match, [{'ORTH': 'Google'}, {'ORTH': 'Maps'}]) - doc = nlp(u'HELLO WORLD on Google Maps.') - 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 *patterns] - +cell list - +cell - | Match pattern. A pattern consists of a list of dicts, where each - | dict describes a token. - -+infobox("Changed in v2.0", "⚠️") - | 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 - | patterns and a callback for a given match ID. - - +code-wrapper - +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'}]) - -+h(2, "remove") Matcher.remove - +tag method - +tag-new(2) - -p - | Remove a rule from the matcher. A #[code KeyError] is raised if the match - | ID does not exist. - -+aside-code("Example"). - matcher.add('Rule', None, [{'ORTH': 'test'}]) - assert 'Rule' in matcher - matcher.remove('Rule') - assert 'Rule' not in matcher - -+table(["Name", "Type", "Description"]) - +row - +cell #[code key] - +cell unicode - +cell The ID of the match rule. - -+h(2, "get") Matcher.get - +tag method - +tag-new(2) - -p - | Retrieve the pattern stored for a key. Returns the rule as an - | #[code (on_match, patterns)] tuple containing the callback and available - | patterns. - -+aside-code("Example"). - pattern = [{'ORTH': 'test'}] - matcher.add('Rule', None, pattern) - on_match, patterns = matcher.get('Rule') - -+table(["Name", "Type", "Description"]) - +row - +cell #[code key] - +cell unicode - +cell The ID of the match rule. - - +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 deleted file mode 100644 index 219b8c0bf..000000000 --- a/website/api/phrasematcher.jade +++ /dev/null @@ -1,181 +0,0 @@ -//- 💫 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 - | sequences 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 = PhraseMatcher(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 Maximum 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 PhraseMatcher - - 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) - -+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 'OBAMA' not in matcher - matcher.add('OBAMA', None, nlp(u"Barack Obama")) - assert 'OBAMA' in matcher - -+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 deleted file mode 100644 index c0ec86972..000000000 --- a/website/api/pipe.jade +++ /dev/null @@ -1,449 +0,0 @@ -//- 💫 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 under development for - | 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) - #{VARNAME}.from_disk('/path/to/model') - -+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 float - +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 - | Initialise the pipe for training, using data exampes if available. If no - | model has been initialised yet, the model is added. - -+aside-code("Example"). - #{VARNAME} = #{CLASSNAME}(nlp.vocab) - nlp.pipeline.append(#{VARNAME}) - optimizer = #{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. - - +row - +cell #[code sgd] - +cell callable - +cell - | An optional optimizer. Should take two arguments #[code weights] - | and #[code gradient], and an optional ID. Will be created via - | #[+api(CLASSNAME.toLowerCase() + "#create_optimizer") #[code create_optimizer]] - | if not set. - - +row("foot") - +cell returns - +cell callable - +cell An optimizer. - -+h(2, "create_optimizer") #{CLASSNAME}.create_optimizer - +tag method - -p - | Create an optmizer for the pipeline component. - -+aside-code("Example"). - #{VARNAME} = #{CLASSNAME}(nlp.vocab) - optimizer = #{VARNAME}.create_optimizer() - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell callable - +cell The optimizer. - -+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, "add_label") #{CLASSNAME}.add_label - +tag method - -p Add a new label to the pipe. - -if CLASSNAME == "Tagger" - +aside-code("Example"). - #{VARNAME} = #{CLASSNAME}(nlp.vocab) - #{VARNAME}.add_label('MY_LABEL', {POS: 'NOUN'}) -else - +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. - - if CLASSNAME == "Tagger" - +row - +cell #[code values] - +cell dict - +cell - | Optional values to map to the label, e.g. a tag map - | dictionary. - -+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/api/span.jade b/website/api/span.jade deleted file mode 100644 index 8f9837889..000000000 --- a/website/api/span.jade +++ /dev/null @@ -1,655 +0,0 @@ -//- 💫 DOCS > API > SPAN - -include ../_includes/_mixins - -p A slice from a #[+api("doc") #[code Doc]] object. - -+h(2, "init") Span.__init__ - +tag method - -p Create a Span object from the #[code slice doc[start : end]]. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - span = doc[1:4] - assert [t.text for t in span] == [u'it', u'back', u'!'] - -+table(["Name", "Type", "Description"]) - +row - +cell #[code doc] - +cell #[code Doc] - +cell The parent document. - - +row - +cell #[code start] - +cell int - +cell The index of the first token of the span. - - +row - +cell #[code end] - +cell int - +cell The index of the first token after the span. - - +row - +cell #[code label] - +cell int - +cell A label to attach to the span, e.g. for named entities. - - +row - +cell #[code vector] - +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] - +cell A meaning representation of the span. - - +row("foot") - +cell returns - +cell #[code Span] - +cell The newly constructed object. - -+h(2, "getitem") Span.__getitem__ - +tag method - -p Get a #[code Token] object. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - span = doc[1:4] - assert span[1].text == 'back' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code i] - +cell int - +cell The index of the token within the span. - - +row("foot") - +cell returns - +cell #[code Token] - +cell The token at #[code span[i]]. - -p Get a #[code Span] object. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - span = doc[1:4] - assert span[1:3].text == 'back!' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code start_end] - +cell tuple - +cell The slice of the span to get. - - +row("foot") - +cell returns - +cell #[code Span] - +cell The span at #[code span[start : end]]. - -+h(2, "iter") Span.__iter__ - +tag method - -p Iterate over #[code Token] objects. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - span = doc[1:4] - assert [t.text for t in span] == ['it', 'back', '!'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Token] - +cell A #[code Token] object. - -+h(2, "len") Span.__len__ - +tag method - -p Get the number of tokens in the span. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - span = doc[1:4] - assert len(span) == 3 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +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 import Span - city_getter = lambda span: any(city in span.text for city 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 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 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, "remove_extension") Span.remove_extension - +tag classmethod - +tag-new("2.0.12") - -p Remove a previously registered extension. - -+aside-code("Example"). - from spacy.tokens import Span - Span.set_extension('is_city', default=False) - removed = Span.remove_extension('is_city') - assert not Span.has_extension('is_city') - -+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 - | removed extension. - -+h(2, "similarity") Span.similarity - +tag method - +tag-model("vectors") - -p - | Make a semantic similarity estimate. The default estimate is cosine - | similarity using an average of word vectors. - -+aside-code("Example"). - doc = nlp(u'green apples and red oranges') - green_apples = doc[:2] - red_oranges = doc[3:] - apples_oranges = green_apples.similarity(red_oranges) - oranges_apples = red_oranges.similarity(green_apples) - assert apples_oranges == oranges_apples - -+table(["Name", "Type", "Description"]) - +row - +cell #[code other] - +cell - - +cell - | The object to compare with. By default, accepts #[code Doc], - | #[code Span], #[code Token] and #[code Lexeme] objects. - - +row("foot") - +cell returns - +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) - -p - | Given a list of #[code M] attribute IDs, export the tokens to a numpy - | #[code ndarray] of shape #[code (N, M)], where #[code N] is the length of - | the document. The values will be 32-bit integers. - -+aside-code("Example"). - from spacy.attrs import LOWER, POS, ENT_TYPE, IS_ALPHA - doc = nlp(u'I like New York in Autumn.') - span = doc[2:3] - # All strings mapped to integers, for easy export to numpy - np_array = span.to_array([LOWER, POS, ENT_TYPE, IS_ALPHA]) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code attr_ids] - +cell list - +cell A list of attribute ID ints. - - +row("foot") - +cell returns - +cell #[code.u-break numpy.ndarray[long, ndim=2]] - +cell - | A feature matrix, with one row per word, and one column per - | attribute indicated in the input #[code attr_ids]. - -+h(2, "merge") Span.merge - +tag method - -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:4] - span.merge() - assert len(doc) == 6 - assert doc[2].text == 'New York' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code **attributes] - +cell - - +cell - | Attributes to assign to the merged token. By default, attributes - | are inherited from the syntactic root token of the span. - - +row("foot") - +cell returns - +cell #[code Token] - +cell The newly merged token. - -+h(2, "ents") Span.ents - +tag property - +tag-model("NER") - +tag-new("2.0.12") - -p - | Iterate over the entities in the span. Yields named-entity - | #[code Span] objects, if the entity recognizer has been applied to the - | parent document. - -+aside-code("Example"). - doc = nlp(u'Mr. Best flew to New York on Saturday morning.') - span = doc[0:6] - ents = list(span.ents) - assert ents[0].label == 346 - assert ents[0].label_ == 'PERSON' - assert ents[0].text == 'Mr. Best' - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Span] - +cell Entities in the document. - - -+h(2, "as_doc") Span.as_doc - -p - | Create a new #[code Doc] object corresponding to the #[code Span], with - | a copy of the data. - -+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") - -p - | The token within the span that's highest in the parse tree. If there's a - | tie, the earliest is preferred. - -+aside-code("Example"). - doc = nlp(u'I like New York in Autumn.') - i, like, new, york, in_, autumn, dot = range(len(doc)) - assert doc[new].head.text == 'York' - assert doc[york].head.text == 'like' - new_york = doc[new:york+1] - assert new_york.root.text == 'York' - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell #[code Token] - +cell The root token. - -+h(2, "lefts") Span.lefts - +tag property - +tag-model("parse") - -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.') - lefts = [t.text for t in doc[3:7].lefts] - assert lefts == [u'New'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Token] - +cell A left-child of a token of the span. - -+h(2, "rights") Span.rights - +tag property - +tag-model("parse") - -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.') - rights = [t.text for t in doc[2:4].rights] - assert rights == [u'in'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +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") - -p Tokens within the span and tokens which descend from them. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - subtree = [t.text for t in doc[:3].subtree] - assert subtree == [u'Give', u'it', u'back', u'!'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Token] - +cell A token within the span, or a descendant from it. - -+h(2, "has_vector") Span.has_vector - +tag property - +tag-model("vectors") - -p - | A boolean value indicating whether a word vector is associated with the - | object. - -+aside-code("Example"). - doc = nlp(u'I like apples') - assert doc[1:].has_vector - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell Whether the span has a vector data attached. - -+h(2, "vector") Span.vector - +tag property - +tag-model("vectors") - -p - | A real-valued meaning representation. Defaults to an average of the - | token vectors. - -+aside-code("Example"). - doc = nlp(u'I like apples') - assert doc[1:].vector.dtype == 'float32' - assert doc[1:].vector.shape == (300,) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] - +cell A 1D numpy array representing the span's semantics. - -+h(2, "vector_norm") Span.vector_norm - +tag property - +tag-model("vectors") - -p - | The L2 norm of the span's vector representation. - -+aside-code("Example"). - doc = nlp(u'I like apples') - doc[1:].vector_norm # 4.800883928527915 - doc[2:].vector_norm # 6.895897646384268 - assert doc[1:].vector_norm != doc[2:].vector_norm - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell float - +cell The L2 norm of the vector representation. - -+h(2, "attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code doc] - +cell #[code Doc] - +cell The parent document. - - +row - +cell #[code sent] - +cell #[code Span] - +cell The sentence span that this span is a part of. - - +row - +cell #[code start] - +cell int - +cell The token offset for the start of the span. - - +row - +cell #[code end] - +cell int - +cell The token offset for the end of the span. - - +row - +cell #[code start_char] - +cell int - +cell The character offset for the start of the span. - - +row - +cell #[code end_char] - +cell int - +cell The character offset for the end of the span. - - +row - +cell #[code text] - +cell unicode - +cell A unicode representation of the span text. - - +row - +cell #[code text_with_ws] - +cell unicode - +cell - | 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]). Exists - | mostly for consistency with the other attributes. - - +row - +cell #[code label] - +cell int - +cell The span's label. - - +row - +cell #[code label_] - +cell unicode - +cell The span's label. - - +row - +cell #[code lemma_] - +cell unicode - +cell The span's lemma. - - +row - +cell #[code ent_id] - +cell int - +cell The hash value of the named entity the token is an instance of. - - +row - +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/stringstore.jade b/website/api/stringstore.jade deleted file mode 100644 index 9d03404cc..000000000 --- a/website/api/stringstore.jade +++ /dev/null @@ -1,239 +0,0 @@ -//- 💫 DOCS > API > STRINGSTORE - -include ../_includes/_mixins - -p - | Look up strings by 64-bit hashes. As of v2.0, spaCy uses hash values - | instead of integer IDs. This ensures that strings always map to the - | same ID, even from different #[code StringStores]. - -+h(2, "init") StringStore.__init__ - +tag method - -p - | Create the #[code StringStore]. - -+aside-code("Example"). - from spacy.strings import StringStore - stringstore = StringStore([u'apple', u'orange']) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code strings] - +cell iterable - +cell A sequence of unicode strings to add to the store. - - +row("foot") - +cell returns - +cell #[code StringStore] - +cell The newly constructed object. - -+h(2, "len") StringStore.__len__ - +tag method - -p Get the number of strings in the store. - -+aside-code("Example"). - stringstore = StringStore([u'apple', u'orange']) - assert len(stringstore) == 2 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell int - +cell The number of strings in the store. - -+h(2, "getitem") StringStore.__getitem__ - +tag method - -p Retrieve a string from a given hash, or vice versa. - -+aside-code("Example"). - stringstore = StringStore([u'apple', u'orange']) - apple_hash = stringstore[u'apple'] - assert apple_hash == 8566208034543834098 - assert stringstore[apple_hash] == u'apple' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string_or_id] - +cell bytes, unicode or uint64 - +cell The value to encode. - - +row("foot") - +cell returns - +cell unicode or int - +cell The value to be retrieved. - -+h(2, "contains") StringStore.__contains__ - +tag method - -p Check whether a string is in the store. - -+aside-code("Example"). - stringstore = StringStore([u'apple', u'orange']) - assert u'apple' in stringstore - assert not u'cherry' in stringstore - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The string to check. - - +row("foot") - +cell returns - +cell bool - +cell Whether the store contains the string. - -+h(2, "iter") StringStore.__iter__ - +tag method - -p - | Iterate over the strings in the store, in order. Note that a newly - | initialised store will always include an empty string #[code ''] at - | position #[code 0]. - -+aside-code("Example"). - stringstore = StringStore([u'apple', u'orange']) - all_strings = [s for s in stringstore] - assert all_strings == [u'apple', u'orange'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell unicode - +cell A string in the store. - -+h(2, "add") StringStore.add - +tag method - +tag-new(2) - -p Add a string to the #[code StringStore]. - -+aside-code("Example"). - stringstore = StringStore([u'apple', u'orange']) - banana_hash = stringstore.add(u'banana') - assert len(stringstore) == 3 - assert banana_hash == 2525716904149915114 - assert stringstore[banana_hash] == u'banana' - assert stringstore[u'banana'] == banana_hash - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The string to add. - - +row("foot") - +cell returns - +cell uint64 - +cell The string's hash value. - - -+h(2, "to_disk") StringStore.to_disk - +tag method - +tag-new(2) - -p Save the current state to a directory. - -+aside-code("Example"). - stringstore.to_disk('/path/to/strings') - -+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") StringStore.from_disk - +tag method - +tag-new(2) - -p Loads state from a directory. Modifies the object in place and returns it. - -+aside-code("Example"). - from spacy.strings import StringStore - stringstore = StringStore().from_disk('/path/to/strings') - -+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 StringStore] - +cell The modified #[code StringStore] object. - -+h(2, "to_bytes") StringStore.to_bytes - +tag method - -p Serialize the current state to a binary string. - -+aside-code("Example"). - store_bytes = stringstore.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 StringStore] object. - -+h(2, "from_bytes") StringStore.from_bytes - +tag method - -p Load state from a binary string. - -+aside-code("Example"). - fron spacy.strings import StringStore - store_bytes = stringstore.to_bytes() - new_store = StringStore().from_bytes(store_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 StringStore] - +cell The #[code StringStore] object. - -+h(2, "util") Utilities - -+h(3, "hash_string") strings.hash_string - +tag function - -p Get a 64-bit hash for a given string. - -+aside-code("Example"). - from spacy.strings import hash_string - assert hash_string(u'apple') == 8566208034543834098 - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The string to hash. - - +row("foot") - +cell returns - +cell uint64 - +cell The hash. diff --git a/website/api/tagger.jade b/website/api/tagger.jade deleted file mode 100644 index 7a7e9214f..000000000 --- a/website/api/tagger.jade +++ /dev/null @@ -1,6 +0,0 @@ -//- 💫 DOCS > API > TAGGER - -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/textcategorizer.jade b/website/api/textcategorizer.jade deleted file mode 100644 index 0f81b56eb..000000000 --- a/website/api/textcategorizer.jade +++ /dev/null @@ -1,19 +0,0 @@ -//- 💫 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. 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. - -//- This class inherits from Pipe, so this page uses the template in pipe.jade. -!=partial("pipe", { subclass: "TextCategorizer", short: "textcat", pipeline_id: "textcat" }) diff --git a/website/api/token.jade b/website/api/token.jade deleted file mode 100644 index 1303a37ec..000000000 --- a/website/api/token.jade +++ /dev/null @@ -1,890 +0,0 @@ - -//- 💫 DOCS > API > TOKEN - -include ../_includes/_mixins - -p An individual token — i.e. a word, punctuation symbol, whitespace, etc. - -+h(2, "init") Token.__init__ - +tag method - -p Construct a #[code Token] object. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - token = doc[0] - assert token.text == u'Give' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell A storage container for lexical types. - - +row - +cell #[code doc] - +cell #[code Doc] - +cell The parent document. - - +row - +cell #[code offset] - +cell int - +cell The index of the token within the document. - - +row("foot") - +cell returns - +cell #[code Token] - +cell The newly constructed object. - -+h(2, "len") Token.__len__ - +tag method - -p The number of unicode characters in the token, i.e. #[code token.text]. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - token = doc[0] - assert len(token) == 4 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +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 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 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 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, "remove_extension") Token.remove_extension - +tag classmethod - +tag-new("2.0.11") - -p Remove a previously registered extension. - -+aside-code("Example"). - from spacy.tokens import Token - Token.set_extension('is_fruit', default=False) - removed = Token.remove_extension('is_fruit') - assert not Token.has_extension('is_fruit') - -+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 - | removed extension. - -+h(2, "check_flag") Token.check_flag - +tag method - -p Check the value of a boolean flag. - -+aside-code("Example"). - from spacy.attrs import IS_TITLE - doc = nlp(u'Give it back! He pleaded.') - token = doc[0] - assert token.check_flag(IS_TITLE) == True - -+table(["Name", "Type", "Description"]) - +row - +cell #[code flag_id] - +cell int - +cell The attribute ID of the flag to check. - - +row("foot") - +cell returns - +cell bool - +cell Whether the flag is set. - -+h(2, "similarity") Token.similarity - +tag method - +tag-model("vectors") - -p Compute a semantic similarity estimate. Defaults to cosine over vectors. - -+aside-code("Example"). - apples, _, oranges = nlp(u'apples and oranges') - apples_oranges = apples.similarity(oranges) - oranges_apples = oranges.similarity(apples) - assert apples_oranges == oranges_apples - -+table(["Name", "Type", "Description"]) - +row - +cell other - +cell - - +cell - | The object to compare with. By default, accepts #[code Doc], - | #[code Span], #[code Token] and #[code Lexeme] objects. - - +row("foot") - +cell returns - +cell float - +cell A scalar similarity score. Higher is more similar. - -+h(2, "nbor") Token.nbor - +tag method - -p Get a neighboring token. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - give_nbor = doc[0].nbor() - assert give_nbor.text == u'it' - -+table(["Name", "Type", "Description"]) - +row - +cell #[code i] - +cell int - +cell The relative position of the token to get. Defaults to #[code 1]. - - +row("foot") - +cell returns - +cell #[code Token] - +cell The token at position #[code self.doc[self.i+i]]. - -+h(2, "is_ancestor") Token.is_ancestor - +tag method - +tag-model("parse") - -p - | Check whether this token is a parent, grandparent, etc. of another - | in the dependency tree. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - give = doc[0] - it = doc[1] - assert give.is_ancestor(it) - -+table(["Name", "Type", "Description"]) - +row - +cell descendant - +cell #[code Token] - +cell Another token. - - +row("foot") - +cell returns - +cell bool - +cell Whether this token is the ancestor of the descendant. - -+h(2, "ancestors") Token.ancestors - +tag property - +tag-model("parse") - -p The rightmost token of this token's syntactic descendants. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - it_ancestors = doc[1].ancestors - assert [t.text for t in it_ancestors] == [u'Give'] - he_ancestors = doc[4].ancestors - assert [t.text for t in he_ancestors] == [u'pleaded'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Token] - +cell - | A sequence of ancestor tokens such that - | #[code ancestor.is_ancestor(self)]. - -+h(2, "conjuncts") Token.conjuncts - +tag property - +tag-model("parse") - -p A sequence of coordinated tokens, including the token itself. - -+aside-code("Example"). - doc = nlp(u'I like apples and oranges') - apples_conjuncts = doc[2].conjuncts - assert [t.text for t in apples_conjuncts] == [u'oranges'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Token] - +cell A coordinated token. - -+h(2, "children") Token.children - +tag property - +tag-model("parse") - -p A sequence of the token's immediate syntactic children. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - give_children = doc[0].children - assert [t.text for t in give_children] == [u'it', u'back', u'!'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +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") - -p A sequence containing the token and all the token's syntactic descendants. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - give_subtree = doc[0].subtree - assert [t.text for t in give_subtree] == [u'Give', u'it', u'back', u'!'] - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Token] - +cell A descendant token such that #[code self.is_ancestor(token) or token == self]. - -+h(2, "is_sent_start") Token.is_sent_start - +tag property - +tag-new(2) - -p - | A boolean value indicating whether the token starts a sentence. - | #[code None] if unknown. - -+aside-code("Example"). - doc = nlp(u'Give it back! He pleaded.') - assert doc[4].is_sent_start - assert not doc[5].is_sent_start - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell Whether the token starts a sentence. - -+infobox("Changed in v2.0", "⚠️") - | As of spaCy v2.0, the #[code Token.sent_start] property is deprecated and - | has been replaced with #[code Token.is_sent_start], which returns a - | boolean value instead of a misleading #[code 0] for #[code False] and - | #[code 1] for #[code True]. It also now returns #[code None] if the - | answer is unknown, and fixes a quirk in the old logic that would always - | set the property to #[code 0] for the first word of the document. - - +code-wrapper - +code-new assert doc[4].is_sent_start == True - +code-old assert doc[4].sent_start == 1 - -+h(2, "has_vector") Token.has_vector - +tag property - +tag-model("vectors") - -p - | A boolean value indicating whether a word vector is associated with the - | token. - -+aside-code("Example"). - doc = nlp(u'I like apples') - apples = doc[2] - assert apples.has_vector - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell Whether the token has a vector data attached. - -+h(2, "vector") Token.vector - +tag property - +tag-model("vectors") - -p A real-valued meaning representation. - -+aside-code("Example"). - doc = nlp(u'I like apples') - apples = doc[2] - assert apples.vector.dtype == 'float32' - assert apples.vector.shape == (300,) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] - +cell A 1D numpy array representing the token's semantics. - -+h(2, "vector_norm") Token.vector_norm - +tag property - +tag-model("vectors") - -p The L2 norm of the token's vector representation. - -+aside-code("Example"). - doc = nlp(u'I like apples and pasta') - apples = doc[2] - pasta = doc[4] - apples.vector_norm # 6.89589786529541 - pasta.vector_norm # 7.759851932525635 - assert apples.vector_norm != pasta.vector_norm - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell float - +cell The L2 norm of the vector representation. - -+h(2, "attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code doc] - +cell #[code Doc] - +cell The parent document. - - +row - +cell #[code sent] - +tag-new("2.0.12") - +cell #[code Span] - +cell The sentence span that this token is a part of. - - +row - +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 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]). Exists - | mostly for consistency with the other attributes. - - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell The vocab object of the parent #[code Doc]. - - +row - +cell #[code doc] - +cell #[code Doc] - +cell The parent document. - - +row - +cell #[code head] - +cell #[code Token] - +cell The syntactic parent, or "governor", of this token. - - +row - +cell #[code left_edge] - +cell #[code Token] - +cell The leftmost token of this token's syntactic descendants. - - +row - +cell #[code right_edge] - +cell #[code Token] - +cell The rightmost token of this token's syntactic descendants. - - +row - +cell #[code i] - +cell int - +cell The index of the token within the parent document. - - +row - +cell #[code ent_type] - +cell int - +cell Named entity type. - - +row - +cell #[code ent_type_] - +cell unicode - +cell Named entity type. - - +row - +cell #[code ent_iob] - +cell int - +cell - | IOB code of named entity tag. #[code "B"] - | means the token begins an entity, #[code "I"] means it is inside - | an entity, #[code "O"] means it is outside an entity, and - | #[code ""] means no entity tag is set. - - +row - +cell #[code ent_iob_] - +cell unicode - +cell - | IOB code of named entity tag. #[code "B"] - | means the token begins an entity, #[code "I"] means it is inside - | an entity, #[code "O"] means it is outside an entity, and - | #[code ""] means no entity tag is set. - - +row - +cell #[code ent_id] - +cell int - +cell - | ID of the entity the token is an instance of, if any. Currently - | not used, but potentially for coreference resolution. - - +row - +cell #[code ent_id_] - +cell unicode - +cell - | ID of the entity the token is an instance of, if any. Currently - | not used, but potentially for coreference resolution. - - +row - +cell #[code lemma] - +cell int - +cell - | Base form of the token, with no inflectional suffixes. - - +row - +cell #[code lemma_] - +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 Lowercase form of the token. - - +row - +cell #[code lower_] - +cell unicode - +cell - | Lowercase form of the token text. Equivalent to - | #[code Token.text.lower()]. - - +row - +cell #[code shape] - +cell int - +cell - | Transform of the tokens's string, to show orthographic features. - | For example, "Xxxx" or "dd". - - +row - +cell #[code shape_] - +cell unicode - +cell - | Transform of the tokens's string, to show orthographic features. - | For example, "Xxxx" or "dd". - - +row - +cell #[code prefix] - +cell int - +cell - | Hash value of a length-N substring from the start of the - | token. Defaults to #[code N=1]. - - +row - +cell #[code prefix_] - +cell unicode - +cell - | A length-N substring from the start of the token. Defaults to - | #[code N=1]. - - +row - +cell #[code suffix] - +cell int - +cell - | Hash value of a length-N substring from the end of the token. - | Defaults to #[code N=3]. - - +row - +cell #[code suffix_] - +cell unicode - +cell - | Length-N substring from the end of the token. Defaults to - | #[code N=3]. - - +row - +cell #[code is_alpha] - +cell bool - +cell - | Does the token consist of alphabetic characters? Equivalent to - | #[code token.text.isalpha()]. - - +row - +cell #[code is_ascii] - +cell bool - +cell - | Does the token consist of ASCII characters? Equivalent to - | #[code all(ord(c) < 128 for c in token.text)]. - - +row - +cell #[code is_digit] - +cell bool - +cell - | Does the token consist of digits? Equivalent to - | #[code token.text.isdigit()]. - - +row - +cell #[code is_lower] - +cell bool - +cell - | 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 - +cell - | Is the token in titlecase? Equivalent to - | #[code token.text.istitle()]. - - +row - +cell #[code is_punct] - +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 - +cell - | 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 is_currency] - +tag-new("2.0.8") - +cell bool - +cell Is the token a currency symbol? - - +row - +cell #[code like_url] - +cell bool - +cell Does the token resemble a URL? - - +row - +cell #[code like_num] - +cell bool - +cell Does the token represent a number? e.g. "10.9", "10", "ten", etc. - - +row - +cell #[code like_email] - +cell bool - +cell Does the token resemble an email address? - - +row - +cell #[code is_oov] - +cell bool - +cell Is the token out-of-vocabulary? - - +row - +cell #[code is_stop] - +cell bool - +cell Is the token part of a "stop list"? - - +row - +cell #[code pos] - +cell int - +cell Coarse-grained part-of-speech. - - +row - +cell #[code pos_] - +cell unicode - +cell Coarse-grained part-of-speech. - - +row - +cell #[code tag] - +cell int - +cell Fine-grained part-of-speech. - - +row - +cell #[code tag_] - +cell unicode - +cell Fine-grained part-of-speech. - - +row - +cell #[code dep] - +cell int - +cell Syntactic dependency relation. - - +row - +cell #[code dep_] - +cell unicode - +cell Syntactic dependency relation. - - +row - +cell #[code lang] - +cell int - +cell Language of the parent document's vocabulary. - - +row - +cell #[code lang_] - +cell unicode - +cell Language of the parent document's vocabulary. - - +row - +cell #[code prob] - +cell float - +cell Smoothed log probability estimate of token's type. - - +row - +cell #[code idx] - +cell int - +cell The character offset of the token within the parent document. - - +row - +cell #[code sentiment] - +cell float - +cell - | A scalar value indicating the positivity or negativity of the - | token. - - +row - +cell #[code lex_id] - +cell int - +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 - | tables, 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/api/tokenizer.jade b/website/api/tokenizer.jade deleted file mode 100644 index 7a8a34838..000000000 --- a/website/api/tokenizer.jade +++ /dev/null @@ -1,229 +0,0 @@ -//- 💫 DOCS > API > TOKENIZER - -include ../_includes/_mixins - -p - | Segment text, and create #[code Doc] objects with the discovered segment - | boundaries. - -+h(2, "init") Tokenizer.__init__ - +tag method - -p Create a #[code Tokenizer], to create #[code Doc] objects given unicode text. - -+aside-code("Example"). - # Construction 1 - from spacy.tokenizer import Tokenizer - tokenizer = Tokenizer(nlp.vocab) - - # Construction 2 - from spacy.lang.en import English - tokenizer = English().Defaults.create_tokenizer(nlp) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell A storage container for lexical types. - - +row - +cell #[code rules] - +cell dict - +cell Exceptions and special-cases for the tokenizer. - - +row - +cell #[code prefix_search] - +cell callable - +cell - | A function matching the signature of - | #[code re.compile(string).search] to match prefixes. - - +row - +cell #[code suffix_search] - +cell callable - +cell - | A function matching the signature of - | #[code re.compile(string).search] to match suffixes. - - +row - +cell #[code infix_finditer] - +cell callable - +cell - | A function matching the signature of - | #[code re.compile(string).finditer] to find infixes. - - +row - +cell #[code token_match] - +cell callable - +cell A boolean function matching strings to be recognised as tokens. - - +row("foot") - +cell returns - +cell #[code Tokenizer] - +cell The newly constructed object. - -+h(2, "call") Tokenizer.__call__ - +tag method - -p Tokenize a string. - -+aside-code("Example"). - tokens = tokenizer(u'This is a sentence') - assert len(tokens) == 4 - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The string to tokenize. - - +row("foot") - +cell returns - +cell #[code Doc] - +cell A container for linguistic annotations. - -+h(2, "pipe") Tokenizer.pipe - +tag method - -p Tokenize a stream of texts. - -+aside-code("Example"). - texts = [u'One document.', u'...', u'Lots of documents'] - for doc in tokenizer.pipe(texts, batch_size=50): - pass - -+table(["Name", "Type", "Description"]) - +row - +cell #[code texts] - +cell - - +cell A sequence of unicode texts. - - +row - +cell #[code batch_size] - +cell int - +cell The number of texts to accumulate in an internal buffer. - - +row - +cell #[code n_threads] - +cell int - +cell - | The number of threads to use, if the implementation supports - | multi-threading. The default tokenizer is single-threaded. - - +row("foot") - +cell yields - +cell #[code Doc] - +cell A sequence of Doc objects, in order. - -+h(2, "find_infix") Tokenizer.find_infix - +tag method - -p Find internal split points of the string. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The string to split. - - +row("foot") - +cell returns - +cell list - +cell - | A list of #[code re.MatchObject] objects that have #[code .start()] - | and #[code .end()] methods, denoting the placement of internal - | segment separators, e.g. hyphens. - -+h(2, "find_prefix") Tokenizer.find_prefix - +tag method - -p - | Find the length of a prefix that should be segmented from the string, or - | #[code None] if no prefix rules match. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The string to segment. - - +row("foot") - +cell returns - +cell int - +cell The length of the prefix if present, otherwise #[code None]. - -+h(2, "find_suffix") Tokenizer.find_suffix - +tag method - -p - | Find the length of a suffix that should be segmented from the string, or - | #[code None] if no suffix rules match. - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The string to segment. - - +row("foot") - +cell returns - +cell int / #[code None] - +cell The length of the suffix if present, otherwise #[code None]. - -+h(2, "add_special_case") Tokenizer.add_special_case - +tag method - -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("/usage/adding-languages#tokenizer-exceptions") adding languages] - | for more details and examples. - -+aside-code("Example"). - from spacy.attrs import ORTH, LEMMA - case = [{"don't": [{ORTH: "do"}, {ORTH: "n't", LEMMA: "not"}]}] - tokenizer.add_special_case(case) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The string to specially tokenize. - - +row - +cell #[code token_attrs] - +cell iterable - +cell - | A sequence of dicts, where each dict describes a token and its - | attributes. The #[code ORTH] fields of the attributes must - | exactly match the string when they are concatenated. - -+h(2, "attributes") Attributes - -+table(["Name", "Type", "Description"]) - +row - +cell #[code vocab] - +cell #[code Vocab] - +cell The vocab object of the parent #[code Doc]. - - +row - +cell #[code prefix_search] - +cell - - +cell - | A function to find segment boundaries from the start of a - | string. Returns the length of the segment, or #[code None]. - - +row - +cell #[code suffix_search] - +cell - - +cell - | A function to find segment boundaries from the end of a string. - | Returns the length of the segment, or #[code None]. - - +row - +cell #[code infix_finditer] - +cell - - +cell - | A function to find internal segment separators, e.g. hyphens. - | Returns a (possibly empty) list of #[code re.MatchObject] - | objects. diff --git a/website/api/top-level.jade b/website/api/top-level.jade deleted file mode 100644 index f16daae23..000000000 --- a/website/api/top-level.jade +++ /dev/null @@ -1,20 +0,0 @@ -//- 💫 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 diff --git a/website/api/vectors.jade b/website/api/vectors.jade deleted file mode 100644 index e1976713e..000000000 --- a/website/api/vectors.jade +++ /dev/null @@ -1,476 +0,0 @@ -//- 💫 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). Multiple keys can be mapped to - | the same vector, and not all of the rows in the table need to be - | assigned – so #[code vectors.n_keys] may be greater or smaller than - | #[code vectors.shape[0]]. - -+h(2, "init") Vectors.__init__ - +tag method - -p - | Create a new vector store. You can set the vector values and keys - | directly on initialisation, or supply a #[code shape] keyword argument - | to create an empty table you can add vectors to later. - -+aside-code("Example"). - from spacy.vectors import Vectors - - empty_vectors = Vectors(shape=(10000, 300)) - - data = numpy.zeros((3, 300), dtype='f') - keys = [u'cat', u'dog', u'rat'] - vectors = Vectors(data=data, keys=keys) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code data] - +cell #[code.u-break ndarray[ndim=1, dtype='float32']] - +cell The vector data. - - +row - +cell #[code keys] - +cell iterable - +cell A sequence of keys aligned with the data. - - +row - +cell #[code shape] - +cell tuple - +cell - | Size of the table as #[code (n_entries, n_columns)], the number - | of entries and number of columns. Not required if you're - | initialising the object with #[code data] and #[code keys]. - - +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 the key is not found in the table, a - | #[code KeyError] is raised. - -+aside-code("Example"). - cat_id = nlp.vocab.strings[u'cat'] - cat_vector = nlp.vocab.vectors[cat_id] - assert cat_vector == nlp.vocab[u'cat'].vector - -+table(["Name", "Type", "Description"]) - +row - +cell #[code key] - +cell int - +cell The key to get the vector for. - - +row - +cell returns - +cell #[code.u-break 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. - -+aside-code("Example"). - cat_id = nlp.vocab.strings[u'cat'] - vector = numpy.random.uniform(-1, 1, (300,)) - nlp.vocab.vectors[cat_id] = vector - -+table(["Name", "Type", "Description"]) - +row - +cell #[code key] - +cell int - +cell The key to set the vector for. - - +row - +cell #[code vector] - +cell #[code.u-break ndarray[ndim=1, dtype='float32']] - +cell The vector to set. - -+h(2, "iter") Vectors.__iter__ - +tag method - -p Iterate over the keys in the table. - -+aside-code("Example"). - for key in nlp.vocab.vectors: - print(key, nlp.vocab.strings[key]) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell int - +cell A key in the table. - -+h(2, "len") Vectors.__len__ - +tag method - -p Return the number of vectors in the table. - -+aside-code("Example"). - vectors = Vectors(shape=(3, 300)) - assert len(vectors) == 3 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell int - +cell The number of vectors in the table. - -+h(2, "contains") Vectors.__contains__ - +tag method - -p - | Check whether a key has been mapped to a vector entry in the table. - -+aside-code("Example"). - cat_id = nlp.vocab.strings[u'cat'] - nlp.vectors.add(cat_id, numpy.random.uniform(-1, 1, (300,))) - assert cat_id in vectors - -+table(["Name", "Type", "Description"]) - +row - +cell #[code key] - +cell 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. Keys - | can be mapped to an existing vector by setting #[code row], or a new - | vector can be added. When adding unicode keys, keep in mind that the - | #[code Vectors] class itself has no - | #[+api("stringstore") #[code StringStore]], so you have to store the - | hash-to-string mapping separately. If you need to manage the strings, - | you should use the #[code Vectors] via the - | #[+api("vocab") #[code Vocab]] class, e.g. #[code vocab.vectors]. - -+aside-code("Example"). - vector = numpy.random.uniform(-1, 1, (300,)) - cat_id = nlp.vocab.strings[u'cat'] - nlp.vocab.vectors.add(cat_id, vector=vector) - nlp.vocab.vectors.add(u'dog', row=0) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code key] - +cell unicode / int - +cell The key to add. - - +row - +cell #[code vector] - +cell #[code.u-break ndarray[ndim=1, dtype='float32']] - +cell An optional vector to add for the key. - - +row - +cell #[code row] - +cell int - +cell An optional row number of a vector to map the key to. - - +row("foot") - +cell returns - +cell int - +cell The row the vector was added to. - -+h(2, "resize") Vectors.resize - +tag method - -p - | Resize the underlying vectors array. If #[code inplace=True], the memory - | is reallocated. This may cause other references to the data to become - | invalid, so only use #[code inplace=True] if you're sure that's what you - | want. If the number of vectors is reduced, keys mapped to rows that have - | been deleted are removed. These removed items are returned as a list of - | #[code (key, row)] tuples. - -+aside-code("Example"). - removed = nlp.vocab.vectors.resize((10000, 300)) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code shape] - +cell tuple - +cell - | A #[code (rows, dims)] tuple describing the number of rows and - | dimensions. - - +row - +cell #[code inplace] - +cell bool - +cell Reallocate the memory. - - +row("foot") - +cell returns - +cell list - +cell The removed items as a list of #[code (key, row)] tuples. - -+h(2, "keys") Vectors.keys - +tag method - -p A sequence of the keys in the table. - -+aside-code("Example"). - for key in nlp.vocab.vectors.keys(): - print(key, nlp.vocab.strings[key]) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell iterable - +cell The keys. - -+h(2, "values") Vectors.values - +tag method - -p - | Iterate over vectors that have been assigned to at least one key. Note - | that some vectors may be unassigned, so the number of vectors returned - | may be less than the length of the vectors table. - -+aside-code("Example"). - for vector in nlp.vocab.vectors.values(): - print(vector) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code.u-break ndarray[ndim=1, dtype='float32']] - +cell A vector in the table. - -+h(2, "items") Vectors.items - +tag method - -p Iterate over #[code (key, vector)] pairs, in order. - -+aside-code("Example"). - for key, vector in nlp.vocab.vectors.items(): - print(key, nlp.vocab.strings[key], vector) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell tuple - +cell #[code (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(shape(1, 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 A #[code (rows, dims)] pair. - -+h(2, "size") Vectors.size - +tag property - -p The vector size, i.e. #[code rows * dims]. - -+aside-code("Example"). - vectors = Vectors(shape=(500, 300)) - assert vectors.size == 150000 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell int - +cell The vector size. - -+h(2, "is_full") Vectors.is_full - +tag property - -p - | Whether the vectors table is full and has no slots are available for new - | keys. If a table is full, it can be resized using - | #[+api("vectors#resize") #[code Vectors.resize]]. - -+aside-code("Example"). - vectors = Vectors(shape=(1, 300)) - vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,))) - assert vectors.is_full - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell bool - +cell Whether the vectors table is full. - -+h(2, "n_keys") Vectors.n_keys - +tag property - -p - | Get the number of keys in the table. Note that this is the number of - | #[em all] keys, not just unique vectors. If several keys are mapped - | are mapped to the same vectors, they will be counted individually. - -+aside-code("Example"). - vectors = Vectors(shape=(10, 300)) - assert len(vectors) == 10 - assert vectors.n_keys == 0 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell int - +cell The number of all keys in the table. - -+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. - -+aside-code("Example"). - vectors = Vectors() - vectors.from_glove('/path/to/glove_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 / #[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 - -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 / #[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 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.u-break ndarray[ndim=1, dtype='float32']] - +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.u-break ndarray[ndim=1, dtype='float32']] - +cell - | Array keeping the keys in order, such that - | #[code keys[vectors.key2row[key]] == key] diff --git a/website/api/vocab.jade b/website/api/vocab.jade deleted file mode 100644 index 0e3d1b5e2..000000000 --- a/website/api/vocab.jade +++ /dev/null @@ -1,411 +0,0 @@ -//- 💫 DOCS > API > VOCAB - -include ../_includes/_mixins - -p - | 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] - +cell dict - +cell - | A dictionary mapping attribute IDs to functions to compute them. - | Defaults to #[code None]. - - +row - +cell #[code tag_map] - +cell dict - +cell - | A dictionary mapping fine-grained tags to coarse-grained - | parts-of-speech, and optionally morphological attributes. - - +row - +cell #[code lemmatizer] - +cell object - +cell A lemmatizer. Defaults to #[code None]. - - +row - +cell #[code strings] - +cell #[code StringStore] or list - +cell - | A #[+api("stringstore") #[code StringStore]] that maps - | strings to hash values, and vice versa, or a list of strings. - - +row("foot") - +cell returns - +cell #[code Vocab] - +cell The newly constructed object. - -+h(2, "len") Vocab.__len__ - +tag method - -p Get the current number of lexemes in the vocabulary. - -+aside-code("Example"). - doc = nlp(u'This is a sentence.') - assert len(nlp.vocab) > 0 - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell returns - +cell int - +cell The number of lexems in the vocabulary. - -+h(2, "getitem") Vocab.__getitem__ - +tag method - -p - | 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. - -+aside-code("Example"). - apple = nlp.vocab.strings['apple'] - assert nlp.vocab[apple] == nlp.vocab[u'apple'] - -+table(["Name", "Type", "Description"]) - +row - +cell #[code id_or_string] - +cell int / unicode - +cell The hash value of a word, or its unicode string. - - +row("foot") - +cell returns - +cell #[code Lexeme] - +cell The lexeme indicated by the given ID. - -+h(2, "iter") Vocab.__iter__ - +tag method - -p Iterate over the lexemes in the vocabulary. - -+aside-code("Example"). - stop_words = (lex for lex in nlp.vocab if lex.is_stop) - -+table(["Name", "Type", "Description"]) - +row("foot") - +cell yields - +cell #[code Lexeme] - +cell An entry in the vocabulary. - -+h(2, "contains") Vocab.__contains__ - +tag method - -p - | Check whether the string has an entry in the vocabulary. To get the ID - | for a given string, you need to look it up in - | #[+api("vocab#attributes") #[code vocab.strings]]. - -+aside-code("Example"). - apple = nlp.vocab.strings['apple'] - oov = nlp.vocab.strings['dskfodkfos'] - assert apple in nlp.vocab - assert oov not in nlp.vocab - -+table(["Name", "Type", "Description"]) - +row - +cell #[code string] - +cell unicode - +cell The ID string. - - +row("foot") - +cell returns - +cell bool - +cell Whether the string has an entry in the vocabulary. - -+h(2, "add_flag") Vocab.add_flag - +tag method - -p - | Set a new boolean flag to words in the vocabulary. The #[code 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 #[code token.check_flag(flag_id)]. - -+aside-code("Example"). - def is_my_product(text): - products = [u'spaCy', u'Thinc', u'displaCy'] - return text in products - - MY_PRODUCT = nlp.vocab.add_flag(is_my_product) - doc = nlp(u'I like spaCy') - assert doc[2].check_flag(MY_PRODUCT) == True - -+table(["Name", "Type", "Description"]) - +row - +cell #[code flag_getter] - +cell dict - +cell A function #[code f(unicode) -> bool], to get the flag value. - - +row - +cell #[code flag_id] - +cell int - +cell - | An integer between 1 and 63 (inclusive), specifying the bit at - | which the flag will be stored. If #[code -1], the lowest - | available bit will be chosen. - - +row("foot") - +cell returns - +cell int - +cell The integer ID by which the flag value can be checked. - -+h(2, "reset_vectors") Vocab.reset_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. Only - | one of the #[code width] and #[code shape] keyword arguments can be - | specified. - -+aside-code("Example"). - nlp.vocab.reset_vectors(width=300) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code width] - +cell int - +cell The new width (keyword argument only). - - +row - +cell #[code shape] - +cell int - +cell The new shape (keyword argument only). - -+h(2, "prune_vectors") Vocab.prune_vectors - +tag method - +tag-new(2) - -p - | Reduce the current vector table to #[code nr_row] unique entries. Words - | mapped to the discarded vectors will be remapped to the closest vector - | among those remaining. For example, suppose the original table had - | vectors for the words: - | #[code.u-break ['sat', 'cat', 'feline', 'reclined']]. If we prune the - | vector table to, two rows, we would discard the vectors for "feline" - | and "reclined". These words would then be remapped to the closest - | remaining vector – so "feline" would have the same vector as "cat", - | and "reclined" would have the same vector as "sat". The similarities are - | judged by cosine. The original vectors may be large, so the cosines are - | calculated in minibatches, to reduce memory usage. - -+aside-code("Example"). - nlp.vocab.prune_vectors(10000) - assert len(nlp.vocab.vectors) <= 1000 - -+table(["Name", "Type", "Description"]) - +row - +cell #[code nr_row] - +cell int - +cell The number of rows to keep in the vector table. - - +row - +cell #[code batch_size] - +cell int - +cell - | Batch of vectors for calculating the similarities. Larger batch - | sizes might be faster, while temporarily requiring more memory. - - +row("foot") - +cell returns - +cell dict - +cell - | A dictionary keyed by removed words mapped to - | #[code (string, score)] tuples, where #[code string] is the entry - | the removed word was mapped to, and #[code score] the similarity - | score between the two words. - -+h(2, "get_vector") 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, "set_vector") 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, "has_vector") 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) - -p Save the current state to a directory. - -+aside-code("Example"). - nlp.vocab.to_disk('/path/to/vocab') - -+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") Vocab.from_disk - +tag method - +tag-new(2) - -p Loads state from a directory. Modifies the object in place and returns it. - -+aside-code("Example"). - from spacy.vocab import Vocab - vocab = Vocab().from_disk('/path/to/vocab') - -+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 Vocab] - +cell The modified #[code Vocab] object. - -+h(2, "to_bytes") Vocab.to_bytes - +tag method - -p Serialize the current state to a binary string. - -+aside-code("Example"). - vocab_bytes = nlp.vocab.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 Vocab] object. - -+h(2, "from_bytes") Vocab.from_bytes - +tag method - -p Load state from a binary string. - -+aside-code("Example"). - fron spacy.vocab import Vocab - vocab_bytes = nlp.vocab.to_bytes() - vocab = Vocab() - vocab.from_bytes(vocab_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 Vocab] - +cell The #[code Vocab] object. - -+h(2, "attributes") Attributes - -+aside-code("Example"). - apple_id = nlp.vocab.strings['apple'] - assert type(apple_id) == int - PERSON = nlp.vocab.strings['PERSON'] - assert type(PERSON) == int - -+table(["Name", "Type", "Description"]) - +row - +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/assets/css/_base/_animations.sass b/website/assets/css/_base/_animations.sass deleted file mode 100644 index 5c82a4fcc..000000000 --- a/website/assets/css/_base/_animations.sass +++ /dev/null @@ -1,28 +0,0 @@ -//- 💫 CSS > BASE > ANIMATIONS - -//- Fade in - -@keyframes fadeIn - from - opacity: 0 - - to - opacity: 1 - - -//- Element slides in from the top - -@keyframes slideInDown - from - transform: translate3d(0, -100%, 0) - visibility: visible - - 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 deleted file mode 100644 index c1af115a7..000000000 --- a/website/assets/css/_base/_fonts.sass +++ /dev/null @@ -1,27 +0,0 @@ -//- 💫 CSS > BASE > FONTS - -// HK Grotesk - -@font-face - font-family: "HK Grotesk" - font-style: normal - font-weight: 500 - src: url("/assets/fonts/hkgrotesk-semibold.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-semibold.woff") format("woff") - -@font-face - font-family: "HK Grotesk" - font-style: italic - font-weight: 500 - src: url("/assets/fonts/hkgrotesk-semibolditalic.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-semibolditalic.woff") format("woff") - -@font-face - font-family: "HK Grotesk" - font-style: normal - font-weight: 600 - 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 deleted file mode 100644 index 7f9ed9344..000000000 --- a/website/assets/css/_base/_grid.sass +++ /dev/null @@ -1,59 +0,0 @@ -//- 💫 CSS > BASE > GRID - -//- Grid container - -.o-grid - display: flex - flex-wrap: wrap - - @include breakpoint(min, sm) - flex-direction: row - align-items: stretch - justify-content: space-between - - &.o-grid--center - 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 - -.o-grid__col - $grid-gutter: 2rem - - margin-top: $grid-gutter - min-width: 0 // hack to prevent overflow - - @include breakpoint(min, lg) - display: flex - flex: 0 0 100% - flex-direction: column - flex-wrap: wrap - - @each $mode, $count in $grid - &.o-grid__col--#{$mode} - $percentage: calc(#{100% / $count} - #{$grid-gutter}) - flex: 0 0 $percentage - max-width: $percentage - - @include breakpoint(max, md) - flex: 0 0 100% - flex-flow: column wrap - - &.o-grid__col--no-gutter - margin-top: 0 - - // Fix overflow issue in old browsers - - & > * - flex-shrink: 1 - max-width: 100% diff --git a/website/assets/css/_base/_layout.sass b/website/assets/css/_base/_layout.sass deleted file mode 100644 index 145b42789..000000000 --- a/website/assets/css/_base/_layout.sass +++ /dev/null @@ -1,43 +0,0 @@ -//- 💫 CSS > BASE > LAYOUT - -//- HTML - -html - font-size: $type-base - - -//- Body - -body - animation: fadeIn 0.25s ease - background: $color-back - color: $color-front - - -//- Paragraphs - -p - @extend .o-block, .u-text - -p:empty - margin-bottom: 0 - - -//- Links - -main p a, -main table a, -main > *:not(footer) li a, -main aside a - @extend .u-link - -a:focus - outline: 1px dotted $color-theme - - -//- Selection - -::selection - background: $color-theme - color: $color-back - text-shadow: none diff --git a/website/assets/css/_base/_objects.sass b/website/assets/css/_base/_objects.sass deleted file mode 100644 index ef463870e..000000000 --- a/website/assets/css/_base/_objects.sass +++ /dev/null @@ -1,249 +0,0 @@ -//- 💫 CSS > BASE > OBJECTS - -//- Main container - -.o-main - padding: $nav-height 0 0 0 - max-width: 100% - min-height: 100vh - - @include breakpoint(min, md) - &.o-main--sidebar - margin-left: $sidebar-width - - &.o-main--aside - margin-right: $aside-width - position: relative - - &:after - @include position(absolute, top, left, 0, 100%) - @include size($aside-width, 100%) - content: "" - display: block - background: $pattern - z-index: -1 - min-height: 100vh - - -//- Content container - -.o-content - padding: 3rem 7.5rem - margin: 0 auto - width: $content-width - max-width: 100% - - @include breakpoint(max, sm) - padding: 3rem - - -//- Footer - -.o-footer - 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-section--small - overflow: auto - - &:not(:last-child) - margin-bottom: 3.5rem - padding-bottom: 2rem - -.o-block - margin-bottom: 4rem - -.o-block-small - margin-bottom: 2rem - -.o-no-block.o-no-block - margin-bottom: 0 - -.o-card - background: $color-back - border-radius: $border-radius - box-shadow: $box-shadow - - -//- Accordion - -.o-accordion - &:not(:last-child) - margin-bottom: 2rem - -.o-accordion__content - margin-top: 3rem - -.o-accordion__button - font: inherit - border-radius: $border-radius - width: 100% - padding: 1.5rem 2rem - background: $color-subtle-light - - &[aria-expanded="true"] - border-bottom: 3px solid $color-subtle - border-bottom-left-radius: 0 - border-bottom-right-radius: 0 - - .o-accordion__hide - display: none - - &:focus:not([aria-expanded="true"]) - background: $color-subtle - -.o-accordion__icon - @include size(2.5rem) - background: $color-theme - color: $color-back - border-radius: 50% - padding: 0.35rem - pointer-events: none - -//- Box - -.o-box - background: $color-subtle-light - padding: 2rem - border-radius: $border-radius - -.o-box__logos - padding-bottom: 1rem - - -//- Icons - -.o-icon - vertical-align: middle - - &.o-icon--inline - margin: 0 0.5rem 0 0.1rem - - &.o-icon--tag - vertical-align: bottom - height: 100% - position: relative - top: 1px - -.o-emoji - margin-right: 0.75rem - vertical-align: text-bottom - -.o-badge - border-radius: 1em - -.o-thumb - @include size(100px) - overflow: hidden - border-radius: 50% - - &.o-thumb--small - @include size(35px) - - -//- SVG - -.o-svg - height: auto - - -//- Inline List - -.o-inline-list > * - display: inline - - &:not(:last-child) - margin-right: 3rem - - -//- Logo - -.o-logo - @include size($logo-width, $logo-height) - 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 - - -//- Responsive Video embeds - -.o-video - position: relative - height: 0 - - @each $ratio1, $ratio2 in (16, 9), (4, 3) - &.o-video--#{$ratio1}x#{$ratio2} - padding-bottom: (100% * $ratio2 / $ratio1) - -.o-video__iframe - @include position(absolute, top, left, 0, 0) - @include size(100%) - border-radius: var(--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 - width: 100% - -//- Abbreviations - -.o-abbr - +breakpoint(min, md) - cursor: help - border-bottom: 2px dotted $color-theme - padding-bottom: 3px - - +breakpoint(max, sm) - &[data-tooltip]:before - content: none - - &:after - content: " (" attr(aria-label) ")" - color: $color-subtle-dark diff --git a/website/assets/css/_base/_reset.sass b/website/assets/css/_base/_reset.sass deleted file mode 100644 index 0ff1432d0..000000000 --- a/website/assets/css/_base/_reset.sass +++ /dev/null @@ -1,103 +0,0 @@ -//- 💫 CSS > BASE > RESET - -*, *:before, *:after - box-sizing: border-box - padding: 0 - margin: 0 - border: 0 - outline: 0 - -html - font-family: sans-serif - text-rendering: optimizeSpeed - -ms-text-size-adjust: 100% - -webkit-text-size-adjust: 100% - -webkit-font-smoothing: antialiased - -moz-osx-font-smoothing: grayscale - -body - margin: 0 - -article, aside, details, figcaption, figure, footer, header, main, menu, nav, -section, summary, progress - display: block - -a - background-color: transparent - color: inherit - text-decoration: none - - &:active, - &:hover - outline: 0 - -abbr[title] - border-bottom: none - text-decoration: underline - text-decoration: underline dotted - -b, strong - font-weight: inherit - font-weight: bolder - -small - font-size: 80% - -sub, sup - position: relative - font-size: 65% - line-height: 0 - vertical-align: baseline - -sup - top: -0.5em - -sub - bottom: -0.15em - -img - border: 0 - height: auto - max-width: 100% - -svg - max-width: 100% - color-interpolation-filters: sRGB - fill: currentColor - - &:not(:root) - overflow: hidden - -hr - box-sizing: content-box - overflow: visible - height: 0 - -pre - overflow: auto - -code, pre - font-family: monospace, monospace - font-size: 1em - -table - text-align: left - width: 100% - max-width: 100% - border-collapse: collapse - - td, th - vertical-align: top - -ul, ol - list-style: none - -input, button - appearance: none - background: transparent - -button - cursor: pointer - -progress - appearance: none diff --git a/website/assets/css/_base/_utilities.sass b/website/assets/css/_base/_utilities.sass deleted file mode 100644 index 10fe843a4..000000000 --- a/website/assets/css/_base/_utilities.sass +++ /dev/null @@ -1,267 +0,0 @@ -//- 💫 CSS > BASE > UTILITIES - -//- Text - -.u-text, -.u-text-small, -.u-text-tiny - font-family: $font-primary - -.u-text - font-size: 1.35rem - line-height: 1.5 - -.u-text-small - font-size: 1.3rem - line-height: 1.375 - -.u-text-tiny - font-size: 1.1rem - line-height: 1.375 - -//- Labels & Tags - -.u-text-label - 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 - margin: 1.5rem 0 0 2rem - - &.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-secondary - background: $color-theme - color: $color-back - padding: 2px 6px 4px - border-radius: 1em - text-transform: uppercase - vertical-align: middle - - &.u-text-tag--spaced - margin-left: 0.75em - margin-right: 0.5em - - -//- Headings - -.u-heading - margin-bottom: 1em - - @include breakpoint(max, md) - word-wrap: break-word - - &: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 600 7rem/#{1} $font-secondary - - @include breakpoint(max, sm) - font-size: 6rem - - -@each $level, $size in $headings - .u-heading-#{$level} - font: normal 500 #{$size}rem/#{1.1} $font-secondary - -.u-heading__teaser - margin-top: 2rem - font-weight: normal - - -//- Links - -.u-link - color: $color-theme - border-bottom: 1px solid - transition: color 0.2s ease - - &:hover - color: $color-theme-dark - -.u-hand - cursor: pointer - -.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 - - &:before - bottom: 0.15em - top: initial - - -[id]:target - padding-top: $nav-height * 1.25 - - - -//- Layout - -.u-width-full - width: 100% - -.u-float-left - float: left - margin-right: 1rem - -.u-float-right - float: right - margin-left: 1rem - -.u-text-center - text-align: center - -.u-text-right - text-align: right - -.u-padding - padding: 5rem - -.u-padding-small - padding: 0.5em 0.75em - -.u-padding-medium - padding: 1.8rem - -.u-padding-top - padding-top: 2rem - -.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 - - &.u-break--all - word-break: break-all - -.u-no-border - border: none - -.u-border - border: 1px solid $color-subtle - border-radius: 2px - -.u-border-dotted - border-bottom: 1px dotted $color-subtle - -@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 - -.u-grayscale - filter: grayscale(100%) - transition: filter 0.15s ease - user-select: none - - &:hover - filter: none - -.u-pattern - background: $pattern - - -//- Loaders - -.u-loading, -[data-loading] - $spinner-size: 75px - $spinner-bar: 8px - - min-height: $spinner-size * 2 - 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, -[v-cloak] - display: none !important - -@each $breakpoint in (xs, sm, md) - .u-hidden-#{$breakpoint}.u-hidden-#{$breakpoint} - @include breakpoint(max, $breakpoint) - display: none - -//- Transitions - -.u-fade-enter-active - transition: opacity 0.5s - -.u-fade-enter - opacity: 0 diff --git a/website/assets/css/_components/_asides.sass b/website/assets/css/_components/_asides.sass deleted file mode 100644 index c59590c29..000000000 --- a/website/assets/css/_components/_asides.sass +++ /dev/null @@ -1,43 +0,0 @@ -//- 💫 CSS > COMPONENTS > ASIDES - -//- Aside container - -.c-aside - position: relative - - -//- Aside content - -.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) - @include position(absolute, top, left, -3rem, calc(100% + 5.5rem)) - width: calc(#{$aside-width} + 2rem) - - // Banner effect - - &:after - $triangle-size: 2rem - - @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 calc(#{$triangle-size} - #{$border-radius / 2}) - content: "" - - @include breakpoint(max, sm) - display: block - margin: 2rem 0 - - -//- Aside text - -.c-aside__text - color: $color-back - padding: 1.5rem 2.5rem 3rem 2rem diff --git a/website/assets/css/_components/_buttons.sass b/website/assets/css/_components/_buttons.sass deleted file mode 100644 index d3ff4b037..000000000 --- a/website/assets/css/_components/_buttons.sass +++ /dev/null @@ -1,52 +0,0 @@ -//- 💫 CSS > COMPONENTS > BUTTONS - -.c-button - display: inline-block - font-weight: bold - padding: 0.8em 1.1em 1em - margin-bottom: 1px - border: 2px solid $color-theme - border-radius: 2em - text-align: center - 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 - - &:hover - background: $color-theme-dark - - &.c-button--secondary - background: $color-back - 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 deleted file mode 100644 index 659f80364..000000000 --- a/website/assets/css/_components/_chat.sass +++ /dev/null @@ -1,105 +0,0 @@ -//- 💫 CSS > COMPONENTS > CHAT - -.c-chat - @include position(fixed, top, left, 0, 60%) - bottom: 0 - right: 0 - display: flex - flex-flow: column nowrap - background: $color-back - transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7) - box-shadow: -0.25rem 0 1rem 0 rgba($color-front, 0.25) - z-index: 100 - - @include breakpoint(min, md) - left: calc(100% - #{$aside-width} - #{$aside-padding}) - - @include breakpoint(max, sm) - left: 50% - - @include breakpoint(max, xs) - left: 0 - - &.is-collapsed:not(.is-loading) - transform: translateX(110%) - - &:before - @include position(absolute, top, left, 1.25rem, 2rem) - content: attr(data-title) - font: bold 1.4rem $font-secondary - text-transform: uppercase - color: $color-back - - &:after - @include position(absolute, top, left, 0, 100%) - content: "" - z-index: -1 - bottom: 0 - right: -100% - background: $color-back - - & > iframe - width: 100% - flex: 1 1 calc(100% - #{$nav-height}) - border: 0 - - .gitter-chat-embed-loading-wrapper - @include position(absolute, top, left, 0, 0) - right: 0 - bottom: 0 - display: none - justify-content: center - align-items: center - - .is-loading & - display: flex - - .gitter-chat-embed-action-bar, - .gitter-chat-embed-action-bar-item - display: flex - - .gitter-chat-embed-action-bar - align-items: center - justify-content: flex-end - background: $color-theme - padding: 0 1rem 0 2rem - flex: 0 0 $nav-height - - .gitter-chat-embed-action-bar-item - @include size(40px) - padding: 0 - opacity: 0.75 - background-position: 50% - background-repeat: no-repeat - background-size: 22px 22px - border: 0 - cursor: pointer - transition: all 0.2s ease - - &:focus, - &:hover - opacity: 1 - - &.gitter-chat-embed-action-bar-item-pop-out - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTYgMmgtOC4wMjFjLTEuMDk5IDAtMS45NzkgMC44OC0xLjk3OSAxLjk4djguMDIwYzAgMS4xIDAuOSAyIDIgMmg4YzEuMSAwIDItMC45IDItMnYtOGMwLTEuMS0wLjktMi0yLTJ6TTE2IDEyaC04di04aDh2OHpNNCAxMGgtMnY2YzAgMS4xIDAuOSAyIDIgMmg2di0yaC02di02eiI+PC9wYXRoPjwvc3ZnPg==) - margin-right: -4px - - &.gitter-chat-embed-action-bar-item-collapse-chat - background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTguOTg0IDYuNDIybC01LjU3OCA1LjU3OCA1LjU3OCA1LjU3OC0xLjQwNiAxLjQwNi01LjU3OC01LjU3OC01LjU3OCA1LjU3OC0xLjQwNi0xLjQwNiA1LjU3OC01LjU3OC01LjU3OC01LjU3OCAxLjQwNi0xLjQwNiA1LjU3OCA1LjU3OCA1LjU3OC01LjU3OHoiPjwvcGF0aD48L3N2Zz4=) - -.c-chat__button - @include position(fixed, bottom, right, 1.5rem, 1.5rem) - z-index: 5 - color: $color-back - 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 deleted file mode 100644 index 598ab4655..000000000 --- a/website/assets/css/_components/_code.sass +++ /dev/null @@ -1,202 +0,0 @@ -//- 💫 CSS > COMPONENTS > CODE - -//- Code block - -.c-code-block, -.juniper-cell - background: $color-front - color: darken($color-back, 20) - padding: 0.75em 0 - border-radius: $border-radius - overflow: auto - width: 100% - max-width: 100% - white-space: pre - direction: ltr - -.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 - display: flex - justify-content: center - align-items: center - - &.c-code-block__icon--border - border-left: 6px solid - -//- Code block content - -.c-code-block__content, -.juniper-input, -.jp-OutputArea - display: block - font: normal normal 1.1rem/#{1.9} $font-code - padding: 1em 2em - -.c-code-block__content[data-prompt]:before, - content: attr(data-prompt) - margin-right: 0.65em - display: inline-block - vertical-align: middle - opacity: 0.5 - -//- Juniper - -[data-executable] - margin-bottom: 0 - -.juniper-cell - border: 0 - -.juniper-input - padding: 0 - -.juniper-output - color: inherit - background: inherit - padding: 0 - -.jp-OutputArea - &:not(:empty) - padding: 2rem 2rem 1rem - border-top: 1px solid $color-dark - margin-top: 2rem - - .entities, svg - white-space: initial - font-family: inherit - - .entities - font-size: 1.35rem - -.jp-OutputArea pre - font: inherit - -.jp-OutputPrompt.jp-OutputArea-prompt - padding-top: 0.5em - margin-right: 1rem - font-family: inherit - font-weight: bold - -.juniper-button - @extend .u-text-label, .u-text-label--dark - position: static - -.juniper-wrapper - position: relative - -.juniper-wrapper__text - @include position(absolute, top, right, 1.25rem, 1.25rem) - color: $color-subtle-dark - z-index: 10 - -//- Code - -code, .CodeMirror, .jp-RenderedText, .jp-OutputArea - -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-size: 90% - background-color: $color-subtle-light - padding: 0.2rem 0.4rem - border-radius: 0.25rem - font-family: $font-code - margin: 0 - box-decoration-break: clone - white-space: nowrap - - .c-aside__content & - background: lighten($color-front, 10) - color: $color-back - text-shadow: none - - -//- Syntax Highlighting (Prism) - -[class*="language-"] .token - &.comment, &.prolog, &.doctype, &.cdata, &.punctuation - color: map-get($syntax-highlighting, comment) - - &.property, &.tag, &.constant, &.symbol, &.deleted - color: map-get($syntax-highlighting, tag) - - &.boolean, &.number - color: map-get($syntax-highlighting, number) - - &.selector, &.attr-name, &.string, &.char, &.builtin, &.inserted - color: map-get($syntax-highlighting, selector) - - @at-root .language-css .token.string, - &.operator, &.entity, &.url, &.variable - color: map-get($syntax-highlighting, operator) - - &.atrule, &.attr-value, &.function - color: map-get($syntax-highlighting, function) - - &.regex, &.important - color: map-get($syntax-highlighting, regex) - - &.keyword - color: map-get($syntax-highlighting, keyword) - - &.italic - font-style: italic - -//- Syntax Highlighting (CodeMirror) - -.CodeMirror.cm-s-default - background: $color-front - color: darken($color-back, 20) - - .CodeMirror-selected - background: $color-theme - color: $color-back - - .CodeMirror-cursor - border-left-color: currentColor - - .cm-variable-2 - color: inherit - font-style: italic - - .cm-comment - color: map-get($syntax-highlighting, comment) - - .cm-keyword, .cm-builtin - color: map-get($syntax-highlighting, keyword) - - .cm-operator - color: map-get($syntax-highlighting, operator) - - .cm-string - color: map-get($syntax-highlighting, selector) - - .cm-number - color: map-get($syntax-highlighting, number) - - .cm-def - color: map-get($syntax-highlighting, function) - -//- Syntax highlighting (Jupyter) - -.jp-RenderedText pre - .ansi-cyan-fg - color: map-get($syntax-highlighting, function) - - .ansi-green-fg - color: $color-green - - .ansi-red-fg - color: map-get($syntax-highlighting, operator) diff --git a/website/assets/css/_components/_landing.sass b/website/assets/css/_components/_landing.sass deleted file mode 100644 index 4c15e4a39..000000000 --- a/website/assets/css/_components/_landing.sass +++ /dev/null @@ -1,63 +0,0 @@ -//- 💫 CSS > COMPONENTS > LANDING - -.c-landing - background: $color-theme - padding-top: $nav-height * 1.5 - width: 100% - -.c-landing__wrapper - background: $pattern - width: 100% - -.c-landing__content - background: $pattern-overlay - 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) - display: block - text-align: center - - @include breakpoint(min, md) - @include position(absolute, top, right, 16rem, 6rem) diff --git a/website/assets/css/_components/_lists.sass b/website/assets/css/_components/_lists.sass deleted file mode 100644 index 553af6578..000000000 --- a/website/assets/css/_components/_lists.sass +++ /dev/null @@ -1,39 +0,0 @@ -//- 💫 CSS > COMPONENTS > LISTS - -//- List Container - -.c-list - @each $type, $counter in (numbers: decimal, letters: upper-latin, roman: lower-roman) - &.c-list--#{$type} - counter-reset: li - - .c-list__item:before - content: counter(li, #{$counter}) '.' - font-size: 1em - padding-right: 1rem - - -//- List Item - -.c-list__item - padding-left: 2rem - margin-bottom: 0.5em - margin-left: 1.25rem - - &:before - content: '\25CF' - display: inline-block - font-size: 0.6em - font-weight: bold - padding-right: 1em - margin-left: -3.75rem - text-align: right - width: 2.5rem - counter-increment: li - box-sizing: content-box - - -//- List icon - -.c-list__icon - margin-right: 1rem diff --git a/website/assets/css/_components/_misc.sass b/website/assets/css/_components/_misc.sass deleted file mode 100644 index 8d131aa80..000000000 --- a/website/assets/css/_components/_misc.sass +++ /dev/null @@ -1,68 +0,0 @@ -//- 💫 CSS > COMPONENTS > MISC - -.x-terminal - background: $color-subtle-light - color: $color-front - padding: $border-radius - border-radius: 1em - width: 100% - position: relative - - &.x-terminal--small - background: $color-dark - color: $color-subtle - border-radius: 4px - margin-bottom: 4rem - -.x-terminal__icons - display: none - position: absolute - padding: 10px - - @include breakpoint(min, sm) - display: block - - &:before, - &:after, - span - @include size(15px) - display: inline-block - float: left - border-radius: 50% - margin-right: 10px - - &:before - content: "" - background: $color-red - - span - background: $color-green - - &:after - content: "" - background: $color-yellow - - &.x-terminal__icons--small - &:before, - &:after, - span - @include size(10px) - -.x-terminal__code - margin: 0 - border: none - border-bottom-left-radius: 5px - border-bottom-right-radius: 5px - width: 100% - max-width: 100% - white-space: pre-wrap - - -.x-terminal__button.x-terminal__button - @include position(absolute, bottom, right, 2.65rem, 2.6rem) - background: $color-dark - border-color: $color-dark - - &:hover - background: darken($color-dark, 5) - border-color: darken($color-dark, 5) diff --git a/website/assets/css/_components/_navigation.sass b/website/assets/css/_components/_navigation.sass deleted file mode 100644 index eaeb33957..000000000 --- a/website/assets/css/_components/_navigation.sass +++ /dev/null @@ -1,61 +0,0 @@ -//- 💫 CSS > COMPONENTS > NAVIGATION - -.c-nav - @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 nowrap - padding: 0 0 0 1rem - z-index: 30 - width: 100% - box-shadow: $box-shadow - - &.is-fixed - animation: slideInDown 0.5s ease-in-out - position: fixed - -.c-nav__menu - @include size(100%) - display: flex - flex-flow: row nowrap - border-color: inherit - flex: 1 - - - @include breakpoint(max, sm) - @include scroll-shadow-base($color-front) - overflow-x: auto - overflow-y: hidden - -webkit-overflow-scrolling: touch - - @include breakpoint(min, md) - justify-content: flex-end - -.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(:first-child) - margin-left: 2em - - &:last-child - @include scroll-shadow-cover(right, $color-back) - padding-right: 2rem - - &:first-child - @include scroll-shadow-cover(left, $color-back) - padding-left: 2rem - - &.is-active - color: $color-dark - pointer-events: none diff --git a/website/assets/css/_components/_quickstart.sass b/website/assets/css/_components/_quickstart.sass deleted file mode 100644 index d853d7569..000000000 --- a/website/assets/css/_components/_quickstart.sass +++ /dev/null @@ -1,100 +0,0 @@ -//- 💫 CSS > COMPONENTS > QUICKSTART - -.c-quickstart - 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 - -.c-quickstart__input - @include size(0) - opacity: 0 - position: absolute - left: -9999px - -.c-quickstart__label - cursor: pointer - background: $color-back - border: 1px solid $color-subtle - border-radius: 2px - display: inline-block - padding: 0.75rem 1.25rem - margin: 0 0.5rem 0.5rem 0 - font-weight: bold - - &:hover - background: lighten($color-theme-light, 5) - - .c-quickstart__input:focus + & - border: 1px solid $color-theme - - .c-quickstart__input--radio:checked + & - color: $color-back - border-color: $color-theme - background: $color-theme - - .c-quickstart__input--check + &:before - content: "" - background: $color-back - display: inline-block - width: 20px - height: 20px - border: 1px solid $color-subtle - vertical-align: middle - margin-right: 1rem - cursor: pointer - border-radius: 2px - - .c-quickstart__input--check:checked + &:before - background: $color-theme url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4gICAgPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTkgMTYuMTcybDEwLjU5NC0xMC41OTQgMS40MDYgMS40MDYtMTIgMTItNS41NzgtNS41NzggMS40MDYtMS40MDZ6Ii8+PC9zdmc+) - background-size: contain - border-color: $color-theme - -.c-quickstart__label__meta - font-weight: normal - color: $color-subtle-dark - -.c-quickstart__group - @include breakpoint(min, md) - display: flex - flex-flow: row nowrap - - &:not(:last-child) - margin-bottom: 1rem - -.c-quickstart__fields - flex: 100% - -.c-quickstart__legend - margin-right: 2rem - padding-top: 0.75rem - flex: 1 1 35% - font-weight: bold - -.c-quickstart__line - display: block - - &:before - color: $color-theme - margin-right: 1em - - &.c-quickstart__line--bash:before - content: "$" - - &.c-quickstart__line--python:before - content: ">>>" - - &.c-quickstart__line--divider - padding: 1.5rem 0 - -.c-quickstart__code - font-size: 1.4rem diff --git a/website/assets/css/_components/_sidebar.sass b/website/assets/css/_components/_sidebar.sass deleted file mode 100644 index be3e34147..000000000 --- a/website/assets/css/_components/_sidebar.sass +++ /dev/null @@ -1,95 +0,0 @@ -//- 💫 CSS > COMPONENTS > SIDEBAR - -//- Sidebar container - -.c-sidebar - overflow-y: auto - - @include breakpoint(min, md) - @include position(fixed, top, left, 0, 0) - @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 - - @include breakpoint(max, sm) - flex: 100% - width: 100% - margin-top: $nav-height - display: flex - flex-flow: row wrap - width: 100% - - -//- Sidebar section - -.c-sidebar__section - & > * - padding: 0 2rem 0.35rem - - @include breakpoint(max, sm) - flex: 1 1 0 - padding: 1.25rem 0 - border-bottom: 1px solid $color-subtle - margin: 0 - - &:not(:last-child) - border-right: 1px solid $color-subtle - -.c-sidebar__item - color: $color-theme - - &:hover - color: $color-theme-dark - - & > .is-active - font-weight: bold - 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 deleted file mode 100644 index 3d0060b42..000000000 --- a/website/assets/css/_components/_tables.sass +++ /dev/null @@ -1,86 +0,0 @@ -//- 💫 CSS > COMPONENTS > TABLES - -//- Table container - -.c-table - vertical-align: top - - -//- Table row - -.c-table__row - &:nth-child(odd):not(.c-table__row--head) - background: rgba($color-subtle-light, 0.35) - - &.c-table__row--foot - background: $color-theme-light - border-top: 2px solid $color-theme - - .c-table__cell:first-child - @extend .u-text-label - color: $color-theme - - &.c-table__row--divider - border-top: 2px solid $color-theme - - -//- Table cell - -.c-table__cell - padding: 1rem - - &:not(:last-child) - border-right: 1px solid $color-subtle - - &.c-table__cell--num - text-align: right - font-feature-settings: "tnum" - font-variant-numeric: tabular-nums - - & > strong - font-feature-settings: initial - font-variant-numeric: initial - - -//- Table head cell - -.c-table__head-cell - font-weight: bold - color: $color-theme - padding: 1rem 0.5rem - border-bottom: 2px solid $color-theme - - -//- Responsive table -//- Shadows adapted from "CSS only Responsive Tables" by David Bushell -//- http://codepen.io/dbushell/pen/wGaamR - -@include breakpoint(max, md) - .c-table - @include scroll-shadow-base($color-front) - display: inline-block - overflow-x: auto - overflow-y: hidden - width: auto - -webkit-overflow-scrolling: touch - - .c-table__cell, - .c-table__head-cell - &:first-child - @include scroll-shadow-cover(left, $color-back) - - &: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/_components/_tooltips.sass b/website/assets/css/_components/_tooltips.sass deleted file mode 100644 index f9284dcdb..000000000 --- a/website/assets/css/_components/_tooltips.sass +++ /dev/null @@ -1,39 +0,0 @@ -//- 💫 CSS > COMPONENTS > TOOLTIPS - -[data-tooltip] - 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: $border-radius - border: 1px solid rgba($color-subtle-dark, 0.5) - color: $color-back - font: normal 1.2rem/#{1.25} $font-primary - text-transform: none - text-align: left - opacity: 0 - transform: translateX(-50%) translateY(-2px) - transition: opacity 0.1s ease-out, transform 0.1s ease-out - visibility: hidden - max-width: 300px - min-width: 200px - padding: 0.75em 1em 1em - z-index: 200 - white-space: pre-wrap - - &:hover:before - opacity: 1 - transform: translateX(-50%) translateY(0) - visibility: visible diff --git a/website/assets/css/_mixins.sass b/website/assets/css/_mixins.sass deleted file mode 100644 index d1ea9c5d5..000000000 --- a/website/assets/css/_mixins.sass +++ /dev/null @@ -1,80 +0,0 @@ -//- 💫 CSS > MIXINS - -// Helper for position -// $position - valid position value (static, absolute, fixed, relative) -// $pos-y - position direction Y (top, bottom) -// $pos-x - position direction X (left, right) -// $pos-y-value - value of position Y direction -// $pos-x-value - value of position X direction - -@mixin position($position, $pos-y, $pos-x, $pos-y-value, $pos-x-value) - position: $position - #{$pos-y}: $pos-y-value - #{$pos-x}: $pos-x-value - - -// Helper for width and height -// $width - width of element -// $height - height of element (default: $width) - -@mixin size($width, $height: $width) - width: $width - height: $height - - -//- Responsive Breakpoint utility - -@mixin breakpoint($limit, $size) - $breakpoints-max: ( xs: map-get($breakpoints, sm) - 1, sm: map-get($breakpoints, md) - 1, md: map-get($breakpoints, lg) - 1 ) - - @if $limit == "min" - @media(min-width: #{map-get($breakpoints, $size)}) - @content - - @else if $limit == "max" - @media(max-width: #{map-get($breakpoints-max, $size)}) - @content - - -// Scroll shadows for reponsive tables -// adapted from David Bushell, http://codepen.io/dbushell/pen/wGaamR -// $scroll-shadow-color - color of shadow -// $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 - background-repeat: no-repeat - background-size: 10px 100%, 10px 100% - -@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 - - @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 - -@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 deleted file mode 100644 index bac6c4f69..000000000 --- a/website/assets/css/_variables.sass +++ /dev/null @@ -1,51 +0,0 @@ -//- 💫 CSS > VARIABLES - -// Settings and Sizes - -$type-base: 11px - -$nav-height: 55px -$content-width: 1250px -$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: 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", Roboto, Helvetica, Arial, sans-serif !default -$font-code: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default - -// Colors - -$colors: ( blue: #09a3d5, green: #05b083, purple: #6542d1 ) - -$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), 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: #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 deleted file mode 100644 index 47cf3f1b5..000000000 --- a/website/assets/css/style.sass +++ /dev/null @@ -1,37 +0,0 @@ -//- 💫 STYLESHEET - -$theme: blue !default - - -// Variables - -@import variables -@import mixins - - -// Base - -@import _base/reset -@import _base/fonts -@import _base/animations -@import _base/grid -@import _base/layout -@import _base/objects -@import _base/utilities - - -// Components - -@import _components/asides -@import _components/buttons -@import _components/chat -@import _components/code -@import _components/landing -@import _components/lists -@import _components/misc -@import _components/navigation -@import _components/progress -@import _components/sidebar -@import _components/tables -@import _components/quickstart -@import _components/tooltips diff --git a/website/assets/css/style_green.sass b/website/assets/css/style_green.sass deleted file mode 100644 index c7369f990..000000000 --- a/website/assets/css/style_green.sass +++ /dev/null @@ -1,4 +0,0 @@ -//- 💫 STYLESHEET (GREEN) - -$theme: green -@import style diff --git a/website/assets/css/style_purple.sass b/website/assets/css/style_purple.sass deleted file mode 100644 index f00573cc7..000000000 --- a/website/assets/css/style_purple.sass +++ /dev/null @@ -1,4 +0,0 @@ -//- 💫 STYLESHEET (PURPLE) - -$theme: purple -@import style diff --git a/website/assets/img/favicon.ico b/website/assets/img/favicon.ico deleted file mode 100644 index dffc15f37360a5a25e084d887fd3a6f9224a164a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmd6l&r1S96vs#Ck`;I;shdZMpj%xEf^N~ZW8DJ(ivEr$s35@vK?4z@4q@b_gO~id zX{Hz&xw_`6yX)?^naNeK)=Ln*<;~2_d!L#2-aJBV^m8}}6&LYL5aOgOH&wRfqH5zK zAsf^-Dv9$+{3jJcOAs?hP^2t$O@^*Y=r)q5r4PYu<6L6y0sc&V#eJu=>@AobFw0|CQB|5@@*02ldC4}dz zO-q*LBnl@3R@YjnKb@g;w}-TUVJv6Xqg#LEd`}UP3AhGK(mTV?>eS*8E|&-UCTGqp zMkc!Ufn0c%`=xwykO~35&xY@BGwlCdc!l;zv+rv_>r{E}Cd}eXT{tc8XK@I@Mbw2; fsI4OH8I|{3`~3mc_yJPB*|Dsd$6wBb0Kd^s1y=}= diff --git a/website/assets/img/logo.svg b/website/assets/img/logo.svg deleted file mode 100644 index 89b61e132..000000000 --- a/website/assets/img/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/website/assets/img/pattern_blue.jpg b/website/assets/img/pattern_blue.jpg deleted file mode 100644 index 038e21fe2e56b7b6f81126c35b924034ad33d42b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230088 zcma(2XIxXw7c~r@fD{2ylp+WMQlz7Vjv$Ei-g^-wbPz&sQUsAMy%PwbcL=>HMQRA4 zca+{cND!|l{_o#=zt6{K@+CPrv(C((nLTT-J?FpK|5kwq%JNF`00;yCAlwJ|Zvps( z`}P01;Qjv#{{JoiuiAKcAUwSP`^W#+FaLc9D2VaG@EP$z6aXFt2%iG7ld#eA;0Nyn%Nhh|`{SeayH_YY!cfkV7-_)v z@KjdPCmDBnP$p_9vA%Ar29F(aS&;HW2m>{HQpO_5fJ6uHahPC#oPj3-He26i+Z{vI z*uU3{O&~Hl6YwHlFLWNfKne1kEE(UbD890hw0T({OncLwSo(Z9fwn&`P0~cYu;M4i z4#+4^xu{T_xkb040!A9DLh&o|UH2ZBbc~*&QGx;Ee?uSjxtm8pu+oH&)DU+0nRR|3 z5q;vtUGS)b9bwQB>rew_6KR;}_}45g4?pF85_K3++kb$x&v1hZAeT8$OkNk>%ee|@ z9$W|INBDg79uYhf!2tUGfvBbTUpXTa2QLe3oQ7QJ2nKLy&qM7@YiRppV&vR@*K)xl{gFhLkcdd4`d<`{`RYq zNbTT>z&O;z5dP=`0N_kS;N`d8qw%a8H;(wfzz+OnW-fWt?nmC=Udw6K>x_>K9$`j5 z0Hjwg-b}DDCbAVpynM!)v_W5|0~YQh#|HrLOhv-1!V4g7jl|8{6IvuqjBxvryzzB` zDk@|%BcK7AufI0iXjP48%$Mz>(cE%Q+nGQ`ojY(!R^4u)&J&D#FpK$HQy%ivU92;F`y3Fi{8|hbMWGBS|{V8y?2aPk~hc&gMpYIWcvLh0wSw&QHYsdV@PBIsq zmt1C06-(gRcL0BXp^r9?uP@7ZVMzMEz_QNjNzt$UGs)& z=P%Hi6dK|eo8kA<6Nb?jd8c>NzW?)pgtw9GNy%cLT zw`aQwHnGxoRX#Gzo{28aVfG7a-q@^(l6!pk`;=uEU_wb6Eod2PaB{P)JzP8=SyOoB zZ?1uCYadw@4+cnL&3CpB86*MeAD3rh?H6|S_)2nq#I(gq50IXH(-mp1!{>s$;Fq;+ z4pCvJm)|f0;p`0v0fmlWX1I(rRFtRD`F);TW->!8bZlU~W16ZEsn|&n&0?7(>sF+lr;xgD z#MrwWiTn>os+Sl72B>`=@|gouUF`v8mRU=HMIk7Wwkm`}JwNw4-4|WXl{+LD(WW6q ziGA&F8v2W3ZB}~B6vEq1S-0KMmpue&)ymrL9KU()kOR(oN+;=FIqm;Tzj~5Hd~+f~ z32qJmROQL>520q(`){2egj3Hy+_OcrcuSQ`&Lumu>MGi3V*(-KwgtE;%FM0Nndm+$ zbYILX|47s`vhMci<>4RXw+X?MqVv&)biF1|p&Uc%g44W@GHOsa2LNQ;Vgk?TjK5HK zzWyQPs_LfKd}2D|pW0F-wRKMSu{U~$=Xzm16bG#f&(^X#JG;zskNUDF+EpESd-Zg$ zYEw(7J@aYhYtixU(I=Q`ji zg(_!3)ujOYux+KOXIZp`%5LUNahilBaF!7epk1RjjppI-Qd_4B@=CD@tO!jO6nkIeBy0rJGBTm3L8dvLC~T0DiDKeQwK zN6eT85d3-fUUcHXIR9%aBg~my+VCG&K=4jh?yX+>!FPc+o*w4fEuA`lPVMXIdEplx zqkrdciviFzLGXBs+dszdMe_2ImNX+>^c7RN9ZmmSe$Lu)H-IiNNd5+z8}Z_|vYhD{eSYZK$y;suvT1g4w9In5UA8M@y{QNOjjkr_-BY^tE@^=fj*6p#?bBDI z14M$OB0uUyKWo$s5%luMJAKnHHaK)F;Ee=8F2y}s+l}gaMG%Y0v(I`(B*r<66drm- z<4U9Cq+>C*%wo3S3#-qzr4t*Jl6B(QQoVX4G2sv4 z$6zy>K1z8wttgskY*d5{@=aq9={Pcy(-*h-Bik;+9#&+x=@kZ(7$zPtenC~@RGw*W z3+qKylT=N4-{K9niC`X89i-M8@Ot1l#!9a<57R~rWo9)rPUWM+-l+aAdh|Tpj?xcC zyFoxW_5HUAw%`3~8ztx$WkA2C@XWwi5kC|EuQTMrIC(mMr*53T_ZT3Nd@k`1wH6!I zfpu|%ZydGc{HC0jvJD^*j!9e&c?O0HyB5k8?6He1P!8FQMwCvPXdwX_Pwf9d$tgSI zuISMW(A>;$7lZyY&4=%O0Dv0FbEK%=wil`zQn)?WAFo}v#Y)oNW0Xvw-4pSVZn=>U znY9DT8>yjj<>KR=VUTN9eG2ve%uK3Yf^fqT5rx7;zJnm}0hRfov%~sRW9gip_F%KR z8a&Ts*TUy!GaTF84+JaL6dslZ2!aXS;L%(H=jIU>Ph{R~RN^QXq*ar)F;TxtJXz>q z(Y@^+$EaZI|5_`>qN3SaHVq}$IByi0Do^mWCratM$CTsk1iVen@pJ(ot$Kc5p*C1= zxaj!Eg3{R1dek7sXSoBiB9Cxpz#Fd?X)1~J*$qIo--du!BsOQiR)S;cf5*B+b3x)$ zMjTs5_zz1~PXqJco3>`(o$>01n&{fJ%I||VmxdB6+fjLK8U1lw#M)mct9e9cHG+v>o%1PU^s8jY z3RpkCiEGVEdg+|oZi?5c5}A{4PE{TU!^5wDgEPKi)ol^C0RD5x;WX8pcN>Ga$X50E zYv$5`R#=|1_CaRg$ufEA#`9jE#s{7DmbTP_x1qJD&x7_$r2R>1KZn2DFP-7+yrw`h z^+OYc>w3260v?!P0I&tyb!^v1Ubh9xcGE5h$?|z@y_tSRbpJ##K=e0228Q7d8@sMBPTtm#qc>MuJQME$Tb`!7eAh+M zqA=A-Ng|%_b3Y_74}OBDnl;2cxeN}++YMzdw)F5tv*!dUTMe44mf(Mg<{XizcWL%H zGVJ9GW%~wV!2sTq01WkqBmWcjly4Co{BPqkjYTy8uEfRhtP(@ls6Ou+aO=VxiEyqc zcB|A~+_wII?ZZx|NQwexl^$eWD!a6~>9O_}R4t}_JK|Rn%8?5q@fu%JUd*Sm`{^Oj zf6)#lnUTQHzm%dr8KT=zOT$K6A6446+E*jsFsT!+Yk8 zFH{dhb3AJ-Ckhgt3ZiA>6dr|*39{p{`obPy|$?>_+T|sJ}E+t~sOcinP$V z%^`2cN5k#Y>0{H^Xp-Ok1?xCgf5$QIUfEx)TGbJ?P4D{jT*HGhUVCh(=XHh<8ruRP zI~*x+HtcXb$*xiE8su4oK&nN;wMj9RLKg%Lujv|T6c=2j`Yj(=y~0~z&*i)~(G39H z2G5$Ry;96gbiou-0E<4d{eJr#0E`}W9kFmt-<)2v1Q6MVT!XA>4z5G{XY*Wec~Ec6-M^k zbnF9as{IR>-F(@ioq_@HpbHt2I`Dptg;s!iOa6FZvQZOxg0oP@n?E)Sw%VbT!m8iv zp{T4~`a64V4(IRHsE%NiBFpzJAty+>MYxhB*{~$`x|G(n@=XVRldyiwiXuRO^o>6k z`}@^}o|>C+_hCb8AupY4$%nr`TK3t*zsz{`5=ab{``kJfdRyVV{nvz9el6jB*SL`| z_`3N;iJLS~w{2i)ArkH8VKsCFC&7V6y(NBTTJK#6Gi!7E`F8WljlnF!jC4LnN#5OIH_cAuLq5GeD-&-}~fpr}{&x(;Obu7^V_^YsrnxF;<_JJg>hXm&e|Ho!;_GXWDS01InZ zr7ZBIBV5}~e<5dCM_{OUfmZb{-WHYq;jgvEX0)-1=M*tP2>4bwo(s^U* z1mDqX33rWyP5*v7K`=m(Xff$n&G9#ErT+D5KO<%3!PKg{R}=L_=6sUD+;w?tEp1gY zF5az5t{_B_lxsbad*Fp-&VRPN# zwIdjylUHCnqEex9JfgB2+F-`IWjK|X?Z2D5pjoLAU$`37{4NJTO>{IBXFcrqRb7=(J9ii zE^vFZ3D8$`vp3>)u9n;CRy8ubT+{hGScy%@2XILfg}rA`FmAxjp!~+gX#5vpANPTV z)UQSC^+qAt;>^A`EYgXzo#E+r!YQeiclEtsO!f@iI4)_%G1`#uuuN2jw+_Qu1^R1`*1EaZagn<^Xf_8DF1C-f| zb|za>0Fb@g$4Q_JL6L$xWH(QjP5I^f^167y~5#c>VHAm2LbI zRAH{qAdCJeH7(cfXO`iMpILS9;FECU+c5Yo4tTWwXxstgy2jcSu2x(Tre144s8;8L zTa2`Ay9zWdEgS0fxvxEOYaX0=l>8OBXtV;Vi(`Q`+p7rSk3b z{|w@6knMFntk6KVCUcAzCX_-ZTye6g-D~pLD+)`XJkhCEqQ*&ybKC4uCG8GJm(RI77y%G*FvhnMn2ksJ_Wa#)-?H#?f#`$4B5bh9s)Y} z*JW-w6tA+Q>V1!F30zn)E{|H0pyEHEDz!9~%o4X<@RIYl8~G0}Vlw!@vWpLqtp;4^ zSs%znEDNYyXWOk3x}LQ1Qtay0{q}8vVVIu#dKIMfJa(F{_g&TLR8>EDq#^H=Svt=q zIMy)#kS{p)k=9nm09$89Q0~`c)p5qtTj~6Q(z=~lu8x7R{5wIsmt=9UbSc0@luhh#@#7T>sStit&bOrnK(O`K})`N%Wkjz~HT$~<89&E8> z_j7C|=7&c7kVBr2eoL1=(f;mbLkyKb5nyIvn?#)Xyo-y*D+dc{&pl|dHRkg!u=V4Y z5x;NlB2c#@$#~5OZu*ofPU7Epk3YT3-%jA|PE1Q@g6(CY^1)LnUz0KE-NXep>+)YV ze_ee~ZmmA=iu8N+IM8Kc7XWZKk~j!0519qhQ_Dv1r4#;4jSEbxV)>#U$9u0i1UY^jCAbG zO(E6esO*++K`8&3F3zU3|0&~JgB1Omw98*k6$;I1M~b(OaZ@19TV%>QDk2?(TZ5o? z78>R{yV^S{)kZh%^uupLlcLj?^x5(OgAJ(zwI#sg zv|5|IT@666GP)fG2w9bA1aU&p?@Ref-%a6>G=Oi*cyjS}S<1F#%j{e=+G33H1d?xS z6h>PqP`*uMi!C#tAX=z)c&|n>@DI{nUmD;¨KQ3+c~H%1Ywx=e4r!HiTkuTlAYU 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

w5IMCH;kx4Rhq&djo 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ÌiVdtmZIpO346L`z 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 KXQ~^27XCk5GX)g@ diff --git a/website/assets/img/pattern_green.jpg b/website/assets/img/pattern_green.jpg deleted file mode 100644 index 172495c38e389753575ab1716f413e643f03e81f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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
  • 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 diff --git a/website/assets/img/pattern_landing.jpg b/website/assets/img/pattern_landing.jpg deleted file mode 100644 index 95ed24b178e568ab28b52cb0e87a66e99caf12f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186575 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

    e+DGe=KOU@(SqLYlmJ1Iz&; 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