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

模糊匹配fuzzywuzzy

词表模糊匹配详解​

一、概念​

词表模糊匹配,是指在给定的词表中,寻找与目标字符串不完全精确,但在一定规则或相似度度量下,语义相近、拼写相似或具有相关性的词汇的过程。与精确匹配不同,模糊匹配放宽了匹配条件,能够处理存在一定差异的文本,在自然语言处理、搜索引擎、数据清洗、信息检索等领域有着广泛应用。​

例如,在搜索引擎中,用户输入 “电脑”,词表中存在 “计算机”,虽然二者不是完全相同的词汇,但语义相近,通过模糊匹配技术,可以将包含 “计算机” 的内容也展示给用户,从而提高搜索结果的完整性和相关性。再如,在数据录入过程中,由于人工输入错误,“北京” 被误输成 “北就”,利用模糊匹配,能够识别出这两个字符串的相似性,从而纠正错误或关联相关数据。​

二、常见算法​

(一)编辑距离算法(Levenshtein Distance)​

  1. 原理:编辑距离,也称为莱文斯坦距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符、插入一个字符、删除一个字符。两个字符串之间的编辑距离越小,它们就越相似。​
  1. 示例:计算 “kitten” 和 “sitting” 的编辑距离。​
  • 将 “kitten” 中的 “k” 替换为 “s”;​
  • 在 “kitten” 的末尾插入 “g”;​
  • 经过 2 次编辑操作可以将 “kitten” 转换为 “sitting”,所以它们的编辑距离为 2。​
  1. 应用场景:适用于处理拼写错误的检测与纠正,例如在文本校对系统中,判断输入的单词与词表中正确单词的编辑距离,当距离小于某个阈值时,认为是相似单词,给出拼写建议。​

(二)Jaccard 相似度算法​

  1. 原理:Jaccard 相似度用于比较两个集合的相似性,其计算方式是两个集合交集的元素个数除以并集的元素个数。在文本处理中,通常将字符串转换为字符集合或单词集合来计算相似度。​
  1. 示例:设有字符串 A = “apple,banana,cherry”,B = “banana,cherry,date”,将它们转换为单词集合 {apple, banana, cherry} 和 {banana, cherry, date}。​
  • 交集为 {banana, cherry},元素个数为 2;​
  • 并集为 {apple, banana, cherry, date},元素个数为 4;​
  • Jaccard 相似度 = 2 / 4 = 0.5。​
  1. 应用场景:常用于判断文本内容的相似性,比如在新闻去重系统中,计算不同新闻文章的 Jaccard 相似度,相似度较高的文章可能存在重复内容,可进行去重处理。​

(三)最长公共子序列算法(Longest Common Subsequence,LCS)​

  1. 原理:最长公共子序列是指在两个字符串中,找出最长的、顺序保持一致但不一定连续的子序列。两个字符串的最长公共子序列越长,说明它们的相似程度越高。​
  1. 示例:对于字符串 “ABCDGH” 和 “AEDFHR”,其最长公共子序列为 “ADH”,长度为 3。​
  1. 应用场景:在版本控制软件中,比较文件的不同版本之间的差异;在自然语言处理中,分析文本之间的语义相似性等。

fuzzywuzzy 库实现各种模糊匹配方法的代码示例

一、简单比率匹配(fuzz.ratio)

fuzz.ratio方法计算两个字符串的相似度,它基于编辑距离,通过比较字符的插入、删除和替换操作数量来确定相似度,返回 0 到 100 之间的整数,数值越高表示相似度越高。

from fuzzywuzzy import fuzzword_list = ["apple", "banana", "cherry", "date"]target_word = "appel"for word in word_list:similarity = fuzz.ratio(target_word, word)print(f"{word}与{target_word}的简单比率相似度为{similarity}")

上述代码中,target_word是目标字符串,word_list是词表,循环遍历词表中的每个单词,使用fuzz.ratio计算与目标字符串的相似度并输出。

二、部分比率匹配(fuzz.partial_ratio)

