Re: [问题] 制作dummy variable矩阵效能问题

楼主: Wush978 (拒看低质媒体)   2017-12-30 21:20:32
你的问题,刚好等价于在文字探勘中建立document term matrix
ps. 给一段文字(一个字串),用空格或其他符号切割后建立矩阵
感谢前面几位板友的分享,不过我从这个角度切入问题后,
可以站在巨人的肩膀来解问题(也就是以下的程式跑得比较快,是因为套件作者写的好)
目前我觉得R 里面做这件事情比较好的套件是text2vec,
另一个小要点是输出的矩阵,最好是sparse,因为你的资料大部分都是0,用sparse
matrix可以大幅度的加速与节省内存。
而且当你的球员名单越多人,加速的效果越明显。
这是我用text2vec去处理你给的范例资料:
it <- itoken(data[[1]], tokenizer = word_tokenizer, progressbar = FALSE,
n_chunks = 10)
it2 <- itoken(data[[2]], tokenizer = word_tokenizer, progressbar = FALSE,
n_chunks = 10)
vocab <- create_vocabulary(player)
vectorizer <- vocab_vectorizer(vocab)
m1 <- create_dtm(it, vectorizer)
m2 <- create_dtm(it2, vectorizer)
[email protected][] <- -1
cbind(m1, m2)
这是与其他板友的方法的比较结果:
http://rpubs.com/wush978/345283
andrew43 大大的版本效能比较好
但是text2vec在打开平行处理之后,在我的电脑上可以比andrew43的方法再快一点
※ 引述《mowgur (PINNNNN)》之铭言:
: *[m- 问题: 当你想要问问题时,请使用这个类别。
: 建议先到 http://tinyurl.com/mnerchs 搜寻本板旧文。
: [问题类型]:
: 效能咨询(我想让R 跑更快)
: [软件熟悉度]:
: 使用者(已经有用R 做过不少作品)
: [问题叙述]:
: 大家好 我的资料是纪录篮球比赛每个play是哪5个进攻及防守球员在场上
: 想做的事情是: 假设总共有500位球员 做出一个n(750000) x p(1000)的矩阵
: 前500栏为进攻 后500栏为防守
: 矩阵内的元素为1代表球员在场上进攻(防守为-1) 不在场上为0
: 所以每列会有5个1及5个-1还有很多个0
: 资料大概长这样
: data$p.combination data$p.com.allowed
: 1 A, B, C, D, E J, K, L, M, N
: 2 A, C, F, H, I K, L, M, N, O
: 3 C, D, X, Y, Z K, M, O, Q, R
: ... ... ...
: 人名之间是用逗号和一个空格分开
: 用我自己写的已经跑了快12小时还没跑完
: 想请教版上各位大大有没有更好的写法
: [程式范例]:
: https://ideone.com/PaBtM4
: library(magrittr)
: p.combination = character(1000)
: for(i in 1:length(p.combination)){
: p.combination[i] = LETTERS[sample(1:26,5)] %>% paste0(collapse = ", ")
: }
: p.com.allowed = character(1000)
: for(i in 1:length(p.com.allowed)){
: p.com.allowed[i] = LETTERS[sample(1:26,5)] %>% paste0(collapse = ", ")
: }
: data = data.frame(p.combination = p.combination,
: p.com.allowed = p.com.allowed)
: player = LETTERS[1:26]
: input.matrix0 = function(data, player, off){
: X = matrix(ncol = length(player), nrow = dim(data)[1])
: for(i in 1:dim(data)[1]){
: if(off) {
: colnames(X) = paste0("O_",player)
: coding = 1
: pp = data$p.combination
: } else {
: colnames(X) = paste0("D_",player)
: coding = -1
: pp = data$p.com.allowed
: }
: player.temp = pp[i] %>% gsub(", ", "|",.)
: index = grep(player.temp, player)
: X[i,index] = coding
: X[i,-index] = 0
: }
: return(X)
: }
: input.matrix = function(data, player){
: X.off = input.matrix0(data, player, T)
: X.def = input.matrix0(data, player, F)
: return(cbind(X.off, X.def))
: }
: out = input.matrix(data,player)
作者: andrew43 (讨厌有好心推文后删文者)   2017-12-30 21:50:00
多谢你也帮我写成function了
作者: tan800630 (天ㄦ)   2017-12-31 11:11:00
又学到东西了 感谢分享:)
作者: cywhale (cywhale)   2016-01-01 23:44:00
推,text2vec非常实用~ 感谢分享~~
作者: mowgur (PINNNNN)   2016-01-02 20:38:00
推推推 谢谢大家的回复!!!! 我最后使用的方法是andrew大的实际资料下去跑只花了80秒~~t大的方法时间满长的 有警告讯息 可能是我的资料没清干净用text2vec会做出全0的矩阵 猜测是建立vocab或vectorizer的地方有问题 但我来不及仔细研究最后再感谢大家拯救研究生呜呜呜 R板好温暖RRRR

Links booklink

Contact Us: admin [ a t ] ucptt.com