2

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

一些样本可能是:

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

现在给定一个函数名称,我们如何预测该名称是否符合 Human Generated Name 的约定

笔记:

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

部分候选人:

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

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

4

6 回答 6

2

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

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

    P((HumanGenerated|Seeing the Token) = P(Seeing the Token|Human Generated) * P(Humangenerated)) / P(Seeing the Token)

在这种情况下,某事物由人类或计算机生成的概率将基于已知知识来确定,即认为多少百分比的函数名称是由人类生成的。

看到令牌(P(Seeing the Token))的概率必须逐渐演变。它将包括令牌在人类功能中出现的次数和在计算机功能中出现的次数......这个解决方案是基于程序随着时间的推移而学习的前提(因此需要训练)

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

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

于 2009-08-29T21:57:59.363 回答
1

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

于 2009-08-29T21:43:52.590 回答
1

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

主页

于 2009-08-29T21:48:43.470 回答
0

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

于 2009-08-29T21:45:18.623 回答
0

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

于 2009-08-29T21:46:21.133 回答
0

除了像 Martin V. Lowes 建议的那样使用字典之外,这是一个很好的方法,但您必须记住还要考虑以下常见的变量形式:

  1. 单字母变量名称。
  2. 使用下划线而不是驼峰式大小写的变量名。
  3. 元句法变量。
  4. 匈牙利符号。
  5. 带有字符的关键字/类型(即$returnlist_)。
于 2009-08-29T22:24:37.047 回答