Conte o número de todas as palavras em uma string

Existe uma function para contar o número de palavras em uma string? por exemplo

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

para devolver um resultado de 7

Obrigado.

Você pode usar funções sapply e sapply

 sapply(strsplit(str1, " "), length) 

Use o símbolo de expressão regular \\W para corresponder a caracteres que não sejam de palavras, usando + para indicar um ou mais em uma linha, juntamente com gregexpr para localizar todas as correspondências em uma string. Palavras são o número de separadores de palavras mais 1.

 lengths(gregexpr("\\W+", str1)) + 1 

Isso falhará com strings em branco no início ou no final do vetor de caracteres, quando uma “palavra” não satisfizer a noção \\W de não-palavra (pode-se trabalhar com outras expressões regulares, \\S+ , [[:alpha:]] , etc., mas sempre haverá casos de borda com uma abordagem regex), etc. É provavelmente mais eficiente que strsplit soluções strsplit , que alocarão memory para cada palavra. Expressões regulares são descritas em ?regex .

Atualizar Conforme observado nos comentários e em uma resposta diferente por @Andri, a abordagem falha com sequências de caracteres (zero) e de uma palavra e com pontuação à direita

 > str1 = c("", "x", "xy", "xy!" , "xy! z") > lengths(gregexpr("[Az]\\W+", str1)) + 1L [1] 2 2 2 3 3 

Muitas das outras respostas também falham nesses casos ou em casos similares (por exemplo, vários espaços). Eu acho que a resposta da minha resposta sobre ‘noção de uma palavra’ na resposta original abrange problemas com pontuação (solução: escolha uma expressão regular diferente, por exemplo, [[:space:]]+ ), mas os casos zero e uma palavra são um problema; @ A solução de Andri não consegue distinguir entre zero e uma palavra. Então, tendo uma abordagem “positiva” para encontrar palavras pode-se

 sapply(gregexpr("[[:alpha:]]+", str1), function(x) sum(x > 0)) 

Levando a

 > sapply(gregexpr("[[:alpha:]]+", str1), function(x) sum(x > 0)) [1] 0 1 2 2 3 

Novamente, a expressão regular pode ser refinada para diferentes noções de “palavra”.

Eu gosto do uso de gregexpr() porque é eficiente em termos de memory. Uma alternativa usando strsplit() (como @ user813966, mas com uma expressão regular para delimitar palavras) e fazendo uso da noção original de delimitar palavras é

 > lengths(strsplit(str1, "\\W+")) [1] 0 1 2 2 3 

Isso precisa alocar nova memory para cada palavra que é criada e para a lista de palavras intermediárias. Isso pode ser relativamente caro quando os dados são “grandes”, mas provavelmente são eficazes e compreensíveis para a maioria das finalidades.

A maneira mais simples seria:

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

… contando todas as seqüências em caracteres não espaciais ( \\S+ ).

Mas o que dizer de uma pequena function que nos permite também decidir que tipo de palavras gostaríamos de contar e que funciona também em vetores inteiros ?

 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 
 str2 <- gsub(' {2,}',' ',str1) length(strsplit(str2,' ')[[1]]) 

O gsub(' {2,}',' ',str1) garante que todas as palavras sejam separadas por apenas um espaço, substituindo todas as ocorrências de dois ou mais espaços por um espaço.

O strsplit(str,' ') divide a sentença em cada espaço e retorna o resultado em uma lista. O [[1]] pega o vetor de palavras dessa lista. O length conta quantas palavras.

 > 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 

Eu uso a function stringr biblioteca stringr com a seqüência de escape \w que representa:

qualquer caractere de ‘palavra’ (letra, dígito ou sublinhado na localidade atual: no modo UTF-8 somente letras e dígitos ASCII são considerados)

Exemplo:

 > str_count("How many words are in this sentence", '\\w+') [1] 7 

De todas as outras 9 respostas que eu pude testar, apenas duas (por Vincent Zoonekynd e por petermeissner) funcionaram para todas as inputs apresentadas até agora, mas elas também requerem stringr .

Mas só esta solução funciona com todos os insumos apresentados até agora, além de insumos como "foo+bar+baz~spam+eggs" ou "Combien de mots sont dans cette phrase ?" .

Referência:

 library(stringr) questions <- c( "", "x", "xy", "xy!", "xy! z", "foo+bar+baz~spam+eggs", "one, two three 4,,,, 5 6", "How many words are in this sentence", "How many words are in this sentence", "Combien de mots sont dans cette phrase ?", " Day after day, day after day, We stuck, nor breath nor motion; " ) answers <- c(0, 1, 2, 2, 3, 5, 6, 7, 7, 7, 12) score <- function(f) sum(unlist(lapply(questions, f)) == answers) funs <- c( function(s) sapply(gregexpr("\\W+", s), length) + 1, function(s) sapply(gregexpr("[[:alpha:]]+", s), function(x) sum(x > 0)), function(s) vapply(strsplit(s, "\\W+"), length, integer(1)), function(s) length(strsplit(gsub(' {2,}', ' ', s), ' ')[[1]]), function(s) length(str_match_all(s, "\\S+")[[1]]), function(s) str_count(s, "\\S+"), function(s) sapply(gregexpr("\\W+", s), function(x) sum(x > 0)) + 1, function(s) length(unlist(strsplit(s," "))), function(s) sapply(strsplit(s, " "), length), function(s) str_count(s, '\\w+') ) unlist(lapply(funs, score)) 

Saída:

 6 10 10 8 9 9 7 6 6 11 

Você pode usar str_match_all , com uma expressão regular que identifique suas palavras. O seguinte trabalha com espaços iniciais, finais e duplicados.

 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]]) 

Experimente esta function do pacote stringi

  require(stringi) > s <- c("Lorem ipsum dolor sit amet, consectetur adipisicing elit.", + "nibh augue, suscipit a, scelerisque sed, lacinia in, mi.", + "Cras vel lorem. Etiam pellentesque aliquet tellus.", + "") > stri_stats_latex(s) CharsWord CharsCmdEnvir CharsWhite Words Cmds Envirs 133 0 30 24 0 0 

Você pode usar a function wc no qdap da biblioteca:

 > str1 <- "How many words are in this sentence" > wc(str1) [1] 7 

Você pode remover espaços duplos e contar o número " " da string para obter a contagem de palavras. Use stringr e rm_white { qdapRegex }

 str_count(rm_white(s), " ") +1 

Tente isso

 length(unlist(strsplit(str1," "))) 

A solução 7 não fornece o resultado correto no caso de haver apenas uma palavra. Você não deve apenas contar os elementos no resultado do gregexpr (que é -1 se não houver correspondência), mas contar os elementos> 0.

Ergo:

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

Use nchar

se vetor de cadeias é chamado x

 (nchar(x) - nchar(gsub(' ','',x))) + 1 

Descubra o número de espaços e adicione um

require (stringr) str_count (x, “\ w +”) # ficará bem com espaços duplos / triplos entre palavras

Todas as outras respostas têm problemas com mais de um espaço entre as palavras.

Também do pacote stringi , a function direta stri_count_words

 stringi::stri_count_words(str1) #[1] 7