如何考虑其他变量

我正在使用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 ID
docvars(newst, "id_numeric") <- 1:ndoc(newst)

# get training set
train <- 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)


最后,我运行分类,例如,朴素贝叶斯分类器或套索

朴素贝叶斯分类器或套索

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


但是到那时,我不知道如何告诉分类器,我希望它除了单词之外还考虑这些文档变量。

总而言之,我希望模型同时考虑每个文档中所有单词的矩阵和我为每个文档创建的索引。

任何建议都受到高度赞赏

先感谢您,

卡洛

最佳答案

在内部,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中。

关于r - R中的文本分析:除了标记外,如何向我的机器学习分类器添加变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55456010/

10-12 17:41