Partage
  • Partager sur Facebook
  • Partager sur Twitter

interclassement - valeur unique

MariaDB

Sujet résolu
    9 octobre 2018 à 14:39:25

    Bonjour,

    J'ai pour le développement d'un assistant personnel un dictionnaire qui contient un peu plus de 20.000 mots.

    Je travaillais jusqu'à ce jour avec des fichiers plats et je me décide à passer à une structure base de données.

    J'ai l'habitude de travailler avec MariaDB dans le cadre de projet développé avec Symfony.

    J'ai donc créé une entité Symfony (table MariaDb) avec pour propriété (colonne) un string de 255 unique (varchar(255) unique).

    Puis je veux importer mon fichier et je m'aperçois que la table contient moins d'occurrences que le fichier initial. Je cherche pourquoi et je donne un exemple simple :

    Mon dictionnaire contient : "abandonne" et "abandonné". Et là le "abandonné" n'est pas inséré lors de l'import. Je précise que ma table est avec l'inter-classement utf8-unicode-ci qui à ma connaissance distingue bien le e du é.

    Alors si j'enlève le unique sur la colonne, j'ai mon fichier complet inséré.

    ==> une explication ? une solution pour conserver le unique tout en acceptant "abandonne" et "abandonné" ,

    D'avance merci.

    A+

    -
    Edité par monkey3d 9 octobre 2018 à 15:10:52

    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2018 à 17:32:05

      Bonjour,

      C'est l'inverse, "ci" est "case insensitive", il faudrait avoir un interclassement en "cs" (case sensitive).

      • Partager sur Facebook
      • Partager sur Twitter
        9 octobre 2018 à 17:52:53

        Euh je ne vois pas comment passer en cs ... :euh: puisque dans la liste déroulante de phpmyadmin il n'y a pas d'utf8_unicode_cs pour l'interclassement.

        Je dirai même plus je ne vois aucun interclassement se terminant par cs.

        A+

        • Partager sur Facebook
        • Partager sur Twitter
          9 octobre 2018 à 20:48:30

          Il y a en quelques uns spécifiques notés cs (en tout cas dans mon phpMyAdmin), mais normalement ça devrait le faire en utf8_bin j'imagine, puisque ça va tenir compte des caractères ne binaire.
          • Partager sur Facebook
          • Partager sur Twitter
            9 octobre 2018 à 23:14:14

            > Je précise que ma table est avec l'inter-classement utf8-unicode-ci qui à ma connaissance distingue bien le e du é.

            Ce n'est pas le cas, il faut du utf8_bin pour que ne pas être insensible aux accents.

            • Partager sur Facebook
            • Partager sur Twitter
              10 octobre 2018 à 7:28:20

              Merci pour vos réponses.

              Je vais modifier ma table dictionnaire soit en utf8_bin soit avec un _cs si je trouve.

              J'espère qu'il n'y aura pas d'effet de bord avec le reste de mon développement dont la partie "assistant personnel".

              Je clos le sujet.

              Bye

              • Partager sur Facebook
              • Partager sur Twitter
                10 octobre 2018 à 13:43:37

                Pour moi il y a quand même un problème de fond pour un dico, comment vas-tu gérer les mots comme par exemple "prés" et près" ?

                Personnellement j'aurais plutôt élargi la contrainte d'unicité sur deux colonnes pour ne pas avoir de doublon et laissé l'interclassement en CI.

                -
                Edité par philodick 10 octobre 2018 à 13:43:58

                • Partager sur Facebook
                • Partager sur Twitter
                  11 octobre 2018 à 7:01:20

                  Quelques réponses :

                  - Pas d'interclassement _cs disponible ... je n'ai pas trouvé avec phpmyadmin (ils sont tous dans la liste déroulante en _ci) ou je ne sais comment faire ...

                  - j'ai testé avec utf8_bin (en fait utf8mb4_bin) pour la propriété qui m'intéresse sans mettre unique et cela ne change pas mes problèmes d'origine.

                  - je suis donc revenu à l'interclassement classique conseillé d'ailleurs sur Symfony : utf8mb4_unicode_ci et après quelques tests la solution n'est pas apparue :(

                  => je ne pensais pas avoir ce type de difficultés vu que le besoin me semblait très simple.

                  Je me suis aperçu à l'occasion que la gestion par base de données était moins performante que par le fichier plat (temps de traitement + occupation espace mémoire).

                  ==> je ne relance pas la discussion qui est abondante sur le sujet et quasiment toujours pour la solution base de données.

                  Comme j'avais développé avec fichier plat la gestion complète du dico, je reviens à ma solution d'origine. Alors certes l'ajout et la modification d'un mot  sont un peu plus alambiqués sans utiliser les mécanismes de Symfony.

                  Le dernier problème que tu cites n'existe pas dans ce cas car avec php faire une comparaison en distinguant bien les 2 mots de ton exemple ne pose aucun problème.

                  Je continue le développement de mon assistant personnel sur cette base : il y a des fonctions plus nobles à mettre en oeuvre pour ne pas m'attarder sur une figure de style.

                  Pour info, mon assistant répond déjà à pas mal de sollicitations sur la gestion domotique de ma maison sans utiliser aucun service extérieur ... ce qui est une des règles de mon projet de développement.

                  Bye

                  -
                  Edité par monkey3d 11 octobre 2018 à 7:05:41

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 octobre 2018 à 9:05:37

                    Il y a quelque chose qui m'échappe alors, c'est toi même au début du sujet qui disais que la contrainte unique t'empêchait d'insérer "abandonne" et "abandonné".
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 octobre 2018 à 13:25:01

                      Oui c'est bien le cas ! avec mon paramétrage d'origine je ne pouvais insérer dans une table les 2 mots qui sont quasi identiques à la dernière lettre près (e vs é).

                      J'avais contourné en enlevant unique le temps de l'import avec phpmyadmin.

                      Mais sans solution opérationnelle avec entité/table je retrouve le même problème si je veux ajouter unitairement un mot qui diffère d'un déjà présent juste par un accentué.

                      Donc j'abandonne le sujet et reviens à ma solution fichier plat qui fonctionne. Sans doute en creusant il doit y avoir une solution à base d'entité.

                      Merci pour ton intérêt et les réponses fournies.

                      Bye

                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 octobre 2018 à 13:28:25

                        C'est bien pour ça qu'il me semblait que faire la contrainte d'unicité sur une seule colonne n'était pas complètement cohérent. Alors que si tu la faisais sur deux colonnes (avec la définition par exemple), tu n'aurais plus ce problème. A moins évidemment que tu veuilles aussi prévoir le cas où le même mot serait insérer avec une définition différente.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 octobre 2018 à 18:44:33

                          Je n'ai pas 2 colonnes car je ne suis pas intéressé (pour l'instant ?) par la définition du mot.

                          En gros le fonctionnement de mon assistant personnel :

                          - il faut dicter une phrase à l'assistant,

                          - le programme va faire une analyse syntaxique de la phrase dont le fait de savoir si les mots contenus appartiennent au dictionnaire (j'utilise la phonémisation, la distance de Levenstein, etc pour essayer de corriger les éventuelles fautes).

                          - après cette passe je vais utiliser un classifier d'Intelligence Artificielle pour déterminer si la phrase se rapproche d'un modèle de phrase connue. C'est pour cela que j'ai besoin au préalable d'avoir une phrase avec des mots connus du dictionnaire.

                          - si oui cela va enclencher un parsing pour déterminer les options dans la phrase type (par exemple la phrase contient une pièce connue de la domotique, une lumière, etc),

                          - si parsing ok alors il n'y a plus qu'à engager l'action et fournir la réponse au demandeur.

                          Bon tu te doutes que c'est un peu plus complexe mais c'est l'idée ! Tout cela avec Symfony et parfois en php "pur".

                          Cela marche bien : je sais allumer/éteindre des appareils, ouvrir/ fermer des volets, gérer une liste de courses, gérer des rendez-vous, mettre de la musique, etc ... bref un assistant personnel sans le besoin des services de Google, Apple et autres GAFA !

                          Bye

                          -
                          Edité par monkey3d 11 octobre 2018 à 18:45:35

                          • Partager sur Facebook
                          • Partager sur Twitter

                          interclassement - valeur unique

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown