r - 从标签向量列表创建标签频率的数据框

标签 r

我正在用 R 编写一个函数来查找类型对话的形式统计(一种语言度量)。我使用 openNLP 的词性标注器来标记单词(很棒的工具,但速度很慢,因为它正在做一些繁重的工作)。无论如何,此功能已经存在时间问题,我遇到了一个问题,我想尽快使其运行。我开始用令人费解的术语思考,并且知道我需要一些集体的集体思考来解决这个问题。

我有一个带有标签的向量列表,如下所示:

G 
[[1]]
[1] "MD"  "DT"  "NN"  "VB"  "VBG" "TO"  "POS"

[[2]]
[1] "DT" "NN" "JJ" "RB"

[[3]]
[1] "RB"  "TO"  "PRP"

[[4]]
[1] "VBZ" "PRP" "VBG" "RB"  "TO"  "NN" 

[[5]]
[1] "NN" "NN"

对于每个向量,我想计算所有可能标签的出现频率(将插入一个不包含标签的向量的零)并生成如下所示的数据帧结构:
  DT  JJ  MD  NN  POS PRP RB  TO  VB  VBG VBZ
1  1   0   1   1    1   0  0   1   1    1   0
2  1   1   0   1    0   0  1   0   0    0   0
3  0   0   0   0    0   1  1   1   0    0   0
4  0   0   0   1    0   1  1   1   1    1   1
5  0   0   0   2    0   0  0   0   0    0   0

我已经开始考虑下面的问题以及假数据集。我最初想用这个表,但我不确定 9 因为我知道这比说使用 rlematch 或索引 [ 慢,如果可以使用这些中的任何一个。我还考虑过在这些向量上使用 Reducemerge 来进行多重合并,但我知道 R 中的高阶函数可能比其他方法慢(也许这可以通过一些甜蜜的索引来完成)。

无论如何,我将非常感谢您对这个问题的帮助。我正在寻找的两个参数是:
  • 基本解决方案
  • 速度

  • 数据和我的初步想法(表可能走错了路:
    G <- list(c("MD", "DT", "NN", "VB", "VBG", "TO", "POS"), c("DT", "NN", 
    "JJ", "RB"), c("RB", "TO", "PRP"), c("VBZ", "PRP", "VBG", "RB", 
    "TO", "NN"), c("NN", "NN"))
    
    P <- lapply(G, function(x) table(sort(x)))  #to get frequencies on each word
    sort(unique(names(unlist(P))))  #to get the column names and number
    

    为线程名称道歉,因为这是一个很难分类的。

    编辑:(添加基准标记结果)

    很有创意的回答。我什至没有考虑因子解决方案和指定水平。聪明的。对于速度 Joran 的第二个答案风(我刚刚使用您已经创建的 lev 重新添加了列名称。mdsummer 的响应是最少的代码,并且与速度并列第二。我将采用 Joran 的第二个响应,因为它将使我获得最好的速度提升。谢谢大家!非常感谢:) 比较可作为要点 https://gist.github.com/trinker/91802b8c4ba759034881
           expr        min         lq      mean     median        uq       max neval
       JORAN1()  648.04435  689.16756  714.9142  712.59122  732.4991  831.6623   100
       JORAN2()   86.83879   92.91911   98.7068   97.44690  101.6764  177.4228   100
       RINKER()   87.40797   94.07564  100.1154   98.39624  104.0887  177.3146   100
          TIM()  900.65847  964.23419  993.9475  988.89306 1023.0587 1137.6263   100
     MDSUMMER() 1395.95920 1487.45279 1527.3181 1527.92664 1571.0997 1685.3298   100
    

    最佳答案

    我会这样做:

    lev <- sort(unique(unlist(G)))
    
    G1 <- do.call(rbind,lapply(G,function(x,lev){ table(factor(x,levels = lev,
                                                         ordered = TRUE))},lev = lev))
    
         DT JJ MD NN POS PRP RB TO VB VBG VBZ
    [1,]  1  0  1  1   1   0  0  1  1   1   0
    [2,]  1  1  0  1   0   0  1  0  0   0   0
    [3,]  0  0  0  0   0   1  1  1  0   0   0
    [4,]  0  0  0  1   0   1  1  1  0   1   1
    [5,]  0  0  0  2   0   0  0  0  0   0   0
    

    或者为了更快的速度(但丢失列名):
    G1 <- do.call(rbind,lapply(G,function(x,lev){ tabulate(factor(x,levels = lev,
                                    ordered = TRUE),nbins = length(lev))},lev = lev))
    

    关于r - 从标签向量列表创建标签频率的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9961209/

    相关文章:

    r - 如果忘记命名函数或对象,如何获得结果

    r - 将双变量绘制为 R 中的多个因子

    r - 编写自己的 tidyselect 函数

    r - 如何在R中设置动画的速度?

    r - 如何使用扫帚在整洁的输出中包含多个模型的置信区间?

    反转数据框中的行顺序

    r - 如何舍入由数字、NA 和 NaN 组成的向量

    R图: Displaying both point type and line type in legend

    r - 如何通过现有名称列表将矩阵行或列名称更改为新名称?

    r - 如果列中包含子字符串,如何检查列中的每一行