Index et fréquence de premières lettres

Merci https://www.deviantart.com/n1ghtw1re/art/The-Guidance-Network-Upright-1204120956

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) :

LettreOccurrenceFréquenceFréquence cumulée
d4700011,31%11,31%
c4500010,83%22,13%
r415009,98%32,12%
e400009,62%41,74%
p340008,18%49,92%
a310007,46%57,38%
s270006,50%63,87%
b210005,05%68,93%
m210005,05%73,98%
t200004,81%78,79%
f150003,61%82,40%
g130003,13%85,52%
i130003,13%88,65%
l90002,17%90,82%
v85002,04%92,86%
h80001,92%94,79%
o65001,56%96,35%
n55001,32%97,67%
j32000,77%98,44%
k14000,34%98,78%
q14000,34%99,12%
u14000,34%99,45%
z13000,31%99,77%
y4360,10%99,87%
w4020,10%99,97%
x1300,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 :

OccurrencesLettre
38476c
31595a
31436p
26625m
22373e
18418t
16249b

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 :

LettreOccurrencesFréquenceFréquence cumulée
c3847712.32%12.32%
a3230610.34%22.66%
p3143610.06%32.72%
m266258.52%41.25%
e226667.26%48.50%
t184185.90%54.40%
b162495.20%59.60%
s158645.08%64.68%
d125014.00%68.68%
f120813.87%72.55%
g111933.58%76.13%
l111383.57%79.70%
r100473.22%82.92%
i97263.11%86.03%
h94343.02%89.05%
o79972.56%91.61%
n69182.21%93.82%
v61361.96%95.79%
j46791.50%97.29%
q34541.11%98.39%
u29750.95%99.34%
z9730.31%99.66%
x8630.28%99.93%
k1100.04%99.97%
w710.02%99.99%
y300.01%100.00%

Et pour le français :

LettreOccurrencesFréquenceFréquence cumuluée
d4049412.03%12.03%
r3583110.65%22.68%
e3487310.36%33.04%
c3421010.17%43.21%
p270758.05%51.25%
a243787.24%58.50%
s223646.65%65.14%
m162924.84%69.98%
t159724.75%74.73%
b151064.49%79.22%
f124853.71%82.93%
i117113.48%86.41%
g101903.03%89.44%
v72172.14%91.58%
l70772.10%93.68%
h58411.74%95.42%
o53721.60%97.02%
n38891.16%98.17%
j23980.71%98.88%
q11310.34%99.22%
u9910.29%99.51%
z7960.24%99.75%
k4910.15%99.90%
w1920.06%99.95%
y920.03%99.98%
x630.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 !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.