【问题标题】:Counting words within factors计算因子内的单词
【发布时间】:2010-10-08 18:51:15
【问题描述】:

我在标有 Keyword.text 的列中有数百万个关键字。每个因素或关键字可以包含多个单词(或者我们应该说令牌)。这是一个包含 4 个关键字的示例

关键字.文本
敏捷的棕色狐狸
.8 .crazy 懒狗

跳过+9

我想统计每个Keyword中的token个数,得到:

关键字长度
5
4
1
4

我安装了 Tau 包,但还没有走多远……

 textcnt(Mydf$Keyword.text, split = "[[:space:][:punct:]]+", method = "string", n = 1L)

返回一个我不明白的错误。也许是有因素造成的;练习字符串时效果很好。

我知道如何在 excel 中执行此操作,但它不适用于最后一行。如果 A2 有关键字,那么: =LEN(TRIM(A2))-LEN(SUBSTITUTE(A2," ",""))+1 会做

【问题讨论】:

  • 错误:FUN(X[[1L]], ...) 中的错误:非字符参数

标签: r


【解决方案1】:

编辑:对于数据框和关键字总数,只需使用 strsplit。如果您对 每个关键字 的计数不感兴趣,则无需使用 strcnt。这就是我误会你的地方:

tt <- data.frame(
    a=rnorm(3),
    b=rnorm(3),
    c=c("the quick fox lazy","rbrown+fr even","what what goes & around"),
    stringsAsFactors=F
)
sapply(tt$c, function(n){
  length(strsplit(n, split = "[[:space:][:punct:]]+")[[1]])
})

要读取数据,还请查看 ?readLines 和/或 ?scan。这保留了字符串格式,并允许您逐行(或每行)处理文件。如果您使用文件连接,您甚至可以分部分加载文件,这在您达到内存限制时会有所帮助。

使用 readLines 的简单示例:

con <- textConnection("
The lazy fog+fog fog
never ended for fog jumping over the
fog whatever . $ plus.
")
# You use con <- file("myfile.txt")
Text <- readLines(con)
sapply(Text,textcnt, split = "[[:space:][:punct:]]+", method = "string", n = 1L)

附带说明,与通常的 read.table 命令相比,使用 Dirk 提到的选项 (stringsAsFactors=F) 不会降低性能。其实相反。您应该使用上面提到的 sapply,但将 Text 替换为 as.character(Mydf$Keyword.text)(或使用 stringsAsFactors=F 选项并删除 as.character()

【讨论】:

  • 我真的很想在数据帧级别有一个解决方案,而不是在每行级别的读取行。我很震惊这个问题没有一个简单的解决方案......我仍然无法对每个关键字的令牌求和......
  • 您的代码未提供总和,在您的示例中为 15。有什么想法吗?
  • 我想我会创建一个函数,因为它只适用于每行。
  • Myfun = function(n) { sum(sapply(Mydf$Keyword.Text[n], textcnt, split = "[[:space:][:punct:]]+", method = "字符串", n = 1L)) }
  • @datayoda :在数据帧级别很容易。 Dirk 给了你这个解决方案。我通常在完成所有字符串工作之后构建我的数据框。我猜这是风格问题,但我喜欢 scan 和 readLines 的功能,适用于非常大的集合。
【解决方案2】:

请显示错误。

也试试:

require(tau)
textcnt(as character(Mydf$Keyword.txt), split, ....) 

... 强制字符模式。

或者使用stringsAsFactors=FALSE 加载您的数据——同样的问题之前也出现过。

【讨论】:

  • 不会以这种方式加载数据会降低性能吗?我有一个非常大的文件(1.8gig)
  • 所以复制文件:只保留前几百行并以这种方式调试。
  • OK as.character 解决了这个问题,但获取每行的计数对我来说仍然不明显。我可以得到整个语料库中单词的总和,但不是每行......
  • 一次一步。如果您有一行,那么拆分方法应该计算该行的字数(使用as.character())。所以apply() 调用向量中的所有元素,你应该得到每行的标记向量。
  • 如果这是我会选择levels(Mydf$Keyword.txt)而不是as.character的因素。如果有一些可重复性,可能会节省时间。
【解决方案3】:

如果有一个不错的小函数,它还可以让我们决定我们想要计算哪些类型的单词以及哪些适用于整个向量也一样?

require(stringr)
nwords <- function(string, pseudo=F){
  ifelse( pseudo, 
          pattern <- "\\S+", 
          pattern <- "[[:alpha:]]+" 
        )
  str_count(string, pattern)
}

nwords("one,   two three 4,,,, 5 6")
# 3

nwords("one,   two three 4,,,, 5 6", pseudo=T)
# 6

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多