模糊搜索:在不确定性中寻找精确结果

目录

模糊搜索:在不确定性中寻找精确结果

一、引言

二、模糊搜索的背景

三、模糊搜索的原理

1、编辑距离(Levenshtein Distance):

2、Jaccard 相似系数:

3、Soundex 算法:

4、TF-IDF(词频-逆文档频率)和余弦相似度:

四、模糊搜索的简单实现方式

1、数据库中的模糊搜索

2、使用编辑距离的模糊搜索

3、支持拼音和多音字的模糊匹配

4、动态词库和分词模糊搜索

5、时间、地理位置约束的模糊搜索

6、使用自然语言处理库等实现语义搜索

五、总结


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等

---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

模糊搜索:在不确定性中寻找精确结果

一、引言

        在我们日常生活和工作中,搜索功能无处不在。无论是在网页搜索、文件检索,还是数据库查询中,我们时常会因为拼写错误或信息不完整而无法找到需要的结果。模糊搜索(Fuzzy Search)应运而生,它通过识别与查询相似的词语来帮助我们获得更加灵活的搜索结果。本文将详细探讨模糊搜索的背景、原理、实现方式以及应用领域,帮助读者更深入理解这一基础且实用的技术。

二、模糊搜索的背景

        模糊搜索的出现解决了传统精确搜索的局限性。通常情况下,精确搜索会严格匹配用户输入和数据内容,而忽略拼写错误、相似词语或复杂查询条件。然而,在实际应用中,数据往往不是完全一致的,如姓名、地址、商品描述等字段可能存在拼写错误、缩写、拼音差异等。模糊搜索的出现弥补了这种匹配漏洞,使得搜索功能更加“容错”。

        应用背景举例:

  • 搜索引擎:用户可能会输入错误的关键词,而模糊搜索可以理解用户的真实意图。
  • 电商平台:帮助用户找到与拼写错误或相似词相关的商品。
  • 数据库查询:在需要模糊匹配的数据字段(如姓名、地址等)中有效查找相关内容。

三、模糊搜索的原理

        模糊搜索的核心在于通过相似度计算来衡量两段文本的“接近程度”,并根据预设的容差来判断是否符合搜索条件。以下是常用的模糊搜索算法原理:

1、编辑距离(Levenshtein Distance):

        编辑距离是一种常用的相似度计算方法,它通过计算两字符串之间的插入、删除或替换的最小操作次数来衡量其相似程度。距离越小,字符串越相似。例如,“apple”与“aple”的编辑距离为1(删除一个字母“p”)。

2、Jaccard 相似系数:

        通过计算两个文本的交集与并集比例来衡量其相似度,通常适用于分析词组或短语的相似性。例如,在“apple pie”和“apple tart”两个短语中,相同单词“apple”占比较高,因此相似性较强。

3、Soundex 算法:

        Soundex 是一种基于发音的相似性算法,常用于处理人名或发音相近的词语匹配。例如,“Smith”和“Smyth”使用 Soundex 可以匹配出相同的编码。

4、TF-IDF(词频-逆文档频率)和余弦相似度:

        该方法通过词频和逆文档频率计算关键词权重,适合较长文本的模糊匹配。余弦相似度计算文本的向量夹角,以此判断文本间的相似性。

四、模糊搜索的简单实现方式

        模糊搜索的实现通常结合特定的数据库、编程语言及框架。以下是几种常见的实现方式:

1、数据库中的模糊搜索

        SQL 中的模糊匹配:许多关系型数据库如 MySQL、PostgreSQL 支持 LIKE 和正则表达式匹配来进行模糊查询。例如:

SELECT * FROM products WHERE name LIKE '%apple%';

         在此基础上,还能增加多字段、权重分配的模糊搜索。

        例如在用户搜索书籍数据库时,输入的关键词可以匹配书名、作者、出版社、出版年份等多个字段,书名字段权重最高,作者次之,出版社和出版年份次之。关键词在不同字段中匹配的权重累加,以确定最终的排序。

        这里可以使用 ElasticSearch 中的 multi_match ,并为每个字段设置权重。例如,书名设置为2倍权重,作者1.5倍。

