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

如何为R(topicmodels、lda、tm)中的主题建模进行数据准备?,r,lda,topic-modeling,R,Lda,Topic Modeling,我有一个长txt文件的语料库(622个文档)(每个文件约20.000-30.000个单词),我正试图在R中探索。我已经使用tm软件包进行了一些基本的文本挖掘,现在想深入研究主题建模。然而,由于对这一点非常陌生,我已经在为数据准备的一些基础知识而挣扎。我目前正在使用的文件示例可在此处找到: 我假设仅仅将这些冗长的文档输入主题建模工具是没有意义的。因此,我想把它们分成几段(或者一组300-500字,因为我的数据中有很多多余的段落分隔符和OCR错误)。您是在VCorpus中执行此操作,还是我应该实际分

我有一个长txt文件的语料库(622个文档)(每个文件约20.000-30.000个单词),我正试图在R中探索。我已经使用tm软件包进行了一些基本的文本挖掘,现在想深入研究主题建模。然而,由于对这一点非常陌生,我已经在为数据准备的一些基础知识而挣扎。我目前正在使用的文件示例可在此处找到:

  • 我假设仅仅将这些冗长的文档输入主题建模工具是没有意义的。因此,我想把它们分成几段(或者一组300-500字,因为我的数据中有很多多余的段落分隔符和OCR错误)。您是在VCorpus中执行此操作,还是我应该实际分割源文件(例如,使用shell脚本)?有什么建议或经验吗

  • 文本来自OCR'ed杂志文章,因此如果我将文档拆分,我想我应该在这些段落中添加一个元数据标记,告诉我它最初来自哪个版本(基本上只是原始文件名),对吗?有没有一种方法可以轻松做到这一点

  • 一般来说,有人能推荐一个好的关于R中主题建模的实践介绍吗?实际上,一个像三年级学生一样牵着我的手的教程会很棒。我正在使用“topicmodels”和“lda”的文档,但对于新手来说,学习曲线相当陡峭。 编辑:为了清楚起见,我已经阅读了很多关于主题建模的流行介绍(例如。 以及)。我在想 特定于R中的过程的东西


  • 希望这些问题不是完全多余的。感谢您抽出时间阅读

    我最近做了一个类似的项目,通常至少完成了以下步骤:

    • 停止删除单词:您可以通过
      removeWords(您的
      语料库,stopwords(“英语”)
      来自tm软件包。你还可以 构建自己的停止词列表,并通过相同的方法将其删除 功能
    • 通常,数字和标点符号(见tm软件包)也是 删除
    • 词干分析(请参阅以获取解释)和 删除稀疏项,这有助于减少数据的维数 术语文档矩阵,信息损失很小(在tm和RWeka中 包装)
    • 有些人也喜欢只使用名词/专有名词或名词 短语。有关概述、一些单词列表和零件,请参见 您可以在上找到的语音词典
    • 关于段落拆分:这应该可以通过 Rweka包中的
      NgramTokenizer
      ,请参阅
    • 可以找到一篇关于预处理的文章 或者更科学
    • 关于元数据管理,请参见
    • 可以找到更多的R+主题模型示例

    我了解到文本挖掘有点不同。在一种情况下改善结果的方法在另一种情况下不起作用。这是一个测试哪些参数和哪些预处理步骤改善你的结果很多…所以玩得开心

    您的问题中没有代码,因此它并不真正适合此站点。尽管如此,以下是一些可能有用的评论。如果你提供代码,你会得到更具体和有用的答案

  • 对。将文本分成若干块是常见的,也是可取的。确切的尺寸取决于品味。这通常是在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)
    }   
    

    corpus\u chunk这可能更适合(即stats.SE)——很难说。不过,请不要越过柱子。如果你在这里没有得到满意的答案,你可以标记你的问题并要求主持人将其迁移。你看过topicmodels小插曲了吗:谢谢你的评论。1.我将在未来检查交叉验证,非常感谢。2.topicmodels vignette在理论背景方面非常有用,并使我对实际主题建模过程所需的功能和命令有了模糊的认识。但是示例中的数据已经准备好了,所以它并没有真正帮助我如何最好地预处理它。谢谢你!谢谢你的建议,本。抱歉,我的话偏离了主题。我应该意识到这一点。不会再发生了。不用担心,如果你只是添加一些代码来展示你已经尝试过的内容,那么你的前两个问题将非常适合这个论坛。当您准备好一些代码(并且您可以编写其他人可以复制的代码)时,为什么不单独询问他们呢?这段代码看起来非常有用。我会尝试编写我的代码,当我遇到下一个障碍时,我会在一个单独的问题中发布它(当然会有一个障碍)非常感谢。这是个很好的建议,我会用它的。非常感谢!看来我还没有足够的声望去投票给你们,但是哦,好吧,谢谢你们!