Python【极简】搜索引擎+倒排索引

利用gensim生成词袋模型(基于频次和基于TF-IDF) 利用gensim快速生成词袋模型,其实也可以用来计算TF-IDF值。 阅读详情

搜索引擎

TF-IDF

from gensim.corpora import Dictionary
from gensim.models import TfidfModel
from gensim.similarities import SparseMatrixSimilarity
from numpy import argsort

# 读取地址集
with open('中国行政区划.txt', encoding='utf-8') as f:
    texts = f.read().split()

# 建模
corpora = [list(text) for text in texts]
dictionary = Dictionary(corpora)
num_features = len(dictionary.token2id)
corpora = [dictionary.doc2bow(c) for c in corpora]
tfidf = TfidfModel(corpora)
index = SparseMatrixSimilarity(tfidf[corpora], num_features)

# 搜索
while True:
    kw = input('输入:').strip()
    kw_vec = dictionary.doc2bow(list(kw))
    sim = index[tfidf[kw_vec]]
    ids = argsort(-sim)[:5]  # 索引排序,返回前5
    for i in ids:
        print(texts[i])

效果

Word2Vec

import numpy as np
from gensim.models import Word2Vec
from sklearn.metrics.pairwise import cosine_similarity

# 配置
PATH = '中国行政区划.txt'
size = 100

# 读取地址集
with open(PATH, encoding='utf-8') as f:
    texts = f.read().split()

# 建模
corpora = [list(text) for text in texts]
model = Word2Vec(corpora, size)
w2i = {w: i for i, w in enumerate(model.wv.index2word, 1)}
vectors = np.concatenate((np.zeros((1, size)), model.wv.vectors), axis=0)
w2v = lambda w: vectors[w2i.get(w, 0)]  # word to vector
# s2v = lambda s: np.mean([w2v(w) for w in s], axis=0)  # sentence to vector
s2v = lambda s: np.sum([w2v(w) for w in s], axis=0)  # sentence to vector
corpora = np.array([s2v(words) for words in corpora])

# 搜索
while True:
    kw = input('输入:').strip()
    kw_vec = [s2v(kw)]
    top_idxs = cosine_similarity(corpora, kw_vec).reshape(-1)
    top_idxs = np.argsort(-top_idxs)[:5]  # 索引排序,返回前5
    for i in top_idxs:
        print(texts[i])

效果

Word2Vec+TF-IDF

import numpy as np
from gensim.models import TfidfModel, Word2Vec
from collections import Counter
from sklearn.metrics.pairwise import cosine_similarity

# 配置
PATH = '中国行政区划.txt'
size = 100
min_count = 1

# 数据准备
with open(PATH, encoding='utf-8') as f:
    texts = f.read().split()
corpora = [list(text) for text in texts]

# 词向量模型
word2vec = Word2Vec(corpora, size, min_count=min_count)
w2i = {w: i for i, w in enumerate(word2vec.wv.index2word, 1)}
vectors = np.concatenate((np.zeros((1, size)), word2vec.wv.vectors), axis=0)

# TF-IDF模型
tfidf = TfidfModel([Counter(w2i[w] for w in words).most_common() for words in corpora])
idfs = np.array([[tfidf.idfs.get(i, 0)] for i in range(len(w2i) + 1)])

# 词向量+TfIdf
vectors = vectors * idfs

# 句向量
w2v = lambda w: vectors[w2i.get(w, 0)]  # word to vector
s2v = lambda s: np.mean([w2v(w) for w in s], axis=0)  # sentence to vector
# s2v = lambda s: np.sum([w2v(w) for w in s], axis=0)  # sentence to vector

# 创建被检索文本
corpora = np.array([s2v(words) for words in corpora])

# 搜索
while True:
    kw = input('输入:').strip()
    kw_vec = [s2v(kw)]
    top_idxs = cosine_similarity(corpora, kw_vec).reshape(-1)
    top_idxs = np.argsort(-top_idxs)[:5]  # 索引排序,返回前5
    for i in top_idxs:
        print(texts[i])

效果

倒排索引

创建倒排索引,优化检索效率

"""被检索文档"""
docs = {
    'a', 'aa', 'aaa', 'aab', 'aac', 'ab', 'aba', 'abb', 'abc', 'ac', 'aca', 'acb', 'acc',
    'b', 'ba', 'baa', 'bab', 'bac', 'bb', 'bba', 'bbb', 'bbc', 'bc', 'bca', 'bcb', 'bcc',
    'c', 'ca', 'caa', 'cab', 'cac', 'cb', 'cba', 'cbb', 'cbc', 'cc', 'cca', 'ccb', 'ccc'
}

