12

我不确定如何准确地表达这个问题,所以这里有一个例子:

string1 = "THEQUICKBROWNFOX" string2 = "KLJHQKJBKJBHJBJLSDFD"

我想要一个函数,它的 string1 得分高于 string2 和一百万个其他乱码字符串。请注意缺少空格,因此这是一个逐字符的函数,而不是逐字的函数。

在 90 年代,我在 Delphi 中编写了一个三元组评分函数,并用 Huck Finn 的三元组填充它,我正在考虑将代码移植到 C 或 Python 或将其合并到一个独立的工具中,但必须有更有效的方法目前为止。我会这样做数百万次,所以速度很好。我尝试了 Reverend.Thomas Beyse() python 库并使用一些全大写字符串对其进行了训练,但它似乎需要单词之间的空格,因此返回 [] 的分数。我找到了一些马尔可夫链库,但它们似乎也需要单词之间的空格。虽然根据我对他们的理解,我不明白为什么会这样......

无论如何,我做了很多密码分析,所以将来使用空格和标点符号的评分函数会很有帮助,但现在我只需要 ALLCAPITALLETTERS。

谢谢您的帮助!

4

5 回答 5

9

我将从一个简单的概率模型开始,考虑每个字母的可能性,给定前一个(可能为空,在单词开头)字母。您可以基于字典文件构建它。然后,如果初始模型不够好,您可以将其扩展为使用 2 或 3 个先前的字母作为上下文来调节概率。然后将所有概率相乘以获得单词的分数,如果要对结果进行归一化,则可能取第 N 个根(其中 N 是字符串的长度),以便比较不同长度的单词。

于 2011-07-29T20:01:26.990 回答
2

我不明白为什么不能修改马尔可夫链来工作。我将创建一个文本文件字典,并将其读入以最初填充数据结构。您将只使用 n 个字母链来预测下一个字母,而不是使用 n 个单词来预测下一个单词。然后,您可能想要提取下一个字母的概率,而不是随机生成一个字母。例如,如果您有当前的“TH”链并且下一个字母是“E”,您将转到您的地图,查看“E”跟随“TH”的概率。就个人而言,我会在遍历字符串时简单地将所有这些概率相加,但如何从概率中准确地创建分数取决于你。您可以将其标准化为字符串长度,

现在我想一想,这种方法会偏爱具有较长单词的字符串,因为字典不会包含短语。再说一次,您不仅可以使用单个单词填充字典,还可以使用删除空格的短语来填充字典。那么评分不仅会根据单独单词的英语程度,还会根据单词系列的英语程度来评分。这不是一个完美的系统,但它会提供一致的评分。

于 2011-07-29T20:25:48.483 回答
0

我不知道它是如何工作的,但会Mail::SpamAssassin::Plugin::TextCat分析电子邮件并猜测它是什么语言(支持数十种语言)。

于 2011-07-29T20:41:16.260 回答
0

巧合索引在这里可能会有所帮助,请参阅https://en.wikipedia.org/wiki/Index_of_coincidence

首先,只需计算 IC 与预期值 1.73 的差异(参见上面的维基百科)。对于高级用法,您可能希望使用一些示例语言语料库自己计算预期值。

于 2016-05-27T23:44:47.653 回答
-1

我在想也许你可以在这里应用一些文本到语音合成的想法。特别是,如果语音合成程序能够产生单词的发音,则可以将其视为“英语”。

预处理步骤称为字素到音素的转换,通常会导致将字符串映射到声音的概率。

这是一篇描述此问题的一些方法的论文。(我不认为这篇论文是权威的,因为它只是一个排名很高的搜索结果,而且我在这方面并没有真正的专业知识。)

于 2011-07-30T00:54:55.210 回答