当前位置: 首页 > article >正文

手把手教你用Python给本地文档集建个‘迷你搜索引擎’(基于倒排索引与布尔查询)

手把手教你用Python给本地文档集建个‘迷你搜索引擎’基于倒排索引与布尔查询在信息爆炸的时代如何快速从海量文档中找到所需内容本文将带你用Python从零构建一个针对本地TXT/Markdown文档的迷你搜索引擎。无需依赖Elasticsearch等重型工具仅用标准库和基础数据结构就能实现支持AND/OR/NOT查询的布尔检索系统。1. 环境准备与文档预处理首先创建项目目录建议结构如下mini_search_engine/ ├── docs/ # 存放待索引的TXT/Markdown文档 ├── stopwords.txt # 停用词表 └── search_engine.py # 主程序文件文本预处理是搜索引擎的基础工作主要包括以下步骤import os import re from collections import defaultdict def tokenize(text): 将文本拆分为词项token return re.findall(r\w, text.lower()) # 简单分词实际项目需处理连字符等 def remove_stopwords(tokens, stopwords): 过滤停用词 return [t for t in tokens if t not in stopwords] def load_stopwords(filepath): 加载停用词表 with open(filepath) as f: return set(line.strip() for line in f)预处理流程示例读取文档内容统一转为小写大小写不敏感分词英文按空格中文需分词器去除标点符号过滤停用词如the, a等提示中文处理推荐使用jieba分词库英文需注意词干还原如running→run2. 构建倒排索引数据结构倒排索引是搜索引擎的核心其本质是词项→文档的映射关系。Python中用字典实现非常合适class InvertedIndex: def __init__(self): self.index defaultdict(list) # 倒排索引 {词项: [文档ID列表]} self.doc_ids [] # 文档ID到路径的映射 self.doc_lengths [] # 各文档的词项数量可用于后续扩展 def add_document(self, doc_id, tokens): 将文档加入索引 token_counts defaultdict(int) for token in tokens: token_counts[token] 1 for token, count in token_counts.items(): self.index[token].append((doc_id, count)) self.doc_ids.append(doc_id) self.doc_lengths.append(len(tokens))索引构建过程遍历所有文档对每个文档进行预处理统计词项频率TF更新倒排索引索引优化技巧对文档ID列表排序便于后续合并操作存储词项频率可用于结果排序使用内存友好的数据结构如数组而非链表3. 实现布尔查询算法布尔查询的核心是对倒排表的集合操作。以下是AND查询的实现def intersect_lists(list1, list2): 求两个有序列表的交集AND操作 result [] i j 0 while i len(list1) and j len(list2): doc1, _ list1[i] doc2, _ list2[j] if doc1 doc2: result.append(doc1) i 1 j 1 elif doc1 doc2: i 1 else: j 1 return result同理可实现OR和NOT操作操作类型算法描述时间复杂度AND多指针顺序扫描取共同文档O(nm)OR归并多个列表去重O(nm)NOT需指定全集然后做差集O(n)查询优化策略优先合并最短的倒排表减少比较次数支持查询缓存对热门词项提前终止机制当不可能再有匹配时4. 构建命令行交互界面最后实现用户友好的CLI界面def parse_query(query): 解析布尔查询表达式如 python AND (tutorial OR guide) # 实现简单的语法解析 pass def search(index, query): 执行搜索并返回结果 tokens tokenize(query) # 处理布尔逻辑 return [] def main(): index InvertedIndex() stopwords load_stopwords(stopwords.txt) # 构建索引 for doc_path in os.listdir(docs): with open(fdocs/{doc_path}) as f: text f.read() tokens remove_stopwords(tokenize(text), stopwords) index.add_document(doc_path, tokens) # 交互循环 while True: query input(Search ) if query.lower() quit: break results search(index, query) print(fFound {len(results)} documents:) for doc in results: print(f- {doc})功能扩展建议支持短语查询exact match添加结果排序按相关度实现拼写纠正did you mean?添加高亮显示匹配词项5. 性能优化与扩展方向当文档量增长时需要考虑以下优化内存优化技术使用更紧凑的数据结构如数组而非对象实现分片索引按字母范围分割压缩存储文档ID差值编码可变字节编码def delta_encode(doc_ids): 文档ID差值编码 prev 0 encoded [] for doc_id in sorted(doc_ids): encoded.append(doc_id - prev) prev doc_id return encoded持久化方案将索引序列化到磁盘pickle/protobuf实现增量索引更新考虑使用数据库存储SQLite/LevelDB高级功能扩展添加TF-IDF权重计算实现模糊搜索Levenshtein距离支持同义词扩展查询添加简单的PageRank式文档评分这个迷你搜索引擎虽然简单但涵盖了现代搜索引擎的核心概念。在实际项目中当数据量超过百万文档时建议考虑专业解决方案如Elasticsearch。但对于个人文档库或小型项目这个Python实现已经能提供不错的搜索体验。