{"query": {"multi_match": {"query": "哈利波特","fields": ["title^2", "author^1.5", "publisher"]}}
}

        全文检索引擎:Elasticsearch、Solr 等全文检索引擎提供了丰富的模糊搜索支持,包含多种分词和相似度算法,适合处理海量数据。

2、使用编辑距离的模糊搜索

        编辑距离算法较为经典,通常可以在 Python 等编程语言中使用。以下是一个简单的编辑距离实现:

def levenshtein_distance(str1, str2):len_str1 = len(str1) + 1len_str2 = len(str2) + 1dp = [[0 for _ in range(len_str2)] for _ in range(len_str1)]for i in range(1, len_str1):dp[i][0] = ifor j in range(1, len_str2):dp[0][j] = jfor i in range(1, len_str1):for j in range(1, len_str2):cost = 0 if str1[i - 1] == str2[j - 1] else 1dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost)return dp[-1][-1]# 示例
distance = levenshtein_distance("apple", "aple")
print(f"编辑距离: {distance}")

3、支持拼音和多音字的模糊匹配

        在包含中文数据的 MongoDB 中,可以通过拼音分词和模糊搜索来实现拼音模糊匹配。例如搜索姓名时,可以接受拼音或汉字。

from pypinyin import lazy_pinyin
from pymongo import MongoClientclient = MongoClient('mongodb://localhost:27017/')
db = client['user_db']
collection = db['users']def search_user(query):pinyin_query = ''.join(lazy_pinyin(query))  # 将查询内容转成拼音regex = f".*{pinyin_query}.*"results = collection.find({"$or": [{"name": {"$regex": regex, "$options": "i"}},  # 汉字字段匹配{"pinyin_name": {"$regex": regex, "$options": "i"}}  # 拼音字段匹配]})return list(results)

4、动态词库和分词模糊搜索

        在搜索菜单时,动态更新分词词库,将菜名分词后进行模糊搜索。例如,将“清炒小白菜”“炒青椒”等关键词进行分词后模糊匹配(Python + Elasticsearch + Jieba 分词)。

import jieba
from elasticsearch import Elasticsearch# 自定义词典更新
jieba.add_word("清炒小白菜")
jieba.add_word("炒青椒")# Elasticsearch 初始化
es = Elasticsearch()def search_menu(query):query_tokens = jieba.lcut(query)  # 使用 Jieba 分词query_string = ' '.join(query_tokens)# Elasticsearch 查询response = es.search(index="menu",body={"query": {"match": {"dish_name": {"query": query_string,"fuzziness": "AUTO"}}}})return response['hits']['hits']# 示例查询
results = search_menu("炒青菜")
for result in results:print(result["_source"])

5、时间、地理位置约束的模糊搜索

        可以通过Elasticsearch 地理位置和评分查询来获取离用户较近且评分较高的景点,结合 geo_distance 和评分 function_score 查询。

