Подтвердить что ты не робот

Подсчитайте количество всех слов в строке

Есть функция для подсчета количества слов в строке? Например:

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

чтобы вернуть результат 7.

4b9b3361

Ответ 1

Вы можете использовать функции strsplit и sapply

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

Ответ 2

Используйте символ регулярного выражения \\W для сопоставления gregexpr символов, используйте + чтобы указать один или несколько в строке, вместе с gregexpr чтобы найти все совпадения в строке. Слова - это количество разделителей слов плюс 1.

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

Это не удастся с пустыми строками в начале или конце символьного вектора, когда "слово" не удовлетворяет понятию \\W не-слова (можно работать с другими регулярными выражениями, \\S+, [[:alpha:]] и т.д., но всегда будут крайние случаи с подходом регулярных выражений) и т.д. Это, вероятно, более эффективно, чем решения strsplit, которые будут выделять память для каждого слова. Регулярные выражения описаны в ?regex.

Обновление Как отмечено в комментариях и в другом ответе @Andri, подход терпит неудачу с (ноль) и однословными строками, и с конечной пунктуацией

str1 = c("", "x", "x y", "x y!" , "x y! z")
lengths(gregexpr("[A-z]\\W+", str1)) + 1L
# [1] 2 2 2 3 3

Многие из других ответов также терпят неудачу в этих или подобных (например, в нескольких пробелах) случаях. Я думаю, что мой ответ на предостережение о "понятии одного слова" в исходном ответе охватывает проблемы с пунктуацией (решение: выберите другое регулярное выражение, например, [[:space:]]+), но случаи с нулем и одним словом являются проблема; Решение @Andri не может различить ноль и одно слово. Поэтому, применяя "позитивный" подход к поиску слов, можно

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

Ведущий к

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

Опять же, регулярное выражение может быть уточнено для разных понятий "слово".

Мне нравится использование gregexpr() потому что оно эффективно использует память. Альтернативой использования strsplit() (например, @user813966, но с регулярным выражением для разграничения слов) и использования исходного понятия разграничения слов является

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

Для этого необходимо выделить новую память для каждого создаваемого слова и для промежуточного списка слов. Это может быть относительно дорого, когда данные "большие", но, вероятно, они эффективны и понятны для большинства целей.

Ответ 3

Самый простой способ:

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

... подсчет всех последовательностей на непространственных символах (\\S+).

Но как насчет небольшой функции, которая позволяет нам также решить какие слова, которые мы хотели бы подсчитать, а какие работают на целых векторах?

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

Ответ 4

Я использую функцию str_count из библиотеки stringr с escape-последовательностью \w которая представляет:

любой символ слова (буква, цифра или подчеркивание в текущем регионе: в режиме UTF-8 учитываются только буквы и цифры ASCII)

Пример:

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

Из всех остальных 9 ответов, которые я смог проверить, только два (по Винсенту Зоонекинду и Петерменснеру) работали на все представленные здесь материалы, но они также требуют stringr.

Но только это решение работает со всеми представленными до сих пор входы, а также такими входами, как "foo+bar+baz~spam+eggs" или "Combien de mots sont dans cette phrase?" ,

Ориентир:

library(stringr)

questions <-
  c(
    "", "x", "x y", "x y!", "x y! 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))

Выход:

6 10 10  8  9  9  7  6  6 11

Ответ 5

str2 <- gsub(' {2,}',' ',str1)
length(strsplit(str2,' ')[[1]])

gsub(' {2,}',' ',str1) гарантирует, что все слова разделены только одним пробелом, заменив все вхождения двух или более пробелов на одно пространство.

strsplit(str,' ') разделяет предложение в каждом пространстве и возвращает результат в списке. [[1]] захватывает вектор слов из этого списка. length подсчитывает, сколько слов.

> 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

Ответ 6

Вы можете использовать str_match_all, с регулярным выражением, которое идентифицирует ваши слова. Следующее работает с начальным, окончательным и дублированным пространством.

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

Ответ 7

Попробуйте эту функцию из пакета 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 

Ответ 8

Вы можете использовать wc функцию в библиотеке qdap:

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

Ответ 9

Вы можете удалить двойные пробелы и подсчитать количество " " в строке, чтобы получить количество слов. Использовать stringr и rm_white { qdapRegex}

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

Ответ 10

Попробуйте это

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

Ответ 11

Решение 7 не дает правильного результата в том случае, когда имеется только одно слово. Вы не должны просто подсчитывать элементы в результате результата gregexpr (который равен -1, если там не совпадают), но подсчитайте элементы > 0.

Ergo:

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

Ответ 12

Кроме того, из stringi пакета, прямолинейной вперед функция stri_count_words

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

Ответ 13

требуют (stringr)

Определите очень простую функцию

str_words <- function(sentence) {

  str_count(sentence, " ") + 1

}

Проверьте

str_words(This is a sentence with six words)

Ответ 14

Используйте nchar

если вектор строк называется x

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

Найдите количество пробелов, затем добавьте один

Ответ 15

require(stringr)
str_count(x,"\\w+")

будет хорошо с двойными/тройными промежутками между словами

Все другие ответы имеют проблемы с более чем одним пробелом между словами.

Ответ 16

С помощью пакета stringr можно также написать простой скрипт, который может проходить вектор строк, например, через цикл for.

Пусть скажут

ДФ $ текст

содержит вектор строк, которые мы заинтересованы в анализе. Сначала мы добавляем дополнительные столбцы к существующему фрейму данных df, как показано ниже:

df$strings    = as.integer(NA)
df$characters = as.integer(NA)

Затем мы запускаем цикл for для вектора строк, как показано ниже:

for (i in 1:nrow(df)) 
{
   df$strings[i]    = str_count(df$text[i], '\\S+') # counts the strings
   df$characters[i] = str_count(df$text[i])         # counts the characters & spaces
}

Результирующие столбцы: строки и символ будут содержать количество слов и символов, и это будет достигнуто за один раз для вектора строк.

Ответ 17

Я нашел следующую функцию и регулярное выражение, полезные для подсчета слов, особенно при работе с одиночными и двойными дефисами, где первые обычно не должны рассматриваться как разрыв слов, например, хорошо известный hi-fi; в то время как двойной дефис является разделителем пунктуации, который не ограничен пробелами - например, для примечаний в скобках.

txt <- "Don't you think e-mail is one word--and not two!" #10 words
words <- function(txt) { 
length(attributes(gregexpr("(\\w|\\w\\-\\w|\\w\\'\\w)+",txt)[[1]])$match.length) 
}

words(txt) #10 words

Stringi - полезный пакет. Но в этом примере он переоценивает слова из-за дефиса.

stringi::stri_count_words(txt) #11 words