在一些基于object搜索,或者directory方面等等搜索,需要将一个query进行分割处理;
比如:”Chinese restaurant at Bukit Timah Road“,有没有什么办法可以将这个query分成“Chinese restaurant ”和“Bukit Timah Road”呢?然后再到数据库里面查找这两个concept对应的内容;
http://super-jiju.spaces.live.com/blog/cns!806C498DDEE76B61!619.entry
首先想到的是用query Segmentation的方法,像基于EM算法,MI方法来进行分割;
但是这样情况是针对query比较规范整洁的情况下,比如“ABCDEF”这个query,如果存在concept是“ABCF”,那么基于Segmentation的方法是无论如何都不能成功的;但是这种情况确实非常常见的;
可以考虑谱聚类的方法来处理:
1.构造ABCDEF这个query的一个7*7的距离矩阵;
2.提取特征值和特征向量,然后在其特征空间里面计算similarity;
3.将similarity高的一些word组合在一起,就是concept了;
有的时候,并不需要这样麻烦,特别是在工程上面;
首先考虑一下:concept在corpus里面的表现形式;
所以就有一个很简单的方法来做;
1.得到这个query的relevant Documents
2. 来统计这个query不同words组合在relevant documents中的个数;(我曾经以为这个复杂度很高的,因为query中n个words的全排列个数就是N!,但其实不是这样 的,O(n*log(n)))的时间就可以搞定,关键是要一个好的数据结构;
3.需要一个方程f(x)来将个数映射到频率;
4.需要一个方程v()来来检查不同words组合而成的准concept中words之间的差异,类似于方差了
5.找f/v最大的且没有overlap的2个;
大概就是这样子,实验表明,效果非常好!