我正在尝试编写一个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库吗?
提前感谢任何建议。
答案 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')