Comment utiliser les données de langage dans Python 3 à l’aide de la trousse à outils en langage naturel (NLTK)

introduction

La communication textuelle est devenue l'une des formes d'expression les plus courantes. Nous envoyons des courriels, des SMS, des tweet et mettons à jour nos statuts quotidiennement. En conséquence, les données textuelles non structurées sont devenues extrêmement courantes et l'analyse de grandes quantités de données textuelles est désormais un moyen essentiel de comprendre ce que les gens pensent.

Les tweets sur Twitter nous aident à trouver des sujets d'actualité dans le monde. Les avis sur Amazon aident les utilisateurs à acheter les produits les mieux notés. Ces exemples d'organisation et de structuration des connaissances représentent des tâches de traitement du langage naturel.

La PNL est un domaine de l'informatique qui met l'accent sur l'interaction entre les ordinateurs et les humains. Les techniques de la PNL sont utilisées pour analyser le texte, ce qui permet aux ordinateurs de comprendre le langage humain. Quelques exemples d'applications NLP incluent la synthèse automatique, la segmentation des sujets et l'analyse des sentiments.

Ce tutoriel fournira une introduction à l'utilisation desNatural Language Toolkit (NLTK): un outil NLP pour Python.

Conditions préalables

Pour ce didacticiel, vous devez avoir installé Python 3, ainsi qu’un environnement de programmation local configuré sur votre ordinateur. Si ce n'est pas le cas, vous pouvez vous installer en suivant lesappropriate installation and set up guide for your operating system.

Pour tirer le meilleur parti de ce didacticiel, vous devez vous familiariser avec lesPython programming language.

[[step-1 -—- importing-nltk]] == Étape 1 - Importation de NLTK

Avant de commencer à travailler en Python, vérifions que le module NLTK est installé. Sur la ligne de commande, recherchez NLTK en exécutant la commande suivante:

python -c "import nltk"

If NLTK is installed, cette commande se terminera sans erreur. Maintenant, vérifions que vous avez la dernière version installée:

python -c "import nltk; print(nltk.__version__)"

Vous devriez avoir la version 3.2.1 installée, car nous utiliserons le paquet Twitter de NLTK qui nécessite cette version.

If NLTK is not installed, vous recevrez un message d'erreur:

OutputTraceback (most recent call last): File "", line 1, in  ImportError: No module named 'nltk'

Le message d'erreur indique que NLTK n'est pas installé, téléchargez donc la bibliothèque à l'aide depip:

pip install nltk

Ensuite, nous allons télécharger les données et les outils NLTK avec lesquels nous allons travailler dans ce tutoriel.

[[step-2 -—- downloads-nltk-39-s-data-and-tagger]] == Étape 2 - Téléchargement des données et du tagger de NLTK

Dans ce tutoriel, nous allons utiliser un corpus Twitter que nous pouvons télécharger via NLTK. Plus précisément, nous travaillerons avec le corpustwitter_samples de NLTK. Téléchargeons le corpus via la ligne de commande, comme suit:

python -m nltk.downloader twitter_samples

Si la commande a été exécutée avec succès, vous devriez recevoir le résultat suivant:

Output[nltk_data] Downloading package twitter_samples to
[nltk_data]     /Users/sammy/nltk_data...
[nltk_data]   Unzipping corpora/twitter_samples.zip.

Ensuite, téléchargez le tagueur de partie de discours (POS). POS tagging est le processus d'étiquetage d'un mot dans un texte comme correspondant à une balise POS particulière: noms, verbes, adjectifs, adverbes, etc. Dans ce tutoriel, nous utiliserons spécifiquement lesaveraged_perceptron_tagger de NLTK. Le marqueur de perceptron moyen utilise l’algorithme de perceptron pour prédire quelle balise POS est la plus susceptible de recevoir le mot. Téléchargeons le tagger, comme ceci:

python -m nltk.downloader averaged_perceptron_tagger

Si la commande a été exécutée avec succès, vous devriez recevoir le résultat suivant:

