我正在尝试为我的网站实施内部搜索,如果输入错误的单词,可以为用户指明正确的方向,就像你的意思是:在谷歌搜索中。
有人知道如何进行这样的搜索吗?我们如何确定我们假设用户打算搜索的单词或短语的相关性?
- 我将 asp.net 和 sql server 2005 与 FTS (fullTextSearch) 一起使用
谢谢
我正在尝试为我的网站实施内部搜索,如果输入错误的单词,可以为用户指明正确的方向,就像你的意思是:在谷歌搜索中。
有人知道如何进行这样的搜索吗?我们如何确定我们假设用户打算搜索的单词或短语的相关性?
谢谢
您可以使用一种算法来确定字符串相似性,然后从您的搜索索引中建议其他字符串,直至达到一定的差异。
其中一种算法是Levenshtein distance。
但是,不要忘记搜索现有的解决方案。我认为例如Lucene具有搜索相似字符串的能力。
顺便说一句,这里有一篇关于这个主题的相关帖子:谷歌的“你的意思是什么?” 算法工作?
这是通过正则表达式查询与短语匹配的最接近的关键字来完成的。
这是一篇很棒的文章,可能会对您有所帮助。
我能想到的最简单的方法是编写一个函数来返回两个单词之间的不匹配程度,然后遍历所有单词并找到最好的单词。
我已经使用分支定界方法完成了这项工作。让我挖掘代码:
bool matchWithinBound(char* a, char* b, int bound){
// skip over matching characters
while(*a && *b && *a == *b){a++; b++;}
if (*a==0 && *b==0) return true;
// if bound too low, quit
if (bound <= 0) return false;
// try assuming a has an extra character
if (*a && matchWithinBound(a+1, b, bound-1)) return true;
// try assuming a had a letter deleted
if (*b && matchWithinBound(a, b+1, bound-1)) return true;
// try assuming a had a letter replaced
if (*a && *b && matchWithinBound(a+1, b+1, bound-1)) return true;
// try assuming a had two adjacent letters swapped
if (a[0] && a[1]){
char temp;
int success;
temp = a[0]; a[0] = a[1]; a[1] = temp;
success = matchWithinBounds(a, b, bound-1);
temp = a[0]; a[0] = a[1]; a[1] = temp;
if (success) return true;
}
// can try other modifications
return false;
}
int DistanceBetweenWords(char* a, char* b){
int bound = 0;
for (bound = 0; bound < 10; bound++){
if (matchWithinBounds(a, b, bound)) return bound;
}
return 1000;
}
使用 T-SQL 您可以使用该SOUNDEX
功能对单词进行拼音比较。
如果您获取用户输入,然后通过 soundex 代码将其与数据库中的其他单词进行比较,您应该能够得出一个“你的意思是”列表吗?字。
例如
select SOUNDEX('andrew')
select SOUNDEX('androo')
两者都会产生相同的输出(A536)。
现在有更好的算法,但是 soundex 是内置在 sql server 中的。
你为什么不使用谷歌电源?,你可以使用他们的建议服务
这是一个关于c#的例子