在textscraper中防止或删除重复项?

时间:2013-03-21 13:54:35

标签: ruby search duplicates scraper

我有一个代码可以解析文件夹中的文本文件,并在某些搜索词周围保存预定义数量的单词。

例如,它会查找“日期”和“年份”等字词。如果它在同一个句子中找到它,它将保存句子两次。此外,如果它在一个句子中发现了几次使用相同的单词,它也会多次保存。

这样刮刀可以节省大量不必要的重复文本。

我看到两种可能的解决方案:

  1. 如果下一个搜索匹配位于前一个匹配的填充中,则不会保存。
  2. 如果搜索匹配的一组,例如七个单词也是前一组的一部分,则不会保存/删除。
  3. 我尝试过的所有事情都因此完全失败了:

    #helper
    def indices text, index, word
        padding = 200
        bottom_i = index - padding < 0 ? 0 : index - padding
        top_i = index + word.length + padding > text.length ? text.length : index +         word.length + padding
        return bottom_i, top_i
    end
    
    #script
    base_text = File.open("base.txt", 'w')
    Dir::mkdir("summaries") unless File.exists?("summaries")
    Dir.chdir("summaries")
    
    Dir.glob("*.txt").each do |textfile|
        whole_file = File.open(textfile, 'r').read
        puts "Currently summarizing " + textfile + "..."
        curr_i = 0
        str = nil
        whole_file.scan(Regexp.union(/firstword/, /secondword/).each do |match|
          if i_match = whole_file.index(match, curr_i)
            top_bottom = indices(whole_file, i_match, match)
            base_text.puts(whole_file[top_bottom[0]..top_bottom[1]] + " : " +         File.path(textfile))
            curr_i += i_match                     
          end
        end
        puts "Done summarizing " + textfile + "."
    end
    base_text.close
    

2 个答案:

答案 0 :(得分:0)

最好是比:

更好的东西
whole_file.scan(Regexp.union(/firstword/, /secondword/).each do |match|
  if i_match = whole_file.index(match, curr_i)
    top_bottom = indices(whole_file, i_match, match)
    base_text.puts(whole_file[top_bottom[0]..top_bottom[1]] + " : " +         File.path(textfile))
    curr_i += i_match + 50                     
  end        
end

答案 1 :(得分:0)

为什么不做一些跟踪你要找的东西的事情:

search_words = %w( year date etc )

然后将搜索字符串缩小,并启动索引。

def summarize(str)
  search_str = str.downcase
  ind = 0

然后在search_str中找到搜索词的最小索引偏移量,并删除所有内容(ind + offset - delta),最多到(ind + delta)匹配,然后继续while循环。类似的东西:

  matches = []
  while (offset = search_words.map{|w| search_str.index w }.min)
    ind += offset
    matches.push str[ind - delta, delta * 2]
    search_str = search_str[offset + delta, ]
  end
  matches
end