Python实现内容检索子系统(BM25算法)

一、检索模型

搜索引擎一般流程如下:

 

从检索后面都属于检索模型的范畴。

搜索结果排序是搜索引擎最核心的部分,很大程度度上决定了搜索引擎的质量好坏及用户满意度。实际搜索结果排序的因子有很多,但最主要的两个因素是用户查询和网页内容的相关度,以及网页链接情况。这里主要介绍网页内容和用户查询相关的内容。判断网页内容是否与用户査询相关,这依赖于搜索引擎所来用的检索模型。检索模型是搜索引擎的理论基础,为量化相关性提供了一种数学模型,是对查询词和文档之间进行相似度计算的框架和方法。其本质就是相关度建模。

 

二、信息检索特点

检索有文件检索、数据库检索、信息检索等,常用的是数据库检索和信息检索。

 

数据库检索

信息检索

匹配程度

精确

模糊

查询语言

SQL

自然语言

查询描述

完善

不完善

数据规模

TB

PB

评价标准

客观(二元)

主观(多元)

检索模型

决定性

可能性

信息检索任务是对索引结果进行相关性排序。

影响结果排序的因素有相似度、网页质量、用户偏好等等。

 

三、检索模型分类

检索模型一般有布尔模型、向量空间模型、概率模型、知识模型。

 

 

信息检索模型四元组[D, Q, F, R(qi, dj)]

  • D: 文档集的机内表示
  • Q: 用户需求的机内表示
  • F: 文档表示、查询表示和它们之间的关系的模型框架(Frame)
  • R(qi, dj): 给query qi 和document dj评分

 

四、BM25算法

BM25算法,通常用来作搜索相关性平分。对Query进行语素解析,生成语素qi;然后,对于每个搜索结果D,计算每个语素qi与D的相关性得分,最后,将qi相对于D的相关性得分进行加权求和,从而得到Query与D的相关性得分。

BM25算法的一般性公式如下:

其中,Q表示Query,qi表示Q解析之后的一个语素(对中文而言,我们可以把对Query的分词作为语素分析,每个词看成语素qi。);d表示一个搜索结果文档;Wi表示语素qi的权重;R(qi,d)表示语素qi与文档d的相关性得分。
下面我们来看如何定义Wi。判断一个词与一个文档的相关性的权重,方法有多种,较常用的是IDF。这里以IDF为例,公式如下:

 

 其中,N为索引中的全部文档数,n(qi)为包含了qi的文档数。

根据IDF的定义可以看出,对于给定的文档集合,包含了qi的文档数越多,qi的权重则越低。也就是说,当很多文档都包含了qi时,qi的区分度就不高,因此使用qi来判断相关性时的重要度就较低。

我们再来看语素qi与文档d的相关性得分R(qi,d)。首先来看BM25中相关性得分的一般形式:

 

其中,k1,k2,b为调节因子,通常根据经验设置,一般k1=2,b=0.75;fi为qi在d中的出现频率,qfi为qi在Query中的出现频率。dl为文档d的长度,avgdl为所有文档的平均长度。由于绝大部分情况下,qi在Query中只会出现一次,即qfi=1,因此公式可以简化为:

从K的定义中可以看到,参数b的作用是调整文档长度对相关性影响的大小。b越大,文档长度的对相关性得分的影响越大,反之越小。而文档的相对长度越长,K值将越大,则相关性得分会越小。这可以理解为,当文档较长时,包含qi的机会越大,因此,同等fi的情况下,长文档与qi的相关性应该比短文档与qi的相关性弱。

综上,BM25算法的相关性得分公式可总结为:

从BM25的公式可以看到,通过使用不同的语素分析方法、语素权重判定方法,以及语素与文档的相关性判定方法,我们可以衍生出不同的搜索相关性得分计算方法,这就为我们设计算法提供了较大的灵活性。

 

五、BM25算法实现

bm25.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-

'''
作者:chl
时间:2017/11/23
用图:bm25算法
'''

import math

