Анализ текста в R: как добавить переменные в мой классификатор машинного обучения в дополнение к токенам?

как учитывать дополнительные переменные

Я работаю над задачей классификации, используя quANTa в R, и я хочу включить некоторые переменные, которые будут учитываться моими моделями, помимо набора слов. например, я вычислил индексы настроений на основе словаря и хотел бы включить эти переменные, чтобы модели учитывали их.

это индексы, которые я создал для каждого документа.

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

но в этот момент я не знаю, как сказать классификатору, что я хочу, чтобы он учитывал также эти переменные документа в дополнение к сумке слов.

Таким образом, я ожидаю, что модель будет учитывать как матрицу со всеми словами для каждого документа, так и индексы, которые я создал для каждого документа.

любое предложение высоко ценится

заранее спасибо,

Карло


person Carbo    schedule 01.04.2019    source источник
comment
Вы смотрели руководство для наивных байесовцев? Думаю, ваш вопрос там уже в значительной степени освещен. Если нет, не могли бы вы привести работающий воспроизводимый пример? Я не знаю, откуда взялся ваш newscorp объект, и не могу воспроизвести никаких ошибок.   -  person JBGruber    schedule 01.04.2019
comment
ну, он выполняет классификацию только с использованием функций документов, в то время как я хочу также использовать новые переменные в качестве независимых переменных.   -  person Carbo    schedule 01.04.2019


Ответы (1)


Внутренне 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.

person amatsuo_net    schedule 01.04.2019