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

それが行うことは、すべてのキーワードを組み合わせた 1 つの正規表現を作成することです。そうすれば、各キーワードではなく文をループするだけです。

于 2012-05-03T19:32:07.353 に答える