【问题标题】:Counting Words in vector计算向量中的单词
【发布时间】:2017-11-08 08:16:30
【问题描述】:

目前我已经注册了一门 R 课程,其中一个练习是构建一个 R 程序来计算字符串中的单词。我们不能使用函数table,但必须使用常规方法返回字符串中最流行单词的输出。 即狐狸跳过锥体并且... 所以程序必须返回“the”,因为它是最流行的短语。

到目前为止,我有以下内容:

string_read<- function(phrase) {

  phrase <- strsplit(phrase, " ")[[1]]
  for (i in 1:length(phrase)){
    phrase.freq <- ....
#if Word already exists then increase counter by 1

      }

我遇到了障碍,因为我不确定如何增加特定单词的计数器。谁能给我一个正确方向的指针?我的伪代码类似于:“对于循环的每个单词,将 wordIndex 增加 1。如果之前已经出现过单词,则增加 wordIndex 计数器。”

【问题讨论】:

  • 我知道有人问过类似的变体,但他们倾向于使用教学顾问排除的桌子、图书馆等。
  • 你了解 R 中的 list 数据结构了吗?我认为它可以很好地存储每个单词的计数。
  • 我们非常简要地介绍了它 - 但是我很高兴更深入地研究列表!我们在我相信的矩阵结构旁边介绍了这一点。
  • 好的,如果你记得你可以使用字符串设置和检索列表值,我想你会有一个好的开始,比如count_list[["fox"]] = 0; count_list[["fox"]] = count_list[["fox"]] + 1;
  • 我明白了!但唯一的问题是一个包含 X 多个元素的短语,我不能为每个排列创建一个列表,因为它不会是可扩展的?如有误解请见谅。

标签: r


【解决方案1】:

您从将字符串拆分为单词开始正确,然后我们使用sapply 循环每个单词并将向量中的相似单词相加。我使用tolower 假设此操作不区分大小写。

string_read<- function(phrase) {
   temp = tolower(unlist(strsplit(phase, " ")))
   which.max(sapply(temp, function(x) sum(x == temp)))
}

phrase <- "The fox jumped over the cone and the"

string_read(phrase)
#the 
#  1 

这会将输出作为单词及其索引位置返回,在这种情况下为 1。如果您只想要最大计数的单词,您可以将最后一行更改为

temp[which.max(sapply(temp, function(x) sum(x == temp)))]

【讨论】:

  • 您好 Ronak,感谢您提供的信息!我想试着了解你在这里做了什么。您已将字符串转换为小写操作,然后使用“”作为分隔符将其拆分。我刚刚查找了 unlist ,我看到它将列表转换为向量。但是,当您使用 strsplit 时,它不是已经矢量化了吗?
  • @azurekirby 基本上,unliststrsplit(phrase, " ")[[1]] 做同样的事情。它将list 转换为向量。
  • 我明白了。但是,如果您使用 is.vector(phrase) 它会返回 TRUE,所以当您使用 unlist 时,您不是对已经是向量的向量进行向量化吗?
  • @azurekirby 好的。所以phrase属于“字符”类,检查class(phrase),当我们做strsplit(phrase, " ")时,它是一个列表,检查class(strsplit(phase, " ")),所以当我们unlist或做[[1]]时,就像你的情况一样,我们转换它进入与原始即“字符”相同的类,检查 class(temp)class(strsplit(phrase, " ")[[1]]) 但现在唯一的区别是它的长度,检查 length(phrase)length(temp) 。希望它澄清。
  • 谢谢罗纳克。我和我的教练一起检查了这个,它可以工作,但是当我们尝试通过控制台线调用它时。即短语
【解决方案2】:

我们可以通过str_extract 做到这一点

library(stringr)
string_read<- function(str1) {
  temp <- tolower(unlist(str_extract_all(str1, "\\w+")))
  which.max(sapply(temp, function(x) sum(x == temp)))
}

phrase <- "The fox jumped over the cone and the"
string_read(phrase)
#the 
#  1 
phrase2 <- "The fox jumped over the cone and the fox, fox, fox, fox, fox"
string_read(phrase)
#fox 
# 2 

【讨论】:

  • 嗨 Akrun,如果您在其中添加其他一系列单词,例如 fox、fox、fox、fox、fox - 我认为它仍然将“the”注册为最常见的单词,这是不正确的.
猜你喜欢
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多