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

时间:2009-08-29 21:36:52

标签: data-mining text-mining

假设您有一个包含10,000个函数名称的存储库,可能还有它们在C / C#/ C ++中的代码语料库中的使用频率。 (他们有不同的惯例通常规定)

有些样本可能是:

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

现在给出一个函数名称,我们如何预测名称是否遵循人类生成名称的约定?

注意:

  1. 显然,所有候选人名称都是有效名称
  2. 生成的名称可以包含任意字符,并将被视为错误
  3. 信件案件可能会出现乱码
  4. 一些候选人:

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

    欢迎任何关于技术软件的指示

6 个答案:

答案 0 :(得分:2)

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

  1. 将名称列表(及其频率)加载到您的程序中。此时可能值得对名称进行标记。所以例如CloseWindow变为Close和Window,两者的频率都递增。在这一点上,加载一些非人类函数名称也可以用来训练nagatives中的程序。
  2. 获取一个函数名称,并使用您刚收集的数据查找每个部分出现的概率

    P((人类生成|看到令牌)= P(看到令牌|人类生成)* P(人类生成))/ P(看到令牌)

  3. 在这种情况下,人类或计算机生成的某些事物的概率将根据已知知识决定,即功能名称的百分比被认为是人类生成的。

    看到令牌(P(看到令牌))的概率必须逐渐发展。它包括在人类功能中看到令牌的次数以及在计算机功能中看到它的次数......这个解决方案基于程序随时间学习的前提(因此需要训练)

    结果P((HumanGenerated | Seeing the Token)将为您提供人类生成函数名称的概率。

    注意:这只是一个粗略的轮廓,很多细节都缺失了。如果您对这一系列调查感兴趣,我建议您阅读概率论,特别是贝叶斯分析

答案 1 :(得分:1)

将标识符拆分为单个单词(基于大小写),并将单词放入拼写检查器(例如ispell)。将所有拼写错误的单词与非人类生成的单词一起考虑,以及它们出现的标识符。

答案 2 :(得分:1)

我的一个朋友可能会帮忙。就我所知,他正在就这个主题做博士学位。

Home page

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

除了使用字典作为Martin V. Lowes建议的是一个很好的字典,但你必须记住还要考虑以下常见形式的变量:

  1. 单字母变量名称。
  2. 使用下划线而不是驼峰的变量名。
  3. Metasyntactic variables.
  4. Hungarian notation.
  5. 附加了字符的关键字/类型(即$returnlist_)。