class BM25(object):
    def __init__(self, docs):
        self.D = len(docs)
        self.avgdl = sum([len(doc)+0.0 for doc in docs]) / self.D
        self.docs = docs
        self.f = []  # 列表的每一个元素是一个dict,dict存储着一个文档中每个词的出现次数
        self.df = {} # 存储每个词及出现了该词的文档数量
        self.idf = {} # 存储每个词的idf值
        self.k1 = 1.5
        self.b = 0.75
        self.init()

    def init(self):
        for doc in self.docs:
            tmp = {}
            for word in doc:
                tmp[word] = tmp.get(word, 0) + 1  # 存储每个文档中每个词的出现次数
            self.f.append(tmp)
            for k in tmp.keys():
                self.df[k] = self.df.get(k, 0) + 1
        for k, v in self.df.items():
            self.idf[k] = math.log(self.D-v+0.5)-math.log(v+0.5)

    def sim(self, doc, index):
        score = 0
        for word in doc:
            if word not in self.f[index]:
                continue
            d = len(self.docs[index])
            score += (self.idf[word]*self.f[index][word]*(self.k1+1)
                      / (self.f[index][word]+self.k1*(1-self.b+self.b*d
                                                      / self.avgdl)))
        return score

    # 总共有N篇文档,传来的doc为查询文档,计算doc与所有文档匹配
    # 后的得分score,总共有多少篇文档,scores列表就有多少项,
    # 每一项为doc与这篇文档的得分,所以分清楚里面装的是文档得分,
    # 不是词语得分。
    def simall(self, doc):
        scores = []
        for index in range(self.D):
            score = self.sim(doc, index)
            scores.append(score)
        return scores
View Code

 

六、应用示例

(1)python脚本

sortnovel.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

'''
作者:chl
时间:2017/11/24
用图:小说排序
'''

#调用到Django的model块
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "novel0.settings")# novel0 项目名称
django.setup()

import jieba
from search import utils
from search.bm25 import BM25
from novel.models import Novel

class Sortnovel(object):
    def __init__(self, docs):
        self.novels = Novel.objects.filter().order_by()
        self.sents = []     #所有原文档
        self.docs = []  #所有文档列表,词表示
        for novel in self.novels:
            sent = novel.novelname + ":" + novel.description
            self.sents.append(sent)
            docs.append(self.dealwords(sent))   #分词处理
        self.bm25 = BM25(docs)

    def top(self, query):
        print(self.dealwords(query))
        self.top = list(enumerate(self.bm25.simall(self.dealwords(query))))
        self.sorttop = sorted(self.top, key=lambda x: x[1], reverse=True) #排序,匿名函数
        i = 0
        self.list = list(map(lambda x: x[0], self.sorttop))
        print(self.list)    #输出序号
        searchtotal = object
        for index in self.list:     #输出id,书名,得分
            print(self.novels[index].novelid, self.novels[index].novelname, self.sorttop[i][1])
            i += 1
        return self.list

    def top1(self, query, limit = 10):
        print(self.dealwords(query))
        self.top = list(enumerate(self.bm25.simall(self.dealwords(query))))
        self.sorttop = sorted(self.top, key=lambda x: x[1], reverse=True) #排序,匿名函数
        i = 0
        self.list = list(map(lambda x: x[0], self.sorttop))[:limit]
        print(self.list)
        for index in self.list[:limit]:
            print(self.novels[index].novelid, self.novels[index].novelname, self.sorttop[i][1])
            i += 1
        return self.list

    def dealwords(self, sent):
        words = list(jieba.cut(sent))   #分词
        words = utils.filter_stop(words)    #过滤没意义的词
        return words


if __name__ == "__main__":
    docs = []
    s = Sortnovel(docs)
    print(s.sents)
    print(docs)
    print("f词频: ", s.bm25.f)      #谋篇文章中的词频
    print("df词频:    ", s.bm25.df)     #所有文章的词频
    print("idf权重:   ", s.bm25.idf)    #词的权重
    query = "一个理科男穿越到唐末,在这个英雄辈出的时代逍遥地生存下去。"
    # qwords = s.dealwords(query)     #查询语句
    print()
    s.top1(query, 5)
    print(s.top)
    print(s.sorttop)
View Code
结果:






 

 

 

 

 

 

注意:本脚本主要服务于我的Django程序,里面调用了Django的model块,本地数据库配置等等,不能直接copy,仅供参考学习。

这里提供一个过滤不重要词语的脚本utils.py。

utils.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

'''
作者:chl
时间:2017/11/23
用图:过滤垃圾词
'''

import os
import re
import codecs

stop_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'stopwords.txt')

stop = set()
fr = codecs.open(stop_path, 'r', 'utf-8')
for word in fr:
    stop.add(word.strip())
fr.close()
re_zh = re.compile('([\u4E00-\u9FA5]+)')


def filter_stop(words):
    return list(filter(lambda x: x not in stop, words))


def get_sentences(doc):
    line_break = re.compile('[\r\n]')
    delimiter = re.compile('[,。?!;]')
    sentences = []
    for line in line_break.split(doc):
        line = line.strip()
        if not line:
            continue
        for sent in delimiter.split(line):
            sent = sent.strip()
            if not sent:
                continue
            sentences.append(sent)
    return sentences
View Code

滤词文件:stopwords.txt

分词工具:https://pypi.python.org/pypi/jieba/

 

(2)Django运用

  views.py部分代码

#响应搜索页面
def search(request):
    global user
    request.encoding='utf-8'
    message = ""
    try:
        message = request.GET['kw']
    except Exception as e:
        print(e)
    finally:
        page = 1
        if request.GET.get("page"):
            page = int(request.GET.get("page"))
        if request.GET.get("kw1"):
            message = request.GET.get("kw1")

        if message[:4] == "BM25" or message[:4] == "bm25":
            # searchtotal =
            # print(docs)
            print("这是BM25算法----------------------------------------")
            print("查询语句 ", message[4:])
            stoplist = sortnovel.top(message[4:])
            searchtotal = []
            searchtotal1 = Novel.objects.filter().order_by()
            for inovel in stoplist:
                searchtotal.append(searchtotal1[inovel])
            del sortnovel.top   #这里必须要销毁这个list对象,否则第二次查询会出现'list' object is not callable错误,即list()情况。
        else:
            searchtotal = Novel.objects.filter(novelname__contains=message).order_by("novelid")
        novels = searchtotal[:10]
…   …
View Code
结果:

 

  搜索结果:

 

 

 

  后台显示:

 

七、体会与总结

搜索引擎非常重要,BM25算法只是其中的一个分支,机器语言和算法才是核心,加油吧!

 

八、参考

【1】[转]搜索引擎的文档相关性计算和检索模型(BM25/TF-IDF) - 优快云博客

http://blog.youkuaiyun.com/heiyeshuwu/article/details/43429447

【2】文本相似度-bm25算法原理及实现 - 简书

http://www.jianshu.com/p/1e498888f505

【3】BM25相关度打分公式 - 白帆mvp - 博客园

https://www.cnblogs.com/hdflzh/p/4034602.htm

 

转载于:https://www.cnblogs.com/chenhailing/p/7920192.html

python根据BM25实现文本检索 根据BM25实现文本检索 阅读详情

相关推荐

BM25算法基本使用以及在RAG中的应用

BM25算法被多种RAG开源框架和向量库的向量查询中提到或使用到。本文介绍BM25算法的基本原理,并通过一个可运行的例子来说明如何使用BM25算法。 BM25(Best Match 25)是一种用于信息检索的概率模型,常用于搜索引擎和问答系统中。在RAG(Retrieval-Augmented Generation)框架中,BM25用于从大规模文档库中检索与查询最相关的文档。 BM25基于词频(TF)和逆文档频率(IDF)计算文档与查询的相关性,结合了文档长度归一化,能够有效处理不同长度的文档。

zg_hover的专栏 2784

BM25算法,python实现(源代码)

python实现BM25算法,源代码

升级打怪记录 1894

