在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:
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语句也许就很难完成了。
欢迎就这个方面讨论讨论。
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论