{"id":245632,"date":"2022-03-21T12:47:14","date_gmt":"2022-03-21T11:47:14","guid":{"rendered":"https:\/\/blog.jetbrains.com\/blog\/2022\/03\/21\/looking-at-python-through-the-eyes-of-a-neural-net\/"},"modified":"2022-05-11T16:33:22","modified_gmt":"2022-05-11T15:33:22","slug":"python-du-point-de-vue-du-reseau-neuronal","status":"publish","type":"blog","link":"https:\/\/blog.jetbrains.com\/fr\/blog\/2022\/03\/21\/python-du-point-de-vue-du-reseau-neuronal\/","title":{"rendered":"Python du point de vue du r\u00e9seau neuronal"},"content":{"rendered":"<p>Le <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/14823-full-line-code-completion\" target=\"_blank\" rel=\"noopener\">plugin de saisie semi-automatique compl\u00e8te de ligne de code pour Python<\/a> est maintenant disponible en version <strong>b\u00eata publique<\/strong>. Dans cet article, nous pr\u00e9sentons une partie des technologies et des algorithmes utilis\u00e9s pour la cr\u00e9ation de ce plugin et partageons des statistiques sur la programmation en Python que nous avons collect\u00e9es au cours de ce processus.<\/p>\n<h2>Qu&#8217;est-ce que la \u00ab saisie semi-automatique compl\u00e8te d&#8217;une ligne de code \u00bb&nbsp;?<\/h2>\n<p>Vous connaissez d\u00e9j\u00e0 sans doute la saisie semi-automatique ou compl\u00e9tion de code, qui sugg\u00e8re le mot suivant celui que l&#8217;utilisateur saisit. Si ce n&#8217;est pas le cas, nous lui avons consacr\u00e9 une s\u00e9rie d&#8217;articles que vous pouvez consulter (<a href=\"https:\/\/blog.jetbrains.com\/blog\/2021\/05\/28\/code-completion-episode-1-scenarios-and-requirements\/\">un<\/a>, <a href=\"https:\/\/blog.jetbrains.com\/blog\/2021\/06\/04\/code-completion-episode-2-why-machine-learning\/\">deux<\/a>, <a href=\"https:\/\/blog.jetbrains.com\/blog\/2021\/07\/02\/code-completion-episode-3-where-is-the-dataset\/\">trois<\/a>, <a href=\"https:\/\/blog.jetbrains.com\/blog\/2021\/08\/20\/code-completion-episode-4-model-training\/\">quatre<\/a>).<\/p>\n<p>La saisie semi-automatique compl\u00e8te de ligne de code va plus loin en sugg\u00e9rant de plus grands fragments de code. Entre autres, elle compl\u00e8te les param\u00e8tres d&#8217;appel de m\u00e9thode pour vous ou \u00e9crit le texte du message d&#8217;erreur. En termes d&#8217;exp\u00e9rience utilisateur, elle est proche de la saisie semi-automatique standard et utilise la m\u00eame fen\u00eatre contextuelle pour pr\u00e9senter les r\u00e9sultats :<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-234554\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/03\/example2.png\" alt=\"L'image affiche un fragment de code dans une fen\u00eatre contextuelle de compl\u00e9tion de code. La fen\u00eatre contextuelle contient trois suggestions de lignes de code compl\u00e8tes. Chacune des suggestions inclut un appel de m\u00e9thode avec plusieurs param\u00e8tres.\" width=\"2449\" height=\"1332\"><\/figure>\n<p>Toutefois, la technologie utilis\u00e9e pour cette forme \u00e9tendue de saisie semi-automatique est fondamentalement diff\u00e9rente.<\/p>\n<p>La saisie semi-automatique standard utilise l&#8217;analyse statique pour d\u00e9terminer les classes, m\u00e9thodes, variables de champ et mots-cl\u00e9s visibles depuis l&#8217;emplacement actuel, et s&#8217;appuie sur le machine learning pour s\u00e9lectionner les meilleures recommandations. La s\u00e9lection du meilleur \u00e9l\u00e9ment \u00e0 partir d&#8217;un ensemble pr\u00e9d\u00e9fini est un exemple de <strong>mod\u00e9lisation discriminative<\/strong>. La saisie semi-automatique compl\u00e8te de ligne de code fournit quant \u00e0 elle un nouveau bloc de code comprenant plusieurs \u00ab mots \u00bb. L&#8217;\u00e9criture de code s&#8217;assimile \u00e0 un processus cr\u00e9atif et fait un usage plus intensif des calculs. On parle alors de <strong>mod\u00e9lisation g\u00e9n\u00e9rative<\/strong>. Les r\u00e9seaux neuronaux constituent un outil de mod\u00e9lisation g\u00e9n\u00e9rative typique, que nous utilisons \u00e9galement.<\/p>\n<p>Voyons plus en d\u00e9tails ce qu&#8217;est la saisie semi-automatique compl\u00e8te de ligne de code et quelles sont les principales caract\u00e9ristiques de son fonctionnement. La question sur laquelle nous nous penchons plus particuli\u00e8rement aujourd&#8217;hui est : comment un r\u00e9seau neuronal per\u00e7oit-il votre programme ?<\/p>\n<p>Les algorithmes fonctionnant avec des langages de programmation utilisent tout un ensemble de techniques provenant du traitement du langage naturel. Au lieu d&#8217;utiliser les mots du langage d&#8217;origine, le r\u00e9seau neuronal a recours \u00e0 une s\u00e9quence de jetons appartenant \u00e0 un vocabulaire sp\u00e9cial. L&#8217;algorithme construit le vocabulaire en utilisant le processus d&#8217;<strong>encodage par paire d&#8217;octets<\/strong>. Nous allons tout d&#8217;abord voir un exemple en anglais simple, puis examiner comment cela fonctionne en Python.<\/p>\n<h2>Encodage par paire d&#8217;octets dans les langages naturels<\/h2>\n<p>L&#8217;algorithme construit le vocabulaire au d\u00e9but de la phase d&#8217;apprentissage et rassemble les statistiques \u00e0 partir des textes utilis\u00e9s pour l&#8217;apprentissage. L&#8217;ensemble de jetons ne change pas apr\u00e8s cela et reste identique tout au long du traitement pendant la phase d&#8217;exploitation.<\/p>\n<p>Imaginons que le seul texte en anglais disponible pour l&#8217;apprentissage soit le dicton suivant :<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-234565\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/03\/Slide1.png\" alt=\"L'image affiche la phase : if you always do what you always did you will always get what you always got.\" width=\"1920\" height=\"1080\"><\/figure>\n<p>Ce dicton peut se v\u00e9rifier ou pas. Quoi qu&#8217;il en soit, il contient plusieurs mots qui se r\u00e9p\u00e8tent, ce qui aide \u00e0 comprendre l&#8217;algorithme. Quels types de jetons pourrons-nous en retirer pour une utilisation ult\u00e9rieure ? Nous initialisons la liste de jetons avec chacune des lettres (symboles) de notre phrase d&#8217;apprentissage :<\/p>\n<p><strong>[i, f, y, o, u, a, l, w, s, d, h, t, g, e]<\/strong><\/p>\n<p>Notez que Unicode code chacune de ces lettres comme un octet unique, de sorte que les symboles et les octets sont ici \u00e9quivalents.<\/p>\n<p>Nous n&#8217;incluons pas d&#8217;espace, mais nous pouvons l&#8217;utiliser comme s\u00e9parateur naturel de jetons. Ce d\u00e9tail aura son importance par la suite.<\/p>\n<p>Apr\u00e8s l&#8217;initialisation, nous d\u00e9veloppons le vocabulaire de fa\u00e7on it\u00e9rative. Nous recherchons la concat\u00e9nation la plus fr\u00e9quente pour les deux entr\u00e9es existantes et la d\u00e9signons comme un nouveau jeton. Dans notre exemple, \u00ab you \u00bb et \u00ab always \u00bb sont r\u00e9p\u00e9t\u00e9s quatre fois, mais nous ne pouvons pas encore les ajouter, car aucun d&#8217;eux n&#8217;est une concat\u00e9nation de <strong>deux<\/strong> entr\u00e9es. Nous devons proc\u00e9der \u00e9tape par \u00e9tape, et le premier candidat est \u00ab yo \u00bb. Une fois le premier jeton d\u00e9fini, il devient ins\u00e9cable, et nous ne pouvons plus utiliser ses \u00e9l\u00e9ments s\u00e9par\u00e9ment. Ainsi, \u00ab ou \u00bb ne pourra jamais devenir un jeton, car cela demanderait de fractionner \u00ab yo \u00bb.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-234576\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/03\/ezgif-4-bba21277ab.gif\" alt=\"Cette image anim\u00e9e montre plusieurs \u00e9tapes de la segmentation de la paire d'octets pour la phrase de l'image pr\u00e9c\u00e9dente : if you always do what you always did you will always get what you always got. Les jetons montr\u00e9s sur l'image sont : yo, ys, al, ays, ways, always, you, wt, at, what.\" width=\"1200\" height=\"675\"><\/figure>\n<p>Nous r\u00e9p\u00e9tons cette \u00e9tape pour trouver d&#8217;autres concat\u00e9nations de jetons fr\u00e9quentes et les ajouter au vocabulaire. L&#8217;algorithme arrivera \u00e0 \u00ab you \u00bb et \u00ab always \u00bb avant de traiter d&#8217;autres paires de symboles, telles que \u00ab wh \u00bb et \u00ab at \u00bb, qui n&#8217;apparaissent que deux fois. Un vocabulaire de taille 32 (puissance de deux) peut se pr\u00e9senter comme suit&nbsp;:<\/p>\n<p><strong>[i, f, y, o, u, a, l, w, s, d, h, t, g, e, yo, ys, al, ays, ways, you, always, at, wh, what, if, il, id, ot, wil, do, did, ge]<\/strong><\/p>\n<p>Tout nouveau jeton ajout\u00e9 est une concat\u00e9nation de deux autres jetons, ce qui s&#8217;appelle un encodage de <strong>paire<\/strong>.<\/p>\n<p>\u00c0 ce stade, pour \u00e9viter toute confusion, il est utile de clarifier les choses concernant le concept de jeton : nous appellerons \u00ab mot \u00bb un \u00e9l\u00e9ment lexical de langage, tandis que nous appellerons \u00ab jeton \u00bb une entr\u00e9e de vocabulaire obtenue par encodage de paire d&#8217;octets. Certains jetons ne sont pas des mots (par exemple <mark class=\"has-inline-color\" style=\"background-color: #fcb900;\"><code>ays<\/code><\/mark>). Il peut \u00e9galement y avoir des mots qui ne sont pas des jetons (par exemple : will et get. Nous avons arr\u00eat\u00e9 la g\u00e9n\u00e9ration du vocabulaire avant de les inclure.)<\/p>\n<p>Le r\u00e9seau neuronal prend une entr\u00e9e et g\u00e9n\u00e8re une sortie en termes de jetons, non de mots. Les ressources de calcul requises d\u00e9pendent de l&#8217;\u00e9tendue du vocabulaire. Cette astuce nous permet de limiter la taille de la valeur voulue au lieu d&#8217;utiliser tous les mots du langage.<\/p>\n<p>La quantit\u00e9 de jetons dans l&#8217;entr\u00e9e est \u00e9galement essentielle pour la qualit\u00e9 et les performances. L&#8217;algorithme peut ne prendre en consid\u00e9ration qu&#8217;un seul fragment u texte (appel\u00e9 \u00ab contexte \u00bb) pour lequel il doit g\u00e9n\u00e9rer la suite. En utilisant des jetons \u00e9tendus, il devient possible de prendre de plus gros morceaux de texte en tant qu&#8217;entr\u00e9e. Heureusement, les langages de programmation offrent des options suppl\u00e9mentaires pour y parvenir.<\/p>\n<h2>Du langage naturel aux langages de programmation<\/h2>\n<p>Les auteurs de syst\u00e8mes de traitement du langage naturel utilisent g\u00e9n\u00e9ralement les limites des mots en tant que limites absolues entre les jetons. La s\u00e9quence \u00ab John Smith \u00bb est plus fr\u00e9quente en anglais que \u00ab Trantor \u00bb, surtout lorsqu&#8217;il s&#8217;agit de non-fiction. Cependant, \u00ab Trantor \u00bb peut th\u00e9oriquement devenir un jeton dans le cadre d&#8217;un vocabulaire beaucoup plus large, car il s&#8217;agit d&#8217;un seul mot. Cela n&#8217;est pas possible pour \u00ab John Smith \u00bb, qui est en deux mots. Les jetons du langage naturel ne d\u00e9passent g\u00e9n\u00e9ralement pas les limites des mots.<\/p>\n<p>Avec les langages de programmation, la s\u00e9paration naturelle des jetons se fait au niveau de l&#8217;analyseur lexical : le mot se termine l\u00e0 o\u00f9 il est possible d&#8217;ins\u00e9rer un espace. Une variable, une constante et un mot-cl\u00e9 de langage n&#8217;ont pas de liens entre eux.<\/p>\n<p>Nous pensions pouvoir faire mieux pour les langages de programmation. Prenons l&#8217;expression Python classique suivante :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">for i in range(<\/mark><\/code><\/p>\n<p>Elle inclut de nombreux \u00e9l\u00e9ments lexicaux diff\u00e9rents, dont deux mots-cl\u00e9s de langage, une variable et une fonction. Pourtant, le programmeur Python (encore d\u00e9butant) en moi pense que <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">for i in range(<\/mark><\/code> devrait \u00eatre une seule entr\u00e9e dans le vocabulaire. Le r\u00e9seau neuronal devrait utiliser une seule it\u00e9ration d&#8217;inf\u00e9rence au lieu de quatre ou cinq pour faire une pr\u00e9diction, afin de pr\u00e9server la capacit\u00e9 de calcul de votre ordinateur portable pour le contenu entre parenth\u00e8ses.<\/p>\n<p>L&#8217;id\u00e9e g\u00e9n\u00e9rale consiste \u00e0 d\u00e9limiter les jetons par des sauts de ligne au lieu d&#8217;\u00e9l\u00e9ments lexicaux. Notre objectif \u00e9tant la saisie semi-automatique <strong>d&#8217;une ligne<\/strong> de code, l&#8217;utilisation de la ligne comme unit\u00e9 de jeton est naturelle.<\/p>\n<p>La taille de notre vocabulaire est limit\u00e9e \u00e0 16 384, une autre puissance de 2 tr\u00e8s pratique. Nous avons initialis\u00e9 le processus avec des caract\u00e8res Unicode couvrant 99,99 % du texte et commenc\u00e9 \u00e0 traiter les r\u00e9f\u00e9rentiels Python avec des licences permissives.<\/p>\n<p>Dans les sections suivantes, vous allez d\u00e9couvrir les 16 384 constructions Python les plus populaires.<\/p>\n<h2>Probl\u00e8mes dans le vocabulaire<\/h2>\n<p>L&#8217;inspection visuelle du vocabulaire a permis d&#8217;identifier quelques probl\u00e8mes syst\u00e9miques. Statistiquement, certaines entr\u00e9es sont pr\u00e9visibles, mais leur inclusion pr\u00e9sente des inconv\u00e9nients.<\/p>\n<h3>La premi\u00e8re surprise : le chinois<\/h3>\n<p>Les 600 jetons environ qui sont apparus apr\u00e8s les octets \u00e9taient principalement des symboles Unicode pour des caract\u00e8res n&#8217;appartenant pas \u00e0 l&#8217;alphabet latin, tels que les caract\u00e8res chinois. Le chinois par lui-m\u00eame \u00e9tait une surprise, mais \u00e0 part cela, la signification des caract\u00e8res semble compr\u00e9hensible.<\/p>\n<p>Par exemple, la premi\u00e8re occurrence est le caract\u00e8re <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">\u7684<\/mark><\/code>. Ce symbole est le plus souvent utilis\u00e9 comme \u00e9quivalent du possessif \u00ab \u2018s \u00bb en anglais. D&#8217;un point de vue statistique, il s&#8217;agit du <a href=\"https:\/\/lingua.mtsu.edu\/chinese-computing\/statistics\/char\/list.php?Which=MO\" target=\"_blank\" rel=\"noopener\">caract\u00e8re chinois le plus fr\u00e9quent<\/a>. Certains \u00e9taient tr\u00e8s utilis\u00e9s dans notre ensemble de donn\u00e9es, mais moins dans le langage lui-m\u00eame. Par exemple, <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">\u6570<\/mark><\/code> et <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">\u7801<\/mark><\/code> se rapportent aux chiffres, tandis que <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">\u7f51<\/mark><\/code> signifie \u00ab r\u00e9seau \u00bb. \u00c9tant donn\u00e9 le contexte de programmation, rien d&#8217;anormal ici. Il nous reste seulement \u00e0 comprendre pourquoi ces symboles sont apparus dans notre vocabulaire.<\/p>\n<p>Les caract\u00e8res non latins, notamment chinois, russes, japonais, cor\u00e9ens et parfois arabes, viennent des cha\u00eenes des docstrings Python. En toute logique, les gens tendent \u00e0 \u00e9crire leur documentation dans leur langue natale.<\/p>\n<p>L&#8217;inclusion de caract\u00e8res n&#8217;appartenant pas \u00e0 l&#8217;alphabet latin dans le vocabulaire comporte probablement plus d&#8217;inconv\u00e9nients que d&#8217;avantages, car ils occupent un espace qui serait mieux utilis\u00e9 par des constructs plus courants du langage de programmation. Avec ces caract\u00e8res, nous avons une meilleure prise en charge des noms de variables Unicode autoris\u00e9s en Python. Cependant, ils sont rarement utilis\u00e9s, et lorsqu&#8217;ils le sont, c&#8217;est principalement pour l&#8217;obfuscation de code.<\/p>\n<h3>La deuxi\u00e8me surprise : l&#8217;indentation<\/h3>\n<p>Une autre chose d\u00e9sagr\u00e9able se produit lorsqu&#8217;on fait une recherche grep des mots-cl\u00e9s souvent utilis\u00e9s en d\u00e9but de ligne dans le vocabulaire, tels que <code>return<\/code>&nbsp;:<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">&nbsp;&nbsp;&nbsp;&nbsp;return<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">            return<\/mark><\/code><\/p>\n<p>(et beaucoup d&#8217;autres occurrences)<\/p>\n<p>Les fragments d&#8217;instruction return utiles apparaissent \u00e9galement avec toutes sortes d&#8217;indentations de d\u00e9but de ligne et on obtient donc plusieurs copies des jetons suivants dans le vocabulaire :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return self.<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return True<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return False<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return 0<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return None<\/mark><\/code><\/p>\n<p>Conserver ces copies peut sembler peu pratique. Lorsque nous appelons la saisie semi-automatique, le caret est rarement au d\u00e9but d&#8217;une ligne. L&#8217;IDE suit l&#8217;indentation et l&#8217;utilisateur sera probablement d\u00e9j\u00e0 au bon emplacement lorsqu&#8217;il commencera \u00e0 saisir return. Par cons\u00e9quent, les instructions return avec des espaces de d\u00e9but de ligne ont peu de chances d&#8217;\u00eatre utilis\u00e9es.<\/p>\n<p>D&#8217;un autre c\u00f4t\u00e9, cela r\u00e9duit la longueur du contexte. Chaque retour indent\u00e9 sera un seul jeton au lieu de plusieurs.<\/p>\n<h3>Instruction d&#8217;importation<\/h3>\n<p>L&#8217;un des autres probl\u00e8mes que nous avons recontr\u00e9s concernait les instructions d&#8217;importation impliquant des frameworks populaires tels que TensorFlow, PyTorch et Django, par exemple :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">from tensorflow.python.framework import ops<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">from django.conf import settings<\/mark><\/code><\/p>\n<p>De telles instructions apparaissent g\u00e9n\u00e9ralement une fois par fichier et sont g\u00e9n\u00e9ralement proches du d\u00e9but. De plus, les m\u00e9canismes de compl\u00e9tion de code et d&#8217;importation automatique classiques peuvent s&#8217;en charger. D&#8217;un autre c\u00f4t\u00e9, encore une fois, cela permet de prendre en compte de plus grands morceaux de code lors de la g\u00e9n\u00e9ration des suggestions de saisie semi-automatique. La question de savoir si ces longues instructions d&#8217;importation sont requises en tant que jetons reste ouverte.<\/p>\n<h3>Examiner les donn\u00e9es<\/h3>\n<p>Le <strong>point \u00e0 retenir<\/strong> dans cette section est probablement l&#8217;importance de l&#8217;inspection visuelle des donn\u00e9es. Les r\u00e9sultats interm\u00e9diaires du traitement statistique des donn\u00e9es et des algorithmes bas\u00e9s sur le machine learning peuvent contenir des probl\u00e8mes syst\u00e9miques non couverts par les tests mais \u00e9vidents pour des experts humains.<\/p>\n<p>L&#8217;association des statistiques et heuristiques est souvent bien meilleure que les statistiques seules.<\/p>\n<h2>Paires de symboles populaires<\/h2>\n<p>En faisant d\u00e9filer la fen\u00eatre vers le bas, nous arrivons aux combinaisons \u00e0 deux symboles. Il s&#8217;agit de comprendre pourquoi elles arrivent en haut de la liste. Certaines proviennent des mots-cl\u00e9s les plus communs du langage, tandis que d&#8217;autres r\u00e9sultent de conventions de nommage et d&#8217;habitudes de programmation.<\/p>\n<p>Savez-vous quelle est la combinaison de deux symboles la plus fr\u00e9quente en Python (apr\u00e8s le double espace blanc, bien s\u00fbr) ? C&#8217;est virgule+espace blanc, comme ceci : <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">, <\/mark><\/code>. Cela fait sens ! Voyons la suite.<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">se<\/mark><\/code> vient principalement de <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">self.<\/mark><\/code> En fait, <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">self.<\/mark><\/code> est la combinaison \u00e0 cinq symboles la plus fr\u00e9quente et l&#8217;un des jetons les plus utilis\u00e9s. Il est plus fr\u00e9quent que la plupart des s\u00e9quences \u00e0 deux et trois symboles, sauf celles qu&#8217;il contient.<br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">in<\/mark><\/code> Youpi&nbsp;! <code>for i in range(<\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">re<\/mark><\/code> vient principalement de <code>return<\/code>.<br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">on<\/mark><\/code> est un cas int\u00e9ressant. La plupart de nos noms de variables, de champs, et m\u00eame de classes, se terminent par \u00ab tion \u00bb, \u00ab cion \u00bb ou \u00ab sion \u00bb. \u00ab None \u00bb et \u00ab json \u00bb sont deux autres contributeurs importants.<br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">te<\/mark><\/code> semble myst\u00e9rieux au premier abord, mais une \u00e9tude plus approfondie du vocabulaire r\u00e9v\u00e8le l&#8217;abondance du mot \u00ab test \u00bb sous diff\u00e9rentes formes. Des mots tels que \u00ab date \u00bb, \u00ab text \u00bb, \u00ab state \u00bb, \u00ab write \u00bb et l&#8217;omnipr\u00e9sent \u00ab items \u00bb contribuent \u00e9galement \u00e0 la fr\u00e9quence de ce jeton.<br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">= <\/mark><\/code>&nbsp;doit \u00eatre vraiment tr\u00e8s populaire. Si l&#8217;on change l&#8217;ordre, <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\"> =<\/mark><\/code> n&#8217;est pas si fr\u00e9quent. La diff\u00e9rence ne peut pas \u00eatre inf\u00e9rieure au nombre d&#8217;op\u00e9rateurs !=.<br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">or<\/mark><\/code> vient g\u00e9n\u00e9ralement de mots-cl\u00e9s tr\u00e8s utilis\u00e9s dans le langage, tels que <code>or<\/code>, <code>for<\/code> et <code>import<\/code>.<\/p>\n<h2>Combinaisons de symboles complexes<\/h2>\n<h3>Jetons ignorant les limites<\/h3>\n<p>Deux jetons fr\u00e9quents, <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">s[<\/mark><\/code>&nbsp; et <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">s.append(<\/mark><\/code> sont particuli\u00e8rement repr\u00e9sentatifs du travail avec les listes en Python. Nous utilisons g\u00e9n\u00e9ralement des noms de liste au pluriel : jours, marchandises, articles, lignes. Ces jetons illustrent la puissance des statistiques : ils s&#8217;affranchissent des limites des \u00e9l\u00e9ments lexicaux de Python pour exprimer la fa\u00e7on dont nous parlons anglais dans le code.<\/p>\n<h3>Range<\/h3>\n<p>Revenons \u00e0 range, \u00e9voqu\u00e9 lorsque nous avons pr\u00e9sent\u00e9 les jetons de ligne compl\u00e8te. A-t-elle \u00e9t\u00e9 int\u00e9gr\u00e9e dans le vocabulaire ? En effet, elle est bien visible :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">for i in range(<\/mark><\/code><\/p>\n<p>De plus, il y a une instruction encore plus longue qui est fr\u00e9quente :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">for i in range(len(<\/mark><\/code><\/p>\n<p>Signalons au passage que i est le seul nom de compteur qui soit utilis\u00e9 assez souvent. Les autres, tels que j et k sont peu utilis\u00e9s.<\/p>\n<h3>Instructions Return<\/h3>\n<p>Qu&#8217;est-ce que les programmeurs utilisent comme r\u00e9sultats de leurs fonctions ? Il n&#8217;y a pas de surprise concernant la fr\u00e9quence d&#8217;utilisation de :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return False<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return True<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return None<\/mark><\/code><\/p>\n<p>Leur fr\u00e9quence d&#8217;utilisation est assez semblable, mais elles arrivent toutes derri\u00e8re <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return self<\/mark><\/code>. <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return 0<\/mark><\/code> est un autre exemple de jeton couramment utilis\u00e9. Les gens n&#8217;utilisent pas 1, 2 ou tout autre chiffre assez souvent pour qu&#8217;ils soient visibles dans les statistiques. Autres choses curieuses :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return []<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return super(<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return data<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return value<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return not<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return len(self.<\/mark><\/code><\/p>\n<p>Le dernier jeton est obtenu en combinant <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">return<\/mark><\/code>&nbsp;et <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">len(self.<\/mark><\/code>, car <code>return len(<\/code> ne figure pas dans le vocabulaire.<\/p>\n<h3>Classes<\/h3>\n<p>Existe-t-il des combinaisons avec le mot class suffisamment populaires pour faire partie des 16&nbsp;384 \u00e9l\u00e9ments du vocabulaire&nbsp;? La combinaison qui arrive en t\u00eate, et de loin, est <code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">class Test<\/mark><\/code>. Elle est suivie par deux autres combinaisons, qui arrivent loin derri\u00e8re :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">class Meta:<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">class Base<\/mark><\/code><\/p>\n<p>Les autres jetons significatifs incluant <code>class<\/code> n&#8217;ont pas de lien avec les noms de classes :<\/p>\n<p><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">classifier<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">classification<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">issubclass(<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">@classmethod<\/mark><\/code><br><code><mark class=\"has-inline-color\" style=\"background-color: #fcb900;\">Base class for<\/mark><\/code><\/p>\n<p>Les deux derniers viennent de la documentation.<\/p>\n<h2>Synth\u00e8se<\/h2>\n<p>Le r\u00e9seau neuronal utilise le vocabulaire pour repr\u00e9senter le programme d&#8217;entr\u00e9e et construire les suggestions. La repr\u00e9sentation du programme est disponible d\u00e8s maintenant et les algorithmes de g\u00e9n\u00e9ration de code feront l&#8217;objet de prochains articles.<\/p>\n<p>Si nous prenons un fragment simple de code Python et ex\u00e9cutons le g\u00e9n\u00e9rateur de jetons (tokenizer), nous pouvons le voir de la m\u00eame fa\u00e7on que le r\u00e9seau neuronal le voit :<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-234590\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/03\/tokenized.png\" alt=\"Cette image montre trois lignes de code Python. Ces lignes sont segment\u00e9es en 15 jetons.\" width=\"1729\" height=\"380\"><\/figure>\n<p>Le g\u00e9n\u00e9rateur de jetons transforme ces 3 lignes en 15 jetons. Les mod\u00e8les bas\u00e9s sur GPT-2 peuvent avoir jusqu&#8217;\u00e0 1 024 \u00e9l\u00e9ments ; notre limite d&#8217;utilisation est de 384. Dans notre ensemble de donn\u00e9es d&#8217;apprentissage, la longueur m\u00e9diane d&#8217;une ligne est de 10 jetons, ce qui est un peu plus long que dans l&#8217;exemple ci-dessus. Nous pouvons estimer que le mod\u00e8le utilise un peu moins de 40 lignes de contexte pour g\u00e9n\u00e9rer les pr\u00e9dictions.<\/p>\n<p>Cet exemple montre \u00e9galement \u00e0 quel point le \u00ab mode de pens\u00e9e \u00bb du r\u00e9seau neuronal et celui de l&#8217;humain sont diff\u00e9rents. Nous comprenons que <code>args<\/code> repr\u00e9sente la m\u00eame chose dans les deux premi\u00e8res lignes. Cependant, l&#8217;algorithme les voit diff\u00e9remment, il fractionne m\u00eame la deuxi\u00e8me ligne.<\/p>\n<h2>Essayez le plugin de saisie semi-automatique de ligne de code pour Python<\/h2>\n<p>Parcourir et d\u00e9velopper le vocabulaire ont fait partie des \u00e9tapes pour atteindre nos objectifs en termes d&#8217;offre produit. Nous pr\u00e9voyons de proposer davantage d&#8217;articles techniques sur la fa\u00e7on dont le r\u00e9seau neuronal g\u00e9n\u00e8re du code et comment adapter ses performances aux capacit\u00e9s des ordinateurs portables des utilisateurs.<\/p>\n<p>En attendant, nous vous invitons \u00e0 essayer le fruit de notre travail, le plugin de saisie semi-automatique compl\u00e8te de ligne de code pour Python&nbsp;:<\/p>\n<p><a href=\"https:\/\/plugins.jetbrains.com\/plugin\/14823-full-line-code-completion\" target=\"_blank\" rel=\"noopener\">https:\/\/plugins.jetbrains.com\/plugin\/14823-full-line-code-completion<\/a><\/p>\n\n\n<p><em>Auteur de l&#8217;article original en anglais<\/em> :<\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":234732,"comment_status":"closed","ping_status":"closed","template":"","categories":[623,5108],"tags":[603,3252],"cross-post-tag":[6951,6419],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/blog\/245632"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=245632"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/blog\/245632\/revisions"}],"predecessor-version":[{"id":245648,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/blog\/245632\/revisions\/245648"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/234732"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=245632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=245632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=245632"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=245632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}