Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🚀 SpaCy – Le NLP "Industriel" en Python

Guide complet IDEO-Lab : Pipeline, Doc, Token, NER, Matcher & Vecteurs.

1.1 Facile

Vue d'ensemble

NLP "Industriel" (Production). Rapide (Cython), "Opinionated".

NLP Python Cython
1.2 Moyen

Pourquoi SpaCy ?

Production (vs NLTK) & Léger (vs Transformers). API simple.

Production Performance
1.3 Facile

Installation (pip)

pip install spacy (librairie) + spacy download (modèles).

pip spacy download
1.4 Facile

Les Modèles (Pipelines)

en_core_web_sm (small), _md (medium), _lg (large), _trf (Transformer).

Modèles _sm / _md / _lg
2.1 Moyen

Concept N°1 : nlp (Le Pipeline)

L'objet nlp (chargé via spacy.load()) est le pipeline.

spacy.load() Pipeline
2.2 Facile

Concept N°2 : Le Doc

Le conteneur (doc = nlp(text)). N'est PAS un string.

Doc Container
2.3 Facile

Concept N°3 : Token

Les objets dans le Doc (mots, ponctuation). Attributs riches.

Token .text
2.4 Facile

Concept N°4 : Span

Un "slice" (tranche) du Doc. doc[2:5]. (Les Entités sont des Spans).

Span Slice
3.1 Facile

Tokenization

Gère les exceptions ("U.S.", "c'est"). doc[i].

Tokenizer Exceptions
3.2 Moyen

POS Tagging (Grammaire)

token.pos_ (simple: 'VERB'), token.tag_ (détaillé: 'VBG').

POS .pos_
3.3 Moyen

Lemmatization

token.lemma_ ("running" -> "run"). (Racine du mot).

Lemma .lemma_
3.4 Moyen

NER (Named Entity Recognition)

doc.ents (PERSON, ORG, GPE). ent.label_.

NER doc.ents
4.1 Avancé

Dependency Parsing (Syntaxe)

token.head (parent), token.dep_ (relation, ex: 'nsubj').

Parsing .dep_
4.2 Moyen

Vecteurs & Similarité

(Modèles md/lg). doc1.similarity(doc2). (Word2Vec).

Vectors .similarity()
4.3 Avancé

Matcher (Rule-based)

Trouver des "patterns" (basés sur les Tokens, ex: {'LOWER': 'hello'}).

Matcher Rules
4.4 Moyen

PhraseMatcher (Texte)

Trouver des listes de mots (dictionnaires). Rapide.

PhraseMatcher Dictionary
5.1 Avancé

Pipeline (Custom)

nlp.add_pipe("mon_etape"). Modifier le pipeline.

add_pipe Custom
5.2 Facile

