ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 字符串相似度算法2 (余弦相似度算法 Cosine Similarity) VBA 实现

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-4-13 13:36 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Sub Test()

  2.     Debug.Print CosineSimilarity("http://excelhome", "http://club.excelhome") '相似度为0.9320546490018
  3.     Debug.Print CosineSimilarity("Excel VBA程序开发", "VBA程序") '相似度为0.645497224367903
  4.    
  5.     '余弦相似度 以 词 为单位, 对距离不敏感,所以下面这两个例子的相似度为 100%
  6.     Debug.Print CosineSimilarity("excelhome", "homeexcel")
  7.     Debug.Print CosineSimilarity("生活好美", "美好生活")
  8.    
  9. End Sub

  10. '余弦相似度算法 VBA 实现
  11. Function CosineSimilarity(strA As String, strB As String) As Double
  12.     Dim objDic_All As Object, objDic_1 As Object, objDic_2 As Object
  13.     Dim lngID As Long, strKey As String
  14.     Dim arrKey As Variant, arrResult As Variant
  15.     Dim dblSum As Double, dblVal_A As Double, dblVal_B As Double
  16.    
  17.     If strA = "" Or strB = "" Then
  18.         CosineSimilarity = 0
  19.         Exit Function
  20.     End If
  21.    
  22.     '==========================================================
  23.     'VBA下没有合适的 分词API
  24.     '只能分字了,太囧了
  25.     '
  26.     Set objDic_All = CreateObject("Scripting.Dictionary")
  27.     Set objDic_1 = CreateObject("Scripting.Dictionary")
  28.     Set objDic_2 = CreateObject("Scripting.Dictionary")
  29.    
  30.     For lngID = 1 To Len(strA)
  31.         strKey = Trim(Mid(strA, lngID, 1))
  32.         If strKey <> "" Then
  33.             objDic_All(strKey) = ""
  34.             objDic_1(strKey) = Val(objDic_1(strKey)) + 1
  35.         End If
  36.     Next
  37.     For lngID = 1 To Len(strB)
  38.         strKey = Trim(Mid(strB, lngID, 1))
  39.         If strKey <> "" Then
  40.             objDic_All(strKey) = ""
  41.             objDic_2(strKey) = Val(objDic_2(strKey)) + 1
  42.         End If
  43.     Next
  44.     '上面的这部分代码,如果有合适的分词工具,会更加精准
  45.     '==========================================================
  46.    
  47.     arrKey = objDic_All.keys
  48.     ReDim arrResult(LBound(arrKey) To UBound(arrKey), 1 To 3)
  49.    
  50.     For lngID = LBound(arrKey) To UBound(arrKey)
  51.         arrResult(lngID, 1) = arrKey(lngID)
  52.         arrResult(lngID, 2) = objDic_1(arrKey(lngID)) + 0
  53.         arrResult(lngID, 3) = objDic_2(arrKey(lngID)) + 0
  54.     Next
  55.    
  56.     Set objDic_All = Nothing
  57.     Set objDic_1 = Nothing
  58.     Set objDic_2 = Nothing
  59.    
  60.     For lngID = LBound(arrResult) To UBound(arrResult)
  61.         dblSum = dblSum + arrResult(lngID, 2) * arrResult(lngID, 3)
  62.         dblVal_A = dblVal_A + arrResult(lngID, 2) ^ 2
  63.         dblVal_B = dblVal_B + arrResult(lngID, 3) ^ 2
  64.     Next
  65.    
  66.     CosineSimilarity = dblSum / (Sqr(dblVal_A) * Sqr(dblVal_B))
  67. End Function
复制代码


评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-11-21 19:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
标注一下,下载学习,很棒呀
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-24 07:43 , Processed in 0.024978 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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