请教一个相似度算法

廖雪峰 2006-09-04 09:56:10
现在定义的一个商品有多个属性,例如

商品A:P1, P2, P5, P6, P9
商品B: P2, P5, P6, P7, P9, P10
商品C: P1, P2, P7

则相对于A来说B有4个属性和A相同而C只有2个,

则与A类似的商品应选出B而非C

现在数据都是存在关系表中,一个Product表,一个Property表,一个关联表,

请问如何实现这种最相似匹配的选择算法?
谢谢!
...全文
359 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nako_ruru 2006-12-08
  • 打赏
  • 举报
回复
简单的,可以考虑用哈希表来获得两个集合的交集的元素个数。

另外,个人认为LCS和这个略有些区别,毕竟集合是无序性的。
lobatt 2006-12-06
  • 打赏
  • 举报
回复
楼上的没有认识到lz的问题实质
lz的问题实际上是集合的相似度
对应到你的测试集,就是要先切词(或切字) 再比较
比如“谁是我”和“我是谁啊”的相似度也要是75%...

对于搂主的问题,建议按属性类别输出结果为一个数组。然后使用LCS算法
例如:
玻璃珠:质量300mg,颜色浅蓝,售价0.05$
钻石A: 质量300mg, 颜色浅蓝,售价5000$
钻石B: 质量290mg,颜色浅绿,售价3000$
--借用 火山 的例子:),然后利用LCS算法

当然火山兄的问题也有道理,因此,真实系统中应该要引入权值机制,比如质地和售价权值较高
颜色和质量权值较低...这样应该可以解决一部分问题
超级大笨狼 2006-12-05
  • 打赏
  • 举报
回复
--CSDN超级大笨狼。





CREATE function get_semblance_By_2words
(
@word1 varchar(50),
@word2 varchar(50)
)
returns nvarchar(4000)
as
begin
declare @re int
declare @maxLenth int
declare @i int,@l int
declare @tb1 table(child varchar(50))
declare @tb2 table(child varchar(50))
set @i=1
set @l=2
set @maxLenth=len(@word1)
if len(@word1)<len(@word2)
begin
set @maxLenth=len(@word2)
end
while @l<=len(@word1)
begin
while @i<len(@word1)-1
begin
insert @tb1 (child) values( SUBSTRING(@word1,@i,@l) )
set @i=@i+1
end
set @i=1
set @l=@l+1
end


set @i=1
set @l=2


while @l<=len(@word2)
begin
while @i<len(@word2)-1
begin
insert @tb2 (child) values( SUBSTRING(@word2,@i,@l) )
set @i=@i+1
end
set @i=1
set @l=@l+1
end

select @re=isnull(max( len(a.child)*100/ @maxLenth ) ,0) from @tb1 a, @tb2 b where a.child=b.child
return @re
end








GO

--测试
--select dbo.get_semblance_By_2words('我是谁','我是谁啊')
--75
--相似度
yyfhz 2006-09-07
  • 打赏
  • 举报
回复
玻璃珠:质量300mg,颜色浅蓝,售价0.05$
钻石A: 质量300mg, 颜色浅蓝,售价5000$
钻石B: 质量290mg,颜色浅绿,售价3000$

能说 玻璃珠和钻石A相似吗???
jixingzhong 2006-09-07
  • 打赏
  • 举报
回复
需要考虑的一个问题是,
如果属性是子集的情况怎么处理?

比如 B 包含 C 所有属性,
A 包含 C 所有属性,
那么 C 最相似于谁?

或者是 C 和 A B 具有同样个数的一致属性,
如何处理 ...
jixingzhong 2006-09-07
  • 打赏
  • 举报
回复
这么设计行不:

商品A:P1, P2, P5, P6, P9 ==》 char A[][3]={"P1","P2", "P5", "P6", "P9",""};
...//末尾的 空串是作为标记用的

然后比较...
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。 本视频由微软全球最有价值专家尹成录制,拒绝念PPT,代码实战数据结构与算法导论。除了传统数据结构算法,加入高并发线程安全数据结构,分布式负载均衡算法,分布式哈希表,分布式排序等等现代算法。  算法,晦涩难懂,却又是IT领域受重视的素养之一。可以说,算法能力往往决定了一个程序员能够走多远。因此,BAT/FLAG等国内外各大名企非常喜欢在面试环节考核求职者的算法编程,这也成为了无数准程序员们过不去的一道“坎”。如何入门并成为一名出色的算法工程师?但无论半路出家还是科班出身,除学生时代搞算法竞赛的同学外真正用心学习过算法与数据结构太少太少。对于后期想要学习算法与数据结构却不得不面对以下问题:没有自己的知识框架,无法关联知识点,学习效率低有疑问而无人解答,有问题无法理解全靠猜测,一个问题卡好几天市面上资料题解质量参差不齐,正确性未可知Google算法-工程师尹成大哥学习算法

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