Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >短短几十行 Python 代码,实现分词功能搜索引擎(2.0版)

短短几十行 Python 代码,实现分词功能搜索引擎(2.0版)

作者头像
Wu_Candy
发布于 2022-12-06 12:47:42
发布于 2022-12-06 12:47:42
1K00
代码可运行
举报
文章被收录于专栏:无量测试之道无量测试之道
运行总次数:0
代码可运行

前言

前期分享的文章 仅30行代码,实现一个搜索引擎(1.0版) 中介绍了如何使用 30行 Python 代码来实现一个简易版的搜索引擎。

仔细阅读过这篇文章的小伙伴可能会产生一些疑虑,例如:

  1. 索引函数每次需要遍历所有文件,需要占用大量的时间和空间,当需被检索的文件及内容量比较大时,每次遍历检索的时间复杂度和空间复杂度就会相当高了。
  2. 检索的文本内容只支持单个单词,如果想一次检索多个词呢,且被检索的词分布在检索文件里的不同位置。

针对以上的疑虑,该如何进行优化呢?

最容易想到的就是将文件内容进行分词,也称语料分词,它的思想是将整个文件内容,按照一定规则处理后形成一个无重复单词的 set 集合,语料分词的做法可以大大提升存储和检索效率。

具体的 Python 代码实现请往下阅读。

Python 核心代码实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
from BaseEngine import SearchEngineBase, main


class BOWModelEngine(SearchEngineBase):
    def __init__(self):
        """
        1.super(BOWModelEngine, self).__init__()含义是指:对继承自父类的属性使用父类的初始化方法进行初始化。
        2.这里的__init__()括号里可以加上父类中初始化时定义的属性,因为此处父类初始化时没有定义任何属性,所以这里括号里为空。
        """
        super(BOWModelEngine, self).__init__()
        self.__file_path_to_content = {}  # 子类BOWModelEngine自定义的私有属性

    def process_search_contents(self, file_path, content):
        """
        该函数实现功能:重写了父类的process_search_contents方法,填充__file_path_to_content字典内容,
        key为文件名称,value为文件内容经过一定规则进行处理过的无重复的单词set
        :param file_path: 完整路径下的文件名称,例如:/search_contents/1.txt
        :param content: 具体文件内容
        :return:填充__file_path_to_content字典内容
        """
        self.__file_path_to_content[file_path] = self.parse_text_to_words(content)

    def search(self, query_content):
        """
        该函数实现功能:重写了父类的search方法,返回检索文本中每个单词都出现在同一个文件的文件名称列表
        :param query_content:需要检索的文本
        :return:出现在哪些文件里的文件名称列表
        """
        query_words = self.parse_text_to_words(query_content)
        results = []
        for file_path, content in self.__file_path_to_content.items():
            if self.query_match(query_words, content):
                results.append(file_path)
        return results

    @staticmethod
    def query_match(query_words, content):
        """
        该函数实现功能:遍历parse_text_to_words函数返回的无重复的单词set,判断如果有一个单词不存在于当前文件中,则返回False,否则返回True
        :param query_words: 无重复的单词set
        :param content: 每个文件的具体内容
        :return: True&False
        """
        for query_word in query_words:
            if query_word not in content:
                return False
        return True

    @staticmethod
    def parse_text_to_words(content):
        """
        该函数实现功能:将检索文本内容进行一定规则处理后返回无重复的单词set(集合)
        :param content: 检索文本,例如:we will alive long
        :return: 无重复单词的集合,格式为:{'we','will','alive'}
        """
        content = re.sub(r'[^\w ]', ' ', content)  # 使用正则表达式去除标点符号和换行符
        content = content.lower()  # 搜索文本全部转换为小写
        word_list = content.split(' ')  # 使用空格将文本内容进行分隔,生成所有单词的列表
        word_list = filter(None, word_list)  # 生成的单词列表再去除空白单词
        return set(word_list)  # 返回单词的set(无重复的集合), 格式为: {'we','will','alive'}


search_engine = BOWModelEngine()  # 实例化子类BOWModelEngine的对象
main(search_engine)

PS:

1.核心代码块中每个函数实现的功能都有详细的解释说明,请注意仔细阅读,这将非常有助于理解搜索引擎的执行流程和代码流的流转

2.检索文件内容和被继承的基类SearchEngineBase实现代码都是和 仅30行代码,实现一个搜索引擎(1.0版) 这篇文章中所使用的内容是一模一样的,本次只优化了继承父类的子类实现代码。

