对数据进行模糊匹配搜索(动态规划、最长公共子串、最长公共子序列)

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 倘若要在一堆数据中对一个关键词进行匹配搜索,传统做法是把数据拆分开,然后遍历他们,看看是否包含这个关键词,对于 “fin” 和 “finish” 这样存在包含关系的单词来说是没问题的,但是对于 “fish” 和 “finish” 这样并不存在包含关系的单词就失效了,这时候期望计算出两个单词的相似性,比如 “fish” 和 “finish” 都包含 “ish”,“ish” 的长度是 3,我们可以理解相似性为 3。目前主流做法是通过最长公共子串来寻找两个或多个已知字符串最长的子串。

在搜索时常常在输入一半或者输入错误时,搜索引擎就给出智能提示。

搜索框

已知的搜索推荐主要包括以下几个方面:

  • 包含:“清华” 和 “清华大学”
  • 相似:“聊天软件” 和 “通讯软件”
  • 相关:“明星” 和 “刘亦菲”
  • 纠错:“好奇害死毛” 和 “好奇害死猫”

其中包含模糊匹配可以使用动态规划算法解决,其他几个则要大量数据进行机器学习才行。

倘若要在一堆数据中对一个关键词进行匹配搜索,传统做法是把数据拆分开,然后遍历他们,看看是否包含这个关键词,对于 “fin” 和 “finish” 这样存在包含关系的单词来说是没问题的,但是对于 “fish” 和 “finish” 这样并不存在包含关系的单词就失效了,这时候期望计算出两个单词的相似性,比如 “fish” 和 “finish” 都包含 “ish”,“ish” 的长度是 3,我们可以理解相似性为 3。目前主流做法是通过最长公共子串来寻找两个或多个已知字符串最长的子串。

注:深拷贝使用了依赖库,需先安装 npm install mazey --save

最长公共子串示例:

import { deepCopy } from 'mazey';

/**
 * @method calLongestCommonSubstring
 * @description 计算两个字符串的最长公共子串
 * @param {String} aStr 字符串
 * @param {String} bStr 字符串
 * @return {Number} 长度
 */
function calLongestCommonSubstring (aStr, bStr) {
    const aLen = aStr.length;
    const bLen = bStr.length;
    // 创建二维数组并且深拷贝
    const arr = deepCopy(new Array(aLen).fill(new Array(bLen).fill(0)));
    for (let i = 0; i < aLen; ++i) {
        for (let j = 0; j < bLen; ++j) {
            if (aStr[i] === bStr[j]) {
                let baseNum = 0;
                if (i > 0 && j > 0) {
                    baseNum = arr[i-1][j-1];
                }
                arr[i][j] = baseNum + 1;
            }
        }
    }
    // 二维数组转一维数组
    const arr1 = Array.prototype.concat.apply([], arr);
    // 获取最长公共子串
    const maxLong = Math.max(...arr1);
    return maxLong;
}

calLongestCommonSubstring('fish', 'finish'); // 3

“fish” 和 “finish” 除了 “ish” 之外还共同包含 “f”,所以 “ish” + “f” 更好的表达其相似性(3 + 1 = 4),于是使用最长公共子序列对最长公共子串进行升级来查找所有序列中最长子序列,版本管理中使用的 git diff 就是建立在最长公共子序列的基础上。

最长公共子序列示例:

import { deepCopy } from 'mazey';

/**
 * @method calLongestCommonSubsequence
 * @description 计算两个字符串的最长公共子序列
 * @param {String} aStr 字符串
 * @param {String} bStr 字符串
 * @return {Number} 长度
 */
function calLongestCommonSubsequence (aStr, bStr) {
  const aLen = aStr.length;
  const bLen = bStr.length;
  const arr = deepCopy(new Array(aLen).fill(new Array(bLen).fill(0)));
  for (let i = 0; i < aLen; ++i) {
    for (let j = 0; j < bLen; ++j) {
      if (aStr[i] === bStr[j]) {
        let baseNum = 0;
        if (i > 0 && j > 0) {
          baseNum = arr[i - 1][j - 1];
        }
        arr[i][j] = baseNum + 1;
      } else {
        let [leftValue, topValue] = [0, 0];
        if (j > 0) {
          leftValue = arr[i][j - 1];
        }
        if (i > 0) {
          topValue = arr[i - 1][j];
        }
        arr[i][j] = Math.max(leftValue, topValue);
      }
    }
  }
  // 二维数组转一维数组
  const arr1 = Array.prototype.concat.apply([], arr);
  // 获取最长公共子串
  const maxLong = Math.max(...arr1);
  return maxLong;
}

