自然语言处理实战项目4-文本相似度的搜索功能,搜索文本内容

news2025/7/19 12:52:51

大家好,我是微学AI,今天给大家带来自然语言处理实战项目4-文本相似度的搜索功能,搜索文本内容。文本相似度搜索是一种基于自然语言处理技术,用于搜索和匹配文本内容的方法。其主要目的是将用户输入的查询内容与已有的文本数据进行比较,并找到最相似的文本数据。

本文本以目标实现为导向,实战让大家跑通文本相似度的搜索功能。

一、实现文本相似度的搜索功能步骤:

1.首先加载与处理文件夹数据,本文以txt文件为例子,批量处理。

2.然后构建文件名和文件内容的索引文件。

3.在进行文档向量化与模型构建,生成向量模型

4.加载模型进行相似度的计算并返回。

5.后续可以新增文档到向量模型,可搜索到新加的文件

、文本相似度的搜索功能代码:

1.构建文件搜索引擎类

mport os
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import pickle
from settings.app_config import project_config as fileconfig
import PyPDF2
import csv

index_file = 'index.pkl'
vectorizer_file = 'vectorizer.pkl'
index_file_path = 'file_path.pickle'

# 构建文件搜索引擎类
class FileSearchManage():
    def __init__(self):
        self.index_file_path = index_file_path
        self.index_file = index_file 
        self.vectorizer_file = vectorizer_file

    #读取文件
    def read_files(self,folder_path):
        files_data = {}
        for file_name in os.listdir(folder_path):
            if file_name.endswith(".txt"):
                with open(os.path.join(folder_path, file_name), 'r', encoding='utf-8') as f:
                    files_data[file_name] = f.read().replace('\n', '')
        return files_data


    # 保存 csv 文件
    def save_csv_files(self, folder_path,csv_path):
        # 将信息写入csv文件
        with open(csv_path, 'w', newline='', encoding='utf-8') as csvfile:
            fieldnames = ['file_name', 'paragraph', 'content']
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader()
            for file_name in os.listdir(folder_path):
                if file_name.endswith(".pdf"):
                    path_name, paragraph = ocr_paragraph_pdf(os.path.join(folder_path, file_name))
                    for i, pa in enumerate(paragraph):
                        pa = pa.replace('\n', '').replace(' ', '')
                        if len(pa) > 4:
                           writer.writerow({'file_name': file_name,
                                         'paragraph': i,
                                         'content': pa})

    # 读取pickle索引文件
    def read_pickle(self,index_file_path):
        with open(index_file_path, 'rb') as f:
            index = pickle.load(f)
        return index

    #分词、去除停用词 处理
    def preprocess_data(self,files_data):
        processed_data = {}
        for file_name, content in files_data.items():
            # 在这里可以对文档内容进行预处理(例如:分词、去除停用词)
            processed_data[file_name] = content
        return processed_data

    # 创建索引文件向量
    def create_tfidf_index(self,processed_data):
        vectorizer = TfidfVectorizer()
        corpus = list(processed_data.values())
        X = vectorizer.fit_transform(corpus)
        return X, vectorizer

    # 报错文件json
    def save_file(self,index_file_path,files_data):
        with open(index_file_path, 'wb') as f:
            pickle.dump(files_data, f)

    # 保存索引文件向量
    def save_index(self,index, vectorizer, index_file, vectorizer_file):
        with open(index_file, 'wb') as f:
            pickle.dump(index, f)
        with open(vectorizer_file, 'wb') as f:
            pickle.dump(vectorizer, f)

    # 加载索引文件向量
    def load_index(self,index_file, vectorizer_file):
        with open(index_file, 'rb') as f:
            index = pickle.load(f)
        with open(vectorizer_file, 'rb') as f:
            vectorizer = pickle.load(f)
        return index, vectorizer

    def preprocess_query(self,query):
        # 对查询进行预处理(例如:分词、去除停用词)
        return query

    # 文件查找函数
    def search(self,query, index, vectorizer, files_data,num):
        processed_query = self.preprocess_query(query)
        query_vector = vectorizer.transform([processed_query])
        cosine_similarities = cosine_similarity(index, query_vector)

        top_file_indices = cosine_similarities.ravel().argsort()[-int(num):][::-1]

        # print(top_file_indices)
        results = []
        for file_index in top_file_indices:
            file_name = list(files_data.keys())[file_index]
            file_content = files_data[file_name]
            similarity = cosine_similarities[file_index][0]
            results.append((file_name, file_content, similarity))

        return sorted(results, key=lambda x: x[-1], reverse=True)
        # return most_similar_file_name, most_similar_file_content

    # 文件相似度计算
    def search_similar_files(self,query,num):

        files_data = self.read_pickle(self.index_file_path)
        #processed_data = self.preprocess_data(files_data)

        index, vectorizer = self.load_index(self.index_file, self.vectorizer_file)
        result = self.search(query, index, vectorizer, files_data,num)

        result = [x[0]+" "+str(x[2]) for x in result]
        return result
        # print('File content:', result_file_content)

    # 获取文件内容
    def get_content(self,filename):
        files_data = self.read_pickle(self.index_file_path)
        result = files_data[filename]
        return result

    # 新增新的索引文件
    def add_new_file(self,file_path):
        index,vectorizer = self.load_index(self.index_file, self.vectorizer_file)
        files_data = self.read_pickle(self.index_file_path)
        content =''
        try:
            if file_path.split('.')[-1]=='txt':
                with open(file_path, 'r', encoding='utf-8') as f:
                    file_content =  f.read().replace('\n', '')
                    files_data[file_path.split('/')[-1]] = file_content

            if file_path.split('.')[-1] == 'pdf':
                with open(file_path, 'rb') as f:
                    pdf_reader = PyPDF2.PdfFileReader(f)
                    # 获取PDF文件的页数
                    num_pages = pdf_reader.numPages
                    # 创建文本文件,并将PDF文件每一页的内容写入
                    for i in range(num_pages):
                        page = pdf_reader.getPage(i)
                        text = page.extractText().replace(' ', '')
                        content = content + text
                file_content = content.replace('\n', '')
                files_data[file_path.split('/')[-1]] = file_content

            with open(self.index_file_path, 'wb') as f:
                    pickle.dump(files_data, f)

            corpus = list(files_data.values())
            X = vectorizer.fit_transform(corpus)

            with open(self.index_file, 'wb') as f:
                pickle.dump(X, f)
            with open(self.vectorizer_file, 'wb') as f:
                pickle.dump(vectorizer, f)
            return  'successful'
        except Exception as e:
            print(e)
            return 'fail'

2.构建文件夹导入函数

if __name__ == '__main__':
       
    folder_path = '文件夹的地址'  # 例如'E:/data'
   

    def create_file(folder_path):
         FileSearch = FileSearchManage()
         files_data = FileSearch.read_files(folder_path)
         processed_data = FileSearch.preprocess_data(files_data)
         FileSearch.save_file(index_file_path,processed_data)
         index, vectorizer = FileSearch.create_tfidf_index(processed_data)
         FileSearch.save_index(index, vectorizer, index_file, vectorizer_file)


    def file_search(query):

        FileSearch = FileSearchManage()
        files_data = FileSearch.read_pickle(index_file_path)
        processed_data = FileSearch.preprocess_data(files_data)
        index, vectorizer = FileSearch.load_index(index_file, vectorizer_file)
        result_file_name = FileSearch.search(query, index, vectorizer, files_data,num=5)
        print('File name:', result_file_name)


    def file_add(folder_path):
        FileSearch = FileSearchManage()
        files_data = FileSearch.read_pdf_files(folder_path)
        with open(index_file_path, 'wb') as f:
            pickle.dump(files_data, f)
        processed_data =  FileSearch.preprocess_data(files_data)
        index, vectorizer = FileSearch.create_tfidf_index(processed_data)
        FileSearch.save_index(index, vectorizer, index_file, vectorizer_file)
        index, vectorizer = FileSearch.load_index(index_file, vectorizer_file)
        query = '*****'
        result_file_name = FileSearch.search(query, index, vectorizer, files_data,num=5)


   create_file(folder_path)
   #query ='搜索语句'
   #file_search(query)
   
   #file_add(folder_path)
  

我们还可以根据自己的需求,添加新的文件,可以是txt,pdf的文件,pdf有的文件可以直接转文本,有的图片的需要OCR识别,这个可以接入OCR进行识别,使得系统更加的完善。欢迎大家进行关注与支持,有更多需求和合作的可以联系。

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

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

相关文章

c盘满了怎么清理垃圾而不误删?C盘清理,4个方法!

案例:c盘满了怎么清理垃圾而不误删 【我的c盘现在已经爆红了!想清理下c盘的文件,但是害怕误删重要的文件,应该怎么做才能清理c盘但不误删重要的文件呀!急需答案!】 随着时间的推移,c盘可能会因…

游戏服务器如何搭建

无论是游戏公司还是游戏爱好者,游戏服务器都是不可或缺的一部分。游戏服务器承载着游戏的运行和体验,是在所有玩家之间建立连接的纽带。如果你想了解如何搭建游戏服务器以及相关的配置要求,那么本文是无法错过的。在本文中小编将为您介绍如何…

Nginx安装注意事项

一.看你是什么系统,先从官网下载你想要的版本 二.windows系统 直接解压就行了 conf 是放配置文件的地方 html是 放页面的位置 ,欢迎页也在这里 有什么静态资源也可以放这里 logs 放日志文件 在路径栏位置直接cmd 开启命令窗口 注意这里是在nginx.exe文件所在目录进行的…

TOOM解析如何搭建一套适合自己的舆情监测系统?完整的实战指南

随着互联网的普及和社交媒体的盛行,人们在网络上的活动越来越多,同时也涌现出大量的信息和舆情。这些信息和舆情在一定程度上会影响社会和个人的发展和进步。因此,舆情监测逐渐成为一项重要的任务。在本篇文章中,我们将为大家介绍…

Adobe国际认证中文官网

Adobe国际认证中文官网是Adobe公司为了帮助用户提高技能水平和职业竞争力而推出的认证服务。该官网提供了一系列的Adobe认证考试,包括Photoshop、Illustrator、InDesign、Premiere Pro等多个软件的认证考试。通过参加这些考试,用户可以获得Adobe认证&…

ASEMI代理ADG5412BRUZ-REEL7原装ADI车规级ADG5412BRUZ-REEL7

编辑:ll ASEMI代理ADG5412BRUZ-REEL7原装ADI车规级ADG5412BRUZ-REEL7 型号:ADG5412BRUZ-REEL7 品牌:ADI/亚德诺 封装:TSSOP-16 批号:2023 引脚数量:5 安装类型:表面贴装型 ADG5412BRUZ-…

《花雕学AI》你知道人工智能ChatGPT在10秒钟里能写出多少种标题吗?我试了24次,惊呆了!

