基于用户协同过滤的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函数遍历其他用户,找到和目标用户相似且对目标景点有评分的用户,通过相似度加权计算出预测评分。

四、总结

通过爬虫获取景点数据,再利用用户协同过滤算法进行推荐,一个简单的景点推荐系统就有了雏形。当然,实际应用中还得考虑数据存储、性能优化等一堆事儿,但这基本思路就是这么个路数。希望这篇博文能给对推荐系统感兴趣的小伙伴们一些启发。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