You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constvalid_options=['format','name','filename','generate','outputFilename','cssOutputFilename','sveltePath','dev','accessors','immutable','hydratable','legacy','customElement','tag','css','loopGuardTimeout','preserveComments','preserveWhitespace'];// 如果当前操作不在验证项中,才会进行模糊匹配if(!valid_options.includes(key)){// 匹配后返回 match 或者 nullconstmatch=fuzzymatch(key,valid_options);letmessage=`Unrecognized option '${key}'`;if(match)message+=` (did you mean '${match}'?)`;thrownewError(message);}
在开发的过程中,我们会使用各种指令。有时候,我们由于这样或者那样的原因,写错了某些指令。此时,应用程序往往会爆出错误。
可以看到,当前代码不仅仅提示了当前你输入的配置错误。同时还提供了类似当前输入的近似匹配指令。非常的智能。此时,我们需要使用算法来计算,即模糊集。
事实上,模糊集其实可以解决一些现实的问题。例如我们有一个“高个子”集合 A,定义 1.75m 为高个子。那么在通用逻辑中我们会认为某一个元素隶属或者不隶属该集合。也就是 1.78 就是高个子,而 1.749 就不是高个子,即使它距离 1.75 米只差里一毫米。该集合被称为(two-valued 二元集),与此相对的,模糊集合则没有这种问题。
在模糊集合中,所有人都是集合 A 的成员,所不同的仅仅是匹配度而已。我们可以通过计算匹配度来决定差异性。
如何运行
言归正转,我们回到当前实现。对于模糊集的实现,我们可以参考 fuzzyset.js (注: 该库需要商业许可) 和 fuzzyset.js 交互式文档 进行学习。
在这里,我仅仅只介绍基本算法,至于数据存储和优化在完整实现中。
通过查看交互式文档,我们可以算法是通过余弦相似度公式去计算。
在直角坐标系中,相似度公式如此计算。
而相似度公式是通过将字符串转化为数字矢量来计算。如果当前的字符串分别为 “smaller” 和 “smeller”。我们需要分解字符串子串来计算。
当前可以分解的字符串子串可以根据项目来自行调整,简单起见,我们这里使用 2 为单位。
两个字符串可以被分解为:
我们可以根据当前把代码变为如下向量:
然后我们可以计算 small * smell 为:
同时我们可以计算 |small|*|smell| 为:
同理可得当前 smell sqrt 也是 2.449。
最终的计算为: 4 / (2.449 * 2.449) = 0.66 。
计算方式为
则 small 与 smell 在子字符串为 2 情况下匹配度为 0.66。
当然,我们看到开头和结束添加了 - 也作为标识符号,该标识是为了识别出 sell 与 llse 之间的不同,如果使用
我们可以看到当前的相似的只有 'll' 和 'se' 两个子字符串。
完整代码
编译型框架 svelte 项目代码中用到此功能,使用代码解析如下:
实现代码如下所示:
参考资料
fuzzyset.js 交互式文档
svelte fuzzymatch
The text was updated successfully, but these errors were encountered: