我正在尝试根据停用词列表将 Ruby 中的字符串拆分为更小的子字符串或短语。split 方法在我直接定义正则表达式模式时起作用;但是,当我尝试通过在 split 方法本身内进行评估来定义模式时,它不起作用。
在实践中,我想阅读停用词的外部文件并用它来拆分我的句子。所以,我希望能够从外部文件构造模式,而不是直接指定它。我还注意到,当我使用“pp”和“puts”时,我的行为非常不同,我不知道为什么。我在 Windows 上使用 Ruby 2.0 和 Notepad++。
require 'pp'
str = "The force be with you."
pp str.split(/(?:\bthe\b|\bwith\b)/i)
=> ["", " force be ", " you."]
pp str.split(/(?:\bthe\b|\bwith\b)/i).collect(&:strip).reject(&:empty?)
=> ["force be", "you."]
上面的最终数组是我想要的结果。但是,这在下面不起作用:
require 'pp'
stop_array = ["the", "with"]
str = "The force be with you."
pattern = "(?:" + stop_array.map{|i| "\b#{i}\b" }.join("|") + ")"
puts pattern
=> (?thwit)
puts str.split(/#{pattern}/i)
=> The force be with you.
pp pattern
=> "(?:\bthe\b|\bwith\b)"
pp str.split(/#{pattern}/i)
=> ["The force be with you."]
更新:使用下面的评论,我修改了我的原始脚本。我还创建了一种拆分字符串的方法。
require 'pp'
class String
def splitstop(stopwords=[])
stopwords_regex = /\b(?:#{ Regexp.union(*stopwords).source })\b/i
return split(stopwords_regex).collect(&:strip).reject(&:empty?)
end
end
stop_array = ["the", "with", "over"]
pp "The force be with you.".splitstop stop_array
=> ["force be", "you."]
pp "The quick brown fox jumps over the lazy dog.".splitstop stop_array
=> ["quick brown fox jumps", "lazy dog."]