Есть функция для подсчета количества слов в строке? Например:
str1 <- "How many words are in this sentence"
чтобы вернуть результат 7.
Есть функция для подсчета количества слов в строке? Например:
str1 <- "How many words are in this sentence"
чтобы вернуть результат 7.
Вы можете использовать функции strsplit
и sapply
sapply(strsplit(str1, " "), length)
Используйте символ регулярного выражения \\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
Для этого необходимо выделить новую память для каждого создаваемого слова и для промежуточного списка слов. Это может быть относительно дорого, когда данные "большие", но, вероятно, они эффективны и понятны для большинства целей.
Самый простой способ:
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
Я использую функцию 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
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
Вы можете использовать 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]])
Попробуйте эту функцию из пакета 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
Вы можете использовать wc функцию в библиотеке qdap:
> str1 <- "How many words are in this sentence"
> wc(str1)
[1] 7
Вы можете удалить двойные пробелы и подсчитать количество " "
в строке, чтобы получить количество слов. Использовать stringr и rm_white
{ qdapRegex}
str_count(rm_white(s), " ") +1
Попробуйте это
length(unlist(strsplit(str1," ")))
Решение 7 не дает правильного результата в том случае, когда имеется только одно слово. Вы не должны просто подсчитывать элементы в результате результата gregexpr (который равен -1, если там не совпадают), но подсчитайте элементы > 0.
Ergo:
sapply(gregexpr("\\W+", str1), function(x) sum(x>0) ) + 1
Кроме того, из stringi
пакета, прямолинейной вперед функция stri_count_words
stringi::stri_count_words(str1)
#[1] 7
требуют (stringr)
Определите очень простую функцию
str_words <- function(sentence) {
str_count(sentence, " ") + 1
}
Проверьте
str_words(This is a sentence with six words)
Используйте nchar
если вектор строк называется x
(nchar(x) - nchar(gsub(' ','',x))) + 1
Найдите количество пробелов, затем добавьте один
require(stringr)
str_count(x,"\\w+")
будет хорошо с двойными/тройными промежутками между словами
Все другие ответы имеют проблемы с более чем одним пробелом между словами.
С помощью пакета 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
}
Результирующие столбцы: строки и символ будут содержать количество слов и символов, и это будет достигнуто за один раз для вектора строк.
Я нашел следующую функцию и регулярное выражение, полезные для подсчета слов, особенно при работе с одиночными и двойными дефисами, где первые обычно не должны рассматриваться как разрыв слов, например, хорошо известный 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