基于指纹的原则,具体的音乐检索

基于指纹的原则,具体的音乐检索

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

在以前的博客基于指纹音乐检索于,我们介绍的基本流程,现并未做过多介绍。本博客将详细叙述检索的详细原理和实现。

1 搜索引擎的工作原理

       在介绍音乐检索的原理之前,我们先介绍一下搜索引擎的工作原理,这是由于音乐检索的工作原理和搜索引擎的工作原理很类似。

       我们使用搜索引擎的时候。一般是这个流程:输入一些关键词,提交给搜索引擎。搜索引擎通过后台分析返回与关键词最相关的网页。

这个过程非常快,往往仅仅有几毫秒。可是眼下互联网上存在的网页总数有数百亿之多。搜索引擎是怎样在这么短的时间内找到用户须要的网页的呢?这确实非常奇妙。

       最朴素的方法肯定是一个一个网页进行相似度匹配。每个文件计算一个相似度,然后对相似度进行排序。返回最相似的网页。

可是这也是最笨的方法。这须要每次查询都须要遍历一般全部的网页,复杂度很高。搜索引擎通过採用一种叫倒排索引的结构避免了朴素的匹配,在此之前我们先介绍一下朴素检索的实现方法。

       依照朴素方法,我们须要依据网页文件构造索引。如图一所看到的。每个网页都会首先进行分词,然后统计不同词的词频或者其它特征。

有了这个索引结构。就能够设计最朴素的搜索引擎。当用户输入的关键词进入搜索引擎之后。就会将关键词进行特征转换,转换成一个带有权值的特征向量,之后就能够和每个网页的特征向量进行相似度匹配,比如余弦相似性度量等,最后对匹配的结果排序就可以。

基于指纹的原则,具体的音乐检索

图一 网页的词组索引结构

倒排索引这个名词听着非常玄乎,事实上非常easy理解。朴素方法採用网页的索引结构,构造单词的统计信息。倒排索引则相反。以单词为索引结构。构造网页的统计信息,如图二所看到的。

基于指纹的原则,具体的音乐检索

图二 倒排索引示意图

       在倒排索引结构中,每个单词都相应一个倒排列表。倒排列表记载了出现过某个单词的全部网页的列表和单词在该网页中出现的位置信息或者词频。比如,单词1出如今网页6和10中,词频各自是a1和a2

       搜索引擎在获得用户输入的关键词之后,就查找关键词相应的倒排索引表。然后将多个关键词的倒排索引表求交,获得出现过全部关键词的网页。然后对这些网页进行相似度计算。

能够看出。通过採用倒排索引结构,使须要匹配的网页数量急剧降低,因而大大加快了搜索的速度。

       上面是最简单的搜索引擎原理,假设大家想深入了解搜索引擎,能够參看《这就是搜索引擎》一书,该书具体介绍了搜索引擎的各个部分和检索原理。

以下開始介绍基于指纹的音乐检索原理。

2 基于指纹的音乐检索工作原理

       基于指纹的音乐检索工作原理和搜索引擎很相似。也是构造一个倒排索引结构,只是不是单词的倒排索引,而是指纹的倒排索引。

基于指纹的音乐检索 中,我们介绍了指纹的构造,在此不做过多介绍。

指纹能够看做搜索引擎检索中的关键词,可是与关键词不同,每一个指纹代表的信息量较少,所以在音乐检索中须要提取许多的指纹完毕单次检索。

比如。15s的片段往往须要提取几万个指纹才干查找到正确的音乐。这就意味着搜索引擎几个关键词的单次检索在音乐检索中变成了几万个指纹的单次检索,检索时间大大添加。

       每个指纹都是一个整数。依据指纹的构造不同。可能须要24到30位不等。所以能够利用一个int型整数存储每个指纹。

这样全部指纹的空间就限定于一个int型整数所表示的范围,也即0到4G。当音乐库较小时,全部音乐产生的不同指纹数也较少,为了避免空间浪费。存储全部的指纹能够採用散列表形式,如图三所看到的。

基于指纹的原则,具体的音乐检索

图三 散列表形式的指纹检索结构

       当音乐库很大时。差点儿全部的指纹都可能会出现。这时採用散列表结构就没有什么优势,能够直接分配一个大数组来存放全部的指纹,然后每个指纹都指向一个该指纹相应的倒排列表。如图四所看到的。在图四中假定每个指纹的位数是24位,则须要分配一个长度是224的数组,然后每个指纹都指向一个倒排列表。

倒排列表中存储的是音乐id和该指纹在该首音乐中出现的位置。

基于指纹的原则,具体的音乐检索

图四 基于指纹的倒排索引表

       获得图四的倒排索引结构之后。检索过程就比較easy了。