"""倒排索引"""
inverted = {w: {i for i in docs if w in i} for w in 'abc'}
# inverted = {
#     'a': {'a', 'aa', 'aaa', 'aab', 'aac', 'ab', 'aba', 'abb', 'abc', 'ac', 'aca', 'acb', 'acc',
#           'ba', 'baa', 'bab', 'bac', 'bba', 'bca', 'ca', 'caa', 'cab', 'cac', 'cba', 'cca'},
#     'b': {'aab', 'ab', 'aba', 'abb', 'abc', 'acb', 'b', 'ba', 'baa', 'bab', 'bac', 'bb', 'bba',
#           'bbb', 'bbc', 'bc', 'bca', 'bcb', 'bcc', 'cab', 'cb', 'cba', 'cbb', 'cbc', 'ccb'},
#     'c': {'aac', 'abc', 'ac', 'aca', 'acb', 'acc', 'bac', 'bbc', 'bc', 'bca', 'bcb', 'bcc',
#           'c', 'ca', 'caa', 'cab', 'cac', 'cb', 'cba', 'cbb', 'cbc', 'cc', 'cca', 'ccb', 'ccc'}
# }


def search(kw):
    s = set(docs)  # 全集
    for w in set(kw):
        s &= inverted[w]  # 求交集
    return s


while True:
    kw = input('输入任意abc组合:').strip()
    print(search(kw))

时间复杂度比较

from time import time


def timer(f, kw, times=99999):
    """时间复杂度计算"""
    t = time()
    for _ in range(times):
        f(kw)
    print('%.2f秒' % (time() - t), f.__doc__)


"""创建被检索文档"""
dt = {0: 'a', 1: 'b', 2: 'c'}
docs = set()
for i in range(3):
    docs.add(dt[i])
    for j in range(3):
        docs.add(''.join([dt[i], dt[j]]))
        for k in range(3):
            docs.add(''.join([dt[i], dt[j], dt[k]]))
print(len(docs), docs)
# docs = {
#     'a', 'aa', 'aaa', 'aab', 'aac', 'ab', 'aba', 'abb', 'abc', 'ac', 'aca', 'acb', 'acc',
#     'b', 'ba', 'baa', 'bab', 'bac', 'bb', 'bba', 'bbb', 'bbc', 'bc', 'bca', 'bcb', 'bcc',
#     'c', 'ca', 'caa', 'cab', 'cac', 'cb', 'cba', 'cbb', 'cbc', 'cc', 'cca', 'ccb', 'ccc'
# }

"""倒排索引"""
inverted = {w: {i for i in docs if w in i} for w in 'abc'}
print(inverted)
# inverted = {
#     'a': {'a', 'aa', 'aaa', 'aab', 'aac', 'ab', 'aba', 'abb', 'abc', 'ac', 'aca', 'acb', 'acc',
#           'ba', 'baa', 'bab', 'bac', 'bba', 'bca', 'ca', 'caa', 'cab', 'cac', 'cba', 'cca'},
#     'b': {'aab', 'ab', 'aba', 'abb', 'abc', 'acb', 'b', 'ba', 'baa', 'bab', 'bac', 'bb', 'bba',
#           'bbb', 'bbc', 'bc', 'bca', 'bcb', 'bcc', 'cab', 'cb', 'cba', 'cbb', 'cbc', 'ccb'},
#     'c': {'aac', 'abc', 'ac', 'aca', 'acb', 'acc', 'bac', 'bbc', 'bc', 'bca', 'bcb', 'bcc',
#           'c', 'ca', 'caa', 'cab', 'cac', 'cb', 'cba', 'cbb', 'cbc', 'cc', 'cca', 'ccb', 'ccc'}
# }


def search1(kw):
    """直接检索"""
    s = set()
    kw = set(kw)
    for i in docs:  # 先遍历docs
        for w in kw:
            if w in i:  # 此处求并集
                s.add(i)
    return s


def search2(kw):
    """使用倒排索引来检索"""
    s = set()
    for w in set(kw):
        s |= inverted[w]
    return s


while True:
    kw = input('输入任意abc组合:').strip()
    timer(search1, kw)
    timer(search2, kw)

在这里插入图片描述

图解

