Ce dépôt contient à la fois un cours en ligne , ainsi que son cadre Web open source moderne. Dans le cours, vous apprendrez à utiliser Spacy pour créer des systèmes avancés de compréhension du langage naturel, en utilisant à la fois des approches basées sur des règles et d'apprentissage automatique. Le frontal est alimenté par Gatsby, Reveal.js et Plyr, et l'exécution du code back-end utilise le classeur? Tout est open-source et publié sous la licence MIT (Code et Framework) et CC BY-NC (Spacy Course Materials).
Ce cours est principalement destiné à l'auto-étude . Oui, vous pouvez tricher - les solutions sont toutes dans ce dépôt, il n'y a pas de pénalité pour cliquer sur "Afficher des conseils" ou "Solution Show", et vous pouvez marquer un exercice comme cela est fait lorsque vous pensez que c'est fait.
| Langue | Exemples de texte 1 | Source | Auteurs |
|---|---|---|---|
| Anglais | Anglais | chapters/en , exercises/en | @ines |
| Allemand | Allemand | chapters/de , exercises/de | @ines, @ jette16 |
| Espagnol | Espagnol | chapters/es , exercises/es | @mariacamilagl, @ damian-romero |
| Français | Français | chapters/fr , exercises/fr | @Datakime |
| japonais | japonais | chapters/ja , exercises/ja | @tamuhey, @ hiroshi-matsuda-rit, @ ICOXFOG417, @akirakubo, @ forêt1988, @ ao9mame, @matsurih, @hiromuhota, @ mei28, @polm |
| Chinois | Chinois | chapters/zh , exercises/zh | @crownpku |
| portugais | Anglais | chapters/pt , exercises/pt | @Cristianasp |
Si vous apercevez une erreur, j'apprécie toujours les demandes de traction!
1. C'est la langue utilisée pour les exemples de texte et les ressources utilisées dans les exercices. Par exemple, la version allemande du cours utilise également des exemples et modèles de texte allemands. Il n'est pas toujours possible de traduire tous les exemples de code, de sorte que certaines traductions peuvent toujours utiliser et analyser le texte anglais dans le cadre du cours.
J'ai initialement développé le contenu de DataCamp, mais je voulais faire une version gratuite pour la mettre à la disposition de plus de personnes, et vous n'avez donc pas à vous inscrire à leur service. En tant que projet de week-end, j'ai fini par assembler ma propre petite application pour présenter les exercices et le contenu de manière amusante et interactive.
Probablement, oui! Si vous avez cherché une façon de bricolage de publier vos documents, j'espère que mon petit framework pourra être utile. Parce que tant de gens ont exprimé leur intérêt pour cela, j'ai mis en place des dépositions de démarrage que vous pouvez fourrer et adapter:
ines/course-starter-pythonines/course-starter-r La source de l'application, des composants d'interface utilisateur et du cadre Gatsby pour la construction de cours interactifs est sous licence en tant que MIT, comme à peu près tous mes logiciels open source. Le matériel de cours eux-mêmes (diapositives et chapitres) est autorisé sous CC BY-NC. Cela signifie que vous pouvez les utiliser librement - vous ne pouvez tout simplement pas gagner de l'argent.
Tout d'abord, merci beaucoup, c'est vraiment cool et précieux pour la communauté? J'ai essayé de configurer la structure du cours, il est donc facile d'ajouter différentes langues: les fichiers spécifiques à la langue sont organisés en répertoires dans exercises et chapters , et d'autres textes spécifiques à la langue sont disponibles dans locale.json . Si vous souhaitez contribuer, il existe deux façons différentes de vous impliquer:
Démarrer un projet de traduction communautaire. C'est la manière la plus simple et la plus attachée à des cadavres. Vous pouvez débarquer le dépôt, copier-coller la version anglaise, modifier le code de la langue, commencer à traduire et inviter les autres à contribuer (si vous le souhaitez). Si vous recherchez des contributeurs, n'hésitez pas à ouvrir un problème ici ou à taguer @spacy_io sur Twitter afin que nous puissions aider à faire passer le mot. Nous sommes également heureux de répondre à vos questions sur le tracker du problème.
Faites-nous une offre. Nous sommes ouverts à la mise en service de traductions pour différentes langues, donc si vous êtes intéressé, envoyez-nous un courriel à [email protected] et incluez votre offre, un horaire estimé et un peu sur vous et votre expérience (et tout travail d'écriture ou de traduction technique que vous avez fait dans le passé, si disponible). Peu importe où vous êtes basé, mais vous devriez pouvoir émettre des factures en tant que pigiste ou similaires, selon votre pays.
Encore une fois, c'est super cool! Bien que les vidéos anglaises et allemandes incluent également un enregistrement vidéo, ce n'est pas une exigence et nous serions heureux de fournir simplement une piste audio aux côtés des diapositives. Nous prenons soin du post-traitement et du montage vidéo, donc tout ce dont nous avons besoin, c'est de l'enregistrement audio. Si vous vous sentez à l'aise de vous enregistrer en lisant les notes de diapositive dans votre langue, envoyez-nous un courriel à [email protected] et faites-nous une offre et incluez un peu de vous et un travail similaire que vous avez fait dans le passé, si disponible.
Pour démarrer le serveur de développement local, installez GATSBY puis toutes les autres dépendances, utilisez npm run dev pour démarrer le serveur de développement. Assurez-vous que le nœud 10.15 est installé au moins.
npm install -g gatsby-cli # Install Gatsby globally
npm install # Install dependencies
npm run dev # Run the development server Si l'exécution avec Docker make build , puis make gatsby-dev
Lors de la création du site, Gatsby recherchera des fichiers .py et mettra leur contenu à la disposition de la question via GraphQL. Cela nous permet d'utiliser le code brut dans l'application. Sous le capot, l'application utilise Binder pour servir une image avec les dépendances du package, y compris les modèles Spacy. En appelant JupyterLab, nous pouvons ensuite exécuter du code à l'aide du noyau actif. Cela vous permet de modifier le code dans le navigateur et de voir les résultats en direct. Consultez également mon dépôt de juniper pour plus de détails sur la mise en œuvre.
Pour valider le code lorsque l'utilisateur frappe "Soumettre", j'utilise actuellement une astuce légèrement hacky. Étant donné que le code Python est renvoyé au noyau en tant que chaîne, nous pouvons le manipuler et ajouter des tests - par exemple, l'exercice exc_01_02_01.py sera validé à l'aide de test_01_02_01.py (si disponible). Le code utilisateur et le test sont combinés à l'aide d'un modèle de chaîne. Pour le moment, le testTemplate dans le meta.json ressemble à ceci:
from wasabi import msg
__msg__ = msg
__solution__ = """${solution}"""
${solution}
${test}
try:
test()
except AssertionError as e:
__msg__.fail(e)
S'il est présent, ${solution} sera remplacé par la valeur de chaîne du code utilisateur soumis. Dans ce cas, nous l'inservons deux fois: une fois en tant que chaîne afin que nous puissions vérifier si la soumission inclut quelque chose, et une fois en tant que code, nous pouvons donc l'exécuter et vérifier les objets qu'il crée. ${test} est remplacé par le contenu du fichier de test. Je rend également l'imprimante de wasabi disponible en __msg__ , afin que nous puissions facilement imprimer de jolis messages dans les tests. Enfin, le bloc try / accept vérifie si la fonction de test soulève une AssertionError et, dans l'affirmative, affiche le message d'erreur. Cela cache également le trace de trace d'erreur complet (qui peut facilement fuir les bonnes réponses).
Un fichier de test pourrait alors ressembler à ceci:
def test ():
assert "spacy.load" in __solution__ , "Are you calling spacy.load?"
assert nlp . meta [ "lang" ] == "en" , "Are you loading the correct model?"
assert nlp . meta [ "name" ] == "core_web_sm" , "Are you loading the correct model?"
assert "nlp(text)" in __solution__ , "Are you processing the text correctly?"
assert "print(doc.text)" in __solution__ , "Are you printing the Doc's text?"
__msg__ . good (
"Well done! Now that you've practiced loading models, let's look at "
"some of their predictions."
)Avec cette approche, il n'est pas toujours possible de valider parfaitement l'entrée - il y a trop d'options et nous voulons éviter de faux positifs.
Les tests automatisés s'assurent que le code de solution fourni est compatible avec le fichier de test utilisé pour valider les soumissions. La suite de tests est alimentée par le cadre pytest et les fichiers de test exécutables sont générés automatiquement dans un répertoire __tests__ avant le début de la session de test. Voir le conftest.py pour les détails de mise en œuvre.
# Install requirements
pip install -r binder/requirements.txt
# Run the tests (will generate the files automatically)
python -m pytest __tests__ Si l'exécution avec Docker make build , puis make pytest
├── binder
| └── requirements.txt # Python dependency requirements for Binder
├── chapters # chapters, grouped by language
| ├── en # English chapters, one Markdown file per language
| | └── slides # English slides, one Markdown file per presentation
| └── ... # other languages
├── exercises # code files, tests and assets for exercises
| ├── en # English exercises, solutions, tests and data
| └── ... # other languages
├── public # compiled site
├── src # Gatsby/React source, independent from content
├── static # static assets like images, available in slides/chapters
├── locale.json # translations of meta and UI text
├── meta.json # course metadata
└── theme.sass # UI theme colors and settings Les requirements.txt dans le référentiel définissent les packages installés lors de la construction avec Binder. Pour ce cours, j'utilise le référentiel source comme repo de liant, car il permet de tout garder en un seul endroit. Il permet également aux exercices de référence et de charge d'autres fichiers (par exemple JSON), qui seront copiés dans l'environnement Python. Je construis cependant le classeur à partir d'un binder de branche, que je met à jour uniquement si les fichiers pertinents en liant changent. Sinon, chaque mise à jour vers master déclencherait une reconstruction d'image.
Vous pouvez spécifier les paramètres de liant comme Repo, Branch et Kernel Type dans la section "juniper" du meta.json . Je recommanderais d'exécuter la toute première version via l'interface sur le site Web de liant, car cela vous donne un journal de construction détaillé et des commentaires sur le fait que tout fonctionnait comme prévu. Entrez votre URL du référentiel, cliquez sur "Lancer" et attendez qu'il installe les dépendances et créez l'image.

Les chapitres sont placés dans /chapters et sont des fichiers de démarque composés de composants <exercise> . Ils seront transformés en pages, par exemple /chapter1 . Dans leur bloc Frontmatter en haut du fichier, ils doivent spécifier type: chapter , ainsi que la méta suivante:
---
title : The chapter title
description : The chapter description
prev : /chapter1 # exact path to previous chapter or null to not show a link
next : /chapter3 # exact path to next chapter or null to not show a link
id : 2 # unique identifier for chapter
type : chapter # important: this creates a standalone page from the chapter
---
Les diapositives sont placées dans /slides et sont des fichiers de marque composés de contenu de diapositive, séparés par --- . Ils ont besoin de spécifier le bloc de matter suivant en haut du fichier:
---
type : slides
---
La première et dernière diapositive utilise une disposition spéciale et affichera le titre au centre de la diapositive. Des notes de haut-parleur (dans ce cas, le script) peut être ajouté à la fin d'une diapositive, préfixée par Notes: . Ils seront ensuite montrés sur la droite à côté des diapositives. Voici un exemple de fichier de diapositives:
---
type : slide
---
# Processing pipelines
Notes: This is a slide deck about processing pipelines.
---
# Next slide
- Some bullet points here
- And another bullet point
< img src = " /image.jpg " alt = " An image located in /static " />Lorsque vous utilisez des éléments personnalisés, assurez-vous de placer une nouvelle ligne entre les balises d'ouverture / clôture et les enfants. Sinon, le contenu Markdown ne peut pas être correctement rendu.
<exercise>Conteneur d'un seul exercice.
| Argument | Taper | Description |
|---|---|---|
id | numéro / chaîne | ID d'exercice unique dans le chapitre. |
title | chaîne | Titre de l'exercice. |
type | chaîne | Type facultatif. "slides" rend le conteneur plus large et ajoute une icône. |
| enfants | - | Le contenu de l'exercice. |
< exercise id = " 1 " title = " Introduction to spaCy " >
Content goes here...
</ exercise ><codeblock>| Argument | Taper | Description |
|---|---|---|
id | numéro / chaîne | Identifiant unique de l'exercice du code. |
source | chaîne | Nom du fichier source (sans extension de fichier). Par défaut, exc_${id} s'il n'est pas défini. |
solution | chaîne | Nom du fichier de solution (sans extension de fichier). solution_${id} si elle n'est pas définie. |
test | chaîne | Nom du fichier de test (sans extension de fichier). Par défaut test_${id} s'il n'est pas défini. |
| enfants | chaîne | Des conseils facultatifs affichés lorsque l'utilisateur clique sur "Afficher les conseils". |
< codeblock id = " 02_03 " >
This is a hint!
</ codeblock ><slides>Conteneur pour afficher les diapositives de manière interactive à l'aide de Reveal.js et d'un fichier de démarche-pied.
| Argument | Taper | Description |
|---|---|---|
source | chaîne | Nom du fichier de diapositives (sans extension de fichier). |
< slides source = " chapter1_01_introduction-to-spacy " >
</ slides ><choice>Conteneur pour une question à choix multiple.
| Argument | Taper | Description |
|---|---|---|
id | chaîne / numéro | ID unique en option. Peut être utilisé si plusieurs questions de choix sont présentes dans un seul exercice. |
| enfants | nœuds | Uniquement <opt> composants pour les options. |
< choice >
< opt text = " Option one " >You have selected option one! This is not good.</ opt >
< opt text = " Option two " correct = " true " >Yay! </ opt >
</ choice ><opt>Une option à choix multiple.
| Argument | Taper | Description |
|---|---|---|
text | chaîne | Le texte de l'option à afficher. Prend en charge HTML en ligne. |
correct | chaîne | "true" si l'option est la bonne réponse. |
| enfants | chaîne | Le texte à afficher si l'option est sélectionnée (expliquant pourquoi elle est correcte ou incorrecte). |