GMail dispose de cette fonctionnalité dans laquelle il vous avertira si vous essayez d'envoyer un e-mail qu'il pense avoir une pièce jointe.
Comme GMail a détecté la chaîne see the attached
dans l'e-mail, mais pas de pièce jointe, il m'a averti par une boîte de dialogue OK / Annuler lorsque je clique sur le bouton Envoyer.
Nous avons un problème connexe sur Stack Overflow. C'est-à-dire que lorsqu'un utilisateur entre un message comme celui-ci :
mon problème est que je dois changer la base de données mais je ne veux pas créer une nouvelle connexion. exemple: DataSet dsMasterInfo = new DataSet (); Database db = DatabaseFactory.CreateDatabase ("ConnectionString"); DbCommand dbCommand = db.GetStoredProcCommand ("uspGetMasterName");
Cet utilisateur n'a pas formaté son code en tant que code!
C'est-à-dire qu'ils n'ont pas indenté de 4 espaces par Markdown, ni utilisé le bouton de code (ou le raccourci clavier ctrl+ k) qui le fait pour eux.
Ainsi, notre système accepte de nombreuses modifications dans lesquelles les utilisateurs doivent entrer et formater le code manuellement pour les utilisateurs qui sont en quelque sorte incapables de le comprendre. Cela conduit à beaucoup de mal au ventre . Nous avons amélioré l'aide de l'éditeur à plusieurs reprises, mais nous ne savons pas quoi faire ensuite, à moins de nous rendre chez l'utilisateur et d'appuyer sur les boutons appropriés de son clavier.
C'est pourquoi nous envisageons un avertissement de style Google GMail:
Vouliez-vous dire poster du code?
Vous avez écrit des éléments qui ressemblent à du code, mais vous ne les avez pas formatés en indentant 4 espaces, à l'aide du bouton de code de la barre d'outils ou de la commande de formatage du code ctrl+ k.
Cependant, pour présenter cet avertissement, nous devons détecter la présence de code que nous pensons être du code non formaté dans une question . Qu'est-ce qu'un moyen simple et semi-fiable de faire cela?
- Dans Markdown , le code est toujours mis en retrait par 4 espaces ou par des backticks, ainsi tout élément correctement formaté peut être immédiatement ignoré de la vérification.
- Ceci n'est qu'un avertissement et ne s'appliquera qu'aux utilisateurs peu réputés posant leurs premières questions (ou fournissant leurs premières réponses), de sorte que certains faux positifs sont acceptables, à condition qu'ils ne dépassent pas 5%.
- Les questions sur le dépassement de capacité peuvent être dans toutes les langues, bien que nous puissions de manière réaliste limiter notre contrôle aux, disons, les «dix langues les plus importantes». Selon la page des balises, C #, Java, PHP, JavaScript, Objective-C, C, C ++, Python, Ruby.
- Utilisez le dump de données creative commons de Stack Overflow pour auditer votre solution potentielle (ou choisissez simplement quelques questions dans les 10 balises les plus importantes de Stack Overflow) et voyez comment cela se passe.
- Le pseudo-code convient, mais nous utilisons c # si vous voulez être très amical.
- Le plus simple sera le mieux (tant que cela fonctionne). BAISER! Si votre solution nécessite que nous essayions de compiler des messages dans 10 compilateurs différents, ou une armée de personnes pour entraîner manuellement un moteur d'inférence bayésien, ce n'est… pas exactement ce que nous avions en tête.
la source
Réponses:
Une solution appropriée consisterait probablement en un modèle savant / statistique, mais voici quelques idées amusantes:
myFunc()
foo.bar = ptr->val
while (true) { bar[i]; }
/* multi-line comment */
+, *, &, &&, |, ||, <, >, ==, !=, >=, <=, >>, <<, ::, __
Vous pouvez suivre le nombre de fois où chacun de ces éléments apparaît et les utiliser dans un algorithme d'apprentissage automatique comme Perceptron , comme le fait SpamAssassin.
la source
SELECT DISTINCT name FROM people WHERE id IS NOT NULL
.Je serais curieux de voir quelles sont les mesures moyennes de l’anglais écrit d’un côté et du code de l’autre.
Peut-être que cela seul pourrait déjà faire la différence entre le code et le reste. Au moins, je pense que le code, quelle que soit la langue, montrerait des métriques sensiblement différentes dans de nombreux cas.
La bonne nouvelle est que vous disposez déjà de nombreuses données pour construire vos statistiques.
Ok, je suis de retour avec quelques données pour étayer mes hypothèses. :-)
Je l' ai fait un test rapide et sale sur votre poste et sur le premier post j'ai trouvé sur StackOverflow , avec un outil assez avancé:
wc
.Voici ce que j'ai eu après avoir exécuté
wc
la partie texte et la partie code de ces deux exemples:Regardons d'abord la partie anglaise :
Assez similaire, vous ne pensez pas?
Regardons maintenant la partie code !
Vous voyez à quel point ces métriques ne sont pas si différentes, mais plus important encore, à quel point elles sont différentes des métriques anglaises? Et ceci utilise simplement un outil limité. Je suis maintenant sûr que vous pouvez obtenir quelque chose de vraiment précis en mesurant plus de mesures (je pense en particulier aux statistiques sur les caractères).
Je peux haz cookie?
la source
En règle générale, les chaînes de Markov sont utilisées pour générer du texte, mais elles peuvent également être utilisées pour prédire la similarité du texte (d' après CE, Shannon 1950 ) avec un modèle formé. Je recommande plusieurs chaînes de Markov.
Pour chaque langue prévalente, formez une chaîne de Markov sur un grand échantillon de code représentatif de la langue. Ensuite, pour un poste de débordement de pile pour lequel vous souhaitez détecter du code, procédez comme suit pour chacune des chaînes:
Pour chaque ligne, vous devez avoir une valeur réelle et la plus haute. Divisez ACTUAL par HIGHEST. Cela vous donnera le score de remise en forme quant à savoir si une ligne particulière est un code source. Cela associerait un numéro à chacune des lignes de l'exemple que vous avez donné:
Enfin, vous devrez sélectionner un seuil pour déterminer quand il y a du code dans le message. Cela pourrait simplement être un nombre sélectionné par l'observation qui donne de hautes performances. Il pourrait également prendre en compte le nombre de lignes avec un score élevé.
Entraînement
Pour vous entraîner, procurez-vous un grand échantillon représentatif de code dans la langue. Ecrivez un programme à lire en boucle sur le texte du code et associez chaque N-gramme du fichier (la plage de N doit être paramétrée) à la fréquence statistique du caractère suivant. Cela donnera plusieurs états possibles des caractères qui suivent le bigramme, chacun associé à une probabilité. Par exemple, bigram "()" pourrait avoir les probabilités de caractère suivantes:
La première doit être lue, par exemple, comme suit: "La probabilité qu'un point-virgule suive une parenthèse vide est de 0.5."
Pour la formation, je recommande N-grammes de taille deux à cinq. Lorsque j'ai fait des recherches à ce sujet , nous avons constaté que les tailles N-grammes deux à cinq fonctionnaient bien pour l'anglais. Étant donné que le code source est en grande partie en anglais, je suggérerais de commencer par cette plage, puis de procéder à un ajustement pour trouver les valeurs de paramètre optimales à mesure que vous trouvez ce qui fonctionne.
Une mise en garde: le modèle va être affecté par des identifiants, des noms de méthodes, des espaces, etc. Par exemple, vous pouvez réduire tous les espaces inutiles. La présence d'espaces dans l'entrée (la publication Stack Overflow) peut également être ignorée. Vous pouvez également ignorer la casse alphabétique, ce qui serait plus résilient face aux différentes conventions de dénomination des identifiants.
Au cours de mes recherches , nous avons constaté que nos méthodes fonctionnaient bien pour l'espagnol et l'anglais. Je ne vois pas pourquoi cela ne fonctionnerait pas aussi bien pour le code source. Le code source est encore plus structuré et prévisible que le langage humain.
la source
Puis-je suggérer une approche radicalement différente? Sur SO, la seule langue humaine autorisée est l'anglais, de sorte que tout ce qui n'est pas anglais a 99,9% de chances d'être un extrait de code .
Ma solution serait donc la suivante: utilisez l’un des nombreux vérificateurs de la langue anglaise (assurez-vous simplement qu’ils signalent également, outre les fautes d’orthographe, des erreurs de syntaxe telles que les doubles points ou les symboles non linguistiques tels que
#
ou~
). Ensuite, toute ligne / paragraphe générant une grande quantité d’erreurs et d’avertissements devrait déclencher le message "is this code?" question.Cette approche peut également être adaptée pour les sites StackExchange utilisant des langues autres que l'anglais, bien sûr.
Juste mes 2 ¢ ...
la source
Je vais probablement obtenir quelques votes négatifs pour cela, mais je pense que vous abordez cette question sous un mauvais angle.
Cette ligne m'a eu:
OMI, ce point de vue est un peu arrogant. Je trouve cela souvent dans la conception de logiciels, où les programmeurs et les concepteurs sont ennuyés par les utilisateurs qui ne savent pas comment utiliser le logiciel correctement, alors que le problème n'est pas l'utilisateur mais le logiciel lui-même - ou l'interface utilisateur du moins.
La cause première de ce problème n'est pas l'utilisateur mais le fait qu'il ne leur est pas évident de pouvoir le faire.
Que diriez-vous d'un changement dans l'interface utilisateur pour rendre cela plus évident? Ce sera sûrement:
Exemple:
la source
{}
bouton autour de la zone de texte pourrait être suffisant.Le pseudo-code constituerait un véritable défi car tout langage de programmation dépend de caractères spéciaux tels que '[]', ';', '(') ', etc. Il suffit de compter l'occurrence de ces caractères spéciaux. Tout comme vous détecteriez un fichier binaire (plus de 5% d'un échantillon contient la valeur d'octet 0).
la source
Je pense que vous devrez peut-être cibler cela uniquement sur des langues spécifiques. En général, le problème est probablement insoluble, car vous pouvez obtenir des langues assez similaires à l'anglais (par exemple, inform7 ). mais heureusement, les plus utilisés pourraient être couverts assez facilement.
La première chose que je ferais serait de rechercher la séquence "; \ n" qui vous conviendrait parfaitement pour C, C ++, Java, C # et tout autre langage utilisant une syntaxe similaire et très simple. Il est également moins susceptible d’être utilisé en anglais qu’un; sans nouvelle ligne
la source
Quelqu'un a mentionné regarder les balises, puis la syntaxe, mais cela a été éliminé parce que cela s'adresse aux nouveaux utilisateurs.
Une meilleure solution possible consisterait à rechercher des noms de langue dans le corps de la question, puis à appliquer la même stratégie. Si je mentionne "Javascript", "Java" ou "C #", il y a de fortes chances que ce soit le propos de la question et que le code de la question soit susceptible d'être rédigé dans ce langage.
la source
Tout d’abord, vérifiez le correcteur orthographique, il trouvera très peu de mots anglais corrects, mais il devrait y avoir beaucoup de mots que le vérificateur orthographique suggérera de scinder.
Ensuite, il y a des signes de ponctuation / spéciaux non typiques de l'anglais ordinaire, typiques du code:
something();
ne peut tout simplement pas être un anglais simple;$something
oùsomething
n'est pas tout numérique;->
entre les mots sans espaces;.
entre les mots sans espace;Bien sûr, pour que cela fonctionne bien, vous pouvez avoir un classificateur bayésien construit sur ces caractéristiques.
la source
il existe plusieurs ensembles de langages qui partagent une syntaxe similaire. la plupart des langages ont été influencés par quelques langages, donc les langages [AMPL, AWK, csh, C ++, C--, C #, Objective-C, BitC, D, Go, Java, JavaScript, Limbo, LPC, Perl, PHP, Pike, Processing [ont tous été influencés par C, donc si vous détectez C, vous détecterez probablement toutes ces langues. il vous suffit donc d'écrire un modèle simple pour détecter ces ensembles de langues.
Je voudrais également diviser le texte en blocs, car la plupart du code sera divisé en deux nouvelles lignes ou similaire aux autres blocs de texte de l'article.
cela peut être facile à faire avec javascript (un échantillon incomplet très simple pour la famille c):
la source
Comptez simplement les mots / caractères de ponctuation pour chaque ligne. Anglais aura tendance à avoir 4 ou plus, code moins de 2.
Le paragraphe ci-dessus contient 18 mots et 4 caractères de ponctuation, par exemple. Ce paragraphe contient 19 mots et 4 signes de ponctuation, donc à la hauteur des attentes.
Bien sûr, cela devrait être testé par rapport aux questions des débutants dont la langue maternelle est l'anglais médiocre, et il se peut que dans ces cas, les statistiques soient faussées.
Je m'attends à ce que [non-espace]. [Espace ou nouvelle ligne] soit très rare dans le code, mais courant en anglais, donc cela pourrait être compté comme des mots, pas de ponctuation.
Je pense que le plus gros problème sera le code en ligne, où quelqu'un posera une question comme celle-ci:
C'est du code et de l'anglais, et devrait être marqué comme avec des ticks arrière:
la source
Je pense que vous devriez d’abord faire une distinction entre le code (suffisamment) formaté qui n’a besoin que d’être réellement désigné comme tel et le code (trop) mal formaté, qui nécessite de toute façon un formatage manuel.
Le code formaté a des lignes de séparation et une indentation. C'est-à-dire que si une ligne est précédée d'une seule ligne de séparation, vous avez un bon candidat. S'il y a des espaces blancs de tête en plus, vous avez un très bon candidat.
Le texte normal utilise deux lignes de séparation ou deux espaces et une ligne de séparation pour la mise en forme. Il existe donc un critère de distinction clair.
Dans le code LISP, vous ne trouverez pas de point-virgule, dans le code Ruby, vous ne trouverez peut-être pas de parenthèse, dans le pseudo-code, vous ne trouverez peut-être pas grand-chose du tout. Mais dans n'importe quelle langue (non-ésotérique), vous trouverez un code correct à mettre en forme avec des lignes de séparation et une indentation. Il n'y a rien d'aussi universel que ça. En fin de compte, le code est écrit pour être lu par des humains.
Alors, commencez par rechercher des lignes de code potentielles . En outre, les lignes de code sont généralement regroupées. Si vous en avez un, il y a de fortes chances que celui en haut ou en bas soit également une ligne de code.
Une fois que vous avez sélectionné des lignes de code potentielles, vous pouvez les comparer à des critères quantifiables et choisir un seuil :
De plus, maintenant qu'il y a des programmeurs et des cs, la portée de stackoverflow est clairement réduite. On pourrait envisager de désigner toutes les étiquettes de langue comme des langues. Et lors de la publication, il vous sera demandé de choisir au moins une étiquette de langue, de choisir l'
language-agnostic
étiquette ou de l'omettre explicitement.Dans le premier cas, vous savez quelles langues rechercher, dans le second, vous pouvez rechercher du pseudo-code et dans le dernier cas, il n'y aura probablement pas de code, car il s'agit d'une question de technologie ou cadre ou tel.
la source
Vous pouvez créer un analyseur pour chaque langue que vous souhaitez détecter (les définitions de langue pour ANTLR sont généralement faciles à trouver), puis exécuter chaque ligne de la question dans chaque analyseur. Si une ligne est correctement analysée, vous avez probablement du code.
Le problème, c’est que certaines phrases anglaises (langage naturel) peuvent être analysées sous forme de code. Par conséquent, vous pouvez également inclure certaines des autres idées ou limiter les résultats positifs uniquement si plus d’une ou deux lignes consécutives s’analysent correctement avec le même analyseur de langage.
L’autre problème potentiel est que cela ne détectera probablement pas le pseudocode, mais c’est possible.
la source
Ce qui est peut-être le plus sûr pour l'avenir et qui nécessite le moins d'ajustement manuel à long terme, à mesure que d'autres langages (qui ont un aspect quelque peu différent des langages de programmation utilisés actuellement) deviennent plus populaires et que les langages actuellement utilisés deviennent moins populaires, c'est à faire quelque chose comme ce que fait Google Translate (voir le paragraphe "Comment ça marche?"), au lieu de chercher certaines choses comme ab et a (), etc.
En d'autres termes, au lieu de penser manuellement aux motifs à rechercher dans le code, l'ordinateur peut le résoudre lui-même . Cela peut être fait en ayant
beaucoup de code dans de nombreux langages de programmation
Suggestion: prélevez automatiquement des échantillons de code dans des référentiels de code source basés sur le Web, tels que Google Code ou Github, ou même dans des éléments de Stackoverflow déjà marqués comme code.
Remarque: il peut être judicieux d’analyser les commentaires de code.
beaucoup de texte anglais tiré d'articles sur le web
et avoir un certain type d'algorithme trouve automatiquement dans le code des modèles qui ne sont pas en anglais, et inversement, et utilise ces modèles pour détecter ce qui est du code et ce qui n'est pas du code en exécutant l'algorithme sur des publications.
(Cependant, je ne suis pas sûr de savoir comment fonctionnerait un tel algorithme. D'autres réponses à la question actuelle pourraient contenir des informations utiles à cet égard.)
Ensuite, le système peut ré-analyser le code de temps en temps pour prendre en compte les modifications apportées à la façon dont le code apparaît à cet instant précis.
la source