ストップ ワードのリストに基づいて、Ruby の文字列を小さなサブ文字列またはフレーズに分割しようとしています。分割方法は、正規表現パターンを直接定義すると機能します。ただし、分割メソッド自体で評価してパターンを定義しようとすると機能しません。
実際には、ストップ ワードの外部ファイルを読み取り、それを使用して文を分割したいと考えています。そのため、パターンを直接指定するのではなく、外部ファイルからパターンを構築できるようにしたいと考えています。また、「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."]