105 votes

Compter le nombre de mots d'une chaîne dans R?

Existe-t-il une fonction pour compter le nombre de mots dans une chaîne? par exemple

 str1 <- "How many words are in this sentence"
 

pour retourner un résultat de 7

Merci.

82voto

Martin Morgan Points 19965

Utiliser l'expression régulière symbole \\W de match non-caractères de mot, à l'aide de + à indiquer un ou plus dans une rangée, avec gregexpr trouver tous les matchs dans une chaîne de caractères. Les mots sont le nombre de séparateurs de mots de plus de 1.

sapply(gregexpr("\\W+", str1), length) + 1

Ceci ne fonctionnera pas avec des chaînes vides au début ou à la fin d'un caractère de vecteur, lors d'un "mot" n'est pas satisfaire \\Ws'notion de non-mot (on pourrait travailler avec d'autres expressions régulières, \\S+, [[:alpha:]], etc., mais il y aura toujours des cas limites avec une regex approche), etc. Il est probablement plus efficace que l' strsplit solutions, qui permettra d'allouer de la mémoire pour chaque mot. Les expressions régulières sont décrites en ?regex.

62voto

marvin_dpr Points 625

Le moyen le plus simple serait:

 require(stringr)
str_count("one,   two three 4,,,, 5 6", "\\S+")
 

... en comptant toutes les séquences sur des caractères non-espace ( \\S+ ).

Mais qu'en est-il d'une petite fonction qui nous permet également de décider quel type de mots nous aimerions compter et qui fonctionne également sur des vecteurs entiers ?

 require(stringr)
nwords <- function(string, pseudo=F){
  ifelse( pseudo, 
          pattern <- "\\S+", 
          pattern <- "[[:alpha:]]+" 
        )
  str_count(string, pattern)
}

nwords("one,   two three 4,,,, 5 6")
# 3

nwords("one,   two three 4,,,, 5 6", pseudo=T)
# 6
 

18voto

mathematical.coffee Points 23150
 str2 <- gsub(' {2,}',' ',str1)
length(strsplit(str2,' ')[[1]])
 

Le gsub(' {2,}',' ',str1) s'assure que tous les mots sont séparés par un seul espace, en remplaçant toutes les occurrences de deux ou plusieurs espaces par un seul espace.

Le strsplit(str,' ') divise la phrase à chaque espace et renvoie le résultat dans une liste. Le [[1]] saisit le vecteur de mots de cette liste. Le length compte le nombre de mots.

 > str1 <- "How many words are in this     sentence"
> str2 <- gsub(' {2,}',' ',str1)
> str2
[1] "How many words are in this sentence"
> strsplit(str2,' ')
[[1]]
[1] "How"      "many"     "words"    "are"      "in"       "this"     "sentence"
> strsplit(str2,' ')[[1]]
[1] "How"      "many"     "words"    "are"      "in"       "this"     "sentence"
> length(strsplit(str2,' ')[[1]])
[1] 7
 

14voto

Vincent Zoonekynd Points 19310

Vous pouvez utiliser str_match_all , avec une expression régulière qui identifierait vos mots. Ce qui suit fonctionne avec les espaces initiaux, finaux et dupliqués.

 library(stringr)
s <-  "
  Day after day, day after day,
  We stuck, nor breath nor motion;
"
m <- str_match_all( s, "\\S+" )  # Sequences of non-spaces
length(m[[1]])
 

5voto

Andri Points 31

La solution 7 ne donne pas le résultat correct dans le cas où il n'y a qu'un seul mot. Vous ne devez pas simplement compter les éléments dans le résultat de gregexpr (qui est -1 s'il n'y a pas de correspondance) mais compter les éléments> 0.

Ergo:

 sapply(gregexpr("\\W+", str1), function(x) sum(x>0) ) + 1 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X