今天准备测试AI绘画,使用几个不同的AI平台来生成猫娘图片,以此具体学习绘图的AI咒语。这篇博客用什么标题好呢?于是,我开始关心如何优化标题,还是老办法,不懂就问ChatGPT(没有正式账号&#xff…

PHP实现输入英文语句统计单词数量,使用函数随机获取数组的最小值和最大值这两个程序的代码

目录 前言 一、输入英文语句,统计单词数量 1.1运行流程(思想) 1.2代码段 1.3运行截图 二、使用函数随机获取数组的最小值和最大值 2.1运行流程(思想) 2.2代码段 2.3运行截图 前言 1.因多重原因,本…

WordPress安装

目标 在一台 CentOS Stream release 8 虚拟机上,安装一台WordPress 6.2 安装过程 安装依赖组件 依赖组件可以参考官方文档:https://developer.wordpress.org/advanced-administration/before-install/ 主要有3个组件: PHP 7.4 or greate…

爬虫为什么需要多线程

多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程,可以减少爬虫的运行时间,提高效率。不过需要注意的是,在爬取过程中需要合理的管理线程数,以避免对被爬取的网站造成过大的负荷。 …

再聊 MySQL 聚簇索引

为什么是再次理解呢?因为松哥之前写过相关的文章介绍过聚簇索引,但是感觉还不够,因此今天想再来和小伙伴们聊一聊这个话题。 1. 什么是聚簇索引 数据库的索引从不同的角度可以划分成不同的类型,聚簇索引便是其中一种。 聚簇索引…

家用洗地机怎么选?洗地机选购技巧分享

洗地机是一种专业的清洁设备,广泛应用于商业和工业领域。它可以有效地清洗和护理各种硬表面地板,如混凝土、大理石、瓷砖和木地板等。洗地机不仅能够提高清洁效率,还可以使地面更加卫生、美观和持久。而且大部分洗地机还拥有一键自清洁、除菌…

为什么企业都需要搭建搭建一个内部知识库?

企业内部知识管理是指企业通过各种手段收集、整理、管理和传播企业内部的知识,以提高企业的竞争力和创新能力。在实践中,企业内部知识管理往往需要建立一个内部知识库,以更好地实现知识的共享和管理。本文将从以下几个方面探讨为什么企业内部…

华为豪气分红720亿,持股员工人均超50万?

当有的公司还在因为各种原因裁员的时候,有的公司已经要分红了。 最近,华为在内部论坛“心声社区”公布,经华为公司内部有权机构决议,拟向股东分配股利人民币 719.55 亿元。相比 2021 年分红总额 614.04 亿元,同比增加…

centos8与centos7对比

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…

计算广告(十三)

Wide & Deep Wide & Deep模型是一种结合了广度学习(wide learning)和深度学习(deep learning)方法的混合模型。它旨在解决推荐系统中的记忆(memorization)和泛化(generalization&#…

使用Java操作文件与文件IO流(字节流,缓冲字节流,字符流,缓冲字符流)

文章目录 1. 认识文件2. 文件的类型3. 操作文件3.1 属性3.2 构造方法3.3 常用方法 4. IO流4.1 字节流4.1.1 InputStream4.1.2 OutputStream4.1.3 flush刷新4.1.4 关闭文件close4.1.5 字节缓冲流 4.2 字符流4.2.1 Reader4.2.2 Writer4.2.3 Scanner4.2.4 字符缓冲流 5. 复制文件5…

深度学习优化方法

如有错误,感谢不吝赐教、交流 文章目录 一、梯度下降如何选择学习率不能太小不能太大 二、小批量随机梯度下降如何选择批量大小不能太小不能太大 总结 三、常用优化方法SGDAdagradAdam实现大佬经验 一、梯度下降 如何选择学习率 不能太小 以缓慢的速度接近最优值&…

sqoop的介绍与安装

简介 Sqoop 是一款开源的工具,主要用于在 Hadoop(Hive) 与传统的数据库 (mysql 、 postgresql...) 间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres 等)中的 数据导进到 Hadoop 的 …

从单兵作战到生态共创,纵目科技打响智驾2.0新战役

4月18日,第十二届上海国际汽车工业展览会(简称:2023上海车展)在上海国家会展中心盛大启幕。纵目科技携最新自动驾驶解决方案——Amphiman 3000、8000行泊一体解决方案、Trinity 3000、8000舱行泊一体解决方案以及众多摄像头产品强…