波斯马BOSSMA Information Technology

一个计算相似度的问题

发布时间:2011年10月8日 / 分类:DataBase, Design / 13,016 次浏览 / 评论

在CSDN的BBS上看到一个计算兴趣相似度的问题,很感兴趣,在电子商务中应该有很大的用途。比如通过相似度寻找好友,通过相似度进行比较购物,通过相似度向顾客推荐一些可能感兴趣的商品等等。

首先虚拟一个场景:

某个网站有很多用户,每个用户注册的时候填写了自己的一些兴趣,现在要向网站中的用户推荐有相同兴趣的其它用户,促进用户之间的交流,从而增强网站的社交功能。

怎么办?

首先确定一个用户,获取这个用户的全部兴趣,

然后查找有这些兴趣的用户,兴趣数相同的数量越多,推荐的位置越靠前。

怎么实现?

最简单的办法就是遍历当前用户的兴趣,然后遍历用户表,如果用户有相同的兴趣,则相似度加1,通过这种双遍历的方式进行计算。

这个方法肯定可以。但是效率不高,用户数量庞大时服务器会比较累,而且不够优雅。

怎么优化?

通过SQL语句查找有相同兴趣的用户,这些用户中如果相同兴趣数量大于1,就会出现多条记录,然后对这些用户按照用户进行分组统计。

这样一条SQL语句即可查找到要推荐的其它用户,性能方面无法确认,不过如果数据表设计得当效率应比较好。

示例

1、创建三个表

用户表(User)、兴趣表(Interest)、用户与兴趣关联表(User2Interest)

CREATE TABLE [dbo].[User](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [RealName] [nvarchar](50) NULL,
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)
) ON [PRIMARY]

CREATE TABLE [dbo].[Interest](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
 CONSTRAINT [PK_Interest] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)
) ON [PRIMARY]

CREATE TABLE [dbo].[User2Interest](
    [UserId] [int] NOT NULL,
    [InterestId] [int] NOT NULL,
 CONSTRAINT [PK_User2Interest] PRIMARY KEY CLUSTERED
(
    [UserId] ASC,
    [InterestId] ASC
)
) ON [PRIMARY]

2、在数据表中插入一些测试记录:

User:


Interest:

User2Interest:

3、查询和某个用户有相同兴趣的其他用户

比如指定某个用户张三:

张三的UserId是1,这个在系统中一般很容易获取。

首先查找张三的兴趣:

select InterestId from User2Interest where UserId = 1

然后查找有相同兴趣的用户:

select UserId from User2Interest where UserId<>1 and InterestId in (select InterestId from User2Interest where UserId = 1)

然后对这些用户按照UserId进行分组,并使用count函数统计相似度,然后按照相似度排序:

select UserId,count(1) as similarity from User2Interest where UserId<>1 and InterestId in (select InterestId from User2Interest where UserId = 1) group by UserId order by similarity desc

看看查询结果:

这个示例对实际的问题进行了简化,你的应用可能很复杂,或者不具备其中的一些条件,比如每个兴趣可能有一个权重值,推荐的时候就会有一些复杂的计算了,一条SQl语句也许就很难完成了。

欢迎就这个方面讨论讨论。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《一个计算相似度的问题

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论