r - 计算字符串中所有单词的数量

标签 r string word-count

有没有一个函数可以计算字符串中的单词数? 例如:

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/

相关文章:

java - 为什么我的性格和字数不符?

r - 如何用R中的另一个字符串替换由开始和结束索引定义的字符串?

r - 使用 `$` 运算符的准引用

python - 如何在 string.replace 中输入正则表达式?

java - 从字符串形成回文

python - python 中的字数统计

rPlot 工具提示问题

r - 无法在 Ubuntu 20.04 上的 Rstudio 中加载已安装的软件包 : sh: 1: make: not found

mysql - REPLACE() 替换多个值并使用结果 IN()

python-2.7 - 如何在没有拥挤图像的情况下使用 pytagcloud 构建干净的词云 - Python