相关文章:

手把手教你用Python给本地文档集建个‘迷你搜索引擎’(基于倒排索引与布尔查询)

手把手教你用Python给本地文档集建个‘迷你搜索引擎’(基于倒排索引与布尔查询) 在信息爆炸的时代,如何快速从海量文档中找到所需内容?本文将带你用Python从零构建一个针对本地TXT/Markdown文档的迷你搜索引擎。无需依赖Elasticse…...

别再只盯着AUC了!临床预测模型评估新宠NRI和IDI,手把手教你用R语言实战解读

临床预测模型评估进阶:NRI与IDI的实战解读与R语言实现 在临床预测模型的研究中,我们常常陷入一个思维定式——将AUC(曲线下面积)视为评估模型性能的黄金标准。然而,当两个模型的AUC差异仅为0.02或0.03时,我们真的能自信地说新模型…...

Phi-4-mini-reasoning 3.8B 3分钟快速调用演示:一行代码启动推理服务

Phi-4-mini-reasoning 3.8B 3分钟快速调用演示:一行代码启动推理服务 1. 开箱即用的推理体验 如果你正在寻找一个既轻量又强大的语言模型,Phi-4-mini-reasoning 3.8B可能会让你眼前一亮。这个3.8B参数的模型在保持小巧体积的同时,展现出了令…...

40+个Dynare模型:从理论到实践的宏观经济研究宝库 [特殊字符]

40个Dynare模型:从理论到实践的宏观经济研究宝库 🚀 【免费下载链接】DSGE_mod A collection of Dynare models 项目地址: https://gitcode.com/gh_mirrors/ds/DSGE_mod 你是否曾经在阅读顶级经济学期刊时,对那些复杂的动态随机一般均…...

Hyperf方案 LDAP/AD 企业登录集成

用 directorytree/ldaprecord 最好,下面完整实现:tive Directory 2025")---核心思路 ↓ 196 tokens)用户输入…...

别再让报表卡死了!手把手教你用PowerBI性能分析器揪出慢查询元凶

别再让报表卡死了!手把手教你用PowerBI性能分析器揪出慢查询元凶 每次打开报表都要等上几分钟?筛选器一拖就卡死?作为资深PowerBI用户,我完全理解这种痛苦。上周刚帮一家零售企业解决了他们的月度销售报表问题——原本需要3分钟加…...

如何高效获取B站视频的15维数据?Bilivideoinfo一站式解决方案

如何高效获取B站视频的15维数据?Bilivideoinfo一站式解决方案 【免费下载链接】Bilivideoinfo Bilibili视频数据爬虫 精确爬取完整的b站视频数据,包括标题、up主、up主id、精确播放数、历史累计弹幕数、点赞数、投硬币枚数、收藏人数、转发人数、发布时间…...

从C++源码到Python调用:手把手教你用CMake和ctypes打包一个跨平台可用的DLL

从C源码到Python调用:构建跨平台DLL的工程化实践 当我们需要将高性能的C模块暴露给Python调用时,动态链接库(DLL/SO)是最常见的桥梁。但许多开发者往往在最后一步——Python调用环节才意识到问题,此时调试成本已大幅增…...

