如何在R(topicmodels,lda,tm)中进行主题建模的数据准备?

时间:2013-10-29 13:42:13

标签: r lda topic-modeling

我有一个冗长的txt文件(每个文件大约20.000-30.000个单词)的语料库(622个文档),我正在尝试在R中探索。我已经使用tm包完成了一些基本的文本挖掘,并希望现在深入研究主题建模。然而,对于这一点非常新,我已经在努力解决一些基础数据准备工作。我目前使用的文件示例可在此处找到:http://s000.tinyupload.com/?file_id=46554569218218543610

  1. 我假设只是将这些冗长的文档提供给主题建模工具是毫无意义的。所以我想将它们分解成段落(或者可能是300-500个单词的集合,因为我的数据中存在大量冗余的段落中断和OCR错误)。你会在VCorpus中执行此操作还是应该实际划分我的源文件(例如使用shell脚本)?有什么建议或经验吗?

  2. 该文本来自OCR的杂志文章,所以如果我分开我的文档,我想我应该在这些段落中添加一个元数据标签,告诉我它原来是哪个问题(基本上只是原文件名),对吗?有没有办法轻松做到这一点?

  3. 一般来说,任何人都可以推荐R中主题建模的实用介绍吗?实际上,像三年级学生一样带着我的教程会很棒。我正在使用'topicmodels'和'lda'的文档,但对于新手而言,学习曲线相当陡峭。 编辑: 为了清楚起见,我已经阅读了很多关于主题建模的流行介绍(例如Scott WeingartMALLET tutorials for Historians)。我在想 R中的过程特有的东西。

  4. 希望这些问题不完全是多余的。感谢您花时间阅读!

2 个答案:

答案 0 :(得分:3)

我最近有一个类似的项目,通常,至少有一些步骤已完成:

  • 删除停用词:您可以通过tm包中的removeWords(your corpus, stopwords("english"))轻松完成此操作。你还可以 构建您自己的停用词列表并通过相同的删除它 功能。
  • 通常你也是数字和标点符号(见tm包) 除去。
  • 也很常见的是阻止(见Wikipedia的解释)和 删除稀疏术语,这有助于减少您的维度 术语文档矩阵,只有很少的信息丢失(在tm和RWeka中都有) 封装)。
  • 有些人也喜欢只使用名词/专有名词或名词 短语。有关概述和一些单词列表和部分,请参阅here 您可以在Kevin's Word List Page找到语音词典。
  • 关于段落中的分裂:这应该是可能的 来自Rweka软件包的NgramTokenizer请参阅tm package FAQ
  • 可以找到一篇关于预处理的好文章 here或更具科学性here
  • 关于元数据管理,请参阅tm package vignette
  • 可以找到另外一个R +主题模型示例Ponweiser 2012

我了解到文本挖掘有点不同。在一个案例中改善结果的事情在另一个案例中不起作用。很多测试参数和哪些预处理步骤可以改善您的结果......所以玩得开心!

答案 1 :(得分:3)

您的问题中没有代码,因此它并不适合此网站。也就是说,这里有一些可能有用的评论。如果您提供代码,您将获得更具体和有用的答案。

  1. 是。将文本分成块是常见且可取的。确切的尺寸是品味的问题。它通常在R中完成,我在制作语料库之前已经完成了。你也可以只对名词进行子集,就像@holzben建议的那样。这里有一些用于将语料库切割成块的代码:

    corpus_chunk <- function(x, corpus, n) {
    # convert corpus to list of character vectors
    message("converting corpus to list of vectors...")
    listofwords <- vector("list", length(corpus))
    for(i in 1:length(corpus))
      {
      listofwords[[i]] <- corpus[[i]]
      }
    message("done")
    # divide each vector into chunks of n words
    # from http://stackoverflow.com/q/16232467/1036500
    f <- function(x) 
    {
    y <- unlist(strsplit(x, " "))
    ly <- length(y)
    split(y, gl(ly%/%n+1, n, ly))
    }
    message("splitting documents into chunks...")
    listofnwords1 <- sapply(listofwords, f)
    listofnwords2 <- unlist(listofnwords1, recursive = FALSE)
    message("done")
    # append IDs to list items so we can get bibliographic data for each chunk
    lengths <- sapply(1:length(listofwords), function(i) length(listofnwords1[[i]]))
    names(listofnwords2) <- unlist(lapply(1:length(lengths), function(i)  rep(x$bibliodata$x[i], lengths[i])))
    names(listofnwords2) <- paste0(names(listofnwords2), "_", unlist(lapply(lengths,     function(x) seq(1:x))))
    return(listofnwords2)
    }   
    
  2. 是的,你可以先用一些代码开始,然后再回答一个更具体的问题。这就是您如何充分利用这个网站的方式。

  3. 有关文本挖掘和主题建模的基本介绍,请参阅Matthew Jockers&#39;预订Text Analysis with R for Students of Literature

  4. 如果您已经熟悉MALLET,请尝试rmallet进行主题建模。网络上有很多使用此代码段的代码段here's one of mine