#!/usr/bin/env python # coding: utf-8 # # Documentation # Voir : http://scikit-learn.org/stable/modules/feature_extraction.html # # Importation des librairies mathématiques # In[ ]: import numpy as np import scipy.sparse as sp from pprint import pprint from sklearn.datasets import fetch_20newsgroups from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer # # Téléchargement des données # In[ ]: newsgroups_train = fetch_20newsgroups(subset='train',remove=('headers', 'footers', 'quotes')) # ### Nombre de fichiers # In[ ]: newsgroups_train.filenames # In[ ]: newsgroups_train.filenames.shape # ### Noms des fichiers # In[ ]: print newsgroups_train.filenames[0] # ### Affichage du premier message # In[ ]: print newsgroups_train.data[0] # ### Catégorie du premier message # In[ ]: print newsgroups_train.target[0] # In[ ]: print newsgroups_train.target_names[7] # ### Liste des catégories # In[ ]: print newsgroups_train.target_names # # 2. Vectorisation (comptage de termes) # ### Corpus # In[ ]: corpus = newsgroups_train.data # In[ ]: len(corpus) # ### Vectoriseur # In[ ]: vectoriseur = CountVectorizer() # ### Analyse # In[ ]: vectoriseur.fit(corpus) # ### Dictionnaire des indices # In[ ]: indice = vectoriseur.vocabulary_ # In[ ]: indice['car'] # ### Liste des termes # In[ ]: terme = vectoriseur.get_feature_names() # In[ ]: terme[25775] # ## Exercice 1 # # # Afficher les 10 termes qui suivent le terme 'home' ainsi que ceux qui suivent le terme 'car' dans la liste de vocabulaire. # # In[ ]: # ### Transformation texte vers vecteur (matrice creuse) # In[ ]: texte = [corpus[0]] # In[ ]: print texte # In[ ]: vect = vectoriseur.transform(texte) # In[ ]: print vect # In[ ]: vue = sp.find(vect) # In[ ]: print vue # ## Exercice 2 # # Trouvez à partir du vecteur vue : # * le terme le plus fréquent dans le message # * le nombre d'apparitions du terme 'car' # # # # # In[ ]: # ### Vectorisation du corpus complet # In[ ]: X_comptage = vectoriseur.transform(corpus) # In[ ]: print X_comptage # X est une matrice creuse contenant 11314 lignes, chaque ligne correspondant à un vecteur texte # ## Exercice 3 # # # Combien de textes contiennent le terme 'home'? en deduire le score 'term frequency' # # In[ ]: # ## Exercice 4 # # # Affichez un message du corpus contenant le terme 'platypus' # # In[ ]: # ## Exercice 5 # # # Vectorisez maintenant un texte anglophone de votre choix et affichez le vecteur résultant # In[ ]: # # 3. Transformation TF-IDF # In[ ]: transformeur = TfidfTransformer(norm=None, smooth_idf=False) # ### Calcul IDF # In[ ]: transformeur.fit(X_comptage) # In[ ]: idf = transformeur.idf_ # In[ ]: print idf # ## Exercice 6 # # # Affichez le score IDF de 'the', 'car', 'spherical', 'platypus' # In[ ]: # ### Vectorisation TF-IDF du premier message du corpus # In[ ]: vecteur_comptage = X_comptage[0,:] # In[ ]: vecteur_tfidf = transformeur.transform(vecteur_comptage) # In[ ]: print vecteur_tfidf # ## Exercice 7 # # # Affichez les termes dont le score TF-IDF est superieur à 8 # In[ ]: # ### Norme du vecteur # In[ ]: np.linalg.norm(vecteur_tfidf.toarray()) # ### Vectorisation TF-IDF du corpus # In[ ]: X = transformeur.transform(X_comptage) # ### Produit scalaire entre deux vecteurs du corpus (X[0,:] et X[1,:]) # In[ ]: print X[0] # ### Fonction produit scalaire # In[ ]: def prod(x,y): return x.dot(y.T).toarray()[0][0] # ### Fonction Similarité # In[ ]: def sim(x,y): num = prod(x,y) den1 = np.sqrt(prod(x,x)) den2 = np.sqrt(prod(y,y)) return num / (den1 * den2) # In[ ]: sim(X[0,:],X[1,:]) # ## Problème # # # Ecrivez et testez une fonction qui prend une requête de l'utilisateur sous la forme d'une liste de mots-clés (en anglais) et qui retourne la liste des 10 textes de la base les plus similaires à la requête par ordre décroissant de similarité. # # In[ ]: