2009-08-29 3 views
2

Supposons que vous ayez un référentiel de 10 000 noms de fonctions et éventuellement leur fréquence d'utilisation dans un corpus de code qui peut être en C/C#/C++. (Ils ont différentes conventions habituellement prescrits)Comment prévoir si le nom de la fonction suit la convention

Certains échantillons peuvent être:

DoPaint 
OnPaint 
CloseWindow 
DeleteGraphOnClose 
FreeConnection 
ConnectInternat (smallTypo, but part of code) 
FreeSoH 

maintenant donné un nom de fonction, comment peut-on prédire si le nom suit la convention de Human Generated Nom?

Remarque:

  1. Il est évident que tous les noms de candidats seront des noms valides
  2. noms générés peuvent avoir des caractères arbitraires et seront traités comme des mauvais
  3. cas de lettre peuvent se brouillées jusqu'à

Quelques candidats:

Z090292 - not likely 
onDelete - likely 
CloseWindow - likely 
iGetIndex - unlikely 

Les pointeurs sur technique et logiciel sont les bienvenus

+0

Notez également que je suis principalement intéressé par la probabilité du nom, pas si elles existent vraiment, qui peut être la plupart du temps trouvé à l'aide des outils d'analyse de code –

Répondre

1

diviser les identifiants en mots (sur la base individuelle de ceux de capitalisation), et mettre les mots dans un correcteur orthographique (comme ispell). Considérez tous les mots dont les fautes d'orthographe ne sont pas d'origine humaine, ainsi que les identificateurs dans lesquels ils se produisent.

+0

En particulier pour les noms techniques comme StartTeredoTunnelling la plupart des mots pourraient se battant pavillon aussi mauvais. –

0

Prédire si c'est une génération humaine est une question très délicate. L'analyse de la base de code pour trouver les noms de fonctions est plus facile - vous pouvez regarder des outils tels que NDepend.

0

Vous pouvez probablement détecter camelcase. En outre, vous pouvez effectuer une recherche regex pour des mots typiques tels que: faire, obtenir, définir, entrer, etc avant le prochain mot en majuscule.

1

Un de mes amis pourrait vous aider. Il fait un doctorat sur ce même sujet, pour autant que je sache.

Home page

2

Vous pouvez essayer une analyse bayésienne mener sur le texte:

  1. charge la liste des noms (et leurs fréquences) dans votre programme. Cela pourrait valoir la peine d'indiquer les noms à ce stade. Ainsi, par exemple CloseWindow devient Close et Window, avec la fréquence des deux incrémentée. À ce stade, il serait également utile de charger certains noms de fonctions non humaines pour former le programme en natifs également.
  2. Prenez un nom de fonction, et en utilisant les données que vous venez recueillies trouver la probabilité de chaque partie à venir

    P ((HumanGenerated | Voir le jeton) = P (Voir le jeton | origine humaine) * P (Humangenerated))/P (Voir le jeton)

Dans ce cas, la probabilité de quelque chose d'être humain ou généré par ordinateur serait décidée en fonction des connaissances connues à savoir quel est le pourcentage de noms de fonction sont pensés pour être origine humaine.

La probabilité de voir le jeton (P (Seeing the Token)) devrait évoluer progressivement. Il s'agirait du nombre de fois que le jeton est vu dans les fonctions humaines et le nombre de fois qu'il est vu dans les fonctions informatiques ... cette solution est basée sur la prémisse que le programme apprend avec le temps (et doit donc être formé)

le résultat, P ((HumanGenerated | Voir le jeton), vous donnera une probabilité du nom de fonction étant généré par un humain

NB: Ceci est seulement une esquisse, de nombreux détails sont. Si vous êtes intéressé par cette ligne de recherche, je vous suggérerais de lire la théorie des probabilités et en particulier l'analyse bayésienne

+0

Je vois ce que vous suggérez, similaire à la détection de spam, excellente idée –

0

En plus d'utiliser un dictionnaire comme Martin V. Lowes suggéré est un bon, mais vous devez vous rappeler de tenir compte aussi pour les formes communes de variables suivantes:

  1. noms de variables d'une seule lettre.
  2. Noms de variables qui utilisent des traits de soulignement au lieu de chameau.
  3. Metasyntactic variables.
  4. Hungarian notation.
  5. Mots-clés/types avec un caractère attaché (à savoir $return ou list_).
Questions connexes