ruby-on-rails - 从字符串或字符串数​​组中删除多余的垃圾词

标签 ruby-on-rails ruby

我有数百万个数组,每个数组包含大约五个字符串。我试图从数组中删除所有“垃圾词”(因为缺乏更好的描述),例如所有演讲文章,“to”、“and”、“or”、“the”、“a”等等。

例如,我的一个数组有这六个字符串:

"14000"
"Things"
"to"
"Be"
"Happy"
"About"

我想从数组中删除 "to"

一个解决方案是:

excess_words = ["to","and","or","the","a"]
cleaned_array = dirty_array.reject {|term| excess_words.include? term}

但我希望避免手动输入每个多余的单词。有谁知道可以在此过程中提供帮助的 Rails 函数或助手?或者可能是一系列已经写好的“垃圾词”?

最佳答案

处理停用词很容易,但我建议您在将字符串拆分为组成词之前进行处理。

构建一个相当简单的正则表达式可以简化单词的工作:

STOPWORDS = /\b(?:#{ %w[to and or the a].join('|') })\b/i
# => /\b(?:to|and|or|the|a)\b/i

clean_string = 'to into and sandbar or forest the thesis a algebra'.gsub(STOPWORDS, '')
# => " into  sandbar  forest  thesis  algebra"

clean_string.split
# => ["into", "sandbar", "forest", "thesis", "algebra"]

如果你已经拆分了它们,你如何处理它们?我将 join(' ') 数组以将其变回字符串,然后运行上面的代码,它再次返回数组。

incoming_array = [
  "14000",
  "Things",
  "to",
  "Be",
  "Happy",
  "About",
]

STOPWORDS = /\b(?:#{ %w[to and or the a].join('|') })\b/i
# => /\b(?:to|and|or|the|a)\b/i

incoming_array = incoming_array.join(' ').gsub(STOPWORDS, '').split
# => ["14000", "Things", "Be", "Happy", "About"]

您可以尝试使用 Array 的集合操作,但您会与单词的大小写敏感性发生冲突,迫使您遍历停用词和数组,这将导致运行速度变慢。

查看这两个答案,了解一些关于如何构建非常强大的模式以轻松匹配数千个字符串的额外提示:

关于ruby-on-rails - 从字符串或字符串数​​组中删除多余的垃圾词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27825026/

相关文章:

ruby-on-rails - 为什么功能测试失败了?

ruby-on-rails - Rails 3 中的插件 vs 引擎,作为 gem 发布

ruby - 如何让 ruby​​ 的 xmlrpc 客户端忽略 SSL 证书错误?

ruby - 在 OS X Yosemite 上安装 compass

ruby-on-rails - 更新 rails 中模型的所有数据

ruby-on-rails - Rails 是否支持监听 UDP 套接字的简洁方式?

ruby-on-rails - I18n 不使用公寓 gem rails 加载翻译

ruby-on-rails - 编辑现有记录会创建重复的 Rails 5

ruby - RSpec 找不到嵌套的格式化程序

ruby - 压缩 {|n1, n2| Ruby 中的 n1 ^ n2}