2

我有一个关键字数组,可以有可变长度。对于这个例子,假设有 50 个:

keywords = ['dog','cat','monkey'...'bird']

我有一个句子数组(同样是可变长度),我想循环遍历,搜索每个关键字。

sentences = [ ['My dog ate cat food'], ['I went to the store.'], ... ]

如果句子包含任何关键字,那么我将把它移到一个新的“匹配”数组中。所以在 Ruby 中,我的代码看起来像这样:

sentences.each do |sentence|
  keywords.each do |keyword|
    if sentence.match(/\b#{keyword}\b/i)
      matched << sentence
    end
  end
end

这需要相当长的时间,而且似乎效率很低——特别是如果我有一个大的关键字列表和一个大的句子列表。我是第一个承认我的 Ruby 开发还不是很好的人——有没有更简单、更有效的方法来做到这一点?

我正在使用 MongoDB 来存储关键字和句子。如果有更好的方法使用数据库,我很想探索它。

4

1 回答 1

2

我以前没有使用过 MonogDB,但你可以稍微优化一下你的 ruby​​ 代码。由于您只关心句子中是否有任何关键字匹配,因此我会将逻辑推入 Ruby 正则表达式引擎:

regexp = keywords.map { |keyword| Regexp.quote(keyword) }.join('|')

matched = sentences.select do |sentence|
  sentence[0].match(/\\b(?:#{regexp})\\b/i)
end

这样做是制作一个结合了所有关键字的正则表达式。这样你只循环句子而不是每个关键字。

于 2012-05-03T19:32:07.353 回答