Journal Hermaia

17
15
avr.
2014

en bref : Hermaia est un projet (Python3/GPLv3) pour créer et consulter des listes de mots préalablement analysés du point de vue morphologique. Un exemple ici (si vous voyez n'importe quoi, pensez à utiliser l'unicode comme encodage).


Hermaia est un (très modeste) projet (Python3/GPLv3) permettant

  • de créer une liste de mots accompagnés de leur analyse morphologique. Exactement comme si l'on associait le mot "aimerai" à "aimer"+"futur.3S".
  • de rechercher un mot et de l'analyser. Ex : est-ce que le mot "aimerai" existe ? Oui, il s'agit d' "aimer"+"futur.3S" .

Un objet Hermaia lit et écrit ses informations dans une base de données MySQL pour la structure de laquelle j'ai dû demander de l'aide.
Il est également possible de demander une image texte (un dump) de la base de données : on obtient alors un fichier texte qu'il est possible de modifier et de retransformer en base de données.

La base de données est gérée par le module sqlite3 : si certains veulement m'aider à utiliser PostgreSQL, je suis preneur.

La recherche se fait par l'intermédiaire d'un buffer qui garde en mémoire les demandes les plus fréquentes.

J'ai essayé d'écrire un code aussi propre que possible : Pylint m'accorde une note de 10/10 au prix de quelques concessions (voir le fichier pylint.rc dans le dépôt).


Comment utiliser Hermaia pour chercher un mot dans la base ?

with sqlite3.connect("database.db") as database:
    with Hermaia(database = database) as h:
        h.search("aimerai")

… ce qui renvoie une liste des occurrences du mot à chercher : dans le cas d' "aimerai", cette liste serait composée d'un seul dict contenant les informations nécessaires.


Comment remplir la base de données ? L'exemple de Phokaia

J'ai développé Hermaia pour servir d'extension au projet Logotheras qui crée des dictionnaires. Comme les articles d'un dictionnaire Logotheras peuvent contenir l'ensemble des formes possibles d'un mot (project inflectiones) il suffit de récupérer le contenu du tableau généré et de l'injecter dans la base de données.
Travaillant principalement sur une ébauche de dictionnaire grec ancien->français j'ai donc récupéré l'ensemble des formes calculées. Le résultat se trouve . Le résultat me paraît encourageant.


et la suite ?

