今天我们动手实现了一个查询纠错和查询提示的代码:
1. trie树代码如下:
def build_trietree(root, words, str1):
if( not str1 in words ):
words.append(str1);
index_str1=len(words)-1;
p=root;
for i in range(0, len(str1)):
if( p.has_key(str1[i]) ):
p = p[str1[i]];
if( index_str1 not in p["str"]):
p["str"].append(index_str1);
else:
break;
for j in range(i,len(str1)):
p[str1[j]]={};
p=p[str1[j]];
if( not p.has_key("str") ):
p["str"]=[];
p["str"].append(index_str1);
def find_trietree(root, str1):
p=root;
for i in range(0, len(str1)):
if( p.has_key(str1[i]) ):
p = p[str1[i]];
else:
return [];
return p["str"];
if __name__=="__main__":
root={};
words=[];
build_trietree(root,words, "abc");
build_trietree(root,words, "abc");
build_trietree(root,words, "abdhijk")
build_trietree(root, words, "abefg")
index_array=find_trietree(root,"a");
for index in index_array:
print words[index];
2. 计算查询纠错编辑距离的代码:
def min1(aint, bint, cint):
min_result=aint if( aint < bint ) else bint
min_result=min_result if( min_result < cint ) else cint
return min_result;
def calc_editdistance(a, b):
s=[([0] * len(b)) for i in range(len(a))];
for i in range(0,len(a)):
for j in range(0, len(b)):
if( i == 0 and j == 0):
s[i][j]=1;
if(a[0] == b[0]):
s[i][j]=0;
continue;
if( j == 0 ):
s[i][j]=s[i-1][j]+1;
if(b[0]==a[i]):
s[i][j]=s[i-1][j];
continue;
if( i == 0 ):
s[i][j]=s[i][j-1]+1;
if(a[0]==b[j]):
s[i][j]=s[i][j-1];
continue;
dis=1;
if( a[i] == b[j]):
dis=0;
s[i][j]=min1( s[i-1][j-1]+dis, s[i-1][j]+1, s[i][j-1]+1 );
return s[len(a)-1][len(b)-1];
if __name__=="__main__":
print calc_editdistance("ac","abc")
3. 如果我们想把查询纠错和suggest服务合并到一起实现呢?这样其实是一个很好玩的想法的。
4. 用户查询意图识别:
垂直领域检索的query大多数为短query,对于短query来说,识别用户的查询意图是十分困难的。如何在准确率和召回率之间权衡呢?我们只有在对分词和新词挖掘的基础上,使用基于规则的匹配和基于机器学习的方法作为辅助的办法来取得更好的意图识别。更进一步我们可以对用户的查询做一些句法的分析。