Skanji Moez
1 février 2018
Le but génerale de ces algorithmes est de projeter l’espace des individus (il s’agit dans notre cas de la matrix IF_DF qu’on detaillera par la suite ) dans un espace de dimension plus faible en tenant compte des corrélations existantes entre les variables , puis calculer le l’indicateur de simulitude entre le query
Dans notre exemple on va étudier le text existant dans la base de donnée USCongress , on va extraire seulement les dix premiers pour faciliter les traitements par la suite… l’étape la plus importante dans le text analycis est le traitement de du documents càd enlever tout les bavures que contient nos documents: (ponctuation , casse … ).
library(RTextTools)## Loading required package: SparseM
##
## Attaching package: 'SparseM'
## The following object is masked from 'package:base':
##
## backsolve
data(USCongress)
x<-USCongress$text[1:1000]
head(x , 3 )## [1] To suspend temporarily the duty on Fast Magenta 2 Stage.
## [2] To suspend temporarily the duty on Fast Black 286 Stage.
## [3] To suspend temporarily the duty on mixtures of Fluazinam.
## 4295 Levels: -- Private Bill; For the relief of Alfonso Quezada-Bonilla. ...
le but de cet étape est de présenter les fichiers text en une data frame, pour ce faire on a besoin de traiter les 3 étapes suivantes :
library(tm)## Loading required package: NLP
source <- VectorSource(x)
corpus <- Corpus(source)
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, removeWords, stopwords('english'))
mat <- DocumentTermMatrix(corpus)
inspect(mat) ## <<DocumentTermMatrix (documents: 1000, terms: 3219)>>
## Non-/sparse entries: 12812/3206188
## Sparsity : 100%
## Maximal term length: 41
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs act amend certain code federal provide purposes states title united
## 104 2 1 0 0 1 0 0 1 0 1
## 113 1 1 0 0 0 0 0 1 0 1
## 178 0 1 0 1 0 1 0 1 1 1
## 265 0 1 1 1 1 0 0 1 1 1
## 268 0 0 0 0 0 0 0 0 0 0
## 369 0 0 0 0 0 1 0 2 0 2
## 444 0 0 0 0 0 1 0 0 0 0
## 451 0 0 2 0 0 0 0 0 0 0
## 484 0 0 1 0 0 0 0 0 0 0
## 537 0 0 0 0 1 0 0 0 0 0
dim(as.matrix(mat))## [1] 1000 3219
La matrice TF-IDF est une méthode de pondération souvent utilisée en recherche d’information et en particulier dans textminig . Cette mesure statistique permet d’évaluer l’importance d’un terme contenu dans un document, relativement à une collection ou un corpus. Le poids augmente proportionnellement au nombre d’occurrences du mot dans le document. Il varie également en fonction de la fréquence du mot dans le corpus. .
TFIDF <- weightTfIdf(mat )
#inspect(TFIDF)
norm_eucl <- function(m)
m/apply(m,1,function(x) sum(x^2)^.5) #normalisation de la matrice
mat_norm <- norm_eucl(TFIDF)
head(as.matrix(mat_norm[1:20,1:20]) , 3 )## Terms
## Docs duty fast magenta stage suspend temporarily
## 1 0.2460380 0.4594906 0.5748567 0.5171737 0.2562409 0.2544512
## 2 0.2699011 0.5040563 0.0000000 0.5673339 0.2810935 0.2791302
## 3 0.2665742 0.0000000 0.0000000 0.0000000 0.2776287 0.2756896
## Terms
## Docs black fluazinam mixtures prodiamine reduce technical act amend
## 1 0.0000000 0.0000000 0.0000000 0 0 0 0 0
## 2 0.4407786 0.0000000 0.0000000 0 0 0 0 0
## 3 0.0000000 0.6228386 0.6228386 0 0 0 0 0
## Terms
## Docs caribbeanborn immigrants immigration nationality regard affairs
## 1 0 0 0 0 0 0
## 2 0 0 0 0 0 0
## 3 0 0 0 0 0 0
l’approche de LSA permet de projeter notre espace de dimension plus faible (réduction de dimension .) et de plus permet de détecter les corrélations existante entre les différents termes de nos documents,
library(irlba)## Loading required package: Matrix
irlba<-as.matrix(mat_norm)
dim(irlba)## [1] 1000 3219
DFIF.irlba<-irlba(irlba , nv=300 , maxit=600 )
DFIF.irlba$u[1:20 , 1:5] ## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.002972601 -0.1411787484 -8.239897e-06 0.006777937 -0.005245892
## [2,] 0.003924564 -0.1663101274 -6.034409e-04 0.005264953 -0.002978277
## [3,] 0.002978974 -0.1374212207 2.753452e-05 0.006495716 -0.005019577
## [4,] 0.005291978 -0.0989218631 -7.386334e-04 0.003834101 -0.002436783
## [5,] 0.012608706 0.0005954073 -3.120850e-03 0.003496234 0.002251103
## [6,] 0.041705432 0.0003986431 -1.560297e-03 -0.022733182 0.008396259
## [7,] 0.019781282 0.0010473112 -4.039543e-03 0.012181019 -0.002703509
## [8,] 0.002978974 -0.1374212207 2.753452e-05 0.006495716 -0.005019577
## [9,] 0.003774259 -0.1734433900 3.466287e-05 0.008159801 -0.006290862
## [10,] 0.002978974 -0.1374212207 2.753452e-05 0.006495716 -0.005019577
## [11,] 0.003612618 -0.1705686622 -3.302377e-06 0.008095965 -0.006178510
## [12,] 0.052111310 -0.0007626748 1.770513e-02 -0.033752205 0.004800411
## [13,] 0.006917302 -0.1172003765 1.789241e-03 -0.002650347 0.004943949
## [14,] 0.045125709 0.0017456852 8.479620e-02 0.011295828 -0.002666915
## [15,] 0.038982053 0.0013498603 -2.497236e-02 0.023951231 -0.001082895
## [16,] 0.036319098 0.0003592593 -1.960786e-02 -0.035011930 -0.002131984
## [17,] 0.051783853 0.0035355233 -4.957009e-02 0.056548821 -0.010114382
## [18,] 0.002621812 -0.0995416304 -3.689732e-05 0.004912344 -0.003321798
## [19,] 0.002396247 -0.1165723363 -2.025114e-06 0.005743123 -0.004465302
## [20,] 0.003526397 -0.0878287948 2.352119e-03 0.004803249 -0.003145369
dim(DFIF.irlba$u) ## [1] 1000 300
aprés avoir projeter la matrice TF-IDF das un espace véctoriel latent on va tester la relation existante entre les différent document en calculant un l’indice de similarité entre les documents, il s’agit donc d’évaluer le cos-similarité ..
library(lsa) ## Loading required package: SnowballC
##
## Attaching package: 'SnowballC'
## The following objects are masked from 'package:RTextTools':
##
## getStemLanguages, wordStem
cos.similarity<-cosine(t(DFIF.irlba$u))
cos.similarity[1:20,1:6]## [,1] [,2] [,3] [,4] [,5]
## [1,] 1.0000000000 0.8968800882 4.914505e-02 0.007426283 -1.876623e-04
## [2,] 0.8968800882 1.0000000000 2.175110e-02 0.008443723 2.343969e-03
## [3,] 0.0491450504 0.0217510998 1.000000e+00 0.163167989 -2.947879e-03
## [4,] 0.0074262830 0.0084437227 1.631680e-01 1.000000000 1.112138e-02
## [5,] -0.0001876623 0.0023439686 -2.947879e-03 0.011121382 1.000000e+00
## [6,] -0.0054875337 -0.0011614019 -2.552827e-05 0.017351854 -2.198860e-02
## [7,] -0.0182508911 -0.0110067872 4.035698e-03 -0.011988770 1.489813e-04
## [8,] 0.0491450504 0.0217510998 1.000000e+00 0.163167989 -2.947879e-03
## [9,] 0.0691274130 0.0409398897 9.955340e-01 0.173999354 -2.136623e-03
## [10,] 0.0491450504 0.0217510998 1.000000e+00 0.163167989 -2.947879e-03
## [11,] -0.3039039786 -0.1591899045 1.565564e-01 0.013780609 -2.218406e-03
## [12,] -0.0054046206 -0.0067617392 1.160634e-03 -0.026180442 1.321440e-02
## [13,] 0.0330295402 0.0076772824 7.627136e-01 0.089246119 -1.658561e-02
## [14,] 0.0070939234 -0.0004434949 1.600031e-03 -0.052461378 6.630373e-03
## [15,] -0.0053932106 -0.0066458285 -2.372904e-02 0.005740668 -4.675452e-03
## [16,] 0.0093550381 0.0027281648 -1.125286e-02 0.003542575 2.957262e-03
## [17,] 0.0090549193 0.0055938301 -9.403402e-03 0.035803660 4.121960e-02
## [18,] 0.0463150614 -0.0401174899 4.046705e-02 0.011464507 5.685243e-03
## [19,] 0.0729915076 -0.0926713917 1.219504e-02 0.006209569 -2.917421e-03
## [20,] 0.0559873269 -0.0347983865 2.941616e-02 0.010533708 5.094916e-05
## [,6]
## [1,] -5.487534e-03
## [2,] -1.161402e-03
## [3,] -2.552827e-05
## [4,] 1.735185e-02
## [5,] -2.198860e-02
## [6,] 1.000000e+00
## [7,] -5.187521e-02
## [8,] -2.552827e-05
## [9,] -5.534135e-04
## [10,] -2.552827e-05
## [11,] -1.393926e-02
## [12,] 4.014350e-03
## [13,] -1.592991e-02
## [14,] -6.779068e-03
## [15,] 5.662939e-04
## [16,] 5.024409e-02
## [17,] 4.982220e-03
## [18,] 5.966334e-03
## [19,] 5.672688e-03
## [20,] 3.980167e-03
#on va prendre dans cet exemple le 1 er document comme document de réference et on va voir par la suite
#si il'ya une ressemblance entre le document en questions et les autres . l’analyse de similutude montre dans cet exemple qu’il n’y pas de similitude à priori entre les documents . On va par la suite traiter un autre exemple ou il y a a priorie des documents et un ensemble de mots clé qu’on esseyera par la suite de déterminer le document le plus pertinant qui correspand le plus à ces mots clé ..
Dans la base notre base de donnée on a introduit un document qui n’a pas de relation avec la thématique du recherche et dévelopement , le but c’est de tester notre algorithme, est ce qu’il pourrait détecter ce genre d’anomalie ou pas ..
Le traitement du document ce fait de manière identique : l’étape du data PipeLine est une étape primordiale : (créattion d’un Corpus , traiter les données , création de la matrice des termes ainsi que la TF_IDF …
## [1] 7 2
## <<DocumentTermMatrix (documents: 7, terms: 234)>>
## Non-/sparse entries: 286/1352
## Sparsity : 83%
## Maximal term length: 16
## Weighting : term frequency (tf)
## Sample :
## Terms
## Docs approach cdm cis data firm firms innovation model productivity
## 1 0 0 0 1 0 1 2 0 3
## 2 5 2 0 0 1 1 1 3 1
## 3 1 2 3 4 2 0 2 1 1
## 4 1 0 0 2 1 1 1 1 0
## 5 1 0 4 2 2 1 0 0 0
## 6 0 0 0 0 0 0 0 0 0
## 7 0 1 0 0 0 0 1 1 0
## Terms
## Docs surveys
## 1 0
## 2 0
## 3 1
## 4 0
## 5 3
## 6 0
## 7 0
aprés avoir calculer la matrice des termes on va calculer la matrice des distances et voir si on peut conclure consernant la pertinance des documents . Cette méthode de calcul des distances à partir de la matrice des termes est plutot une méthode de matching que du recherche avancé, elle permet simplement de trouver les documents qui ont le plus utilisé les mots clé (technique de recherche par la fréquence) Cette méthode n’est pas très pertinante dans la recherche des documents car on peut trouver des documents qui n’utilise aucune des mots clé , mais parcontre ils pourraient être pertinante.
# calculer la matrice des distances
td.mat <- as.matrix(TermDocumentMatrix(corpus))
dist.mat <- dist(t(as.matrix(td.mat)))
dist.mat ## 1 2 3 4 5 6
## 2 11.916375
## 3 11.269428 12.369317
## 4 10.488088 11.224972 10.723805
## 5 11.832160 12.806248 9.746794 10.862780
## 6 12.489996 13.711309 13.228757 12.000000 13.114877
## 7 8.124038 9.591663 9.000000 7.348469 9.273618 9.591663
TFIDF <- weightTfIdf(mat )
library(irlba)
#inspect(TFIDF)
norm_eucl <- function(m)
m/apply(m,1,function(x) sum(x^2)^.5) #normalisation de la matrice
mat_norm <- norm_eucl(TFIDF)
#head(as.matrix(mat_norm[1:6,1:50]) , 3 )
LSA<-irlba(as.matrix(mat_norm) , nv= 3, maxit=600) library(lsa)
df<- as.data.frame(LSA$u)
cosine.similarity<-cosine(t(LSA$u))
vectCosine<-cosine.similarity[7,-7]
doc<-c("doc1" , "doc2" , "doc3" , "doc4" , "doc5" , "doc6")
teta<-cbind(doc , abs(vectCosine) )
teta<-as.data.frame(teta)
teta1<-teta[order( as.numeric(teta$V2), decreasing = TRUE) ,]
teta1[1:3,]## doc V2
## 2 doc2 0.979780433653199
## 1 doc1 0.934934590761719
## 4 doc4 0.904158799029371