2015-01-19 6 views
0

Я не мог найти никаких предыдущих вопросов, размещенных на этом, так что, возможно, вы можете помочь.R: tm package, aggregate/join docs

Что такое хороший способ агрегирования данных в tm corpus на основе метаданных (например, совокупные тексты разных авторов)?

Есть по крайней мере два очевидных способа это может быть сделано:

  • Встроенная функция в тм, что позволило бы DocumentTermMatrix быть построен на функции метаданных. К сожалению, я не смог раскрыть это.
  • Способ объединения документов внутри корпуса на основе некоторых внешних метаданных в таблице. Он просто использовал метаданные для замены идентификаторов документов.

Таким образом, вы бы таблица, которая содержит: DocumentId, AUTHORNAME

И тм встроенного корпус, который содержит некоторое количество документов. Я понимаю, что нетрудно представить таблицу как метаданные для объекта corpus.

Матрица может быть построена со следующей функцией.

library(tm) # version 0.6, you seem to be using an older version 
corpus <-Corpus(DirSource("/directory-with-texts"), 
readerControl = list(language="lat")) 

metadata <- data.frame(DocID, Author) 

#A very crude way to enter metadata into the corpus (assumes the same sequence): 
for (i in 1:length(corpus)) { 
    attr(corpus[[i]], "Author") <- metadata$Author[i] 
} 

a_documenttermmatrix_by_DocId <-DocumentTermMatrix(corpus) 

Как бы вы построили матрицу, которая показывает частоты для каждого автора, возможно, для объединения нескольких документов вместо документов? Было бы полезно сделать это только на этом этапе, а не в пост-обработке с несколькими терминами.

a_documenttermmatrix_by_Author <- ? 

Большое спасибо!

ответ

0

У меня есть очень грубое обходное решение для этого, если текст корпуса можно найти в таблице. Однако это не очень помогает с большим корпусом в формате «tm», однако в других случаях это может быть удобно. Не стесняйтесь улучшать его, так как он очень груб!

custom_term_matrix <- function(author_vector, text_vector) 
{ 
    author_vector <- factor(author_vector) 
    temp <- data.frame(Author = levels(author_vector)) 

    for (i in 1:length(temp$Author)){ 
    temp$Content[i] <- paste(c(as.character(text_vector[author_vector == 
     levels(author_vector)[i]])), sep=" ", collapse="") 
    } 

    m <- list(id = "Author", content = "Content") 
    myReader <- readTabular(mapping = m) 
    mycorpus <- Corpus(DataframeSource(data1), readerControl = list(reader = myReader)) 

    custom_matrix <<- DocumentTermMatrix(mycorpus, control = 
    list(removePunctuation = TRUE)) 
} 

Там, вероятно, является функцией внутренней по отношению к тм, что я не смог найти, поэтому буду благодарен за любую помощь!

1

DocumentTermMatrix - это действительно просто матрица с причудливой одеждой (простая матрица триплетов из библиотеки slam), которая содержит термины частот для каждого термина и документа. Агрегирование данных из нескольких документов автором действительно просто добавляет столбцы для автора. Рассмотрю форматирование матрицы в качестве стандартной матрицы R и использовать стандартные/методы на общую Подменю:

# Format the document term matrix as a standard matrix. 
# The rownames of m become the document Id's 
# The colnames of m become the individual terms 
m <- as.matrix(dtm) 

# Transpose matrix to use the "by" operator. 
# Rows become individual terms 
# Columns become document ids 
# Group columns by Author 
# Aggregate column sums (word frequencies) for each author, resulting in a list. 
author.list <- by(t(m), metadata$Author, colSums) 

# Format the list as a matrix and do stuff with it 
author.dtm <- matrix(unlist(author.list), nrow = length(author.list), byrow = T) 

# Add column names (term) and row names (author) 
colnames(author.dtm) <- rownames(m) 
rownames(author.dtm) <- names(author.list) 

# View the resulting matrix 
View(author.dtm[1:10, 1:10]) 

Результирующая матрица будет стандартная матрицей, где строки являются авторами, а столбцы являются отдельными терминами. Вы должны иметь возможность делать любой анализ, который вы хотите в этот момент.

 Смежные вопросы

  • Нет связанных вопросов^_^