R:tm包,聚合/加入文档

时间:2015-01-19 16:33:59

标签: r metadata aggregate tm word-frequency

我找不到任何先前的问题,所以也许你可以提供帮助。

根据元数据(例如不同作者的汇总文本)汇总tm语料库中的数据有什么好方法?

至少有两种明显的方法可以做到:

  • tm中的内置函数,允许DocumentTermMatrix构建在元数据功能上。不幸的是,我无法揭开这一点。
  • 基于表中的某些外部元数据在语料库中连接文档的方法。它只会使用元数据来替换文档ID。

因此,您将拥有一个包含以下内容的表:DocumentId,AuthorName

包含大量文档的tm构建的语料库。我理解将表作为语料库对象的元数据引入并不困难。

可以使用以下功能构建矩阵。

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 <- ?

非常感谢!

2 个答案:

答案 0 :(得分: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])

结果矩阵将是一个标准矩阵,其中行是作者,列是单个术语。你应该能够做任何你想要的分析。

答案 1 :(得分: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))
}

可能有一个内部功能,我无法找到,所以我将不胜感激任何帮助!