OgO
  olivier godechot

Des fonctions pour faire de l’analyse textuelle sous R

La fonction anatext permet de faire un dénombrement des mots, des segments de deux ou trois mots d’une variable textuelle d’une base ou d’un fichier texte. La fonction wordcount permet de compter un mot ou une expression dans une variable textuelle.

 

Utilisation d’anatext

Avec un fichier texte :
t<-anatext(textfile="d:/monrep/proust.txt")
t$wordnb

Avec une variable textuelle :
t<-anatext(base$vartext)
t$wordnb

Options :

x:

Variable textuelle à analyser.
Défaut : NULL

textfile :

Indication du fichier texte (.txt) à analyser.
Défaut : NULL

sep :

Indicateur du séparateur de ligne dans le fichier txt.
Défaut : " "

septxt :

Si vous avez plusieurs textes à comparer, il existe désormais une nouvelle options : septxt="" où vous indiquez votre séparateur de texte (que vous aurez utilisé préalablement dans votre fichier pour séparer vos textes). Le mieux est de mettre une suite de caractère comme "$$$" ou "###" qui n’est pas constituée de signes de ponctuation (déjà éliminés) et qui n’est pas présent dans votre fichier. La casse, est la casse finale (tout en majuscule par défaut). Cette variable permet la construction d’une variable de numérotation des textes t$text$numtxt dans le tableau lexical entier.
Défaut : NULL

upcase :

Texte mis en majuscule.
Défaut: TRUE

del.punctuation:

Suppression de la ponctuation.
Défaut: TRUE

del.accents:

Suppression des accents.
Défaut: TRUE

keep

Conserver une variable de la base de données
Défaut: NULL

max.merge.size=50000

Taille maximale du tableau lexical entier pour laquelle on refusionne pour chaque mot sa fréquence dans le corpus.

CODE DES FONCTIONS

simplelag <-function(x,mylag=1,outside=NA)
{
myend<-length(x)- mylag
y<-c(replicate(mylag,outside),x[1:myend])
}

forward<-function(x,myforward=1,outside=NA)
{
mystart<-myforward+1
y<-c(x[mystart:length(x)],replicate(myforward,outside))
}

anatext <- function (x,textfile=NULL,sep="\n",upcase=TRUE,del.punctuation=TRUE,
del.accents=TRUE,keep=NULL,max.merge.size=50000) {
if (!is.null(textfile))
{
tfile<-as.data.frame(scan(file=textfile,sep=sep,what=list(word="")))
x<-tfile$word
}

VARTEXT <- chartr("\"“”‘’","««»''",x)

if (upcase==TRUE)
{
VARTEXT<-toupper(VARTEXT)
}
if (del.accents==TRUE)
{
VARTEXT <- chartr("ÀÂÄÉÊÈËÇÎÏÔÖÛÜÙàâäéêèëçîïôöûüù",
"AAAEEEECIIOOUUUaaaeeeeciioouuu", VARTEXT)
}
if (del.punctuation==FALSE)
{
VARTEXT <- gsub("(['().,;:!?«»—–…/])", " \\1 ", VARTEXT)
VARTEXT <- gsub("\\[", " [ ", VARTEXT)
VARTEXT <- gsub("\\]", " ] ", VARTEXT)
VARTEXT <- gsub("-", " - ", VARTEXT)

}
if (del.punctuation==TRUE)
{
VARTEXT <- gsub("(['().,;:!?«»—–…/])", " ", VARTEXT)
VARTEXT <- gsub("\\[", " ", VARTEXT)
VARTEXT <- gsub("\\]", " ", VARTEXT)
VARTEXT <- gsub("-", " ", VARTEXT)
}
VARTEXT <- gsub("  ", " ", VARTEXT)

names(VARTEXT) <- paste(1:length(VARTEXT),"#")
VARTEXT <- sapply(VARTEXT,strsplit, " ")

TLE <- unlist(VARTEXT)
TLE <- data.frame(id=substr(names(TLE),1,regexpr("#",names(TLE))-1),
idorder=substr(names(TLE),regexpr("#",names(TLE))+1,nchar(names(TLE))),
words=TLE)

TLE$id<-as.numeric(as.character(TLE$id))
TLE$idorder<-as.numeric(as.character(TLE$idorder))

TLE$words<-as.character(TLE$words)

TLE$id==simplelag(TLE$id)

TLE$lid=simplelag(TLE$id,outside=0)
TLE$fid=forward(TLE$id,outside=0)

TLE$segment2<-paste(simplelag(TLE$words),TLE$words)
TLE$segment3<-paste(TLE$segment2,forward(TLE$words))

TLE$segment2[TLE$lid != TLE$id ]<-NA
TLE$segment3[TLE$fid != TLE$id | TLE$lid != TLE$id]<-NA

WORDCOUNT<-table(TLE$words)
WORDCOUNT<-data.frame(WORDCOUNT)
WORDCOUNT$nchar<-nchar(as.character(WORDCOUNT$Var1))
WORDCOUNT<-WORDCOUNT[order(WORDCOUNT$Freq),]

SEGM2COUNT<-table(TLE$segment2)
SEGM2COUNT<-data.frame(SEGM2COUNT)
SEGM2COUNT<-SEGM2COUNT[order(SEGM2COUNT$Freq),]

SEGM3COUNT<-table(TLE$segment3)
SEGM3COUNT<-data.frame(SEGM3COUNT)
SEGM3COUNT<-SEGM3COUNT[order(SEGM3COUNT$Freq),]

if (length(TLE$words)<max.merge.size)
{
TLE<-merge(TLE,WORDCOUNT,by.x="words",by.y="Var1")
}

if (!is.null(keep))
{
KEEP<-as.data.frame(keep)
KEEP$one<-1
KEEP$mergid<-cumsum(KEEP$one)

TLE<-merge(TLE,KEEP,by.x="id",by.y="mergid")
}

TLE$nchar<-nchar(TLE$words)

TLE<-TLE[order(TLE$id,TLE$idorder),]

TLE<-TLE[,-which(names(TLE) %in% c("lid","fid"))]

structure(list(text=TLE,wordnb=WORDCOUNT,s2nb=SEGM2COUNT,s3nb=SEGM3COUNT))
}


