1

如何考虑附加变量

我正在使用 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

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

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

任何建议都非常感谢

先感谢您,

卡罗

4

1 回答 1

2

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

因为这表明您必须确保附加功能的 colnames 不应该在原始 dfm 中。

于 2019-04-01T15:33:18.313 回答