Deep structured semantic models (DSSM) for Web search

Skanji Moez

1 février 2018

Introduction :

La DSSM est une technique du text-analycis permet d’extraire les documents les plus pertinantes depuis un text en input.
Dans cet exemple on va utiliser 3 documents pour tester quelques algorithmes de DeepLearning à savoir :
  • LSA : latent semantic analycis.
  • PLSA : probalistic latent semantic analycis.
  • 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 et nos documents.
    On note X={ \(x_{1}\) ….. \(x_{n}\) } les documents sujet d’analyse.
    et Y les mots clés….

    Data import et création de la matrice des Termes .

    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. ...

    Data pipeline …

    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 :

  • tokenization : il s’agit de fragmenter notre texte en pièce distincte
  • consideration: enlever tout les ambigueité dans le document text
  • Documenent frequency matrix : construction d’une matrice dont chaque ligne représente un document , et chaque colonne la fréquence associé à chaque mots fragmenté “tokenized”.
  • 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

    construction de la matrice TF_IDF .

    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

    LSA : latent semantic analycis . (décomposition SVD)

    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

    cosine similarity ..

    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 . 

    example 2 : innovation et croissance économique

    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

    comparer la pertinance des documents avec la matrice des distance .

    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

    Projeter la matrice TF_IDF dans un espace latent de dimension = 3

    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) 

    Cosine similarity .

    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