2016-06-24 6 views
2

У меня есть DocumentTermMatrix, и я хотел бы заменить определенные термины в этом документе и создать частотную таблицу.R: DocumentTermMatrix Неправильные частоты после mgsub

Отправной точкой является исходный документ следующим образом:

library(tm) 
library(qdap) 

    df1 <- data.frame(word =c("test", "test", "teste", "hey", "heyyy", "hi")) 
    tdm <- as.DocumentTermMatrix(as.character(df1$word)) 

Когда я создаю таблицу частот исходного документа я получаю правильные результаты:

freq0 <- as.matrix(sort(colSums(as.matrix(tdm)), decreasing=TRUE)) 
freq0 

До сих пор так хорошо. Однако, если заменить некоторые термины в документе, то новая таблица частот получает неправильные результаты:

tdm$dimnames$Terms <- mgsub(c("teste", "heyyy"), c("test", "hey"), as.character(tdm$dimnames$Terms), fixed=T, trim=T) 
    freq1 <- as.matrix(sort(colSums(as.matrix(tdm)), decreasing=TRUE)) 
    freq1 

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

Этот результат должен быть идеальный случай:

df2 <- data.frame(word =c("test", "test", "test", "hey", "hey", "hi")) 
tdm2 <- as.DocumentTermMatrix(as.character(df2$word)) 
tdm2$dimnames$Terms <- mgsub(c("teste", "heyyy"), c("test", "hey"), as.character(tdm2$dimnames$Terms), fixed=T, trim=T) 
freq2 <- as.matrix(sort(colSums(as.matrix(tdm2)), decreasing=TRUE)) 
freq2 

Может кто-нибудь помочь мне выяснить проблему?

Thx заранее

+0

Я получаю сообщение об ошибке с 'as.DocumentTermMatrix (as.character (df1 $ word)) # Ошибка в .TermDocumentMatrix (t (x), weighting): аргумент" w отсутствует восьмерка ", без библиотеки – akrun

+0

(qdap) была неправильная позиция в коде. Теперь он должен быть воспроизводимым – OAM

+0

Я не уверен, почему 'colSums' используется как' as.matrix (tdm) '1 столбец 1/5. Вы можете попробовать 'm1 <- as.matrix (tdm); tapply (m1, dimnames (m1) [[2]], FUN = sum) ' – akrun

ответ

2

Мы можем посмотреть на структуру as.matrix(tdm)

str(as.matrix(tdm)) 
#num [1, 1:5] 1 1 1 2 1 
# - attr(*, "dimnames")=List of 2 
# ..$ Docs : chr "all" 
# ..$ Terms: chr [1:5] "hey" "heyyy" "hi" "test" ... 

, который является одной строки, 5 матрица-столбец, поэтому colSums в основном ничего не делает.

xtabs(as.vector(tdm)~tdm$dimnames$Terms) 
#tdm$dimnames$Terms 
# hey heyyy hi test teste 
# 1  1  1  2  1 

и после того, как замена, используя mgsub

xtabs(as.vector(tdm)~tdm$dimnames$Terms) 
#tdm$dimnames$Terms 
# hey hi test 
# 2 1 3 

xtabs делает sum из vector. Это также может быть сделано с tapply

tapply(as.vector(tdm), tdm$dimnames$Terms, FUN = sum) 

Если число строк больше 1, то мы можем использовать colSums

tapply(colSums(as.matrix(tdm)), tdm$dimnames$Terms, FUN = sum) 
# hey hi test 
# 4 2 6 

Примечание: Приведенный выше вывод после того, как мы сделали изменения с

+0

thx, это отличный ответ! Но в том случае, если у меня есть два документа и, следовательно, две строки и 5 столбцов, то приведенная выше функция не работает: 'df1 <- data.frame (word = c (" test "," test "," teste " , "hey", "heyyy", "hi")) df1.1 <- data.frame (слово = c ("teste", "teste", "teste", "hey", "heyyy", "hi" ")) tdm <- as.DocumentTermMatrix (as.character (df1 $ word)) tdm2 <- as.DocumentTermMatrix (as.character (df1.1 $ word)) tdm <- c (tdm, tdm2) ' – OAM

+0

@OAM В этом случае вы можете использовать' colSums' и использовать это в lhs of '~'. – akrun

+0

@OAM i.e. 'tapply (colSums (as.matrix (tdm)), tdm $ dimnames $ Terms, FUN = sum)' – akrun