URL: https://linuxfr.org/news/logotheras-compilateur-de-dictionnaires-de-langues Title: Logotheras, compilateur de dictionnaires de langues Authors: Xavier Faure ZeroHeure, Nÿco, Nils Ratusznik et Benoît Sibaud Date: 2013年09月30日T23:59:52+02:00 License: CC By-SA Tags: dictionnaire, python, linguistique, format_ouvert et langue Score: 20 En bref : [une bibliothèque](http://94.23.197.37/logotheras) (Python3, GPLv3) hébergée sous [GitHub](https://github.com/suizokukan/logotheras), permettant de lire des dictionnaires de langues ([au format texte](http://git.tuxfamily.org/tenez/gitrepository.git) 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. ---- [Projet de démonstration "tenez", dictionnaire anglais->français](http://projects.tuxfamily.org/?do=group;name=tenez) [Logotheras](http://94.23.197.37/logotheras/) [Logotheras sur GitHub](https://github.com/suizokukan/logotheras) ---- Qu'est-ce Logotheras ? ============================== Dans le cadre d'un projet personnel, [j](http://94.23.197.37)'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](http://94.23.197.37/logotheras/examples_textDBDict/tenez.textdbdict)) 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](http://94.23.197.37/dchars/doc/en/index.html)) 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](http://git.tuxfamily.org/tenez/gitrepository.git). Tout dictionnaire Logotheras existe comme une suite de fichiers texte stockés dans un répertoire. [À la racine du répertoire](http://git.tuxfamily.org/tenez/gitrepository.git?p=tenez/gitrepository.git;a=tree), 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](http://94.23.197.37/dchars/doc/en/index.html) 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](https://github.com/suizokukan/logotheras), de [Pylint](http://www.pylint.org/) pour vérifier mon code et de [Sphinx](http://sphinx-doc.org/) 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 !