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

September 25, 2013
By

(This article was first published on Learning Data Science , and kindly contributed to R-bloggers)




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

To leave a comment for the author, please follow the link and comment on their blog: Learning Data Science .

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...



If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.

Sponsors

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)