tag:linuxfr.org,2005:/tags/langues/publicLinuxFr.org : les contenus étiquetés avec « langues »2023-01-18T16:12:19+01:00/favicon.pngtag:linuxfr.org,2005:News/413242022-12-21T15:36:26+01:002022-12-22T14:32:48+01:00Sortie de uchardet 0.0.8 pour la détection de codages de caractèresLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p><a href="https://www.freedesktop.org/wiki/Software/uchardet/"><code>uchardet</code></a> est une bibliothèque C/C++ de détection de <a href="https://fr.wikipedia.org/wiki/Codage_des_caract%C3%A8res">codage de caractère</a> (par exemple <code>UTF-8</code> ou <code>ISO-8859-15</code> sont ce qu’on appelle des « codages de caractères » ou « jeux de caractères ») basée sur des caractéristiques statistiques des langages naturels et membre du projet <em>Freedesktop</em>. Elle peut détecter quelques dizaines de codages de caractères.</p>
<p>Le projet fournit également un outil en ligne de commande pour tester très simplement le codage de vos fichiers ou de flux de texte.</p>
<p><code>uchardet</code> version 0.0.8 est sortie ce 8 décembre 2022.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://www.freedesktop.org/wiki/Software/uchardet/" hreflang="en" href="https://linuxfr.org/redirect/111481">Site d'uchardet</a></li><li>lien nᵒ 2 : <a title="https://gitlab.freedesktop.org/uchardet/uchardet/" hreflang="en" href="https://linuxfr.org/redirect/111482">Dépôt de code</a></li><li>lien nᵒ 3 : <a title="https://liberapay.com/ZeMarmot/" hreflang="fr" href="https://linuxfr.org/redirect/111483">Financement de développement par projet ZeMarmot</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#toc-usage">Usage</a><ul>
<li><a href="#toc-outil-en-ligne-de-commande">Outil en ligne de commande</a></li>
<li><a href="#toc-interface-de-programmation">Interface de programmation</a></li>
</ul>
</li>
<li>
<a href="#toc-un-peu-dhistoire">Un peu d’histoire</a><ul>
<li><a href="#toc-2002-2011-code-universalchardet-chez-mozilla">2002-2011: code <code>universalchardet</code> chez Mozilla</a></li>
<li><a href="#toc-2011-2015-int%C3%A9gration-dans-une-biblioth%C3%A8que-d%C3%A9di%C3%A9e">2011-2015: intégration dans une bibliothèque dédiée</a></li>
<li><a href="#toc-2015-jai-besoin-de-lire-des-sous-titres">2015: j’ai besoin de lire des sous-titres !</a></li>
<li><a href="#toc-2015-2022-maintenance-et-d%C3%A9cadence">2015-2022 : maintenance et (dé)cadence</a></li>
</ul>
</li>
<li><a href="#toc-comparaison-avec-dautres-projets-en-2022">Comparaison avec d’autres projets en 2022</a></li>
<li>
<a href="#toc-comment-fonctionne-uchardet">Comment fonctionne uchardet?</a><ul>
<li><a href="#toc-algorithme-na%C3%AFf-et-premier-concept-caract%C3%A8res-interdits">Algorithme naïf et premier concept: caractères interdits</a></li>
<li><a href="#toc-statistiques-des-caract%C3%A8res-utilis%C3%A9s-dans-un-langage">Statistiques des caractères utilisés dans un langage</a></li>
<li><a href="#toc-s%C3%A9quences-de-caract%C3%A8res">Séquences de caractères</a></li>
<li><a href="#toc-conclusion-un-mix-de-tout-%C3%A7a">Conclusion : un mix de tout ça!</a></li>
<li><a href="#toc-conclusion-2-uchardet-ne-fait-pas-de-magie-mais-nen-est-pas-moins-impressionnant">Conclusion 2 : <code>uchardet</code> ne fait pas de magie mais n’en est pas moins impressionnant !</a></li>
</ul>
</li>
<li><a href="#toc-futur-api-de-d%C3%A9tection-de-langage">Futur : API de détection de langage</a></li>
<li><a href="#toc-conclusion-et-financement">Conclusion et financement</a></li>
</ul>
<h2 id="toc-usage">Usage</h2>
<h3 id="toc-outil-en-ligne-de-commande">Outil en ligne de commande</h3>
<p>L’outil en ligne de commande n’est nullement le point principal du projet, mais reste fort utile si vous avez un fichier texte dont vous n’êtes pas sûr du codage:</p>
<pre><code class="sh">$ uchardet mon-fichier.txt
ISO-8859-15</code></pre>
<p>Si vous inspectez plusieurs fichiers à la fois, la sortie contiendra une ligne par fichier, préfixée du nom de fichier:</p>
<pre><code class="sh">$ uchardet test/fr/iso-8859-15.txt test/de/windows-1252.txt
test/fr/iso-8859-15.txt: ISO-8859-15
test/de/windows-1252.txt: WINDOWS-1252</code></pre>
<p>Accessoirement vous pouvez l’utiliser en mode <code>pipe</code> pour récupérer un flux de données. Pour prendre un exemple réaliste, regardons la <a href="https://www-archive.mozilla.org/projects/intl/universalcharsetdetection">page web archivée</a> qui explique l’algorithme à l’origine de cet outil (j’en parle dans <a href="#toc-2002-2011-code-universalchardet-chez-mozilla">l’historique</a>). Très ironiquement, cette page s’affiche avec des caractères de remplacement '�' dans Firefox, ce qui indique une erreur de décodage (pour qui n’a pas compris en quoi c’est ironique : ce projet était originellement fait par Mozilla pour Firefox, mais il n’est plus inclus depuis de nombreuses années et maintenant même la page en parlant est mal affichée).</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f696d672e7465646f6d756d2e6e65742f646174612f75636861726465742d6f726967696e616c2d70617065722d6d6f7a696c6c612d62726f6b656e2d656e636f64696e672d3362313333642e706e67/uchardet-original-paper-mozilla-broken-encoding-3b133d.png" alt="Screenshot of the algorithm paper for uchardet original algorithm with broken encoding in Firefox" title="Source : https://img.tedomum.net/data/uchardet-original-paper-mozilla-broken-encoding-3b133d.png"></p>
<p>La raison est que le serveur web lui-même envoie un en-tête <code>content-type: text/html; charset=UTF-8</code>, même si la page web contient bien un <code>charset=windows-1252</code> en métadonnées. Firefox semble privilégier l’en-tête envoyé par le serveur.</p>
<p>Supposons néanmoins que nous n’ayons aucune métadonnée (ni côté serveur, ni dans le code HTML) et que nous voulions deviner le jeu de caractères:</p>
<pre><code class="sh">$ curl https://www-archive.mozilla.org/projects/intl/universalcharsetdetection <span class="p">|</span> uchardet
WINDOWS-1252</code></pre>
<p>Et voilà! Notons qu’idéalement, vous devriez même retirer tout texte structurel qui pourrait interférer avec la détection (j’en reparlerai dans la section sur les <a href="#toc-conclusion-2-uchardet-ne-fait-pas-de-magie-mais-nen-est-pas-moins-impressionnant">principes</a> de détection. Par exemple pour retirer les tags HTML sur une seule ligne:</p>
<pre><code>$ curl https://www-archive.mozilla.org/projects/intl/universalcharsetdetection | sed 's/<[^>]*>//g' | uchardet
WINDOWS-1252
</code></pre>
<p>Cela peut sembler inutile ici puisque l’outil a eu bon dès le début, mais ne pas en prendre l’habitude peut aisément créer des faux positifs.</p>
<p><em>Note: il s’agit d’un « nettoyage » simpliste d’un source HTML, pour démonstration. Notamment avec les nouvelles API de détection de langage (voir la section « <a href="#toc-futur-api-de-d%C3%A9tection-de-langage">Futur: API de détection de langage</a> »), j’obtiens parfois des erreurs de détection de langage si je prends une page Wikipédia sans bien la nettoyer, car il y a beaucoup de contenu structurel dans le code des pages Wikipedia.</em></p>
<p>Notons que les noms de codage sont compatibles avec <code>iconv</code>. Par conséquent vous pouvez très aisément utiliser le résultat directement pour convertir dans un codage qui vous convient mieux, si nécessaire. Par exemple, maintenant que vous savez que le texte est en <code>WINDOWS-1252</code>, transformons le en <code>UTF-8</code>:</p>
<pre><code class="sh">$ curl https://www-archive.mozilla.org/projects/intl/universalcharsetdetection <span class="p">|</span> iconv -f WINDOWS-1252 -t UTF-8</code></pre>
<h3 id="toc-interface-de-programmation">Interface de programmation</h3>
<p>L’API d’<code>uchardet</code> est en C/C++ (implémentation en C++ mais interfacée pour être aisément incluse dans du code C ou C++) et <a href="https://gitlab.freedesktop.org/uchardet/uchardet/-/blob/v0.0.8/src/uchardet.h#L58-105">extrêmement simple</a> : vous créez un objet <code>uchardet_t</code>, vous l’alimentez en données textuelles (en une fois ou par lots), puis vous obtenez le codage de caractère au format texte, compatible avec <code>iconv</code>:</p>
<pre><code class="C"><span class="cp">#include</span> <span class="cpf"><uchardet.h></span><span class="cp"></span>
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span>
<span class="nf">print_charset</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">data</span><span class="p">,</span>
<span class="kt">size_t</span> <span class="n">data_len</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">charset</span>
<span class="n">uchardet_t</span> <span class="n">handle</span><span class="p">;</span>
<span class="n">handle</span> <span class="o">=</span> <span class="n">uchardet_new</span><span class="p">();</span>
<span class="n">uchardet_handle_data</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">data_len</span><span class="p">);</span>
<span class="n">uchardet_data_end</span><span class="p">(</span><span class="n">handle</span><span class="p">);</span>
<span class="n">charset</span> <span class="o">=</span> <span class="n">uchardet_get_charset</span><span class="p">(</span><span class="n">handle</span><span class="p">);</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%s</span><span class="se">\n</span><span class="s"> », charset);</span>
<span class="n">uchardet_delete</span><span class="p">(</span><span class="n">handle</span><span class="p">);</span>
<span class="p">}</span></code></pre>
<p>Notons que l’un des grands avantages d’<code>uchardet</code> est sa rapidité exemplaire. C’est un système basé sur des modèles statistiques de langage, générés sous forme de code C++, puis compilés, qui est capable de déterminer le codage d’un fichier très rapidement, car basé sur des logiques très simples mathématiquement.</p>
<h2 id="toc-un-peu-dhistoire">Un peu d’histoire</h2>
<p>Comme <code>uchardet</code> est très lié à ma propre expérience où je voulais originellement simplement satisfaire un besoin personnel, et que je me suis retrouvé à <a href="https://xkcd.com/2347/">maintenir des années une bibliothèque</a>, je me suis dit que c’est une petite histoire marrante à raconter.</p>
<h3 id="toc-2002-2011-code-universalchardet-chez-mozilla">2002-2011: code <code>universalchardet</code> chez Mozilla</h3>
<p>Le projet est né de Mozilla, il y a une vingtaine d’années (en tous cas, le papier est daté de 2002), sous le nom de <code>universalchardet</code>. Il me semble que le code fut même dans leur navigateur pendant plusieurs années.</p>
<p>Malheureusement je ne retrouve plus d’archive du code de l’époque (on trouve en fait la <a href="https://web.archive.org/web/20150730144356/http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/">structure du code archivé par le projet archive.org</a> mais le contenu des fichiers source n’est pas archivé). Seul le papier de recherche qui explique les bases des algorithmes utilisés est encore <a href="https://www-archive.mozilla.org/projects/intl/universalcharsetdetection">disponible</a>.</p>
<h3 id="toc-2011-2015-intégration-dans-une-bibliothèque-dédiée">2011-2015: intégration dans une bibliothèque dédiée</h3>
<p>Néanmoins si quelqu’un est intéressé par le code d’origine, le <a href="https://gitlab.freedesktop.org/uchardet/uchardet/-/tree/3601900164aefb329a0493bd6448682c807fa6cb">premier commit de <code>uchardet</code> en 2011</a> donne probablement un bon aperçu de ce à quoi ressemblait les dernières versions de Mozilla. À l’époque, le code était encore accessible sur les dépôts de Mozilla, mais il ne pouvait être aisément utilisé par d’autres projets, hormis en le copiant manuellement. BYVoid, le mainteneur originel de cette bibliothèque a donc extrait le code des dépôts Mozilla pour créer l’interface que j’ai <a href="#toc-interface-de-programmation">montrée plus haut</a>.</p>
<p>C’est ainsi que pendant quelques années, de 2011 à 2015, il y eut un peu de nettoyage et maintenance par BYVoid et quelques autres contributeurs. Pendant cette période, on compte un peu moins d’une trentaine de commits, et on peut considérer que ce fut principalement de la maintenance sans modification profonde du code originel.</p>
<h3 id="toc-2015-jai-besoin-de-lire-des-sous-titres">2015: j’ai besoin de lire des sous-titres !</h3>
<p>Les sous-titres de films furent mon entrée dans ce projet. Comme la plupart des occidentaux utilisant un alphabet avec des accents, j’avais déjà remarqué que les sous-titres de film étaient très souvent cassés. Quiconque a déjà vu ce genre de sous-titre sait de quoi je parle:</p>
<blockquote>
<p>Luke, je suis ton p�re!</p>
</blockquote>
<p>Voire:</p>
<blockquote>
<p>Luke, je suis ton pÚre!</p>
</blockquote>
<p>😅</p>
<p>Les jeunes générations ont peut-être moins ce problème, maintenant que <code>UTF-8</code> est vraiment mis en avant, mais il y a encore peu, beaucoup de textes en français étaient codés en <code>ISO-8859-1</code> ou <code>ISO-8859-15</code> (il peut aussi y avoir des textes français en <code>WINDOWS-1252</code> notamment).</p>
<p>Comme tout le monde avant moi, j’ai fait abstraction de ce problème pendant une décennie (puisque cela restait lisible avec de l’imagination). Sauf que le jour où j’ai donné des sous-titres en japonais ou coréen à <code>mplayer</code>, <code>mpv</code>, <code>VLC</code>, ou tout autre lecteur (j’ai vu ce problème même sous Windows, pour quiconque croirait que c’est juste sous Linux), on se retrouvait avec du texte absolument illisible (et ce quel que soit votre pouvoir d’imagination !). La solution était d’essayer tous les codages des listes proposées dans l’interface des lecteurs vidéos (des dizaines, car les gens sont rarement au courant des jeux de caractères habituels pour une langue, donc on les essaie tous). Même si à force, on peut mieux connaître les codages les plus “habituels” d’un langage cible, cela reste un processus frustrant et fastidieux.</p>
<p>Je regardai donc le code de <code>mpv</code> (fork de <code>mplayer</code>, excellent lecteur de vidéo) et vit qu’il utilisait <code>enca</code> pour détecter le codage des fichiers de sous-titre. Malheureusement son efficacité était très limitée (notamment le coréen et le japonais n’étaient pas pris en charge), et surtout sans donner un indice (<em>hint</em>) à <code>enca</code>, il est incapable de déterminer un codage mono-octet (c’est-à-dire notamment tous les <code>ISO-8859-*</code> et comme je disais, le français était souvent codé ainsi, ce qui expliquait les erreurs de décodage constantes). Cette très forte limitation s’expliquera très facilement quand vous lirez la section sur les principes de détection, plus bas.</p>
<p>Je me penchai alors sur l’état des lieux des bibliothèques de détection de codages de caractère. À l’époque, une autre bibliothèque libre ressortait dans toutes les recherches web : <code>libguess</code> (qui disait reconnaître plus de langues). Je la teste pour rapidement découvrir que le <em>hinting</em> est aussi obligatoire (ce que je confirme avec <a href="https://github.com/kaniini/libguess/blob/b44a240c57ddce98f772ae7d9f2cf11a5972d8c2/src/libguess/guess.c#L58">le code</a>). Et encore, en essayant un fichier <code>EUC-KR</code> (le codage le plus commun en Corée), avec "<em>korean</em>" en indice, la détection foirait. Ce n’est pas une validation très scientifique, mais comme les langues asiatiques étaient mes cibles principales (et européennes en secondaire), c’était mal parti.</p>
<p>C’est alors que je découvris <code>uchardet</code>. Il n’était pas parfait, mais clairement il marchait bien mieux (mes tests étaient très encourageants), et surtout ne nécessitait pas de rajouter des “indices” de langue pour être efficace.</p>
<p>En cette année 2015, je <a href="https://github.com/mpv-player/mpv/issues/908">poussai donc à son intégration dans <code>mpv</code></a>, puis je contribuai même un petit <a href="https://github.com/mpv-player/mpv/pull/2193">patch</a> additionnel pour en faire le détecteur par défaut (<code>enca</code> restait en second choix ; il est intéressant de noter que la prise en charge de ce dernier a été retirée totalement depuis).</p>
<p>Comme j’avais poussé à son usage, et que la maintenance de <code>uchardet</code> n’est pas au plus haut, je sentis le besoin de patcher des bugs. C’est ainsi que je fis mon premier patch dans <code>uchardet</code> cette même année.</p>
<p><em>Aparté : c’est aussi un petit rappel pour ceux qui croient que l’informatique devrait être en ASCII seulement, et que c’est suffisant. La réalité est que nous ne sommes pas seuls sur terre, et pour avoir dû batailler pendant de nombreuses années avec nos systèmes libres pour simplement pouvoir lire du texte dans certaines autres langues (d’où mes contributions dans <code>uchardet</code>, <code>mpv</code> et d’autres projets), ou pour écrire dans ces langages (côté écriture, j’ai d’ailleurs contribué au moins un patch dans <code>ibus-hangul</code> ! Chaque usage cassé son patch ! 😩), je peux affirmer sans une once d’hésitation que nos systèmes libres ne sont pas si accueillants aux non-occidentaux. Cela s’améliore, mais c’est encore loin d’être parfait et sans pour autant dire aux développeurs bénévoles qu’ils devraient eux-mêmes implémenter des fonctionnalités dédiées, il faut être ouvert aux patchs qui améliorent l’internationalisation de votre logiciel (ce principe ne s’appliquant pas qu’aux textes affichés, mais aussi à l’interface et à la possibilité d’écrire du texte).<br>
Il est important de reconnaître au moins que ces usages existent et qu’un logiciel (ou internet) n’est pas fait pour être ASCII seulement !</em></p>
<h3 id="toc-2015-2022-maintenance-et-décadence">2015-2022 : maintenance et (dé)cadence</h3>
<p>Quoi qu’il en soit, c’est ainsi que je commençai à contribuer plus à <code>uchardet</code> puis en devint le co-mainteneur (puis rapidement le seul mainteneur puisque le projet était déjà en mode de maintenance minimale à l’époque).<br>
J’ai immédiatement vu le potentiel du projet et c’est à ce moment-là que le projet a commencé à évoluer :</p>
<ul>
<li>Rendre les valeurs de retour <code>iconv</code>-compatible pour un interfaçage aisé (<code>iconv</code> étant le projet le plus commun pour de la conversion entre codages de caractères) dans des projets tiers.</li>
<li>Ajouter des tests unitaires pour chaque combinaison de langage et de codage officiellement pris en charge et une infrastructure de tests automatiques pour éviter les régressions.</li>
<li>Créer des scripts de génération de modèles de langage par extraction et traitement de données Wikipédia. C’était un changement majeur, car il permettait de facilement générer et regénérer des modèles pour détecter des langues et des codages.</li>
<li>En conséquence du point précédent, de nombreuses prises en charge ont été très aisément ajoutées à <code>uchardet</code> qui reconnaît maintenant beaucoup plus de langues et de codages qu’à ses origines.</li>
<li>Améliorer l’algorithme de “confiance” de détection, pour des résultats bien plus fiables qu’à l’origine.</li>
<li>etc.</li>
</ul>
<p>J’en fis aussi un projet <a href="https://www.freedesktop.org/">Freedesktop</a> assez rapidement puisque je compris qu’il y avait un réel manque dans le libre (les 2 autres alternatives ne marchant pas de manière satisfaisante) et que c’était donc un projet utile pour un bureau libre. En outre, c’était mieux ainsi, plutôt que sur le compte du précédent mainteneur (qui était d’accord pour ce changement bien sûr) sur une plateforme de gestion de source propriétaire (c’était en effet initialement publié sur un compte personnel sur <em>Github</em>).</p>
<h2 id="toc-comparaison-avec-dautres-projets-en-2022">Comparaison avec d’autres projets en 2022</h2>
<p>De nos jours, le « paysage logiciel » est un peu différent. D’un certain côté, ce type de détection est devenu bien moins nécessaire, car les formats ont souvent des métadonnées associées pour en indiquer le jeu de caractère. Sur le web par exemple, il est recommandé dorénavant de <a href="https://www.w3.org/International/questions/qa-html-encoding-declarations">déclarer ce dernier</a> alors que c’était plus chaotique, il y a une vingtaine d’années. Je n’ai pas d’information interne, mais j’ai toujours imaginé que c’était la raison pour laquelle Mozilla avait abandonné son propre code de détection (l’origine de <code>uchardet</code> donc). Je suppose qu’à un moment, ils se sont dit que ce n’était plus nécessaire lorsque les documents web sont devenus globalement bien “étiquetés”.</p>
<p>En outre, <code>UTF-8</code> a vraiment pris ses marques et est devenu lui-même de plus en plus le jeu recommandé dans une majorité d’usages, diminuant d’autant les chances de tomber sur d’autres codages de caractères sur des fichiers récents. D’ailleurs certains formats de fichiers ou protocoles récents ont fait le choix de rendre UTF-8 obligatoire (c’est le cas de XMPP dès les premières <em>RFC</em> par exemple).</p>
<p>Néanmoins les vieux fichiers (archives, etc.) existent encore, les gens s’échangent encore parfois de simples fichiers textes sans métadonnées. D’ailleurs les formats de fichiers de sous-titre sont encore souvent de bêtes fichiers textes avec une structure très basique (par exemple <a href="https://en.wikipedia.org/wiki/SubRip#SubRip_file_format">les fichiers <code>.srt</code></a>), ce qui en fait justement des formats appréciés et encore très utilisés. Je pense qu’on est nombreux à encore ouvrir des fichiers textes et s’apercevoir parfois qu’ils sont cassés. On se dit alors que si son éditeur de texte avait de la reconnaissance de codage de caractères, cela aurait aidé !</p>
<p>C’est ainsi que malgré tous ces changements, un logiciel comme <code>uchardet</code> a encore tout son intérêt. Et d’ailleurs de l’autre côté, on voit qu’il y a maintenant plus d’alternatives viables qu’à l’époque.</p>
<p>Tout d’abord, Google a créé <a href="https://github.com/google/compact_enc_det/">CED</a> pour Chrome. Dans un <a href="https://hsivonen.fi/chardetng/#ced">article de blog</a>, un développeur de Mozilla explique pourquoi, selon lui, ce n’était pas une bonne idée de partir sur ce projet, dans leur cas :</p>
<blockquote>
<p>License-wise the code is Open Source / Free Software, but it’s impractical to exercise the freedom to make modifications to its substance, which makes it close to an invariant section in <em>practice</em> (again, not as a matter of license). The code doesn’t come with the tools needed to regenerate its generated parts. And even if it did, the input to those tools would probably involve Google-specific data sources. There isn’t any design documentation (that I could find) beyond code comments. Adopting ced would have meant adopting a bunch of C++ code that we wouldn’t be able to meaningfully change.</p>
</blockquote>
<p>Pour résumer, cette personne dit que <em>CED</em> n’est pas vraiment libre <em>en pratique</em> puisqu’on n’a pas les outils pour générer de nouveaux modèles, ni les données source. Donc on ne peut vraiment améliorer le code.</p>
<p>C’est en fait un commentaire très intéressant pour moi, car c’est justement l’état dans lequel Mozilla avait laissé son propre code dans ses dépôts, et donc celui dans lequel je l’ai trouvé en 2015 : de nombreux fichiers de code générés et à la logique opaque. C’est vraisemblablement la raison pour laquelle il y eut si peu de contributions avant moi : personne ne savait vraiment comment améliorer le cœur du logiciel et les rares contributions se concentraient sur l’interface ou l’outil en ligne de commande ; pas de nouveau codage pris en charge, ni aucune amélioration de l’efficacité avant 2015… J’ai passé énormément de temps à essayer de comprendre le code et les données générés (sans savoir comment il l’a été et avec quel jeu de données), à le démystifier et surtout à créer des <a href="https://gitlab.freedesktop.org/uchardet/uchardet/-/blob/master/script/BuildLangModel.py">scripts</a> de génération de modèles de langages à partir de données libres et publiques (contenu de Wikipédia). Mes scripts sont inclus dans le dépôt dès le début, et j’inclus même les logs de génération (ce qui permet de pouvoir étudier ces derniers ultérieurement si un modèle devait être problématique). C’est une forme très limitée d’ingénierie inversée, mais j’en suis plutôt fier, car c’est ce qui rend <code>uchardet</code> vraiment puissant (la simplicité de créer de nouveaux modèles). Les scripts de génération de modèles sont livrés et rien n’est opaque, par design. Néanmoins bien que j’ai démystifié une partie (les modèles pour les codages mono-octets), il reste certaines parties de code peu documentées (les codages multi-octets) qui parfois me laissent encore un peu pantois (je commence en fait à les remplacer progressivement plutôt que chercher absolument à les comprendre).</p>
<p>Quoi qu’il en soit, Firefox lui-même est revenu à faire de la <a href="https://support.mozilla.org/en-US/kb/text-encoding-no-longer-available-firefox-menu">détection depuis Firefox 89</a> (soit juin 2021). Cela n’est pas fait automatiquement mais en allant dans le menu <code>View > Repair Text Encoding</code>, ce qui fait que le lien vers leur propre page d’archive a encore un rendu cassé par défaut et il faut faire une action explicite dans un menu caché (<a href="https://hsivonen.fi/no-encoding-menu/">voir aussi ce post d’intention</a>) pour voir la page proprement.<br>
Et c’est ainsi que Mozilla a décidé de ré-écrire un nouveau projet en Rust. Dans leur <a href="https://hsivonen.fi/chardetng/">article</a>, ils citent <code>uchardet</code> (sans le <a href="https://hsivonen.fi/chardetng/#chardet">nommer autrement qu’un « fork non-Mozilla »</a> avec un lien vers la page d’<code>uchardet</code>) et le fait qu’il est bien plus complet maintenant qu’il ne l’était à l’époque, mais qu’il manque encore des fonctionnalités. Ils ont donc préféré ré-implémenter du début (une logique qui m’interpelle) et ce nouveau projet s’appelle <a href="https://crates.io/crates/chardetng">chardetng</a>.</p>
<p>Notons qu’il existe une troisième alternative, nommée <a href="https://unicode-org.github.io/icu/userguide/conversion/detection.html">ICU</a>. Je ne l’ai jamais testée (puisque je n’en ai plus l’intérêt, avec maintenant un système qui marche vraiment bien: <code>uchardet</code>! 😜), mais toujours d’après le développeur <a href="https://hsivonen.fi/chardetng/#icu">Firefox</a>, ce détecteur serait bien moins précis que toutes les alternatives (<code>uchardet</code>, <code>chardetng</code> et <code>CED</code> donc) et aurait donc pour cette raison été rejeté par les équipes de Chrome et Mozilla.</p>
<h2 id="toc-comment-fonctionne-uchardet">Comment fonctionne uchardet?</h2>
<p>J’imagine que les projets cités utilisent des logiques similaires, même si je n’ai pas vérifié ces derniers en détail. Concentrons-nous sur <code>uchardet</code>.</p>
<h3 id="toc-algorithme-naïf-et-premier-concept-caractères-interdits">Algorithme naïf et premier concept: caractères interdits</h3>
<p>Globalement l’idée de base des détecteurs de la vieille époque est qu’il suffit de vérifier si on tombe sur des octets interdits. Cela marche relativement bien pour certains codages multi-octets (tels que UTF-8) puisqu’il est assez facile de créer des données invalides dès qu’on écrit hors ASCII. Ces codages multi-octets sont d’ailleurs souvent assimilables à des machines à états (avec des états "<em>invalides</em>").</p>
<p>Néanmoins c’est bien moins vrai pour les jeux de caractères mono-octets. Énormément parmi ces derniers utilisent quasiment tout l’intervalle donné (voire son entièreté si on considère les caractères de contrôle comme admissibles, voir par exemple <a href="https://fr.wikipedia.org/wiki/ISO/CEI_8859-15#Caract%C3%A8res_support%C3%A9s">ISO-8859-15</a>). En outre, même lorsqu’ils sont incomplets, plusieurs codages occupent souvent les mêmes intervalles.</p>
<p>Ainsi <a href="https://fr.wikipedia.org/wiki/ISO/CEI_8859-1#Caract%C3%A8res_support%C3%A9s">ISO-8859-1</a> et ISO-8859-15 sont exactement sur les mêmes intervalles. Si on se limite à détecter les caractères interdits, il est ainsi impossible de différencier la validité en se contentant de tester le texte comme étant dans l’un de ces jeux de caractères: toute suite d’octets valide dans une version est valide dans l’autre également !</p>
<p>Voir par exemple les tableaux des 2 codages où on voit que les mêmes intervalles d’octets sont utilisés:</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f696d672e7465646f6d756d2e6e65742f646174612f49534f2d383835392d312d31352d6466646337632e706e67/ISO-8859-1-15-dfdc7c.png" alt="Comparaison de ISO-8859-1 et ISO-8859-15" title="Source : https://img.tedomum.net/data/ISO-8859-1-15-dfdc7c.png"></p>
<p>C’est pourquoi un algorithme qui ne cherche qu’à vérifier la validité de la séquence ne peut dire que "<em>Luke, je suis ton pÚre!</em>" ne convient pas puisque c’est une séquence valide en ISO-8859-15 (mais en tentant de lire un texte UTF-8).</p>
<p>Malheureusement divers logiciels libres utilisaient (et utilisent encore) une telle logique naïve : boucler en passant le texte dans <code>iconv</code>, testant alternativement des jeux de caractères dans une liste. Puis on s’arrête au premier jeu qui ne retourne pas en erreur (ce n’est pas un exemple au hasard, j’ai vu cet algorithme dans certains gros logiciels). Avec une telle logique, vous pouvez être certain de ne quasiment jamais avoir le bon résultat pour la plupart des jeux mono-octets. 😱</p>
<h3 id="toc-statistiques-des-caractères-utilisés-dans-un-langage">Statistiques des caractères utilisés dans un langage</h3>
<p>C’est là où le second concept apparaît: « <em>même si les mêmes emplacements sont utilisés dans 2 jeux de caractères, tous les emplacements ne sont possiblement pas tous utilisés dans tous les langages.</em> »</p>
<p>Dans notre exemple fictif, le caractère '€' se trouve à l’emplacement <code>0xA4</code> dans ISO-8859-15, et '¤' (« symbole monétaire générique ») dans ISO-8859-1. On peut voir comment cela met ISO-8859-15 en avant pour un texte d’une langue européenne. De même, les caractères <code>0xBC</code> et <code>0xBD</code> représentent “Œ” et “œ” respectivement en ISO-8859-15, et '¼' et '½' en ISO-8859-1. Bien qu’on puisse avoir des quarts et demis, on sait que ces derniers sont peu utilisés, alors que dans un texte en français, les e-dans-l’o sont des caractères utilisés.</p>
<p>Par contre, <code>ISO-8859-15</code> peut aussi être utilisé dans divers autres langages, par exemple l’italien qui n’utilise pas le “œ”. Ainsi trouver ce caractère pourrait augmenter la confiance qu’on soit en train de lire un texte français et diminuer celle qu’on soit en présence d’un texte italien.</p>
<p>Et si on obtenait des statistiques de caractères qui apparaissent par langage ?<br>
On découvre ainsi que <a href="https://fr.wikipedia.org/wiki/Fr%C3%A9quence_d%27apparition_des_lettres#Dans_d'autres_langues">certains caractères sont extrêmement courants</a>, quand d’autres sont très rares voire inexistants selon le langage. Les statistiques se révèlent suffisamment différentes même entre langues sœurs.</p>
<h3 id="toc-séquences-de-caractères">Séquences de caractères</h3>
<p>Néanmoins ces statistiques de caractère ne sont toujours pas assez.<br>
Le troisième concept est donc d’aller regarder non plus par caractère, mais par séquence de caractère. On se rend compte ainsi que si on a un “œuf” ou un "½uf », les 2 étant des résultats valides pour un même ensemble de 3 octets selon qu’on les décode avec la table <code>ISO-8859-15</code> ou <code>ISO-8859-1</code>, statistiquement, “œ” suivi de “u” est une séquence relativement courante en français (“œuf”, “sœur”, “bœuf”…) mais ce n’est pas le cas de '½' suivi de “u”. Si on avait encore le moindre doute qui pouvait subsister, il n’est probablement plus.</p>
<p>Ce dernier concept est donc de générer des statistiques de suites de 2 caractères. En fait, on se limite à 2 lettres (et non “caractère”, terme plus générique qui inclut aussi des symboles, des chiffres, etc.), ce qui fait que mon exemple n’est pas aussi significatif que voulu — '½' n’étant pas une lettre — mais vous voyez l’idée!</p>
<p>Ce concept sur les séquences de lettres donne des résultats extrêmement pertinents pour qualifier le langage d’un texte.</p>
<h3 id="toc-conclusion-un-mix-de-tout-ça">Conclusion : un mix de tout ça!</h3>
<p>Le principe de <code>uchardet</code> et peut-être de tous les autres systèmes de détection modernes est donc d’utiliser ces 3 concepts. La détection naïve est toujours d’actualité, mais elle ne sert que de raccourci pour les cas les plus simples.</p>
<p>À partir de statistiques par langues (générées et compilées dans des modèles), on cherchera donc à identifier le langage le plus probable. En fait, <code>uchardet</code> est autant un détecteur de langage qu’il est un détecteur de codage de caractère. On cherche à calculer les probabilités qu’une suite d’octets soit un texte d’un langage donné avec un codage donné. On assigne ainsi un score “confiance” pour chaque couple <code>(langage, codage)</code>. Et on retourne simplement le jeu de caractère du couple avec le plus haut score.</p>
<p>Ces statistiques sont compilées à partir de texte Wikipédia, grâce à mon script qui génère des tables en fichiers source qui seront compilés. C’est pourquoi la détection est au final extrêmement rapide tout en étant précise.</p>
<h3 id="toc-conclusion-2-uchardet-ne-fait-pas-de-magie-mais-nen-est-pas-moins-impressionnant">Conclusion 2 : <code>uchardet</code> ne fait pas de magie mais n’en est pas moins impressionnant !</h3>
<p>J’ai de temps en temps des rapports de bugs avec des gens qui se plaignent que des textes de test ne sont pas convenablement détectés. Parfois il s’agit soit de tests sur quelques caractères à peine, soit de caractères aléatoires.</p>
<p>Vous l’aurez compris, dans le premier cas, <code>uchardet</code> pourrait fonctionner mais étant un outil statistique, il est évident que plus il y a de texte, plus on peut avoir confiance en la réponse. <code>uchardet</code> ne fait notamment pas de recherche dictionnaire (ce qui aurait un tout autre coût temporel et rendrait l’outil très lent) ni d’étude grammaticale. Les chances de trouver le bon jeu de caractère si tout ce que vous avez est un unique mot de quelques caractères est forcément plus sujet à erreur.</p>
<p>Dans le second cas, c’est carrément contraire à la logique d’<code>uchardet</code>. On a eu des cas où des gens testaient une seule lettre dans divers jeux de caractères et n’étaient pas content qu’<code>uchardet</code> ne trouvait pas le bon jeu. Comme expliqué plus haut, d’autant plus si le caractère est mono-octet, sa version codée est probablement valide dans des dizaines de jeux de caractères, voire tous. Dans le cas d’une séquence aléatoire de caractères, cela ne fera qu’embrouiller les modèles statistiques de la librairie qui cherchera à assigner un score selon des fréquences de séquences qui ne correspondent en fait à aucune langue.</p>
<p>Il y a aussi le fait de mélanger les langues, ce qui n’est pas un problème en soi s’il y a suffisamment de texte (puisqu’on travaille statistiquement, même s’il y a une citation dans une langue étrangère, on peut supposer que le gros du texte est dans la langue à chercher, et c’est suffisant pour faire pencher la balance). Une variante de cela est les balises de formatage de fichier, lesquelles contiennent souvent de l’anglais. J’en parlais plus haut dans mon exemple avec un fichier HTML. Il est conseillé de nettoyer les balises et ne garder que le contenu pour une détection plus fiable. Bien sûr, ces balises ne feront que baisser un peu les scores et si le vrai contenu est suffisamment conséquent, cela pose peu de problème.</p>
<p>Enfin <code>uchardet</code> ne détecte donc pas des codages, mais bien des couples de <code>(langage, codage)</code>. La liste précise de la version 0.0.8 est <a href="https://www.freedesktop.org/wiki/Software/uchardet/#supportedlanguagesencodings">disponible sur le site</a>. C’est ainsi que nous pouvons détecter un texte par exemple en <code>ISO-8859-15</code> écrit en danois, finnois, français, irlandais, italien, norvégien, portugais, espagnol et suédois. S’il advenait qu’on cherche à tester un texte utilisant ce codage dans un autre langage, il y a de fortes chances que l’outil fonctionnerait moins bien : il pourrait quand même donner le bon codage, mais ce serait par chance (probablement par similarité statistique avec une autre langue, mais sûrement avec un score de concordance médiocre). Une façon de contribuer à <code>uchardet</code> est donc de créer des <a href="https://gitlab.freedesktop.org/uchardet/uchardet/-/tree/master/script/langs">fichiers de langue</a>, des <a href="https://gitlab.freedesktop.org/uchardet/uchardet/-/tree/master/script/charsets">fichiers de jeux de caractère</a> puis lancer le script de génération de modèle comme expliqué dans ce petit <a href="https://gitlab.freedesktop.org/uchardet/uchardet/-/blob/master/script/README">README</a> pour développeurs. Plus nous prendrons en charge de couples de langue et codage, plus l’outil sera utile.</p>
<h2 id="toc-futur-api-de-détection-de-langage">Futur : API de détection de langage</h2>
<p>J’ai commencé (depuis 2020, à intervalle irrégulier) de travailler à étendre l’usage d’<code>uchardet</code> pour faire de la détection de langage. Comme je l’ai expliqué, c’est en fait déjà le cas en interne, sauf que la langue détectée ne ressortait pas dans les résultats de l’outil. Historiquement l’outil ne sert que pour détecter le codage d’un fichier.</p>
<p>J’ai toujours trouvé cela dommage et c’est donc la direction que prend le projet puisque je viens de fusionner ma branche de travail de long terme sur le dépôt principal, pour la future version <code>uchardet 0.1.0</code>.<br>
<code>uchardet</code> 0.0.8 est donc probablement la dernière version qui ne retourne que le codage du texte. La version suivante permettra aussi d’en connaître le langage.</p>
<p>Cette future version retournera désormais une liste de candidats et les scores de confiance de chacun, permettant par exemple à un logiciel de ne pas juste se fier au premier résultat. Si 2 résultats ont un score très proche, un logiciel intéractif pourrait décider d’afficher une boîte de dialogue proposant les 2 codages avec prévisualisation, ou en demandant la langue présumée du texte.</p>
<p>J’ai aussi commencé à ajouter des systèmes de poids (pas comme les vieilles bibliothèques de détection bien sûr, au contraire pour permettre d’implémenter des systèmes plus intelligents), mais j’en parlerai dans une future dépêche pour ne pas trop <em>spoiler</em>.</p>
<p>J’ai pas mal de développements en cours, non seulement sur l’API mais aussi sur la précision de détection qui a déjà fait un énorme bond entre la version 0.0.8 à peine sortie et le code en développement.<br>
De manière générale, même si les 3 concepts explicités plus haut sont toujours globalement à la base de la détection, je les ai fait évoluer, avec de nouveaux concepts ou sous-concepts et j’ai revu les calculs. C’était en réalité déjà le cas dans les versions 0.0.*, mais ça le sera encore davantage avec les versions 0.1.* à venir.<br>
Certaines parties du calcul originel des scores de confiance n’avaient en fait pas beaucoup de sens statistique et <em>marchaient</em> parfois un peu par “chance” (disons plutôt : sûrement des tests arbitraires des développeurs d’origine qui avaient des effets de bords valides statistiquement, mais avec une logique un peu bancale). Je revois donc ces calculs en permanence en me basant sur mes expérimentations statistiques. Ça me prend pas mal de temps, car il commence à y avoir beaucoup de modèles à régénérer à chaque changement dans la logique des modèles (plus d’une centaine de modèles de séquences pour plusieurs dizaines de modèles de langues). Les résultats sont en tous cas extrêmement prometteurs.</p>
<p>L’une des conséquences, notamment, est que les versions suivantes devraient prendre en charge beaucoup plus de couples de <code>(langage, codage)</code>, et avec plus de fiabilité.</p>
<p>J’ai encore du travail sur cette branche, mais elle avance bien. J’espère pouvoir sortir <code>uchardet</code> 0.1.0 en 2023.</p>
<h2 id="toc-conclusion-et-financement">Conclusion et financement</h2>
<p>Cette bibliothèque est un petit projet annexe (à mon plus gros projet, <a href="//linuxfr.org/news/gimp-fete-ses-27-ans-avec-la-version-de-developpement-2-99-14">GIMP</a>) qui m’a toujours beaucoup plu puisque j’aime énormément le traitement des langues (je maintiens d’ailleurs quelques autres projets autour de ce sujet).<br>
Je le développe par à-coup, notamment lorsque j’ai besoin de faire une petite pause dans mon développement sur GIMP (la charge est lourde), ce qui fut le cas ce mois de décembre, où j’ai fait un mini <em>burn-out</em> après la sortie de GIMP 2.99.14 et avais besoin de décompresser en codant autre chose (ce qui ne m’a pas empêché de faire quelques <em>commits</em> sur GIMP, des revues de code, de gérer les activités au jour le jour et de répondre à des rapports de bug 😅 ; peut-être devrais-je revoir ma définition de pause…).</p>
<p>En tous les cas, j’espère que vous appréciez ce projet qui est déjà pas mal utilisé.</p>
<p>Au passage, je ne peux que rappeler que si vous appréciez mon code, vous pouvez me financer à travers le <a href="https://film.zemarmot.net/">projet “ZeMarmot”</a> (sur <a href="https://liberapay.com/ZeMarmot/">Liberapay</a> ou <a href="https://www.patreon.com/zemarmot">Patreon</a> notamment, ou même par donations en virement direct en contactant l’association <a href="https://libreart.info/fr/donate">LILA</a>).<br>
Certes uchardet n’est pas un produit direct du projet “ZeMarmot” mais c’est le moyen le plus sûr de me payer officiellement pour développer du code libre, et par conséquent tout autre projet libre que je fais en est aussi une conséquence indirecte (y compris <code>uchardet</code>). Donc si vous appréciez <code>uchardet</code> et l’utilisez dans votre code (ou si vous l’utilisez indirectement parce que vous regardez des films avec <code>mpv</code> ou un lecteur basé sur <code>QtAV</code>), financez “ZeMarmot” pour assurer la pérennité de cette librairie, s’il vous plaît! 🤗</p>
<p>Je vous souhaite de belles fêtes de fin d’année à tous, et ce quelle que soit la langue:</p>
<pre><code class="sh">$ <span class="nb">echo</span> <span class="s2">"Joyeux Noël et bonnes fêtes de fin d’année!"</span> <span class="p">|</span> uchardet -V
UTF-8 / fr <span class="o">(</span><span class="m">0</span>.793221<span class="o">)</span>
UTF-8 / vi <span class="o">(</span><span class="m">0</span>.706612<span class="o">)</span>
UTF-8 / sl <span class="o">(</span><span class="m">0</span>.665267<span class="o">)</span>
UTF-8 / sv <span class="o">(</span><span class="m">0</span>.661734<span class="o">)</span>
UTF-8 / es <span class="o">(</span><span class="m">0</span>.622741<span class="o">)</span>
<span class="o">[</span>…<span class="o">]</span>
$ <span class="nb">echo</span> <span class="s2">"메리 크리스마스!"</span> <span class="p">|</span> uchardet -V
UTF-8 / ko <span class="o">(</span><span class="m">0</span>.990000<span class="o">)</span>
IBM866 / ru <span class="o">(</span><span class="m">0</span>.396848<span class="o">)</span></code></pre>
<p><em>Note: l’option <code>-V</code> donnant les scores de confiance et les candidats de couples de codage/langue ne se trouve pour l’instant que dans le code en développement, qui a détecté le français et coréen ici. Inutile de le tester sur uchardet 0.0.8. C’est un petit teaser sur le futur d'<code>uchardet</code>!</em> 😜<br>
🎅🎉🥂</p>
</div><div><a href="https://linuxfr.org/news/sortie-de-uchardet-0-0-8-pour-la-detection-de-codages-de-caracteres.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129722/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/sortie-de-uchardet-0-0-8-pour-la-detection-de-codages-de-caracteres#comments">ouvrir dans le navigateur</a>
</p>
JehanJulien JorgeBenoît Sibaudhttps://linuxfr.org/nodes/129722/comments.atomtag:linuxfr.org,2005:Poll/6042022-07-21T18:15:00+02:002022-09-20T14:42:04+02:00Mon rapport à l'anglais <ul><li>Non par principe et je veux récupérer Jersey et Guernesey.</li><li>J'ai toujours du mal à l'écrit et à l'oral et je ne progresse guère.</li><li>L'écrit ça passe mais je ne suis pas à l'aise à l'oral.</li><li>On parle tous anglois au boulot, c'est comme une deuxième langue.</li><li>Je pense en anglais et j'ai besoin de chercher certains mots en français.</li><li>C'est «has-been» l'anglois mec, faut se mettre au mandarin.</li><li>Une autre réponse que je t'explique en commentaire.</li><li>Obi-Wan Kenobi.</li></ul><div><a href="https://linuxfr.org/sondages/mon-rapport-a-l-anglais.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/125927/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/sondages/mon-rapport-a-l-anglais#comments">ouvrir dans le navigateur</a>
</p>
Joallandhttps://linuxfr.org/nodes/125927/comments.atomtag:linuxfr.org,2005:Bookmark/43652022-03-01T08:51:26+01:002022-03-01T08:51:26+01:00Traduire la langue des signes avec TensorFlow et de la reconnaissance d'images<a href="https://github.com/priiyaanjaalii0611/ASL_to_English">https://github.com/priiyaanjaalii0611/ASL_to_English</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127052/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pulkomandy/liens/traduire-la-langue-des-signes-avec-tensorflow-et-de-la-reconnaissance-d-images#comments">ouvrir dans le navigateur</a>
</p>
pulkomandyhttps://linuxfr.org/nodes/127052/comments.atomtag:linuxfr.org,2005:Bookmark/40872022-01-07T13:19:21+01:002022-01-07T13:19:21+01:00Nouvelle carte d'identité bilingue : l'Académie française prête à saisir le Conseil d'Etat<a href="https://www.francetvinfo.fr/culture/patrimoine/nouvelle-carte-d-identite-bilingue-l-academie-francaise-prete-a-saisir-le-conseil-d-etat_4906437.html">https://www.francetvinfo.fr/culture/patrimoine/nouvelle-carte-d-identite-bilingue-l-academie-francaise-prete-a-saisir-le-conseil-d-etat_4906437.html</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/126494/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/misc/liens/nouvelle-carte-d-identite-bilingue-l-academie-francaise-prete-a-saisir-le-conseil-d-etat#comments">ouvrir dans le navigateur</a>
</p>
Mischttps://linuxfr.org/nodes/126494/comments.atomtag:linuxfr.org,2005:Diary/388272019-12-06T11:48:25+01:002019-12-06T11:48:25+01:00regex-wordsearch : Faire une recherche dans le dictionnaire par expression régulièreLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Les <a href="https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re">expressions régulières</a> sont un outil très pratique pour rechercher un texte correspondant à un certain motif. Elles sont très connues et leur usage est très répandu parmi les programmeurs, et les informaticiens en général. Cependant, et je pense que c'est dommage, elles ne sont pas enseignées à l'école, et sont assez peu connues de la population générale des utilisateurs de l'outil informatique.</p>
<p>Récemment, ma compagne a été chargée d'une nouvelle mission. Elle doit déchiffrer et traduire du russe en français les notes personnelles écrites par <a href="https://fr.wikipedia.org/wiki/Bronislava_Nijinska">une chorégraphe</a> du début du vingtième siècle. L'écriture étant vraiment difficile à déchiffrer, le travail devient parfois un jeu de devinettes, où à partir de quelques lettres compréhensibles et du contexte, il faut deviner un mot. Par exemple, on arrive à déchiffrer un т au début du mot, et les lettres ело à la fin, mais impossible de comprendre les deux lettres du milieu. Rechercher un mot qui pourrait correspondre est très fastidieux avec un simple dictionnaire, mais très facile lorsque l'on connaît les expressions régulières.</p>
<p>J'ai donc eu une idée très simple: faire une toute petite application web dans laquelle on peut chercher un mot dans un dictionnaire par expression régulière. Une petite soirée de travail plus tard, <a href="https://regex-wordsearch.netlify.com/">regex-wordsearch</a> est né. Ma compagne en est très contente, et l'application est simplissime : on entre une expression régulière, on choisit un dictionnaire dans lequel faire la recherche, et choisit si on veut faire la recherche à l'intérieur du mot, ou si le mot complet doit correspondre au motif entré: </p>
<p><a href="https://regex-wordsearch.netlify.com/"><img src="//img.linuxfr.org/img/68747470733a2f2f6672616d617069632e6f72672f343372325873793158737a552f3346474a52537973667871442e706e67/3FGJRSysfxqD.png" alt="Capture d'écran" title="Source : https://framapic.org/43r2Xsy1XszU/3FGJRSysfxqD.png"></a></p>
<p>L'application est publiée sous licence BSD <a href="https://github.com/lovasoa/wordsearch/">sur github</a>, et une version en ligne est disponible à l'adresse suivante: <a href="https://regex-wordsearch.netlify.com/">https://regex-wordsearch.netlify.com/</a></p>
<p>J'espère qu'elle pourra vous être utile à vous aussi !</p>
<div><a href="https://linuxfr.org/users/lovasoa/journaux/regex-wordsearch-faire-une-recherche-dans-le-dictionnaire-par-expression-reguliere.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/118832/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/lovasoa/journaux/regex-wordsearch-faire-une-recherche-dans-le-dictionnaire-par-expression-reguliere#comments">ouvrir dans le navigateur</a>
</p>
lovasoahttps://linuxfr.org/nodes/118832/comments.atomtag:linuxfr.org,2005:Tracker/18902019-07-25T00:30:31+02:002019-07-25T00:30:31+02:00Dépêches : Les langues ne devraient pas être indiquées avec des drapeaux de pays<p>Bonjour,</p>
<p>les langues sont actuellement indiquées avec des drapeaux de pays. C'est une choses couramment pratiquée parce qu'une icône semble passer mieux qu'un texte, mais qui pose de nombreux problèmes, entre autres:</p>
<ul>
<li>une langue peut être parlée dans plusieurs pays. Ainsi en mettant le drapeau français pour la langue française, on ignore les autres pays francophones (comme la Belgique, la Suisse, de nombreux pays d'Afrique, le Canada, etc.)</li>
<li>un pays peut avoir plusieurs langues officielles (on peut reprendre la Suisse ou la Belgique)</li>
<li>tout le monde ne connaît pas les drapeaux des pays</li>
</ul>
<p>Il serait donc bien de remplacer les drapeaux par des codes ISO.</p>
<p>Merci.</p>
<p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/117758/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/suivi/les-langues-ne-devraient-pas-etre-indiquees-avec-des-drapeaux-de-pays#comments">ouvrir dans le navigateur</a>
</p>
Goffihttps://linuxfr.org/nodes/117758/comments.atomtag:linuxfr.org,2005:Diary/348932014-04-15T21:01:27+02:002014-04-15T22:02:17+02:00HermaiaLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p><strong>en bref</strong> : <a href="https://github.com/suizokukan/hermaia">Hermaia</a> 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 <a href="http://94.23.197.37/phokaia/hermaia/hermaia.dumpfile.txt">ici</a> (si vous voyez n'importe quoi, pensez à utiliser l'unicode comme encodage).</p>
<hr><p><strong>Hermaia</strong> est un (très modeste) <a href="https://github.com/suizokukan/hermaia">projet</a> (Python3/GPLv3) <strong>permettant</strong> </p>
<ul>
<li>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".</li>
<li>de rechercher un mot et de l'analyser. Ex : est-ce que le mot "aimerai" existe ? Oui, il s'agit d' "aimer"+"futur.3S" .</li>
</ul><p>Un objet Hermaia lit et écrit ses informations dans une base de données MySQL <a href="//linuxfr.org/forums/programmationautre/posts/table-mysql-a-optimiser">pour la structure de laquelle j'ai dû demander de l'aide</a>.<br>
Il est également possible de demander une <a href="http://94.23.197.37/phokaia/hermaia/hermaia.dumpfile.txt">image texte (un dump) de la base de données</a> : on obtient alors un fichier texte qu'il est possible de modifier et de retransformer en base de données.</p>
<p>La base de données est gérée par le module sqlite3 : si certains veulement m'aider à utiliser PostgreSQL, je suis preneur.</p>
<p>La recherche se fait par l'intermédiaire d'un buffer qui garde en mémoire les demandes les plus fréquentes.</p>
<p>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).</p>
<hr><p><strong>Comment utiliser Hermaia pour chercher un mot dans la base ?</strong></p>
<pre><code class="python"><span class="k">with</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s">"database.db"</span><span class="p">)</span> <span class="k">as</span> <span class="n">database</span><span class="p">:</span>
<span class="k">with</span> <span class="n">Hermaia</span><span class="p">(</span><span class="n">database</span> <span class="o">=</span> <span class="n">database</span><span class="p">)</span> <span class="k">as</span> <span class="n">h</span><span class="p">:</span>
<span class="n">h</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s">"aimerai"</span><span class="p">)</span></code></pre>
<p>… 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.</p>
<hr><p><strong>Comment remplir la base de données ? L'exemple de Phokaia</strong></p>
<p>J'ai développé Hermaia pour servir d'extension au projet <a href="https://github.com/suizokukan/logotheras">Logotheras</a> qui crée des dictionnaires. Comme les articles d'un dictionnaire Logotheras peuvent contenir l'ensemble des formes possibles d'un mot (project <a href="https://github.com/suizokukan/inflectiones">inflectiones</a>) il suffit de récupérer le contenu du tableau généré et de l'injecter dans la base de données.<br>
Travaillant principalement sur une ébauche de dictionnaire <a href="http://94.23.197.37/phokaia/phokaia.html">grec ancien->français</a> j'ai donc récupéré l'ensemble des formes calculées. Le résultat se trouve <a href="http://94.23.197.37/phokaia/hermaia/">là</a>. Le résultat me paraît encourageant.</p>
<hr><p><strong>et la suite ?</strong></p>
<p>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 !</p><div><a href="https://linuxfr.org/users/suizokukan/journaux/hermaia.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/101886/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/suizokukan/journaux/hermaia#comments">ouvrir dans le navigateur</a>
</p>
Xavier Faurehttps://linuxfr.org/nodes/101886/comments.atomtag:linuxfr.org,2005:Post/332782013-11-04T20:28:00+01:002013-11-04T20:28:00+01:00Un bon site pour trouver des correspondants linguistiques?<p>Bonjour,</p>
<p>Je demandais si vous connaissiez de bons sites pour trouver des correspondants étrangers afin d’apprendre/perfectionner sa maitrise d’une langue. J’ai l’impression qu’il y a beaucoup de sites pour ça mais bon j’ai pas trop le temps de tout tester donc je me dis qu’il y en a sûrement parmi vous qui pourrons me faire un retour d’expérience!</p>
<p>Pour le moment j’ai repéré <a href="http://www.mosalingua.com/blog/2011/12/29/les-meilleurs-sites-echange-linguistique-pour-pratiquer-gratuitement-une-langue-oral/">ce blog</a> qui liste quelques sites, ainsi que <a href="http://www.mylanguageexchange.com/Default_fr.asp">celui-ci</a> (la version française comporte quelques tournures étranges et c’est moche mais ça a l’air très complet).</p>
<p>Pour information, je suis plutôt intéressé par le japonais mais je n’exclue pas d’autres langues dans le futur.</p>
<p>Merci d’avance.</p><div><a href="https://linuxfr.org/forums/general-hors-sujets/posts/un-bon-site-pour-trouver-des-correspondants-linguistiques.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/100229/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/general-hors-sujets/posts/un-bon-site-pour-trouver-des-correspondants-linguistiques#comments">ouvrir dans le navigateur</a>
</p>
ariasunihttps://linuxfr.org/nodes/100229/comments.atomtag:linuxfr.org,2005:News/346402013-10-01T10:30:56+02:002013-10-01T10:30:56+02:00Logotheras, compilateur de dictionnaires de languesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<div><p>En bref : <a href="http://94.23.197.37/logotheras">une bibliothèque</a> (Python3, GPLv3) hébergée sous <a href="https://github.com/suizokukan/logotheras">GitHub</a>, permettant de lire des dictionnaires de langues (<a href="http://git.tuxfamily.org/tenez/gitrepository.git">au format texte</a> 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.</p></div><ul><li>lien nᵒ 1 : <a title="http://projects.tuxfamily.org/?do=group;name=tenez" hreflang="fr" href="https://linuxfr.org/redirect/87851">Projet de démonstration "tenez", dictionnaire anglais->français</a></li><li>lien nᵒ 2 : <a title="http://94.23.197.37/logotheras/" hreflang="fr" href="https://linuxfr.org/redirect/87852">Logotheras</a></li><li>lien nᵒ 3 : <a title="https://github.com/suizokukan/logotheras" hreflang="fr" href="https://linuxfr.org/redirect/87853">Logotheras sur GitHub</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#quest-ce-logotheras">Qu'est-ce Logotheras ?</a></li>
<li><a href="#les-fichiers-texte-et-le-format-textdbdict">Les fichiers texte et le format TextDBDict</a></li>
<li><a href="#compilation-dun-dictionnaire">Compilation d'un dictionnaire</a></li>
<li><a href="#options-diverses-pour-la-compilation">Options diverses pour la compilation</a></li>
<li><a href="#%C3%89criture-du-code-choix-de-la-licence">Écriture du code, choix de la licence</a></li>
<li><a href="#futurs-d%C3%A9veloppements-conclusion">Futurs développements, conclusion</a></li>
</ul><h2 id="quest-ce-logotheras">Qu'est-ce Logotheras ?</h2>
<p>Dans le cadre d'un projet personnel, <a href="http://94.23.197.37">j</a>'ai eu besoin d'un module Python3 lisant et écrivant des données placées dans des dictionnaires. Le format des dictionnaires texte (<a href="http://94.23.197.37/logotheras/examples_textDBDict/tenez.textdbdict">un exemple ici</a>) est propre à mon module et n'est pas compatible avec d'autres formats comme StarDict, Babylon, Lingvo ou Dictd.<br>
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.<br>
Tout dictionnaire Logotheras repose donc sur un ensemble de textes, le corpus, découpé en extraits qui peuvent être traduits et commentés.<br>
Logotheras peut utiliser l'une de mes bibliothèques (<a href="http://94.23.197.37/dchars/doc/en/index.html">DChars</a>) pour certaines langues : c'est DChars qui peut trier les mots et normaliser les caractères utilisés dans les mots.</p>
<p>À 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 <code>logotheras.py</code> livré avec !</p>
<p>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.</p>
<h2 id="les-fichiers-texte-et-le-format-textdbdict">Les fichiers texte et le format TextDBDict</h2>
<p>À titre d'exemple, voyez <code>tenez</code> (anglais -> français, à prononcer <em>[tenets]</em>), le dictionnaire de démonstration - ce n'est pas un vrai projet - que vous trouverez <a href="http://git.tuxfamily.org/tenez/gitrepository.git">à cette adresse</a>.</p>
<p>Tout dictionnaire Logotheras existe comme une suite de fichiers texte stockés dans un répertoire. <a href="http://git.tuxfamily.org/tenez/gitrepository.git?p=tenez/gitrepository.git;a=tree">À la racine du répertoire</a>, un fichier <code>informations.textdbdict</code> recense les auteurs, les titres, les éditions… Puis un sous-répertoire <code>source</code> contient tous les fichiers de données, au format TextDBDict.</p>
<p>Un fichier de données au format TextDBDict est une partie d'un dictionnaire ; en voici les divisions :</p>
<ul>
<li>un dictionnaire est divisé en articles (un article par mot) ;</li>
<li>un article est divisé en entrées (une entrée par sens du mot) ;</li>
<li>une entrée est divisée en extraits (chaque extrait illustrant le sens).</li>
</ul><p>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.</p>
<p>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.</p>
<p>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 '#' :</p>
<pre><code>(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).
</code></pre>
<p>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.</p>
<h2 id="compilation-dun-dictionnaire">Compilation d'un dictionnaire</h2>
<p>J'ai écrit un front-end permettant d'appeler Logotheras depuis la ligne de commande, front-end que j'utiliserai dans les exemples suivants.</p>
<p>Un exemple minimaliste, pour simplement lire un répertoire TextDBDict :</p>
<p>(on supposera qu'il existe un sous-répertoire <code>logs/</code> permettant d'accueillir les fichiers de logs)</p>
<p><code>$ ./logotheras.py --showstatistics --textinput=/home/xxx/projets/tenez/</code> … lit le contenu du répertoire <em>tenez</em> et affiche des statistiques sur les données. Vous y lirez par exemple :</p>
<pre><code>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
[…]
</code></pre>
<h2 id="options-diverses-pour-la-compilation">Options diverses pour la compilation</h2>
<p>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 :</p>
<p><code>$ ./logotheras.py --showstatistics --textinput=/home/xxx/projets/tenez/ --textoutput=/tmp/tenez/</code></p>
<p>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 <code>--TEXTDBDICTwriteseveralfiles=10</code>.<br>
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 <code>--TEXTDBDICTwriteseveralfiles=a</code>, ou <code>--TEXTDBDICTwriteseveralfiles=aa</code> pour des mots groupés selon leur deux premières lettres, etc.</p>
<p>Si vous ne désirez garder que ce que vous avez défini comme étant 100% libre, choisissez <code>--minimalfreeness=100</code> ; à la place de <code>100</code> vous pouvez écrire le nombre de votre choix. Choisir <code>--minimalfreeness=0</code> signifie que vous gardez tout. C'est dans le fichier <code>informations.textdbdict</code> que le degré de "liberté" des textes et des sources des traductions est défini.</p>
<p>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 <a href="http://94.23.197.37/dchars/doc/en/index.html">DChars</a> pour rectifier le nom des auteurs, des titres et des textes eux-mêmes. Ainsi, utilisez l'option <code>--normalize=titles+authors</code> 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.</p>
<p>Outre <code>--showstatistics</code>, vous auriez intérêt à laisser <code>--showerrorsnumber</code> pour voir s'afficher le décompte des erreurs et des warnings.</p>
<p>Enfin, les messages peuvent être orientés vers trois flux : <code>console</code>, <code>lastlog</code> et <code>rotatinglog</code>. 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 <code>--logs=lastlog+rotatinglogs</code> pour éliminer les messages vers la console et conserver les deux autres.</p>
<h2 id="Écriture-du-code-choix-de-la-licence">Écriture du code, choix de la licence</h2>
<p>J'ai essayé de respecter les normes actuelles : code et documentation en anglais, utilisation de Git via <a href="https://github.com/suizokukan/logotheras">GitHub</a>, de <a href="http://www.pylint.org/">Pylint</a> pour vérifier mon code et de <a href="http://sphinx-doc.org/">Sphinx</a> pour écrire la documentation.<br>
Il manque les tests unitaires qui ne sont pas encore écrits.</p>
<p>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.</p>
<h2 id="futurs-développements-conclusion">Futurs développements, conclusion</h2>
<p>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.</p>
<p>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 !</p></div><div><a href="https://linuxfr.org/news/logotheras-compilateur-de-dictionnaires-de-langues.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/99819/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/logotheras-compilateur-de-dictionnaires-de-langues#comments">ouvrir dans le navigateur</a>
</p>
Xavier FaureZeroHeureNÿcoBenoît SibaudNils Ratusznikhttps://linuxfr.org/nodes/99819/comments.atomtag:linuxfr.org,2005:News/285952011-10-10T12:10:55+02:002021-07-11T19:28:13+02:00Est‐il démocratique, adapté et rentable que l’anglais soit la langue internationale ?Licence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<div><p>Dans <a href="http://www.youtube.com/playlist?list=A8090AD0B95CA11A&feature=search-pl-exp2">une série de vidéos</a>, <a href="http://fr.wikipedia.org/wiki/Claude_Piron">Claude Piron</a>, psychologue et ancien traducteur, dissèque les mécanismes linguistiques, au travers d’une analyse critique du choix de l’anglais comme langue internationale.</p>
<p>Après avoir mis en lumière l’importance de la maîtrise d’une langue lors d’échanges internationaux politiques, économiques, scientifiques et autres, il montre en quoi le choix de l’anglais comme langue internationale :</p>
<ol>
<li>n’est pas démocratique ;</li>
<li>est inadapté ;</li>
<li>a un résultat, par rapport à l’énergie et aux sommes dépensées pour son apprentissage, proche de 0 ; ce qui ne serait jamais accepté dans d’autres domaines.</li>
</ol>
<p><em><strong>NdM :</strong></em></p>
<ul>
<li><em>la question du rôle de l’anglais n’est pas nouvelle (et d’ailleurs les vidéos en question ont plus d’un an), d’où la création de langues artificielles ou construites à vocation de langue internationale, comme l’<a href="fin%20du%20XIXe%C2%A0si%C3%A8cle">[esperanto]</a> ;</em></li>
<li>
<em>sur les liens tissés entre logiciel libre et esperanto :</em> <a href="http://www.framablog.org/index.php/post/2009/01/03/esperanto-et-logiciel-libre">Esperanto et logiciel libre par Framasoft, <em>en 2009</em></a>, <em><a href="http://antoine.michelot.free.fr/spip.php?article1245">conférence RMLL 2005 « Linux, l’espéranto des logiciels ; l’Espéranto, le Linux des langues »</a>, etc. ;</em>
</li>
<li><em>sur <a href="http://en.wikipedia.org/wiki/Wikipedia:Multilingual_statistics">Wikipédia, en nombre de pages</a>, on peut noter que le <a href="https://fr.wikipedia.org/wiki/volap%C3%BCk" title="Définition Wikipédia">volapük</a> est 17e et l’esperanto 22e ;</em></li>
<li><em>on peut aussi pragmatiquement noter que la vraie difficulté réside dans l’adoption d’une nouvelle langue et l’éventuelle transition de la référence actuelle à celle‐ci.</em></li>
</ul>
</div><ul></ul><div><p>Pour le premier point, je n’ai pas grand chose à dire, c’est une évidence, une fois que l’on en a pris conscience ; donner, de fait, la maîtrise de la langue internationale à un segment de la population mondiale est complètement injuste, quand on en perçoit l’importance politique et économique.</p>
<p>Pour le deuxième, voici quelques raisons que j’ai retenues, il y en a d’autres…<br>
En anglais :</p>
<ul>
<li>il est complètement impossible de connaître la prononciation d’un mot en le lisant. Par exemple, il a 7 prononciations différentes pour « ough » : <em>though</em>, <em>tough</em>, <em>through</em>, <em>bought</em>, <em>cough</em>, <em>thorough</em> et <em>plough ;</em>
</li>
<li>il y a 7 voyelles, mais 24 nuances de prononciations qui font sens (par exemple, _« sheep » et « ship ») ;</li>
<li>c’est une langue plutôt floue et imprécise, elle fait souvent appel à un sentiment qui se dégage de l’association des mots, plutôt qu’à une logique stricte ;</li>
<li>il n’est souvent pas possible de faire des dérivations. Par exemple, dans « dentiste », il y a « dent », dans « annuel », il y a « an », dans « désarmement », il y a « arme », dans « lunaire », il y a lune, etc.. En anglais, dans <em>« dentist »</em>, il n’y a pas <em>« tooth/teeth »</em>, dans <em>« annual »</em>, il n’y a pas <em>« year »</em>, dans <em>« disarmament »</em>, il n’y a pas <em>« weapon »</em>, dans <em>« lunar »</em>, il n’y a pas <em>« moon »</em>, etc. ;</li>
<li>beaucoup d’exceptions de langage : grammaticales, orthographiques, de tournures, de pluriels (comme en français, d’ailleurs) ;</li>
<li>il existe de nombreux préfixes de contraire (<em>visible/invisible</em>, <em>enable/disable</em>, <em>unsuitable/suitable</em>) qui empêche la généralisation du langage.</li>
</ul>
<p>Pour le troisième, je renvoie aux vidéos où les chiffres sont donnés et analysés…</p>
<p>Qu’on ne s’y trompe pas, l’auteur est anglophile, il n’est pas question ici de comparer l’anglais à une autre langue, ni d’en faire une critique stérile ; il s’agit de pointer les conséquences, finalement assez intolérables, qu’impose le choix de cette langue comme langue internationale face à une solution plus juste et adaptée, mais qui est complètement occultée par nos dirigeants.</p>
<p>Toutes les vidéos sont intéressantes, mais s’il n’y en avait que deux à voir, ce seraient <a href="http://www.youtube.com/watch?v=pCiM7-h6sJg&list=PLA8090AD0B95CA11A&index=3">la 8</a> et <a href="http://www.youtube.com/watch?v=yXSbfQkrxNk&list=PLA8090AD0B95CA11A&index=1">la 10</a> ; dans cette dernière, il donne une solution évidente, que tout le monde ici connaît déjà…</p>
</div><div><a href="https://linuxfr.org/news/est-il-democratique-adapte-et-rentable-que-l-anglais-soit-la-langue-internationale.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/87722/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/est-il-democratique-adapte-et-rentable-que-l-anglais-soit-la-langue-internationale#comments">ouvrir dans le navigateur</a>
</p>
Philippe Ivaldihttps://linuxfr.org/nodes/87722/comments.atomtag:linuxfr.org,2005:Diary/20792003-04-03T14:44:18+02:002003-04-03T14:44:18+02:00Directive européenne sur la langue de l'UnionVoici la dernière directive européenne, bon entraînement : La Commission européenne a finalement tranché : après la monnaie unique, l'Union européenne va se doter d'une langue unique, à savoir... le Français. Trois langues étaient en compétition: le Français (parlé par le plus grand nombre de pays de l'Union, la France, la Belgique, le Luxembourg), l'Allemand (parlé par le plus grand nombre d'habitants de l'Union) et l'Anglais (langue internationale par excellence).
<br />
<br />
L'Anglais a vite été éliminé, pour deux raisons : l'Anglais aurait été le cheval de Troie économique des États-Unis et les Britanniques ont vu leur influence limitée au profit du couple franco/allemand en raison de leur légendaire réticence à s'impliquer dans la construction européenne.
<br />
<br />
Le choix a fait l'objet d'un compromis, les Allemands ayant obtenu que l'orthographe du Français, particulièrement délicate à maîtriser, soit réformée, dans le cadre d'un plan de cinq ans, afin d'aboutir à l'Eurofrançais.
<br />
<br />
1.La premiere annee, tous les accents seront supprimes et les sons actuellement distribues entre "s" , "z" , "c" , "k" et "q" seront repartis entre "z" et "k" , ze ki permettra de zupprimer beaukoup de la konfuzion aktuelle.
<br />
<br />
2. La deuzieme annee, on remplazera le "ph" par "f" , ze ki aura pour effet de rakourzir un mot comme " fotograf " de kelke vingt pour zent.
<br />
<br />
3. La troizieme annee,des modifikations plus draztikes zeront pozibles, notamment ne plus redoubler les lettres ki l'etaient: touz ont auzi admis le prinzip de la zuprezion des "e" muets, zourz eternel de konfuzion, en efet, tou kom d'autr letr muet.
<br />
<br />
4. La katriem ane, les gens zeront devenus rezeptifs a des changements majeurs, tel ke remplazer "g" zoi par "ch" , zoi par "j" , zoi par "k", zelon les ka, ze ki zimplifira davantach l'ekritur de touz.
<br />
<br />
5. Duran la zinkiem ane, le "b" zera remplaze par le "p" et le "v" zera lui auzi apandone, au profi du "f". Efidamen, on kagnera ainzi pluzieur touch zu le klafie. Un foi ze plan de zink an achefe, l'ortokraf zera defenu lochik, et les chen pouron ze komprendr et komunike. Le ref de l'Unite kulturel de l'Europ zera defenu realite !
<br />
<br />
La rechion la mieu prepare en Europ est l'Alzaz ou 90% de la populazion le pratik decha couram'en. Pour les autres ... bonchour l'AnKoiz !!<div><a href="https://linuxfr.org/users/nerville/journaux/directive-europ%C3%A9enne-sur-la-langue-de-lunion.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/28832/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/nerville/journaux/directive-europ%C3%A9enne-sur-la-langue-de-lunion#comments">ouvrir dans le navigateur</a>
</p>
franck villaumehttps://linuxfr.org/nodes/28832/comments.atom