Попробуйте следующего монстра:
hash.map(&:reverse).each_with_index
.sort_by(&:first).reverse
.take(2)
.sort_by(&:last)
.map { |(_,s),_| s }
Еще один функциональный:
hash.to_a.values_at(*hash.values.each_with_index
.sort.reverse
.map(&:last)
.sort.take(2))
.map(&:first)
Обратите внимание, что в качестве неупорядоченной структуры данных хеш-таблица не очень подходит для этого варианта использования (хотя порядок помнят в Ruby 1.9). Вместо этого следует использовать массив (код сортировки остается прежним):
sentences = [
['This is the first sentence.', 5],
['This is the second sentence.', 1],
['This is the last sentence.', 6],
]