3

作业说明: http: //pastebin.com/pxJS4gfR

目标:获取文档集合并生成其倒排索引。

我的计划

  1. 从集合文件中获取相关字符串
  2. 标记它们并将它们放入哈希中以供以后使用。

我正在使用以下正则表达式\.I(.*?)\.B\m从集合文件中获取所需的文本,如下所示:http ://rubular.com/r/mOpfuvRT12

编辑:我使用了mudasobwa的建议

content = File.read('test.txt')
# deal with content
content.scan(/\.T(.*?)\.B/m) { |mtch| 
  puts mtch 
}

这抓取了我需要的必要文本,但是我需要将抓取的文本放入一个 Hash 以供以后使用,我不确定如何使用它,String.scan/regex/因为它返回一个数组数组。

我基本上是想复制这个例子:

puts "Enter something: "
text = gets.chomp
words = text.split(" ")
frequencies = Hash.new(0)
words.each do |word|
    frequencies[word] += 1
end
frequencies = frequencies.sort_by { |k, v| v }
frequencies.reverse!
frequencies.each do |word, freq|
    puts word + " " + freq.to_s
end
4

1 回答 1

5

您正在尝试逐行读取文件。在这种情况下,/m多行修饰符没有意义。您将阅读整个文件,然后将其解析为您想要的任何内容:

content = File.read('test.txt')
content.scan(/\.T(.*?)\.B/m) { |mtch| 
  puts mtch 
}

UPD 要像示例中那样将扫描结果放入散列,您需要flatten数组的任一方法:

content = File.read('test.txt')
# flatten the array                  ⇓⇓⇓⇓⇓⇓⇓
words = content.scan(/\.T(.*?)\.B/m).flatten
words.each …

或在scan方法内阻塞:

content = File.read('test.txt')
freqs = {}
content.scan(/\.T(.*?)\.B/m) { |mtch| 
  (freqs[mtch] ||= 0) += 1 
}
…

UPD2split生成的句子数组转换为单词数组:

arr = ["Preliminary Report International", "Fingers or Fists"]   
arr.map {|e| e.split(' ')}.flatten.map(&:downcase)
# ⇒  ["preliminary", "report", "international", "fingers", "or", "fists"]

这里首先map迭代数组元素并将它们转换为拆分单词flatten的数组,从生成的数组数组中生成纯数组,最后,downcase因为您在示例中请求了小写单词,所以在这里。

希望能帮助到你。

于 2013-10-03T04:23:57.333 回答