【Lucene】搜索引擎和文档相关性评分 BM25 算法的工作原理

BM25 是一种流行的文本检索算法,广泛用于搜索引擎和文档相关性评分。它基于概率检索模型,旨在评估查询和文档之间的相关性。

weiliang_Handan的博客 1780

BM25检索算法 python

BM25(Best Matching 25)是一种经典的信息检索算法,是基于 TF-IDF算法的改进版本,旨在解决、TF-IDF算法的一些不足之处。其被广泛应用于信息检索领域的排名函数,用于估计文档D与用户查询Q之间的相关性。它是一种基于概率检索框架的改进,特别是在处理长文档和短查询时表现出色。BM25的核心思想是基于词频(TF)和逆文档频率(IDF)来,同时还引入了文档的长度信息来计算文档D和查询Q之间的相关性。目前被广泛运用的搜索引擎ES就内置了BM25算法进行全文检索。

消极的人永远是对的,积极的人选择勇往直前 5597

python排序算法的库_BM25检索排序算法变体实现汇总

Rank-BM25: A two line search engine A collection of algorithms for querying a set of documents and returning the ones most relevant to the query. The most common use case for these algorithms is, as ...

weixin_35677043的博客 1025

BM25S: 基于稀疏矩阵的超快速文本检索库

BM25S的出现为文本检索领域带来了一股新的活力。它不仅大幅提升了检索速度,还降低了系统资源需求,使得在各种环境下构建高性能检索系统成为可能。随着数据规模的不断增长和实时性要求的提高,BM25S无疑将在未来的信息检索应用中扮演越来越重要的角色。对于研究人员和工程师来说,BM25S提供了一个强大而灵活的工具,可以帮助他们更好地应对文本检索的挑战。无论是构建搜索引擎、问答系统,还是进行文本挖掘研究,BM25S都是一个值得考虑的选择。

2401_87458718的博客 1384

检索算法: BM25原理详解

简介 BM25算法常用来进行搜索。 输入问题Q0Q_0Q0​,在数据中去匹配其它Q时,可以用BM25进行排序。 "BM"其实就是指Best Matching。 BM25也称Okapi BM25。"Okapi"其实是第一个使用BM25进行检索的系统名字。 Function BM25其实代表着一个家族。这个家族里的式子互相之间可能会有一些成分、参数的差异,但它们同根同源。 这个家族里最常见的成员,它的写法是这样的: 其中: f(qi,D)f(q_i, D)f(qi​,D) 是qiq_iqi​在文档D中的Ter

狗狗狗大王的博客 4336

NLP之BM25:BM25算法的简介、相关库、案例应用之详细攻略

​ NLP之BM25:BM25算法的简介、相关库、案例应用之详细攻略 目录 BM25算法的简介 BM25算法的相关库 BM25算法的案例应用 BM25算法的简介 1、BM25算法的概述 背景 词项频率权重问题:传统的TF-IDF假定词项频率与相关性成正比,但实际上,当词项在文档中出现次数较多时,相关性得分并不线性增加。BM25通过使用平方根函数来更好地建模这种情况。 >> TF-IDF算法仅考虑了词项在文档中的出现次数,而没有考虑词项频率的增长对相关性的递减效果。例如,当一个词项在文

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 2033

深入理解信息检索之BM25算法

BM25作为经典的文本相关性评分算法,凭借其简单、高效和鲁棒性,在信息检索领域占据了重要地位。尽管存在一定的局限性,但通过改进和扩展,BM25能够适应更多复杂的场景需求。在现代搜索系统中,BM25依然是不可或缺的基础工具,同时与深度学习模型的结合也为未来的信息检索技术提供了更多可能性。

qq_45141261的博客 3347

基于Python Whoosh和BM25算法实现的问答系统