从洛谷P1996约瑟夫问题实战出发:手把手调试C语言循环链表,解决内存泄漏与指针越界

从洛谷P1996约瑟夫问题实战出发:手把手调试C语言循环链表,解决内存泄漏与指针越界 约瑟夫环问题作为数据结构与算法中的经典案例,常被用来考察程序员对循环链表和指针操作的掌握程度。但真正在工程实践中实现一个健壮的约瑟夫环解决方案&…...

别再一帧帧看视频了!用MS-TCN++搞定厨房早餐动作自动分割(附Breakfast数据集实战)

用MS-TCN实现厨房早餐视频的智能动作分割:从数据准备到模型部署全流程 清晨的厨房里,煎蛋的滋滋声、面包机的弹出声、咖啡机的蒸汽声交织在一起——这些看似简单的早餐准备动作,在计算机视觉领域却蕴含着复杂的时序模式识别问题。传统逐帧标注…...

OpenLayers实战:5分钟搞定天地图WMTS与XYZ加载(附完整代码)

OpenLayers实战:5分钟搞定天地图WMTS与XYZ加载(附完整代码) 第一次接触天地图服务时,我被它丰富的图层类型和稳定的服务所吸引,但在集成过程中却踩了不少坑。作为国内最权威的在线地图服务之一,天地图同时支…...

GHelper完整指南:3分钟掌握华硕笔记本轻量控制工具,彻底告别臃肿系统

GHelper完整指南:3分钟掌握华硕笔记本轻量控制工具,彻底告别臃肿系统 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephy…...

Kubernetes的iptables 与 IPVS【20260419004篇】

文章目录 Kubernetes网络全景解析:内网/外网流量、CNI与Ingress深度指南 第一部分:Kubernetes网络流量模型 1.1 内网流量与外网流量的本质区别 1.1.1 流量类型定义与特征 1.1.2 流量路径对比 1.2 Kubernetes网络模型四大基础原则 第二部分:CNI插件深度解析 2.1 Flannel:简单…...

AIVideo问题解决:常见报错处理与参数调优,让视频生成更稳定

AIVideo问题解决:常见报错处理与参数调优,让视频生成更稳定 1. 常见报错分析与解决方案 1.1 部署阶段报错处理 报错1:环境变量配置无效 当修改.env文件后视频生成仍失败时,通常是因为配置未生效。正确的处理流程应该是&#x…...

告别时间不准!用Arduino Nano和DS3231模块DIY一个高精度数字时钟(附完整代码)

用Arduino Nano和DS3231打造高精度数字时钟的完整指南 你是否厌倦了手机和电脑上那些时不时需要手动校准的时间显示?市面上大多数电子时钟要么走时不准,要么功能单一。今天,我们将用Arduino Nano和DS3231实时时钟模块,打造一个走时…...

离线环境也能玩转ROS Gazebo:离线部署完整模型库(含sun/ground_plane)的完整指南

离线环境下的ROS Gazebo模型库全攻略:从部署到实战 在机器人开发与教学领域,Gazebo作为一款高保真物理仿真工具,其重要性不言而喻。然而,许多开发者都曾遇到过这样的困境:当网络连接不稳定或完全离线时,Gaz…...

AJ-Captcha:多端行为验证码技术架构与安全防护工程实践

AJ-Captcha:多端行为验证码技术架构与安全防护工程实践 【免费下载链接】captcha 行为验证码(滑动拼图、点选文字),前后端(java)交互,包含h5/Android/IOS/flutter/uni-app的源码和实现 项目地址: https://gitcode.com/gh_mirrors/captc/cap…...

如何让IDM告别试用期限制?3种实用方案全面解析

如何让IDM告别试用期限制?3种实用方案全面解析 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 你是否曾经因为Internet Download Manager&#xff08…...

浏览器界面革命:垂直标签如何重塑现代网页浏览体验

