我不确定如何确切地说出这个问题,所以这是一个例子:
string1 =“THEQUICKBROWNFOX” string2 =“KLJHQKJBKJBHJBJLSDFD”
我想要一个将string1高于string2和其他一百万个乱码字符串的函数。注意缺少空格,所以这是一个逐字符的功能,而不是逐字逐句。
在90年代,我在Delphi中编写了一个三元组评分函数,并用来自Huck Finn的三元组填充它,我正在考虑将代码移植到C或Python或将其插入一个独立的工具,但必须有现在更有效的方法。我会这样做数百万次,所以速度很快。我尝试了Reverend.Thomas Beyse()python库并使用一些全部大写字符串训练它,但它似乎需要单词之间的空格,因此返回得分[]。我发现了一些马尔可夫链库,但它们似乎也需要单词之间的空格。虽然从我对他们的理解,我不明白为什么会这样......
无论如何,我做了很多密码分析,因此将来使用空格和标点符号的评分函数会有所帮助,但是现在我只需要ALLCAPITALLETTER。
感谢您的帮助!
答案 0 :(得分:9)
我会从一个简单的概率模型开始,看看每个字母的可能性,给定前一个(可能是空的,在单词的开头)字母。您可以基于字典文件构建它。然后,您可以将此扩展为使用2或3个前一个字母作为上下文,以在初始模型不够好时调整概率。然后乘以所有概率得到单词的分数,如果要对结果进行标准化,可以取第N个根(其中N是字符串的长度),这样就可以比较不同长度的单词。
答案 1 :(得分:2)
我不明白为什么马尔可夫链无法修改工作。我会创建一个排序的文本文件字典,并读取它以初始填充数据结构。您只需使用一串n个字母来预测下一个字母,而不是n个字来预测下一个字。然后,您可能想要提取下一个字母的概率,而不是随机生成一个字母。例如,如果您有当前的“TH”链并且下一个字母是“E”,您将转到您的地图,并看到“E”跟随“TH”的概率。就个人而言,我只是在循环字符串时简单地将所有这些概率加起来,但是如何从概率中精确地创建得分取决于你。您可以将其标准化为字符串长度,以便比较短字符串和长字符串。
现在我考虑一下,这种方法会支持字符较长的字符串,因为字典不包含短语。然后,您不仅可以使用单个单词填充字典,还可以删除删除空格的短语。然后,得分不仅会根据单词的英语得分而得分,而是英语系列单词的得分。它不是一个完美的系统,但它会提供一致的评分。
答案 2 :(得分:0)
我不知道它是如何运作的,但Mail::SpamAssassin::Plugin::TextCat
分析电子邮件并猜测它是什么语言(支持几十种语言)。
答案 3 :(得分:0)
巧合指数在这里可能会有所帮助,请参阅https://en.wikipedia.org/wiki/Index_of_coincidence。
首先,只计算IC与预期值1.73的差异(参见上面的维基百科)。对于高级用法,您可能希望使用一些示例语言语料库来自己计算期望值。
答案 4 :(得分:-1)
我想也许你可以在这里应用一些文字到语音合成的想法。特别是,如果语音合成程序能够为单词生成发音,则可以将其视为“英语”。
预处理步骤称为 grapheme-to-phoneme conversion ,通常会导致将字符串映射到声音的概率。
Here's a paper描述了解决此问题的一些方法。 (我不认为这篇论文是权威的,因为它只是一个排名很高的搜索结果,而且我在这个领域并没有真正的专业知识。)