title | description | prev | next | type | id |
---|---|---|---|---|---|
Chapitre 3 : Traitements de textes en pipelines |
Ce chapitre va te montrer tout ce qu'il y a à savoir à propos du pipeline de traitement de spaCy. Tu va apprendre ce qui se passe en coulisses quand tu traites un texte, comment écrire tes propres composants et les ajouter au pipeline, et comment utiliser des attributs personnalisés et ajouter tes propres métadonnées aux documents, aux spans et aux tokens. |
/chapter2 |
/chapter4 |
chapter |
3 |
Que fait spaCy quand tu appelles nlp
sur une chaîne de caractères ?
doc = nlp("Ceci est une phrase.")
Le tokenizer est toujours exécuté avant tous les autres composants du
pipeline, parce qu'il transforme une chaîne de caractères en objet Doc
. De
plus, le pipeline ne doit pas nécessairement inclure le tagger, le parser et
l'entity recognizer.
Le tokenizer transforme une chaîne de caractères en un objet Doc
. spaCy
applique ensuite chaque composant du pipeline, dans l'ordre.
spaCy calcule tout sur ta machine et n'a pas besoin de se connecter à un quelconque serveur.
Quand tu appelles spacy.load()
pour charger un pipeline, spaCy va initialiser la
langue, ajouter le pipeline et charger le modèle de poids binaires. Quand tu
appelles l'objet nlp
sur un texte, le pipeline est déjà chargé.
Inspectons le petit pipeline français !
- Charge le pipeline
fr_core_news_sm
et crée l'objetnlp
. - Affiche les noms des composants du pipeline avec
nlp.pipe_names
. - Affiche le pipeline complet de tuples
(name, component)
avecnlp.pipeline
.
La liste des noms des composants est accessible via l'attribut nlp.pipe_names
.
Le pipeline complet composé de tuples (name, component)
est accessible avec
nlp.pipeline
.
Lesquels de ces problèmes peuvent être résolus avec des composants de pipeline personnalisés. Choisis les combinaisons de réponses pertinentes !
- Actualisation des pipelines pré-entrainés pour améliorer leurs prédictions
- Calcul de nos propres valeurs basées sur les tokens et leurs attributs
- Ajout d'entités nommées, par exemple basées sur un dictionnaire
- Implémentation du support d'une langue supplémentaire
Les composants personnalisés peuvent seulement modifier le Doc
et ne peuvent
pas être utilisés pour actualiser directement les poids binaires ou d'autres
composants.
Les composants personnalisés peuvent seulement modifier le Doc
et ne peuvent
pas être utilisés pour actualiser directement les poids binaires ou d'autres
composants.
Les composants personnalisés peuvent seulement modifier le Doc
et ne peuvent
pas être utilisés pour actualiser directement les poids binaires ou d'autres
composants. De plus ils sont ajoutés au pipeline après l'initialisation de la
classe de langue et la tokenisation, donc ils ne peuvent pas servir à ajouter
des langues supplémentaires.
Les composants personnalisés sont fantastiques pour ajouter des valeurs
personnalisées aux documents, aux tokens et aux spans, ainsi que pour
personnaliser les doc.ents
.
Les composants personnalisés sont ajoutés au pipeline après l'initialisation de la classe de langue et la tokenisation, donc ils ne peuvent pas servir à ajouter des langues supplémentaires.
Les composants personnalisés sont ajoutés au pipeline après l'initialisation de la classe de langue et la tokenisation, donc ils ne peuvent pas servir à ajouter des langues supplémentaires.
L'exemple montre un composant personnalisé qui affiche la longueur des tokens d'un document. Peux-tu le compléter ?
- Complète la fonction du composant avec la longueur du
doc
. - Ajoute
"length_component"
au pipeline existant en tant que premier composant. - Essaie le nouveau pipeline en traitant un texte quelconque avec l'objet
nlp
– par exemple "Ceci est une phrase.".
- Pour obtenir la longueur d'un objet
Doc
, tu peux appeler la fonction nativelen()
dessus. - Utilise la méthode
nlp.add_pipe
pour ajouter le composant au pipeline. N'oublie pas d'utiliser le nom du composant sous forme de chaîne et de mettre l'argument nomméfirst
àTrue
pour t'assurer qu'il sera ajouté avant tous les autres composants. - Pour traiter un texte, appelle l'objet
nlp
avec le texte en argument.
Dans cet exercice, tu vas écrire un composant personnalisé qui utilise le
PhraseMatcher
pour trouver des noms d'animaux dans le document et ajouter les
spans correspondants à doc.ents
. Un PhraseMatcher
avec les motifs des
animaux a déjà été créé sous le nom de variable matcher
.
- Définis le composant personnalisé et applique le
matcher
audoc
. - Crée un
Span
pour chaque correspondance, assigne-lui l'ID de label pour"ANIMAL"
et actualise ledoc.ents
avec les nouveaux spans. - Ajoute le nouveau composant au pipeline après le composant
"ner"
. - Traite le texte puis affiche le texte et le label des entités figurant dans
doc.ents
.
- Rappelle-toi que les correspondances sont constituées d'une liste de tuples
(match_id, start, end)
. - La classe
Span
prend 4 arguments : ledoc
parent, l'indice de début, l'indice de fin et le label. - Pour ajouter un composant après un autre, utilise l'argument nommé
after
dansnlp.add_pipe
. N'oublie pas d'utiliser le nom du composant sous forme de chaîne pour l'ajouter.
Pratiquons l'extension d'attributs.
- Utilise
Token.set_extension
pour déclarer"is_country"
(valeur par défautFalse
). - Mets-le à jour pour
"Suisse"
et affiche-le pour tous les tokens.
Rappelle-toi que les attributs étendus sont accessible via la propriété ._
.
Par exemple, doc._.has_color
.
- Utilise
Token.set_extension
pour déclarer"reversed"
(la fonction getterget_reversed
). - Affiche sa valeur pour chaque token.
Rappelle-toi que les attributs étendus sont accessible via la propriété ._
.
Par exemple, doc._.has_color
.
Essayons de définir des attributs plus complexes en utilisant des getters et des extensions de méthodes.
- Complète la fonction
get_has_number
. - Utilise
Doc.set_extension
pour déclarer"has_number"
(getterget_has_number
) et affiche sa valeur.
- Rappelle-toi que les attributs étendus sont accessibles via la propriété
._
. Par exemple,doc._.has_color
. - La fonction
get_has_number
devrait indiquer si au moins l'un des tokens dudoc
retourneTrue
pourtoken.like_num
(qui indique si le token ressemble à un nombre).
- Utilise
Span.set_extension
pour déclarer"to_html"
(méthodeto_html
). - Appelle-là sur
doc[0:2]
avec la balise"strong"
.
- Les méthodes étendues peuvent accepter un ou plusieurs arguments. Par exemple
:
doc._.some_method("argument")
. - Le premier argument passé à la méthode est toujours le
Doc
, leToken
ou leSpan
sur lequel la méthode a été appelée.
Dans cet exercice, tu vas combiner l'extension d'attributs personnalisés avec les prédictions statistiques et créer un accesseur d'attribut qui retourne une URL de recherche Wikipédia si le span est une personne, une organisation ou un lieu.
- Complète le getter
get_wikipedia_url
pour qu'il retourne une URL uniquement si le label du span est dans la liste des labels. - Définis l'extension de
Span
nommée"wikipedia_url"
avec le getterget_wikipedia_url
. - Itère sur les entités du
doc
et affiche leur URL Wikipédia.
- Pour obtenir le label textuel d'un span, utilise l'attribut
span.label_
. C'est le label prédit par l'entity recognizer si le span constitue une entité. - Rappelle-toi que les attributs étendus sont accessibles via la propriété
._
. Par exemple,doc._.has_color
.
Les extensions d'attributs sont particulièrement puissantes quand elles sont combinées avec des composants de pipeline personnalisés. Dans cet exercice, tu vas écrire un composant de pipeline qui trouve des noms de pays et une extension personnalisée qui retourne le nom de la capitale du pays, s'il est disponible.
Un matcher de phrases avec tous les pays est proposé via la variable matcher
.
Un dictionnaire des pays avec leurs capitales en correspondance est proposé via
la variable CAPITALS
.
- Complète le composant
countries_component_function
et crée unSpan
avec le label"GPE"
(entité géopolitique) pour toutes les correspondances. - Ajoute le composant au pipeline.
- Déclare l'extension d'attribut Span nommée
"capital"
avec le getterget_capital
. - Traite le texte et affiche le texte de l'entité, le label de l'entité, et la
capitale de l'entité pour chaque span d'entité de
doc.ents
.
- La classe
Span
requiert quatre arguments : ledoc
, les indices de tokenstart
etend
du span et lelabel
. - L'appel du
PhraseMatcher
sur undoc
retourne une liste de tuples(match_id, start, end)
. - Pour déclarer un nouvel attribut étendu, utilise la méthode
set_extension
sur la classe globale, c'est-à-direDoc
,Token
ouSpan
. Pour définir un getter, utilise l'argument nommégetter
. - Rappelle-toi que les attributs étendus sont accessibles via la propriété
._.
. Par exemple,doc._.has_color
.
Dans cet exercice, tu vas utiliser nlp.pipe
pour un traitement plus efficace
du texte. L'objet nlp
a déjà été créé pour toi. Une liste de tweets à propos
d'une chaîne américaine connue de fast-food est disponible via la variable
nommée TEXTS
.
- Réécris l'exemple pour utiliser
nlp.pipe
. Au lieu d'itérer sur les textes et de les traiter, itère sur les objetsdoc
générés parnlp.pipe
.
- L'utilisation de
nlp.pipe
te permet de fusionner les deux premières lignes de code en une seule. nlp.pipe
prendTEXTS
en argument et génère des objetsdoc
sur lesquels tu peux boucler.
- Réécris l'exemple pour utiliser
nlp.pipe
. N'oublie pas d'appelerlist()
sur le résultat pour le transformer en liste.
- Réécris l'exemple pour utiliser
nlp.pipe
. N'oublie pas d'appelerlist()
sur le résultat pour le transformer en liste.
Dans cet exercice, tu vas utiliser des attributs personnalisés pour ajouter aux citations des métadonnées sur l'auteur et le livre correspondants.
Une liste d'exemples sous la forme [text, context]
est disponible via la
variable DATA
. Les textes sont des citations de livres célèbres, et les
contextes sont des dictionnaires avec pour clés "author"
et "book"
.
- Utilise la méthode
set_extension
pour déclarer les attributs personnalisés"author"
et"book"
sur leDoc
, avecNone
comme valeur par défaut. - Traite les paires
[text, context]
contenues dansDATA
en utilisantnlp.pipe
avecas_tuples=True
. - Actualise
doc._.book
etdoc._.author
avec les valeurs respectives d'informations obtenues avec le contexte.
- La méthode
Doc.set_extension
prend deux arguments : le nom de l'attribut sous forme de chaîne, et un argument nommé indiquant la valeur par défaut, le getter, le setter, ou la méthode. Par exemple,default=True
. - Quand
as_tuples
est mis àTrue
, la méthodenlp.pipe
prend en argument une liste de tuples(text, context)
et génère des tuples(doc, context)
.
Dans cet exercice, tu vas utiliser les méthodes nlp.make_doc
et
nlp.select_pipes
pour appliquer uniquement les composants sélectionnés lors
du traitement d'un texte.
- Réécris le code en utilisant
nlp.make_doc
pour uniquement tokeniser le texte.
La méthode nlp.make_doc
peut être appelée sur un texte et retourne un Doc
,
exactement comme l'objet nlp
.
- Désactive le parser et le lemmatizer en utilisant la méthode
nlp.select_pipes
. - Traite le texte et affiche toutes les entités contenues dans le
doc
.
La méthode nlp.select_pipes
accepte les arguments nommés enable
et
disable
qui prennent une liste de noms de composants à activer ou à
désactiver. Par exemple, nlp.select_pipes(disable="ner")
désactivera le named
entity recognizer.