R textmining构建一个使用数据框子集

时间:2016-03-18 17:15:14

标签: r dataframe text-mining tm word-cloud

我是R的公式中的新手,我正在努力将一些重复的代码更改为更紧凑的东西。正如MrFlick的评论中所建议的,我发布了我已经在答案部分找到的工作解决方案。

所以我的问题是使用几种不同的分类为比较wordcloud创建各种语料库,如wikispiral.org中所示。为此,我需要根据原始数据帧的子集(给定数据框中的类别)创建一个字符向量列表。请参阅以下示例:

library(wordcloud)
library(tm)

element <- c("Adams Pearmain ", "Aia Ilu ", "Airlie Red Flesh", "Akane ", "Åkerö ", "Alkmene", "Allington Pippin ", "Ambrosia ", "Anna ", "Annurca ", "Antonovka ", "Apollo ", "Ariane ", "Arkansas Black ", "Arthur Turner")
qty <- c(2, 1, 4, 3, 6, 2, 1, 4, 3, 6, 2, 1, 4, 3, 6)
category1 <- c("Red", "Green", "Red", "Green", "Yellow", "Orange", "Red", "Red", "Green", "Red", "Green", "Yellow",  "Green", "Yellow", "Orange")
category2 <- c("small", "big", "big", "small", "small", "medium", "medium", "medium", big", "big", "small", "medium", "big", "very big", "medium")
d <- data.frame(element=element, qty=qty, category1=category1, category2=category2)

这给出了这个数据帧:

    element             qty category1   category2
1   Adams Pearmain      2   Red         small
2   Aia Ilu             1   Green       big
3   Airlie Red Flesh    4   Red         small
4   Akane               3   Green       big
5   Åkerö               6   Yellow      small
6   Alkmene             2   Orange      big
7   Allington Pippin    1   Red         small
8   Ambrosia            4   Red         big
9   Anna                3   Green       small
10  Annurca             6   Red         big
11  Antonovka           2   Green       small
12  Apollo              1   Yellow      big
13  Ariane              4   Green       small
14  Arkansas Black      3   Yellow      big
15  Arthur Turner       6   Orange      big

我目前正在为wordcloud创建我的矢量列表:

## Subsetting two dataframes to category2 values
wordBig <- d[d$category2 == "big",]
wordSmall <- d[d$category2 == "small",]

## Extracting the vectors in the category1 columns
wordSmall <- as.vector(wordSmall$category1)
wordBig <- as.vector(wordBig$category1)

## Building the list for the corpus
wordALL <- list(wordBig, wordSmall) # Without list() it doesn' t work

最后:

语料库&lt; - 语料库(VectorSource(wordALL),readerControl = list(language =“fr”))

wikispiral.org的现实生活中,有一个动态的维度数组 - 不仅是“大”或“小”类别(其中一些类别是由网站用户定义的,以及是非常不可预测的)。即使对于固定类别,代码也变得重复和丑陋,并且必须测试每个维度的存在,以避免在类别中存在NA时产生错误comparative.wordcloud()(就像“大”类别中没有数据一样) )。

所以我的问题是:如何在更紧凑的代码中转换先例,它能够: 1 - 检测分类列中的类别 2 - 构建字符向量列表 3 - 也许这样可以避免循环......

根据MrFlick的建议,我已经在答案部分找到了答案。

2 个答案:

答案 0 :(得分:0)

我创建了一个使用for循环构建此列表的函数,该循环从主数据框中对字符向量进行子集并填充列表。我更新了我的功能,以使其更通用,因此其他人可以重复使用它来帮助构建他们的应用程序。

CorpusFromDF <- function(DF, textcol, catcol) {
  # DF = a dataframe 
  # wordcol = the name of a column from DF containing the text to build the corpus
  # catcol = the name of a column from DF containing the categorisation
  cat <- levels(DF[,catcol])
  list <- list()
  for (n in cat){
    temp <- DF[DF[,catcol] == n,]
    temp <- as.vector(temp[,textcol])
    list <- append(list, list(temp))
    }
  return(list)
}

使用它:

wordALL <- CorpusFromDF(d, "element", "category2")

所以我真的很高兴,因为它有效(毕竟这是我的第一个R功能),我有我需要的东西,包含单词的向量列表。从那里我可以重用它来重塑我的语料库,特别是为了使用几个不同的类别/分类来构建网络分析。

但它是可以完善的,我猜测没有使用循环可能有可能,特别是当你真的有很多类别来构建你的语料库时......对于其他应用程序,我的情况是什么......

答案 1 :(得分:0)

好的,按照他在评论中提出的42条建议,它确实更快更干净......

listtest <- split(d,d$category2)
listtest <- lapply(listtest, droplevels.data.frame)
wordALL <- lapply(listtest, "[[", "element")

它是一个从数据框中准备建立语料库的因素列表:

corpus <- Corpus(VectorSource(wordALL), readerControl = list(language = "fr"))