将真实单词与随机字符串分开

时间:2012-11-26 15:00:21

标签: sql-server coldfusion

我正在存储在网站上的所有搜索中使用过的关键字列表,而且我在关键字字段中收到了大量随机字符串。以下是我要回复的数据示例:

fRNPRXiPtjDrfTDKH
boom
Mule deer
gVXOFEzRWi
cbFXZcCoSiKcmrvs
Owner Financed ,owner Financed

我正试图在SQL或ColdFusion中找到一种方法来判断某些东西是否有有效的英文单词,或者它是否是一组随机字符。我已经尝试过挖掘n-gram分析,但似乎无法提出任何有用的解决方案,我可以直接在我的服务器上运行。

4 个答案:

答案 0 :(得分:3)

更新:代码现在在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"));

答案 1 :(得分:2)

最好的办法是根据频率列表检查你的单词:字典不起作用,因为它们不包含语法变形,专有名词,复合词以及其他有效的其他东西。

对n-gram数据进行天真检查的问题是低频词有很多噪音。在绝大多数情况下,最容易做到的事情应该是给出正确的答案,就是从最大的50,000或100,000个单词的某个地方(Google n-gram,Wikipedia等)截断一个频率计数单词列表。根据需要调整阈值以获得您要查找的结果,但是您可以检查是否有任何/所有查询字词出现在此列表中。

如果你想知道这个查询是语法上的,还是作为一个单位而不是其组成部分是合理的,那么这当然是另一个问题。

答案 2 :(得分:1)

有一些非词典单词可以是有效的搜索(例如,gethostbyname是SO上有效且有意义的搜索,但不是字典单词)。另一方面,字典词与您的网站完全无关。

您可以简单地检查搜索查询是否产生非空结果,而不是试图猜测什么是单词,什么不是。结果空洞的人必须完全偏离主题或胡言乱语。

答案 3 :(得分:0)

听起来你正在寻找

Bayesian Filter