如何考虑额外的变量
我在R中使用quanteda进行分类任务,我想在词袋之外加入一些变量供模型考虑。例如,我计算了基于字典的情感指数,我希望将这些变量包括在内,以便模型能够考虑到它们。
这些是我为每个文档创建的指数。
dfneg <- cbind(negDfm1@docvars$label , negDfm1@x ,posDfm@x , angDfm@x , disgDfm1@x)colnames(dfneg) <- c("label","neg" , "pos" , "ang" , "disg")dfneg <- as.data.frame(dfneg)
这是我将要处理的文档特征矩阵:
DFM
newsdfm <- dfm(newscorp, tolower = TRUE , stem = FALSE , remove_punct = TRUE, remove = stopwords("english"),verbose=TRUE)newst<- dfm_trim(newsdfm , min_docfreq=2 , verbose=TRUE)id_train <- sample(1:6335, 5384, replace = FALSE)# create docvar with IDdocvars(newst, "id_numeric") <- 1:ndoc(newst)# get training settrain <- dfm_subset(newst, id_numeric %in% id_train)# get test set (documents not in id_train)test <- dfm_subset(newst, !id_numeric %in% id_train)
最后,我运行了一个分类器,例如朴素贝叶斯分类器或Lasso
朴素贝叶斯分类器或Lasso
NBmodel <- textmodel_nb(train , train@docvars$label)lasso <- cv.glmnet(train, train@docvars$label, family="binomial", alpha=1, nfolds=10,type.measure="class")
这是我在创建dfm之后尝试过的方法,但没有成功
newsdfm@Dimnames$features$negz <- dfneg$neg newsdfm@Dimnames$features$posz <- dfneg$pos newsdfm@Dimnames$features$angz <- dfneg$ang newsdfm@Dimnames$features$disgz <- dfneg$disg
然后我想在创建newsdfm之前创建文档变量
docvars(newscorp , "negz") <- dfneg$neg docvars(newscorp , "posz") <- dfneg$pos docvars(newscorp , "angz") <- dfneg$ang docvars(newscorp , "disgz") <- dfneg$disg
但在那个时候,我不知道如何告诉分类器,除了词袋之外,我也希望它考虑这些文档变量。
总之,我希望模型既能考虑每个文档的所有词矩阵,也能考虑我为每个文档创建的指数。
任何建议都将不胜感激
提前感谢,
Carlo
回答:
在内部,dfm是稀疏矩阵,但如果可能的话,最好避免直接操作它们。
对于textmodel_nb()
添加新特征,您需要将它们添加到dfm中。正如您可能预期的那样,最简单的方法是使用cbind()
将它们添加到dfm中。
在您的例子中,您可以运行如下代码:
additional_features <- dfneg[, c("neg", "pos", "ang", "disg")] %>% as.matrix()newsdfm_added <- cbind(newsdfm, additional_features)
如您所见,我首先创建了一个额外特征的矩阵,然后运行cbind()
。当您执行cbind()
时,您将得到以下警告:
Warning messages:1: cbinding dfms with different docnames 2: cbinding dfms with overlapping features will result in duplicated features
这表明您必须确保额外特征的列名不应在原始的dfm中出现。