基于地域和热度的酒店推荐系统

实验5:创建一个基于地域和热度的酒店推荐系统

一、主要实现酒店推荐, 根据用户所在的地区和所选择的排序方式返回相应的前k个酒 店数据。
•数据集都取所在地址是北京的, 包含朝阳区、 丰台区、 东城区、 西城区、 海淀区、 顺义 区、 石景山区、 延庆区、 房山区、 通州区。
•支持排序的字段有:评论数目、装修时间、开业时间、评分、最低价格,以及综合排序。
•程序中通过type字段进行赋值。
•排序方式分为升序和降序。
“综合排序”的实现思路

二、“综合排序” 是对其余排序字段的线性整合。这里简单地定义了各个排序字段的权重,通过线性相加的方式计算出最后的总得分, 然后根据这个得分对酒店进行排序。

(1) 对“装修时间” 和 “开业时间” 做了差值处理。这里认为装修时间越久, 对最终的排 序越起到负向作用, 所以, 使用装修时间减去 2018 得到一个负值。 同理, 认为开业时间越久对 最终的排序越起到正向作用, 所以使用 2018 减去开业时间得到一个正值。
(2)对参与计算的各个字段做归一化处理, 采用的是 min-max 归一化。
(3)得到最终的 “ 综合排序” 的计算公式为:
Score= 1× 评分+2×评论数目+ 3× 装修时间+ 3× 开业时间+ 4× 最低价格
提示:这里的权重是由作者主观评判得到的。 在真实环境中可以调节相应因素的权重值,来对结果进行调整。

三、代码实现

# -*- coding: utf-8 -*-
"""
Spyder 编辑器

这是一个临时脚本文件。
"""

import pandas as pd
#创建RecBasedAH类
class RecBasedAH:
    def __init__(self,path=None,addr="朝阳区",type="score",k=10, sort=False):
        self.path = path
        self.addr = addr
        self.type = type
        self.k = k
        self.sort = sort
        self.data = self.load_mess()


# 使用pandas加载数据
    def load_mess(self):
        data =pd.read_csv(self.path,header=0,sep=",",encoding='GBK')
        return data[data["addr"]==self.addr]


#为用户推荐酒店
    def reccomend(self):
        if self.type in ["score","comment_num","lowest_price","decoration_time","open_time"]:
            data = self.data.sort_values(by=[self.type, "lowest_price"], ascending=self.sort)[:self.k]
            return dict(data.filter(items=["name",self.type]).values)
        elif self.type == "combine":      # 综合排序,综合以上五种因素
            # 过滤得到使用的信息
            data = self.data.filter(items=["name","score","comment_num","decoration_time","open_time","lowest_price"])
            # 对装修时间做处理
            data["decoration_time"] = data["decoration_time"].apply(lambda  x: int(x) - 2021)
           # 对开业时间做处理
            data["open_time"] = data["open_time"].apply(lambda  x: 2021 - int(x))
 # 数据归一化
            for col in data.keys():
                if col !="name":
                    data[col]  = ( data[col] - data[col].min() ) / (data[col].max() - data[col].min() )

            # 这里认为 评分的权重为1,评论数目权重为2,装修和开业时间权重为3,最低价权重为4
            data[self.type]=1 * data["score"] + 2 * data["comment_num"] + \
                            3 * data["decoration_time"] + 3 * data["open_time"] + 4 * data["lowest_price"]
            data = data.sort_values(by=self.type, ascending=self.sort)[:self.k]
        return dict(data.filter(items=["name", self.type]).values)
#增加主函数,添加RecBasedAH类的应用
if __name__ == "__main__":
    path = "C:/Users/st/Desktop/hotel-mess.csv"
    """
    参数说明
    addr: 酒店所在地区,有朝阳区,丰台区,东城区,西城区,海淀区,顺义区,石景山区,延庆区,房山区,通州区
    type:排序字段,默认为 评分:score
          支持 评论数目:comment_num,装修时间:decoration_time,开业时间:open_time,最低价格:lowest_price,综合排序:combine
    k:返回结果的数目
    sort:按照指定字段的排序方式,默认为降序, True为升序  False为降序
    """

    hotel_rec = RecBasedAH(path,addr="丰台区",type="combine",k=10,sort=False)
    results = hotel_rec.reccomend()
    print(results)

四、实验结果
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tong_brickmoving

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值