calLongestCommonSubsequence('fish', 'finish'); // 4

参考

  1. 1143. 最长公共子序列 - 力扣(LeetCode)
  2. 搜索引擎如何做到模糊匹配?

版权声明

本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者后除和本文原始地址:https://blog.mazey.net/1595.html

(完)

目录
相关文章
|
Windows
msi文件解包
msi文件解包
2512 1
msi文件解包
EMQ
|
存储 域名解析 NoSQL
使用 EMQX Cloud 实现物联网设备一机一密验证
本文将采用 Redis 作为认证数据源存储数据库,讲解如何通过物联网设备端证书中包含的 Common Name 为验证信息,连接到 EMQX Cloud,实现客户端一机一密验证。
EMQ
1033 1
使用 EMQX Cloud 实现物联网设备一机一密验证
|
5月前
|
安全 Serverless PHP
“Fatal error: require(): Failed opening required...” 以及如何彻底避免它再次出现
本文深入剖析PHP中“Fatal error: require() failed”错误的根源,从文件加载机制、路径解析原理到5类高频线上事故,系统讲解如何用绝对路径、防御式加载、OPcache优化等工程化手段彻底规避。适合追求稳定性的PHP开发者。
333 3
|
11月前
|
数据可视化
轻量级项目排期模板零配置指南:5分钟搭建敏捷时间线
你是否在用 Excel 做项目排期时遇到诸多困扰?本文介绍轻量级项目排期模板,无需公式函数,零基础也能 10 分钟上手,通过可视化设计、轻量化操作和实时协作,帮助团队高效管理项目,告别信息混乱与低效沟通。
轻量级项目排期模板零配置指南:5分钟搭建敏捷时间线
|
7月前
|
监控 NoSQL JavaScript
1-JeecgBoot介绍
JeecgBoot是一款基于代码生成器的低代码开发平台,采用SpringBoot2.x、Vue、Ant Design等主流技术,实现前后端分离。支持分布式、微服务架构,集成Shiro、JWT、Redis、Nacos等组件,提供高效开发能力。
|
10月前
|
算法 数据挖掘 数据库
通过 SQL 快速使用 OceanBase 向量检索学习笔记
通过 SQL 快速使用 OceanBase 向量检索学习笔记
|
12月前
|
数据采集 监控 算法
Python文件与目录比较全攻略:从基础操作到性能优化
文件比较的核心在于数据指纹校验,通过逐字节比对生成唯一标识,确保内容一致性。从标准库的os与filecmp到高性能第三方库如pydiffx,再到分布式与量子加密技术的未来趋势,文件比较广泛应用于数据备份、代码审查与系统监控等领域,是保障数据完整性的关键技术手段。
251 0
开发指南029-el-table-column对齐属性
按开发文档和正常理解,el-table-column具有属性align,可以填left,center,right控制内容的对齐方式
|
机器学习/深度学习 人工智能 搜索推荐
《深度剖析:鸿蒙系统下智能NPC与游戏剧情的深度融合》
鸿蒙系统为游戏开发带来新机遇,尤其在人工智能游戏中,实现智能NPC与剧情的深度融合成为关键。通过机器学习行为模型和感知决策系统,NPC能根据玩家操作做出合理反应;结合动态剧情生成和数据驱动融合方式,使游戏体验更沉浸、个性化。尽管面临技术挑战,但鸿蒙系统的多设备协同和性能优势,为打造未来智能化游戏奠定了基础。
514 11
|
机器学习/深度学习 算法 数据安全/隐私保护
数据链中常见电磁干扰matlab仿真,对比噪声调频,线性调频,噪声,扫频,灵巧五种干扰模型
本项目展示了用于分析和模拟电磁干扰对数据链系统影响的算法。通过Matlab 2022a运行,提供无水印效果图预览。完整代码包含详细中文注释及操作视频。理论部分涵盖五种常见干扰模型:噪声调频、线性调频、噪声、扫频和灵巧干扰,详细介绍其原理并进行对比分析。灵巧干扰采用智能技术如认知无线电和机器学习,自适应调整干扰策略以优化效果。