使用ruby将大量关键字与字符串匹配

时间:2016-03-24 16:31:03

标签: ruby regex performance

我一方面有很多文本文档,另一方面有很多关键字(字符串)。现在我很感兴趣,这些关键字中包含哪些关键字。

目前我正在使用一个怪异的自动生成的正则表达式:

keywords = %w(Key1, Key2, Key3)
regx = Regexp.new('\b(' + keywords.join('|') + ')\b','i')
documents.each |d|
    d.scan(regx)
end

这对于几百个关键字的列表非常有用,但现在我使用了大约50000个关键字并且它的速度太慢了。

使用ruby进行此类操作有更好的方法吗?

修改

  • 这些文件是典型的新闻文章,例如有关近期体育赛事的新闻,例如你可以通过谷歌新闻找到。在我的testset中,每篇文章包含大约1000个单词
  • 关键字可以是单个单词,但也可以是包含多个单词的短语,如“Franz Beckenbauer”或“Russel Wilson”。
  • 我只对完整的比赛感兴趣 - 所以搜索'diction'应该只匹配'diction',而不是'dictionary'

2 个答案:

答案 0 :(得分:1)

将关键字列表转换为哈希:

h = {
  "foo" => true,
  "bar" => true,
  ...
  "baz" => true,
}

然后,按块(以空格分隔)读取文档块:

File.new("/path/to/file").each(" ") do
  |ws| ws.scan(/[\w']+/) do
    |w| if h.key?(w)
      # Found.
    end
  end
end

答案 1 :(得分:0)

我会开始使用gem:phrasie 这会在(每个)文档中为您提供一系列单词, 您可以轻松地与关键字匹配。

看看:https://github.com/ashleyw/phrasie