%matplotlib inline
import numpy as np
import os
import scipy.sparse as sp
import re
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
import matplotlib.pyplot as plt
import scipy.io as io
import string
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.
newsgroups_train = fetch_20newsgroups(subset='train',remove=('headers', 'footers', 'quotes'))
n = newsgroups_train.filenames.shape[0]
corpus = newsgroups_train.data
print corpus[0]
caract =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',' ']
index = {}
for i in range(len(caract)):
index[caract[i]] = i
Soit une séquence de symboles $x_1,...,x_t,...$. Le modèle unigramme considère chaque symbole $x_t$ comme issu d'un tirage multinomial de probabilité $(p_1,...,p_n)$ avec $\sum_i p_i =1$, où n est le nombre de symboles.
def tirage(p):
# réalise un tirage multinomial à partir du vecteur de probabilités p
v = np.random.multinomial(1,p, 1)
return np.where(v==1)[1][0]
def nettoie(d):
l = re.findall(r'[a-z \n]',d,re.I)
r = string.join(l,'')
r = string.replace(r,'\n',' ')
#print d,'\n','-'*30,'\n',d_prim.lower()
return r.lower()
print nettoie(corpus[0])
Soit une séquence de symboles $x_1,...,x_t,...$. Le modèle bigramme considère que la probabilité d'apparition du symbole $x_t$ dépend du symbole précédent uniquement, soit $P(X_t=x_t|X_1=x_1,...,X_{t-1}=x_{t-1}) = P(X_t=x_t|X_{t-1}=x_{t-1}) $
Cette probabilité peut être représentée à l'aide d'un tableau bidimensionnel $(P_{ij})_{i,j= 1..n}$, avec $\sum_j P_{ij}=1$, où $P_{ij}$ 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é $((p_{11},...,p_{1n}), ..., (p_{n1}, ..., p_{nn}))$ en fonction des fréquences d'apparition des différents couples de caractères dans la base.
Ensuite, vous utiliserez la fonction tirage pour générer une séquence de caractères obéissant à cette loi de probabilité.
La base Enron contient la liste des emails envoyés et reçus par les différents employés de la société "Enron". Cette liste permet de définir un grape des échanges de messages entre employés. A partir de la structure de ce graphe, il est possible de calculer un score de "popularité" pour chaue employé selon le principe du "PageRank" vu en cours.
employe = np.load('employe.npy')
employe[1191]
index = {}
for i in range(len(employe)):
index[employe[i]] = i
index['kenneth.lay@enron.com']
G = io.mmread('M.mtx')
G = G.tolil()
G[:10,:10].todense()
sp.find(G[:10,:10])
print employe[1191]
sp.find(G[1191,:])
def tirage(x):
v = np.random.multinomial(1,x, 1)
return np.where(v==1)[1][0]
PROBLEME
$$\forall (i,j), P_{ij} = \frac{G_{ij}} {\sum_k G_{ik}}$$
(q = 0.85)
(voir : http://www.inf.ed.ac.uk/teaching/courses/tts/assessed/roles.txt)