2

我正在尝试编写一个 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. (我得出这个结论是因为让这个脚本读取corpus.txt包含所有文本的单个文本文件 [例如,] 和files.csv文件之间几乎没有差异。)

所以,我的问题是如何让 lda-ruby 以不同的方式遍历这些文本文件?是否应该将文件的内容放入散列中?如果是这样,关于我应该从哪里开始的任何指示?或者,我应该放弃这个并使用不同的 LDA 库吗?

提前感谢您的任何建议。

4

2 回答 2

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

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

于 2012-12-28T15:21:54.327 回答
1

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

corpus = Lda::DirectoryCorpus.new('path/to/directory')
于 2014-04-16T01:21:28.617 回答