e83db7062cfc033ecd0b470de7444e90fe76e6dc1ab218439df0c4_640_score

Identifier les co-occurrences avec R

Nouvel exemple de ce qu’on peut faire en utilisant le langage R. Cette fois çi nous allons nous pencher sur une analyse sémantique construite à partir d’une base de mots clés.  Cette analyse est très utile pour prioriser les contenus à produire en fonction de leur potentiel de trafic SEO

Qu’est ce qu’une co-occurrence ?

Une co-occurrence est un terme souvent associé à un autre. Par exemple « mariée » et souvent associé à « robe ». L’identification des co-occurrence est possible grâce à l’analyse sémantique  d’un corpus (ensemble de documents).

A quoi ça sert ce type d’analyses ?

Le détection de co-occurrence va vous permettre d’identifier des contenus à produire.

Ici nous allons pondérer les co-occurences en fonction des volumes de recherche. Ce qui va nous permettre

  • de prioriser les contenus à créer
  • d’optimiser la sémantique de nos pages déjà existantes

Dans le but de maximiser nos chances côté SEO

L’analyse

Récupérer les données

La première étape consiste à exporter une liste de mots clés. Pour cette exemple j’ai exporté la liste des mots clé contenant l’expression « matelas ».

J’ai récupéré cette liste à partir de l’outil Semrush.

Installer les packages

install.packages("tm")
install.packages("wordcloud")
install.packages("RColorBrewer")
install.packages("dplyr")
  • « tm » est un package destiné au texte mining
  • « wordcloud » va me permettre de mettre en forme mes résultats sous forme de tagcloud
  • « RColorBrewer » va nous permettre de mettre tout ça en couleur
  • « dplyr » permet de manipuler les données

L’installation des package n’est a réaliser qu’une fois.

Charger les packages

library("wordcloud")
library("RColorBrewer")
library("tm")
library("dplyr")

Pour pouvoir utiliser un package, il faut le charger.

Chargement des données

#Je charge le fichier
keywords <- read.csv(file="C:/Users/greg/Downloads/matelas-phrase_fullsearch-fr.csv", header=TRUE, sep=";",encoding = "UTF-8")

# Je filtre pour éviter le bruit
#keywords <- filter(keywords, keywords$Search.Volume >300)
  • Je charge les données
  • Je filtre pour éviter d’avoir trop d’éléments : je ne garde que les mots clés recherchés plus de 300 fois par mois ( à adapter en fonction du mots clé analysé)

Création du corpus

# Je crée un corpus
dfCorpus = Corpus(VectorSource(keywords$Keyword)) 
dtm <- TermDocumentMatrix(dfCorpus)

m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)

mots <- data.frame(word = names(v))
  • Je crée un corpus à partir de ma liste de mots clés
  • Je récupère tous les mots contenu dans ma liste de mots clés

Nettoyage

# Je retire les termes contenus dans ma recherche
mots <- filter(mots,!grepl("matel",mots$word))

Je retire l’expression de départ ainsi que ses dérivés (lemmes)  : « matel »

Cela me permet de donner plus de poids aux autres expressions.

Je calcule le score de chaque mot

# je calcule le score
for ( i in 1:nrow(mots))
{
  listeExpressionAvec <- filter(keywords, grepl(paste("^",mots$word[i]," | ",mots$word[i]," | ",mots$word[i],"$",sep=""),keywords$Keyword))
  score <- as.integer(summarise(listeExpressionAvec,volumeRecherche = sum(listeExpressionAvec$Search.Volume))[1])
  
  mots$score[i] <- score
}

Pour chaque mot :

  • Je retrouve les expressions qui le compose
  • Je calcule le score : somme de volumes de recherche des expressions comportant un mot donné

Je génère mon tagcloud

# Je génère mon tagcloud
set.seed(1234)
wordcloud(words = mots$word, freq = mots$score, min.freq = 1,
          max.words=200, random.order=FALSE, rot.per=0.35, 
          colors=brewer.pal(8, "Dark2"))

Le résultat

Je récupère un joli tagcloud avec tous les termes associés au mot clé que j’ai souhaité analyser. Visuellement c’est simple à analyser.

tag cloud sémantique "matelas"Plus un mot est gros plus il est fréquemment associé au mot clé « matelas » dans les recherches des internautes sur Google.

Conclusion

Encore une fois, avec un script assez court, on arrive à automatiser une action qui peut prendre du temps, surtout si on réalise plusieurs fois la même analyse.

Ce type d’analyse est vraiment utile pour :

  • Définir les contenus / pages à créer
  • Créer le contenu de vos fiches produits
  • Créer un cocon sémantique ( ici je conseille de faire une analyse par niveau)

Le must serait de récupérer les données via l’API de semrush pour ne plus avoir à faire d’export manuel 😉

Le script complet

# Installer
#install.packages("tm")  # pour le text mining
#install.packages("SnowballC") # pour le text stemming
#install.packages("wordcloud") # générateur de word-cloud 
#install.packages("RColorBrewer") # Palettes de couleurs
#install.packages("dplyr") # Palettes de couleurs

# Charger

library("wordcloud")
library("RColorBrewer")
library("tm")
library("dplyr")

#Je charge le fichier
keywords <- read.csv(file="C:/Users/greg/Downloads/matelas-phrase_fullsearch-fr.csv", header=TRUE, sep=";",encoding = "UTF-8")

# Je filtre pour éviter le bruit
#keywords <- filter(keywords, keywords$Search.Volume >300)


# Je crée un corpus
dfCorpus = Corpus(VectorSource(keywords$Keyword)) 
dtm <- TermDocumentMatrix(dfCorpus)

m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)

mots <- data.frame(word = names(v))

# Je retire les termes contenus dans ma recherche
mots <- filter(mots,!grepl("matel",mots$word))

# je calcule le score
for ( i in 1:nrow(mots))
{
  listeExpressionAvec <- filter(keywords, grepl(paste("^",mots$word[i]," | ",mots$word[i]," | ",mots$word[i],"$",sep=""),keywords$Keyword))
  score <- as.integer(summarise(listeExpressionAvec,volumeRecherche = sum(listeExpressionAvec$Search.Volume))[1])
  
  mots$score[i] <- score
}

# Je génère mon tagcloud
set.seed(1234)
wordcloud(words = mots$word, freq = mots$score, min.freq = 1,
          max.words=200, random.order=FALSE, rot.per=0.35, 
          colors=brewer.pal(8, "Dark2"))

 

Comme d’habitude n’hésitez pas à commenter / partager cet article.

2 réflexions au sujet de « Identifier les co-occurrences avec R »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *