Teaching - TAL

Page principale de l'UE


Traitement Automatique de la Langue

Prenons un exemple:

doc = 'Le chat est devant la maison, 9 rue du zoo. Le chien attend à l\'intérieur.\nSon site web préféré est www.spa.fr'
print(doc)

Ce qui provoque la sortie:

  Le chat est devant la maison, 9 rue du zoo. Le chien attend à l'intérieur.
  Son site web préféré est www.spa.fr

Afin de simplifier le dictionnaire (dans l'étape suivante du processus), nous proposons d'éliminer:

  • la ponctuation
  • les majuscules
  • les chiffres
  • ...

Remplacement par table

Matching & remplacement, 1 caractère pour 1 caractère

import string

punc = string.punctuation  # recupération de la ponctuation
print(punc)
doc = doc.translate(str.maketrans(punc, ' ' * len(punc)))  # elimination
print(doc)

Affichage de la ponctuation:

  !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Affichage de la chaine modifiée:

  Le chat est devant la maison  9 rue du zoo  Le chien attend à l intérieur 
  Son site web préféré est www spa fr

Pour supprimer, en plus, les tabulations et retours à la ligne:

punc = string.punctuation  # recupération de la ponctuation
punc += '\n\r\t'
doc = doc.translate(str.maketrans(punc, ' ' * len(punc)))  # elimination des accents
print(doc)

Sortie:

  Le chat est devant la maison  9 rue du zoo  Le chien attend à l intérieur  Son site web préféré est www spa fr toto

Normalisation du texte, élimination des accents

import unicodedata

doc = unicodedata.normalize('NFD', doc).encode('ascii', 'ignore')
print(doc)

Sortie:

  b'Le chat est devant la maison  9 rue du zoo  Le chien attend a l interieur \nSon site web prefere est www spa fr'

Attention, ça vaut le coup de rester dans le domaine des chaines de caractères (et non des bytes chain); dans ce cas, il faut reconvertir la sortie en chaine:

doc = unicodedata.normalize('NFD', doc).encode('ascii', 'ignore').decode("utf-8")
print(doc)

Sortie:

  Le chat est devant la maison  9 rue du zoo  Le chien attend a l interieur  Son site web prefere est www spa fr

Passage en minuscule:

doc = doc.lower()
print(doc)

Sortie:

  le chat est devant la maison  9 rue du zoo  le chien attend a l interieur  son site web prefere est www spa fr toto

Expressions régulières

Elimination des chiffres

import re
doc = re.sub('[0-9]+', '', doc) # remplacer une séquence de chiffres par rien
print(doc)

Remarque: il est trop tard pour éliminer l'url; toute la ponctuation a été supprimée et elle n'est plus vraiment détectable. Pour supprimer une séquence URL (au début du processus):

doc = 'Le chat est devant la maison, 9 rue du zoo. Le chien attend à l\'intérieur.\nSon site web préféré est www.spa.fr toto'
print(doc)

doc = re.sub('www[a-z0-9\.\/:%_+.#?!@&=-]+', 'URL', doc)
print(doc)

Sortie:

  Le chat est devant la maison, 9 rue du zoo. Le chien attend à l'intérieur.
  Son site web préféré est www.spa.fr toto
  Le chat est devant la maison, 9 rue du zoo. Le chien attend à l'intérieur.
  Son site web préféré est URL toto

Elimination des espaces multiples

doc = re.sub(' +', ' ', doc)

Outils basiques

Supprimer une entête (démarrer la lecture d'une chaine après un double saut de ligne)

txt = txt[txt.find('\n\n'):] # récupération de tout ce qui suit le double saut de ligne

Intégration dans une fonction pour un traitement plus rapide

def process(txt):
  [...] # tous les traitements
  return txt

# Traitement rapide, sans boucle for
corpuspp = [[process(t) for t in topic] for topic in docs]