Je cherche des personnes susceptibles de m'aider à passer de MySQL à PostgreSQL mais aussi des profils plus orientés "lettres" et désireux d'utiliser Hermaia pour leurs projets personnels, pour d'autres langues… Faites-moi signe !

  • # Passage de MySQL à PostgreSQL

    Posté par (page perso) . Évalué à 8. Dernière modification le 15/04/14 à 21:35.

    Personnellement, je ne peux qu'encourager de passer par un ORM (SQLAlchemy).

    Ça demande un investissement un peu plus grand au début, mais ça se révèle en général un gain de temps très important sur le reste : tu vas plus vite pour coder tes requêtes, la gestion des connexions va se faire de façon transparente, et surtout tu pourras passer d'un moteur à l'autre sans souci. Accessoirement, ça permet de rejeter la sécurité sur l'ORM, sachant qu'il s'en occupera de toute façon bien mieux que toi (sauf si tu es spécialiste du sujet).

    • [^] # Re: Passage de MySQL à PostgreSQL

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

      C'est vrai que ça donne envie : je ne connaissais pas, merci du renseignement.

      Trust the Python !

      • [^] # Re: Passage de MySQL à PostgreSQL

        Posté par . Évalué à 2.

        Pas mieux en ce qui concerne l'ORM !
        Je n'ai utilisé que SQLAlchemy donc je ne peux pas t'en donner d'autres.

        En tous cas de ce que je vois de ton code, c'est qu'il est bien aéré et commenté alors ce sera pas spécialement trop dur d'y coller un ORM :)

    • [^] # Re: Passage de MySQL à PostgreSQL

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

      du peu que j'ai vu, ça utilise sqlite et non pas mysql. Sur ce type de projet, quel intérêt d'utiliser mysql ou PostgreSQL ? Sqlite me semble plus facile pour l'utilisateur final (1 fichier de base de donnée).

      Ton projet a l'air intéressant par contre est-ce qu'il est possible de le tester sans l'installer sur le système ? Par exemple en lançant la commande de test ça ne trouve pas le dossier de module situé dans la racine ou le dossier parent (ImportError: No module named errors.errors).
      Ça pourrait également intéresser les développeurs de conlang (cf. http://conlang.org/)

      « I approve of any development that makes it more difficult for governments and criminals to monopolize the use of force. » Eric Raymond

      • [^] # Re: Passage de MySQL à PostgreSQL

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

        S'agissant des bases de données, je n'ai pas d'avis tranché sur la question de savoir s'il vaut mieux utiliser MySQL/PostgreSQL/sqlite . Mais j'ai choisi la dernière option par défaut parce qu'elle est disponible "out of the box" avec Python. J'aurais aimé essayé PostgreSQL pour comparer…

        Pour l'installation, c'est très simple, je n'ai rien prévu pour installer Hermaia. A toi de cloner le dépôt avec git clone https://github.com/suizokukan/hermaia.git et de lancer les tests avec nosetests ou python -m unittest tests/tests.py. Comme tu le vois, tout cela est très primaire. Si tu rencontres des difficultés, n'hésite pas à me faire signe.

        Enfin, peux-tu m'en dire un peu plus sur "conlang" ? As-tu une adresse de développeur auquel je pourrais m'adresser ?

        En tous cas, merci de ton intérêt pour mon projet.

        Trust the Python !

  • # Encodage

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

    si vous voyez n'importe quoi, pensez à utiliser l'unicode comme encodage

    Chipotage: unicode n'est pas un encodage. Tu voulais dire UTF-8

    • [^] # Re: Encodage

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

      Non, non, ce n'est pas du chipotage, c'est important. Merci de cette précision.

      Trust the Python !

      • [^] # Re: Encodage

        Posté par . Évalué à 3.

        Un s/time/tense/ serait pas mal dans les exemples aussi.

        • [^] # Re: Encodage

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

          Ouch… quelle erreur ! Je la corrige ce soir : merci de l'avoir repérée.

          Trust the Python !

  • # Différence avec Hunspell

    Posté par . Évalué à 7.

    Hello,

    La plupart des correcteurs orthographiques embarqués dans nos logiciels libres préférés (OpenOffice, Firefox …) utilisent hunspell qui permet de stocker les morphologies d'un mot de façon intelligente (pas un gros fichier texte comme avec ispell).

    Je te conseille d'installer les packages hunspell et hunspell-tools (sous Debian/Ubuntu). Tu verras qu'il existe des commandes pour retrouver la racine d'un mot :
    /usr/lib/hunspell/analyse /usr/share/hunspell/fr.aff /usr/share/hunspell/fr.dic /tmp/test.dic

    Avec dans test.dic la liste des mots que tu veux vérifier. Exemple avec "aimerai" :
    analyse(aimerai) = st:aimer fl:a4
    stem(aimerai) = aimer

    Après n'ayant pas accès aux sources de Logotheras et Hermaia je ne sais pas si le format des dictionnaires hunspell est compatible. Par contre il existe des dictionnaires hunspeel pour pas mal de langues.

    Perso je m'étais intéressé à hunspell suite à mon journal sur mon petit jeu http://linuxfr.org/users/pifou/journaux/mon-petit-jeu-pour-navigateur-et-pas-grand-chose-de-plus (voir les commentaires pour l'utilisation d'hunspell dans ce contexte) … une nouvelle version est en cours de finalisation (donc bientôt un journal pour présenter les nouveautés).

    • [^] # Re: Différence avec Hunspell

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

      Je ne connaissais pas hunspell, merci de cette référence.

      Il me faudrait du temps pour étudier les avantages de cette bibliothèque mais le peu que j'en ai lu me fait dire qu'elle n'est pas adaptée à mes besoins. Il ne me paraît pas raisonnable en effet de demander à un module généraliste de résoudre les problèmes liés à une langue donnée quand le système orthographique de celle-ci est particulièrement complexe. Pour prendre l'exemple du grec ancien, tel mot peut apparaître accentué de plusieurs manières selon les autres mots qui le précèdent/qui le suivent. Dans ces conditions, il me semble plus simple de demander à un module dédié au grec ancien de nettoyer l'orthographe du mot rencontré dans un texte, de retenir le contexte dans lequel ce mot apparaît, de confronter le mot "nettoyé" à une liste de vocabulaire puis de vérifier que le contexte explique l'orthographe du mot initial. Je vois des problèmes comparables pour d'autres langues anciennes (sanskrit et hébreu, par exemple).

      Je regrette évidemment de ne pas pouvoir utiliser hunspell mais je garde en tête qu'il me sera un jour utile d'y avoir recours.

      Trust the Python !

Suivre le flux des commentaires

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