Advertisement
Guest User

Untitled

a guest
Dec 7th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.14 KB | None | 0 0
  1. defmodule WordFreq.Parser do
  2. def work do
  3. read_file
  4. |> to_list
  5. |> group
  6. |> transform
  7. |> Enum.take(10)
  8. end
  9.  
  10. @doc """
  11. Read the word file and return a string
  12. """
  13. def read_file do
  14. {:ok, str} = File.read("words.txt")
  15. str
  16. end
  17.  
  18. @doc """
  19. Converts the text to a list of words, making sure they are all downcase
  20. """
  21. def to_list(text) do
  22. text
  23. |> String.replace("\n", " ") # Remove line breaks
  24. |> String.split(" ") # Split on every blank space
  25. |> Enum.filter(&(&1 != "")) # Remove empty strings
  26. |> Enum.map(&String.downcase/1) # Transforms to downcase
  27. end
  28.  
  29. @doc """
  30. Just a group_by
  31. """
  32. def group(word_list) do
  33. Enum.group_by(word_list, &(&1))
  34. end
  35.  
  36. @doc """
  37. Transforms the structure into something more readable
  38. """
  39. def transform(words) do
  40. words
  41. |> Map.to_list # transforms %{"word" => ["word", "word"]} to [{"word", ["word", "word"]}]
  42. |> Enum.map(fn {key, values} -> {key, length(values)} end) # Create new tuple for each element with the repetition count
  43. |> Enum.sort_by(fn {_,v} -> v end, &>=/2) # sort by repetition. `>=/2` is a function reference for sorting ASC
  44. end
  45. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement