求两个数组的交集求相似度

n个list,求两两相似度大约70%的list的组合? - 知乎205被浏览16208分享邀请回答558 条评论分享收藏感谢收起4添加评论分享收藏感谢收起查看更多回答2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
2015年3月 总版技术专家分月排行榜第二2014年12月 总版技术专家分月排行榜第二2014年9月 总版技术专家分月排行榜第二
2015年3月 .NET技术大版内专家分月排行榜第一2015年2月 .NET技术大版内专家分月排行榜第一2015年1月 .NET技术大版内专家分月排行榜第一2014年12月 .NET技术大版内专家分月排行榜第一2014年11月 .NET技术大版内专家分月排行榜第一
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。我要文库申报
查看: 3811|回复: 3
如何对两表格的数据进行相似度对比,生成对应关系表格
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
网站名称: Excel技巧网 | Excel专家栖息谷 | 微软中文技术社区合作伙伴站内采编:
署名作者: xmyjk
版权声明: 版权归本站与作者共有 除本站官方外非作者本人转载须经许可并注明出处
适用版本: 07&2003以前版本&
语言环境: 简体中文
学习方法: 掌握Excel技巧的关键是动手操作
下载 ≠ 知识
免费注册成为本站会员,享用更多功能,结识更多Office办公高手!
才可以下载或查看,没有帐号?
Q:在供需表的型号A和供给表的型号B的中进行交叉比较,自动生成供需表。匹配建立连接后列表并标明相似类型。
两列中的单元格字符对比一下,有几种情况:
1.完全相同
2.你中有我
3.我在有你
4.所包含的最长连续英文数字字符相同
5.只对比连续的英文数字字符部分,中文忽略,像空格、- 这样的字符忽略
A:Option Explicit
Sub test()
& & Dim arr, i&, vr, mhs, j&, brr() As String, x As Long, ar(1 To 2), p, crr(1 To 2)
& & Dim d, drr, err
& & Set d = CreateObject(&scripting.dictionary&)
& & ar(1) = &需求&: ar(2) = &供给&
& & For p = 1 To 2
& && &&&Sheets(ar(p)).Select
& && &&&arr = Range([A2], [a65536].End(3))
& && &&&ReDim brr(1 To UBound(arr), 1 To 2) As String
& && &&&Set vr = CreateObject(&vbscript.regexp&)
& && &&&With vr
& && && && &.Global = True
& && && && &.Pattern = &[A-Za-z0-9]+&
& && && && &For i = 1 To UBound(arr)
& && && && && & Set mhs = .Execute(arr(i, 1)): brr(i, 2) = arr(i, 1)
& && && && && & If mhs.Count &= 2 Then
& && && && && && &&&x = mhs(0).Length: brr(i, 1) = mhs(0).Value
& && && && && && &&&For j = 1 To mhs.Count - 1
& && && && && && && && &If mhs(j).Length & x Then brr(i, 1) = mhs(j).Value
& && && && && && &&&Next
& && && && && & Else
& && && && && && &&&brr(i, 1) = mhs(0).Value
& && && && && & End If
& && && && &Next
& && &&&End With
& && &&&crr(p) = brr
& & Next
& & ReDim drr(1 To UBound(crr(1)) * UBound(crr(2)))
& & For i = 1 To UBound(crr(1))
& && &&&For j = 1 To UBound(crr(2))
& && && && &If crr(1)(i, 1) Like &*& & crr(2)(j, 1) & &*& Or crr(2)(j, 1) Like &*& & crr(1)(i, 1) & &*& Then
& && && && && & d(crr(1)(i, 2) & vbTab & crr(2)(j, 2)) = 0
& && && && &End If
& && &&&Next
& & Next
& & ReDim drr(1 To d.Count, 1 To 2)
& & err = d.keys
& & For i = 0 To d.Count - 1
& && &&&drr(i + 1, 1) = Split(err(i), vbTab)(0)
& && &&&drr(i + 1, 2) = Split(err(i), vbTab)(1)
& & Next
& & Sheets(&供需表&).Select
& & Sheets(&供需表&).UsedRange.Offset(1).Clear
& & Sheets(&供需表&).[A2].Resize(d.Count, 2) = drr
End Sub复制代码
21:48 上传
点击文件名下载附件
下载积分: 消费券 -5 Ti币
14.29 KB, 下载次数: 47, 下载积分: 消费券 -5 Ti币
如何对两表格的数据进行相似度对比,生成对应关系表格
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次管理次数 次
初级一, 积分 5, 距离下一级还需 45 积分
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次
1.对比条件只懂编这么两个:(arr(i, 1) Like &*& & brr(j, 1) & &*& Or brr(j, 1) Like &*& & arr(i, 1) & &*&) ,不能达到要求;
2.用双数组交叉比较,效率低;
3.多次使用拷贝、插入行、粘贴,这些操作使代码运行很慢。
请哪位老师帮忙改改代码,多谢!'对比生成供需表
Sub test()
On Error Resume Next
& &
Application.ScreenUpdating = False
Dim arr, brr, i As Long, j As Long, k As Long, l As Long, x As Long
With Sheets(&供给&)
& & l = .Range(&A65536&).End(xlUp).Row
& & brr = .Range(&A1:A& & l)
& &
With Sheets(&供需表&)
& & k = .Range(&A65536&).End(xlUp).Row
& & arr = .Range(&A1:B& & k)
& &
For i = k To 2 Step -1: x = 0
& &If arr(i, 2) = && Then
& &
& &For j = 2 To l
&&
& &If (arr(i, 1) Like &*& & brr(j, 1) & &*& Or brr(j, 1) Like &*& & arr(i, 1) & &*&) And brr(j, 1) && && And arr(i, 1) && && Then
& && && &
& & .Cells(i, 2).Resize(1, UBound(brr, 2)) = Application.Index(brr, j, 0)
& &
& & .Cells(i, 1).EntireRow.Copy
& &
& & .Cells(i, 1).EntireRow.Insert Shift:=xlDown: x = 1
& && &&&
& &End If
& &Next
& &
& &End If
& &
& &If x = 1 Then .Cells(i, 1).EntireRow.Delete
& &
Next
& &
& &
Application.ScreenUpdating = True
10:28 上传
点击文件名下载附件
下载积分: 消费券 -5 Ti币
13.12 KB, 下载次数: 11, 下载积分: 消费券 -5 Ti币
如何对两表格的数据进行相似度对比,生成对应关系表格
初级三, 积分 413, 距离下一级还需 87 积分
积分学习力
魅力值 影响力
消费券 Ti币好友
在线时间 小时
最后登录月度优秀 次
站长推荐 /1
40集公式入门动画教程,一天带你打好公式的基础。
Excel技巧网的会员探讨问题仅代表其个人意见,与网站的立场无关。任何违反国家和地方相关法律法规的言论,本站有义务协助政府相关部门追究发言者的责任!
本站中非注明转载文章与案例的版权为作者与Excel技巧网共有。若非原文作者,本站之外任何单位或个人未经允许,不得将其用于商业用途。
若非原文作者,任何形式的非商业性转载必须获得Excel技巧网或作者允许,并注明作者和出处。
会员发表的帖子如涉及版权纠纷,须自行负责。详情请参考注册时的网站服务条款。
本站特聘法律顾问:沈学律师
Powered by正文 本文信息本文由发表于 05:38 星期二,共 4241字。转载请注明:,如果我网站的文章对你有所帮助的话,来给个好评呗!在目前这个信息过载的星球上,文本的相似度计算应用前景还是比较广泛的,他可以让人们过滤掉很多相似的新闻,比如在搜索引擎上,相似度太高的页面,只需要展示一个就行了,还有就是,考试的时候,可以用这个来防作弊,同样的,论文的相似度检查也是一个检查论文是否抄袭的一个重要办法。文本相似度计算的方法很多,主要来说有两种,一是余弦定律,二是JaccardSimilarity方法,余弦定律不在本文的讨论范围之内,我们主要说一下JaccardSimilarity方法。,文章中详细说明了如何从一篇文本中提取有价值的词汇,感兴趣的童鞋可以看看。当然,本篇博客主要是说计算相似度的,所以词语的统计使用的比较简单的算法k-shingle算法,k是一个变量,表示提取文本中的k个字符,这个k可以自己定义。简单的说,该算法就是从头挨个扫描文本,然后依次把k个字符保存起来,比如有个文本,内容是abcdefg,k设为2,那得到的词语就是ab,bc,cd,de,ef,fg。得到这些词汇以后,然后统计每个词汇的数量,最后用上面的JaccardSimilarity算法来计算相似度。具体的简单代码如下:[python]
file_name_list=["/Users/wuyinghao/Documents/test1.txt",
"/Users/wuyinghao/Documents/test2.txt",
"/Users/wuyinghao/Documents/test3.txt"]
hash_contents=[]
#获取每个文本的词汇词频表
for file_name in file_name_list:
hash_contents.append([getHashInfoFromFile(file_name,5),file_name])
for index1,v1 in enumerate(hash_contents):
for index2,v2 in enumerate(hash_contents):
if(v1[1] != v2[1] and index2&index1):
intersection=calcIntersection(v1[0],v2[0]) #计算交集
union_set=calcUnionSet(v1[0],v2[0],intersection) #计算并集
print v1[1]+ "||||||" + v2[1] + " similarity is : " + str(calcSimilarity(intersection,union_set)) #计算相似度
完整的代码可以看我的中,直接用了字典和数组,将每个词汇变成了一个整数。比如上面说的abcdefg的词汇ab,bc,cd,de,ef,fg,分别变成了[0,1,2,3,4,5]
for index1,v1 in enumerate(file_name_list):
for index2,v2 in enumerate(file_name_list):
g_hash.clear()
hash_contents=[]
min_hashs=[]
if(v1 != v2 and index2&index1):
hash_contents.append(getHashInfoFromFile(v1)) #计算集合1的词汇表
hash_contents.append(getHashInfoFromFile(v2)) #计算集合2的词汇表
adjContentList(hash_contents) #调整hash表长度
a=[x for x in range(len(g_hash))]
minhash_pares=[2,3,5,7,11] #最小hash签名函数参数
for para in minhash_pares:
min_hashs.append(calcMinHash(para,len(g_hash),a)) #最小hash签名函数生成
sig_list=calcSignatureMat(len(min_hashs)) #生成签名列表矩阵
for index,content in enumerate(hash_contents):
calcSignatures(content,min_hashs,sig_list,index) #计算最终签名矩阵
simalar=calcSimilarity(sig_list) #计算相似度
res.append([v1,v2,simalar])
return res
同样,具体代码可以参考我的,代码没优化,只是做了算法描述的实现,内存占用还是多,呵呵
相关文章最新文章
我是方法,湖北黄冈人,现居北京。专注网络营销5年,提供整站SEO顾问服务! 记录SEO优化心得,分享SEO干货文章,发布SEO高薪工作,提供SEO咨询、SEO外包、SEO顾问服务,尽在方法博客!
点击查看更多详细个人介绍。
扫码关注方法SEO顾问微信公众号, 随时查看最新SEO好文章! <span class="tipso_style" id="tip-w" data-tipso=''> 文章: 1544篇 浏览量:1635649次 留言: 766条 运行时间:1558天 更多精彩内容文章目录
32 queries in 0.251 seconds, using 13.14MB memory

我要回帖

更多关于 数组相似度 的文章

 

随机推荐