Output[nltk_data] Downloading package averaged_perceptron_tagger to
[nltk_data]     /Users/sammy/nltk_data...
[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.

Vérifions que le corpus a été téléchargé correctement. Dans votre terminal, ouvrez l'environnement interactif Python:

python

Dans l'environnement interactif de Python, importez le corpustwitter_samples:

from nltk.corpus import twitter_samples

Le corpus Twitter de NLTK contient actuellement un échantillon de 20 000 tweets extraits de l’API Twitter Streaming. Les tweets complets sont stockés sous forme deJSON séparés par des lignes. Nous pouvons voir combien de fichiers JSON existent dans le corpus en utilisant la méthodetwitter_samples.fileids():

twitter_samples.fileids()

Notre sortie ressemblera à ceci:

Output[u'negative_tweets.json', u'positive_tweets.json', u'tweets.20150430-223406.json']

En utilisant ces ID de fichier, nous pouvons ensuite renvoyer le tweetstrings:

twitter_samples.strings('tweets.20150430-223406.json')

En cours d'exécution, vous obtiendrez beaucoup de résultats. Cela ressemblera généralement à ceci:

Output[u'RT @KirkKus: Indirect cost of the UK being in the EU is estimated to be costing Britain \xa3170 billion per year! #BetterOffOut #UKIP'...]

Nous savons maintenant que notre corpus a été téléchargé avec succès. Alors quittons l'environnement interactif Python avec le raccourcictrl +D.

Maintenant que nous avons accès au corpus detwitter_samples, nous pouvons commencer à écrire un script pour traiter les tweets.

Le but de notre script sera de compter combien d'adjectifs et de noms apparaissent dans le sous-ensemble positif du corpustwitter_samples:

  • Unnoun, dans sa définition la plus basique, est généralement défini comme une personne, un lieu ou une chose. Par exemple, unmovie, unbook et unburger sont tous des noms. Compter les noms peut aider à déterminer combien de sujets différents sont discutés.

  • Unadjective est un mot qui modifie un nom (ou un pronom), par exemple: un filmhorrible, un livrefunny ou un hamburgerdelicious. Les adjectifs de comptage peuvent déterminer le type de langage utilisé, c.-à-d. les opinions ont tendance à inclure plus d'adjectifs que de faits.

Vous pourrez ultérieurement étendre ce script pour compter les adjectifs positifs (great,awesome,happy, etc.) par rapport aux adjectifs négatifs (boring,lame,sad, etc.), qui pourrait être utilisé pour analyser le sentiment des tweets ou des critiques sur un produit ou un film, par exemple. Ce script fournit des données qui peuvent à leur tour informer les décisions relatives à ce produit ou à ce film.

Nous allons commencer notre script à la prochaine étape.

[[step-3 -—- tokenizing-phrases]] == Étape 3 - Tokenizing Sentences

Tout d'abord, dans l'éditeur de texte de votre choix, créez le script avec lequel nous allons travailler et appelez-lenlp.py.

Dans notre fichier, importons d’abord le corpus. Créons ensuite untweetsvariable et attribuons-lui leslist des chaînes de tweet du fichierpositive_tweets.json.

nlp.py

from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')

Lors du premier chargement de notre liste de tweets, chaque tweet est représenté par une chaîne. Avant que nous puissions déterminer quels mots dans nos tweets sont des adjectifs ou des noms, nous devons d’abord définir nos tweets.

Tokenization est l'acte de décomposer une séquence de chaînes en morceaux tels que des mots, des mots-clés, des phrases, des symboles et d'autres éléments, appeléstokens. Créons une nouvelle variable appeléetweets_tokens, à laquelle nous attribuerons la liste tokenisée de tweets:

nlp.py

from nltk.corpus import twitter_samples

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

Cette nouvelle variable,tweets_tokens, est une liste où chaque élément de la liste est une liste de jetons. Maintenant que nous avons les jetons de chaque tweet, nous pouvons les étiqueter avec les étiquettes POS appropriées.

[[step-4 -—- tagging-phrases]] == Étape 4 - Balisage des phrases

Pour accéder à l’étiqueteur de point de vente de NLTK, nous devons l’importer. Tous lesimport statements doivent aller au début du script. Mettons cette nouvelle importation sous notre autre déclaration d'importation.

nlp.py

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

Nous pouvons maintenant marquer chacun de nos jetons. NLTK nous permet de tout faire en même temps en utilisant:pos_tag_sents(). Nous allons créer une nouvelle variable+ tweets_tagged+, que nous utiliserons pour stocker nos listes balisées. Cette nouvelle ligne peut être placée directement à la fin de notre script actuel:

tweets_tagged = pos_tag_sents(tweets_tokens)

Pour avoir une idée de ce à quoi ressemblent les jetons marqués, voici à quoi ressemble le premier élément de notre liste tweets_tagged:

[(u'#FollowFriday', 'JJ'), (u'@France_Inte', 'NNP'), (u'@PKuchly57', 'NNP'), (u'@Milipol_Paris', 'NNP'), (u'for', 'IN'), (u'being', 'VBG'), (u'top', 'JJ'), (u'engaged', 'VBN'), (u'members', 'NNS'), (u'in', 'IN'), (u'my', 'PRP$'), (u'community', 'NN'), (u'this', 'DT'), (u'week', 'NN'), (u':)', 'NN')]

Nous pouvons voir que notre tweet est représenté sous forme de liste et que pour chaque jeton, nous avons des informations sur son tag POS. Chaque paire jeton / étiquette est enregistrée en tant quetuple.

En NLTK, l'abréviation deadjective estJJ.

Le marqueur NLTK marquesingular nouns (NN) avec des balises différentes deplural nouns (NNS). Pour simplifier, nous ne compterons que les noms singuliers en gardant une trace de la baliseNN.

Dans l'étape suivante, nous compterons le nombre de fois queJJ etNN apparaissent dans notre corpus.

[[step-5 -—- counting-pos-tags]] == Étape 5 - Comptage des tags POS

Nous garderons une trace du nombre de fois queJJ etNN apparaissent en utilisant une variable d'accumulateur (count), que nous ajouterons continuellement à chaque fois que nous trouverons une balise. Commençons par créer notre décompte au bas de notre script, que nous allons d’abord mettre à zéro.

nlp.py

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

JJ_count = 0
NN_count = 0

Après avoir créé les variables, nous allons créer deuxfor loops. Lesfirst loop parcourront chaque tweet de la liste. Lessecond loop vont parcourir chaque paire de jetons / balises dans chaque tweet. Pour chaque paire, nous rechercherons la balise en utilisant l'index de tuple approprié.

Nous vérifierons ensuite si la balise correspond à la chaîne'JJ' ou'NN' en utilisantconditional statements. Si l'étiquette correspond, nous ajouterons (+= 1) à l'accumulateur approprié.

nlp.py

from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

tweets = twitter_samples.strings('positive_tweets.json')
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

JJ_count = 0
NN_count = 0

for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

Une fois les deux boucles terminées, nous devrions avoir le nombre total d'adjectifs et de noms dans notre corpus. Pour voir combien d'adjectifs et de noms notre script a été trouvé, nous ajouterons des instructions d'impression à la fin du script.

nlp.py

...

for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

print('Total number of adjectives = ', JJ_count)
print('Total number of nouns = ', NN_count)

À ce stade, notre programme sera en mesure d'indiquer le nombre d'adjectifs et de noms trouvés dans le corpus.

[[step-6 -—- running-the-nlp-script]] == Étape 6 - Exécution du script NLP

Enregistrez votre fichiernlp.py et exécutez-le pour voir combien d'adjectifs et de noms nous trouvons:

python nlp.py

Soyez patient, l’exécution du script peut prendre quelques secondes. Si tout se passe bien, lorsque nous exécutons notre script, nous devrions obtenir le résultat suivant:

OutputTotal number of adjectives =  6094
Total number of nouns =  13180

Si votre résultat est identique, cela signifie que vous avez terminé ce didacticiel avec succès. Toutes nos félicitations!

Code terminé

Pour notre code fini, nous devrions ajouter quelques commentaires pour faciliter la tâche des autres et de notre avenir. Notre script ressemble à ceci:

nlp.py

# Import data and tagger
from nltk.corpus import twitter_samples
from nltk.tag import pos_tag_sents

# Load tokenized tweets
tweets_tokens = twitter_samples.tokenized('positive_tweets.json')

# Tag tagged tweets
tweets_tagged = pos_tag_sents(tweets_tokens)

# Set accumulators
JJ_count = 0
NN_count = 0

# Loop through list of tweets
for tweet in tweets_tagged:
    for pair in tweet:
        tag = pair[1]
        if tag == 'JJ':
            JJ_count += 1
        elif tag == 'NN':
            NN_count += 1

# Print total numbers for each adjectives and nouns
print('Total number of adjectives = ', JJ_count)
print('Total number of nouns = ', NN_count)

Nous avons utilisé le corpus Twitter téléchargé via NLTK dans ce tutoriel, mais vous pouvez lire vos propres données. Pour vous familiariser avec la lecture de fichiers en Python, consultez notre guide sur“How To Handle Plain Text Files in Python 3".

Vous voudrez peut-être aussi travailler avec de vraies données Twitter. Vous pouvez en savoir plus sur l'accès à l'API Twitter en lisant «https://www.digitalocean.com/community/tutorials/how-to-create-a-twitter-app[Comment créer une application Twitter]». Vous pouvez ensuite consulter notre guide sur“How To Create a Twitterbot with Python 3 and the Tweepy Library”, qui montre comment utiliser la bibliothèque Tweepy Python pour collecter des tweets qui incluent une certaine balise de hachage. Les données que vous collectez peuvent ensuite être analysées avec NLTK.

À partir de là, vous pouvez étendre le code pour compter les noms au pluriel et au singulier, faire une analyse des sentiments des adjectifs ou visualiser vos données avecPython and matplotlib.

Conclusion

Dans ce didacticiel, vous avez appris quelques techniques de traitement du langage naturel pour analyser du texte à l'aide de la bibliothèque NLTK en Python. Vous pouvez désormais télécharger des corpus, des tokenize, des balises et compter les balises POS en Python. Vous pouvez utiliser ce didacticiel pour faciliter le traitement de vos propres données texte en Python.