实际构建特征向量时,首先根据某个特征的所有取值构造对应该特征的一个特征词典,该词典中每一行对应一个特征项及其取值,行号表示该特征项的编号,对于特征项的取值采用布尔编码的方式,即该特征项出现则为1,否则为0。对于多个特征的编码,每个特征的特征项的取值方式完全相同,即均为布尔编码,但在对每个特征的特征项进行标号时要使得第二个特征的第一个特征项的编号要紧接着第一个特征的最后一个特征项的编号依次进行,第三个特征的第一个特征项的编号要紧接着第二个特征的最后一个特征项的编号依次进行,以此类推。得票最多的指派给X。

神仙别闹的自留地 1203

DeepSpeed Zero3 Offload实战:从GCC版本检查到环境配置的完整避坑指南

本文是一份针对DeepSpeed Zero3 Offload部署的完整避坑指南。针对训练中常见的`AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam`报错,文章深入剖析了其根源在于GCC编译器版本过低。指南提供了从系统GCC版本深度探查、安全启用高版本GCC环境,到DeepSpeed一致性安装验证的全链路实战方案,旨在帮助用户构建稳定的大模型训练环境。

weixin_29070721的博客 473

python 信息检索_Python实现内容检索子系统(BM25算法)

一、检索模型搜索引擎一般流程如下:从检索后面都属于检索模型的范畴。搜索结果排序是搜索引擎最核心的部分,很大程度度上决定了搜索引擎的质量好坏及用户满意度。实际搜索结果排序的因子有很多,但最主要的两个因素是用户查询和网页内容的相关度,以及网页链接情况。这里主要介绍网页内容和用户查询相关的内容。判断网页内容是否与用户査询相关,这依赖于搜索引擎所来用的检索模型。检索模型是搜索引擎的理论基础,为量化相关性提...

weixin_39687189的博客 959

Unity手游优化实战:用GPU Instancing把草地渲染的DrawCall从8000降到20(附完整Shader)

本文详细介绍了Unity手游中利用GPU Instancing技术优化草地渲染的实战方法,将DrawCall从8000降至20。通过Shader改造和性能优化技巧,开发者可以在移动端实现高效渲染,显著提升游戏性能。文章包含完整的Shader代码和优化策略,适合Unity开发者学习应用。

weixin_33691817的博客 488

稀疏检索代表算法BM25

BM25 是一种基于词频和文档长度的相关性评分算法。它通过计算查询词与文档的匹配程度,评估文档与查询的相关性。BM25 的核心思想是:词频(TF):查询词在文档中出现的频率越高,相关性越高。逆文档频率(IDF):查询词在整个文档集合中出现的频率越低,其区分能力越强,相关性越高。文档长度:较短的文档更容易与查询匹配,因此需要对文档长度进行归一化处理。

Autumn_horse的博客 1184

Moveit Servo学习

MoveIt Servo功能与配置指南 摘要:本文介绍了MoveIt Servo的功能特性,包括支持关节速度、末端执行器速度和位置控制,以及安全功能如奇点检查、碰撞检测等。通过示例展示了如何运行伺服控制demo,详细解析了关键节点和话题。最后以睿尔曼rml_63机器人为例,讲解了如何自定义伺服配置文件,包括环境设置、输入输出参数配置、平滑滤波器和规划场景监控等关键配置项。文章提供了从基础使用到自定义机器人配置的完整指导,帮助开发者实现高效的实时运动控制。

Fisher的博客 1173

Podman修改镜像源教程(附最新docker镜像源)

Podman修改镜像源教程(附最新docker镜像源)

道长的博客 4140

[论文笔记]BM25S:Python打造超越RANK-BM25的实现

首先介绍了一种新的计算 BM25 分数的方法,速度远超RANK-BM25(BM25Okapi)。最后通过代码实战中文上的表现。

日积月累,天道酬勤 4750

Ubuntu18.04环境搭建与疑难解析:从零复现YOLO-6D姿态估计算法

本文详细介绍了在Ubuntu18.04环境下从零开始复现YOLO-6D姿态估计算法的完整流程,包括系统配置、Conda环境搭建、PyTorch安装、依赖项管理、源代码获取、数据集准备以及训练验证过程。针对Singleshotpose算法的特殊需求,提供了详细的疑难解析和性能优化技巧,帮助开发者高效完成算法复现和应用部署。

