计算符号的频率

时间:2014-11-14 02:17:06

标签: ruby frequency

所以我有以下代码来计算字符串中每个字母的频率(或者在文件的特定实例中):

def letter_frequency(file)
  letters = 'a' .. 'z'
  File.read(file) .
  split(//) .
  group_by {|letter| letter.downcase} .
  select   {|key, val| letters.include? key} .
  collect  {|key, val| [key, val.length]}
end

letter_frequency(ARGV[0]).sort_by {|key, val| -val}.each {|pair| p pair}

哪个效果很好,但是我想看看是否有某种东西在红宝石中做类似于此的东西,但要捕捉所有不同的可能符号?即空格,逗号,句号,以及介于两者之间的所有内容。我想更简单地说,是否有类似于'a' .. 'z'的东西,它包含所有符号?希望有道理。

2 个答案:

答案 0 :(得分:1)

当您尝试计算每个可能的角色时,您将不需要范围,因为每个可能的角色都是一个域。只有当您特别需要使用所述域的子集时,才应创建范围。

这可能是一个更快的实现,它计算文件中的所有字符:

def char_frequency(file_name)
  ret_val = Hash.new(0)
  File.open(file_name) {|file| file.each_char {|char| ret_val[char] += 1 } }
  ret_val
end

p char_frequency("1003v-mm")  #=>  {"\r"=>56, "\n"=>56, " "=>2516, "\xC9"=>2, ...

作为参考,我使用了this test file

答案 1 :(得分:0)

它可能不会使用Ranges的Ruby魔法,但一种简单的方法是构建一个字符计数器,它迭代字符串中的每个字符并计算总数:

class CharacterCounter
  def initialize(text)
    @characters = text.split("")
  end

  def character_frequency
    character_counter = {}      
    @characters.each do |char|
      character_counter[char] ||= 0
      character_counter[char] += 1
    end

    character_counter
  end

  def unique_characters
    character_frequency.map {|key, value| key}
  end

  def frequency_of(character)
    character_frequency[character] || 0
  end
end

counter = CharacterCounter.new("this is a test")
counter.character_frequency # => {"t"=>3, "h"=>1, "i"=>2, "s"=>3, " "=>3, "a"=>1, "e"=>1}
counter.unique_characters # => ["t", "h", "i", "s", " ", "a", "e"]

counter.frequency_of 't' # => 3
counter.frequency_of 'z' # => 0