Le but de ce TD est de développer un moteur de recherche dans une base de textes. Nous utilisons une base constitués d'un peu plus de 11.000 messages postés sur des forums de discussion (anglophones), fréquemment utilisée en analyse des données.
Il s'agit de la base http://scikit-learn.org/stable/datasets/twenty_newsgroups.html
Le TD est constitué de plusieurs exercices ainsi que d'un problème. Les principales opérations sont réalisées à l'aide de la librairie scikit-learn
.
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
newsgroups_train = fetch_20newsgroups(subset='train',remove=('headers', 'footers', 'quotes'))
newsgroups_train.filenames
newsgroups_train.filenames.shape
print newsgroups_train.filenames[0]
print newsgroups_train.data[0]
print newsgroups_train.target[0]
print newsgroups_train.target_names[7]
print newsgroups_train.target_names
corpus = newsgroups_train.data
len(corpus)
vectoriseur = CountVectorizer()
vectoriseur.fit(corpus)
indice = vectoriseur.vocabulary_
indice['car']
terme = vectoriseur.get_feature_names()
terme[25775]
texte = [corpus[0]]
print texte
vect = vectoriseur.transform(texte)
print vect
vue = sp.find(vect)
print vue
Trouvez à partir du vecteur vue :
X_comptage = vectoriseur.transform(corpus)
print X_comptage
X est une matrice creuse contenant 11314 lignes, chaque ligne correspondant à un vecteur texte
transformeur = TfidfTransformer(norm=None, smooth_idf=False)
transformeur.fit(X_comptage)
idf = transformeur.idf_
print idf
vecteur_comptage = X_comptage[0,:]
vecteur_tfidf = transformeur.transform(vecteur_comptage)
print vecteur_tfidf
np.linalg.norm(vecteur_tfidf.toarray())
X = transformeur.transform(X_comptage)
print X[0]
def prod(x,y):
return x.dot(y.T).toarray()[0][0]
def sim(x,y):
num = prod(x,y)
den1 = np.sqrt(prod(x,x))
den2 = np.sqrt(prod(y,y))
return num / (den1 * den2)
sim(X[0,:],X[1,:])