|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- % Programmation avec Python (chapitre 5)
- % Dimitri Merejkowsky
-
-
- #
-
- \center \huge Suite de l'atelier précédent
-
- # Rappel
-
- Travail de la dernière fois.
-
- Les problèmes que j'ai vu:
-
- * noms
- * méthodologie
-
- #
-
- \center \huge naming
-
- # Quelques principes
-
- * L'un des problèmes les plus compliqué de l'informatique
-
- * Tout en Anglais
- * Pas d'abbréviation
- * Pas de redondance
-
- # Exemples
-
- * `get_freq` -> `get_frequencies`
- * `nom_fich` -> `filename`
- * `list_frag` -> `fragments` # le pluriel nous dit que c'est une liste
- * `liste_mot` -> `words`
-
- Essayez de rester cohérents!
-
- # Exemples (2)
-
- ```python
- # Avant
- for fragment in list_frag:
- fragment_min = fragment.lower()
- frag_clean = clean(fragment_min)
- liste_mot.append(frag_clean)
- ```
-
- ```python
- # Après
- for fragment in fragments:
- fragment = fragment.lower()
- fragment = clean(fragment)
- liste_mot.append(fragment)
- ```
-
- On peut ré-utiliser le même nom plusieurs fois!
-
- #
-
- \center \huge Style
-
- # Espaces
-
- * Deux lignes entre chaque fonction
- * Des espaces autour des `=` pour les affectations
- * Pas d'espace quand c'est un argument nommé
-
- #
-
- \center \huge Repartons du début
-
- # Découper les mots
-
- Dans la liste se trouvent des mots mal découpés:
-
- * `peutétre`
- * `lhumanité`
-
- Reprenons depuis le début
-
- # Tester chaque fonction une par une
-
- * Spécification
- * Test
- * Implémentation
-
- # Découpage en fragments - spécification
-
- On a:
-
- > L'univers est, peut-être, « infini! »
-
- On veut:
-
- ```python
- ["l", "univers", "est", "peut-être", '«', "infini", '»']
- ```
-
- On s'occupera d'enlever la ponctuation plus tard.
-
- # Découpage en fragments - test
-
- ```python
- contents = "L'unives est, peut-être, infini!"
- fragments = split_fragments(contents)
- print(fragments)
- ```
-
- # Découpage en fragments - implémentation
-
- ```python
- def split_fragments(contents):
- res = list()
- for fragment in contents.split():
- if "’" in fragment:
- (before, after) = fragment.split("’")
- res.append(before)
- res.append(after)
- else:
- res.append(fragment)
- return res
- ```
-
- # Découpage en mots - spécification
-
- On a:
-
- ```
- L'unives est, peut-être, « infini! »
- ```
-
- On veut:
-
- ```
- ['l', 'unives', 'est', 'peut-être', 'infini']
- ```
-
- # Découpage en mots - test
-
- ```python
- contents = "L'univers est, peut-être, « infini! »"
- words = split_words(contents)
- print(words)
- ```
-
- # Découpage en mots - implémentation
-
- On peut reprendre le code vu ensemble,
- avec quelques modifications:
-
- ```python
- def split_words(text):
- fragments = split_fragments(text)
- res = list()
- for fragment in fragments:
- fragment = fragment.lower()
- fragment = clean_fragment(fragment)
- if fragment: # le fragment peut-être vide ici
- res.append(fragment)
- return res
- ```
-
- # clean_fragment()
-
- Juste une petite modification:
-
- ```python
- def clean_fragment(fragment):
- result = ""
- for c in fragment:
- # autorise les tirets et apostrophes à l'intérieur
- # des mots
- if c.isalpha() or c in ["-", "'"]:
- result += c
- return result
- ```
-
- # Calcul des fréquences - spécification
-
- On a:
-
- ```python
- ["pomme", "poire", "banane", "poire", "banane", "banane"]`
- ```
-
- On veut:
-
- ```python
- {"pomme": 1, "poire": 2, "banane": 3}
- ```
-
- \vfill
-
- Note: par encore d'ordre ici!
-
- # Calcul des fréquences - test
-
-
- ```python
- words = [
- "pomme", "poire", "banane",
- "poire", "banane", "banane"
- ]
- frequencies = get_frequencies(words)
- print(frequencies)
- ```
-
- # Calcul des fréquences - implémentation
-
-
- ```python
- def get_frequencies(words):
- res = dict()
- for word in words:
- # Si le mot est déjà là, on incrémente
- # son compteur:
- if word in res:
- res[word] += 1
- else:
- # Sinon on crée une nouvelle clé
- # avec la valeur 1
- res[word] = 1
- return res
- ```
-
-
- # Tri - spécification
-
- On a:
-
- ```python
- {'pomme': 1, 'poire': 2, 'banane': 3}
- ```
-
- On veut:
-
- ```python
- [
- (3, 'banane'),
- (2, 'poire'),
- (1 'pomme'),
- ]
- ```
-
- # Tri - test
-
- ```python
- frequencies = {'pomme': 1, 'poire': 2, 'banane': 3}
- scores = get_scores(frequencies)
- print(scores)
- ```
-
-
- # Tri - implémentation
-
- ```python
- def get_scores(frequencies):
- res = list()
- for word, count in frequencies.items():
- res.append((count, word))
- res.sort(reverse=True)
- return res
- ```
-
- # Affichage des résultats
-
- On a :
-
- ```python
- scores = [
- (20, "banane"),
- (19, "poire"),
- ...
- ]
- ```
-
- On veut:
-
- ```
- 20 banane
- 19 poire
- ```
-
- # Affichage des résultats - test
-
- ```python
- scores = [
- (20, "banane"),
- (19, "poire"),
- ...
- ]
- print_scores(scores)
- ```
-
- # Affichage des résultats - implémentation
-
-
- ```python
- def print_scores(scores):
- for count, word in scores:
- print(count, word)
- ```
-
- # Assemblons les morceaux
-
- ```python
- def main():
- filename = "ruffin.txt"
- file = open(filename)
- contents = file.read()
- words = split_words(contents)
- frequencies = get_frequencies(words)
- scores = get_scores(frequencies)
- top_words = scores[:20] # le top 20
- print_scores(top_words)
-
- main()
- ```
-
- # Touches finales
-
- C'est bien si le nom du fichier est lu depuis la ligne de commande:
-
- ```python
- import sys
-
- def main():
- if len(sys.argv) < 2:
- sys.exit("not enough arguments")
- filename = sys.argv[1]
- ...
- ```
-
- #
-
- \center \huge Compléments
|