实现效果预览

至此,一个功能提升的进阶版搜索引擎就实现了,后续还会继续分享功能更加强大搜索引擎实现的高阶版,敬请关注~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无量测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
性能优化大幅提升!Python 实现海量内容分词搜索引擎(3.0版)
1.0版本搜索引擎:仅支持单个词语的检索,当检索文件内容量大,文件个数多时检索效率低。
Wu_Candy
2022/12/06
9310
性能优化大幅提升!Python 实现海量内容分词搜索引擎(3.0版)
Python基础:一起来面向对象 (二)
  搜索器就是爬虫(scrawler),爬出的内容送给索引器生成索引(Index)存储在内部数据库。用户通过用户接口发出询问(query),询问解析后送达检索器,检索器高效检索后,将结果返回给用户。
py3study
2020/01/15
3580
【项目】基于Boost自主实现搜索引擎
  可以看出原始html文件中有很多特定的标签,为了方便我们查找与阅读,我们需要对其进行去标签化;   因为我们期望查找后返回给我们的格式是类似于百度等搜索引擎返回的格式,大致包含以下三个部分:   1. 标题   2. 内容   3. 网址URL
大耳朵土土垚
2025/02/26
1691
【项目】基于Boost自主实现搜索引擎
手把手教你实现文档搜索引擎
搜索引擎的核心功能是帮助用户再海量的信息中快速、准确的找到所需的内容。 要实现这样的目标,搜索引擎需要具备以下技术:
Yui_
2025/02/23
2290
手把手教你实现文档搜索引擎
基于Boost库、Jsoncpp、cppjieba、cpp-httplib等构建Boost搜索引擎
目前我们常用的搜索引擎有Google、百度、360等,这些搜索引擎都是超大型超完善的全网搜索,而本项目Boost搜索引擎只是一个非常简单的站内搜索。
_小羊_
2025/05/06
1850
基于Boost库、Jsoncpp、cppjieba、cpp-httplib等构建Boost搜索引擎
【C++|Linux|计网】构建Boost站内搜索引擎的技术实践与探索
技术栈:C/C++ C++11, STL, 标准库Boost,Jsoncpp,cppjieba,cpp-httplib ,
用户11316056
2024/12/20
2040
【C++|Linux|计网】构建Boost站内搜索引擎的技术实践与探索
20 行代码!带你快速构建基础文本搜索引擎 ⛵
本文使用tf-idf(词频-逆文件频率)、lsi(潜在语义索引)和 doc2vec(文档向量化嵌入)这3种最基础的NLP文档嵌入技术,对文本进行嵌入操作(即构建语义向量)并完成比对检索,构建一个基础版的文本搜索引擎。
ShowMeAI
2022/08/26
6540
20 行代码!带你快速构建基础文本搜索引擎 ⛵
python 手把手教你基于搜索引擎实现文章查重
文章抄袭在互联网中普遍存在,很多博主都收受其烦。近几年随着互联网的发展,抄袭等不道德行为在互联网上愈演愈烈,甚至复制、黏贴后发布标原创屡见不鲜,部分抄袭后的文章甚至标记了一些联系方式从而使读者获取源码等资料。这种恶劣的行为使人愤慨。
1_bit
2020/09/14
2.4K0
《自制搜索引擎》笔记
第1章 搜索引擎是如何工作的 搜索引擎的基础是应用于信息检索、数据库等领域的信息技术。 1-1 理解搜索引擎的构成 1-2 实现了快速全文搜索的索引结构 利用全扫描进行全文搜索 grep就是从头到尾扫
felix
2018/07/02
2.7K0
代码搜索引擎:基础篇
0. 引 入 最近,我们遇到了两个场景: 负责基础服务的工程师想下线一个接口但不知道有哪些服务调用 负责 APM 系统的工程师想知道任意 RPC 接口的所有上游调用方 仔细分析不难发现,二者的本质都在于「维护微服务间的静态依赖关系」。等等!在调用链追踪系统中,我们不是已经获得了接口级别的依赖关系吗?为什么不能直接用那边的数据?目前伴鱼调用链追踪系统中维护的依赖关系在三个方面无法满足上述需求: 一些上古服务仍然在运行,但没有接入调用链追踪系统 调用链追踪系统中维护的是「动态依赖关系」,即最近 N 天 (由 r
深度学习与Python
2023/04/01
1K0
代码搜索引擎:基础篇
xapian 搜索引擎介绍与使用入门
Xapian 是一个开源搜索引擎库,使用 C++ 编写,并提供绑定(bindings )以允许从多种编程语言使用。它是一个高度适应性的工具包,允许开发人员轻松地将高级索引和搜索功能添加到自己的应用程序中。Xapian 支持多种加权模型和丰富的布尔查询运算符。最新稳定版本是 1.4.24,发布于 2023 年 11 月 6 日。
JadePeng
2024/01/19
6160
借助 Lucene.Net 构建站内搜索引擎(上)
前言:最近翻开了之前老杨(杨中科)的Lucene.Net站内搜索项目的教学视频,于是作为老杨脑残粉的我又跟着复习了一遍,学习途中做了一些笔记也就成了接下来您看到的这篇博文,仅仅是我的个人笔记,大神请呵呵一笑而过。相信做过站内搜索的.Net程序员应该对Lucene.Net不陌生,没做过的也许会问:就不是个查询嘛!为什么不能使用Like模糊查找呢?原因很简单:模糊查询的契合度太低,匹配关键字之间不能含有其他内容。最重要的是它会造成数据库全表扫描,效率低下,即使使用视图,也会造成数据库服务器"亚历山大"!因此,有必要了解一下Lucene.Net这个神器(也许现在早已不是)!
Edison Zhou
2018/08/20
1.2K0
借助 Lucene.Net 构建站内搜索引擎(上)
Jieba分词
jieba 是一个中文分词第三方库,被称为最好的 Python 中文分词库。支持三种分词模式:精确模式、全模式和搜索引擎模式,并且支持繁体分词和自定义词典。 使用前需要额外安装(对应安装命令改为:pip install jieba)
MinChess
2022/12/26
8860
Jieba分词
使用BERT和TensorFlow构建搜索引擎
基于神经概率语言模型的特征提取器,例如与多种下游NLP任务相关的BERT提取特征。因此它们有时被称为自然语言理解(NLU)模块。
代码医生工作室
2019/07/05
2.1K0
使用BERT和TensorFlow构建搜索引擎
简单的搜索引擎搭建
本文简述一下搜索引擎的搭建过程,具体描述的搜索是文本类型的搜索,而非网页搜索。对于网页搜索的排序,需要有很多考虑,例如pagerank算法,会优先考虑web站点的重要性。文本搜索一般为关键词检索,再根据文本的相似性对搜索得到的文本进行重排序。搜索的方法有很多,排序的方法也有很多,本文介绍最简单的搜索引擎搭建。 搜索引擎在互联网信息爆炸的时代起到了重要的作用,帮助我们进行信息过滤、信息抽取等。本文使用百度知道数据进行实验,用户输入Query请求,系统返回最为相近的百度知道问题。数据预先通过web爬虫获取。下面
CodeInHand
2018/06/07
1.3K0
【Boost搜索引擎项目】构建Boost站内搜索引擎的技术
我们使用最新的boost_1_86_0/doc/html⽬录下的html⽂件,⽤它来进⾏建⽴索引
小焱
2025/07/06
670
lucene思维导图,让搜索引擎不再难懂
以上是我们java常用的全文搜索引擎框架,很多项目的搜索功能都是基于以上4个框架完成的。
java思维导图
2018/12/21
1.6K0
lucene思维导图,让搜索引擎不再难懂
一个朴素的搜索引擎实现
今天我们要使用 Lucene 来实现一个简单的搜索引擎,我们要使用上一节爬取的果壳网语料库来构建索引,然后在索引的基础上进行关键词查询。
老钱
2019/09/11
5730
一个朴素的搜索引擎实现
python实现简易搜索引擎(含代码)
通过一个循环抓取当前页面上所有的链接,我们尽可能多的去抓取链接,之所以选择set而不使用list是防止重复的现象,我们可以将爬取的的网站存放到文件或者MySQL或者是MongoDB里。
我被狗咬了
2019/09/23
3.9K0
使用 Python 构建图片搜索引擎
我们经常使用搜索引擎。当我们需要查询时,我们可以使用像 Google 这样的搜索引擎来检索最相关的答案。
AI算法与图像处理
2021/01/20
1.2K0
使用 Python 构建图片搜索引擎
相关推荐
性能优化大幅提升!Python 实现海量内容分词搜索引擎(3.0版)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档