首页 > 解决方案 > R中的向量列表-提取向量的一个元素

问题描述

我有一个包含一些文本的列表。所以列表的每个元素都是一个文本。文本是单词的向量。所以我有一个向量列表。我正在对此进行一些文本挖掘。现在,我正在尝试提取单词“no”之后的单词。我转换了我的向量,所以现在它们是两个词的向量。如 : list(c("want friend", "friend funny", "funny nice", "nice glad", "glad become", "become no", "no more", "more guys"), c("no comfort", "comfort written", "written conduct","conduct prevent", "prevent manners", "matters no", "no one", "one want", "want be", "be fired"))

我的目标是有一个向量列表,如下所示: list(c("more"), c("comfort", "one")) 所以我可以通过 liste[i] 看到文本 i 的结果向量。

所以我有一个公式可以在“no”之后提取单词(在第一个向量中它将是“more”)。但是当我的文字中有几个“不”时,它就不起作用了。

这是我的代码:

liste_negation <- vector(length = length(data))
for (i in 1:length(data)){
  for (j in 1:length(data[[i]])){
    if (startsWith((data[[i]])[[j]], 'no') == TRUE){
      liste_neg[i] <- c(liste_neg[i], tail(strsplit((data[[i]])[[j]],split=" ")[[1]],1))
    } else{
      liste_neg[i] <- c(liste_neg[i])
    }
    liste_negation[[i]] <- c(liste_neg[[i]])
  }
}

当只有一个 "no" 时,它适用于向量:

data <- list(c("want friend", "friend funny", "funny nice", "nice glad", "glad become", "become no", "no more", "more guys"), c("no comfort", "comfort written", "written conduct","conduct prevent", "prevent manners", "matters no", "no one", "one want", "want be", "be fired"))
data

liste_neg <- c()
liste_negation <- vector(length = length(data))
if (startsWith((data[[1]])[[9]], 'no') == TRUE){
  liste_neg[1] <- c(liste_neg[1], tail(strsplit((data[[1]])[[9]],split=" ")[[1]],1))
}

liste_negation[[1]] <- c(liste_neg[[1]])

但是,如果我尝试使用循环对其进行调整以查看向量的每个元素,并且文本中存在多个“否”,则它不起作用。

代码 :

liste_neg <- c()
liste_negation <- vector(length = length(data))
for (j in 1:length(data[[2]])){
  if (startsWith((data[[2]])[[j]], 'no') == TRUE){
    liste_neg[2] <- append(liste_neg[2], tail(strsplit((data[[2]])[[j]],split=" ")[[1]],1))
  }
}
liste_neg
liste_negation[[2]] <- c(liste_neg[[2]])
liste_negation

警告信息 :

Warning message:
In liste_neg[2] <- append(liste_neg[2], tail(strsplit((data[[2]])[[j]],  :
  number of items to replace is not a multiple of replacement length
> liste_neg
[1] NA        "comfort"
> liste_negation[[2]] <- c(liste_neg[[2]])
> liste_negation
[1] "FALSE"   "comfort"

如您所见,我只有第二个单词。

我尝试了很多东西,我尝试拆分代码并运行它并逐个处理它,但是在花了整个上午之后我还没有找到解决方案..

有人有什么想法可以帮助我吗?

提前谢谢你(对不起我的英语,我是法国人^^')

标签: rlistvectortext-mining

解决方案


在基础 R 中,我们可以使用sapply循环列表和grep识别单词"no"

output <- sapply(word_vec, function(x) sub(".*no", "", grep("\\bno\\b", x, value = TRUE)))

#[[1]]
#[1] ""      " more"

#[[2]]
#[1] " comfort" ""         " one" 

如果您不需要空字符串,您可以删除它们以获取

sapply(output, function(x) trimws(x[x!= ""]))  
#[[1]]
#[1] "more"

#[[2]]
#[1] "comfort" "one"     

推荐阅读