Teaching - TAL

Page principale de l'UE


Traitement Automatique de la Langue

Passage à un corpus aplati

On change de codage pour les catégories...

AVANT:

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

APRES

  X = [ doc11, doc12, ..., doc21, doc22, ...]
  Y = [ 1, 1, ...        , 2, 2, ...]
x_brut = [] # un document par case
y = [] # une étiquette par case
for i,topic in enumerate(corpuspp):
   x_brut += topic # + : operateur de concatenation de listes
   y += [i for n in range(len(topic))]

Création de tables d'index et index inversé

Chaque mot correspond à un colonne... Il faut connaitre la correspondance, dans les deux sens.

# dicoFilt = liste des mots retenus

# mots => index
mots2index = dict(zip(dicoFilt, range(len(dicoFilt))))
# index => mots
index2mots = dict(zip(range(len(dicoFilt)), dicoFilt))

Test:

mots2index['human'] # 996
index2mots[996] # 'human'

Construction du sac de mots

import scipy.sparse

# représentation en sacs de mots
N = len(x_brut)
D = len(mots2index)

# choix important pour les matrices sparses (lil = plus rapide pour notre tache)
bow=scipy.sparse.lil_matrix((N,D))
cpt=0
def add1(i,j):
    bow[i,j] += 1

# un peu cher en mémoire... Si vous êtes limité => boucle for classique
[[add1(i,mots2index[m]) for m in s.split() if m in mots2index] for i,s in enumerate(x_brut)]

Test:

# affichage d'un document vu en sac de mots
words = [index2mots[i] for i in bow[0].nonzero()[1]]
print(words)
# vérification que les mots sont bien dans le doc
for w in words[:10]:
    print(w in x_brut[0])

Etude des similarités entre mots

Regardons la matrice de similarité entre les 10 premiers mots du dictionnaire:

# calcul de similarité
sim = bow[:,:10].T.dot(bow[:,:10]).toarray()

# affichage
import matplotlib.pyplot as plt
plt.figure()
plt.imshow(sim, interpolation='nearest')
labs = [index2mots[i] for i in range(10)]
plt.xticks(np.arange(len(labs)),labs,rotation=70)
plt.savefig("dicoSim.png")

Résultats:

Nous avons une parfaite illustration des problèmes de normalisation...