125 votes

Détecter le langage de programmation à partir d'un extrait de texte

Quel serait le meilleur moyen de détecter le langage de programmation utilisé dans un extrait de code ?

1 votes

Il existe pratiquement un nombre infini de langues... voulez-vous en détecter une seule ? Ou est-ce qu'on parle seulement des langues les plus populaires ?

0 votes

Seulement les plus populaires (C/C++, C#, Java, Pascal, Python, VB.NET. PHP, JavaScript et peut-être Haskell).

13 votes

Haskell ne doit pas être populaire puisque je n'en ai jamais entendu parler ;-)

0voto

neurite Points 546

Intéressant. J'ai une tâche similaire pour reconnaître du texte dans différents formats. YAML, JSON, XML ou propriétés Java ? Même avec des erreurs de syntaxe, par exemple, je devrais pouvoir distinguer JSON de XML en toute confiance.

Je pense que la façon dont nous modélisons le problème est essentielle. Comme l'a dit Mark, la tokénisation d'un seul mot est nécessaire mais probablement pas suffisante. Nous aurons besoin de bigrammes, voire de trigrammes. Mais je pense que nous pouvons aller plus loin, sachant que nous nous intéressons aux langages de programmation. Je remarque que presque tous les langages de programmation ont deux types uniques de jetons -- symboles y mots-clés . Les symboles sont relativement faciles à reconnaître (certains symboles peuvent être des littéraux ne faisant pas partie de la langue). Ensuite, les bigrammes ou les trigrammes de symboles détecteront les structures syntaxiques uniques autour des symboles. Les mots-clés sont une autre cible facile si l'ensemble d'apprentissage est suffisamment grand et diversifié. Une caractéristique utile pourrait être les bigrammes autour des mots-clés possibles. Un autre type de jeton intéressant est espace blanc . En fait, si nous procédons à la tokénisation habituelle par espace blanc, nous perdrons cette information. Je dirais que, pour analyser les langages de programmation, nous conservons les espaces blancs car ils peuvent apporter des informations utiles sur la structure syntaxique.

Enfin, si je choisis un classificateur comme la forêt aléatoire, je vais parcourir github et rassembler tous les codes sources publics. La plupart des fichiers de code source peuvent être étiquetés par le suffixe du fichier. Pour chaque fichier, je le diviserai aléatoirement aux lignes vides en fragments de différentes tailles. Je vais ensuite extraire les caractéristiques et former le classificateur en utilisant les extraits étiquetés. Une fois l'entraînement terminé, le classificateur peut être testé pour la précision et le rappel.

-1voto

William Lee Points 93

Je pense qu'il n'existe pas de solution unique permettant d'identifier la langue d'un extrait, sur la seule base de cet extrait. Prenons le mot-clé print . Il peut apparaître dans un nombre illimité de langues, chacune d'entre elles ayant des objectifs différents et une syntaxe différente.

J'ai quelques conseils. Je suis en train d'écrire un petit morceau de code pour mon site Web qui peut être utilisé pour identifier les langages de programmation. Comme la plupart des autres postes, il pourrait y avoir une enorme de langages de programmation que vous n'avez tout simplement pas entendus, vous ne pouvez pas tous les prendre en compte.

Ce que j'ai fait, c'est que chaque langue peut être identifiée par une sélection de mots-clés. Par exemple, Python peut être identifié de plusieurs façons. C'est probablement plus facile si vous choisissez des "traits" qui sont aussi certainement uniques à la langue. Pour Python, j'ai choisi l'utilisation des deux-points pour commencer un ensemble d'instructions, ce qui, je pense, est un trait assez unique (corrigez-moi si je me trompe).

Si, dans mon exemple, vous ne trouvez pas de deux-points pour commencer un jeu d'énoncés, passez à un autre trait possible, disons en utilisant la fonction def pour définir une fonction. Cela peut poser quelques problèmes, car Ruby utilise également le mot-clé def pour définir une fonction. La clé pour distinguer les deux (Python et Ruby) est d'utiliser différents niveaux de filtrage pour obtenir la meilleure correspondance. Ruby utilise le mot-clé end pour terminer une fonction, alors que Python n'a rien pour terminer une fonction, juste une désindentation mais vous ne voulez pas aller là. Mais encore une fois, end pourrait aussi être Lua, un autre langage de programmation à ajouter au mélange.

Vous pouvez constater que les langages de programmation se superposent tout simplement trop. Un mot clé qui pourrait être un mot clé dans un langage pourrait se trouver être un mot clé dans un autre langage. En utilisant une combinaison de mots-clés qui vont souvent ensemble, comme le mot-clé Java public static void main(String[] args) permet d'éliminer ces problèmes.

Comme je l'ai déjà dit, votre meilleure chance est de rechercher des mots-clés ou des ensembles de mots-clés relativement uniques pour vous distinguer les uns des autres. Et, si vous vous trompez, au moins vous aurez essayé.

-1voto

Rakesh Points 1

Configurez le brouilleur aléatoire comme suit

matrix S = matrix(GF(2),k,[random()<0.5for _ in range(k^2)]); while (rank(S) < k) : S[floor(k*random()),floor(k*random())] +=1;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X