如何确定文件名是否是随机的

本文关键字:随机 是否是 文件名 何确定 | 更新日期: 2023-09-27 18:11:01

我需要能够测试一个文本列表的文件名,似乎是随机的;

。Aggvvcx.com或kbzaandc.exe

有什么明智/合理的方法来做这件事吗?我唯一的想法是检查元音和辅音的出现比例,但这似乎不可靠,使用字典也不可靠。

编辑:随机性的定义

关于随机性的性质,我唯一知道的是它是一个文件名。也许有可能得到一个通用文件名的字典,并使用某种模式解析器来确定通用的文件命名模式,并在训练后根据列表运行它?如果我们考虑多种语言,这显然是一种徒劳的方法,但我只对检查英文文件名感兴趣。

如何确定文件名是否是随机的

你可以试试

    https://github.com/rrenaud/Gibberish-Detector
  1. 对于较长的字符串使用zlib进行gzip压缩,压缩越大表示随机性越小

  2. 字符串中字符的频率分析与适当自然语言的平均值的比较

  3. 谷歌搜索假设随机字符串可能有更少的点击

  4. soundex来确定字符串是否至少有一个音节,因此更有可能是可发音的,因此不太可能是随机的

  5. n-grams与朴素贝叶斯分析(http://theory.stanford.edu/~dfreeman/papers/namespam.pdf)

  6. 训练神经网络来做类似于垃圾邮件过滤

  7. 根据Netflix挑战赛获胜者的方法,将上述所有方法结合起来获得最佳结果,即相对平庸的测试组合可能产生更好的测试。

你说的随机到底是什么意思?有很多方法可以回答这个问题。

从技术上讲,它可以是使用信息论方法的"它们包含多少熵"。

既然你提到字典,你实际上可能是指"它们看起来像真实的单词吗?"对于使用字母分布的长文本可以进行检查,但是对于像您展示的这样的短名称将失败。相反,你可以尝试用n-gram来表示字符。这与字母频率类似,但适用于2/3个字母序列。这意味着,如果你尝试双字符,你会发现第一个单词包含"gv","vv","vc","cx",这些在任何英语单词中都不可能找到。

也有其他的方法来回答这个问题,所以你必须弄清楚在这种情况下"随机"对你来说到底是什么意思。

一种半粗略和快速的启发式检查是按单个字母对字符串进行排序,并将其排序序列与随机生成该长度序列的可能性进行比较。例如,对于单词长度2,一个(排序)字符串"AA"给定26个字母的字母表,有1/(26*26)的机会,但一个(排序)字符串"AB"-由"AB"answers"BA"生成-有2/(26*26)的机会。

注:从编程的角度来看,另一种方法是对它运行拼写检查器,并找出有多少"错误"。然后为它设置一个阈值

有很多随机性测试,所以第一个问题是决定你所说的随机性是什么意思。恐怕做这个决定不是件容易的事。但维基百科页面是一个很好的起点。

https://en.wikipedia.org/wiki/Randomness_tests

好消息是,如果你只是需要它"相当混乱",那么有许多合理的(即计算成本低且通常足够好)方法可以采用。

我必须为一个源代码挖掘项目解决一个密切相关的问题,并开发了Nostril(用于"无意义字符串评估器")。这个Python 3包旨在确定在源代码挖掘期间提取的字符串是否可能是类/函数/变量等。标识符或随机乱码。它也可以很好地处理真实文本,而不仅仅是程序标识符。Nostril使用n-grams(类似于Rob Neuhaus的Gibberish Detector)结合自定义TF-IDF评分功能。它是预先训练的,并且可以开箱即用。

示例:如下代码

from nostril import nonsense
real_test = ['bunchofwords', 'getint', 'xywinlist', 'ioFlXFndrInfo',
             'DMEcalPreshowerDigis', 'httpredaksikatakamiwordpresscom']
junk_test = ['faiwtlwexu', 'asfgtqwafazfyiur', 'zxcvbnmlkjhgfdsaqwerty']
for s in real_test + junk_test:
    print('{}: {}'.format(s, 'nonsense' if nonsense(s) else 'real'))

将产生以下输出:

bunchofwords: real
getint: real
xywinlist: real
ioFlXFndrInfo: real
DMEcalPreshowerDigis: real
httpredaksikatakamiwordpresscom: real
faiwtlwexu: nonsense
asfgtqwafazfyiur: nonsense
zxcvbnmlkjhgfdsaqwerty: nonsense

项目在GitHub上,我欢迎贡献。