La troncature et la lemmatisation en Python
L'anglais moderne est considéré comme une langue faiblement infléchie. Cela signifie que de nombreux mots anglais sont dérivés d'un autre mot ; par exemple, le mot infléchi "normality" est dérivé du mot "norm", qui est la forme racine. Toutes les langues infléchies sont composées de mots ayant des racines communes, mais le degré d'inflexion varie en fonction de la langue.
"En morphologie linguistique, la flexion est un processus de formation des mots, dans lequel un mot est modifié pour exprimer différentes catégories grammaticales telles que le temps, le cas, la voix, l'aspect, la personne, le nombre, le genre, l'humeur, l'animalité et la définitude."
-(Source: Wikipedia)
Lorsque vous travaillez sur des textes, il est parfois nécessaire d'appliquer des techniques de normalisation pour retrouver la forme racine des mots à partir de leurs versions dérivées. Cela permet de réduire le caractère aléatoire et de rapprocher les mots du corpus de la norme prédéfinie, ce qui améliore l'efficacité du traitement puisque l'ordinateur a moins de caractéristiques à traiter.
Deux techniques de normalisation de texte populaires dans le domaine du traitement du langage naturel (NLP), l'application de techniques informatiques pour analyser et synthétiser le langage naturel et la parole, sont le stemming et la lemmatisation. Les chercheurs étudient ces techniques depuis des années ; les praticiens du NLP les utilisent généralement pour préparer des mots, des textes et des documents en vue d'un traitement ultérieur dans le cadre d'un certain nombre de tâches.
Ce tutoriel aborde les notions de stemming et de lemmatisation d'un point de vue pratique en utilisant le package Python Natural Language ToolKit (NLTK).
Consultez ce classeur DataLab pour avoir une vue d'ensemble de tout le code de ce tutoriel. Pour modifier et exécuter le code, créez une copie du classeur pour exécuter et modifier ce code.
Tige
Le stemming est une technique utilisée pour réduire un mot infléchi à son radical. Par exemple, les mots "programmation", "programmeur" et "programmes" peuvent tous être réduits à la racine commune du mot "programme". En d'autres termes, "programme" peut être utilisé comme synonyme des trois mots de flexion précédents.
Cette technique de traitement de texte est souvent utile pour traiter la rareté et/ou la normalisation du vocabulaire. Cela permet non seulement de réduire la redondance, car la plupart du temps le radical du mot et les mots infléchis ont la même signification, mais cela permet également aux modèles de NLP d'apprendre les liens entre les mots infléchis et leur radical, ce qui aide le modèle à comprendre leur utilisation dans des contextes similaires.
Les algorithmes de troncature fonctionnent en prenant une liste de préfixes et de suffixes fréquents dans les mots infléchis et en coupant la fin ou le début du mot. Cela peut parfois donner lieu à des mots qui ne sont pas de vrais mots ; nous pouvons donc affirmer que cette approche a certainement ses avantages, mais qu'elle n'est pas sans limites.
Les avantages du stemming
- Amélioration des performances du modèle : Le stemming réduit le nombre de mots uniques qui doivent être traités par un algorithme, ce qui peut améliorer ses performances. En outre, il peut également accélérer l'exécution de l'algorithme et le rendre plus efficace.
- Regroupement de mots similaires : Les mots ayant un sens similaire peuvent être regroupés, même s'ils ont des formes distinctes. Cette technique peut s'avérer utile dans des tâches telles que la classification de documents, lorsqu'il est important d'identifier des sujets ou des thèmes clés dans un document.
- Plus facile à analyser et à comprendre : Comme le stemming réduit généralement la taille du vocabulaire, il est beaucoup plus facile d'analyser, de comparer et de comprendre les textes. Ceci est utile dans des tâches telles que l'analyse des sentiments, où l'objectif est de déterminer le sentiment d'un document.
Inconvénients du stemming
- Sur-ensemencement / Faux positifs : Par exemple, l'algorithme Porter Stemmer réduit les mots "universal", "university" et "universe" au même radical. Bien qu'ils soient étymologiquement liés, leurs significations actuelles relèvent de domaines très différents. Les traiter comme des synonymes réduira leur pertinence dans les résultats de recherche.
- Sous-tissage / Faux négatifs : C'est le cas lorsqu'un algorithme de troncature réduit les mots infléchis à des troncs de mots différents, alors qu'ils devraient être identiques. Par exemple, l'algorithme Porter Stemmer ne réduit pas les mots "alumnus", "alumnae" et "alumni" au même radical, alors qu'ils devraient être traités comme des synonymes.
- Défis linguistiques : Plus la morphologie, l'orthographe et le codage des caractères de la langue cible sont compliqués, plus les stemmers sont difficiles à concevoir. Par exemple, un stemmer italien est plus compliqué qu'un stemmer anglais parce qu'il y a un plus grand nombre d'inflexions de verbes. Un moteur de recherche russe est encore plus complexe en raison du plus grand nombre de déclinaisons de noms.
Lemmatisation
La lemmatisation est une autre technique utilisée pour réduire les mots infléchis à leur racine. Il décrit le processus algorithmique d'identification du "lemme" (forme du dictionnaire) d'un mot infléchi en fonction de son sens.
Contrairement au stemming, la lemmatisation repose sur la détermination précise de la partie du discours et du sens d'un mot en fonction de son contexte. Cela signifie qu'il prend en considération l'emplacement du mot infléchi dans une phrase, ainsi que dans le contexte plus large entourant cette phrase, comme les phrases voisines ou même un document entier.
"La lemmatisation se réfère généralement à l'utilisation d'un vocabulaire et à l'analyse morphologique des mots, visant normalement à supprimer uniquement les terminaisons flexionnelles et à restituer la forme de base ou dictionnaire d'un mot, connue sous le nom de lemme.
- (Source : Standford NLP Group)
En d'autres termes, lemmatiser un document signifie généralement "faire les choses correctement", puisqu'il s'agit d'utiliser un vocabulaire et d'effectuer une analyse morphologique des mots pour ne supprimer que les terminaisons flexionnelles et restituer la forme de base ou dictionnaire d'un mot, connue sous le nom de "lemme". Par exemple, vous pouvez vous attendre à ce qu'un algorithme de lemmatisation fasse correspondre "runs", "running" et "ran" au lemme "run".
Avantages de la lemmatisation
- Précision : La lemmatisation ne se contente pas de couper des mots comme dans les algorithmes de troncature. L'analyse des mots est effectuée sur la base du POS du mot afin de prendre en compte le contexte lors de la production des lemmes. En outre, la lemmatisation permet de produire de véritables mots de dictionnaire.
Inconvénients de la lémmatisation
- Le temps est compté : Par rapport au stemming, la lemmatisation est un processus lent et fastidieux. En effet, la lemmatisation consiste à effectuer une analyse morphologique et à déduire le sens des mots à partir d'un dictionnaire.
Commencez à apprendre Python gratuitement
Introduction au traitement du langage naturel en Python
Exemples pratiques de troncature et de lemmatisation en Python avec NLTK
Vous avez maintenant une vue d'ensemble de la segmentation et de la lemmatisation. Dans cette section, nous allons mettre la main à la pâte et démontrer des exemples de ces deux techniques à l'aide de Python et d'une bibliothèque appelée NLTK.
Une brève introduction au paquetage NLTK de Python
Natural Language Tool Kit (NLTK) est une bibliothèque Python utilisée pour construire des programmes capables de traiter le langage naturel. La bibliothèque peut effectuer différentes opérations telles que la tokenisation, le stemming, la classification, l'analyse syntaxique, l'étiquetage, le raisonnement sémantique, l'analyse des sentiments, etc.
La dernière version est NLTK 3.8.1 et nécessite les versions 3.7, 3.8, 3.9, 3.10 ou 3.11 de Python, mais vous n'avez pas à vous en préoccuper puisqu'il est préinstallé dans le classeur DataLab - il vous suffit d'importer nltk et vous êtes prêt à partir.
Exemple de troncature en Python
L'un des algorithmes de troncature les plus populaires est appelé "Porter stemmer". Le troncatureur porter a été proposé pour la première fois par Martin Porter dans un article de 1980 intitulé "An algorithm for suffix stripping" (un algorithme pour l'élimination des suffixes). Ce document est devenu l'un des algorithmes les plus courants pour l'extraction de la racine en anglais.
Voyons comment cela fonctionne :
import nltk
from nltk.stem import PorterStemmer
nltk.download("punkt")
# Initialize Python porter stemmer
ps = PorterStemmer()
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in example_words:
print ("{0:20}{1:20}".format(word, ps.stem(word)))
"""
--Word-- --Stem--
program program
programming program
programer program
programs program
programmed program
"""
Il s'agit d'un exemple assez simple ; nous nous attendions à ces résultats de la part de notre troncature porter, comme mentionné dans la section "troncature" ci-dessus.
Prenons un exemple plus délicat :
import string
from nltk.tokenize import word_tokenize
example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
# Create tokens
word_tokens = word_tokenize(example_sentence_no_punct)
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in word_tokens:
print ("{0:20}{1:20}".format(word, ps.stem(word)))
"""
--Word-- --Stem--
Python python
programmers programm
often often
tend tend
like like
programming program
in in
python python
because becaus
its it
like like
english english
We we
call call
people peopl
who who
program program
in in
python python
pythonistas pythonista
"""
Vous pouvez voir ici que certains des mots produits ne font pas partie du dictionnaire anglais (par exemple, "becaus", "people" et "programm"). Un autre point à noter est que le contexte n'est pas pris en considération. Par exemple, "programmateurs" est un nom pluriel, mais il a été réduit à "programme", qui peut être un nom ou un verbe - en d'autres termes, les mots racines sont ambigus.
Exemple de lemmatisation en Python
La motivation des lemmatiseurs sensibles au contexte était d'améliorer les performances sur les mots non vus et ambigus. Dans notre exemple de lemmatisation, nous utiliserons un lemmatiseur populaire appelé WordNet lemmatizer.
Wordnet est une vaste base de données lexicales de la langue anglaise, gratuite et accessible au public, qui vise à établir des relations sémantiques structurées entre les mots.
Voyons ce qu'il en est :
from nltk.stem import WordNetLemmatizer
nltk.download("wordnet")
nltk.download("omw-1.4")
# Initialize wordnet lemmatizer
wnl = WordNetLemmatizer()
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in example_words:
print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word-- --Lemma--
program program
programming program
programer programer
programs program
programmed program
"""
Les mots d'entrée transmis à notre lemmatiseur resteront inchangés s'ils ne peuvent être trouvés dans WordNet. Cela signifie que le contexte doit être fourni, ce qui est fait en donnant la valeur du paramètre de partie de discours, pos, dans wordnet_lemmatizer.lemmatize.
Remarquez que le mot "programmer" n'a pas été réduit à "programmer" par notre lemmatiseur : c'est parce que nous avons demandé à notre lemmatiseur de ne traiter que les verbes.
Passons notre lemmatiseur à quelque chose de plus compliqué pour voir ce qu'il en est...
example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
word_tokens = word_tokenize(example_sentence_no_punct)
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in word_tokens:
print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word-- --Lemma--
Python Python
programmers programmers
often often
tend tend
like like
programming program
in in
python python
because because
its its
like like
english english
We We
call call
people people
who who
program program
in in
python python
pythonistas pythonistas
"""
Tous les mots retournés par l'algorithme de lemmatisation figurent dans le dictionnaire anglais - à l'exception de "pythonistas", qui est davantage un terme informel utilisé pour désigner les programmeurs Python.
Syntagme et lemmatisation
Vous avez vu comment mettre en œuvre ces deux techniques, mais comment se comparent-elles ?
Le stemming et la lemmatisation sont deux techniques de traitement de texte qui visent à réduire les mots infléchis à une racine de base commune. Malgré la corrélation de l'objectif général, les deux techniques ne sont pas identiques.
Les principales différences entre le stemming et la lemmatisation résident dans la manière dont chaque technique atteint l'objectif de réduire les mots fléchis à une racine de base commune.
Les algorithmes de racine tentent de trouver les racines de base communes de diverses flexions en coupant la fin ou le début du mot. Le chop est basé sur une liste de préfixes et de suffixes courants que l'on trouve généralement dans les mots fléchis. Cet acte non discriminatoire de découpage des mots peut parfois conduire à la découverte de mots significatifs, mais pas toujours.
D'autre part, les algorithmes de lemmatisation tentent de trouver des racines de base communes à partir de mots infléchis en effectuant une analyse morphologique. Pour réduire avec précision les flexions, un dictionnaire détaillé doit être conservé afin que l'algorithme puisse effectuer des recherches pour relier un mot flexionné à son lemme.
"Les deux peuvent également différer en ce sens que le stemming regroupe le plus souvent les mots liés à la dérivation, alors que la lemmatisation ne regroupe généralement que les différentes formes flexionnelles d'un lemme".
- Source : Stanford NLP, livre IR.
L'approche heuristique brute adoptée par les algorithmes de troncature signifie généralement qu'ils sont rapides et efficaces, mais pas toujours précis. En revanche, les algorithmes de lemmatisation sacrifient la vitesse et l'efficacité au profit de la précision, ce qui permet d'obtenir des racines de base significatives.
Par exemple, un algorithme d'extraction peut réduire "saw" à "s". Un algorithme de lemmatisation examinera si "saw" est un nom (l'outil manuel pour couper) ou un verbe (voir) en fonction du contexte dans lequel il est utilisé avant de décider de renvoyer un lemme - si c'est un nom, il renverra "saw", et si c'est un verbe, il renverra "see".
Ces points sont peut-être déjà assez clairs pour vous. Voici donc la question à un million de dollars : "Dois-je utiliser le stemming ou la lemmatisation pour le prétraitement du texte ?".
Comme la plupart des choses liées aux logiciels, cela dépend.
La rapidité et l'efficacité vous importent-elles ? Si c'est le cas, choisissez le stemming.
Le contexte est-il important pour votre application ? Si vous avez répondu "oui", utilisez la lemmatisation.
Le choix de la technique dépend entièrement de l'application sur laquelle vous travaillez et de vos objectifs pour le projet. Vous voudrez peut-être faire des expériences avec les deux techniques et comparer les résultats pour voir quelle approche a donné les résultats les plus conformes aux objectifs de votre projet.
Nous n'avons pas beaucoup abordé dans ce tutoriel la manière dont les algorithmes de lemmatisation sont créés, car il existe plusieurs bibliothèques (telles que SpaCy, NLTK, etc.) compatibles avec différentes langues. Cependant, si vous deviez créer votre propre lemmatiseur pour une langue non disponible (par exemple, l'akan), vous auriez besoin d'une bonne connaissance et d'une bonne compréhension de la langue cible pour construire un lemmatiseur. Les algorithmes d'extraction sont beaucoup plus faciles à construire pour de tels scénarios.
Récapitulation
En résumé, le stemming et la lemmatisation sont des techniques utilisées pour le traitement des textes dans le cadre du NLP. Ils visent tous deux à réduire les flexions à des mots racines de base communs, mais chacun adopte une approche différente. L'approche du stemming est beaucoup plus rapide que la lemmatisation, mais elle est plus grossière et peut occasionnellement conduire à des racines de base communes non significatives. Par ailleurs, la lemmatisation est beaucoup plus précise que le stemming en ce qui concerne la recherche de mots significatifs dans le dictionnaire, et elle tient compte du contexte.
En savoir plus sur Python et le traitement du langage naturel
cours
Introduction au traitement du langage naturel en Python
cours
Introduction à l'apprentissage profond en Python
cours