更新:代码现在在 jsFiddle 上:http: //jsfiddle.net/ybanrab/s6Bs5/1/复制并粘贴一页新闻复制并粘贴到您的测试数据中可能会很有趣
我建议尝试分析各个角色相互跟随的概率。下面是一个我用 JavaScript 编写的示例,但应该很容易转换为 T-SQL 或 ColdFusion。
这个想法是你输入好的短语(语料库)并分析字母跟随其他字母的频率。如果你喂它“这么薄”,你会得到这样的东西:
{
t:{h:3},
h:{i:2,e:1},
i:{s:1,n:1},
s:{},
n:{}
}
通过从您正在分析的数据中提供精心挑选的已知良好输入,您将获得最大的准确性,但您也可以通过简单的英语提供良好的结果。在下面的示例中,我正在计算它,但是一旦您对它感到满意,您显然可以存储它。
然后,您根据概率运行示例字符串以对其进行评分。此版本忽略大小写、单词首字母、长度等,但您也可以根据需要使用它们。然后,您只需要确定一个阈值分数并像这样进行过滤。
我相当肯定这种分析有一个名字,但我的 google-fu 今天很弱。您可以将下面的代码粘贴到脚本块中,以了解它的工作情况(或不工作)。
var corpus=["boom","Mule Deer", "Owner Financed ,owner Financed", "This is a valid String","The quick brown fox jumped over the lazy dog"];
var probs={};
var previous=undefined;
//Compute the probability of one letter following another
corpus.forEach(function(phrase){
phrase.split(" ").forEach(function(word){
word.toLowerCase().split("").forEach(function(chr){
//set up an entry in the probabilities table
if(!probs[chr]){
probs[chr]={};
}
//If this isn't the first letter in the word, record this letter as following the previous one
if(previous){
if(!probs[previous][chr]){
probs[previous][chr]=0;
}
probs[previous][chr]++;
}
//keep track of the previous character
previous=chr;
});
//reset previous as we're moving onto a different word
previous=undefined;
})
});
function calculateProbability(suspect){
var score=0;
var previous=undefined;
suspect.toLowerCase().split("").forEach(function(chr){
if(previous && probs[previous] && probs[previous][chr]){
//Add the score if there is one, otherwise zero
score+=probs[previous][chr];
}
previous=chr;
});
return score/suspect.length;
}
console.log(calculateProbability("boom"));
console.log(calculateProbability("Mood"));
console.log(calculateProbability("Broom"));
console.log(calculateProbability("sajkdkas dak"));