Merge branch 'website/v3-launch' into develop

This commit is contained in:
Ines Montani 2021-01-30 20:31:06 +11:00
commit ae07416fda
22 changed files with 167 additions and 96 deletions

View File

@ -2,9 +2,8 @@ redirects = [
# Netlify # Netlify
{from = "https://spacy.netlify.com/*", to="https://spacy.io/:splat", force = true }, {from = "https://spacy.netlify.com/*", to="https://spacy.io/:splat", force = true },
# Subdomain for branches # Subdomain for branches
{from = "https://nightly.spacy.io/*", to="https://nightly-spacy-io.spacy.io/:splat", force = true, status = 200}, {from = "https://nightly.spacy.io/*", to="https://spacy.io/:splat", force = true},
# TODO: update this with the v2 branch build once v3 is live (status = 200) {from = "https://v2.spacy.io/*", to="https://v2-spacy-io.spacy.io/:splat", force = true, status = 200},
{from = "https://v2.spacy.io/*", to="https://spacy.io/:splat", force = true},
# Old subdomains # Old subdomains
{from = "https://survey.spacy.io/*", to = "https://spacy.io", force = true}, {from = "https://survey.spacy.io/*", to = "https://spacy.io", force = true},
{from = "http://survey.spacy.io/*", to = "https://spacy.io", force = true}, {from = "http://survey.spacy.io/*", to = "https://spacy.io", force = true},

View File

@ -537,15 +537,17 @@ two major steps required:
pass through the `nlp` pipeline. pass through the `nlp` pipeline.
<Project id="tutorials/rel_component"> <Project id="tutorials/rel_component">
Run this example use-case by using our project template. It includes all the Run this example use-case by using our project template. It includes all the
code to create the ML model and the pipeline component from scratch. code to create the ML model and the pipeline component from scratch.
It also contains two config files to train the model: It also contains two config files to train the model:
one to run on CPU with a Tok2Vec layer, and one for the GPU using a transformer. one to run on CPU with a Tok2Vec layer, and one for the GPU using a transformer.
The project applies the relation extraction component to identify biomolecular The project applies the relation extraction component to identify biomolecular
interactions in a sample dataset, but you can easily swap in your own dataset interactions in a sample dataset, but you can easily swap in your own dataset
for your experiments in any other domain. for your experiments in any other domain.
</Project> </Project>
<YouTube id="8HL-Ap5_Axo"></YouTube>
#### Step 1: Implementing the Model {#component-rel-model} #### Step 1: Implementing the Model {#component-rel-model}
We need to implement a [`Model`](https://thinc.ai/docs/api-model) that takes a We need to implement a [`Model`](https://thinc.ai/docs/api-model) that takes a
@ -824,7 +826,7 @@ will predict scores for each label. We add convenience methods to easily
retrieve and add to them. retrieve and add to them.
```python ```python
### The constructor (continued) ### The constructor (continued)
def __init__(self, vocab, model, name="rel"): def __init__(self, vocab, model, name="rel"):
"""Create a component instance.""" """Create a component instance."""
# ... # ...
@ -1041,11 +1043,11 @@ def make_relation_extractor(nlp, name, model):
``` ```
<Project id="tutorials/rel_component"> <Project id="tutorials/rel_component">
Run this example use-case by using our project template. It includes all the Run this example use-case by using our project template. It includes all the
code to create the ML model and the pipeline component from scratch. code to create the ML model and the pipeline component from scratch.
It contains two config files to train the model: It contains two config files to train the model:
one to run on CPU with a Tok2Vec layer, and one for the GPU using a transformer. one to run on CPU with a Tok2Vec layer, and one for the GPU using a transformer.
The project applies the relation extraction component to identify biomolecular The project applies the relation extraction component to identify biomolecular
interactions, but you can easily swap in your own dataset for your experiments interactions, but you can easily swap in your own dataset for your experiments
in any other domain. in any other domain.
</Project> </Project>

View File

@ -193,6 +193,8 @@ available for the different architectures are documented with the
</Infobox> </Infobox>
<YouTube id="BWhh3r6W-qE"></YouTube>
### Config lifecycle at runtime and training {#config-lifecycle} ### Config lifecycle at runtime and training {#config-lifecycle}
A pipeline's `config.cfg` is considered the "single source of truth", both at A pipeline's `config.cfg` is considered the "single source of truth", both at

View File

@ -67,6 +67,16 @@ improvements**. The [API docs](/api) include additional deprecation notes. New
methods and functions that were introduced in this version are marked with the methods and functions that were introduced in this version are marked with the
tag <Tag variant="new">3</Tag>. tag <Tag variant="new">3</Tag>.
<YouTube id="9k_EfV7Cns0"></YouTube>
<Grid cols={2} gutterBottom={false} narrow>
<YouTube id="BWhh3r6W-qE"></YouTube>
<YouTube id="8HL-Ap5_Axo"></YouTube>
</Grid>
### Transformer-based pipelines {#features-transformers} ### Transformer-based pipelines {#features-transformers}
> #### Example > #### Example

View File

@ -19,11 +19,11 @@ const universe = require('./meta/universe.json')
const DEFAULT_TEMPLATE = path.resolve('./src/templates/index.js') const DEFAULT_TEMPLATE = path.resolve('./src/templates/index.js')
const isNightly = !!+process.env.SPACY_NIGHTLY || site.nightlyBranches.includes(process.env.BRANCH) const domain = process.env.BRANCH || site.domain
const favicon = isNightly ? `src/images/icon_nightly.png` : `src/images/icon.png` const siteUrl = `https://${domain}`
const binderBranch = isNightly ? 'nightly' : site.binderBranch const isNightly = site.nightlyBranches.includes(domain)
const siteUrl = isNightly ? site.siteUrlNightly : site.siteUrl const isLegacy = site.legacy || !!+process.env.SPACY_LEGACY
const domain = isNightly ? site.domainNightly : site.domain const favicon = `src/images/icon${isNightly ? '_nightly' : isLegacy ? '_legacy' : ''}.png`
const branch = isNightly ? 'develop' : 'master' const branch = isNightly ? 'develop' : 'master'
// Those variables are going to be replaced in the Markdown, e.g. %%GITHUB_SPACY // Those variables are going to be replaced in the Markdown, e.g. %%GITHUB_SPACY
@ -53,7 +53,8 @@ module.exports = {
counts: getCounts(models.languages), counts: getCounts(models.languages),
universe, universe,
nightly: isNightly, nightly: isNightly,
binderBranch, legacy: isLegacy,
binderBranch: domain,
siteUrl, siteUrl,
}, },

View File

@ -2,11 +2,9 @@
"title": "spaCy", "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.", "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.",
"slogan": "Industrial-strength Natural Language Processing in Python", "slogan": "Industrial-strength Natural Language Processing in Python",
"siteUrl": "https://spacy.io",
"domain": "spacy.io", "domain": "spacy.io",
"siteUrlNightly": "https://nightly.spacy.io",
"domainNightly": "nightly.spacy.io",
"nightlyBranches": ["nightly.spacy.io"], "nightlyBranches": ["nightly.spacy.io"],
"legacy": false,
"email": "contact@explosion.ai", "email": "contact@explosion.ai",
"company": "Explosion", "company": "Explosion",
"companyUrl": "https://explosion.ai", "companyUrl": "https://explosion.ai",

View File

@ -57,6 +57,7 @@
"build": "npm run python:install && npm run python:setup && gatsby build", "build": "npm run python:install && npm run python:setup && gatsby build",
"dev": "npm run python:setup && gatsby develop", "dev": "npm run python:setup && gatsby develop",
"dev:nightly": "BRANCH=nightly.spacy.io npm run dev", "dev:nightly": "BRANCH=nightly.spacy.io npm run dev",
"dev:legacy": "SPACY_LEGACY=1 npm run dev",
"lint": "eslint **", "lint": "eslint **",
"clear": "rm -rf .cache", "clear": "rm -rf .cache",
"test": "echo \"Write tests! -> https://gatsby.app/unit-testing\"", "test": "echo \"Write tests! -> https://gatsby.app/unit-testing\"",

View File

@ -8,8 +8,8 @@ import { markdownToReact } from './util'
import classes from '../styles/embed.module.sass' import classes from '../styles/embed.module.sass'
const YouTube = ({ id, ratio = '16x9' }) => { const YouTube = ({ id, ratio = '16x9', className }) => {
const embedClassNames = classNames(classes.root, classes.responsive, { const embedClassNames = classNames(classes.root, classes.responsive, className, {
[classes.ratio16x9]: ratio === '16x9', [classes.ratio16x9]: ratio === '16x9',
[classes.ratio4x3]: ratio === '4x3', [classes.ratio4x3]: ratio === '4x3',
}) })

View File

@ -1,10 +1,12 @@
import React from 'react' import React from 'react'
import classNames from 'classnames' import classNames from 'classnames'
import pattern from '../images/pattern_blue.jpg' import patternDefault from '../images/pattern_blue.jpg'
import patternNightly from '../images/pattern_nightly.jpg' import patternNightly from '../images/pattern_nightly.jpg'
import patternOverlay from '../images/pattern_landing.jpg' import patternLegacy from '../images/pattern_legacy.jpg'
import patternOverlayNightly from '../images/pattern_landing_nightly.jpg' import overlayDefault from '../images/pattern_landing.jpg'
import overlayNightly from '../images/pattern_landing_nightly.jpg'
import overlayLegacy from '../images/pattern_landing_legacy.jpg'
import Grid from './grid' import Grid from './grid'
import { Content } from './main' import { Content } from './main'
@ -14,9 +16,15 @@ import { H1, H2, H3 } from './typography'
import Link from './link' import Link from './link'
import classes from '../styles/landing.module.sass' import classes from '../styles/landing.module.sass'
export const LandingHeader = ({ nightly, style = {}, children }) => { function getPattern(nightly, legacy) {
const overlay = nightly ? patternOverlayNightly : patternOverlay if (nightly) return { pattern: patternNightly, overlay: overlayNightly }
const wrapperStyle = { backgroundImage: `url(${nightly ? patternNightly : pattern})` } if (legacy) return { pattern: patternLegacy, overlay: overlayLegacy }
return { pattern: patternDefault, overlay: overlayDefault }
}
export const LandingHeader = ({ nightly, legacy, style = {}, children }) => {
const { pattern, overlay } = getPattern(nightly, legacy)
const wrapperStyle = { backgroundImage: `url(${pattern})` }
const contentStyle = { backgroundImage: `url(${overlay})`, ...style } const contentStyle = { backgroundImage: `url(${overlay})`, ...style }
return ( return (
<header className={classes.header}> <header className={classes.header}>
@ -109,16 +117,18 @@ export const LandingBanner = ({
return ( return (
<div className={classes.banner} style={style}> <div className={classes.banner} style={style}>
<Grid cols={small ? null : 3} narrow className={contentClassNames}> <Grid cols={small ? null : 3} narrow className={contentClassNames}>
<Heading Component="h3" className={classes.bannerTitle}> {(title || label) && (
{label && ( <Heading Component="h3" className={classes.bannerTitle}>
<div className={classes.bannerLabel}> {label && (
<span className={classes.label}>{label}</span> <div className={classes.bannerLabel}>
</div> <span className={classes.label}>{label}</span>
)} </div>
<Link to={to} hidden> )}
{title} <Link to={to} hidden>
</Link> {title}
</Heading> </Link>
</Heading>
)}
<div className={textClassNames}> <div className={textClassNames}>
<p>{children}</p> <p>{children}</p>

View File

@ -6,6 +6,7 @@ import patternBlue from '../images/pattern_blue.jpg'
import patternGreen from '../images/pattern_green.jpg' import patternGreen from '../images/pattern_green.jpg'
import patternPurple from '../images/pattern_purple.jpg' import patternPurple from '../images/pattern_purple.jpg'
import patternNightly from '../images/pattern_nightly.jpg' import patternNightly from '../images/pattern_nightly.jpg'
import patternLegacy from '../images/pattern_legacy.jpg'
import classes from '../styles/main.module.sass' import classes from '../styles/main.module.sass'
const patterns = { const patterns = {
@ -13,6 +14,7 @@ const patterns = {
green: patternGreen, green: patternGreen,
purple: patternPurple, purple: patternPurple,
nightly: patternNightly, nightly: patternNightly,
legacy: patternLegacy,
} }
export const Content = ({ Component = 'div', className, children }) => ( export const Content = ({ Component = 'div', className, children }) => (

View File

@ -26,12 +26,18 @@ const NavigationDropdown = ({ items = [], section }) => {
) )
} }
export default function Navigation({ title, items = [], section, search, children }) { export default function Navigation({ title, items = [], section, search, alert, children }) {
return ( return (
<nav className={classes.root}> <nav className={classes.root}>
<Link to="/" aria-label={title} hidden> <Link
to="/"
aria-label={title}
hidden
className={classNames({ [classes.hasAlert]: !!alert })}
>
<h1 className={classes.title}>{title}</h1> <h1 className={classes.title}>{title}</h1>
<Logo className={classes.logo} width={300} height={96} /> <Logo className={classes.logo} width={300} height={96} />
{alert && <span className={classes.alert}>{alert}</span>}
</Link> </Link>
<div className={classes.menu}> <div className={classes.menu}>

View File

@ -7,10 +7,12 @@ import socialImageDefault from '../images/social_default.jpg'
import socialImageApi from '../images/social_api.jpg' import socialImageApi from '../images/social_api.jpg'
import socialImageUniverse from '../images/social_universe.jpg' import socialImageUniverse from '../images/social_universe.jpg'
import socialImageNightly from '../images/social_nightly.jpg' import socialImageNightly from '../images/social_nightly.jpg'
import socialImageLegacy from '../images/social_legacy.jpg'
function getPageTitle(title, sitename, slogan, sectionTitle, nightly) { function getPageTitle(title, sitename, slogan, sectionTitle, nightly, legacy) {
if (sectionTitle && title) { if (sectionTitle && title) {
return `${title} · ${sitename} ${sectionTitle}${nightly ? ' (nightly)' : ''}` const suffix = nightly ? ' (nightly)' : legacy ? ' (legacy)' : ''
return `${title} · ${sitename} ${sectionTitle}${suffix}`
} }
if (title) { if (title) {
return `${title} · ${sitename}` return `${title} · ${sitename}`
@ -18,8 +20,9 @@ function getPageTitle(title, sitename, slogan, sectionTitle, nightly) {
return `${sitename} · ${slogan}` return `${sitename} · ${slogan}`
} }
function getImage(section, nightly) { function getImage(section, nightly, legacy) {
if (nightly) return socialImageNightly if (nightly) return socialImageNightly
if (legacy) return socialImageLegacy
if (section === 'api') return socialImageApi if (section === 'api') return socialImageApi
if (section === 'universe') return socialImageUniverse if (section === 'universe') return socialImageUniverse
return socialImageDefault return socialImageDefault
@ -33,6 +36,7 @@ export default function SEO({
sectionTitle, sectionTitle,
bodyClass, bodyClass,
nightly, nightly,
legacy,
}) { }) {
return ( return (
<StaticQuery <StaticQuery
@ -45,9 +49,10 @@ export default function SEO({
siteMetadata.title, siteMetadata.title,
siteMetadata.slogan, siteMetadata.slogan,
sectionTitle, sectionTitle,
nightly nightly,
legacy
) )
const socialImage = siteMetadata.siteUrl + getImage(section, nightly) const socialImage = siteMetadata.siteUrl + getImage(section, nightly, legacy)
const meta = [ const meta = [
{ {
name: 'description', name: 'description',

View File

@ -6,8 +6,8 @@ import siteMetadata from '../../meta/site.json'
const htmlToReactParser = new HtmlToReactParser() const htmlToReactParser = new HtmlToReactParser()
// TODO: update this const isNightly = siteMetadata.nightlyBranches.includes(siteMetadata.domain)
const DEFAULT_BRANCH = 'develop' export const DEFAULT_BRANCH = isNightly ? 'develop' : 'master'
export const repo = siteMetadata.repo export const repo = siteMetadata.repo
export const modelsRepo = siteMetadata.modelsRepo export const modelsRepo = siteMetadata.modelsRepo
export const projectsRepo = siteMetadata.projectsRepo export const projectsRepo = siteMetadata.projectsRepo

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -7,11 +7,11 @@ import { LandingHeader, LandingTitle } from '../components/landing'
import Button from '../components/button' import Button from '../components/button'
export default ({ data, location }) => { export default ({ data, location }) => {
const { nightly } = data.site.siteMetadata const { nightly, legacy } = data.site.siteMetadata
const pageContext = { title: '404 Error', searchExclude: true, isIndex: false } const pageContext = { title: '404 Error', searchExclude: true, isIndex: false }
return ( return (
<Template data={data} pageContext={pageContext} location={location}> <Template data={data} pageContext={pageContext} location={location}>
<LandingHeader style={{ minHeight: 400 }} nightly={nightly}> <LandingHeader style={{ minHeight: 400 }} nightly={nightly} legacy={legacy}>
<LandingTitle> <LandingTitle>
Ooops, this page Ooops, this page
<br /> <br />
@ -31,6 +31,7 @@ export const pageQuery = graphql`
site { site {
siteMetadata { siteMetadata {
nightly nightly
legacy
title title
description description
navigation { navigation {

View File

@ -54,6 +54,11 @@
--color-theme-nightly-light: hsla(257, 99%, 67%, 0.06) --color-theme-nightly-light: hsla(257, 99%, 67%, 0.06)
--color-theme-nightly-opaque: hsla(257, 99%, 67%, 0.11) --color-theme-nightly-opaque: hsla(257, 99%, 67%, 0.11)
--color-theme-legacy: #6f6f6f
--color-theme-legacy-dark: hsl(257, 0%, 35%)
--color-theme-legacy-light: hsla(257, 0%, 67%, 0.06)
--color-theme-legacy-opaque: hsla(257, 0%, 67%, 0.11)
// Regular colors // Regular colors
--color-back: hsl(0, 0%, 100%) --color-back: hsl(0, 0%, 100%)
--color-front: hsl(213, 15%, 12%) --color-front: hsl(213, 15%, 12%)
@ -118,6 +123,12 @@
--color-theme-light: var(--color-theme-nightly-light) --color-theme-light: var(--color-theme-nightly-light)
--color-theme-opaque: var(--color-theme-nightly-opaque) --color-theme-opaque: var(--color-theme-nightly-opaque)
.theme-legacy
--color-theme: var(--color-theme-legacy)
--color-theme-dark: var(--color-theme-legacy-dark)
--color-theme-light: var(--color-theme-legacy-light)
--color-theme-opaque: var(--color-theme-legacy-opaque)
/* Fonts */ /* Fonts */

View File

@ -83,10 +83,33 @@
border: 2px dotted var(--color-theme) border: 2px dotted var(--color-theme)
outline: none outline: none
.has-alert
display: inline-flex
flex-flow: row nowrap
align-items: center
.alert
font-size: 1.2rem
font-family: var(--font-primary)
display: inline-block
background: var(--color-yellow-opaque)
color: var(--color-dark)
border-radius: var(--border-radius)
margin-left: var(--spacing-xs)
padding: 0.5rem
line-height: var(--line-height-xs)
text-align: center
@include breakpoint(max, xs) @include breakpoint(max, xs)
.list .list
display: none display: none
.alert
display: none
.has-alert
display: inline
@include breakpoint(min, sm) @include breakpoint(min, sm)
.dropdown .dropdown
display: none display: none

View File

@ -32,7 +32,7 @@ const Docs = ({ pageContext, children }) => (
version, version,
apiDetails, apiDetails,
} = pageContext } = pageContext
const { sidebars = [], modelsRepo, languages, nightly } = site.siteMetadata const { sidebars = [], modelsRepo, languages, nightly, legacy } = site.siteMetadata
const isModels = section === 'models' const isModels = section === 'models'
const sidebar = pageContext.sidebar const sidebar = pageContext.sidebar
? { items: pageContext.sidebar } ? { items: pageContext.sidebar }
@ -74,7 +74,7 @@ const Docs = ({ pageContext, children }) => (
{sidebar && <Sidebar items={sidebar.items} pageMenu={pageMenu} slug={slug} />} {sidebar && <Sidebar items={sidebar.items} pageMenu={pageMenu} slug={slug} />}
<Main <Main
section={section} section={section}
theme={nightly ? 'nightly' : theme} theme={nightly ? 'nightly' : legacy ? 'legacy' : theme}
sidebar sidebar
asides asides
wrapContent wrapContent
@ -138,6 +138,7 @@ const query = graphql`
models models
} }
nightly nightly
legacy
sidebars { sidebars {
section section
items { items {

View File

@ -82,7 +82,7 @@ const scopeComponents = {
IntegrationLogo, IntegrationLogo,
} }
const AlertSpace = ({ nightly }) => { const AlertSpace = ({ nightly, legacy }) => {
const isOnline = useOnlineStatus() const isOnline = useOnlineStatus()
return ( return (
<> <>
@ -99,6 +99,16 @@ const AlertSpace = ({ nightly }) => {
, not the latest <Link to="https://spacy.io">stable version</Link>. , not the latest <Link to="https://spacy.io">stable version</Link>.
</Alert> </Alert>
)} )}
{legacy && (
<Alert
title="You're viewing the old documentation"
icon="warning"
closeOnClick={false}
>
The page reflects an older version of spaCy, not the latest{' '}
<Link to="https://spacy.io">stable release</Link>.
</Alert>
)}
{!isOnline && ( {!isOnline && (
<Alert title="Looks like you're offline." icon="offline" variant="warning"> <Alert title="Looks like you're offline." icon="offline" variant="warning">
But don't worry, your visited pages should be saved for you. But don't worry, your visited pages should be saved for you.
@ -108,6 +118,12 @@ const AlertSpace = ({ nightly }) => {
) )
} }
const navAlert = (
<Link to="/usage/v3" hidden>
<strong>💥 Out now:</strong> spaCy v3.0
</Link>
)
class Layout extends React.Component { class Layout extends React.Component {
static defaultProps = { static defaultProps = {
scope: {}, scope: {},
@ -152,7 +168,7 @@ class Layout extends React.Component {
const mdx = file ? file.childMdx : null const mdx = file ? file.childMdx : null
const meta = site.siteMetadata || {} const meta = site.siteMetadata || {}
const { title, section, sectionTitle, teaser, theme = 'blue', searchExclude } = pageContext const { title, section, sectionTitle, teaser, theme = 'blue', searchExclude } = pageContext
const uiTheme = meta.nightly ? 'nightly' : theme const uiTheme = meta.nightly ? 'nightly' : meta.legacy ? 'legacy' : theme
const bodyClass = classNames(`theme-${uiTheme}`, { 'search-exclude': !!searchExclude }) const bodyClass = classNames(`theme-${uiTheme}`, { 'search-exclude': !!searchExclude })
const isDocs = ['usage', 'models', 'api', 'styleguide'].includes(section) const isDocs = ['usage', 'models', 'api', 'styleguide'].includes(section)
const content = !mdx ? null : ( const content = !mdx ? null : (
@ -171,12 +187,13 @@ class Layout extends React.Component {
bodyClass={bodyClass} bodyClass={bodyClass}
nightly={meta.nightly} nightly={meta.nightly}
/> />
<AlertSpace nightly={meta.nightly} /> <AlertSpace nightly={meta.nightly} legacy={meta.legacy} />
<Navigation <Navigation
title={meta.title} title={meta.title}
items={meta.navigation} items={meta.navigation}
section={section} section={section}
search={<Search settings={meta.docSearch} />} search={<Search settings={meta.docSearch} />}
alert={meta.nightly ? null : navAlert}
> >
<Progress key={location.href} /> <Progress key={location.href} />
</Navigation> </Navigation>
@ -207,6 +224,7 @@ export const pageQuery = graphql`
site { site {
siteMetadata { siteMetadata {
nightly nightly
legacy
title title
description description
navigation { navigation {

View File

@ -302,8 +302,8 @@ const Universe = ({ pageContext, location, mdxComponents }) => (
<StaticQuery <StaticQuery
query={query} query={query}
render={data => { render={data => {
const { universe, nightly } = data.site.siteMetadata const { universe, nightly, legacy } = data.site.siteMetadata
const theme = nightly ? 'nightly' : pageContext.theme const theme = nightly ? 'nightly' : legacy ? 'legacy' : pageContext.theme
return ( return (
<UniverseContent <UniverseContent
content={universe.resources} content={universe.resources}
@ -325,6 +325,7 @@ const query = graphql`
site { site {
siteMetadata { siteMetadata {
nightly nightly
legacy
universe { universe {
resources { resources {
type type

View File

@ -17,6 +17,7 @@ import { H2 } from '../components/typography'
import { InlineCode } from '../components/code' import { InlineCode } from '../components/code'
import Button from '../components/button' import Button from '../components/button'
import Link from '../components/link' import Link from '../components/link'
import { YouTube } from '../components/embed'
import QuickstartTraining from './quickstart-training' import QuickstartTraining from './quickstart-training'
import Project from './project' import Project from './project'
@ -24,7 +25,6 @@ import Features from './features'
import courseImage from '../../docs/images/course.jpg' import courseImage from '../../docs/images/course.jpg'
import prodigyImage from '../../docs/images/prodigy_overview.jpg' import prodigyImage from '../../docs/images/prodigy_overview.jpg'
import projectsImage from '../../docs/images/projects.png' import projectsImage from '../../docs/images/projects.png'
import irlBackground from '../images/spacy-irl.jpg'
import Benchmarks from 'usage/_benchmarks-models.md' import Benchmarks from 'usage/_benchmarks-models.md'
@ -56,11 +56,11 @@ for entity in doc.ents:
} }
const Landing = ({ data }) => { const Landing = ({ data }) => {
const { nightly } = data const { nightly, legacy } = data
const codeExample = getCodeExample(nightly) const codeExample = getCodeExample(nightly)
return ( return (
<> <>
<LandingHeader nightly={data.nightly}> <LandingHeader nightly={nightly} legacy={legacy}>
<LandingTitle> <LandingTitle>
Industrial-Strength Industrial-Strength
<br /> <br />
@ -206,50 +206,29 @@ const Landing = ({ data }) => {
</LandingGrid> </LandingGrid>
<LandingBannerGrid> <LandingBannerGrid>
<LandingBanner <LandingBanner background="#0099dd" color="#ffffff" small>
title="spaCy v3.0 nightly: Transformer-based pipelines, new training system, project templates &amp; more" <YouTube id="9k_EfV7Cns0" />
label="Try the pre-release"
to="https://nightly.spacy.io"
button="See what's new"
background="#8758fe"
color="#ffffff"
small
>
spaCy v3.0 features all new <strong>transformer-based pipelines</strong> that
bring spaCy's accuracy right up to the current <strong>state-of-the-art</strong>
. You can use any pretrained transformer to train your own pipelines, and even
share one transformer between multiple components with{' '}
<strong>multi-task learning</strong>. Training is now fully configurable and
extensible, and you can define your own custom models using{' '}
<strong>PyTorch</strong>, <strong>TensorFlow</strong> and other frameworks. The
new spaCy projects system lets you describe whole{' '}
<strong>end-to-end workflows</strong> in a single file, giving you an easy path
from prototype to production, and making it easy to clone and adapt
best-practice projects for your own use cases.
</LandingBanner> </LandingBanner>
<LandingBanner <LandingBanner
title="Prodigy: Radically efficient machine teaching" to="https://course.spacy.io"
label="From the makers of spaCy" button="Start the course"
to="https://prodi.gy"
button="Try it out"
background="#f6f6f6" background="#f6f6f6"
color="#000" color="#252a33"
small small
> >
<Link to="https://prodi.gy" hidden> <Link to="https://course.spacy.io" hidden>
<img <img
src={prodigyImage} src={courseImage}
alt="Prodigy: Radically efficient machine teaching" alt="Advanced NLP with spaCy: A free online course"
/> />
</Link> </Link>
<br /> <br />
<br /> <br />
Prodigy is an <strong>annotation tool</strong> so efficient that data scientists In this <strong>free and interactive online course</strong> youll learn how to
can do the annotation themselves, enabling a new level of rapid iteration. use spaCy to build advanced natural language understanding systems, using both
Whether you're working on entity recognition, intent detection or image rule-based and machine learning approaches. It includes{' '}
classification, Prodigy can help you <strong>train and evaluate</strong> your <strong>55 exercises</strong> featuring videos, slide decks, multiple-choice
models faster. questions and interactive coding practice in the browser.
</LandingBanner> </LandingBanner>
</LandingBannerGrid> </LandingBannerGrid>
@ -295,6 +274,7 @@ const landingQuery = graphql`
site { site {
siteMetadata { siteMetadata {
nightly nightly
legacy
repo repo
} }
} }

View File

@ -2,7 +2,7 @@ import React, { useState } from 'react'
import { StaticQuery, graphql } from 'gatsby' import { StaticQuery, graphql } from 'gatsby'
import { Quickstart, QS } from '../components/quickstart' import { Quickstart, QS } from '../components/quickstart'
import { repo } from '../components/util' import { repo, DEFAULT_BRANCH } from '../components/util'
const DEFAULT_MODELS = ['en'] const DEFAULT_MODELS = ['en']
const DEFAULT_OPT = 'efficiency' const DEFAULT_OPT = 'efficiency'
@ -166,7 +166,7 @@ const QuickstartInstall = ({ id, title }) => {
</QS> </QS>
<QS package="source"> <QS package="source">
git clone https://github.com/{repo} git clone https://github.com/{repo}
{nightly ? ` --branch develop` : ''} {nightly ? ` --branch ${DEFAULT_BRANCH}` : ''}
</QS> </QS>
<QS package="source">cd spaCy</QS> <QS package="source">cd spaCy</QS>
<QS package="source" os="linux"> <QS package="source" os="linux">