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