Попытка получить случайный лес для выполнения классификации текста - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь запустить randomForest для школьного проекта. Я пытаюсь создать классификатор теста, который предсказывает категорию (метку столбца) на основе некоторого текста.

Конечно, я застрял, так как, похоже, проблема с матрицей термина моего документа. Это ошибка:

> rfmodel <- randomForest(df$label, data = events_dtm)
Error in if (n == 0) stop("data (x) has 0 rows") : 
  argument is of length zero

Вот как выглядит код в данный момент. Данные являются репрезентативными.

library(tidyverse)
library(tidytext)
library(stringr)
library(caret)
library(tm)
library(dplyr)
library(randomForest)

text = c("this is a random text",
         "another rnd text",
         "hi there",
         "not so rnd",
         "what's that?",
         "kinda boring",
         "this is a random text",
         "another rnd text",
         "hi there",
         "not so rnd",
         "what's that?",
         "kinda boring")

label = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2)

df <- data.frame(text= text, label=label)
df$label <- as.factor(df$label)
df$text <- as.character(df$text)

df$ID <- seq.int(nrow(df))

df <- df[1:5,]

as_tibble(df) %>%
  mutate(text = as.character(text)) -> type

data("stop_words")
type %>%
  unnest_tokens(output = word, input = text) %>%
  anti_join(stop_words) %>%
  mutate(word = SnowballC::wordStem(word)) -> type_tokens


type_tokens %>%
  count(ID, word) %>%
  cast_dtm(document = ID, term = word, value = n,
           weighting = weightTfIdf) -> type_dtm


print(type_dtm)

rfmodel <- randomForest(df$label, data = type_dtm)

print(rfmodel)

dfT <- data.frame(text= text)
dfT$ID <- seq.int(nrow(dfT))

as_tibble(dfT) %>%
  mutate(text = as.character(text)) -> typeT

typeT %>%
  unnest_tokens(output = word, input = text) -> typeT

typeT %>%
  count(ID, word) %>%
  cast_dtm(document = ID, term = word, value = n,
           weighting = weightTfIdf) -> typeT

pred_test <- predict(rfmodel, newdata = dfT, type = "class")

print(pred_test)

Поскольку я довольно новичок как в случайных лесах, так и в R, возможно, существует концептуальная ошибка. Есть идеи, как решить проблему?

1 Ответ

0 голосов
/ 04 июля 2018

Есть несколько проблем с вашим кодом:

Сначала ваш случайный звонок: rfmodel <- randomForest(df$label, data = type_dtm)

Вы не можете вызвать df $ label и указать данные type_dtm, где метка отсутствует. Во-вторых, разреженные матрицы не принимаются randomForest. Вы должны сделать что-то с этим. Вы можете решить это, объединив информацию метки с type_dtm. Ищите так, как это сделать. В-третьих, вы сообщаете randomForest, что y = метка, но либо вам нужно указать интерфейс формулы, такой как метка ~. и укажите data = .... или вам нужно указать y и x как y = label и x = ... см. ?randomForest для получения дополнительной информации.

Все эти проблемы вместе приводят к полученной вами ошибке. Начните решать их один за другим, и когда вы снова застряли, напишите вопрос. Ваш код - хорошее начало для создания воспроизводимого примера, так что +1 за это усилие.

...