Я использую функцию 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 ?"
.
Benchmark:
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