Logotheras, compilateur de dictionnaires de langues

20
1
oct.
2013
Python

En bref : une bibliothèque (Python3, GPLv3) hébergée sous GitHub, permettant de lire des dictionnaires de langues (au format texte ou sous forme d'une base de données), de les formater et d'en vérifier la cohérence, puis de les (ré)écrire au format texte ou sous forme d'une base de données. La version actuelle (0.1.6) permet seulement de travailler sur les fichiers texte. De manière générale, le projet n'a pas été testé de manière intensive.

Sommaire

Qu'est-ce Logotheras ?

Dans le cadre d'un projet personnel, j'ai eu besoin d'un module Python3 lisant et écrivant des données placées dans des dictionnaires. Le format des dictionnaires texte (un exemple ici) est propre à mon module et n'est pas compatible avec d'autres formats comme StarDict, Babylon, Lingvo ou Dictd.
Les données lues et écrites associent le(s) "sens" de chaque mot à des "extraits" illustrant ce(s) sens, extraits tirés d'un corpus.
Tout dictionnaire Logotheras repose donc sur un ensemble de textes, le corpus, découpé en extraits qui peuvent être traduits et commentés.
Logotheras peut utiliser l'une de mes bibliothèques (DChars) pour certaines langues : c'est DChars qui peut trier les mots et normaliser les caractères utilisés dans les mots.

À ce stade du projet, Logotheras n'a été testé que sous Linux. Pire, je n'ai même pas eu le temps d'en tester l'installation comme bibliothèque : si vous l'installez, copiez simplement tous les fichiers du projet dans un répertoire et utilisez le front-end logotheras.py livré avec !

Ceci dit, Logotheras commence à devenir utilisable : j'en fais l'annonce sur LinuxFr en espérant renouveler l'accueil chaleureux et instructif que j'ai toujours rencontré sur ce site.

Les fichiers texte et le format TextDBDict

À titre d'exemple, voyez tenez (anglais -> français, à prononcer [tenets]), le dictionnaire de démonstration - ce n'est pas un vrai projet - que vous trouverez à cette adresse.

Tout dictionnaire Logotheras existe comme une suite de fichiers texte stockés dans un répertoire. À la racine du répertoire, un fichier informations.textdbdict recense les auteurs, les titres, les éditions… Puis un sous-répertoire source contient tous les fichiers de données, au format TextDBDict.

Un fichier de données au format TextDBDict est une partie d'un dictionnaire ; en voici les divisions :

  • un dictionnaire est divisé en articles (un article par mot) ;
  • un article est divisé en entrées (une entrée par sens du mot) ;
  • une entrée est divisée en extraits (chaque extrait illustrant le sens).

Le format a été choisi afin qu'il soit facile de modifier le fichier texte ; la compilation permet en plus de formater le texte de ces fichiers.

D'autre part, un extrait est composé d'un texte : ce texte peut être accompagné d'une ligne précisant l'auteur du texte et sa référence (titre, position dans l'œuvre…). On pourra également ajouter une traduction et un commentaire.

Prenons l'exemple du projet Phokaia que je présenterai bientôt (dictionnaire grec ancien -> français). Voici la troisième entrée de l'article ἀλλὰ (="mais"), entrée explicitant le sens de l'expression "ἀλλὰ… μὴν". On y reconnaîtra le texte sur deux vers, la ligne entre parenthèses précisant d'où vient ce texte, puis la traduction (précédée de '=') et enfin une ligne de commentaire précédée de '#' :

(3) ἀλλὰ… μὴν : "oui et même"

    ναί, τέκνον, εἴπερ ἐστί γ᾽ ἐξοικήσιμος.
    ἀλλ᾽ ἐστὶ μὴν οἰκητός· […]
    (Sophocle•Œdipe à Colonne•27-28;free_edition)
    =(Œdipe) Oui ma fille, pour savoir si jamais il est habitable./(Antigone) Oui il l'est, il est même habité;{XF}
    #Œdipe vient de s'arrêter en un endroit inconnu; il demande donc à sa fille d'aller voir si l'endroit est ἐξοικήσιμος (habitable).

Enfin, d'autres possibilités existent encore ; par exemple, Logotheras peut traiter à part certaines entrées en les empêchant d'être triées avec les autres. Me consulter pour plus de détails.

Compilation d'un dictionnaire

J'ai écrit un front-end permettant d'appeler Logotheras depuis la ligne de commande, front-end que j'utiliserai dans les exemples suivants.

Un exemple minimaliste, pour simplement lire un répertoire TextDBDict :

(on supposera qu'il existe un sous-répertoire logs/ permettant d'accueillir les fichiers de logs)

$ ./logotheras.py --showstatistics --textinput=/home/xxx/projets/tenez/ … lit le contenu du répertoire tenez et affiche des statistiques sur les données. Vous y lirez par exemple :

articles : 114
extracts : 172
  * extracts with a workreference : 172 (100.00%)
  * unique extracts : 17 (9.88%)

Authors sorted by frequency :
  Shelley                        : 62.21% (107/172)
  Shakespeare                    : 30.23% (52/172)
  Robert Browning                : 7.56% (13/172)

Groups sorted by frequency :
  poésie                         : 69.77% (120/172)
  théâtre élisabéthain           : 30.23% (52/172)

Titles sorted by frequency :
  Ozymandias                     : 62.21% (107/172)
  Hamlet                         : 30.23% (52/172)
  My Last Duchess                : 7.56% (13/172)

Editions sorted by frequency :
  Wikipedia                      : 100.00% (172/172)

Translation sources sorted by frequency :
  XF                             : 100.00% (172/172)

Frequency of the number of extracts by entry :
                               3 :     9
                               2 :     7
                               1 :   131
                               0 :    24

List of the extracts :
  Robert Browning My Last Duchess                                    19-21                         
  Shakespeare     Hamlet                                             III.1, v.58                   
  Shakespeare     Hamlet                                             III.1, v.59-60                
  Shakespeare     Hamlet                                             III.1, v.61-62                
[…]

Options diverses pour la compilation

Un exemple plus complexe, pour lire un répertoire TextDBDict et en écrire le contenu vers /tmp/tenez/ ; Logotheras va donc réécrire plus ou moins les mêmes fichiers mais en les vérifiant et si besoin, en les normalisant :

$ ./logotheras.py --showstatistics --textinput=/home/xxx/projets/tenez/ --textoutput=/tmp/tenez/

Au lieu de récupérer un seul gros fichier de données, peut-être voulez-vous une série de fichiers de données limités à 10 articles par fichier ? Essayez alors --TEXTDBDICTwriteseveralfiles=10.
Ou peut-être voulez-vous trier vos fichiers de manière à ce que les mots de chaque fichier commencent par la même lettre ? Essayez alors --TEXTDBDICTwriteseveralfiles=a, ou --TEXTDBDICTwriteseveralfiles=aa pour des mots groupés selon leur deux premières lettres, etc.

Si vous ne désirez garder que ce que vous avez défini comme étant 100% libre, choisissez --minimalfreeness=100 ; à la place de 100 vous pouvez écrire le nombre de votre choix. Choisir --minimalfreeness=0 signifie que vous gardez tout. C'est dans le fichier informations.textdbdict que le degré de "liberté" des textes et des sources des traductions est défini.

Le problème de la normalisation est crucial pour certaines langues, comme le grec ancien : ainsi, faut-il écrire 'ά'(0x1F71) ou 'ά'(0x03AC) ? Logotheras peut faire appel à la bibliothèque DChars pour rectifier le nom des auteurs, des titres et des textes eux-mêmes. Ainsi, utilisez l'option --normalize=titles+authors pour normaliser les titres et le nom des auteurs. C'est également DChars qui peut s'occuper de trier les mots du dictionnaire, tâche non triviale pour certaines langues.

Outre --showstatistics, vous auriez intérêt à laisser --showerrorsnumber pour voir s'afficher le décompte des erreurs et des warnings.

Enfin, les messages peuvent être orientés vers trois flux : console, lastlog et rotatinglog. Le second crée un fichier de logs avec les messages de la dernière compilation, le troisième conserve tous les messages émis depuis l'installation de la bibliothèque. Ajoutez par exemple --logs=lastlog+rotatinglogs pour éliminer les messages vers la console et conserver les deux autres.

Écriture du code, choix de la licence

J'ai essayé de respecter les normes actuelles : code et documentation en anglais, utilisation de Git via GitHub, de Pylint pour vérifier mon code et de Sphinx pour écrire la documentation.
Il manque les tests unitaires qui ne sont pas encore écrits.

Quant à la licence GPLv3, j'ai attentivement suivi, sur LinuxFr, les fils de discussion consacrés à ce sujet . En deux mots : je suis conscient du caractère très restrictif de cette licence pour une bibliothèque et je fais ce choix pour des raisons plus idéologiques que pratiques.

Futurs développements, conclusion

Le développement de ce projet cessera quand les principales fonctionnalités seront codées : il manque essentiellement la lecture / écriture avec les bases de données. Si je demeure seul à développer Logotheras, une fois le lien avec les BDD correctement établi, je pourrais rapidement cesser de contribuer à ce projet.

Je ne cherche donc pas seulement des utilisateurs pour mon projet mais aussi des personnes désireuses d'en poursuivre le développement avec moi. En espérant que cela intéressera quelqu'un… merci de m'avoir lu !

  • # La GPLv3

    Posté par (page perso) . Évalué à 4.

    Est-ce que cela signifie qu'un logiciel qui utilise Logotheras doit forcément être sous GPLv3?

    Écrit en Bépo selon l’orthographe de 1990

    • [^] # Re: La GPLv3

      Posté par (page perso) . Évalué à -3.

      C'est un peu le soucis de Python… Avec Perl, tu upload ton module sur le CPAN et comme tout le monde, tu met la licence Perl (Artistic) et ca va bien.

      • [^] # Re: La GPLv3

        Posté par (page perso) . Évalué à 2.

        Sytoka Modon, merci de ta réponse.
        Je ne comprends pas ta remarque relative à Python : il est possible d'écrire en Python comme en Perl aussi bien des programmes sous license libre que des programmes propriétaires. Pourquoi alors distinguer Python de Perl ? Quand tu dis que « ça va bien », est-ce parce que tu considères la GPLv3 comme restrictive par rapport à la Perl Artistic ?

        Trust the Python !

        • [^] # Re: La GPLv3

          Posté par (page perso) . Évalué à 2.

          En Perl, je n'utilise comme la plupart des personnes QUE des modules dans le CPAN. Le CPAN est un outil collaboratif, un des premiers réseaux social dédié (après le CTAN). Donc tu utilises pour ton module (bibliothèque) la même licence que Perl c'est à dire GPL + Perl Artistic. Ainsi, le CPAN grossit, est libre et cohérent et on ne se pose pas la question de la licence pour les bibliothèques. C'est une zone de grand partage réutilisable par tous.

          L'écosystème de Python me semble bien plus répartis. Avec PIP, il télécharge les paquets on ne sais trop ou et les installe.

          Voila, je me positionne face a un écosystème existant, je ne cherche pas à comparer ici les licences libres.

    • [^] # Re: La GPLv3

      Posté par (page perso) . Évalué à 2. Dernière modification le 01/10/13 à 14:02.

      sinma : je me risque à répondre à une question plutôt compliquée et que je ne maîtrise pas.

      Si tu veux distribuer publiquement un projet utilisant Logotheras et que tu modifies ma bibliothèque, la réponse est oui, ton projet doit être GPLv3 ou une license libre compatible avec la GPLv3.
      Si tu veux distribuer publiquement un projet utilisant Logotheras et que tu ne modifies pas ma bibliothèque, la réponse dépend du degré de liaison entre ma bibliothèque et ton programme. Mais concrètement, dans la majorité des cas, ma bibliothèque et ton programme ne feront qu'un aux yeux de la license GPLv3 et tu devras distribuer ton projet sous une license GPLv3 ou compatible.

      Plus de détails ici mais j'aimerais avoir confirmation de mes dires, je ne me sens pas à l'aise sur ses questions.

      Trust the Python !

      • [^] # Re: La GPLv3

        Posté par (page perso) . Évalué à 3.

        En vérité, je me doutais de la réponse… Tu dis être au courant, mais cela risque de limiter grandement l'usage de ta bibliothèque… Tu considère que tant pis, il faut un logiciel séparé pour exploiter ta bibliothèque, ou que ce n'est pas utile pour des projets déjà existant sous une autre licence?

        Loin de moi l'idée de lancer un troll, mais tu aurais pu utiliser la LGPLv3. J'aimerais juste savoir si tu comprends bien les implications de ce choix de licence.

        Écrit en Bépo selon l’orthographe de 1990

        • [^] # Re: La GPLv3

          Posté par (page perso) . Évalué à 2.

          J'assume complètement ce choix qui me prive en effet de développeurs potentiels. J'ai la chance de ne pas avoir à me soucier de la popularité de mes projets et de pouvoir choisir leur license en toute indépendance. Pour ce genre de projet, seule compte pour moi l'idée qu'au final, c'est la license GPLv3 (ou assimilée) qui prévaudra. Merci de tes questions !

          Trust the Python !

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.