Text mining avec R
Cet article est une ébauche à compléter. Une ébauche est une entrée ayant un contenu (très) maigre et qui a donc besoin d'un auteur.
Voir aussi:
Introduction
tm est le paquet "text mining" les plus populaire de R et il faut l'installer si nécessaire.
Pour l'utiliser:
library(tm)
Si nécessaire, installez ce paquet avec R-Studio ou tapez:
install.packages("tm")
Autre packages utiles
- stringi (permet de manipuler des chaines de caractères)
- proxy (analyses de proximités)
Importation de documents
Le paquet tm est conçu pour marcher avec une variété de formats: textes simples, articles/papiers en PDF ou Word, documents Web (HTML, XML, SGML), etc.
Les corpus
Le Corpus
est la structure R qui représente une collection de documents que l'on veut analyser. Cette structure doit être construite en important des données et/ou en tapant des données.
Il existe 2 versions:
- VCorpus (volatile, lorsqu'on arrête R, il faut la refaire ...
- PCorpus (endroit unique où le corpus est stocké)
Pour construire un corpus, il faut donner deux arguments
- Identifier un type de 'source de données: soit
DataframeSource
,DirSource
,URISource
,vectorSource
ouXMLSource
- Definir le reader, c-a-d. on manière dont le texte est lu avec
readerControl
, notammentreadDOC
,readPDF
,readPlain
,readXML
,readTabular
.
Demander à R des informations concernant le type de sources et de readers:
getReaders() # affiche toute la liste de readers
getSources() # affiche la liste des types de sources
Chaque source possède un lecteur (reader) par défaut. Par exemple pour DirSource
, c'est readPlain
.
Exemple lecture de fichiers textes du tutoriel officiel en format UTF-8
Ces fichiers se trouvent déjà dans l'installation de R, d'où l'utilisation de system.file
# Tester si un répertoire existe et retourner son nom complet
# Tester et stocker le nom d´un sous-répertoire tm/texts/txt dans votre bibliothèque système
txt <- system.file("texts", "txt", package = "tm")
# Charger le texte de chaque fichier
ovid <- VCorpus(DirSource(txt, encoding = "UTF-8"), readerControl = list(language = "lat"))
Inspection et utilisation de corpus
Pour vérifier les contenus on peut afficher le tout ou encore juste quelques éléments, par exemple:
# print a short overview
print(ovid)
# show all
inspect(ovid)
ovid
# display the second document
ovid[[2]]
Exemple lecture de fichiers locaux
Pour lire un ensemble de fichier locaux,on conseille de les mettre dans un sous-répertoire d'un répertoire pour le text mining.
(1) Définissez le working directory
# lister
getwd()
[1] "C:/Users/dschneid/Documents"
# changer le répertoire de travail
setwd "C:/dks/R"
On peut utiliser la fonction file.path pour indiquer ou trouver les fichiers. Si sous Windows, les fichiers se trouvent dans D:\data\exemples\txt
, utilisez du code comme chemin <- file.path("d:", "data", "exemples", "txt")
. Pour indiquer un sous-répertoire du répertoire courant, utilise qc. comme file.path (".", "textes")
. Enfin, avec une syntaxe "Unix" cela marchera aussi: D:/data/exemples/txt
Voici un exemple plus concret pour Unix ou j'ai mis un certain nombre de documents *.text/txt simples dans un répertoire ~/schneide/methodo/R/ex"·
On vérifie le working directory
> getwd() [1] "/home/schneide"
On définit le chemin:
dirr <- file.path ("schneide", "methodo", "R", "ex")
On regarde ce qui a dedans:
> dir (dirr) [1] "how-to-get-a-phd.text" [2] "In-the-beginning-was-the-command-line-Stephenson.txt" [3] "logic-and-qual-res.text" ...
On crée un corpus
library(tm) corpus0 <- Corpus(DirSource(dirr))
Lire du PDF et du WORD
Il existe des filtres (readers) pour ces 2 types de documents (pas testés). A tester, il est possible qu'il vaut mieux enregistrer Word comme PDF et ensuite utiliser le filtre PDF.
chemin <- file.path ("...") corp <- Corpus (DirSource (chemin), readerControl=list (reader=readDOC)) corp <- Corpus (DirSource (chemin), readerControl=list (reader=readPDF))
Aspirer une page web
Aspirer une page MediaWiki
Les MediaWiki ont une API qui autorise l'extraction de contenus de pages, un bon exemple est ce wiki:
Afficher l'API:
http://edutechwiki.unige.ch/fmediawiki/api.php
Exemple: Contenu d'une page sous format XML (qu'il va aussi falloir nettoyer, mais moins)
http://edutechwiki.unige.ch/fmediawiki/api.php?action=parse&page=Civilization&format=xml
Transformations
Il existe un certain nombre de fonctions qui permet de "nettoyer" le texte
Partant avec un corpus, appelé corpus0
, on peut effectuer plusieurs opérations, par exemple:
- stripWhitespace()
- Enlève les blancs en trop
corpus1 <- tm_map(corpus0, stripWhitespace)
- tolower();
- Met tous les mots en minuscules
corpus2 <- tm_map(corpus1, tolower)
- removeWords(....),
- Enlever des mots
- Par exemple des stopwords en Anglais:
corpus3 <- tm_map(corpus2, removeWords, stopwords("english"))
- ou en français:
corpus5 <- tm_map(corpus3, removeWords, stopwords("french"))
- Par exemple une liste de mots: code>xxx = tm_map(corpus2, removeWords, c("Daniel", "Kaspar", "TECFA"))
- removePunctuation()
- Enlever les ponctuations
- Remplacer des caractères (merci à Graham Williams)
for (j in seq (corpus0) {
docs[[j]] <- gsub ("/", ," ", docs[[j]])
docs[[j]] <- gsub ("@", ," ", docs[[j]])
......
}
Evidémment on peut aussi utiliser des expression régulières, par exemple une qui tue les balises XML/HTML
gsub("<.*/>","",string)
- removeNumber()
- Enlever des nombres
- stemDocument()
- Faire du stemming
library(SnowballC)
corpus9 = <code>stemDocument(corpusx, language = meta(corpusx, "language"))</code>
Méthodes d'analyse
.....
Exemple EduTechWiki
(en construction !!)
Cet exemple est directement inspiré par le billet Text mining in R – Automaticcategorization of Wikipedia articles de Norbert Ryciak.
Prérequis
Il faut avoir les librairies stringi, proxi et tm. Donc si nécessaire, il faut les installer. Par exemple, en ligne de commande:
install.packages("proxy")
Importer les documents
On peut directement importer des pages html (donc des pages wiki):
library(tm)
library(stringi)
library(proxy)
# le nom du wiki
wiki <- "http://edutechwiki.unige.ch/fr/"
# une liste de noms de pages
titles <- c("STIC:STIC_I_-_exercice_1_(Utopia)", "STIC:STIC I - exercice 1 (Nestor-Pixel)",
"STIC:STIC_I_-_exercice_2_(Utopia)",
"STIC:STIC III (2012)/Module 1", "STIC:STIC III (2012)/Module 2")
# un vecteur qui contient 5 strings vides ("")
articles <- character(length(titles))
# lecture des contenus des pages wiki. Chaque article se trouvera dans un des string ci-dessous.
for (i in 1:length(titles)) {
articles[i] <- stri_flatten(readLines(stri_paste(wiki, titles[i])), col = "")
}
# Création d un corpus avec les articles
docs <- Corpus(VectorSource(articles))
Liens
Articles d'introduction
- Ingo Feiner (2014). Introduction to the tm Package Text Mining in R, http://cran.r-project.org/web/packages/tm/vignettes/tm.pdf
- Official "vignette" (introductory text included with the package). Quote: “This vignette gives a short introduction to text mining in R utilizing the text mining framework provided by the tm package. We present methods for data import, corpus handling, preprocessing, metadata management, and creation of term-document matrices.”
- Ingo Feinerer, Kurt Hornik, David Meyer (2008). Text Mining Infrastructure in R, Journal of Statistical software, Vol. 25, Issue 5, http://www.jstatsoft.org/v25/i05/ (open contents)
- Article complet par les auteurs du package et qui introduit le paquet tm (version 2008). Il contient aussi des exemples.
- Stefan Theussl, Ingo Feinerer & Kurt Hornik, Distributed Text Mining with tm, http://www.rinfinance.com/agenda/2010/Theussl+Feinerer+Hornik.pdf
- Aussi par les auteurs, contient des exemples différents.
- Grahan Williams, 2004). Data Science with R Text Mining, http://onepager.togaware.com/TextMiningO.pdf
- Alternative et complément au tutoriel officiel, un peu plus systématique. A mon avis le meilleur texte pour commencer - Daniel K. Schneider (discussion) 1 octobre 2014 à 20:34 (CEST)
- Jon Starkweather, Introduction to basic Text Mining in R, http://it.unt.edu/benchmarks/issues/2014/01/rss-matters
- Assez utile pour débuter
Exemples et/ou textes informels
- Text mining with R (slides) by Aleksei Beloshytski
- Montre (superficiellement) notamment comment analyser un blog, c'est à dire extraire les contenus, puis extraire les thèmes les plus populaires, clustering, etc.
- Text mining in R – Automatic categorization of Wikipedia articles par Norbert Ryciak, Juin 2014, article en ligne.
- Bref billet qui montre l'essentiel de ce qu'il faut savoir pour commencer à analyser EduTechwiki
- Ceci dit, le code ne semble plus marcher "tel quel" ....