Подведение итогов R корпус с ID документа - PullRequest
0 голосов
/ 07 сентября 2018

Я создал DocumentTermMatrix, похожий на тот, что приведен в этом посте:

Сохранить идентификатор документа с помощью R corpus

Где я сохранил doc_id, чтобы я мог присоединить данные к большему набору данных.

Моя проблема в том, что я не могу понять, как суммировать слова и количество слов и хранить doc_id. Я хотел бы иметь возможность присоединить эти данные к существующему набору данных, используя только 3 столбца (doc_id, word, freq).

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

df_source=DataframeSource(df)
df_corpus=VCorpus(df_source)
tdm=TermDocumentMatrix(df_corpus) 
tdm_m=as.matrix(tdm)

word_freqs=sort(rowSums(tdm_m), decreasing = TRUE)
tdm_sorted=data.frame(word = names(word_freqs), freq = word_freqs)

Я пробовал несколько разных подходов к этому и просто не могу заставить его работать. Вот где я сейчас ( image ). Я использовал этот код:

tdm_m=cbind("doc.id" =rownames(tdm_m),tdm_m)

чтобы переместить doc_id в столбец в матрице, но не удалось получить числовые столбцы для суммирования и сохранить связанный doc_id.

Любая помощь, очень признателен, спасибо!

Ожидаемый результат:

doc.id | слово | частота
1 | Яблоко | 2
2 | Яблоко | 1
3 | Банан | 4
3 | Оранжевый | 1
4 | Груша | 3

1 Ответ

0 голосов
/ 13 сентября 2018

Если я посмотрю на ожидаемый результат, вам не нужно использовать эту строку кода word_freqs=sort(rowSums(tdm_m), decreasing = TRUE). Потому что это создает общую сумму слова, как Apple = 3 вместо 2 и 1 для нескольких документов.

Чтобы получить желаемый результат, вместо использования TermDocumentMatrix, использовать DocumentTermMatrix немного проще. Нет необходимости в переключении столбцов вокруг. Я покажу вам два примера, как получить результат. Один с melt из пакета reshape2 и один с функцией tidy из пакета tidytext.

# example 1
dtm <- DocumentTermMatrix(df_corpus)
dtm_df <- reshape2::melt(as.matrix(dtm))
# remove 0 values and order the data.frame
dtm_df <- dtm_df[dtm_df$value > 0, ]
dtm_df <- dtm_df[order(dtm_df$value, decreasing = TRUE), ]

или с помощью tidytext::tidy, чтобы получить данные в аккуратном формате. Нет необходимости удалять значения 0, так как тидитекст не преобразует его в матрицу перед преобразованием в data.frame

# example 2
dtm_tidy <- tidytext::tidy(dtm)
# order the data.frame or start using dplyr syntax if needed
dtm_tidy <- dtm_tidy[order(dtm_tidy$count, decreasing = TRUE), ] 

В моих тестах tidytext намного быстрее и использует меньше памяти, так как нет необходимости сначала создавать плотную матрицу.

...