POST /places/_search
{"query": {"function_score": {"query": {"match": {"description": {"query": "热门景点","fuzziness": "AUTO"}}},"functions": [{"gauss": {"location": {"origin": "40.7128,-74.0060",  // 用户当前位置"scale": "10km"}}},{"field_value_factor": {"field": "rating","factor": 1.2,  // 评分加权"modifier": "sqrt"}}],"boost_mode": "sum"}},"sort": ["_score"  // 结果按评分和距离组合排序]
}

6、使用自然语言处理库等实现语义搜索

       在需要更复杂的语义匹配时,可以借助 NLP 库,如 spaCy 或 Transformers,将文本嵌入向量空间后计算相似性,以实现语义层面的模糊搜索。

        这里给一个基础的例子,利用 BERT 将输入语句与每个文档计算语义相似度,以找到更语义匹配的结果。以下示例使用 transformers 库实现。

from transformers import BertTokenizer, BertModel
import torch
from scipy.spatial.distance import cosine# 加载预训练模型和分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')def get_sentence_embedding(sentence):inputs = tokenizer(sentence, return_tensors="pt")outputs = model(**inputs)return outputs.last_hidden_state.mean(dim=1).detach().numpy()def search_documents(query, documents):query_embedding = get_sentence_embedding(query)results = []for doc in documents:doc_embedding = get_sentence_embedding(doc['content'])similarity = 1 - cosine(query_embedding, doc_embedding)results.append((doc, similarity))# 按相似度降序排序results = sorted(results, key=lambda x: x[1], reverse=True)return [doc for doc, score in results if score > 0.75]  # 设定相似度阈值# 示例使用
documents = [{"content": "4K电视拥有超清晰的分辨率"},{"content": "液晶电视有多种型号"},{"content": "智能电视可以连接互联网"},
]
query = "高清电视"
results = search_documents(query, documents)
for result in results:print(result)

        关于机器学习的内容(自然语言处理NLP、语义分析、向量嵌入数据库、LLM微调等等),我近期会围绕这个主题更新一系列文章,欢迎关注噢,专栏地址人工智能与大模型icon-default.png?t=O83Ahttps://blog.csdn.net/rengj010617/category_12746789.html

五、总结

        模糊搜索作为搜索技术的基础部分,凭借其较强的容错性和高效性,广泛应用于各类场景。然而,在需求越来越复杂的今天,模糊搜索的局限性也逐渐显现,尤其在深层语义理解和复杂查询中。因此,模糊搜索在与语义搜索等新型搜索方式结合的过程中展现了更大的潜力。希望本文对你理解模糊搜索的背景、原理及应用有所帮助,助力你在实际项目中灵活运用这一工具。

         只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        其他热门文章,请关注:

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

        在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

        Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南

        干货含源码!如何用Java后端操作Docker(命令行篇)

        Idea启动SpringBoot程序报错:Port 8082 was already in use;端口冲突的原理与解决方案

        PDF预览:利用vue3-pdf-app实现前端PDF在线展示

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis5-缓存

目录 一级缓存 二级缓存 MyBatis缓存查询的顺序 整合第三方缓存EHCache 一级缓存 一级缓存是 SqlSession 级别的,通过同一个 SqlSession 查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问 一…

95.【C语言】数据结构之双向链表的头插,头删,查找,中间插入,中间删除和销毁函数

目录 1.双向链表的头插 方法一 方法二 2.双向链表的头删 3.双向链表的销毁 4.双向链表的某个节点的数据查找 5.双向链表的中间插入 5.双向链表的中间删除 6.对比顺序表和链表 承接94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删文章 1.双向链表的头插 方法…

24-11-9-读书笔记(三十二)-《契诃夫文集》(六)上([俄] 契诃夫 [译] 汝龙)药品是甜的,真理是美的,咖啡是苦的,生活是什么啊?

文章目录 《契诃夫文集》(六)上([俄] 契诃夫 [译] 汝龙)药品是甜的,真理是美的,咖啡是苦的,生活是什么啊?目录阅读笔记1. 新年的苦难2. 香槟3. 乞丐4. 仇敌5.薇罗琪卡6.在家里7. 太早…

【从零开始鸿蒙开发:01】自定义闪屏页

文章目录 大体介绍文件介绍各部分代码SplashPage.etsIndex.etsHomePage.etsroute_map.jsonmodule.json5 流程 大体介绍 文件介绍 其中: pages为我们的页面内容(我个人理解功能性小于activity但是大于fragment)route_map.json 为自定义的路由…

【Spring】获取Cookie和Session(@CookieValue()和@SessionAttribute())

文章目录 获取 Cookie传统获取 Cookie简洁获取 Cookie(注解) 获取 SessionSession 存储和获取简洁获取 Session (1)简洁获取 Session (2) 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给…

【机器学习】任务十:从函数分析到机器学习应用与BP神经网络

目录 1.从函数分析到机器学习应用 1.1 3D曲面图可视化报告 1.1.1 目标 1.1.2 代码分析 1.1.3 结果分析 1.1.4 观察与总结 1.1.5 结论 1.2 一元函数梯度计算报告 1.2.1 目标 1.2.2 代码分析 1.2.4 计算结果 1.2.5 优势与意义 1.2.6 结论 1.3 一元函数梯度和二阶导…

ios打包文件上传App Store windows工具

在苹果开发者中心上架IOS APP的时候,在苹果开发者中心不能直接上传打包文件,需要下载mac的xcode这些工具进行上传,但这些工具无法安装在windows或linux电脑上。 这里,我们可以不用xcode这些工具来上传,可以用国内的香…

Rust @绑定(Rust@绑定)(在模式匹配的同时将值绑定到变量)

文章目录 Rust中的绑定基础概念示例:基本模式匹配 绑定的使用示例:范围匹配并绑定变量 深入探索绑定的好处示例:复杂数据结构中的应用 总结 附加 Rust中的绑定 Rust 语言以其强类型系统和内存安全的特性著称。在进行模式匹配时,R…

JVM知识点大全(未完...)

JVM运行时数据区域 堆 堆是Java虚拟机中用于存储对象的主要区域,包括字符串常量池。绝大多数对象都是在堆中创建的(少部分对象可能会在栈上分配)。为了更好地进行垃圾回收,堆被划分为年轻代和老年代两部分。年轻代又被进一步分为E…

Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP

1.安装lua 1.1安装LuaJIT yum install readline-devel mkdir -p lua-file cd lua-file/ wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX/usr/local/luajit 1.2…

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…

Java - SpringBoot之logback设置日期分割并设置指定时间自动清除,Linux启动运行

一、SpringBoot之logback-spring.xml配置 在Spring Boot中,要设置日志按照日期进行分割输出,并设置日志文件的大小自动清除,可以使用logback日志框架的配置 1、创建文件 在项目的resources目录下,创建logback-spring.xml文件 …

window11安装elasticsearch+Kibana

1、下载elasticsearch与elasticsearch 下载elasticsearch 查看elasticsearch对应的Kibana版本 下载elasticsearch解压后文件目录如下 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等 bin配置文件目录,如elasticsearch配置、角色配置、jvm配置等 conf 默认…

【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)

一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan(本实验未使用) 4、上层…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】,提供一个MATLAB例程,仅以速度为观测量的SINS/GNSS组合导航(滤波方式为UKF) 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程:使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

java访问华为网管软件iMaster NCE的北向接口时传递参数问题

上一篇文章介绍了利用《java访问华为网管软件iMaster NCE的北向接口》的一般性步骤,这里详细介绍其中一个读取性能数据的示例。原因是读取华为网管软件北向接口,完全找不到可供参考的例子。如果不需要传递什么参数,就能获取到结果&#xff0c…

基于SpringBoot的“在线考试系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线考试系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统登录界面图 用户注册界面图 管…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

科大讯飞面经,蛮简单的

先来看面经: 下面我来简单聊聊这些问题。 自我介绍 关于如何自我介绍,这个如果还不会或者还没有准备,请先准备好你要如何向面试官介绍自己。 面试本来就是一个自我推销的方式之一,如果自我介绍都不会说,你如何卖个好价…

首次超越扩散模型和非自回归Transformer模型!字节开源RAR:自回归生成最新SOTA!

文章链接:https://arxiv.org/pdf/2411.00776 项目链接:https://yucornetto.github.io/projects/rar.html 代码&模型链接:https://github.com/bytedance/1d-tokenizer 亮点直击 RAR(随机排列自回归训练策略)&#x…