难以概念化如何让LDA-Ruby读取多个.txt文件

时间:2012-04-30 19:27:44

标签: ruby nlp lda

我正在尝试编写一个Ruby脚本,它将查看非结构化纯文本文件的集合,我正在努力思考处理这些文件的最佳方法。我的主题建模脚本的当前工作版本如下:

#!/usr/bin/env ruby -w

require 'rubygems'
require 'lda-ruby'

# Input a directory of files
FILES_DIRECTORY = ARGV[0]

File.open("files.csv", "w") do |f|
  Dir.glob(FILES_DIRECTORY + "*.txt") do |filename|
    file_id = File.basename(filename).gsub(".txt", "")
    text = File.read(filename).clean
    f.puts [file_id, text].join(",")
  end
end

# Read csv
file = File.open("files.csv", "r") { |f| f.read }

# Train topics and infer
corpus = Lda::Corpus.new
corpus.add_document(Lda::TextDocument.new(corpus, file))

lda = Lda::Lda.new(corpus)
lda.verbose = false
lda.num_topics = 20
lda.em('random')
topics = lda.top_words(10)

puts topics

我试图修改的是让这个程序读取一组纯文本文件而不是单个文件。它并不像将所有文本文件放入单个文件那样容易(因为它目前使用files.csv),因为据我所知,lda-ruby查找多个文件来执行正确的主题模型而不是单个文件。 (我得出了这个结论,因为让这个脚本读取包含所有文本的单个文本文件[例如corpus.txt]和files.csv文件之间几乎没有差异。)

所以,我的问题是如何让lda-ruby以不同方式迭代这些文本文件?应该将文件的内容放入哈希中吗?如果是这样,关于我应该从哪里开始的任何指针?或者,我应该废弃它并使用不同的LDA库吗?

提前感谢任何建议。

2 个答案:

答案 0 :(得分:1)

基本上,您只需要在浏览目录之前初始化语料库,然后将每个文件添加到块中的语料库,就像以前添加CSV文件一样。

#!/usr/bin/env ruby -w

require 'rubygems'
require 'lda-ruby'

# Input a directory of files
FILES_DIRECTORY = ARGV[0]

corpus = Lda::Corpus.new 

File.open("files.csv", "w") do |f|
  Dir.glob(FILES_DIRECTORY + "*.txt") do |filename|
    file = File.open(filename, "r") { |f| f.read }
    corpus.add_document(Lda::TextDocument.new(corpus, file))
  end
end

lda = Lda::Lda.new(corpus)
lda.verbose = false
lda.num_topics = 20
lda.em('random')
topics = lda.top_words(10)

puts topics

我知道这是一个相当古老的问题,但我在寻找类似问题的解决方案时发现了这个问题。您的代码帮助了我,所以我认为我的回答可能对您或其他人有所帮助。

答案 1 :(得分:1)

如果您有一个要用作文档的文本文件目录,可以使用以下行创建语料库:

corpus = Lda::DirectoryCorpus.new('path/to/directory')