RubyでN-gramを計算するメソッド

RubyN-gramを計算するメソッドを作ったよーって言うメモです。

class String
  def ngram n
    characters = self.split(//u)
    return [self] if characters.size <= n
    return 0.upto(characters.size-n).collect do |i|
      characters[i, n].join
    end
  end
end

p "おぎやはぎですけど何か問題でも?".ngram(2)
# => ["おぎ", "ぎや", "やは", "はぎ", "ぎで", "です", "すけ", "けど", "ど何", "何か", "か問", "問題", "題で", "でも", "も?"]

ideoneで動かした結果

※ 2012-02-11 12:14 追記 ちょっと改良しました

-      characters[i..(i+n-1)].join
+      characters[i, n].join

※ 2012-02-11 12:45 コメントでeach_consメソッドを教えてもらいました

class String
  def ngram n
    characters = self.split(//u)
    return [self] if characters.size <= n
    return characters.each_cons(n).collect(&:join)
  end
end