Teaching - TAL

Page principale de l'UE


Traitement Automatique de la Langue

Trouver tous les mots d'un corpus. Nous faisons l'hypothèse que tous les documents ont été traités et stockés dans corpuspp. Comme nous travaillons sur 20newsgroups, corpuspp est une liste de listes de textes:

  corpuspp = [[ doc11, doc12, ...], # topic 1
              [ doc21, doc22, ...], # topic 2
    ...]

Structure set

La structure set de python permet d'isoler des termes uniques. Pour extraire tous les termes unique du premier document:

dico = set(corpuspp[0][0].split()) # ensemble des mots issus de la division du doc11
print(len(dico)) # 788
print(len(corpuspp[0][0].split())) # 1643

Pour réunir des set, on utilise union:

dico2 = set(corpuspp[0][1].split()) # len = 1258
dico = dico.union(dico(2)) # len = 1790

Pour compter: structure Counter (=hashmap spécifique string, int)

from collections import *

dico =Counter()
for topic in corpuspp:
    for d in topic:
        for mot in d.split():
            dico[mot] += 1     # création ou incrément

Test:

print(len(dico)) # 85874
print(dico['the']) # 144449

Attention: le nombre correspond au nombre d'occurrences du mot dans le corpus, pas au nombre de documents dans lesquels sont présents le mot...

Le passage au comptage documentaire (plus intéressant) est aisé:

doc11 = d.split() # parcours des mots du doc
doc11u = set(d.split()) # parcours des mots uniques du doc !

Test (après re-traitement du corpus):

print(dico['the']) # 10446 (/11314 docs)

Passer aux n-grams

Il est facile de générer des bigrammes:

doc = 'Le chat est devant la maison'
s = doc.split() # unigramme
s2 = [m1+'-'+m2 for m1,m2 in zip(s[:-1], s[1:])] # bigrammes

Pour générer une combinaison des unigrammes, bigrammes, ..., N-grammes, c'est un peu plus complexe:

doc = 'le chat est devant la maison'
n=3

s = doc.split()
s2 = [m1+'-'+m2 for m1,m2 in zip(s[:-1], s[1:])]
sn = [[''.join(s[i:j]) for j in range(i+1,min(i+n+1,len(s)+1))] for i in range(len(s))]

print(s)
print(s2)
print(sn)

Filtrage:

Les mots peu fréquents sont inutiles pour les traitements statistiques... Les mots trop fréquents ne sont pas caractéristiques (=stop-words) et ils déstabilisent les méthodes statistiques. Ces catégories doivent être éliminées.

Exemple de code pour supprimer tous les mots qui apparaissent dans moins de 4 documents ou plus de 60% des documents:

ndocs = sum([len(t) for t in corpuspp])
dicoFilt = [k for k,v in dico.items() if v>3 and v<0.6*ndocs]

Test:

'the' in dicoFilt # False
'human' in dicoFilt # True