实验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)
四、实验结果