Vitrine (Qui l'utilise ?)

Hugging Face (Tokenizers), Entreprises Tech (Chatbots, Parsing).

Hugging Face Chatbots
5.3 Facile

Liens Utiles & Formation

spacy.io (Docs), course.spacy.io (Cours gratuit).

Documentation course.spacy.io
5.4 Facile

Cheat-sheet

Workflow (Load, nlp(text), doc.ents, token.pos_).

cheat Workflow
1.1 Vue d'ensemble : Le NLP "Industriel"
Qu'est-ce que SpaCy ?

SpaCy est une bibliothèque **Python** (avec des modules C/Cython) pour le **Natural Language Processing (NLP)**.

Elle est conçue pour être **rapide, efficace et prête pour la production**. On parle de NLP "Industriel".

Contrairement à NLTK (académique/flexible), SpaCy est **"opinionated"** (dogmatique) : elle fournit *une* seule (la meilleure/plus rapide) implémentation pour chaque tâche (ex: 1 Tagger, 1 Parser).

Diagramme : L'Écosystème NLP
+-------------------------+
| NLTK (Academic)         |
| (Recherche, Flexibilité) |
+-------------------------+
      | (Alternative)
      ▼
+-------------------------+
| SpaCy (Production)      |  <-- (Base/Tokenizer pour)
| (Vitesse, Efficacité)    |
+-------------------------+
      | (Alternative)
      ▼
+-------------------------+
| Hugging Face Transformers |
| (SOTA, Lourd, DL)       |
+-------------------------+
1.2 Pourquoi SpaCy ? (vs NLTK vs Transformers)

Le choix de l'outil NLP dépend de la tâche.

CritèreSpaCyNLTK (Legacy)Hugging Face Transformers
ObjectifProduction (API, Web apps)Éducation (Recherche, exploration)State-of-the-Art (SOTA) (Deep Learning)
PerformanceTrès rapide (Optimisé C/Cython)Lent (Python pur)Lourd (Nécessite PyTorch/TF, GPU)
Philosophie"Opinionated" (1 meilleur algo)Flexible (Accès à tous les algos)Flexible (basé sur DL)
Cas d'usageParsing, NER, Chatbots, Extraction.Apprentissage, prototypage d'algos.Traduction, Résumé, Question/Answering.
1.3 Installation & Modèles

L'installation se fait en deux étapes : 1. Installer la bibliothèque. 2. Télécharger les modèles (pipelines) entraînés.

1. Installer SpaCy
# (Recommandé: dans un venv)
pip install spacy
2. Télécharger les Modèles

Les modèles contiennent les "poids" (neurones) pour le Tagger, le NER, etc. (Voir 1.4 pour les tailles).

# (Ex: Télécharger le petit modèle anglais)
python -m spacy download en_core_web_sm

# (Ex: Télécharger le petit modèle français)
python -m spacy download fr_core_news_sm
3. Charger (en Python)
import spacy

# (Charge le modèle. C'est l'objet "pipeline")
nlp = spacy.load("en_core_web_sm")
1.4 Les Modèles (Pipelines)

Les modèles (ex: en_core_web_sm) sont des pipelines pré-entraînés. La convention de nommage est : [lang]_[type]_[genre]_[taille].

SuffixeTailleVecteurs (Word2Vec) ?Usage
_sm (small)~10-20 MBNon (Context-vectors)Dev, Test, NER/POS basique.
_md (medium)~40-90 MBOui (Inclus)Standard. (Permet .similarity()).
_lg (large)~500-700 MBOui (Plus grands)Meilleure précision, similarité.
_trf (transformer)~400+ MBNon (Contextuel/BERT)State-of-the-art (SOTA), mais plus lent.
# (Français, Core (Général), News, Medium)
nlp_fr = spacy.load("fr_core_news_md")

# (Anglais, Core (Général), Web, Transformer)
nlp_en_trf = spacy.load("en_core_web_trf")
2.1 Concept N°1 : Le Pipeline nlp

L'objet nlp (chargé via spacy.load()) n'est pas "juste" un modèle, c'est un **pipeline** (une chaîne) de composants de traitement.

Quand vous appelez doc = nlp(text), le texte traverse ce pipeline.

Diagramme (Pipeline _sm typique)
(Votre texte: "Apple is looking...")
      |
      ▼
+-------------------------+
| nlp("...")              |
+-------------------------+
      |
      ▼
+-------------------------+
| 1. tokenizer            | (Sépare en Tokens: "Apple", "is", ...)
+-------------------------+
      |
      ▼
+-------------------------+
| 2. tagger               | (POS Tagging: PROPN, VERB, ...)
+-------------------------+
      |
      ▼
+-------------------------+
| 3. parser               | (Dependency Parsing: nsubj, aux, ...)
+-------------------------+
      |
      ▼
+-------------------------+
| 4. ner                  | (Named Entity: "Apple" -> ORG)
+-------------------------+
      |
      ▼
+-------------------------+
| (Autres: lemmatizer...) |
+-------------------------+
      |
      ▼
(Votre objet "Doc")
2.2 Concept N°2 : Le Doc

L'objet Doc est le conteneur central de SpaCy. Il est retourné par nlp(text).

Un Doc n'est **PAS** un string. C'est un objet (type Séquence) qui contient les Tokens et toutes leurs annotations (POS, NER, ...).

nlp = spacy.load("en_core_web_sm")
text = "Apple is looking at buying U.K. startup for $1 billion."

# (Le pipeline tourne ici)
doc = nlp(text)

# 1. Itérer sur les Tokens
for token in doc:
    print(token.text)
    
# 2. Accéder aux Entités (NER)
for ent in doc.ents:
    print(ent.text, ent.label_)

# 3. Accéder aux Phrases
for sent in doc.sents:
    print(sent.text)
2.3 Concept N°3 : Le Token

Le Token est l'objet qui représente un mot, un signe de ponctuation, etc. C'est là que se trouvent 90% des informations.

Attributs (Note : Le _ (ex: .lemma_) signifie que l'attribut est un "hash" (entier) et que SpaCy retourne le string (lookup).

AttributDescriptionExemple (pour "running")
.textTexte (String) verbatim."running"
.lemma_Lemme (base) du mot. (Voir 3.3)"run"
.pos_POS Tag (Simple, UDS). (Voir 3.2)"VERB"
.tag_POS Tag (Détaillé, Treebank). (Voir 3.2)"VBG"
.dep_Dépendance syntaxique. (Voir 4.1)"nsubj" (sujet)
.headLe "parent" syntaxique (Token). (Voir 4.1)(ex: Token(is))
.is_alphaBool: Est-ce alphabétique ?True
.is_stopBool: Est-ce un "stop word" (mot vide) ?False
.is_punctBool: Est-ce une ponctuation ?False
2.4 Concept N°4 : Le Span

Un Span est un "slice" (une tranche) d'un Doc (une vue sur un ou plusieurs Tokens). C'est plus efficace qu'une liste de tokens.

doc.ents (Entités) et doc.sents (Phrases) sont des générateurs de Spans.

doc = nlp("Apple is looking at buying U.K. startup.")

// 1. Span manuel (slice du Doc)
span = doc[2:5] // "looking at buying"
print(span.text)

// 2. Spans (via .ents)
for ent in doc.ents:
    // (ent est un objet Span)
    print(ent.text, ent.label_)
// Apple ORG
// U.K. GPE

// 3. Spans (via .sents)
for sent in doc.sents:
    print(sent.text)
3.1 Tokenization

La tokenization (étape 1 du pipeline) est la séparation du texte en Tokens. C'est plus complexe qu'un simple .split(' ').

SpaCy utilise des règles (spécifiques à la langue) pour gérer les exceptions (ponctuation, abréviations, contractions...).

// Python simple (Mauvais)
text = "It's $10. U.S.A."
print(text.split(' '))
// ['It's', '$10.', 'U.S.A.'] (3 tokens)

// SpaCy (Correct)
doc = nlp(text)
print([token.text for token in doc])
// ['It', "'s", '$', '10', '.', 'U.S.A.'] (6 tokens)
3.2 POS Tagging (Analyse Grammaticale)

Le Part-of-Speech Tagging assigne un rôle grammatical (Verbe, Nom, Adjectif...) à chaque Token.

  • token.pos_ : Tag simple (Universal Dependencies).
  • token.tag_ : Tag détaillé (Spécifique au modèle, ex: Penn Treebank).
doc = nlp("She is running fast.")

// (text, lemma, pos_, tag_)
for token in doc:
    print(f"{token.text:<10} {token.lemma_:<10} {token.pos_:<10} {token.tag_:<10}")

// (Output:)
// She        she        PRON       PRP
// is         be         AUX        VBZ
// running    run        VERB       VBG  (<- tag_ est plus précis)
// fast       fast       ADV        RB
// .          .          PUNCT      .
3.3 Lemmatization

La Lemmatization réduit un mot à sa "racine" (lemme), en utilisant le contexte grammatical (POS).

(C'est plus "intelligent" que le **Stemming** (ex: PorterStemmer), qui coupe juste la fin des mots (ex: "running" -> "runn")).

doc = nlp("I saw two mice. He is running.")

for token in doc:
    print(f"{token.text} -> {token.lemma_}")

// (Output:)
// I -> I
// saw -> see (Utilise le contexte VERB)
// two -> two
// mice -> mouse (Utilise le dictionnaire)
// . -> .
// He -> he
// is -> be
// running -> run
// . -> .
3.4 NER (Named Entity Recognition)

Le NER est un des cas d'usage majeurs. Il extrait les "Entités Nommées" (Personnes, Lieux, Organisations...) du texte.

Les entités sont accessibles via doc.ents (ce sont des Spans).

text = "Apple is looking at buying U.K. startup (DeepMind) for $1 billion."
doc = nlp(text)

for ent in doc.ents:
    print(f"Texte: {ent.text:<10} | Label: {ent.label_:<8} | Start: {ent.start_char:<3} | End: {ent.end_char:<3}")

// (Output:)
// Texte: Apple      | Label: ORG      | Start: 0   | End: 5
// Texte: U.K.       | Label: GPE      | Start: 27  | End: 31
// Texte: DeepMind   | Label: ORG      | Start: 41  | End: 49
// Texte: $1 billion | Label: MONEY    | Start: 55  | End: 65

// (Visualisation rapide dans Jupyter/Notebook)
from spacy import displacy
displacy.render(doc, style="ent")
4.1 Dependency Parsing (Analyse Syntaxique)

Le "Parser" (analyseur syntaxique) établit les relations grammaticales entre les mots. (Ex: Quel est le sujet du verbe ?).

  • token.head : Le "parent" (le Token dont ce mot dépend).
  • token.dep_ : Le type de relation (ex: nsubj (sujet nominal), dobj (objet direct)).
Diagramme (Texte)
doc = nlp("I saw a cat.")

// (Texte, Dépendance, Parent)
for token in doc:
    print(f"{token.text:<10} {token.dep_:<8} {token.head.text:<10}")
    
// (Output:)
// I          nsubj    saw
// saw        ROOT     saw
// a          det      cat
// cat        dobj     saw
// .          punct    saw

// (Diagramme :)
//   (saw) <-- (I) [nsubj]
//     |
//   (saw) --> (cat) [dobj]
//               |
//             (cat) <-- (a) [det]
4.2 Vecteurs & Similarité

Les modèles _md (medium) et _lg (large) incluent des **Word Vectors** (ex: Word2Vec).

SpaCy utilise ces vecteurs (des ndarray NumPy) pour calculer la **similarité sémantique** (similarité cosinus).

// (IMPORTANT: Charger un modèle MD ou LG)
nlp = spacy.load("en_core_web_md")

doc1 = nlp("The cat eats fish.")
doc2 = nlp("My dog likes meat.")
doc3 = nlp("I play guitar.")

// 1. Similarité (Doc vs Doc)
// (Moyenne des vecteurs des mots)
print(doc1.similarity(doc2)) // (Haut, ex: ~0.8)
print(doc1.similarity(doc3)) // (Bas, ex: ~0.3)

// 2. Similarité (Token vs Token)
token_cat = doc1[1]  // "cat"
token_dog = doc2[1]  // "dog"
print(token_cat.similarity(token_dog)) // (Haut, ex: ~0.85)

// 3. Accéder au Vecteur (NumPy array)
print(token_cat.vector.shape) // (300,)
4.3 Matcher (Rule-based)

Le Matcher (basé sur les règles) est plus puissant qu'un Regex. Il permet de trouver des "patterns" (motifs) basés sur les **attributs des Tokens** (LOWER, POS, IS_PUNCT...).

from spacy.matcher import Matcher

nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab) // (Initialiser avec le vocabulaire)

// 1. Définir le "pattern" (motif)
// (Ex: "Hello", suivi d'une virgule (optionnelle),
// suivi d'un Nom Propre (PROPN))
pattern = [
    {'LOWER': 'hello'},
    {'IS_PUNCT': True, 'OP': '?'}, // ('OP': '?' = optionnel)
    {'POS': 'PROPN'}
]

// 2. Ajouter le pattern au Matcher
matcher.add("GREETING_PATTERN", [pattern])

// 3. Appliquer
doc = nlp("I said: Hello, Bob! and Hello Alice.")
matches = matcher(doc)

// 4. Résultats
for match_id, start, end in matches:
    span = doc[start:end] // (C'est un Span)
    print(span.text)

// (Output:)
// Hello, Bob
// Hello Alice
4.4 PhraseMatcher (Dictionnaire)

Pour trouver des listes (dictionnaires) de mots/phrases exactes. C'est beaucoup plus rapide que le Matcher si vous n'avez pas besoin d'attributs (POS, etc.).

from spacy.matcher import PhraseMatcher

nlp = spacy.load("en_core_web_sm")
matcher = PhraseMatcher(nlp.vocab)

// 1. Définir les termes (le dictionnaire)
// (Doivent être des objets 'Doc')
terms = ["Elon Musk", "Tesla", "SpaceX"]
patterns = [nlp(text) for text in terms]

// 2. Ajouter les patterns
matcher.add("TECH_COMPANIES", patterns)

// 3. Appliquer
doc = nlp("Elon Musk is the CEO of Tesla and SpaceX.")
matches = matcher(doc)

for match_id, start, end in matches:
    span = doc[start:end]
    print(span.text)

// (Output:)
// Elon Musk
// Tesla
// SpaceX
5.1 Pipeline (Custom Components)

On peut (et on doit) modifier le pipeline pour l'optimiser (ex: désactiver le ner si inutile) ou pour ajouter nos propres étapes (ex: un classifieur de sentiment).

1. Désactiver (Pour la vitesse)
// (Ex: On ne veut que la Tokenization + Lemmatization)
nlp = spacy.load(
    "en_core_web_sm",
    disable=["parser", "ner"] // (Désactive ces étapes)
)

// (Liste des étapes actives)
print(nlp.pipe_names) // ['tok2vec', 'tagger', 'attribute_ruler', 'lemmatizer']
2. Ajouter (Custom)
// (Une fonction simple qui prend le 'doc')
@spacy.Language.factory("mon_composant")
def mon_composant_func(nlp, name):
    def process_doc(doc):
        print(f"Doc a {len(doc)} tokens.")
        return doc
    return process_doc

// (Ajouter à la fin du pipeline)
nlp.add_pipe("mon_composant", last=True)
// (ou first=True, or before="ner", after="tagger")

doc = nlp("Test.") // (Affiche: "Doc a 2 tokens.")
5.2 Vitrine (Qui utilise SpaCy ?)

SpaCy est le standard "de facto" pour le NLP en production (hors SOTA Transformers).

Entreprise / ProjetCas d'usage
Hugging Face 🤗Utilise (ou intègre) souvent le tokenizer de SpaCy comme "tokenizer pré-processing" rapide avant leurs modèles Transformers.
Entreprises Tech (Chatbots)Utilisé pour le "Intent Recognition" (Matcher) et l'extraction d'entités (NER) dans les chatbots (ex: Rasa).
Analyse Média / FinanceParsing de millions d'articles (News) pour extraire (NER) les noms d'entreprises (ORG), les personnes (PERSON) et les lieux (GPE).
Analyse de CV (HR Tech)Utilise le Matcher et le NER pour extraire les compétences, les diplômes et les entreprises (parsing de PDF/Docx).
5.4 Cheat-sheet (Workflow)
1. Setup
import spacy
from spacy.matcher import Matcher

# 1. Charger le pipeline
nlp = spacy.load("en_core_web_sm")
2. Traiter
text = "Apple Inc. (Steve Jobs) is a U.S. company."
doc = nlp(text)
3. Extraire (Token & Entités)
// A. Itérer sur les Tokens
for token in doc:
    print(
        f"{token.text:<10} | "
        f"{token.lemma_:<10} | "
        f"{token.pos_:<6} | "
        f"{token.is_stop}"
    )
// (Ex: Apple | Apple | PROPN | False)

// B. Extraire les Entités (NER)
for ent in doc.ents:
    print(
        f"{ent.text:<15} | "
        f"{ent.label_}"
    )
// (Ex: Apple Inc. | ORG)
// (Ex: Steve Jobs | PERSON)
// (Ex: U.S. | GPE)
4. Matcher (Règles)
matcher = Matcher(nlp.vocab)
pattern = [{'TEXT': 'Apple'}, {'IS_PUNCT': True, 'OP': '?'}]
matcher.add("APPLE_PATTERN", [pattern])
matches = matcher(doc)