ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 22000|回复: 18

[原创] 字符串的相似度计算

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-8-3 17:00 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:其他结构和算法
工作需要,会涉及到整理大量的数据,遇到比较头疼的问题之一就是字符串类似。 比如客户   XXXX有限公司,XXXX公司,XXXX有限责任公司等等,其实是一个客户,但长期以来基础数据维护不好导致分散成了多个。比较难清理。

所以写了一个宏辅助,计算两个字符串的相似度来辅助查找可能重复的数据。好过一个个查询。如果大家有其他好办法请介绍介绍,呵呵。


算法:是用两个字符串滑动比较时匹配的字符数,和两字符串滑动比较的重叠率,定义了相似度。就是在两个字符串想比较时,将短的字符串拆开移动并增加空格,使它长度与长字符串一致,并最大程度使其他字符与长字符串中的字符匹配。根据插入的空格和匹配率在确定相似度。   这个算法还是蛮可靠的。大家可以在网上找到类似的算法说明。

宏写的比较烂,密码是welcome! 请大家指正。

能实现我需要的功能,开心,发帖。。{:soso_e113:}

用法:需要建“比较源”和“相似度”SHEET页,这些就没有仔细处理了,需要手工建一下。需要比较的数据放在比较源B列,运行宏即可。其他参数大家可以看看说明。

{:soso_e113:}

字符串相似度.rar

29.44 KB, 下载次数: 2678

点评

编辑距离(Levenshtein Distance),简称LD算法  发表于 2013-9-24 17:32

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-9-3 22:03 | 显示全部楼层
支持支持,我顶一个,用到了,谢谢高手了

TA的精华主题

TA的得分主题

发表于 2012-9-10 11:51 | 显示全部楼层
大侠,能不能再增加个功能,就是不同的地方加粗加大字号变色突出显示呢

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-9-14 11:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-1-22 12:42 | 显示全部楼层
  1. Option Explicit
  2. Sub TEST()
  3.     Dim i%, arr, brr(), n, k, d As Object, crr
  4.     arr = [a1].CurrentRegion
  5.     crr = [a1].CurrentRegion
  6.     Application.ScreenUpdating = False
  7.     For i = 1 To UBound(arr)
  8.         n = InStr(arr(i, 2), "公司")
  9.         If n > 0 Then
  10.             arr(i, 2) = Left(arr(i, 2), n - 1) & Right(arr(i, 2), Len(arr(i, 2)) - n - 1)
  11.         End If
  12.         n = InStr(arr(i, 2), "有限")
  13.         If n > 0 Then
  14.             arr(i, 2) = Left(arr(i, 2), n - 1) & Right(arr(i, 2), Len(arr(i, 2)) - n - 1)
  15.         End If
  16.         n = InStr(arr(i, 2), "责任")
  17.         If n > 0 Then
  18.             arr(i, 2) = Left(arr(i, 2), n - 1) & Right(arr(i, 2), Len(arr(i, 2)) - n - 1)
  19.         End If
  20.     Next
  21.     [a1].CurrentRegion = arr
  22.     n = 0
  23.     Set d = CreateObject("Scripting.Dictionary")
  24.     arr = [a1].CurrentRegion
  25.     For i = 1 To UBound(arr)
  26.         If Not d.exists(arr(i, 2)) Then
  27.             d(arr(i, 2)) = ""
  28.             n = n + 1
  29.             ReDim Preserve brr(1 To 5, 1 To n)
  30.             brr(1, n) = n: brr(2, n) = arr(i, 2) & "有限责任公司": brr(3, n) = arr(i, 3): brr(4, n) = arr(i, 4): brr(5, n) = arr(i, 5)
  31.         End If
  32.     Next
  33.     [a10].Resize(n, 5) = Application.Transpose(brr)
  34.     [a1].CurrentRegion = crr
  35.     Application.ScreenUpdating = True
  36. End Sub
复制代码
曾几何时也遇到此问题,数据量很大,名称五花八门,当时是这样解决的,把可能重复的值都列出来。然后只把关键字取出,然后进行判断,当然可能列不尽  所以正确率大概也只有80%左右,根据你的附近就是这样的。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-12 11:13 | 显示全部楼层
oracle数据库中有内置的函数,UTL_MATCH.EDIT_DISTANCE_SIMILARIT , 后来转到oracle库中处理。也很方便。脚本就不放上来了。

TA的精华主题

TA的得分主题

发表于 2015-1-22 13:20 | 显示全部楼层
Chtwo 发表于 2014-3-12 11:13
oracle数据库中有内置的函数,UTL_MATCH.EDIT_DISTANCE_SIMILARIT , 后来转到oracle库中处理。也很方便。脚 ...

Oracle中的这个就是Levenshtein算法,对中文好像不是很好。

TA的精华主题

TA的得分主题

发表于 2015-8-7 10:18 | 显示全部楼层
下载下来不会用啊,能不能说详细一些呢?

TA的精华主题

TA的得分主题

发表于 2015-8-7 16:54 | 显示全部楼层
是否应该这样子:

比较字符串Str1 按每2个字符一组拆分,存入字典。

遍历其余待检查字符串,同样每2个字符一组拆分,和字典进行比较。
如果相同则统计+1

同时,加入考虑位置、顺序的评估函数,最后得到相似度。呵呵。

TA的精华主题

TA的得分主题

发表于 2015-8-7 19:13 | 显示全部楼层
这种问题,我想再怎么好的算法都不能百分百准确,要考虑清楚自己情况是否能允许出错。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 08:57 , Processed in 0.043947 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表