fuzz.partial_ratio用于处理一个字符串是另一个字符串的子串的情况,它会将短字符串与长字符串的所有子串进行比较,返回最大相似度值,同样返回 0 到 100 之间的整数。

from fuzzywuzzy import fuzzstring1 = "apple is a fruit"string2 = "apple"similarity = fuzz.partial_ratio(string1, string2)print(f"{string2}与{string1}的部分比率相似度为{similarity}")

在这段代码里,string1包含string2,使用fuzz.partial_ratio能准确计算出二者较高的相似度,适合判断一个字符串是否部分包含另一个字符串的场景。

三、标记排序比率匹配(fuzz.token_sort_ratio)

fuzz.token_sort_ratio先将字符串拆分为标记(通常是单词),对标记进行排序后再计算相似度。它能忽略单词顺序的差异,返回 0 到 100 之间的整数。

from fuzzywuzzy import fuzzstring1 = "apple banana cherry"string2 = "banana cherry apple"similarity = fuzz.token_sort_ratio(string1, string2)print(f"{string2}与{string1}的标记排序比率相似度为{similarity}")

此示例中,string1和string2单词相同但顺序不同,fuzz.token_sort_ratio可以识别出它们的相似性,常用于比较语义相同但语序不同的文本。

四、标记集合比率匹配(fuzz.token_set_ratio)

fuzz.token_set_ratio基于字符串中单词的集合来计算相似度,它会忽略重复的单词,并且不考虑单词的顺序和出现次数,只关注单词是否存在于字符串中,返回 0 到 100 之间的整数。

from fuzzywuzzy import fuzzstring1 = "apple banana banana"string2 = "banana apple"similarity = fuzz.token_set_ratio(string1, string2)print(f"{string2}与{string1}的标记集合比率相似度为{similarity}")

在该代码中,即使string1里 “banana” 重复出现,fuzz.token_set_ratio也只将其视为一个元素,从而准确计算出与string2的相似度,适用于只关心文本中包含的词汇,不关注词汇重复和顺序的匹配场景。

http://www.dtcms.com/a/298276.html

相关文章:

  • c++文件操作详解
  • ubuntu安装cuda版本问题
  • 平时开发中使用 Redis 分布式锁,有哪些需要注意的问题?
  • Mysql 日志 binlog redolog
  • 基于springboot的剧本杀预约管理系统
  • Metaspace耗尽导致OOM问题
  • JAVA知识点(三):Spring与ORM框架
  • 【lucene】如何给StandardAnalyzer添加charfilter
  • HANA语法随手记:<> ‘NULL‘值问题
  • php算法-- 关联数组使用,优化sip账号去重
  • 验证 GitHub Pages 的自定义域(Windows)
  • 从混乱到秩序:IT服务管理如何重塑企业运营效率
  • CTF-Web题解:“require_once(‘flag.php‘); assert(“$i == $u“);”
  • C++ STL常用容器总结(vector, deque, list, map, set)
  • Schmidt 分解 ⚙️ 与 SVD 之间的本质联系
  • IDM:registered with a fake serial number
  • TDengine 转化函数 TO_UNIXTIMESTAMP 用户手册
  • 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
  • Java 笔记 lambda
  • 多层感知机(深度学习-李沐-学习笔记)
  • 【WPS】office邮件合并,怎么将数据源excel中的下一条拼接在文档中的下一个位置
  • selenium 元素定位
  • 深入浅出设计模式——创建型模式之工厂模式
  • 机器学习(九):KNN算法全解析与项目实践
  • 记录es收集日志报错问题as the final mapping would have more than 1 type[XXX,doc]
  • HCIP MGRE实验
  • 【机器学习之推荐算法】基于矩阵分解和损失函数梯度下降的协同过滤算法实现
  • RAG实战指南 Day 24:上下文构建与提示工程
  • C 语言 | 结构体详解:自定义数据类型的艺术
  • 【第四章:大模型(LLM)】01.神经网络中的 NLP-(1)RNN、LSTM 和 GRU 的基本原理和应用