我有一个关键字数组,其长度可以是可变的。对于此示例,假设有 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 来存储关键字和句子。如果有更好的使用数据库的方法,我很乐意探索。
最佳答案
我以前没有使用过 MonogDB,但是你可以稍微优化你的 ruby 代码。由于您只关心句子中是否有 any 关键字匹配,因此我会将逻辑插入 Ruby 正则表达式引擎:
regexp = keywords.map { |keyword| Regexp.quote(keyword) }.join('|')
matched = sentences.select do |sentence|
sentence[0].match(/\\b(?:#{regexp})\\b/i)
end
它的作用是创建一个组合所有关键字的正则表达式。这样你就只循环句子而不是每个关键字。
关于ruby - 最佳实践 : Text-search in Ruby, 还是让 MongoDB 来做这项工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10437886/