索引时利用K-邻近算法过滤重复歌曲

最近一直在做公司搜索的优化与维护,做完索引和搜索的分离之后,又有一个新需求,因为做的是歌曲方面的搜索,所以在数据库中有多个同歌名,同演唱者的的数据,这样在用户搜索的时候,会出来一大堆不同版本的歌曲,影响搜索质量,所以需要在建立索引库时做一个初步的过滤,因为只是一个简单的过滤,所以并不需要太精确。

首先呢是要确定哪些歌曲需要过滤,我调研后觉得对于同一歌名,同一演唱者的歌曲数量大于10时,就进行过滤,也即阀值为10,当然这个后期可以随时调整。

 

然后是需要确定过滤的维度,也即怎样确定一个歌曲就比另一个歌曲质量好?维度如下:

播放次数

播放完成度(总播放时长/总播放次数)

歌曲质量(超清、高清、普通….)

…..

 

确定完维度之后,还需要确定权重,因为不同的维度对歌曲质量的影响是不同的。

 

最后需要一个算法,这要是最核心的,正好以前稍微看了下机器学习这本书,就想到了里面的K邻近算法,据我粗浅的理解,也就是空间向量计算距离,距离预期近,就说明好。

 

那么我的步骤如下:

先确定预期,也即一个理论上完美的歌曲,每个维度的值应该为多少。

            //expectation point

            Integer[] origonPoint = {1,2,100000000};

 

我这边出于各种考虑,就只给出三个维度,其实维度增加,道理是一样的。

我用一个INT数组来表示预期完美的点,依次为:播放完成度、歌曲质量、播放次数。

 

那么对于一首歌曲(0.5,1,10000)距离预期的点的距离就为:

(1-0.5)^2 + (2-1)^2 + (100000000 - 10000)开根号,其实这样大家应该也能看出来,那么对于距离影响最大的肯定是播放次数,但是如果播放次数占比过大,会导致一个很致命的问题,那就是,过滤算法是不能弥补的,因为一旦开始把歌曲过滤后,那么用户在搜索时,过滤掉的歌曲就不会出现,那么播放次数肯定是一直为零的,那么一旦一个歌曲被干掉了,那么就永远的被干掉了。

 

所以就像前面说的,需要确定全权重

            int playCompletenessFactor = 10;

            double qualtityFactor = 2.5;

            int timesFactor = 1/10000000;

 

 

因为需要提高播放完成度和质量的权重,减少播放次数的权重,那么就初步定为以上的权重个,事实上,这种算法,最重要的就是权重的设定,需要不断试验调整。

那么现在距离就为:

(1-0.5)^2 * playCompletenessFactor + (2-1)^2 * qualtityFactor + (100000000 - 10000) * timesFactor开根号

 

在不断的试验和调整中,最终能找到一个合适的权重系数。

所以总结下,整个算法其实很简单,主要步骤如下:

  1. 在建索引时,先按照歌曲名称,歌手名称排字典序,所以可以用当前索引的歌曲同上一个歌曲比对,如果相同,数量加1,如果不同,就看数量如果大于阀值,就将所有歌曲进行过滤。
  2. 进入过滤算法,得到各歌曲与预期的距离,按照距离升序排列,取出前N首歌曲
  3. 将N首歌曲进行索引,其余歌曲丢弃。

 

转载于:https://www.cnblogs.com/edwinchen/p/4551910.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值