从标签向量列表中创建标签频率的数据帧

Tyl*_*ker 4 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"
Run Code Online (Sandbox Code Playgroud)

对于每个向量,我想计算所有可能标记的出现频率(向量插入的零不包含标记)并生成如下所示的数据帧结构:

  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
Run Code Online (Sandbox Code Playgroud)

我已经把我的开始思考下面和假数据集.我最初以为用表去这一点,但我不知道9AS我知道这是慢于说使用rlematch或索引[.如果这些都可以使用.我还考虑过使用Reducewith merge这些向量来进行多合并,但是知道R中的高阶函数可能比其他方法慢(也许这可以用一些甜的索引来完成).

无论如何,我非常感谢这个问题的帮助.我正在寻找的两个参数是:

  1. 基础解决方案
  2. 速度

数据和我最初的想法(表格可能是错误的方式:

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
Run Code Online (Sandbox Code Playgroud)

为这个线程名称道歉是一个很难分类.

编辑:(增加了基准测试结果)

很有创意的答案.我甚至没有考虑因子解决方案和指定水平.聪明.对于速度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
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 5

我会这样做:

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
Run Code Online (Sandbox Code Playgroud)

或者为了更快的速度(但丢失列名):

G1 <- do.call(rbind,lapply(G,function(x,lev){ tabulate(factor(x,levels = lev,
                                ordered = TRUE),nbins = length(lev))},lev = lev))
Run Code Online (Sandbox Code Playgroud)