R: как сопоставить тестовые данные с пространством lsa, созданным обучающими данными

Я пытаюсь выполнить анализ текста с помощью LSA. Я читал много других сообщений о LSA на StackOverflow, но пока не нашел ничего похожего на свое. Если вы знаете, что есть что-то похожее на мое, пожалуйста, перенаправьте меня на него! Очень признателен!

вот мой воспроизводимый код с созданными образцами данных:

создание пробных наборов данных и тестов

sentiment = c(1,1,0,1,0,1,0,0,1,0)
length(sentiment) #10
text = c('im happy', 'this is good', 'what a bummer X(', 'today is kinda okay day for me', 'i somehow messed up big time', 
         'guess not being promoted is not too bad :]', 'stayhing home is boring :(', 'kids wont stop crying QQ', 'warriors are legendary!', 'stop reading my tweets!!!')
train_data = data.table(as.factor(sentiment), text)
> train_data
    sentiment                                text
 1:  1                                   im happy
 2:  1                               this is good
 3:  0                           what a bummer X(
 4:  1             today is kinda okay day for me
 5:  0               i somehow messed up big time
 6:  1 guess not being promoted is not too bad :]
 7:  0                 stayhing home is boring :(
 8:  0                   kids wont stop crying QQ
 9:  1                    warriors are legendary!
10:  0                  stop reading my tweets!!!

sentiment = c(0,1,0,0)
text = c('running out of things to say...', 'if you are still reading, good for you!', 'nothing ended on a good note today', 'seriously sleep deprived!! >__<')
test_data = data.table(as.factor(sentiment), text)
> train_data
   sentiment                                    text
1:         0         running out of things to say...
2:         1 if you are still reading, good for you!
3:         0      nothing ended on a good note today
4:         0         seriously sleep deprived!! >__<

предварительная обработка набора обучающих данных

corpus.train = Corpus(VectorSource(train_data$text))

создать матрицу документов терминов для обучающего набора

tdm.train = TermDocumentMatrix(
  corpus.train,
  control = list(
    removePunctuation = TRUE,
    stopwords = stopwords(kind = "en"),
    stemming = function(word) wordStem(word, language = "english"),
    removeNumbers = TRUE, 
    tolower = TRUE,
    weighting = weightTfIdf)
)

преобразовать в матрицу (для последующего использования)

train_matrix = as.matrix(tdm.train)

создать пространство lsa, используя данные поезда

lsa.train = lsa(tdm.train, dimcalc_share())

установить размер # (здесь я выбрал один случайным образом, потому что размер данных слишком мал для создания формы локтя)

k = 6

матрица поезда проекта в новое пространство LSA

projected.train = fold_in(docvecs = train_matrix, LSAspace = lsa.train)[1:k,]

преобразовать вышеуказанные прогнозируемые данные в матрицу

projected.train.matrix = matrix(projected.train, 
                                nrow = dim(projected.train)[1],
                                ncol = dim(projected.train)[2])

обучить модель случайного леса (почему-то этот шаг больше не работает с этой небольшой выборкой данных... но все в порядке, это не будет большой проблемой в этом вопросе; однако, если вы можете помочь мне и с этой ошибкой, это' d быть фантастическим! Я попытался найти эту ошибку в Google, но она просто не исправлена...)

trcontrol_rf = trainControl(method = "boot", p = .75, trim = T)
model_train_caret = train(x = t(projected.train.matrix), y = train_data$sentiment, method = "rf", trControl = trcontrol_rf)

предварительная обработка набора тестовых данных

в основном я повторяю все, что я делал с набором обучающих данных, за исключением того, что я не использовал тестовый набор для создания собственного пространства LSA.

corpus.test = Corpus(VectorSource(test_data$text))

создать матрицу документа термина для тестового набора

tdm.test = TermDocumentMatrix(
  corpus.test,
  control = list(
    removePunctuation = TRUE,
    stopwords = stopwords(kind = "en"),
    stemming = function(word) wordStem(word, language = "english"),
    removeNumbers = TRUE, 
    tolower = TRUE,
    weighting = weightTfIdf)
)

преобразовать в матрицу (для последующего использования)

test_matrix = as.matrix(tdm.test)

тестовую матрицу проекта в обученное пространство LSA (вот где вопрос)

projected.test = fold_in(docvecs = test_matrix, LSAspace = lsa.train)

но я получаю сообщение об ошибке: Ошибка в crossprod(docvecs, LSAspace$tk): несоответствующие аргументы

я не нахожу никаких полезных результатов поиска Google относительно этой ошибки... (есть только одна страница результатов поиска из Google QQ) любая помощь очень ценится! Спасибо!


person alwaysaskingquestions    schedule 29.04.2016    source источник


Ответы (1)


При построении модели LSA вы используете словарь обучающих данных. Но когда вы создаете TermDocumentMatrix для тестовых данных, вы используете словарь тестовых данных. Модель LSA знает только, как обращаться с документами, сгруппированными по словарю обучающих данных.

Один из способов исправить это — создать тестовый TDM с dictionary, установленным в словарь обучающих данных:

tdm.test = TermDocumentMatrix(
    corpus.test,
    control = list(
        removeNumbers = TRUE, 
        tolower = TRUE,
        stopwords = stopwords("en"),
        stemming = TRUE,
        removePunctuation = TRUE,
        weighting = weightTfIdf,
        dictionary=rownames(tdm.train)
    )
)
person Ryan Walker    schedule 30.04.2016
comment
Привет Райан, большое спасибо за попытку помочь! На самом деле я пытался использовать словарь, но в итоге получил очень маленький набор тестов (думаю, остальные были отфильтрованы). Как я могу решить эту проблему? - person alwaysaskingquestions; 01.05.2016
comment
Преобразование TermDocmentMatrix (со словарем или без него) не влияет на размер ваших тестовых данных. Возможно, где-то в вашем коде есть ошибка. Возможно, вы можете обновить свой пример? - person Ryan Walker; 01.05.2016
comment
Ах хорошо! я ошибочно думал, что получил меньший набор; Я действительно получал ошибку, но почему-то ее больше нет. спасибо большое однако! - person alwaysaskingquestions; 01.05.2016