假设您有一个包含 10,000 个函数名称的存储库,并且可能包含它们在 C/C#/C++ 代码库中的使用频率。 (他们通常有不同的约定)
一些示例可能是:
DoPaint
OnPaint
CloseWindow
DeleteGraphOnClose
FreeConnection
ConnectInternat (smallTypo, but part of code)
FreeSoH
现在给定一个函数名称,我们如何预测该名称是否遵循人类生成名称的约定?
注意:
- 显然,所有候选人姓名都是有效姓名
- 生成的名称可以包含任意字符,并将被视为错误
- 大小写可能会出现乱码
部分候选人:
Z090292 - not likely
onDelete - likely
CloseWindow - likely
iGetIndex - unlikely
欢迎任何有关技术和软件的指点
最佳答案
您可以尝试对文本进行一些贝叶斯分析:
- 将名称列表(及其频率)加载到您的程序中。此时可能值得对名称进行标记。所以例如CloseWindow 变为 Close 和 Window,两者的频率都增加。此时,加载一些非人类函数名称以使用否定形式训练程序也很有用。
取一个函数名称,并使用您刚刚收集的数据找出每个部分出现的概率
P((人类生成|看到 token ) = P(看到 token |人类生成) * P(人类生成))/P(看到 token )
在这种情况下,人类或计算机生成的概率将根据已知知识来决定,即函数名称的百分比被认为是人类生成的。
看到 token 的概率(P(看到 token ))必须逐渐演变。它将由该 token 在人类功能中出现的次数和在计算机功能中出现的次数组成......该解决方案基于程序随着时间的推移而学习的前提(因此需要进行训练) )
结果 P((HumanGenerate|Seeing the Token) 将为您提供函数名称由人类生成的概率。
注意:这只是一个粗略的轮廓,缺少许多细节。如果您对这方面的研究感兴趣,我建议您阅读概率论,特别是贝叶斯分析
关于data-mining - 如何预测函数名称是否遵循约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1352445/