weixin_30369041的博客 452

BM25(Best Matching 25)算法基本思想

BM25(Best Matching 25)是一种用于信息检索(Information Retrieval)和文本挖掘的算法,它被广泛应用于搜索引擎和相关领域。BM25 基于 TF-IDF(Term Frequency-Inverse Document Frequency)的思想,但对其进行了改进以考虑文档的长度等因素。

NLP工程化 8669

微信小程序一键登录和临时code用JWT进行微信用户授权

2、跨域进行调用接口时候,唯一标识UnionID和会话密钥 session_key如果还是用的我自己的,会出现无法调用微信服务器接口,就需要将唯一标识和会话密钥换成前端的,才可以,我自己认为这样很不合理,暂时还没有找到原因。2、能够获取到openId,但是也只能获取到openid,无法获取用户的相关信息,经过查阅官网发现,现在微信那边已经将用户信息加密,需要调用提供的接口进行解密然后获取用户数据,问题原因已经找到解决方法,还未即使更改。1、我这是一台电脑实现的前端调用后端接口,不用考虑跨域的问题。

qq_67653492的博客 5711

从时频谱图到智能感知:雷达信号处理的AI进化之路

本文探讨了人工智能在雷达信号处理中的革命性应用,特别是深度学习在时频谱图分析中的突破性进展。通过对比传统信号处理方法与AI驱动的解决方案,展示了CNN、3D CNN等模型在目标检测、行为识别等场景中的优势,并分析了数据获取、模型优化等关键技术挑战。AI赋能的雷达技术已广泛应用于智能交通、工业检测和医疗健康领域,展现出巨大的发展潜力。

weixin_29284201的博客 504

如何用BM25S⚡实现极速文本检索?纯Python的终极优化方案

BM25S是一款基于Scipy稀疏矩阵的纯Python BM25算法实现,旨在为文本检索任务提供超快速的文档排序能力。作为信息检索领域的核心工具,它能帮助开发者轻松构建高性能的搜索服务,比传统方案提速**10-1000倍**???? ## ???? 为什么选择BM25S?三大核心优势 ### 1. 闪电般的检索速度 BM25S采用预计算稀疏矩阵存储文档得分,在查询时无需重复计算,直接实现毫秒级响应。...

gitblog_00391的博客 1129

ultralytics.data.utils——utils.py子模块代码详读

ultralytics.data.utils——utils.py子模块代码详读

Together_CZ的博客 1719

BM25 算法

BM25 是一个强大、实用且高效的排序算法,它通过结合词频、逆文档频率和文档长度归一化,为搜索查询和文档的相关性提供了一个鲁棒且可靠的评分机制。它是理解和构建现代搜索系统不可或缺的基础知识。

ruanchao的专栏 1098

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【搜索核心技术】经典搜索核心算法:BM25及其变种

上篇介绍了TF-IDF算法和它的四个变种,相对于TF-IDF而言,在信息检索和文本挖掘领域,BM25算法则更具理论基础,而且是工程实践中当仁不让的重要基线(Baseline)算法。BM25在20世纪70年代到80年代被提出,到目前为止已经过去二三十年了,但是这个算法依然在很多信息检索的任务中表现优异,是很多工程师首选的算法之一。本篇将谈谈BM25算法的历史、算法本身的核心概念以及BM25的一些重要变种,快速掌握这个信息检索和文本挖掘的利器。

木亦汐丫 4483

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

10分钟上手rank_bm25:Python文本检索库的快速入门指南

rank_bm25是一个基于Python的BM25算法集合,专为文本检索和相关性排序设计。本文将带你快速掌握这个强大工具的核心功能,从安装到实际应用,让你在10分钟内构建起自己的文本搜索系统。 ## 📦 超简单安装步骤 安装rank_bm25只需一行命令,确保你的环境中已安装Python和pip: ```bash pip install rank_bm25 ``` 如果需要最新开发版本,

gitblog_01168的博客 994

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: HTML5简介--学习笔记1
ablu56590
博客等级 码龄12年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值