作者Wush978 (拒看低质媒体)
看板R_Language
标题Re: [问题] 制作dummy variable矩阵效能问题
时间Sat Dec 30 21:20:32 2017
你的问题,刚好等价於在文字探勘中建立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)
m2@x[] <- -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)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.163.182.29
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1514640039.A.C6E.html
1F:→ andrew43: 多谢你也帮我写成function了 12/30 21:50
2F:推 tan800630: 又学到东西了 感谢分享:) 12/31 11:11
3F:推 cywhale: 推,text2vec非常实用~ 感谢分享~~ 01/01 23:44
4F:推 mowgur: 推推推 谢谢大家的回复!!!! 我最後使用的方法是andrew大的 01/02 20:38
5F:→ mowgur: 实际资料下去跑只花了80秒~~ 01/02 20:39
6F:→ mowgur: t大的方法时间满长的 有警告讯息 可能是我的资料没清乾净 01/02 20:41
7F:→ mowgur: 用text2vec会做出全0的矩阵 猜测是建立vocab或vectorizer 01/02 20:42
8F:→ mowgur: 的地方有问题 但我来不及仔细研究 01/02 20:43
9F:→ mowgur: 最後再感谢大家拯救研究生呜呜呜 R板好温暖RRRR 01/02 20:44