
Lundi je suis allé chez un pote pour réviser des chansons de capoeira. Ce pote a un chouette cahier avec les chansons. Je me suis dit que j’allais faire la même chose.
J’ai pris un cahier (pour y écrire à la main) grand format (pour avoir la place d’écrire) spiral (pour pouvoir le retourner facilement, et arracher des pages facilement) avec une marge (pour y mettre des annotations). Bref, le même que lui.
Comme c’est un cahier, pas question d’insérer des pages (mais en supprimer ok, quitte à faire des trous dans la numérotation). Donc les chansons seront insérées au fur et à mesure de mon humeur, sans ordre (mais chacune aura sa page). Donc pour les retrouver ça sera la merde. Donc il me faut un moyen de les retrouver (par titre, thème, auteur…). De les retrouver en fonction de critères flous. Donc PAS un sommaire, ni une table des matière.
Un index
Mais faire un index dans un cahier papier, c’est pas comme faire un index sur un document électronique. Sur un doc électronique l’index se fait après que tout ai été écrit, et la mise en page peut donc se faire tranquillou. En fonction de la taille de l’index, en fonction de la taille que prend chaque entrée dans l’index.
Sur du papier, niet : pas possible de pousser les entrées de l’index pour y caser une autre lettre. Le problème de savoir à l’avance quelle taille va faire un index sur un cahier papier n’a pas vraiment de solution.
Mais on peut tricher un peu : quelle taille réserver à chaque lettre ?
Dit autrement : quelle est la proportion de mots commençant par chacune des lettres de l’alphabet ?
Dans mon index, il y aura des mots de toutes familles : auteurs, thèmes, incipit, ambiances, titre, difficulté… Donc aucune famille particulière, donc je peux en déduire que le panel de mots de mon index sera le même que celui de la langue (à un cheval près). Donc je peux aller chercher des stats sur la fréquence des première lettre des mots pour toute la langue et pas seulement pour un sous-ensemble (que j’ignore).
Stats
En fouillant le net on tombe vite sur des sites d’analyse fréquentielle mais pour les lettres dans les mots, pas seulement en première position. Je suis tombé sur un bout de code pour Wolfram. Mais fainéant comme je suis, j’ai cherché des stats toutes faites. Parce que je devais aller au treino, mais aussi parce que j’avais pas envie de me lancer dans script.
J’ai eu du mal à trouver des infos, mais en fouillant un peu (et en mettant ça dans un gdoc) :
Lettre | Occurrence | Fréquence | Fréquence cumulée |
---|---|---|---|
d | 47000 | 11,31% | 11,31% |
c | 45000 | 10,83% | 22,13% |
r | 41500 | 9,98% | 32,12% |
e | 40000 | 9,62% | 41,74% |
p | 34000 | 8,18% | 49,92% |
a | 31000 | 7,46% | 57,38% |
s | 27000 | 6,50% | 63,87% |
b | 21000 | 5,05% | 68,93% |
m | 21000 | 5,05% | 73,98% |
t | 20000 | 4,81% | 78,79% |
f | 15000 | 3,61% | 82,40% |
g | 13000 | 3,13% | 85,52% |
i | 13000 | 3,13% | 88,65% |
l | 9000 | 2,17% | 90,82% |
v | 8500 | 2,04% | 92,86% |
h | 8000 | 1,92% | 94,79% |
o | 6500 | 1,56% | 96,35% |
n | 5500 | 1,32% | 97,67% |
j | 3200 | 0,77% | 98,44% |
k | 1400 | 0,34% | 98,78% |
q | 1400 | 0,34% | 99,12% |
u | 1400 | 0,34% | 99,45% |
z | 1300 | 0,31% | 99,77% |
y | 436 | 0,10% | 99,87% |
w | 402 | 0,10% | 99,97% |
x | 130 | 0,03% | 100,00% |
La dernière colonne indique la fréquence de la lettre cumulée avec celle de toutes les lettres précédentes.
Surprenamment, en français le « d » et le « c » sont les plus fréquents.
Autre manière de faire
En chemin je me suis dit « tiens, en fait mes chansons seront en portugais, pas en français, en fait ! ». Et chercher les stats en portugais, quelque chose me dit que ça n’allait pas être simple. Donc j’ai sorti le shell.
Il me fallait une liste de mots en portugais. Peut-être pas une liste académiquement exhaustive non plus, mais une liste bien complète.
J’ai trouvé ça : https://github.com/kkrypt0nn/wordlists/tree/main/wordlists/languages
Après un peu de shell de base (cut -c1-1 | uniq -c
), on se retrouve avec des trucs étranges : des caractères diacritiques, et des majuscules, et un fichier qui n’était en fait pas trié.
Donc : iconv -t ASCII//TRANSLIT < portuguese.txt | sort | cut -c1-1 | tr '[:upper:]' '[:lower:]' | uniq -c | sort -rn
, c’est mieux :
Occurrences | Lettre |
---|---|
38476 | c |
31595 | a |
31436 | p |
26625 | m |
22373 | e |
18418 | t |
16249 | b |
Mais il me manque quelques stats, non ?
Je pourrais mettre ça dans un gdoc mais c’est tellement plus rigolo de faire avec du awk :
#!/usr/bin/awk
{
afl[tolower(substr($0,0,1))]+=1 # Lower case la première lettre et incrémente le bn d’occurrences de cette première lettre
} END {
PROCINFO["sorted_in"]="@val_num_desc" # Trie le tableau par la valeur, descendant
for (k in afl) {
p=100*afl[k]/NR # Proportion de cette lettre, en %
s+=p # Somme des proportions précédentes
printf "%s\t%i\t%.02f%%\t%.02f%%\n",k,afl[k],p,s
# Et hop ça donne:
# c 38477 12.32% 12.32%
# a 32306 10.34% 22.66%
# ...
}
}
Voilà pour le portugais :
Lettre | Occurrences | Fréquence | Fréquence cumulée | |
---|---|---|---|---|
c | 38477 | 12.32% | 12.32% | |
a | 32306 | 10.34% | 22.66% | |
p | 31436 | 10.06% | 32.72% | |
m | 26625 | 8.52% | 41.25% | |
e | 22666 | 7.26% | 48.50% | |
t | 18418 | 5.90% | 54.40% | |
b | 16249 | 5.20% | 59.60% | |
s | 15864 | 5.08% | 64.68% | |
d | 12501 | 4.00% | 68.68% | |
f | 12081 | 3.87% | 72.55% | |
g | 11193 | 3.58% | 76.13% | |
l | 11138 | 3.57% | 79.70% | |
r | 10047 | 3.22% | 82.92% | |
i | 9726 | 3.11% | 86.03% | |
h | 9434 | 3.02% | 89.05% | |
o | 7997 | 2.56% | 91.61% | |
n | 6918 | 2.21% | 93.82% | |
v | 6136 | 1.96% | 95.79% | |
j | 4679 | 1.50% | 97.29% | |
q | 3454 | 1.11% | 98.39% | |
u | 2975 | 0.95% | 99.34% | |
z | 973 | 0.31% | 99.66% | |
x | 863 | 0.28% | 99.93% | |
k | 110 | 0.04% | 99.97% | |
w | 71 | 0.02% | 99.99% | |
y | 30 | 0.01% | 100.00% |
Et pour le français :
Lettre | Occurrences | Fréquence | Fréquence cumuluée |
---|---|---|---|
d | 40494 | 12.03% | 12.03% |
r | 35831 | 10.65% | 22.68% |
e | 34873 | 10.36% | 33.04% |
c | 34210 | 10.17% | 43.21% |
p | 27075 | 8.05% | 51.25% |
a | 24378 | 7.24% | 58.50% |
s | 22364 | 6.65% | 65.14% |
m | 16292 | 4.84% | 69.98% |
t | 15972 | 4.75% | 74.73% |
b | 15106 | 4.49% | 79.22% |
f | 12485 | 3.71% | 82.93% |
i | 11711 | 3.48% | 86.41% |
g | 10190 | 3.03% | 89.44% |
v | 7217 | 2.14% | 91.58% |
l | 7077 | 2.10% | 93.68% |
h | 5841 | 1.74% | 95.42% |
o | 5372 | 1.60% | 97.02% |
n | 3889 | 1.16% | 98.17% |
j | 2398 | 0.71% | 98.88% |
q | 1131 | 0.34% | 99.22% |
u | 991 | 0.29% | 99.51% |
z | 796 | 0.24% | 99.75% |
k | 491 | 0.15% | 99.90% |
w | 192 | 0.06% | 99.95% |
y | 92 | 0.03% | 99.98% |
x | 63 | 0.02% | 100.00% |
Les 6 premières lettres sont les mêmes que le premier tableau, mais pas dans le même ordre. Ça reste dans les clous
En testant pour les autres langues, je m’aperçois que 5 ou 6 lettres prennent 50% des occurrences, sauf pour l’arabe (2 lettres).
Voilà le Makefile :
LANG_FROM=$(patsubst languages/%.txt,%,$(wildcard languages/*.txt))
# Hé oui, faut pas toucher à la var LANG
#LANG=$(patsubst languages/%.txt,%,$(wildcard languages/*.txt))
FL_LANG:=$(addsuffix .fl.txt,$(LANG_FROM))
all: $(FL_LANG)
clean:
rm -f $(FL_LANG)
$(FL_LANG): %.fl.txt: languages/%.txt
# En fonction de la langue, il faut ou pas mettre le iconv
# Mais flemme de hardcoder qui doit l'avoir ou pas
# !! Utiliser gawk(1) au lieu de mawk(1) ou autre awk est important !
iconv -f UTF-8 -t ASCII//TRANSLIT $< | gawk -f frequindex.awk > $@
#gawk -f frequindex.awk < $< > $@
debug:
$(info $(FL_LANG))
Mettez les fichiers de langue de https://github.com/kkrypt0nn/wordlists/tree/main/wordlists/languages dans languages
, et tout devrait rouler comme sur des roulettes.
Conclusion
Ce qui veut dire que dans mon index il faudra que je réserve la moitié de la place pour 6 lettres !