模糊匹配——编辑距离

wils
wils

创作者俱乐部成员

今天的问题是:对于互不包含的字符串,怎么进行模糊匹配:

广东美雅股份有限公司

康达尔A

海南珠江实业股份有限公司

琼珠江A

河南双汇实业股份有限公司

粤美雅

湖南正虹饲料股份有限公司

株州庆云

南宁糖业股份有限公司

正虹饲料

深圳康达尔(集团)股份有限公司

新希望

四川新希望农业股份有限公司

双汇实业

株洲庆云发展股份有限公司

南宁糖业

先在JS宏里,引入这个levenshtein编辑距离库:

https://github.com/gustf/js-levenshtein

然后在公式里,用编辑距离除以两个字符串长度之和,取这个商的最小值所对应的行

💡

=LET(a,MAP($A$1:$A$8,LAMBDA(x,lev(x,B1)/LEN(x&B1))),INDEX($A$1:$A$8,MATCH(MIN(a),a,0)))

这里除以两个字符串长度之和,还是有点粗糙,可以再用分词库将字符串分词、排序、去重之后,再计算编辑距离,可以针对不同情况进行优化。

例子写的比较粗糙,只是演示JS宏通过引入编辑距离库,可以进行比较准确的模糊匹配

海南省
浏览 809
4
6
分享
6 +1
15
4 +1
全部评论 15
 
南京的天
您好,我在使用 xloil 中遇到个问题,试了很多方法都无法解决,能麻烦帮忙看看是哪里的问题吗?我已经在您 EH 的帖子里求助了,如果有空帮看看吧,先谢谢您了
· 北京
回复
 
南京的天
您好,可以麻烦详细说一下怎么引入第三方库吗?我已经阅读了您之前的帖子https://bbs.wps.cn/topic/15559,js宏使用npm库解决排列组合问题,但还是不会,我该复制哪个文件的代码到js里呢?然后如何使用呢,小弟愚笨,还请指教
· 山西省
回复
wils
wils

创作者俱乐部成员

是我没说清楚,代码在index.js里,如果熟悉js,可以用打包工具打一下包 这里这个函数比较简单,可以手工修改一下 【金山文档 | WPS云文档】 编辑距离 https://kdocs.cn/l/cdnjAmi4Fnc0
· 广东省
回复
 
南京的天
关于此问题,我是借助了楼主此前推荐的xloil库,用python自带的difflib库写了一个自定义函数,转换成xll,加载到wps,需要的时候随时可以使用
· 山西省
1
回复
 
耀愿
学习了。留用
· 广东省
回复
 
千叶
=LAMBDA(ARR,X,LET(A,FIND(REGEXP(X,"."),ARR),B,BYROW(A,LAMBDA(Y,COUNT(Y))),XLOOKUP(MAX(B),B,ARR)))($A$1:$A$8,B1)
· 江西省
1
回复
wils
wils

创作者俱乐部成员

确实,例子比较简单,统计搜到的次数就挺好了 编辑距离不仅考虑出现,也会考虑位置信息,算是通用性强一点的方法 也有两个字符移动窗口查找计数的算法,那个更快 最后选哪个还是得看具体的数据。。。
· 海南省
回复
 
亂雲飛渡
学习
· 广东省
回复
 
方盛
方盛

创作者俱乐部成员

这个我有点错乱了,你B列的琼珠江A的琼是怎么来的。第三个岳美雅怎么没有A,第五个正宏饲料怎么不是湖南或者南宁。就是这一列的的匹配是以什么规则来的?
· 湖北省
回复
wils
wils

创作者俱乐部成员

ab两列是待匹配的数据,c列是公式,计算a列每一项相对于b1的编辑距离,除以字符串长度和,商最小的哪一项 简单说,b列相当于vlookup第一个参数,a列是第二参数查找的范围,然后用的是模糊匹配
· 海南省
回复