前段时间分配了个搜索优化的任务,虽对搜索有点了解,但对优化方面及相关算法知之甚少,可事情得做啊,于是埋头研究,经过一段时间的验证,领导对效果终归还算满意,下面我就给巴拉巴拉一下吧
1、优化任务
帮助用户快捷方便地找到满意的博客
-----站在用户的角度
-----用户满意的博客:符合用户意愿、博客质量好
2、优化探索
(1)符合用户意愿
用户发出的每个搜索请求背后都隐含着潜在的搜索意图,如果搜索引擎能够根据查询词汇自动找出背后的用户搜索意图,然后针对不同的意图,提供不同的检索方法,将更符合用户意图的搜索结果排在前列,无疑会增加搜索引擎用户的搜索体验。目前搜索引擎已经部分实现了这种搜索模式,比如用户搜索“数据库连接 java”的时候会主动将java语言实现的连接数据库的博客列在最前面
做法有三:
第一、 使用LDA对博客进行聚类,聚出N类后,把每篇博客映射到N个分类中,打上分数最高的M个类,记录并建到索引中;用户搜索时,首先把用户意图映射到N个分类上,取出最可能的分类作为用户意图的意愿分类,然后进行搜索;
第二、 改写用户查询,先按严格的查询获取用户记录,然后按宽松的查询条件进行查询;
第三、 最最后结果根据用户意愿+相似度,进行再次排序
(2)博客质量好
根据运维们多年的运维经验,提取博客的几种最有代表性的属性,根据属性进行打分
根据上述(1)+(2)的综合分数,进行排序。
3、优化总结
上述说的是不是有点粗,我说点其中走过的路吧
(1)聚合分类
聚合分类用的是LDA,也实验了w2v+kmeans,结果就是,还是LDA效果好,应该是因为LDA有个topic提取的过程。而w2v太注重每个词的语义,kmeans又只关注距离,所以少了个topic提取的过程
(2)w2v的使用
为了让搜索结果更好,对搜索数据对博客标题和查询词进行相似度比较,用w2v对博客标题和查询词向量化,然后求得相似度。计算方法就是先分词,然后对分词向量化,对生成的N个向量求和得到一个向量,最后对向量使用cos求夹角,求和的过程会损失数据的特征,但是还可以忍。海明距离,simhash算出来的都太差,可能是因为这两种对短文本不太适合,后来学习到,说SimHash可以,说google的去重就用的这个,我不知道是我用的不对,还是什么原因,反正我用的SimHash也效果一般,刚才又测试了一下,感觉SimHash确实不太适合短文本,比如 "spring下载 附件(1) " 和 "spring下载 附件(2) ",距离竟然是5,按照距离不超过3的都是相似的原则,显然不太好使;而"机器学习实战 附件(1) " 和 "机器学习实战 附件(2) "的距离是3;而"机器学习实战 下载 附件(1) " 和 "机器学习实战 下载 附件(2) "的距离是2,反正我觉得SimHash不太适合短文本
中间还有N多细节,我就不巴拉啦,总之优化就是根据最需要提升的点去优化程序。