根据字符串的英语相似度打分
我不太确定该怎么问这个问题,所以我举个例子:
string1 = "THEQUICKBROWNFOX"
string2 = "KLJHQKJBKJBHJBJLSDFD"
我想要一个函数,可以让string1的得分高于string2和其他一百万个无意义的字符串。注意这里没有空格,所以这个函数是逐个字符比较,而不是逐个单词。
在90年代,我在Delphi里写过一个三元组得分函数,并用《哈克贝里·芬历险记》里的三元组来填充它。我在考虑把这个代码移植到C语言或Python,或者把它做成一个独立的工具,但现在应该有更高效的方法。我需要做这个操作上百万次,所以速度很重要。我试过使用Reverend.Thomas Beyse()这个Python库,并用一些全大写的字符串进行训练,但它似乎需要单词之间有空格,因此返回的得分是[]。我还找到了一些马尔可夫链的库,但它们似乎也需要单词之间有空格。虽然我对这些库的理解是,我不明白为什么一定要这样……
总之,我做了很多密码分析,所以将来需要使用空格和标点符号的得分函数会很有帮助,但现在我只需要全大写字母的字符串。
谢谢你的帮助!
5 个回答
我不知道它是怎么工作的,但 Mail::SpamAssassin::Plugin::TextCat
这个工具会分析电子邮件,并猜测它是用什么语言写的(支持几十种语言)。
我觉得马尔可夫链可以改进一下来用。可以先创建一个文本文件,里面放一些词汇,然后把这些词读进来,作为数据的基础。这样你就可以用一串字母来预测下一个字母,而不是用一串词来预测下一个词。接下来,不是随便生成一个字母,而是想办法找出下一个字母出现的概率。比如说,如果你现在的字母串是“TH”,那么下一个字母是“E”,你就去查查你的字典,看看“E”跟在“TH”后面的概率有多大。我个人的做法是,在遍历字符串的时候,把所有的概率加起来,但具体怎么从概率中得出一个分数就看你自己了。你还可以根据字符串的长度来调整分数,这样就能比较短字符串和长字符串了。
想想看,这种方法可能会偏向于包含较长单词的字符串,因为字典里可能没有短语。不过,你也可以把字典里放的不仅仅是单个单词,还可以加入一些短语,把空格去掉。这样评分的时候,不仅会看单个单词的英文程度,还会看一串词的英文程度。虽然这不是一个完美的系统,但它能提供比较一致的评分。
我会从一个简单的概率模型开始,来计算每个字母出现的可能性,这个可能性是基于前一个字母(在单词开始时可能是空的)来判断的。你可以根据一个字典文件来建立这个模型。如果这个初始模型效果不太好,你还可以扩展到使用前两个或三个字母作为上下文来调整概率。然后,把所有的概率相乘,得到一个单词的得分。如果你想让结果更规范,以便比较不同长度的单词,可以考虑取这个得分的N次根(N就是字符串的长度)。