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

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

Я работаю над задачей классификации, используя квантеду в 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

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

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

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

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

Карло

1 Ответ

2 голосов
/ 01 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...