浏览器界面革命:垂直标签如何重塑现代网页浏览体验 【免费下载链接】vertical-tabs-chrome-extension A chrome extension that presents your tabs vertically. Problem solved. 项目地址: https://gitcode.com/gh_mirrors/ve/vertical-tabs-chrome-extension …...

高效网站本地化:WebSite-Downloader完整实战指南

高效网站本地化:WebSite-Downloader完整实战指南 【免费下载链接】WebSite-Downloader 项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader 想要永久保存重要的网站内容吗?WebSite-Downloader网站下载器让你轻松实现网站离线浏览…...

淘宝淘金币自动化脚本:5分钟完成每日任务的终极解决方案

淘宝淘金币自动化脚本:5分钟完成每日任务的终极解决方案 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 每…...

一键下载30+文档平台:kill-doc让你轻松保存网页内容

一键下载30文档平台:kill-doc让你轻松保存网页内容 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决…...

告别Keil MDK5!用VSCode+PlatformIO搭建LVGL开发环境(STM32篇)

用VSCodePlatformIO打造现代化LVGL开发环境(STM32实战指南) 嵌入式开发领域正在经历一场工具链革命——传统笨重的IDE逐渐被轻量化编辑器智能插件的组合取代。如果你还在用Keil MDK5进行STM32上的LVGL开发,不妨试试这套VSCodePlatformIO方案&…...

天赐范式第16天:【硬核反骨】哥本哈根沉默:REM睡眠是大脑在50维相空间的“超决定论”搜索(附Python源码)

摘要:梦境不是随机的噪声,而是意识在混沌边缘的精确计算。本文基于 Kuramoto 高维耦合振子模型,利用纯 Python (NumPy) 模拟了快速动眼期(REM)的神经动力学。实验发现:系统在 李雅普诺夫指数 λ0.0086 的弱…...

Genshin Impact API 深度解析与实战指南

Genshin Impact API 深度解析与实战指南 【免费下载链接】api A fan-made Genshin Impact API for easy access to game data. 项目地址: https://gitcode.com/gh_mirrors/api13/api GenshinDev API 是一个专门为《原神》游戏数据提供结构化访问接口的开源项目。通过提供…...

F3D三维查看器:技术专家视角下的高性能3D渲染解决方案

F3D三维查看器:技术专家视角下的高性能3D渲染解决方案 【免费下载链接】f3d Fast and minimalist 3D viewer. 项目地址: https://gitcode.com/GitHub_Trending/f3/f3d F3D是一个专注于性能和简洁性的开源三维查看器,为开发者和技术用户提供极致的…...

从源码到实战:深度定制你的Stable-Baselines3 Actor-Critic网络(含共享层设计)

从源码到实战:深度定制你的Stable-Baselines3 Actor-Critic网络(含共享层设计) 在强化学习领域,Actor-Critic架构因其结合了策略梯度与值函数估计的双重优势,已成为解决复杂决策问题的首选方案。而Stable-Baselines3作…...

从AMR到EVS:VoLTE/VoNR通话质量升级背后,RTP打包格式到底变了啥?(附新旧协议对比表)

从AMR到EVS:VoLTE/VoNR通话质量升级背后的RTP打包格式演进 1. 语音编解码技术的代际跃迁 2000年代初期的AMR-NB(Adaptive Multi-Rate Narrowband)编解码器定义了12.2kbps至4.75kbps的可变比特率,采样率固定在8kHz,频…...

华硕笔记本性能控制黑科技深度体验报告:轻量级控制工具的完全解放秘籍

华硕笔记本性能控制黑科技深度体验报告:轻量级控制工具的完全解放秘籍 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow,…...

Zynq7000双核实战:手把手教你用VxWorks6.9和WorkBench3.3实现任务绑定CPU

Zynq7000双核实战:手把手教你用VxWorks6.9和WorkBench3.3实现任务绑定CPU 当你第一次拿到ZedBoard开发板时,可能会被它强大的双核Cortex-A9架构吸引,但随之而来的问题是:如何充分利用这两个核心?在嵌入式开发中&#x…...