微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

插入符号中文本分类方法的选择

如何解决插入符号中文本分类方法的选择

我正在学习文本分类技术。使用了 movie_review R 包中的 text2vec 示例,它适用于二进制分类,但我现在想要多个类 - 我很难找到适合此任务的方法

数据集准备如下:

require(text2vec)
require(data.table)
require(purrr)

data("movie_review")
setDT(movie_review)
setkey(movie_review,id)
set.seed(2016L)

# here we have only 2 classes,# in my real dataset there will be more than 2
movie_review[,class:=factor(paste0('class',as.character(sentiment)))]

ids_all <- movie_review$id
ids_train <- sample(ids_all,4000)
ids_test  <- setdiff(ids_all,ids_train)
dt_train  <- movie_review[J(ids_train)]
dt_test   <- movie_review[J(ids_test)]

首先,我想尝试方法 mentioned for text mining in caret manualsvmBoundrangeStringsvmExpoStringsvmSpectrumString(均来自 kernlab 包)。我不知道这些方法是否适合这个任务,或者我需要以不同的方式应用它们,但是训练很慢,结果分类器完全错误

require(caret)
require(kernlab)

# have to take 100 records instead of 4000 because otherwise training takes forever:
mtx_train100 <- cbind(review=as.list(dt_train$review[1:100]))
rlabels <- dt_train$class[1:100]

# 224 sec
classifier_1 <- caret::train(x=mtx_train100,y=rlabels,method='svmBoundrangeString',trControl=trainControl(method="cv"))

# 235 sec
classifier_2 <- caret::train(x=mtx_train100,method='svmExpoString',trControl=trainControl(method="cv"))

# 210 sec
classifier_3 <- caret::train(x=mtx_train100,method='svmSpectrumString',trControl=trainControl(method="cv"))


mtx_test <- cbind(review=as.list(dt_test$review))

pred_1 <- predict(classifier_1,mtx_test) # all are 'class1'
pred_2 <- predict(classifier_2,mtx_test) # all are 'class1'
pred_3 <- predict(classifier_3,mtx_test) # most are 'class1'
mean(pred_3==dt_test$class) # 0.569

为了尝试其他分类方法,我制作了一个文档词矩阵(使用 text2vec):

prep_fun = tolower
tok_fun = word_tokenizer

# TRAIN set #### 
it_train <-
  dt_train$review %>% 
  prep_fun()      %>% 
  tok_fun()       %>% 
  itoken(ids = dt_train$id)
  
vocab_train_pruned <-      #  6598
  it_train %>% 
  create_vocabulary()  %>%
  prune_vocabulary(term_count_min = 10,doc_proportion_max = 0.5,doc_proportion_min = 0.001)

vectorizer_train <- 
  vocab_vectorizer(vocab_train_pruned)

dtm_train <- # 4000 x 6598 = 26,392,000
  create_dtm(it_train,vectorizer_train) 


# TEST set #### 
it_test <-
  dt_test$review %>% 
  prep_fun()      %>% 
  tok_fun()       %>%       # -> tokens_test
  itoken(ids = dt_test$id)
  
dtm_test <- # 4000 x 6598 = 26,000
  create_dtm(it_test,vectorizer_train)

我尝试了三种 svmLinear 方法。似乎 svmLinear 可以接受 dgCMatrix,但我不得不禁用缩放(老实说,我不知道在这种情况下缩放意味着什么 - 但它增加了 10 倍的拟合时间)并减少了认的迭代次数,否则培训时间太长。 svmLinear2svmLinear3 都需要转换为通常的 matrixsvmLinear2scale 的速度相同(和 svmLinear效果相同),而 svmLinear3 的速度要快得多

trCtrl <- trainControl(method="repeatedcv",number=2,repeats=2,summaryFunction = multiClassSummary,verboseIter = TRUE)

# svmLinear: 30 sec with scale=FALSE,230 sec with scale=TRUE
classifier_4   <- train(x=dtm_train,y=dt_train$class,method='svmLinear',verbose=T,trControl=trCtrl,scale=F)

# svmLinear2: requires matrix; 155 sec with scale=FALSE,Couldn't finish with scale=TRUE
classifier_5m  <- caret::train(x=as.matrix(dtm_train),method='svmLinear2',verbose =T,scale=F)

require(LiblineaR)
# svmLinear3: requires matrix; around 30 sec with or without scale
classifier_6m  <- caret::train(x=as.matrix(dtm_train),method='svmLinear3',trControl=trCtrl)

但至少得到的分类器还不错,准确率约为 82%。
我还尝试了 method='xgbTree' (内存不足)和其他几种方法The list 真的很大,我不能全部都尝试,所以我想检查一下我的方法是否正确(来自 kernlab 的所有 String Kernel 方法有什么问题,对于例如?),或者是否有针对此特定任务(文本分类)的一些常用/推荐方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。