Размышлять об этом:
'b c c d'.split # => ["b", "c", "c", "d"]
'b c c d'.split.group_by{ |w| w } # => {"b"=>["b"], "c"=>["c", "c"], "d"=>["d"]}
'b c c d'.split.group_by{ |w| w }.map{ |k, v| [k, v.count] } # => [["b", 1], ["c", 2], ["d", 1]]
'b c c d'.split.group_by{ |w| w }.map{ |k, v| [k, v.count] }.to_h # => {"b"=>1, "c"=>2, "d"=>1}
Из этого мы можем построить:
dictionary = ['b', 'c']
word_count = 'b c c d'.split.group_by{ |w| w }.map{ |k, v| [k, v.count] }.to_h
word_count.values_at(*dictionary) # => [1, 2]
Если вы хотите пары ключей/значений, которые находятся в словаре, вы можете сделать это легко:
require 'active_support/core_ext/hash/slice'
word_count.slice(*dictionary) # => {"b"=>1, "c"=>2}
group_by
- очень полезный метод, который группируется по любым критериям, которые вы передаете ему. values_at
принимает список «ключей» и возвращает их соответствующие значения.
Существуют потенциальные проблемы при подсчете «слов», поскольку не весь текст приводит к тому, что мы рассмотрим слово после его разбиения на его составные подстроки. Например:
'how now brown cow.'.split # => ["how", "now", "brown", "cow."]
Обратите внимание, что последнее слово имеет пунктуацию, включенную в строку. Аналогичным образом, составные слова и другая пунктировка могут вызвать проблемы:
'how-now brown, cow.'.split # => ["how-now", "brown,", "cow."]
Задачи становится как удалить из тех, которые рассматриваются в качестве частей слов. Простая вещь, чтобы просто лишить их:
'how-now brown, cow.'.gsub(/[^a-z]+/, ' ').split # => ["how", "now", "brown", "cow"]
В современном сумасшедшем возрасте, хотя, мы видим слова, которые содержат цифры тоже, особенно такие вещи, как названия компаний и программ. Вы можете изменить шаблон в gsub
выше, чтобы обработать это, но как вам осталось выяснить.
Мы также видим смешанный футляр, поэтому ваш словарь нужно сгибать в верхний или нижний регистр, а рассматриваемая строка также должна быть свернута одинаково, , если только вы хотите знать разные значения когда почитание характер дела:
word_count = 'b C c d'.downcase.split.group_by{ |w| w }.map{ |k, v| [k, v.count] }.to_h # => {"b"=>1, "c"=>2, "d"=>1}
word_count = 'b C c d'.split.group_by{ |w| w }.map{ |k, v| [k, v.count] }.to_h # => {"b"=>1, "C"=>1, "c"=>1, "d"=>1}
анализируя содержание страниц часто начинается с такого рода кода, но многие правила должны быть написаны, чтобы указать, какие полезные слова и то, что является мусором. И, правила часто меняются от одного источника к другому, как их использование слов и цифр может нарушить полезность вашего кода быстро:
second
2nd
, например. Это становится «интересным».
Приведя пример, лучше всего показать желаемый или ожидаемый результат. Я предлагаю вам изменить это, возможно, сразу после определения словаря. Хорошо, что вы включили локальную переменную 'dictionary', чтобы читатели могли ссылаться на нее, не определяя ее. –
Взгляните на документацию Ruby Hash - есть примеры того, как ее создать и получить к ней - http://docs.ruby-lang.org/en/2.0.0/Hash.html –
На самом деле это два вопроса: Как подсчитать частоту слов в строке? »И« Как извлечь определенные значения из хэша? » Исследование тех, и у вас будет ваш ответ. Подсказка: это очень распространенные вопросы о переполнении стека, поэтому у вас не должно возникнуть проблем с поиском ответов. –