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

Remove excess junk words from string or array of strings

我有数百万个数组,每个数组包含大约五个字符串。我正在尝试从数组中删除所有 "junk words"(因为缺少更好的描述),例如所有演讲文章,"to"、"and"、[=16= 等词]、"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 函数或助手可以帮助这个过程?或者可能已经写入了 "junk words" 的数组?

您只需要一份英语停用词列表。您可以找到它 here,或 google for 'english stopwords list'

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

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

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(' ') 数组将其转回字符串,然后 运行 上面的代码,再次 returns 数组。

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 的集合操作,但您会 运行 与单词的大小写敏感性冲突,迫使您遍历停用词和数组,这将 运行慢很多。

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

  • "How do I ignore file types in a web crawler?"
  • "Is there an efficient way to perform hundreds of text substitutions in Ruby?"