Data mining 如何预测函数名是否遵循约定

Data mining 如何预测函数名是否遵循约定,data-mining,text-mining,Data Mining,Text Mining,假设您有一个包含10000个函数名的存储库,以及它们在C/C#/C++中的代码库中的使用频率。(它们通常有不同的约定) 有些样品可能是: DoPaint OnPaint CloseWindow DeleteGraphOnClose FreeConnection ConnectInternat (smallTypo, but part of code) FreeSoH 现在给定一个函数名,我们如何预测该名称是否符合人工生成名称的约定 注: 显然,所有候选名称都是有效名称 生成的名称可以具有任意

假设您有一个包含10000个函数名的存储库,以及它们在C/C#/C++中的代码库中的使用频率。(它们通常有不同的约定)

有些样品可能是:

DoPaint
OnPaint
CloseWindow
DeleteGraphOnClose
FreeConnection
ConnectInternat (smallTypo, but part of code)
FreeSoH 
现在给定一个函数名,我们如何预测该名称是否符合人工生成名称的约定

注:

  • 显然,所有候选名称都是有效名称
  • 生成的名称可以具有任意字符,并将被视为坏名称
  • 信件箱可能会弄乱
  • 一些候选人:

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

    欢迎使用技术软件上的任何指针

    将标识符拆分为单独的单词(基于大写),并将单词放入拼写检查器(例如)。把所有拼写错误的单词看成是非人类生成的,以及它们出现的标识符。

    预测它是否是人类生成的,这是一个非常棘手的问题。分析代码库以查找函数名更容易-您可以查看工具,例如。

    您可能可以检测camelcase。此外,您还可以在下一个大写单词之前对典型单词进行正则表达式搜索,如:do、get、set、in等。

    我的一位朋友可能会有所帮助。据我所知,他正在攻读这门学科的博士学位


    您可以尝试对文本进行一些贝叶斯分析:

  • 将姓名列表(及其频率)加载到程序中。在这一点上,标记这些名称可能是值得的。例如,CloseWindow变为Close和Window,两者的频率都增加。在这一点上,加载一些非人工函数名来训练Nagative中的程序也是很有用的
  • 取一个函数名,使用刚刚收集的数据,找出每个部分出现的概率

    p((人工生成|查看令牌)=p(查看令牌|人工生成)*p(人工生成))/p(查看令牌)

  • 在这种情况下,将根据已知的知识确定人为或计算机生成的可能性,即认为人为生成的函数名的百分比

    看到令牌的概率(p(看到令牌))必须逐渐演变。它将包括令牌在人类功能中出现的次数和它在计算机功能中出现的次数……该解决方案的前提是程序随着时间的推移而学习(因此需要进行培训)

    结果p((HumanGenerated |看到标记)将给出函数名由人生成的概率


    NB:这只是一个粗略的轮廓,很多细节都没有。如果你对这一系列的调查感兴趣,我建议你阅读概率论,特别是贝叶斯分析,除了使用马丁·洛斯建议的字典之外,这是一本不错的字典,但你还必须记住t表示以下常见形式的变量:

  • 单字母变量名
  • 使用下划线而不是大小写的变量名
  • 附加字符的关键字/类型(即
    $return
    列表

  • 还要注意的是,我最感兴趣的是名称的可能性,而不是它们是否真的存在,这主要可以通过代码分析工具找到,特别是对于技术名词,如StarteredTunnelling,大多数单词可能会被标记为坏词。我明白你的建议,类似于垃圾邮件检测,这是个好主意