Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
Este repositório está arquivado. Pode ver ficheiros e cloná-lo, mas não pode fazer envios ou lançar questões ou pedidos de integração.

python-05.md 5.2 KiB

há 5 anos
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. % Programmation avec Python (chapitre 5)
  2. % Dimitri Merejkowsky
  3. #
  4. \center \huge Suite de l'atelier précédent
  5. # Rappel
  6. Travail de la dernière fois.
  7. Les problèmes que j'ai vu:
  8. * noms
  9. * méthodologie
  10. #
  11. \center \huge naming
  12. # Quelques principes
  13. * L'un des problèmes les plus compliqué de l'informatique
  14. * Tout en Anglais
  15. * Pas d'abbréviation
  16. * Pas de redondance
  17. # Exemples
  18. * `get_freq` -> `get_frequencies`
  19. * `nom_fich` -> `filename`
  20. * `list_frag` -> `fragments` # le pluriel nous dit que c'est une liste
  21. * `liste_mot` -> `words`
  22. Essayez de rester cohérents!
  23. # Exemples (2)
  24. ```python
  25. # Avant
  26. for fragment in list_frag:
  27. fragment_min = fragment.lower()
  28. frag_clean = clean(fragment_min)
  29. liste_mot.append(frag_clean)
  30. ```
  31. ```python
  32. # Après
  33. for fragment in fragments:
  34. fragment = fragment.lower()
  35. fragment = clean(fragment)
  36. liste_mot.append(fragment)
  37. ```
  38. On peut ré-utiliser le même nom plusieurs fois!
  39. #
  40. \center \huge Style
  41. # Espaces
  42. * Deux lignes entre chaque fonction
  43. * Des espaces autour des `=` pour les affectations
  44. * Pas d'espace quand c'est un argument nommé
  45. #
  46. \center \huge Repartons du début
  47. # Découper les mots
  48. Dans la liste se trouvent des mots mal découpés:
  49. * `peutétre`
  50. * `lhumanité`
  51. Reprenons depuis le début
  52. # Tester chaque fonction une par une
  53. * Spécification
  54. * Test
  55. * Implémentation
  56. # Découpage en fragments - spécification
  57. On a:
  58. > L'univers est, peut-être, « infini! »
  59. On veut:
  60. ```python
  61. ["l", "univers", "est", "peut-être", '«', "infini", '»']
  62. ```
  63. On s'occupera d'enlever la ponctuation plus tard.
  64. # Découpage en fragments - test
  65. ```python
  66. contents = "L'unives est, peut-être, infini!"
  67. fragments = split_fragments(contents)
  68. print(fragments)
  69. ```
  70. # Découpage en fragments - implémentation
  71. ```python
  72. def split_fragments(contents):
  73. res = list()
  74. for fragment in contents.split():
  75. if "’" in fragment:
  76. (before, after) = fragment.split("’")
  77. res.append(before)
  78. res.append(after)
  79. else:
  80. res.append(fragment)
  81. return res
  82. ```
  83. # Découpage en mots - spécification
  84. On a:
  85. ```
  86. L'unives est, peut-être, « infini! »
  87. ```
  88. On veut:
  89. ```
  90. ['l', 'unives', 'est', 'peut-être', 'infini']
  91. ```
  92. # Découpage en mots - test
  93. ```python
  94. contents = "L'univers est, peut-être, « infini! »"
  95. words = split_words(contents)
  96. print(words)
  97. ```
  98. # Découpage en mots - implémentation
  99. On peut reprendre le code vu ensemble,
  100. avec quelques modifications:
  101. ```python
  102. def split_words(text):
  103. fragments = split_fragments(text)
  104. res = list()
  105. for fragment in fragments:
  106. fragment = fragment.lower()
  107. fragment = clean_fragment(fragment)
  108. if fragment: # le fragment peut-être vide ici
  109. res.append(fragment)
  110. return res
  111. ```
  112. # clean_fragment()
  113. Juste une petite modification:
  114. ```python
  115. def clean_fragment(fragment):
  116. result = ""
  117. for c in fragment:
  118. # autorise les tirets et apostrophes à l'intérieur
  119. # des mots
  120. if c.isalpha() or c in ["-", "'"]:
  121. result += c
  122. return result
  123. ```
  124. # Calcul des fréquences - spécification
  125. On a:
  126. ```python
  127. ["pomme", "poire", "banane", "poire", "banane", "banane"]`
  128. ```
  129. On veut:
  130. ```python
  131. {"pomme": 1, "poire": 2, "banane": 3}
  132. ```
  133. \vfill
  134. Note: par encore d'ordre ici!
  135. # Calcul des fréquences - test
  136. ```python
  137. words = [
  138. "pomme", "poire", "banane",
  139. "poire", "banane", "banane"
  140. ]
  141. frequencies = get_frequencies(words)
  142. print(frequencies)
  143. ```
  144. # Calcul des fréquences - implémentation
  145. ```python
  146. def get_frequencies(words):
  147. res = dict()
  148. for word in words:
  149. # Si le mot est déjà là, on incrémente
  150. # son compteur:
  151. if word in res:
  152. res[word] += 1
  153. else:
  154. # Sinon on crée une nouvelle clé
  155. # avec la valeur 1
  156. res[word] = 1
  157. return res
  158. ```
  159. # Tri - spécification
  160. On a:
  161. ```python
  162. {'pomme': 1, 'poire': 2, 'banane': 3}
  163. ```
  164. On veut:
  165. ```python
  166. [
  167. (3, 'banane'),
  168. (2, 'poire'),
  169. (1 'pomme'),
  170. ]
  171. ```
  172. # Tri - test
  173. ```python
  174. frequencies = {'pomme': 1, 'poire': 2, 'banane': 3}
  175. scores = get_scores(frequencies)
  176. print(scores)
  177. ```
  178. # Tri - implémentation
  179. ```python
  180. def get_scores(frequencies):
  181. res = list()
  182. for word, count in frequencies.items():
  183. res.append((count, word))
  184. res.sort(reverse=True)
  185. return res
  186. ```
  187. # Affichage des résultats
  188. On a :
  189. ```python
  190. scores = [
  191. (20, "banane"),
  192. (19, "poire"),
  193. ...
  194. ]
  195. ```
  196. On veut:
  197. ```
  198. 20 banane
  199. 19 poire
  200. ```
  201. # Affichage des résultats - test
  202. ```python
  203. scores = [
  204. (20, "banane"),
  205. (19, "poire"),
  206. ...
  207. ]
  208. print_scores(scores)
  209. ```
  210. # Affichage des résultats - implémentation
  211. ```python
  212. def print_scores(scores):
  213. for count, word in scores:
  214. print(count, word)
  215. ```
  216. # Assemblons les morceaux
  217. ```python
  218. def main():
  219. filename = "ruffin.txt"
  220. file = open(filename)
  221. contents = file.read()
  222. words = split_words(contents)
  223. frequencies = get_frequencies(words)
  224. scores = get_scores(frequencies)
  225. top_words = scores[:20] # le top 20
  226. print_scores(top_words)
  227. main()
  228. ```
  229. # Touches finales
  230. C'est bien si le nom du fichier est lu depuis la ligne de commande:
  231. ```python
  232. import sys
  233. def main():
  234. if len(sys.argv) < 2:
  235. sys.exit("not enough arguments")
  236. filename = sys.argv[1]
  237. ...
  238. ```
  239. #
  240. \center \huge Compléments