附录

相关基础知识:TFIDF的文本相似度gensim实现
https://blog.youkuaiyun.com/Yellow_python/article/details/81021142
语料下载地址:
https://download.youkuaiyun.com/download/yellow_python/11064982
Python实现网站爬虫与倒排索引搜索引擎 搜索引擎的核心技术包括网络爬虫和倒排索引两大模块。网络爬虫通过HTTP请求获取网页内容,使用HTML解析器提取文本数据;倒排索引则是将文档中的单词映射到其出现位置的数据结构,大幅提升检索效率。Python生态中的Requests和BeautifulSoup库为爬虫开发提供了强大支持,而字典数据结构天然适合构建内存中的倒排索引。这种技术组合在教育场景和中小型搜索应用中具有显著优势,既能帮助学生理解搜索引擎原理,也能快速构建原型系统。本方案以quotes.toscrape.com为例,展示了从页面爬取、文本处理 阅读详情

相关推荐

python实现搜索引擎

【代码】python实现搜索引擎。

weixin_44772948的博客 502

基于python的新闻搜索引擎设计与实现

21世纪的今天互联网信息技术飞速发展,各类信息充斥着互联网,如何有效的进行信息的搜集整理成为了一个非常重要的课题。网络爬虫就是实现自动搜索互联网中的各种信息的程序,本系统通过定向的对新闻网站相关的信息进行采集分析与展示。运用计算机图形学及影像处理高新技术,数字可视化能够以图像的形式展现给用户,从而让用户能够轻松地获取、分析、掌握、应用相关的知识。它不仅能够帮助用户快速、准确地获取所需的资讯,还能够让用户能够轻松地了解到所需的信息,从而提升用户的工作效率。

yvonneking1118的博客 2709

ElasticSearch倒排索引原理与代码实例讲解

1.背景介绍 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。ElasticSearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

AI天才研究院 959

Python实战之手写一个搜索引擎

这篇文章,我们将会尝试从零搭建一个简单的新闻搜索引擎当然,一个完整的搜索引擎十分复杂,这里我们只介绍其中最为核心的几个模块分别是数据模块、排序模块和搜索模块,下面我们会逐一讲解,这里先从宏观上看一下它们之间的工作流程。。

2301_80239908的博客 2115

将Apollo高精地图中的车道线叠加在多种导航地图上

本文介绍了将Apollo高精地图车道线叠加到普通导航地图的技术方案。高精地图具备厘米级车道精度和丰富的语义信息,叠加可实现可视化验证、调试分析和数据对比等功能。核心技术包括坐标系统转换(UTM/WGS84/BD09/GCJ02)和数据处理流程,通过Python脚本完成Apollo地图解析、坐标批量转换和多格式输出。文章详细提供了环境准备、工作目录创建和坐标转换脚本等操作步骤,实现了高精地图数据在OpenStreetMap、百度地图和高德地图上的可视化展示。

Hi20240217的博客 1336

SAP MM 物料描述MAKTX 40个字符不够用的问题处理

SAP物料描述表,长度40个字符一般情况下,40个字符在描述中也够用了,但是要加上规格之类的额外描述就不一定了,特别是对于辅助件-刀具。解决方案一:对maktx增强,换成CHAR80或者CHAR100的,但是风险较大,涉及到好多地方,另外SAP+ 算号器 也不支持。解决方案二:增强字段。内部顾问,建议在 那就在这里加一个字段,具体过程如下:1、创建域2、创建架构3、附加架构4、GUI 设置 5、后台设置6、MASS/MM17字段新增。过程1、创建域 SE112、创建结构 se11 3、MARA附加架构

GAVIN 4732

三十岁了从零开始学python还有前途吗?很迷茫啊

对于学习这件事,我一直认为没有时间先后,啥时候学习都不晚,不管你现在年龄多大,只要有心想学习,一切都好说。 首先,你要学的python是属于技术类的知识,对于喜欢搞技术的朋友来说,到书店或图书馆选一本有关python的资料书,然后自己制定一个详细的学习计划,然后带着问题去阅读,你会发现这样学起来真的很轻松; 其次,明白了里面的原理,那就必须上手去操作,只有通过验证,才能理解在学习中遇到的那些晦涩难通的概念与执行原理。 当然每个人看书学习的方式与效率不同,要根据自己的情况总结出适合自己的方式,只有掌握了看不

JAVAmonster12的博客 1899

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)

最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。

