Подсчет количества вхождений строки в строку / массив - PullRequest
0 голосов
/ 15 января 2019

Я ожидаю вернуть все слова с максимальным количеством вхождений в данной строке. Ожидается, что следующий код сделает это:

t1 = "This is a really really really cool experiment cool really "

frequency = Hash.new(0)
words = t1.split
words.each { |word| frequency[word.downcase] += 1 }
frequency = frequency.map.max_by { |k, v| v }
puts "The words with the most frequencies is '#{frequency[0]}' with 
 a frequency of #{frequency[1]}."

Вывод:

The words with the most frequencies is 'really' with 
a frequency of 4.

Однако, это не работает, если есть, например, две строки, которые равны макс. Например, если я добавлю три cool s к тексту, он все равно вернет тот же результат, даже если счетчик cool также равен четырем.

Было бы неплохо, если бы вы сказали мне, будет ли этот метод работать и с массивом вместо строки.

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Попробуйте это.

t1 = "This is a really really really cool cool cool"

Шаг 1: разбить строку на массив слов

words = t1.split
  #=> ["This", "is", "a", "really", "really", "really", "cool", "cool", "cool"] 

Шаг 2: Вычислите ваш хэш частоты

frequency = Hash.new(0) 
words.each { |word| frequency[word.downcase] += 1 } 
frequency
  ##=> {"this"=>1, "is"=>1, "a"=>1, "really"=>3, "cool"=>3} 

Шаг 3: Определить максимальную частоту

arr = frequency.max_by { |k, v| v }
  #=> ["really", 3]
max_frequency = arr.last
  #=> 3

Шаг 4: Создать массив, содержащий слова с частотой max_frequency

arr = frequency.select { |k, v| v == max_frequency }
  #=> {"really"=>3, "cool"=>3} 
arr.map { |k, v| k }
  #=> ["really", "cool"] 

Обычный способ написать это на Ruby

words = t1.split
  #=> ["This", "is", "a", "really", "really", "really", "cool", "cool", "cool"] 
frequency = words.each_with_object(Hash.new(0)) do |word, f|
   f[word.downcase] += 1
end
  #=> {"this"=>1, "is"=>1, "a"=>1, "really"=>3, "cool"=>3} 
max_frequency = frequency.max_by(&:last).last
  #=> 3 
frequency.select { |k, v| v == max_frequency }.map(&:first)
  #=> ["really", "cool"]

Примечания

  1. e = [1,2,3].map #=> #<Enumerator: [1, 2, 3]:map>. Это говорит нам о том, что frequency.map.max_by { |k,v| v } совпадает с frequency.max_by { |k,v| v }.
  2. В frequency = frequency.map.max_by {|k, v| v }, frequency справа - хеш; frequency слева - массив. Обычно считается плохой практикой повторное использование переменных таким образом.
  3. Часто frequency.max_by { |k,v| v } записывается frequency.max_by { |_,v| v } или frequency.max_by { |_k,v| v }, главным образом, чтобы сообщить читателю, что первая переменная блока не используется в расчете блока. (Как я указывал выше, это утверждение обычно пишется frequency.max_by(&:last).) Примечание _ - допустимая локальная переменная.
  4. frequency.max_by { |k, v| v }.last можно вместо этого записать frequency.map { |k, v| v }.max, но это имеет тот недостаток, что map создает промежуточный массив из frequence.size элементов, тогда как первый создает промежуточный массив из двух элементов.
0 голосов
/ 15 января 2019
string = 'This is is a really a really a really cool cool experiment a cool cool really'

1). Разделить строку на массив слов

words = string.split.map(&:downcase)

2). Рассчитать максимальную частоту на основе уникальных слов

max_frequency = words.uniq.map { |i| words.count(i) }.max

3). Найти комбинации слова и частоты

combos = words.group_by { |e| e }.map { |k, v| [k, v.size] }.to_h

4). Выберите наиболее часто встречающиеся слова

most_frequent_words = combos.select { |_, v| v == max_frequency }.keys

Результат

puts "The words with the most frequencies are '#{most_frequent_words.join(', ')}' with a frequency of #{max_frequency}."
#=> The words with the most frequencies are 'a, really, cool' with a frequency of 4.
0 голосов
/ 15 января 2019

Вы уже нашли самое частое

greatest_frequency = frequency.max_by {|_, v| v }

Давайте использовать его, чтобы найти все слова, которые имеют эту частоту

most_frequent_words = frequency.select { |_, v| v == greatest_frequency }.keys
puts "The words with the most frequencies are #{most_frequent_words.join(', ')} with a frequency of #{greatest_frequency}."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...