働かないプログラマのメモ帳

2012-02-10

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

keyesberrykeyesberry 2012/02/11 12:25 1.8.7以降ですとEnumerable#each_consという便利なものがありますね.
str.chars.each_cons(2).map(&:join)

lettas0726lettas0726 2012/02/11 12:35 おお、いいですね!
こんな便利なメソッドがあったとは。
ありがとうございます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/lettas0726/20120210/1328873031
リンク元
Connection: close