36-text2vec包学习:利用多核机器的优势处理文件

1、酒店评论数据

library(pacman)
p_load(dplyr)
df <- read.csv("./data_set/review.csv",header = T,stringsAsFactors = F) %>% 
  tbl_df() %>% 
  select(id=ReviewID,date=RatingDate,review=ReviewText,rate=Obs_Avg_Rating) %>% 
  mutate(sentiment=ifelse(rate<3,0,1)) 

df <- df %>% select(-rate)
df$date <- as.Date(df$date)
nrow(df)
## [1] 11005
# 切割为5个文件
N_files <- 5
# 每个文件多少行数据
chunk_len <- nrow(df) / N_files

# 创建临时文件
files <- sapply(1:N_files,function(x) tempfile())

# 将文件分块
chunks <- split(df,rep(1:N_files,each=chunk_len))

# 将分块写入到对应的文件
for (i in 1:N_files) {
  write.table(chunks[[i]],files[[i]],quote=T,row.names=F,
              col.names = T,sep = "|")
}

str(df,strict.width="cut")
## Classes 'tbl_df', 'tbl' and 'data.frame':    11005 obs. of  4 variables:
##  $ id       : int  116455519 116885145 117395588 126717496 132233722..
##  $ date     : Date, format: "2011-08-08" ...
##  $ review   : chr  "I gave this place 2 because the staff was very "..
##  $ sentiment: num  0 0 0 0 0 1 0 1 1 1 ...

2、构造text2vec读取文件函数

p_load(data.table,text2vec)

reader <- function(x, ...) {
  # 读取数据
  chunk <- data.table::fread(x, header = T, sep = "|")
  # 选择列
  res <- chunk$review
  # 加入ids信息
  names(res) <- chunk$id
  res
}

# 创建迭代器
it_files <- ifiles(files, reader = reader)
# 
it_tokens = itoken(it_files,
                   preprocessor = tolower,
                   tokenizer = word_tokenizer,
                   progressbar = FALSE)

vocab <- create_vocabulary(it_tokens)

3、使用构造的函数创建DTM

请注意,DTM具有文档id。它们继承自我们在reader函数中分配的文档名称。 在处理文件时,这是分配文档id的方便方法。

dtm <- create_dtm(it_tokens,vectorizer = vocab_vectorizer(vocab))
str(dtm, list.len = 5)
## Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
##   ..@ i       : int [1:734787] 9012 558 10744 2736 1950 10921 9345 983 1874 758 ...
##   ..@ p       : int [1:26935] 0 1 2 3 4 5 6 7 8 9 ...
##   ..@ Dim     : int [1:2] 11005 26934
##   ..@ Dimnames:List of 2
##   .. ..$ : chr [1:11005] "116455519" "116885145" "117395588" "126717496" ...
##   .. ..$ : chr [1:26934] "contar" "reacting" "veriy" "cranny's" ...
##   ..@ x       : num [1:734787] 1 1 1 1 1 1 1 1 1 1 ...
##   .. [list output truncated]

4、使用多核读取内存中的数据

library(doParallel)

# 查看系统核心数
N_WORKERS <- detectCores()

# 创建集群
cl <- makeCluster(N_WORKERS-1)

# 注册parallel后端
registerDoParallel(cl)

it_token_par <- itoken_parallel(df$review,
                                preprocessor = tolower,
                                tokenizer = word_tokenizer,
                                ids = df$id,
                                # 可以自己控制n_chunks参数
                                n_chunks = 8)
vocab <- create_vocabulary(it_token_par)
v_vectorizer <- vocab_vectorizer(vocab)
dtm <- create_dtm(it_token_par,v_vectorizer)

# 停止集群
stopCluster(cl)

str(dtm)
## Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
##   ..@ i       : int [1:734787] 558 1146 1481 2583 2588 2651 2741 2796 2991 3457 ...
##   ..@ p       : int [1:26935] 0 1 53 55 56 58 59 60 68 69 ...
##   ..@ Dim     : int [1:2] 11005 26934
##   ..@ Dimnames:List of 2
##   .. ..$ : chr [1:11005] "116455519" "116885145" "117395588" "126717496" ...
##   .. ..$ : chr [1:26934] "reacting" "downside" "impacted" "janitorial" ...
##   ..@ x       : num [1:734787] 1 1 1 1 1 1 1 1 1 1 ...
##   ..@ factors : list()

5、读取磁盘中的数据

library(doParallel)

# 查看系统核心数
N_WORKERS <- detectCores()

# 创建集群
cl <- makeCluster(N_WORKERS-1)

# 注册parallel后端
registerDoParallel(cl)

it_files_par <- ifiles_parallel(file_paths = files)

it_token_par <- itoken_parallel(it_files_par,
                                preprocessor = tolower,
                                tokenizer = word_tokenizer)
vocab <- create_vocabulary(it_token_par)

# 词向量DTM
v_vectorizer <- vocab_vectorizer(vocab)
dtm_v <- create_dtm(it_token_par,v_vectorizer)
str(dtm_v)
## Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
##   ..@ i       : int [1:788756] 559 3900 5157 2473 2738 935 1951 984 2086 6899 ...
##   ..@ p       : int [1:37943] 0 1 3 4 5 6 7 8 10 11 ...
##   ..@ Dim     : int [1:2] 11010 37942
##   ..@ Dimnames:List of 2
##   .. ..$ : chr [1:11010] "filec082b5c5c_1" "filec082b5c5c_2" "filec082b5c5c_3" "filec082b5c5c_4" ...
##   .. ..$ : chr [1:37942] "reacting" "infact" "193827036" "cranny's" ...
##   ..@ x       : num [1:788756] 1 1 1 1 1 1 1 1 1 1 ...
##   ..@ factors : list()
# hash向量DTM
h_vectorizer <- hash_vectorizer()
dtm_h <- create_dtm(it_token_par,h_vectorizer)
str(dtm_h)
## Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
##   ..@ i       : int [1:788604] 6402 1093 8357 559 630 815 894 957 1347 2872 ...
##   ..@ p       : int [1:262145] 0 0 0 0 0 0 0 0 0 0 ...
##   ..@ Dim     : int [1:2] 11010 262144
##   ..@ Dimnames:List of 2
##   .. ..$ : chr [1:11010] "filec089266d1a_1" "filec089266d1a_2" "filec089266d1a_3" "filec089266d1a_4" ...
##   .. ..$ : NULL
##   ..@ x       : num [1:788604] 1 1 1 1 1 1 1 1 1 1 ...
##   ..@ factors : list()
# 词共现矩阵
tcm <- create_tcm(it_token_par,
                  vectorizer = v_vectorizer,
                  skip_grams_window = 5)
str(tcm)
## Formal class 'dgTMatrix' [package "Matrix"] with 6 slots
##   ..@ i       : int [1:1107832] 216 285 193 292 494 422 235 180 416 361 ...
##   ..@ j       : int [1:1107832] 216 349 406 416 494 526 538 585 603 614 ...
##   ..@ Dim     : int [1:2] 37942 37942
##   ..@ Dimnames:List of 2
##   .. ..$ : chr [1:37942] "reacting" "infact" "193827036" "cranny's" ...
##   .. ..$ : chr [1:37942] "reacting" "infact" "193827036" "cranny's" ...
##   ..@ x       : num [1:1107832] 0.2 1 0.25 0.25 0.5 ...
##   ..@ factors : list()
# 停止集群
stopCluster(cl)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容