深度学习实战20(进阶版)-文件智能搜索系统,可以根据文件内容进行关键词搜索,快速找到文件

news2024/12/23 20:38:18

大家好,我是微学AI,今天给大家带来深度学习实战项目-文件智能搜索系统,文件智能搜索系统是一种能够帮助用户通过文件的内容快速搜索和定位文件的软件系统。

随着互联网和数字化技术的普及,数据和信息呈现爆炸式增长的趋势,文件管理和搜索变得越来越困难。传统的文件搜索方法,如手动查找文件的内容和使用操作系统自带的搜索功能只能按照文件名来进行搜索,往往需要花费大量的时间和精力,而且搜索结果准确性低,不能满足用户的需求。因此,文件智能搜索系统应运而生,它可以利用先进的技术和算法,快速准确地搜索和定位文件,提高用户的工作效率和生活质量。

一、搜索原理

文件智能搜索系统是基于whoosh索引进行搜索的,whoosh是一种基于Python语言开发的全文搜索引擎库,具有高效、灵活和易用的特点,能够快速构建全文索引和搜索功能。在文件智能搜索系统中,whoosh索引的基本原理如下:
构建索引:将待搜索的文件内容提取出来,并使用whoosh索引进行分词、建立索引。
搜索:用户输入关键词,系统将关键词与索引进行匹配,返回符合条件的搜索结果。
排序:根据匹配度、文件属性和其他因素,对搜索结果进行排序和过滤,使用户更容易找到想要的文件。

二、智能搜索功能点

文件智能搜索系统的主要功能是通过搜索文件内容来快速定位文件,具体的功能点包括:
关键词搜索:用户可以输入关键词,系统将搜索包含关键词的文件,并返回相关的搜索结果。
高级搜索:用户可以根据文件类型、文件大小、文件修改时间等属性进行高级搜索,过滤掉不符合条件的文件。
模糊搜索:用户可以输入模糊的关键词,系统将搜索相似或相关的内容,提高搜索结果的准确度。
精确搜索:用户可以输入精确的关键词,系统将搜索完全匹配的内容,减少搜索结果的数量。

三、代码实现

1.首先引入whoosh包,可以pip install whoosh,然后创建索引,选择你要搜索文件的文件夹。在同级目录下创建索引保存的文件夹indexdirs。

# -*- coding: utf-8 -*-
from whoosh.index import create_in
from whoosh.fields import *
import glob
import os
import chardet
size = 1024*1024 # 1MB

# 创建索引
schema = Schema(content=TEXT(stored=True), filename=ID(stored=True), filepath=ID(stored=True))
ix = create_in("indexdirs", schema)

writer = ix.writer()
for filename in glob.glob('E:/**/*.txt', recursive=True):
    if os.path.isfile(filename):
        try:
            with open(filename, 'rb') as f:
                result = chardet.detect(f.read())
                encoding = result['encoding']
                #print(encoding)
            with open(filename, 'r', encoding=encoding) as f:
                content = f.read(size)
                while content:
                    writer.add_document(content=content,
                                        filename=os.path.basename(filename),
                                        filepath=os.path.abspath(filename))
                    content = f.read(size)
                #print('索引创建成功')
        except:
            print(filename)

writer.commit()

2.加载索引,进行搜索,其中利用gui可视化呈现搜索结果。

# -*- coding:utf-8 -*-
import os, sys
from tkinter import *
from tkinter.font import Font
from tkinter.ttk import *
import re
import difflib
from whoosh.index import open_dir
from whoosh.qparser import QueryParser
from whoosh.query import FuzzyTerm, Term
ix = open_dir("indexdirs")

class Application_ui(Frame):
    # 这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master.title('文件智能搜索系统')
        self.master.geometry('955x500')
        self.createWidgets()

    def createWidgets(self):
        self.top = self.winfo_toplevel()

        self.style = Style()

        self.style.configure('Tftitle.TLabelframe', font=('楷体', 12))
        self.style.configure('Tftitle.TLabelframe.Label', font=('楷体', 12))
        self.ftitle = LabelFrame(self.top, text='智能匹配', style='Tftitle.TLabelframe')
        self.ftitle.place(relx=0.008, rely=0.017, relwidth=0.982, relheight=0.998)

        self.stext = Text(self.ftitle, font=('楷体', 12), wrap=NONE, )
        self.stext.place(relx=0.017, rely=0.036, relwidth=0.957, relheight=0.212)

        # 垂直滚动条
        self.VScroll1 = Scrollbar(self.stext, orient='vertical')
        self.VScroll1.pack(side=RIGHT, fill=Y)
        self.VScroll1.config(command=self.stext.yview)  # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
        self.stext.config(yscrollcommand=self.VScroll1.set)  # 将滚动条关联到文本框
        # 水平滚动条
        self.stextxscroll = Scrollbar(self.stext, orient=HORIZONTAL)
        self.stextxscroll.pack(side=BOTTOM, fill=X)  # side是滚动条放置的位置,上下左右。fill是将滚动条沿着y轴填充
        self.stextxscroll.config(command=self.stext.xview)  # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
        self.stext.config(xscrollcommand=self.stextxscroll.set)  # 将滚动条关联到文本框

        self.totext = Text(self.ftitle, font=('楷体', 12), wrap=NONE)
        self.totext.place(relx=0.017, rely=0.352, relwidth=0.957, relheight=0.612)

        self.VScroll2 = Scrollbar(self.totext, orient='vertical')
        self.VScroll2.pack(side=RIGHT, fill=Y)
        # 将滚动条与文本框关联
        self.VScroll2.config(command=self.totext.yview)  # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
        self.totext.config(yscrollcommand=self.VScroll2.set)  # 将滚动条关联到文本框
        # 水平滚动条
        self.totextxscroll = Scrollbar(self.totext, orient=HORIZONTAL)
        self.totextxscroll.pack(side=BOTTOM, fill=X)  # side是滚动条放置的位置,上下左右。fill是将滚动条沿着y轴填充
        self.totextxscroll.config(command=self.totext.xview)  # 将文本框关联到滚动条上,滚动条滑动,文本框跟随滑动
        self.totext.config(xscrollcommand=self.totextxscroll.set)  # 将滚动条关联到文本框

        def cut(editor, event=None):
            editor.event_generate("<<Cut>>")

        def copy(editor, event=None):
            editor.event_generate("<<Copy>>")

        def paste(editor, event=None):
            editor.event_generate('<<Paste>>')

        def rightKey(event, editor):
            menubar.delete(0, END)
            menubar.add_command(label='剪切', command=lambda: cut(editor))
            menubar.add_command(label='复制', command=lambda: copy(editor))
            menubar.add_command(label='粘贴', command=lambda: paste(editor))
            menubar.post(event.x_root, event.y_root)

        menubar = Menu(self.top, tearoff=False)  # 创建一个菜单
        self.stext.bind("<Button-3>", lambda x: rightKey(x, self.stext))  # 绑定右键鼠标事件
        self.totext.bind("<Button-3>", lambda x: rightKey(x, self.totext))  # 绑定右键鼠标事件

        self.style.configure('Tcleartext.TButton', font=('楷体', 12))
        self.cleartext = Button(self.ftitle, text='清空', command=self.cleartext_Cmd, style='Tcleartext.TButton')
        self.cleartext.place(relx=0.139, rely=0.263, relwidth=0.086, relheight=0.073)

        self.style.configure('Taddyh.TButton', font=('楷体', 12))
        self.addyh = Button(self.ftitle, text='点击查找', command=self.addyh_Cmd,
                            style='Taddyh.TButton')
        self.addyh.place(relx=0.512, rely=0.263, relwidth=0.2, relheight=0.073)

class Application(Application_ui):
    # 这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
    def __init__(self, master=None):
        Application_ui.__init__(self, master)

    def cleartext_Cmd(self, event=None):
        # TODO, Please finish the function here!
        # 清空两个文本框
        self.stext.delete(1.0, "end")
        self.totext.delete(1.0, "end")

    def addyh_Cmd(self, event=None):
        # TODO, Please finish the function here!
        keyword = self.stext.get(1.0, "end")
        keyword = keyword.replace('\n','')
        print(keyword)
        #query = QueryParser("content", ix.schema).parse(keyword)
        query = FuzzyTerm("content", keyword, maxdist=5)
        filelist =[]
        # 执行查询
        with ix.searcher() as searcher:
           
            results = searcher.search(query, limit=60)
            #print(results)
            for result in results:
                filelist.append(result["filepath"])
                print(result["filepath"])

        for i in filelist:
            self.totext.insert(1.0, i)
            self.totext.insert(1.0, '\n')
            self.totext.update()

if __name__ == "__main__":
    top = Tk()
    Application(top).mainloop()

运行结果:

 3. 后续要添加新的文件,只有添加到原来的索引当中去:

import os
from whoosh.index import open_dir
from whoosh.query import Regex, Term, Or
size = 1024*1024 # 1MB
# 新文件路径
new_file_path = "新文件.txt"
# 索引文件路径
index_dir = "indexdirs"

# 打开索引文件
ix = open_dir(index_dir)
# 创建一个新的 IndexWriter 实例
writer = ix.writer()

# 添加新文件到索引中
with open(new_file_path, 'r', encoding='utf-8') as f:
    content = f.read(size)

    while content:

        writer.add_document(content=content,
                            filename=os.path.basename(new_file_path),
                            filepath=os.path.abspath(new_file_path))

        content = f.read(size)
# 提交更改
writer.commit()

文件智能搜索系统可以根据文件的内容进行搜索,文字其实可以添加pdf,doc等格式的文件,这里举了txt简单的例子。更多细节咨询与合作可以私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu 将jupyter-lab保存为桌面快捷方式和favourites

ubuntu: 将jupyter-lab保存为桌面快捷方式和favourites desktop shortcut 建立一个新的desktop文件 cd ~/Desktop touch Jupyter-lab.desktop将文件修改成如下&#xff1a; [Desktop Entry] Version1.0 NameJupyterlab CommentBack up your data with one click Exec/home/cjb/…

SpringCloud学习笔记(一)

单体应用架构 在诞⽣之初&#xff0c;拉勾的⽤户量、数据量规模都⽐较⼩&#xff0c;项目所有的功能模块都放在一个工程中编码、编译、打包并且部署在一个Tomcat容器中的架构模式就是单体应用架构。 优点&#xff1a; 高效开发&#xff1a;项⽬前期开发节奏快&#xff0c;团…

02-Oracle数据库的启动与关闭

本文章主要讲解Oracle数据库的启动与关闭方法&#xff0c;详细讲解启动Oracle的命令&#xff0c;三种启动数据库的方法及区别&#xff1b;关闭数据库的4种方法及他们的区别。 启动和关闭数据库 •数据库没启动前&#xff0c;只有拥有DBA权限或者以sysoper或sysdba身份才能连接到…

设计跳表(动态设置节点高度)

最近学习redis的zset时候&#xff0c;又看到跳表的思想&#xff0c;突然对跳表的设置有了新的思考 这是19年设计的跳表&#xff0c;在leetcode的执行时间是200ms 现在我对跳表有了新的想法 1、跳表的设计&#xff0c;类似二分查找&#xff0c;但是不是二分查找&#xff0c;比较…

基于Canal的数据同步

基于Canal的数据同步 一、 系统结构 该数据同步系统由Spring Boot和Canal共同组成。 Spring Boot 是一个流行的 Java Web 框架&#xff0c;而 Canal 则是阿里巴巴开源的 MySQL 数据库的数据变更监听框架。结合 Spring Boot 和 Canal&#xff0c;可以实现 MySQL 数据库的实时数…

ASGCN之图卷积网络(GCN)

文章目录前言1. 理论部分1.1 为什么会出现图卷积网络&#xff1f;1.2 图卷积网络的推导过程1.3 图卷积网络的公式2. 代码实现参考资料前言 本文从使用图卷积网络的目的出发&#xff0c;先对图卷积网络的来源与公式做简要介绍&#xff0c;之后通过一个例子来代码实现图卷积网络…

Linux命令行安装Oracle19c教程和踩坑经验

安装 下载 从 Oracle官方下载地址 需要的版本&#xff0c;本次安装是在Linux上使用yum安装&#xff0c;因此下载的是RPM。另外&#xff0c;需要说明的是&#xff0c;Oracle加了锁的下载需要登录用户才能安装&#xff0c;而用户是可以免费注册的&#xff0c;这里不做过多说明。 …

最新使用nvm控制node版本步骤

一、完全卸载已经安装的node、和环境变量 ①、打开控制面板的应用与功能&#xff0c;搜索node&#xff0c;点击卸载 ②、打开环境变量&#xff0c;将node相关的所有配置清除 ③、打开命令行工具&#xff0c;输入node-v&#xff0c;没有版本号则卸载成功 二、下载nvm安装包 ①…

SBUS的协议详解

SBUS 1.串口配置&#xff1a; 100k波特率&#xff0c; 8位数据位&#xff08;在stm32中要选择9位&#xff09;&#xff0c; 偶校验&#xff08;EVEN), 2位停止位&#xff0c; 无控流&#xff0c;25个字节&#xff0c; 2.协议格式&#xff1a; [startbyte] [data1][data2]……

