%matplotlib inline
import numpy as np
import scipy.sparse as sp
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
import re
import matplotlib.pyplot as plt
from IPython.display import Image
newsgroups_train = fetch_20newsgroups(subset='train',remove=('headers', 'footers', 'quotes'))
n = newsgroups_train.filenames.shape[0]
corpus = newsgroups_train.data
print corpus[0]
vectoriseur = CountVectorizer()
vectoriseur.fit(corpus)
X = vectoriseur.transform(corpus).tocsc()
indice = vectoriseur.vocabulary_
indice['woman']
terme = vectoriseur.get_feature_names()
terme[97164]
Définir un dictionnaire donnant pour chaque terme son nombre d'occurrences dans l'ensemble du corpus.
Affichez les 100 termes les plus courants et les 10 termes les moins courants
Afficher ensuite la frequence des termes en fonction de leur rang (Utiliser une échelle logarithmique)
Vous utiliserez la librairie d'affichage matplotlib (import matplotlib.pyplot as plt)
Si la distribution des fréquences suit une loi de Zipf, alors f(t)≃C/r(t) où r(t) est le rang du terme t par ordre de fréquence décroissante. Calculer la valeur de la constante C sur ce jeu de données.
occ = {}
for i in range(len(indice)):
occ[terme[i]] = X[:,i].sum()
occ['the']
from operator import itemgetter
l = occ.items()
l.sort(key=itemgetter(1),reverse=True)
print l[:100]
print l[-10:]
v = occ.values()
v.sort(reverse = True)
plt.loglog(v)
Même exercice avec la fréquence documentaire (Document Frequency)
Définir un second dictionnaire donnant pour chaque terme sa fréquence documentaire (pensez à utiliser la matrice X).
Affichez les 100 termes ayant la fréquence documentaire la plus élevée. Affichez également 10 termes ayant la fréquence documentaire la plus faible.
Afficher ensuite la frequence des termes en fonction de leur rang (Utiliser une échelle logarithmique)
Enfin, calculer la valeur de la constante C et comparez .
Un texte est une séquence de caractères modélisable comme une série de tirages aléatoires selon une loi L à déterminer.
Soit une séquence de symboles x1,...,xt,.... Le modèle unigramme considère chaque symbole xt comme issu d'un tirage multinomial de probabilité (p1,...,pn) avec ∑ipi=1, où n est le nombre de symboles.
A partir du corpus '20 newsgroups", calculez le vecteur de probabilité (p1,...,pn) en fonction des fréquences d'apparition des différents caractères.
Ensuite, vous utiliserez un générateur aléatoire (numpy.random.multinomial) pour générer une séquence de caractères obéissant à cette loi de probabilité.
Soit une séquence de symboles x1,...,xt,.... Le modèle bigramme considère que la probabilité d'apparition du symbole xt dépend du symbole précédent uniquement, soit P(Xt=xt|X1=x1,...,Xt−1=xt−1)=P(Xt=xt|Xt−1=xt−1)
Cette probabilité peut être représentée à l'aide d'un tableau bidimensionnel (Pij)i,j=1..n, avec ∑jPij=1, où Pij représente la probabilité de choisir le symbole j après le symbole i.
A partir du corpus '20 newsgroups", calculez la matrice de probabilité ((p11,...,p1n),...,(pn1,...,pnn)) en fonction des fréquences d'apparition des différents couples de caractères dans la base.
Ensuite, vous utiliserez un générateur aléatoire (numpy.random.multinomial) pour générer une séquence de caractères obéissant à cette loi de probabilité.
Un algorithme de complétion est un mécanisme logique permettant d'anticiper la saisie et de proposer des mots automatiquement pour faciliter les recherches dans un formulaire sur une page web par exemple.
On utilise pour cela une structure de données arborescente, où chaque nœud de l'arbre est une lettre, ses nœuds enfants les lettres suivantes possibles du mot, avec un indicateur par lettre pour savoir si celle-ci est finale ou non.
Le but de cet exercice est de construire un arbre de complétion à partir des mots de vocabulaire présents dans la base '20 newsgroups', puis de l'utiliser pour compléter un début de mot proposé par l'utilisateur.
Un arbre de complétion sera défini de manière récursive. Un noeud de l'arbre contient 2 éléments :
Vous devez :
Créez un arbre de complétion. Insérez les mots 'bonjour', 'bonjour', 'bonsoir', 'bon', 'jour', 'soir' et vérifiez grâce à l'affichage que les mots sont correctement insérés.
Ecrivez ensuite une fonction suivant(debut, A) qui, à partir de la chaîne debut et de l'arbre de complétion A, retourne la liste de mots qui complète le début de mot.
Améliorez votre fonction pour que les mots les plus courants apparaissent en premier dans la liste.