可是过程却和搜索引擎不同,搜索引擎须要对不同关键词的倒排列表求交集。对交集内的网页进行相似度计算。基于指纹的音乐检索则须要一个间接的匹配过程,匹配步骤例如以下:

  1. 将client传递的音频提取指纹。每个指纹伴随有一个时间属性;
  2. 对每个提取的指纹都查找倒排索引表,获得该指纹相应的倒排列表;
  3. 将倒排列表中每个音乐相应的时间和提取的指纹相应的时间进行相减。假设时间差大于零。则保存该时间差到图五所看到的的相应音乐中。
  4. 对每首歌中的时间差进行排序;
  5. 统计每首歌中时间差同样的个数,并返回个数最多的音乐。
基于指纹的原则,具体的音乐检索

图五 统计匹配的相似度

       基于指纹的音乐检索和搜索引擎相比,复杂度大增,主要体如今两个方面:首先。针对client录制的音频,提取的指纹往往上万,而这上万个指纹都须要訪问倒排索引表,这意味着一次音乐检索能够完毕上万次搜索引擎的检索;其次。因为单次检索须要上万次訪问倒排索引表,所以无法对音乐求交,因为求交的结果必定为零,我们仅仅能将倒排列表中相应的音乐时间和提取指纹相应的时间相减。然后统计每一首音乐中不同一时候间差的个数。然后将个数作为匹配的结果。正是由于以上这两个因素,因此,在一个独立的音乐库不能做太多。而相应的倒排列表每个指纹应该限制长度。

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117123.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月10日 下午2:00
下一篇 2022年1月10日 下午2:00


相关推荐

  • SQL中decimal的相关使用[通俗易懂]

    SQL中decimal的相关使用[通俗易懂]decimal用于表示定点实数,具体使用格式为:decimal[(p[,s])],其中p表示精度,用于指定小数点左边和右边十进制数字的最大位数,取值在1-38之间,缺省值为18,s指定小数点右边十进制数的最大位数,取值在0-p之间缺省值为0(此时小数点后面没有小数位,所有输入的小数位都会被自动四舍五入)。故而定义了一个decimal类型的变量的时候,要注意这个否则就会发生越界的情况。…

    2022年7月20日
    33
  • 什么是RPC协议?RPC协议与HTTP协议的区别

    什么是RPC协议?RPC协议与HTTP协议的区别什么是RPC协议?RPC是一种远程过程调用的协议,使用这种协议向另一台计算机上的程序请求服务,不需要了解底层网络技术的协议。在RPC中,发出请求的程序是客户程序,而提供服务的程序是服务器。HTTP是一种超文本传输协议。是WWW浏览器和WWW服务器之间的应用层通讯协议。RPC协议与HTTP协议的区别1、RPC是一种API,HTTP是一种无状态的网络协议。RPC可以基于HTTP协议实现,…

    2022年5月19日
    47
  • python可视化图表生成(一)

    python可视化图表生成(一)一 安装拓展包 pipinstallma 二 折线图 importnumpya pyplotaspltx np linspace 0 2 100 创建等差数列 0 2 之间 100 个 plt plot x x label line1 第一个参数为横坐标第二个为纵坐标第三个为曲线名字 plt plot x x2 label line2 plt plot x x3 label line3

    2026年3月17日
    2
  • 什么是Unicode字符_Unicode格式字符是什么

    什么是Unicode字符_Unicode格式字符是什么写这篇博客的原因,从做软件开始,什么ASCII码,Unicode,UTF-8,UTF-16,UTF-32……这些鬼东西总是经常碰到,只知道这些鬼是编码格式,其他的就啥都不清楚了,既然总是遇

    2022年8月1日
    10
  • Java中StringBuilder类「建议收藏」

    Java中StringBuilder类「建议收藏」提要大家要知道字符串(String)在进行拼接操作时,每一次拼接,都会构建一个新的String对象这样耗时又浪费内存解决方法就是StringBuilder类,就可以解决这个问题StringBuilder类中方法和String类基本一样我举例几个使用最多的方法创建//创建StringBuilderStringBuildersb=newStringBuilder(“老八”);System.out.println(sb);//输出如果括号里不填默认是空字符串

    2022年7月17日
    21
  • Android okio简析

    Android okio简析前言看了两天源码,云里雾里的,最终看到这篇blog,才清晰的了解了okio的脉络,能坚持看完肯定有收获。——–自从Google官方将OkHttp作为底层的网络请求之后,作为OkHttp底层IO操作的Okio也是走进开发者的视野,这个甚至是取代了java的原生IO库的存在到底有什么特殊的本领呢?这篇文章主要是对Okio的实现做

    2022年6月11日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号