Лучший способ проанализировать данные с помощью ruby - PullRequest
0 голосов
/ 13 сентября 2009

Я хотел бы проанализировать данные в моей базе данных, чтобы узнать, сколько раз появляются определенные слова. В идеале я хотел бы список из 20 лучших слов, используемых в определенном столбце. Какой самый простой способ сделать это?

Ответы [ 3 ]

1 голос
/ 14 сентября 2009

Счетчик слов ...

Я не был уверен, спрашивали ли вы, как заставить рельсы работать над этим или как считать слова, но я все равно продолжил и сделал ориентированный на столбцы рубиновый счетчик слов.

(Кстати, сначала я попробовал автовифицированный хеш, что за классный трюк.)


# col: a column name or number
# strings: a String, Array of Strings, Array of Array of Strings, etc.
def count(col, *strings) 
  (@h ||= {})[col = col.to_s] ||= {}
  [*strings].flatten.each { |s|
    s.split.each { |s|
      @h[col][s] ||= 0
      @h[col][s]  += 1
    }
  }
end
def formatOneCol a
  limit = 2
  a.sort { |e1,e2| e2[1]<=>e1[1] }.each { |results|
    printf("%9d %s\n", results[1], results[0])
    return unless (limit -= 1) > 0
  }
end
def formatAllCols
  @h.sort.each { |a|
    printf("\n%9s\n", "Col " + a[0])
    formatOneCol a[1]
  }
end

count(1,"how now")
count(1,["how", "now", "brown"])
count(1,[["how", "now"], ["brown", "cow"]])
count(2,["you see", "see you",["how", "now"], ["brown", "cow"]])
count(2,["see", ["see", ["see"]]])
count("A_Name Instead","how now alpha alpha alpha")

formatAllCols

$ ruby count.rb

    Col 1
        3 how
        3 now

    Col 2
        5 see
        2 you

Col A_Name Instead
        3 alpha
        1 how
$ 
1 голос
/ 13 сентября 2009

Создайте хеш-код с автоповреждением, а затем выполните цикл по строкам, заполняющим хэш и увеличивая значение каждый раз, когда вы получаете один и тот же ключ (слово). Затем сортируйте хэш по значению.

0 голосов
/ 14 сентября 2009

digitalross ответ кажется мне слишком многословным, так как вы помечаете ruby-on-rails и говорите, что используете DB ... Я предполагаю, что вам нужна модель activerecord, поэтому я даю вам полное решение

в вашей модели:

def self.top_strs(column_symbol, top_num)
  h = Hash.new(0)
  find(:all, :select => column_symbol).each do |obj|
    obj.send(column_symbol).split.each do |word|
      h[word] += 1
    end
  end

  h.map.sort_by(&:second).reverse[0..top_num]
end

например, Комментарий модели, тело столбца:

Comment.top_strs(:body, 20)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...