【问题标题】:How to determine if a filename is random?如何确定文件名是否是随机的?
【发布时间】:2015-11-29 22:35:06
【问题描述】:

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

例如aggvvcx.com 或 kbzaandc.exe

是否有任何明智/合理的方法可以做到这一点?我唯一的想法是检查元音与辅音的出现比例,但这似乎并不可靠,使用字典也不可靠。

编辑:随机性的定义

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

【问题讨论】:

  • 我们无法为您定义“随机”的含义。一旦你自己弄清楚了这一点,你就有了问题的答案。
  • 您将不得不为“似乎随机”提供更好的定义,因为随机生成的字符串产生“myfile”之类的机会与产生“qzzyei”的机会一样多.这对你来说是随机的。
  • 这可能有用:en.wikipedia.org/wiki/Randomness_tests。您可能想尝试在Computer Science 上提问。
  • 鉴于 .exe 和 .com 部分,字典似乎是基于字符串的距离函数的最佳选择。除此之外,您可以构建一个已知可执行文件列表并标记任何不属于该列表的内容。
  • 以下哪个是随机的(无需谷歌搜索):nvvsvc.exemsseces.execvvil.exe。其中两个是windows打包的常用服务,一个是'随机'

标签: c# python algorithm random


【解决方案1】:

你可以试试

  1. https://github.com/rrenaud/Gibberish-Detector

  2. 对于较长的字符串,使用 zlib 进行 gzip 压缩,其中压缩越大表示随机性越小

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

  4. 假设随机字符串的 Google 搜索可能会显着减少点击次数

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

  6. 具有朴素贝叶斯分析的 n-gram (http://theory.stanford.edu/~dfreeman/papers/namespam.pdf)

  7. 训练一个神经网络,使其类似于垃圾邮件过滤

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

【讨论】:

  • 太好了,非常感谢。显然这与Stackoverflow Question 有关,它很好地回答了这个问题。
  • @ChibuezeOpata:是的,我在 SO 上看到了一个,而且不止几个。这是一个有趣的问题,并且由于国际化(字符串是随机的还是来自不同语言的字符串)和命名空间拥挤(迫使人们为登录名随机化字符串以获得插槽)而变得更加难以解决。
  • 确实,人自古以来就为自己制造问题。用户名/昵称可能会在 50 年后被弃用。
【解决方案2】:

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

从技术上讲,使用information theory methods 可能是“它们包含多少熵”。

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

还有其他方法可以回答这个问题,所以你必须弄清楚在这种情况下“随机”对你意味着什么。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 嗯嗯不错的主意,但这在实践中真的成立吗?对于文件名,AZ 看起来并不比 AA 更随机?
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      我不得不为一个源代码挖掘项目解决一个密切相关的问题,并开发了Nostril(用于“Nonsense String Evaluator”)。这个 Python 3 包旨在确定在源代码挖掘期间提取的字符串是否可能是类/函数/变量/等。标识符或随机乱码。它也适用于真实文本,而不仅仅是程序标识符。 Nosril 使用 n-gram(类似于 Gibberish Detector by Rob Neuhaus)与自定义的 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 上,我欢迎贡献。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-20
        • 2010-10-27
        • 2010-10-30
        • 2015-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多