wordcount <- function (pattern,x,dich=FALSE,upcase=TRUE,del.punctuation=FALSE,del.accents=FALSE,keep=NULL) {

if (substr(pattern,1,1)!="*")
{pattern<-paste(" ",pattern,sep="")}
else {
pattern<-substr(pattern,2,nchar(pattern))
}
if (substr(pattern,nchar(pattern),nchar(pattern))!="*")
{pattern<-paste(pattern," ",sep="")}
else {
pattern<-substr(pattern,1,nchar(pattern)-1)
}

VARTEXT <- paste(" ",chartr("\"“”‘’","««»''",x)," ",sep="")

if (upcase==TRUE)
{
VARTEXT<-toupper(VARTEXT)
}
if (del.accents==TRUE)
{
VARTEXT <- chartr("ÀÂÄÉÊÈËÇÎÏÔÖÛÜÙàâäéêèëçîïôöûüù",
"AAAEEEECIIOOUUUaaaeeeeciioouuu", VARTEXT)
}
if (del.punctuation==FALSE)
{
VARTEXT <- gsub("(['().,;:!?«»—–…/])", " \\1 ", VARTEXT)
VARTEXT <- gsub("\\[", " [ ", VARTEXT)
VARTEXT <- gsub("\\]", " ] ", VARTEXT)
VARTEXT <- gsub("-", " - ", VARTEXT)
}
if (del.punctuation==TRUE)
{
VARTEXT <- gsub("(['().,;:!?«»—–…/])", " ", VARTEXT)
VARTEXT <- gsub("\\[", " ", VARTEXT)
VARTEXT <- gsub("\\]", " ", VARTEXT)
VARTEXT <- gsub("-", " ", VARTEXT)
}
if (dich==TRUE)
{
((nchar(VARTEXT)-nchar(gsub(pattern, "", VARTEXT)))/nchar(pattern)>0)*1
}

else
{
(nchar(VARTEXT)-nchar(gsub(pattern, "", VARTEXT)))/nchar(pattern)
}
}



English | Français

Actualités   

OgO: plus ici|more here

[Work in progress] Godechot, Olivier and Ulysse Lojkine. Intensification through outsourcing ...: plus ici|more here

[Presentations] ...: plus ici|more here

[Peer-reviewed articles] Godechot, Olivier, Mirna Safi, and Matthew Soener. 2025. “Organisational Intersectionality: Do Gender and Migration Status Inequalities Reinforce or Offset ...: plus ici|more here

[Books] Palier, Bruno et al.. 2023. Que sait-on du travail?, [What do we know about work?], Presses de Sciences ...: plus ici|more here

[Peer-reviewed articles] Godechot, Olivier, Donald Tomaskovic-Devey, István Boza, Lasse Folke Henriksen, Are Skeie Hermansen, Feng Hou, Jiwook Jung, Naomi Kodama, ...: plus ici|more here

[Working papers] Neumann, Nils, Olivier Godechot, Lasse Folke Henriksen, Are Skeie Hermansen, Feng Hou, Naomi Kodama, Zoltán Lippényi, Silvia Maja Melzer, ...: plus ici|more here

[Data] Données et scripts pour les fissures de la digue républicaine Dans notre article "Les fissures de la digue républicaine", nous ...: plus ici|more here

[Data] Replication package for the Great Separation The Great Separation is based on fine-grained administrative data that cannot be published ...: plus ici|more here

[Home] Recherches en cours: plus ici|more here

[Webmestre]

[Fil rss]

[V. 0.93]
HOP

Système d'aide à la publication sur Internet