About Me

My photo
Just wasting time sharing knowledge about, Big Data and Analytics

Sep 26, 2013

Construire un moteur de reco simple avec R (1/2)

Construire un moteur de recherche

On va montrer comment on peut construire un moteur de recommandation simple en utilisant les outils de Textmining.
Cette construction se fera en deux temps :
  • On construit un moteur de recherche pour identifier par exemple, dans la base de données les éléments les plus proches de sa requête
  • On applique un modèle naïf de probabilité pour faire des recommandations.
J'ai aucune vraie formation sur la question et l'aide d'un linguiste et d'un vrai développeur me serait utile pour développer une vraie appli qui réponde à cette problématique.
On peut donc considérer qu'il s'agit ici de bases théoriques et de grands principes pouvant y aider.
Considérer les données suivantes :
rm(list = ls())
setwd("./Tutoriels/MoteurRecherche/")
## Error: impossible de changer de répertoire de travail
achat1 <- "Livres : Milan Kundera (la vie est ailleurs), Musique : Leonard Cohen"
achat2 <- "Livres : La liste de mes envies, Guide touristique Brno, Milan, Vienne, Prague"
achat3 <- "Musique: Gainsbourg, Trenet, Aznavour, vivaldi, Mozart, Vienne"
achat4 <- "Les oraux de Littérature et mathématique en clase prépa."
achat5 <- "Livres : Milan Kundera (l'immortalité), Musique : Nina Simone, Théâtre : Jacques et son maître"
Que l'on agrége dans une liste fourre-tout. On peut imaginer ici qu'il s'agit d'une base de données (non structurée) qui contienne à peu près tous les commentaires faits par des clients.
fourre_tout <- list(achat1, achat2, achat3, achat4, achat5)
N <- length(fourre_tout)
names(fourre_tout) <- paste0("achat", c(1:N))
Pour l'exercice, disons qu'un client vient sur le site et recherche
req <- "Milan Kundera"
Tout l'exercice consiste donc à pouvoir faire correspondre cette recherche avec les éléments qu'il y a déjà dans la base de données et de faire resortir les éléments qui s'en rapprochent le plus pour faire des recommandations.

Construction d'un corpus

library(tm)
library(Snowball)

Corpus <- VectorSource(c(fourre_tout, req))
Corpus$Names <- c(names(fourre_tout), "recherche")
monCorpus <- Corpus(Corpus)
monCorpus
## A corpus with 6 text documents
Le corpus constitué, on applique tous les traitements de standardisation de text mining afin de favoriser les recherches de corrélation.
Traitement
monCorpus <- tm_map(monCorpus, removePunctuation)
monCorpus <- tm_map(monCorpus, stemDocument)
monCorpus <- tm_map(monCorpus, tolower)
monCorpus <- tm_map(monCorpus, stripWhitespace)
monCorpus$achat1
## livr milan kundera la vie est ailleur musiqu leonard cohen

Modélisation

Construire un modèle de recommandation suppose de pouvoir associer chaque mot de chaque corpus à un autre mot d'un autre corpus. La matrice de documents est faite pour çà.
doc.tdm <- TermDocumentMatrix(monCorpus)
inspect(doc.tdm)
## A term-document matrix (35 terms, 6 documents)
## 
## Non-/sparse entries: 45/165
## Sparsity           : 79%
## Maximal term length: 12 
## Weighting          : term frequency (tf)
## 
##               Docs
## Terms          achat1 achat2 achat3 achat4 achat5 recherche
##   ailleur           1      0      0      0      0         0
##   aznavour          0      0      1      0      0         0
##   brno              0      1      0      0      0         0
##   clase             0      0      0      1      0         0
##   cohen             1      0      0      0      0         0
##   envi              0      1      0      0      0         0
##   est               1      0      0      0      0         0
##   gainsbourg        0      0      1      0      0         0
##   guid              0      1      0      0      0         0
##   jacqu             0      0      0      0      1         0
##   kundera           1      0      0      0      1         1
##   leonard           1      0      0      0      0         0
##   les               0      0      0      1      0         0
##   limmortalité      0      0      0      0      1         0
##   list              0      1      0      0      0         0
##   littératur        0      0      0      1      0         0
##   livr              1      1      0      0      1         0
##   maîtr             0      0      0      0      1         0
##   mathématiqu       0      0      0      1      0         0
##   mes               0      1      0      0      0         0
##   milan             1      1      0      0      1         1
##   mozart            0      0      1      0      0         0
##   musiqu            1      0      1      0      1         0
##   nina              0      0      0      0      1         0
##   oraux             0      0      0      1      0         0
##   pragu             0      1      0      0      0         0
##   prépa             0      0      0      1      0         0
##   simon             0      0      0      0      1         0
##   son               0      0      0      0      1         0
##   théâtre           0      0      0      0      1         0
##   touristiqu        0      1      0      0      0         0
##   trenet            0      0      1      0      0         0
##   vie               1      0      0      0      0         0
##   vienn             0      1      1      0      0         0
##   vivaldi           0      0      1      0      0         0
Cette matrice montre bien ce qu'elle fait. Et en toute rigueur, on devrait pouvoir la calculer manuellement avec des coefficients de probabilité. C'est l'objet de notre deuxième partie.
Techniquement, il faudrait que ma recherche attribue un poids au mot ailleurs.
Mais poursuivons. L'élément central de la recherche de similarité est sans doute de pouvoir calculer un tf-id; Cette mesure statistique permet d'évaluer l'importance d'un terme contenu dans un document (Cf Wikipédia - ?tf-idf), 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.
Une autre façon naïve de le faire serait d'attribuer des probabilités à priori à chaque mot, basées par exemple sur un historique de requête.
A suivre

No comments:

Post a Comment