R 中的文本分析:除了标记之外,如何向我的机器学习分类器添加变量?
Text Analysis in R: How to add variables to my machine learning classifier in addition to the tokens?
如何考虑附加变量
我正在使用 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()
to 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 中。
如何考虑附加变量
我正在使用 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()
to 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 中。