About Me

My photo
Just wasting time sharing knowledge about, Big Data and Analytics
Showing posts with label tm. Show all posts
Showing posts with label tm. Show all posts

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

May 18, 2013

Mining the last French presidential debate

After reading this post (thanks to him), I think it could be interesting to replicate this with some specific up of french language and to see and we can perform rapid view of the debate between Sarkozy and Hollande of the last 2nd round of presidential election.

Key words : TextMining, Elections, France, Debate, 2nd Round

We use the packages qdap from (Tyler Rinker) and tm to perform textmining analysis and the classical package like ggplot or RColorBrewer make our  graphics look pretty.
For Hollande






Top words From hollande
For Sarkozy
Top words from Sarkozy
As we can see, I've a problem to manage french accent. If somebody have any idea... We can also perform a quick Gantt plot basing on Qdap package and get some information about who lead the debate No surprise about the winner.