Table des matières

Text Processing and Machine Learning TAL

Définitions

Text processing

In computing, the term text processing refers to the theory and practice of automating the creation or manipulation of electronic text.

TAL

Le traitement automatique du langage naturel (abr. TALN), ou traitement automatique de la langue naturelle1, ou encore traitement automatique des langues (abr. TAL) est un domaine multidisciplinaire impliquant la linguistique, l'informatique et l'intelligence artificielle, qui vise à créer des outils de traitement de la langue naturelle pour diverses applications.

Ressources

En anglais, beaucoup de ressources, en particulier:

https://cocoon.huma-num.fr/exist/crdo

NLTK Natural Language Toolkit

NLTK is a leading platform for building Python programs to work with human language data.

Ressources

Installation

sudo pip3 install nltk
python3
import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('stopwords')
nltk.download('treebank')
nltk.download('maxent_ne_chunker')
nltk.download('words')

Analyse du corpus avec NLTK sur un text simple

Récupérération de textes et exploration du corpus

En général

Le corpus sera soit une liste, un dictionnaire, un set de string, récupéré dans une DB, dans du html, dans des fichiers … qu'il peut être nécessaire de nettoyer, arranger.

Exemple d'étape

nltk_example.py
#!/usr/bin/env python3.7
 
import nltk
from nltk.corpus import treebank
 
raw = """À Monseigneur Le Duc de Bourgogne
Prince, l’unique objet du soin des Immortels,
Souffrez que mon encens parfume vos Autels.
Je vous offre un peu tard ces présents de ma Muse ;
"""
 
# ### Récupération d'un texte
# Tokenize the text
tokens = nltk.wordpunct_tokenize(raw)
print(f'tokens:\n{tokens}')
 
# Je ne garde que du 2ème mot au 30ème
tokens =tokens[2:30]
print(f'Texte:\n{tokens}')
 
# ### Normalizing 1
# Création d'un NLTK Text
text = nltk.Text(tokens)
print(f'Texte:\n{text}')
# <Text: Bourgogne Prince , l ’ unique objet du...>
 
# Normalize the words
words = [w.lower() for w in text]
print(f'words: nombre={len(words)}\n{words}')
 
# Build vocabulary (les mots sans la ponctuation, apostrophe)
vocab = sorted(set(words))
print(f'vocab: nombre={len(vocab)}\n{vocab}')
 
# ### Normalizing 2
# Tous les mots sans exception
mots_brut = nltk.word_tokenize(raw)
print(f'\nTous les mots bruts = {mots_brut}\n')
print(f'\nNombre de mots brut = {len(mots_brut)}\n')
 
# Sans la ponctuation et apostrophes
tokenizer = nltk.RegexpTokenizer(r'\w+')
bons_mots = tokenizer.tokenize(raw.lower())
print(f'\nTous les bons mots = {bons_mots}\n')
print(f'\nNombre de bons mots = {len(bons_mots)}\n')
 
# Fréquence des mots, sans la ponctuation et apostrophes
tokenizer = nltk.RegexpTokenizer(r'\w+')
corpora = tokenizer.tokenize(raw.lower())
freq = nltk.FreqDist(corpora)
print(f'Fréquence des mots dans le désordre:')
for k, v in freq.items():
    print(f'    {k} {v}')
 
# ### Some simple things you can do with NLTK
tokens = nltk.word_tokenize(raw)
tagged = nltk.pos_tag(tokens)
print(f'tagged[0:6] = {tagged[0:6]}')
 
# Identify named entities
entities = nltk.chunk.ne_chunk(tagged)
print(f'entities = {entities}')
 
# Display a parse tree:
t = treebank.parsed_sents('wsj_0001.mrg')[0]
t.draw()
tokens:
['À', 'Monseigneur', 'Le', 'Duc', 'de', 'Bourgogne', 'Prince', ',', 'l', '’', 'unique', 'objet', 'du', 'soin', 'des', 'Immortels', ',', 'Souffrez', 'que', 'mon', 'encens', 'parfume', 'vos', 'Autels', '.', 'Je', 'vous', 'offre', 'un', 'peu', 'tard', 'ces', 'présents', 'de', 'ma', 'Muse', ';']
Texte:
['Le', 'Duc', 'de', 'Bourgogne', 'Prince', ',', 'l', '’', 'unique', 'objet', 'du', 'soin', 'des', 'Immortels', ',', 'Souffrez', 'que', 'mon', 'encens', 'parfume', 'vos', 'Autels', '.', 'Je', 'vous', 'offre', 'un', 'peu']
Texte:
<Text: Le Duc de Bourgogne Prince , l ’...>
words: nombre=28
['le', 'duc', 'de', 'bourgogne', 'prince', ',', 'l', '’', 'unique', 'objet', 'du', 'soin', 'des', 'immortels', ',', 'souffrez', 'que', 'mon', 'encens', 'parfume', 'vos', 'autels', '.', 'je', 'vous', 'offre', 'un', 'peu']
vocab: nombre=27
[',', '.', 'autels', 'bourgogne', 'de', 'des', 'du', 'duc', 'encens', 'immortels', 'je', 'l', 'le', 'mon', 'objet', 'offre', 'parfume', 'peu', 'prince', 'que', 'soin', 'souffrez', 'un', 'unique', 'vos', 'vous', '’']
 
Tous les mots bruts = ['À', 'Monseigneur', 'Le', 'Duc', 'de', 'Bourgogne', 'Prince', ',', 'l', '’', 'unique', 'objet', 'du', 'soin', 'des', 'Immortels', ',', 'Souffrez', 'que', 'mon', 'encens', 'parfume', 'vos', 'Autels', '.', 'Je', 'vous', 'offre', 'un', 'peu', 'tard', 'ces', 'présents', 'de', 'ma', 'Muse', ';']
Nombre de mots brut = 37
 
Tous les bons mots = ['à', 'monseigneur', 'le', 'duc', 'de', 'bourgogne', 'prince', 'l', 'unique', 'objet', 'du', 'soin', 'des', 'immortels', 'souffrez', 'que', 'mon', 'encens', 'parfume', 'vos', 'autels', 'je', 'vous', 'offre', 'un', 'peu', 'tard', 'ces', 'présents', 'de', 'ma', 'muse']
Nombre de bons mots = 32
 
Fréquence des mots dans le désordre:
    à 1
    monseigneur 1
    le 1
    duc 1
    de 2
    bourgogne 1
    prince 1
    l 1
etc ...
tagged[0:6] = [('À', 'JJ'), ('Monseigneur', 'NNP'), ('Le', 'NNP'), ('Duc', 'NNP'), ('de', 'IN'), ('Bourgogne', 'NNP')]
entities = (S
  À/JJ
  (ORGANIZATION Monseigneur/NNP Le/NNP Duc/NNP)
  de/IN
  (PERSON Bourgogne/NNP Prince/NNP)
  ,/,
  l/NN
  ’/NNP
  unique/NN
  objet/NN
  du/NN
  soin/NN
  des/NNS
  (PERSON Immortels/NNP)
  ,/,
  (GPE Souffrez/NNP)
  que/NN
  mon/NN
  encens/VBZ
  parfume/JJ
  vos/NN
  (PERSON Autels/NNP)
  ./.
  Je/NNP
  vous/JJ
  offre/NN
  un/JJ
  peu/NN
  tard/NN
  ces/VBZ
  présents/NNS
  de/IN
  ma/NN
  (ORGANIZATION Muse/NNP)
  ;/:)

Apprentissage avec des Fables de La Fontaine

TAL Traitement Automatique du Langage avec des Fables de La Fontaine