Tout à l'heure j'ai bidouillé mon détecteur de répétitions, pour en améliorer la détection de gravité.

Initialement, ça regardait le nombre d'instances d'une répétition divisé par l'écart-type de leurs distances de proche en proche, le tout écrété à 1.0 pour pouvoir faire des traitements simples dessus. Ce n'est pas bête, en gros plus on répète un terme de façon "en moyenne" proche, plus la répétition est grave.

J'avais pris un écart-type plutôt qu'une moyenne pour diminuer l'importance des points éloignés : si je dis "quelque chose bla bla quelque chose longtemps je me suis levé de bonne heure et c'était une bonne chose", la répétition "chose" contient trois occurrences dont deux très rapprochées et une assez lointaine : l'écart-type est plus petit que la moyenne et donc la répétition est plus grave.

Il y a trois problèmes avec cette fonction :

  • la dispersion des données est pourrie (en gros, les valeurs sont concentrées autour de 0), ce qui rend la valeur peu lisible (et me force à faire un traitement d'amplification pour la tranche basse au moment de la colorisation)
  • sur le même texte, on calcule que la répétition de "quelque" est plus grave que celle de "chose", alors que c'est intuitivement le contraire.
  • l'écrétage est violent : en pratique la formule avant écrétage fournit des valeurs entre 0 et, disons, 10 (expérimentalement sur une note de ce blog où j'use et abuse du mot "plus", je tombe à 8,5). Les valeurs sont essentiellement concentrées entre 0 et 1, mais tout ce qui est au-delà de 1 (donc les plus graves des répétitions) ne peut pas être comparé.

Si on utilise le minimum des distances plutôt que l'écart-type, on résoud le deuxième problème mais on accentue le troisième : dans mon exemple de tout à l'heure, les deux répétitions sur "quelque" et "chose" sont jugées extrêmement graves (à 1.0) et identiques, alors que celle sur "chose" est plus grave que celle sur "quelque".

Après quelques tâtonnements, je suis arrivé à : log15(20*(nombre/min(distance)) + 1)/2 en écrétant à 0 et à 1. C'est nettement mieux, mais je suis sûr qu'il y a moyen d'aller encore plus loin.

Ah, et j'ai changé l'algorithme de coloriage. Là où ça faisait bleu > vert > rouge, maintenant ça fait vert > jaune-orange > rouge. L'intensité du jaune / orange est la clé de la catégorie médiane (en gros, plus c'est orange "mûr" plus c'est grave).

Comme toujours l'application est accessible ici : http://fifokaswiti.info/pleo/pleo.p... et le code source, là : http://fifokaswiti.info/pleo.py.