【问题标题】:How to go about data preparation for topic modeling in R (topicmodels, lda, tm)? [closed]如何为 R 中的主题建模(topicmodels、lda、tm)进行数据准备? [关闭]
【发布时间】:2013-11-08 16:57:12
【问题描述】:

我有一个冗长的 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 中的过程的东西。

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

【问题讨论】:

  • 这可能更适合Cross Validated(即stats.SE)——很难说。 但请不要交叉发布。如果您在这里没有得到满意的答案,您可以标记您的问题并要求版主迁移它。
  • 感谢您的 cmets。 1. 以后我会检查 Cross Validated,非常感谢。 2. topicmodels vignette 对理论背景很有帮助,让我对实际主题建模过程所需的功能和命令有一个模糊的概念。但是示例中的数据已经准备好,因此它并不能真正帮助我如何最好地对其进行预处理。不过谢谢!

标签: r lda topic-modeling


【解决方案1】:

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

  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 的书Text Analysis with R for Students of Literature

如果您已经对 MALLET 有点熟悉,请尝试使用 rmallet 进行主题建模。网上有很多代码 sn-ps 使用这个,here's one of mine

【讨论】:

  • 感谢您的建议,本。很抱歉这件事跑题了。我应该意识到这一点。不会再发生了。
  • 不用担心,如果您只需添加一些代码来展示您已经尝试过的内容,您的前两个问题将非常适合本论坛。当您准备好一些代码(并且您可以编写其他人可以复制的代码)时,为什么不单独询问他们?
  • sn-p 的代码看起来真的很有用。我将尝试处理我的代码,并在遇到下一个障碍时将其发布在一个单独的问题中(肯定会有一个障碍)。 :) 谢谢!
【解决方案2】:

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

  • 停用词删除:您可以通过 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找到

我了解到文本挖掘有点不同。在一种情况下改善结果的事情在另一种情况下不起作用。需要大量测试哪些参数和哪些预处理步骤可以改善您的结果......所以玩得开心!

【讨论】:

  • 这是非常棒的建议,我会使用它。非常感激!看来我还没有给你们投票的声誉,但是哦,好吧,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多