单月涨粉超600w,直播销售额破5亿,2月的黑马都是谁?

2月的抖音&#xff0c;黑马多多&#xff0c;处处有爆点。有直播间热度不减&#xff0c;在带货领域持续位列前茅&#xff1b;有达人通过“抓马式”连麦直播&#xff0c;涨粉657w&#xff1b;有0.01元的低价商品&#xff0c;一天热卖超1000w个。那么&#xff0c;2月有哪些主播表现…

微服务实战03-注册数据服务

EurekaServer &#xff0c;它扮演的角色是注册中心&#xff0c;用于注册各种微服务&#xff0c;以便于其他微服务找到和访问。有了EurekaServer&#xff0c;还需要一些微服务&#xff0c;注册到EurekaServer上去。 这一节&#xff0c;我们来写一个注册微服务。为了简单起见&am…

【同步工具类:Phaser】

同步工具类:Phaser介绍特性动态调整线程个数层次Phaser源码分析state 变量解析构造函数对state变量赋值阻塞方法arrive()awaitAdvance()业务场景实现CountDownLatch功能代码测试结果实现 CyclicBarrier功能代码展示测试结果总结介绍 一个可重复使用的同步屏障&#xff0c;功能…

26- AlexNet和VGG模型分析 (TensorFlow系列) (深度学习)

知识要点 AlexNet 是2012年ISLVRC 2012竞赛的冠军网络。 VGG 在2014年由牛津大学著名研究组 VGG 提出。 一 AlexNet详解 1.1 Alexnet简介 AlexNet 是2012年ISLVRC 2012&#xff08;ImageNet Large Scale Visual Recognition Challenge&#xff09;竞赛的冠军网络&#xff0…

paddle推理部署(cpu)

我没按照官方文档去做&#xff0c;吐槽一下&#xff0c;官方文档有点混乱。。一、概述总结起来&#xff0c;就是用c示例代码&#xff0c;用一个模型做推理。二、示例代码下载https://www.paddlepaddle.org.cn/paddle/paddleinferencehttps://github.com/PaddlePaddle/Paddle-In…

Clion连接Docker,使用HElib库

文章目录需求Clion连接服务器内的DockerDockerCLionDocker内配置HElib库参考需求 HElib库是用C编写的同态加密开源库&#xff0c;一般在Linux下使用为了不混淆生产环境&#xff0c;使用Docker搭建HElib运行环境本地在Windows下开发&#xff0c;使用的IDE为Clion&#xff0c;本…

动态规划:leetcode 121. 买卖股票的最佳时机、122. 买卖股票的最佳时机II

leetcode 121. 买卖股票的最佳时机leetcode 122.买卖股票的最佳时机IIleetcode 121. 买卖股票的最佳时机给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日…

node版本管理工具nvm

1.标题卸载nvm和node.js 系统变量中删除nvm添加变量&#xff1a;NVM_HOME和NVM_SYMLINK环境变量中 path&#xff1a;删除nvm自动添加的变量 Path %NVM_HOME%;%NVM_SYMLINK%删除自身安装node环境&#xff0c;参考图一图二 图一 图二 2.安装nvm nvm-window下载------https:/…

ES window 系统环境下连接问题

环境问题&#xff1a;&#xff08;我采用的版本是 elasticsearch-7.9.3&#xff09;注意 开始修正之前的配置&#xff1a;前提&#xff1a;elasticsearch.yml增加或者修正一下配置&#xff1a;xpack.security.enabled: truexpack.license.self_generated.type: basicxpack.secu…

对象实例化【JVM】

JVM对象实例化简介/背景一、创建对象的方式1. new2. Class对象的newInstance方法3. Construstor对象的newInstance(xx)方法4. 使用clone方法二、创建对象的步骤1. 判断对象是否已经加载、链接、初始化2. 为对象分配内存3. 处理并发安全问题4. 初始化分配到的空间5. 设置对象的对…

Tech Lead如何引导团队成员解决问题?

作为一个开发团队的Tech Lead&#xff0c;当团队成员向你寻求帮助时&#xff0c;你有没有说过下面这些话&#xff1f; 你别管了&#xff0c;我来解决这个问题你只要。。。就行了你先做其他的吧&#xff0c;我研究一下&#xff0c;然后告诉你怎么做 当我们说这些话时&#xff…