Как я могу рефакторинг моего метода частоты слова? - PullRequest
0 голосов
/ 28 октября 2018

Это мой метод word_frequency.

def frequencies(text)
      words = text.split
      the_frequencies = Hash.new(0)
      words.each do |word|
        the_frequencies[word] += 1
      end
      return the_frequencies
    end

    def most_common_words(file_name, stop_words_file_name, number_of_word)
      # TODO: return hash of occurences of number_of_word most frequent words
      opened_file_string = File.open(file_name.to_s).read.downcase.strip.split.join(" ").gsub(/[^a-zA-Z \'$]/, "").gsub(/'s/, "").split
      opened_stop_file_string = File.open(stop_words_file_name.to_s).read.downcase.strip.split.join(" ").gsub(/[^a-zA-Z \']/, "").gsub(/'s/, "").split
      # declarar variables de file_name stop words.
      filtered_array = opened_file_string.reject { |n| opened_stop_file_string.include? n }
      the_frequencies = Hash.new(0)
      filtered_array.each do |word|
        the_frequencies[word] += 1
      end
      store = the_frequencies.sort_by { |_key, value| value }.reverse[0..number_of_word - 1].to_h
      store
    end

Работает хорошо, но я думаю, что могу сделать это лучше. Рубокоп говорит, что мои строки слишком длинные, и я согласен, но это мое лучшее. Может кто-нибудь объяснить, как я могу сделать это лучше?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Было бы хорошо, если бы вы просто разложили большие части.Most_common_words кажется все еще деликатным, вы могли бы объяснить, что вы пытаетесь сделать, чтобы увидеть, что еще можно сделать там.

Вы также можете использовать frequencies и посмотреть на шаблон внутриаргументы метода, подход ООП будет лучше здесь.

def join_file(file_name)
  File.open(file_name).read.downcase.strip.split.join(' ')
end

def frequencies(text)
  text.split.each_with_object(Hash.new(0)) { |word, hash| hash[word] += 1 }
end

def opened_file_string(file_name)
  join_file(file_name).gsub(/[^a-zA-Z \'$]/, '').gsub(/'s/, '').split
end

def opened_stop_file_string(file_name)
  @opened_stop_file_string ||= join_file(file_name).gsub(/[^a-zA-Z \']/, '').gsub(/'s/, '').split
end

def in_stop_file_string?(file_name, word)
  opened_stop_file_string(file_name).include?(word)
end

def filtered_array(file_name, stop_words_file_name)
  opened_file_string(file_name).reject do |word|
    in_stop_file_string?(stop_words_file_name, word)
  end
end

def frequencies_in_filtered_array(file_name, stop_words_file_name)
  frequencies(filtered_array(file_name, stop_words_file_name)).sort_by { |_, value| value }
end

def most_common_words(file_name, stop_words_file_name, number_of_word)
  frequencies_in_filtered_array(file_name.to_s, stop_words_file_name.to_s).reverse[0...number_of_word].to_h
end
0 голосов
/ 28 октября 2018

Это немного чище, использовать многострочный метод цепочки и т. Д.

def frequencies(text)
  words = text.split
  the_frequencies = Hash.new(0)
  words.each do |word|
    the_frequencies[word] += 1
  end
  the_frequencies
end

def pre_process_file(file_name)
  File.open(file_name.to_s)
      .read.downcase.strip.split.join(" ")
      .gsub(/[^a-zA-Z \'$]/, "")
      .gsub(/'s/, "")
      .split
end

def most_common_words(file_name, stop_words_file_name, number_of_word)
  # TODO: return hash of occurences of number_of_word most frequent words
  opened_file_string = pre_process_file(file_name)
  opened_stop_file_string = pre_process_file(stop_words_file_name)
  # declarar variables de file_name stop words.
  filtered_array = opened_file_string
                    .reject { |n| opened_stop_file_string.include? n }

  the_frequencies = Hash.new(0)
  filtered_array.each { |word| the_frequencies[word] += 1 }
  the_frequencies
    .sort_by { |_k, value| value }
    .reverse[0..number_of_word - 1]
    .to_h
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...