weixin_60991529的博客 6244

Python实战:在搜索引擎开发中的倒排索引与检索算法

本文详细介绍了使用Python构建搜索引擎的过程,包括倒排索引的构建、检索算法的实现、搜索引擎的评估和优化。我们通过一个简单的例子展示了如何将这些技术结合起来,创建一个能够处理用户查询并返回相关文档的搜索引擎。然而,实际的搜索引擎开发要复杂得多,涉及到分布式计算、大数据处理、机器学习等多个领域的技术。在实际开发中,我们还需要考虑如何处理海量数据,如何提高系统的并发能力和可用性,如何应对恶意攻击和垃圾信息等问题。此外,随着技术的发展,搜索引擎也在不断地引入新的技术和算法,以提高搜索质量和用户体验。

oandy0的博客 3132

71、CAN总线双绞线绞距与抗共模干扰的定量关系

摘要:本文探讨了CAN总线双绞线绞距与抗共模干扰的定量关系。通过理论推导得出共模电压与绞距平方成正比,绞距越小抑制效果越好。工程实践表明,工业现场推荐绞距不超过30mm,高频干扰场景需优先优化绞距。实测数据验证了绞距均匀性的重要性,建议控制在15-25mm范围,安装时保持绞合结构完整。案例显示,将绞距从50mm改为15mm后,共模干扰从12V降至1.8V,有效解决了CAN通信问题。绞距选择需兼顾理论计算与现场实测,同时注意与屏蔽层的协同设计。

2401_88858637的博客 189

最新Python爬虫实战(入门爬虫篇)——案例16:2345天气网城市天气预报数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过 Python 爬虫技术,成功实现了对 2345 天气网城市 15 天天气预报数据的批量爬取与 Excel 保存。代码采用模块化设计,包含网页请求、HTML 解析、数据清洗、Excel 持久化等完整流程;通过配置模拟浏览器的请求头,有效规避基础反爬策略,保证请求的稳定性。整个爬虫逻辑遵循 “网页请求 → HTML 解析 → 提取天气信息 → 保存到 Excel” 的标准流程,与静态网页爬取范式高度一致。

努力让自己发光,对的人才能迎着光而来 10万+

python 实现倒排索引,建立简单的搜索引擎

