有没有一个函数可以计算字符串中的单词数? 例如:
str1 <- "How many words are in this sentence"
返回结果 7。
最佳答案
使用正则表达式符号 \\W
匹配非单词字符,使用 +
表示一行中的一个或多个,以及 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
这需要为创建的每个单词以及中间单词列表分配新的内存。当数据“大”时,这可能相对昂贵,但对于大多数用途来说,它可能是有效且易于理解的。
关于r - 计算字符串中所有单词的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8920145/