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

首先呢是要确定哪些歌曲需要过滤,我调研后觉得对于同一歌名,同一演唱者的歌曲数量大于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首歌曲进行索引,其余歌曲丢弃。

索引时利用K-邻近算法过滤重复歌曲的更多相关文章

  1. kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)

    一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...

  2. 监督学习——K邻近算法及数字识别实践

    1. KNN 算法 K-近邻(k-Nearest Neighbor,KNN)是分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似( ...

  3. 机器学习算法及代码实现–K邻近算法

    机器学习算法及代码实现–K邻近算法 1.K邻近算法 将标注好类别的训练样本映射到X(选取的特征数)维的坐标系之中,同样将测试样本映射到X维的坐标系之中,选取距离该测试样本欧氏距离(两点间距离公式)最近 ...

  4. 《机器学习实战》学习笔记一K邻近算法

     一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...

  5. Python实现kNN(k邻近算法)

    Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...

  6. k邻近算法(KNN)实例

    一 k近邻算法原理 k近邻算法是一种基本分类和回归方法. 原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实 ...

  7. <机器学习实战>读书笔记--k邻近算法KNN

    k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...

  8. [机器学习实战] k邻近算法

    1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...

  9. k邻近算法理解及代码实现

    github:代码实现 本文算法均使用python3实现 1 KNN   KNN(k-nearest neighbor, k近邻法),故名思议,是根据最近的 $ k $ 个邻居来判断未知点属于哪个类别 ...

随机推荐

  1. VI文件编辑操作说明

    vi Hello.c (回车后就进入,按i或a键开始编辑.要退出按ESC,进入中间模式,按冒号 :后面跟命令):wq (保存并退出):q!(退出不保存)

  2. java对mysql数据库进行单表筛选备份、还原操作

    最近在做的一个项目需要对mysql数据库中的单个表格进行备份 其中,一部分表格需要进行筛选备份(例如对最近插入的1000条记录进行备份) 思路:java调用系统命令完成备份操作 假设现在有数据库tes ...

  3. 一个小玩具:NDK编译FFmpeg的例子

    FFmpeg NDK编译 和最简单的APK 准备 硬件: 一台电脑,实验在Lenovo T430上 一个Android设备,实验在 三星S3/A7 编译环境: Ubuntu 14.04 (ant\ja ...

  4. 【转】K短路

    K短路 用dijsktra+A*启发式搜索 当点v第K次出堆的时候,这时候求得的路径是k短路.A*算法有一个启发式函数f(p)=g(p)+h(p), 即评估函数=当前值+当前位置到终点的最短距离g(p ...

  5. jQuery autoResize

    这是一个用jQuery实现的, 自动调整textarea高度, 非常的好!但原作者已经把它的相关描述页面移除了, 这里做个备份吧~但js路径还在:full: http://james.padolsey ...

  6. Bootstrap_排版_标题

    Bootstrap和普通的HTML页面一样,定义标题都是使用标签<h1>到<h6>,只不过Bootstrap覆盖了其默认的样式,使用其在所有浏览器下显示的效果一样,具体定义的规 ...

  7. JQuery执行函数与window.onload函数

    JavaScript和HTML之间的交互: 1.通过用户和浏览器操作页面时引发的事件来处理的. 2.当文档或者它的某些元素发生某些变化时,浏览器会自动生成一个事件. 例如:当浏览器装载完一个文档后,会 ...

  8. JavaScript语言内置对象

    String(字符串对象)RegExp(正则表达式对象)Number(数字对象)Math(数学对象)Function(函数对象)Error(异常对象)Date(日期/时间对象)Boolean(布尔对象 ...

  9. Xcode升级导致插件失效的解决办法-b

    作为iOS界的攻城师,每一次水果发布新的Xcode开发版本时,我们都会跟进,然而那些好用的Xcode插件都会莫名的失灵...对此我各种百度,在这里,我将跟大家分享我是如何解决这些问题的.当然,我的方案 ...

  10. xcode 发展史 及 做iOS 必须知道的小知识

    Xcode 3.0 是开发人员建立 Mac OS X 应用程序的最快捷方式,也是利用新的苹果电脑公司技术的最简单的途径.Xcode 3.0 将Mac OS X的轻松使用,UNIX 能量以及高性能的开发 ...