本文将用python实现倒排索引 如下,一个数据表docu_set中有三篇文章的,d1,d2,d3,如下 docu_set={'d1':'i love shanghai', 'd2':'i am from shanghai now i study in tongji university', 'd3':'i am from lanzhou now i stu...

luoganttcc的博客 1万+

ABAP Cloud define table 里的 not null 究竟在约束什么?——语义、场景与可运行示例

ABAP Cloud 中 not null 与 NULL 的用法解析 本文探讨了 ABAP Cloud 中 not null 关键字的语义与使用场景,对比了传统 ABAP 与 ABAP Cloud 在表字段定义上的差异: 核心概念 not null 是数据库层的列约束,强制字段不能存储 NULL 值 ABAP Cloud 通过 DDL 显式声明列是否允许 NULL,HANA 上 CDS 表默认创建为 NOT NULL 使用建议 主键、外键、审计字段等必须使用 not null 业务上可缺失的字段(如批准日期

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 302

elasticsearch以及其中倒排索引理解搜索引擎

倒排索引的介绍:倒排索引实际上由于应用中需要根据属性值来查找记录,这种索引表中的每一项都包含一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称之为倒排索引(inverted index),带有倒排索引的文件称之为倒排索引文件,简称倒排文件。比如说我们接下来要搜索下面的这句话: “python写各大聊天系统的屏蔽脏话功能原理” 于是根据搜索引擎

ChasingdreamLY的博客 1934

Hermes Agent 安装部署完全指南

Hermes Agent安装部署指南提供了两种安装方式:一键脚本安装和手动分步安装。该AI助手支持多平台运行(Linux/macOS/WSL2),核心功能仅需Git作为前置依赖,其他依赖如Python、Node.js等均由安装脚本自动处理。文档详细介绍了系统要求、依赖管理、配置目录结构、环境变量设置以及10个手动安装步骤,并提供了功能模块化选项,用户可根据需求选择安装语音交互、浏览器自动化等扩展功能。安装完成后可通过hermes doctor命令验证环境,并通过交互式向导完成初始化配置。

简简单单Onlinezuozuo 2632

机器人中的数值优化(一)—— 数学优化、凸集合与凸函数

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例。

慕羽★的博客 2521

Python 解析 Elasticsearch 的倒排索引与查询优化

倒排索引是一种数据结构,用于快速查找文档中包含特定词项的集合。简单来说,它是从词项到文档的映射。在 Elasticsearch 中,每个字段都可以被索引为倒排索引。例如,如果你有一个包含文章的索引,每篇文章中的单词都会被记录下来,并且会指向包含这些单词的文章。文章 1: "Python is a great programming language."文章 2: "Elasticsearch is powerful for searching.""a": [1]"for": [2]

2501_91163496的博客 750

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python倒排索引搜索引擎_【Python】倒排索引

代码链接预处理word stemming一个单词可能不同的形式,在英语中比如动词的主被动、单复数等。比如live\lives\lived.虽然英文的处理看起来已经很复杂啦但实际在中文里的处理要更加复杂的多。stop words比如a、the这种词在处理的时候没有实际意义。在这里处理的时候先对词频进行统计,人为界定停词,简单的全部替换为空格。但是这种方式并不适用于所有的情况,对于比如,To be o...

weixin_39645343的博客 642

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

倒排索引 vs 正向索引:搜索引擎的核心技术揭秘

本文深入解析搜索引擎核心技术——倒排索引与正向索引的区别及应用。正向索引以文档为中心,适合主键查询但搜索效率低;倒排索引以词项为中心,能快速定位关键词所在文档,是搜索引擎实现毫秒级响应的关键。文章通过对比表格、结构图解和Python代码实现(包含正向/倒排索引构建及搜索功能),直观展示了两者的差异:正向索引类似"书正文",倒排索引如同"目录"。倒排索引虽存储开销大,但支持O(1)时间复杂度的高效关键词检索,广泛应用于搜索引擎和全文检索系统。

IT之一小佬的博客 1010

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python用字典实现倒排索引_【搜索引擎】3-ES读写读取过程和原理,倒排索引介绍...

先简单说一下过程,再说原理一、ES写入数据过程1、客户端随机选择一个 node 发送请求,这个 node 就是 coordinating node(协调节点)2、coordinating node 对 document 进行路由,将请求转发到该索引的 primary shard 的 node 上3、primary shard 所在的 node 处理请求,存储数据,然后把数据同步到它的 replic...

weixin_39608134的博客 325

python倒排索引实现_Elasticsearch中的倒排索引

前言再Elasticsearch创建索引流程一文中,介绍了ES创建索引的流程。再流程中是调用Lucene的接口来创建索引的。本篇文章主要介绍ES中的索引——倒排索引分词在创建索引之前,会对文档中的字符串进行分词。ES中字符串有两种类型,keyword和text。keyword类型的字符串不会被分词,搜索时全匹配查询text类型的字符串会被分词,搜索时是包含查询不同的分词器对相同字符串分词的结果大有...

weixin_39620679的博客 642

ElasticSearch 倒排索引完全指南:原理、实现与优化

ElasticSearch 倒排索引指南 本文深入讲解了ElasticSearch倒排索引的原理与实现。倒排索引通过"词项→文档"的映射关系,解决了传统"文档→内容"查询的效率问题。核心内容包括: 倒排索引结构:由词典(Term Dictionary)和倒排列表(Posting List)组成,包含词项、文档ID、词频和位置等信息 构建过程: 文档输入 文本分析(分词、归一化) 构建词典和倒排列表 索引压缩存储(跳表、FOR压缩等) 查询机制:通过分词、布尔运算和BM

IT之一小佬的博客 1247

python倒排索引搜索引擎_python 实现倒排索引,建立简单的搜索引擎

本文将用python实现倒排索引如下,一个数据表docu_set中有三篇文章的,d1,d2,d3,如下docu_set={'d1':'i love shanghai','d2':'i am from shanghai now i study in tongji university','d3':'i am from lanzhou now i study in lanzhou university...

weixin_39675679的博客 390

python倒排索引搜索引擎_python 实现倒排索引

代码如下:#encoding:utf-8fin = open('1.txt', 'r')'''建立正向索引:“文档1”的ID > 单词1:出现位置列表;单词2:出现位置列表;…………“文档2”的ID > 此文档出现的关键词列表。'''forward_index = {}for line in fin:line = line.strip().split()forward_index[in...

weixin_39854730的博客 499
上一篇: Keras【自用命名规范】及【函数式API】
下一篇: TensorFlow【极简】序列预测
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值