基于用户协同过滤的Python景点推荐系统与爬虫实践
基于用户协同过滤的python景点推荐系统+爬虫 推荐思路:用户浏览景点,对景点进行评分(1-5),评分可以代表用户对物品的喜好度,应用余弦相似度公式,预测用户对物品的评分

在当今信息爆炸的时代,为用户提供个性化的景点推荐变得愈发重要。今天咱就聊聊如何基于用户协同过滤,结合Python来打造一个景点推荐系统,顺便再搞个爬虫获取景点相关数据。
一、用户协同过滤原理简单唠唠
用户协同过滤主要是基于这样一个想法:如果一群用户对某些景点的评分模式很相似,那么他们对其他景点的喜好可能也类似。就好比你和朋友都超爱自然风光类景点,并且给这类景点的评分都很高,那当你朋友发现一个新的绝美自然景点并给出高分时,大概率你也会喜欢。

这里面关键的一步就是计算用户之间的相似度,咱常用余弦相似度公式。简单说,把用户对景点的评分看作向量,通过这个公式就能算出两个用户评分向量之间的夹角余弦值,值越接近1,说明两个用户相似度越高。
二、爬虫部分
先得搞点景点数据,这就用到爬虫了。以爬取某旅游网站景点信息为例,咱们用requests库和BeautifulSoup库。
import requests
from bs4 import BeautifulSoup
def get_attraction_info(url):
headers = {
'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# 假设景点名称在h1标签里,实际要根据网站结构调整
attraction_name = soup.find('h1').text
# 假设评分在某个span标签里,有class属性为rating
rating = soup.find('span', class_='rating').text
return attraction_name, rating
else:
print(f"请求失败,状态码: {response.status_code}")
return None, None
这段代码,首先构造了一个请求头,伪装成浏览器去访问网站。requests.get发起请求,如果状态码是200,就表示请求成功。然后用BeautifulSoup解析网页内容,按照假设的网站结构,提取景点名称和评分。实际应用中,得根据目标网站的真实结构来调整这些查找标签和属性的代码。
三、用户协同过滤实现
下面就是核心的用户协同过滤部分了。假设我们已经有了一个用户 - 景点评分矩阵,用字典来模拟这个矩阵。
# 模拟用户 - 景点评分矩阵
user_ratings = {
'user1': {'景点A': 4, '景点B': 3, '景点C': 5},
'user2': {'景点A': 3, '景点D': 4},
'user3': {'景点B': 4, '景点C': 3, '景点D': 5}
}
import math
def cosine_similarity(user1, user2):
common_ratings = {}
for attraction in user_ratings[user1]:
if attraction in user_ratings[user2]:
common_ratings[attraction] = 1
if not common_ratings:
return 0
sum_x = sum([user_ratings[user1][attraction] ** 2 for attraction in common_ratings])
sum_y = sum([user_ratings[user2][attraction] ** 2 for attraction in common_ratings])
sum_xy = sum([user_ratings[user1][attraction] * user_ratings[user2][attraction] for attraction in common_ratings])
return sum_xy / (math.sqrt(sum_x) * math.sqrt(sum_y))
def predict_rating(user, attraction):
total_similarity = 0
weighted_rating_sum = 0
for other_user in user_ratings:
if other_user!= user and attraction in user_ratings[other_user]:
similarity = cosine_similarity(user, other_user)
total_similarity += similarity
weighted_rating_sum += similarity * user_ratings[other_user][attraction]
if total_similarity == 0:
return 0
return weighted_rating_sum / total_similarity
cosinesimilarity函数先找出两个用户共同评价过的景点,然后根据余弦相似度公式计算相似度。predictrating函数遍历其他用户,找到和目标用户相似且对目标景点有评分的用户,通过相似度加权计算出预测评分。
四、总结
通过爬虫获取景点数据,再利用用户协同过滤算法进行推荐,一个简单的景点推荐系统就有了雏形。当然,实际应用中还得考虑数据存储、性能优化等一堆事儿,但这基本思路就是这么个路数。希望这篇博文能给对推荐系统感兴趣的小伙伴们一些启发。




更多推荐
所有评论(0)