用go构建个简单的搜索(六)搜索结果的排序
搜索结果需要处理的问题
搜索会有大量的搜索结果,如果原封不动的返回用户会抓不到重点不可能会把所有的结果都看一遍,所以需要根据搜索条件对检索的内容尽可能关联度高点的在前面。
TF-IDF 打分
TF-IDF是传统的统计方法。TF(Term Frequency)是词频的意思,IDF(Inverse Document Frequency)是逆文档频率。TF-IDF的值越大说明这个关键词对这个文档重要性越高。注意这里需要去掉无用的词,这里对文档的上下文是没有关联的
TF=T(单词出现的次数) 一般会用-》 TF=T/C C是单词总数 主要是优化大文件
IDF=log(A/D) A是所有的文档 D是单词出现过至少一次的文档数。包含词语的文档越少越容易区分该词
TF-IDF=TF*IDF
对于词频可以借助分词器处理
/**
* TF-IDF
*/
func tfidf(termFreq, docTerms, n, termDocs int) float64 {
tf := float64(termFreq) / float64(docTerms)
idf := math.Log(float64(1+n) / (1 + float64(termDocs)))
return tf * idf
}
除了搜索打分外,也可以用在例如客服类的问答机器人预置的一些问题的答案,对问题进行匹配自动回复
PageRank google的根据网页连接被指向得到的网页权重,计算时会忽略网页内容的。
排序
- 上面关系度的打分
- 更新日期比如一些热点话题搜索肯定是想看一些最新的报道
- 地域的指向
- 用户的历史偏好
- 评论数点赞数这些的,买东西的价格销量
转载自:https://juejin.cn/post/7248951575845601340