赞
踩
构建项目是彻底学习概念并发展必要技能的最有效方式之一。
项目使您沉浸在现实世界的问题解决中,巩固您的知识,并培养批判性思维、适应能力和项目管理专业知识。
本指南将带您逐步构建一个根据用户喜好量身定制的电影推荐系统。我们将利用一个庞大的包含 10,000 部电影的数据集作为我们的基础。
虽然这种方法有意简单,但它建立了行业中最复杂的推荐引擎的核心构建模块。
(本文视频讲解:java567.com)
我们将利用 Python 的强大和多功能性来操作和分析我们的数据。
pandas 库将简化数据准备,scikit-learn 将提供像 CountVectorizer 和余弦相似度这样的健壮的机器学习算法。
用户体验至关重要,因此我们将设计一个直观的 Web 应用程序,轻松进行电影选择和推荐显示。
让我们开始吧!
想象一下一个能够理解您独特品味的电影推荐系统,持续地向您推荐您真正喜欢的电影。通过正确的策略,您可以将这个愿景变成现实。
在这里,您将学习如何释放您的电影数据的力量。使用Python的pandas库,您将专注于关键细节,如电影ID、标题、概述和类型。
通过将“概述”和“类型”策略性地合并为“标签”,您将为个性化推荐打下强大的基础。
机器学习是您的秘密武器。您将学习如何使用CountVectorizer将电影描述转换为您的系统可以分析的数据。然后,您将利用余弦相似度来准确定位与您偏好相符的电影。
这些技术使您的推荐系统能够随着您观看的每部电影而学习和适应。
您将构建一个能够专家地分析电影索引和相似度分数的函数,确保您的推荐准确反映您不断发展的口味。
这个函数就是魔法发生的地方,将您过去的选择转化为一份定制的必看电影清单。
为了随着时间的推移保持推荐的准确性,您将采用使用pickle库的序列化方法。将其视为系统的记忆,保存其深思熟虑的个性化特性,以供未来会话使用。
设计良好的界面至关重要。Streamlit让您能够借助诸如下拉列表等元素构建用户友好的体验,根据您的输入进一步细化推荐。
在本指南中,您将学习如何优先考虑直观的导航和设计,以确保与您的系统的交互无缝、愉快。
本章简要解释了使用Python构建电影推荐引擎的核心步骤。您将创建一个能够提供个性化建议并促进直观、引人入胜用户体验的系统。
任何成功的推荐系统的基础在于准备充分的数据。
您将首先使用Python的pandas库导入您的电影数据集(可以考虑使用Kaggle等强大的数据源)。您将专注于理解数据的结构,处理缺失值,并确保数据准备好进行分析。
隔离最具影响力的特征 - 电影ID、标题、概述和类型是强有力的竞争者。
解锁个性化的关键是“标签”列。您将学习如何将“概述”和“类型”合并以捕捉文本描述和类别。这种统一的方法增强了您的系统定位用户喜欢的电影的能力。
来自scikit-learn的CountVectorizer是将您的“标签”转换为可用的数值数据的强大工具。您将学习如何应用余弦相似度来计算基于这些特征的电影之间的相似度。
专家通常喜欢余弦相似度,因为它能够准确地衡量项目之间的关系,特别是当涉及多个维度时。
您将设计一个能够智能分析电影索引和相似度分数的函数。
这是您系统的核心,您将生成反映用户偏好的定制推荐。您会优先考虑简单的方法以取得初步成功 - 您随时可以引入复杂性。
序列化(使用Python的pickle模块)确保您的系统“记住”了过去的选择,以进行一致的推荐。
您将使用Streamlit构建一个用户友好的界面,减少编码工作。下拉列表等功能促进无缝交互并进一步个性化结果。
然后,您将集成像TMDb这样的API,动态显示电影海报,为您的推荐增添丰富的视觉元素。考虑使用图像轮播功能获得动态而沉浸式的界面。
这个基础系统可以作为一个平台,用于探索更高级的技术和功能,不断优化您的推荐。
让我们深入探讨机器学习如何改变电影推荐,提供个性化体验,保持用户的参与度。
监督学习是预测用户喜欢什么电影的基础。它分析历史数据,如过去的评分和观看记录,以发现模式。
例如,如果用户喜欢科幻电影,基于这些数据训练的监督模型将智能推荐其他科幻电影。
无监督学习擅长于基于特征(如类型、导演或情节)找到电影之间的相似性,即使直接用户反馈有限。它可能将电影聚类成“动作”,“浪漫喜剧”或“恐怖”等组,为推荐提供了强大的工具。
强化学习将个性化推荐提升到了一个新的水平。系统会做出推荐,分析用户的反应(评分、观看/不观看),并不断适应。这种动态方法确保推荐与用户偏好的变化保持一致。
通常最好的做法是策略性地结合这些技术!监督学习预测评分,无监督学习找到隐藏的电影联系,强化学习则根据实时互动进行调整。这种混合可以最大程度地提高推荐的准确性和用户满意度。
多样化、高质量的数据对成功至关重要:
清洁的数据至关重要。处理缺失值,删除重复项,并过滤可能会扭曲结果的任何内容。这可能感觉次要,但对推荐的准确性有显著影响。
图片来源:LunarTech.ai
好的,现在您几乎准备好构建一个了解您电影偏好的系统了。我将在这里概述关键步骤,让您能够分析电影数据并提供精准的推荐。
pd.read_csv()
将您的数据集导入 pandas DataFrame,准备进行分析。movies.head(10)
揭示了您的数据结构。movies.describe()
揭示了摘要统计信息。movies.isnull().sum()
标记了数据缺失 - 清理至关重要!recommend("钢铁侠")
- 您得到的结果是否合理?特征选择和工程是电影推荐系统中魔法发生的地方。通过打造完美的数据点集,您的模型可以为每个用户提供感觉定制的推荐。让我们解锁这个过程的全部潜力:
专家提示: 记住,即使使用高级技术,一些最强大的特征可能会出人意料地简单。用户最喜欢的导演或最喜欢的演员可能是您得到准确建议所需的全部。
图片来源:LunarTech.ai
文本向量化是机器学习中至关重要的过程,它将文本数据转换为算法可以有效处理的数字格式。在处理大量文本数据时,这种转换尤为重要。
CountVectorizer 是自然语言处理(NLP)中广泛使用的工具,它在文本数据处理中发挥着关键作用。它将文本数据转换为一种结构化形式,具体来说是一种令牌计数的稀疏矩阵,非常适合于机器学习模型。
在我们的电影推荐系统中,CountVectorizer 对于量化电影描述至关重要。通过量化描述,系统可以根据文本相似性准确比较和推荐电影。
要在 Python 中实现 CountVectorizer,您可以使用以下示例代码:
# 再次导入 CountVectorizer(冗余导入)
from sklearn.feature_extraction.text import CountVectorizer
# 使用最多 10,000 个特征和英语停用词初始化 CountVectorizer 对象
cv = CountVectorizer(max_features=10000, stop_words='english')
# 将 CountVectorizer 与 'tags_clean' 列拟合,并将文本数据转换为数字向量表示
vector = cv.fit_transform(new_data['tags_clean'].values.astype('U')).toarray()
请记住,通过调整其参数来定制 CountVectorizer 以适应电影数据,以捕捉电影描述的独特方面非常重要。
在向量化中,在准确性和效率之间取得平衡很重要。在保持计算效率的同时找到合适的向量化深度对于响应快速且准确的推荐系统至关重要。
此外,对于大型电影数据集,实施降维和定期更新单词字典等做法可以优化 CountVectorizer 的性能。
电影中的文本数据,包括描述和类型,本质上是非结构化和多样化的,这给推荐算法中的数据标准化带来了挑战。
但准确分析文本数据在增强电影推荐方面起着至关重要的作用。通过深入了解文本数据的内容,推荐系统可以提供更精确和个性化的推荐。
处理电影描述中的非结构化文本时,必须解决自然语言的微妙之处,例如习语、语境和情感。这些元素对于理解电影内容并确保准确推荐至关重要。
为了解决这些挑战,您需要对文本进行一些预处理,以清理和准备数据。这包括删除不相关的字符、纠正拼写错误以及标准化文本格式以确保一致性。
标记化是文本数据预处理中的另一个关键步骤。它涉及将文本拆分为单个单词或令牌,使分析和量化更加容易。此外,去除常见停用词并应用词干提取,有助于集中于文本的最有意义的元素。
文本数据预处理是准备自然语言处理(NLP)中的数据进行分析的关键步骤。它涉及清理和标准化数据,以确保一致性。这包括删除不相关的字符、纠正拼写错误以及标准化文本格式。
例如,您可以使用 Python 中的字符串处理函数删除特殊字符,并使用正则表达式纠正常见的拼写错误。
标记化是文本数据预处理中的另一个关键步骤。它涉及将文本拆分为单个单词或令牌,使其更容易分析和量化。
在 Python 中,您可以使用各种库,如 NLTK 或 spaCy,对文本数据进行标记化。例如,NLTK 提供了一个 word_tokenize()
函数,用于将文本拆分为单词。
去除停用词并应用词干提取也是文本预处理中的重要步骤。
停用词是不太具有意义的常用词,如“the”、“and”或“is”。删除这些词有助于集中于文本的最有意义的元素。
词干提取将单词减少到其词根形式,这有助于捕获单词的本质。像 NLTK 这样的库提供了内置的停用词列表和词干提取算法,例如波特词干提取算法。
要在 Python 中实现这些预处理步骤,您可以使用各种库和函数。例如,NLTK 提供了用于删除停用词和应用词干提取的函数。以下是一个示例代码片段:
# 从 NLTK 中导入必要的模块进行文本预处理。
import nltk
import re
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
# 下载用于文本处理的 NLTK 资源。
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('stopwords')
CountVectorizer 是自然语言处理(NLP)领域的一种强大工具,它将文本数据转换为令牌计数矩阵。它提供了一种简单而有效的分析文本的方法,通过计算文本中每个单词的频率。这种方法特别适用于基本的 NLP 任务,并且在机器学习和数据科学中被广泛使用。
要了解 CountVectorizer 的工作原理,让我们深入了解其背后的数学原理。该算法首先创建一个包含文本中所有唯一单词的字典。然后,它计算每个单词在每个文档中的出现次数,从而得到文本数据的矩阵表示。该矩阵捕获了每个单词的频率,从而实现进一步的分析和比较。
与其他文本向量化技术(如 TF-IDF)相比,CountVectorizer 专注于单词频率,使其更简单、更直接。这种简单性对于基本的 NLP 任务是有利的,并为进一步分析提供了坚实的基础。
要在 Python 中实现 CountVectorizer,您可以按照以下步骤操作:
# 从 scikit-learn 中导入 CountVectorizer,将文本文档转换为令牌计数的矩阵。
from sklearn.feature_extraction.text import CountVectorizer
# 如果尚未安装 scikit-learn,请安装它。
pip install scikit-learn
# 使用最多 10,000 个特征和排除常见的英语停用词初始化 CountVectorizer。
cv = CountVectorizer(max_features=10000, stop_words='english')
# 将 CountVectorizer 拟合到清理后的标签,并将文本数据转换为数字数组。
vector = cv.fit_transform(new_data['tags_clean'].values.astype('U')).toarray()
在此代码片段中,我们从 sklearn 库中导入 CountVectorizer 类。然后,我们创建一个 CountVectorizer 实例,并将其拟合到文本数据。最后,我们使用 transform()
方法将文本数据转换为单词频率矩阵。
要优化 CountVectorizer,以满足您的特定需求,重要的是定制其参数。例如,您可以调整 max_features
参数以限制矩阵中的特征数量,或者使用 ngram_range
参数来考虑多个单词的短语。您还可以提供自定义的 stop_words
列表,以排除可能没有太多含义的常用词。
值得注意的是,虽然 CountVectorizer 是一个强大的工具,但在准确性和效率之间取得平衡至关重要。对于大型数据集,考虑实施降维和定期更新单词字典等做法可以优化性能。
在 Python 中实现 CountVectorizer 是一个简单直接的过程。首先,从 sklearn 库中导入 CountVectorizer 类。然后,创建一个 CountVectorizer 实例,如 cv = CountVectorizer()
。接下来,使用 fit_transform()
方法将 CountVectorizer 拟合到您的文本数据中,该方法将数据转换为单词频率矩阵。
以下是一个示例代码片段:
# 使用最多 10,000 个特征和排除常见的英语停用词初始化 CountVectorizer。
cv = CountVectorizer(max_features=10000, stop_words='english')
# 将 CountVectorizer 拟合到清理后的标签,并将文本数据转换为数字数组。
vector = cv.fit_transform(new_data['tags_clean'].values.astype('U')).toarray()
在为电影数据定制 CountVectorizer 时,考虑调整参数以捕获电影描述的独特方面。
例如,您可以将 max_features
参数设置为限制矩阵中的特征数量,或者使用 ngram_range
参数来分析多个单词的短语。此外,提供自定义的 stop_words
列表可以排除可能没有太多含义的常用词。
在向量化中取得准确性和效率之间取得平衡非常重要。对于大型电影数据集,考虑实施降维和定期更新单词字典等做法。这些做法可以优化 CountVectorizer 的性能,并确保响应灵敏的推荐系统。
CountVectorizer 在将电影描述转换为可数字化分析的格式中起着至关重要的作用。
例如,如果我们有一个电影描述:“太空中的史诗冒险”,CountVectorizer 首先会将此句子标记化为单个单词 [“太空”, “中的”, “史诗”, “冒险”]。然后,它会删除常见的停用词(在这种情况下,“中的”)这些词对整体含义没有太大贡献。最后,它会统计剩余有意义的单词的出现次数。
该过程将文本转换为数字向量,使其可以用于数学算法。
下一步涉及利用向量化数据创建相似性矩阵。这个矩阵对于识别哪些电影彼此相似至关重要。
例如,如果我们的数据集包含电影 A 和 B 的向量化描述,则使用余弦相似性度量来计算它们之间的相似度得分。该分数量化了两部电影的内容有多相似,基于它们的描述向量。
CountVectorizer 的结构化方法允许对电影内容进行客观而精确的比较。
例如,如果用户喜欢“钢铁侠”,系统可以通过比较其向量化的描述找到其他具有相似主题的电影。这导致了更准确和个性化的推荐。
假设“钢铁侠”的向量化为 [0, 1, 2],而另一部电影“复仇者联盟”的向量化为 [1, 1, 1],计算出的相似度得分将有助于确定“复仇者联盟”与“钢铁侠”的内容有多接近。
这些示例展示了 CountVectorizer 和余弦相似性在增强电影推荐系统功能方面的实际应用。它们展示了从原始文本到向量化格式的转变以及这些向量如何用于找到相似电影的过程,从而提供了对基本过程的全面理解。
图片来源:LunarTech.ai
理解每种方法的优势和细微差别是设计一个真正满足用户需求的推荐系统的关键。
潜在陷阱: 过度依赖可能导致可预测的推荐。通过以下技术积极缓解这一问题:
克服挑战:
数据集选择: 优先考虑 TMDb 和 Kaggle 等权威来源以获取全面的电影数据。要实现更深入的个性化,探索额外的数据集,包括用户互动(评级、评论)、社交信号或外部评论接受度。
数据完整性: 投入大量精力进行清理和预处理。使用 pandas 进行数据操作和验证。有针对性地处理缺失值、异常值和不一致性,以避免模型偏差并确保推荐准确性。
特征工程: 考虑将以下功能整合到您的推荐中以丰富推荐:
持续适应的机器学习模型是这个动态领域的理想选择。考虑以下方法:
专家提示: 持续评估是您的超能力!对不同方法进行 A/B 测试,监控指标,并征求定性用户反馈,以构建一个真正出色的系统。
图片来源:LunarTech.ai
正确的算法是真正了解用户的推荐系统的核心。让我们探讨每种方法的细微差别,何时将它们结合起来,以及提升系统到更高水平的高级技术。
超越明确评级: 跟踪隐式反馈:
上下文至关重要: 根据以下因素定制推荐:
拥抱变化: 利用强化学习使系统通过试错改进,或实施时间感知模型,更加重视最近的偏好。
偏见意识: 对潜在偏见的数据集进行批判性评估(流行程度、性别代表性等)。积极实施策略来减轻这些偏见,以构建一个真正包容的推荐系统。
专家提示: 持续的实验是关键!通过对不同方法进行 A/B 测试,跟踪各种指标,并积极寻求用户反馈,构建一个优秀的系统,建立信任和忠诚度。
图片来源:LunarTech.ai
数据拆分是确保您的推荐准确且适应电影偏好不断变化的世界的秘密武器。
让我们深入了解这个过程的细微差别以及将您的系统提升到更高水平的策略。
加载数据: import pandas as pd
和 movies = pd.read_csv('movies.csv')
。
深入数据集: 命令如 movies.head(10)
、movies.info()
和 movies.describe()
提供对数据集的全面了解。特别注意缺失值、异常值、潜在的不一致性以及类别的整体平衡(类型、发布周期等)。这些见解将指导后续的决策。
数据转换: 确保数值数据与机器学习算法兼容。文本字段(描述、评论)可能需要使用 CountVectorizer 或 TF-IDF 等技术将它们转换为可用格式。
from sklearn.model_selection import train_test_split
是您的首选工具。在决定百分比时考虑这些因素:
import pickle
)允许您稍后重新加载模型进行部署、添加新数据或集成反馈,而无需从头开始。专家提示: 数据拆分决策应与您的系统目标一致。针对高度个性化的前五项推荐,需要与预测用户是否广泛喜欢或不喜欢电影不同的方法。让这个指导您的策略!
图片来源:LunarTech.ai
创建一个电影推荐系统是一个迷人的项目,它结合了数据处理、机器学习和用户界面设计。
在本节中,我将逐步指导您完成这个过程,基于您到目前为止所学到的一切。我们将从使用 Python 处理数据的基础开始。
对于这个项目,我们将使用 pandas 库进行数据处理和分析。这个库对于以灵活直观的方式处理大型数据集至关重要。
让我们从设置环境并准备我们的数据集开始。
首先,我们需要确保已安装所有必要的工具和库。我们将大量使用 pandas 进行数据处理。下面是开始的方法:
# 导入 pandas 库进行数据处理和分析
import pandas as pd
# 使用 pip(Python 包安装器)安装 pandas 库
%pip install pandas
# 注意:如果您已经安装并导入了 pandas 一次,则第二个导入语句是多余的。如果是这样,您可以省略它。
在导入数据集之前,请确保已从 Kaggle 上提供的链接下载了数据集:Top Rated TMDb Movies - 10k Dataset。这个数据集是关于电影的信息的丰富来源,将作为我们推荐系统的基础。
一旦您有了数据集,就将它加载到一个 pandas DataFrame 中。假设数据集是一个 CSV 文件,您可以使用以下代码:
# 将数据集加载到 pandas DataFrame 中
movies = pd.read_csv('path/to/your/downloaded/movies.csv')
将 'path/to/your/downloaded/movies.csv'
替换为您系统上下载的数据集的实际文件路径。
为了对我们正在处理的数据有所了解,让我们检查 DataFrame 中的列名。这将帮助我们确定哪些列与我们的推荐系统相关。
# 获取 DataFrame 中的列名
print(movies.columns)
对于我们的电影推荐系统,我们将关注一些关键特征:id
、title
、overview
和 genre
。以下是我们选择这些特征的原因:
通过关注这些特征,我们可以利用电影的叙述内容和类型信息找出相似之处,并进行推荐。让我们选择这些列并丢弃其他列:
# 从 DataFrame 中选择并保留指定的列('id'、'title'、'overview'、'genre')
movies = movies[['id', 'title', 'overview', 'genre']]
这一步简化了我们的数据集,让我们只留下了构建推荐系统所需的信息。
将 ‘overview’ 和 ‘genre’ 列合并将创建一个更具见解的特征向量,极大地提高了系统根据用户偏好推荐与电影相匹配的能力。此组合使我们能够同时利用文本描述和类型分类,为每部电影的数据集提供更多上下文。
# 通过连接 'overview' 和 'genre' 列添加一个新列 'tags'
movies['tags'] = movies['overview'] + movies['genre']
现在,我们有了一个综合的 ‘tags’ 列,它捕捉了每部电影内容和类型的本质,我们可以进一步简化我们的数据集,通过删除现在多余的 ‘overview’ 和 ‘genre’ 列。这样,我们就得到了一个专注于推荐系统最有用特征的简化数据集。
# 通过从 'movies' 中删除 'overview' 和 'genre' 列创建一个新的 DataFrame 'new_data'
new_data = movies.drop(columns=['overview', 'genre'])
为了利用我们的推荐系统进行机器学习算法,我们需要将文本数据转换为数字格式。
这就是 CountVectorizer
发挥作用的地方。它将我们 ‘tags’ 列中的文本转换为一个稀疏矩阵,有效地将单词转换为向量。
但在应用 CountVectorizer
之前,清理文本数据是至关重要的,以提高我们向量的质量。通常包括将文本转换为小写,删除标点符号,并应用词干提取或词形还原以将单词减少到其基本形式或词根形式。
虽然提示提到了重新应用 clean_text
函数到 ‘tags’ 列,但我们似乎还没有定义这样一个函数。假设我们有一个清理文本的函数,它看起来可能是这样的:
# 假设 'clean_text' 是一个清理文本数据的函数
new_data['tags_clean'] = new_data['tags'].apply(clean_text)
让我们继续对我们的清理后的 ‘tags’ 数据进行向量化:
# 从 scikit-learn 中导入 CountVectorizer 进行文本向量化
from sklearn.feature_extraction.text import CountVectorizer
# 注意:确保已安装 scikit-learn。如果没有,请使用 pip 进行安装。
# pip install scikit-learn
# 初始化 CountVectorizer
cv = CountVectorizer(max_features=5000, stop_words='english')
# 对清理后的 'tags' 文本进行向量化
vectorized_data = cv.fit_transform(new_data['tags_clean']).toarray()
在这段代码片段中,max_features=5000
限制了特征数(即不同的单词)为前 5000 个,这有助于管理计算复杂性。指定 stop_words='english'
删除了常见的英文单词,这些单词不太可能对电影描述的独特性有所贡献。
将我们的电影描述转换为数字向量后,下一个关键步骤是计算这些向量之间的余弦相似度。
这个度量将允许我们根据内容确定任何两部电影有多相似。余弦相似度得分为 1 表示电影非常相似,得分为 0 表示没有相似性。
# 从 scikit-learn 中导入 cosine_similarity 以计算向量之间的相似度
from sklearn.metrics.pairwise import cosine_similarity
# 计算向量之间的余弦相似度
similarity = cosine_similarity(vectorized_data)
在这里,cosine_similarity
函数以向量数组(我们的向量化电影标签)作为输入,并返回所有电影对之间的相似性得分矩阵。
为了了解我们的推荐系统在实践中是如何工作的,让我们找到并打印出与数据集中特定电影最相似的电影的标题。我们将使用第一部电影作为示例:
# 计算第三部电影与所有其他电影的相似度分数,对其进行排序,并存储结果
distance = sorted(list(enumerate(similarity[4])), reverse=True, key=lambda vector: vector[1])
# 打印与第三部电影最相似的前五部电影的标题
for i in distance[0:5]:
print(new_data.iloc[i[0]].title)
为了使我们的系统更加用户友好,我们将找到相似电影的逻辑封装到一个函数中。这个函数将以电影标题作为输入,并打印出前 5 部相似电影的标题:
# 定义一个函数,为给定的电影标题推荐前 5 部相似电影
def recommend(movies):
# 在 DataFrame 中找到给定电影的索引
index = new_data[new_data['title'] == movies].index[0]
# 计算相似度分数,对其进行排序,并打印出前 5 部相似电影的标题
distance = sorted(list(enumerate(similarity[index])), reverse=True, key=lambda vector: vector[1])
for i in distance[1:6]: # 从 1 开始以跳过电影本身
print(new_data.iloc[i[0]].title)
# 示例用法
recommend("钢铁侠")
注意:提供的示例使用了 "钢铁侠"
作为占位符。请用您数据集中的实际电影标题替换它以测试该函数。
为了保存我们的进度并轻松共享或部署我们的推荐系统,我们将使用 pickle
模块对清理后的数据集和相似度矩阵进行序列化:
import pickle
# 将 'new_data' DataFrame 和 'similarity' 矩阵序列化并保存到文件中
pickle.dump(new_data, open('movies_list.pkl', 'wb'))
pickle.dump(similarity, open('similarity.pkl', 'wb')) # 修正拼写错误:应使用 'wb' 进行写入
# 可选择进行反序列化以进行验证
# movies_list = pickle.load(open('movies_list.pkl', 'rb'))
# similarity_loaded = pickle.load(open('similarity.pkl', 'rb'))
最后,为了了解我们的序列化文件保存在哪里,或者如果您正在一个文件路径很重要的环境中工作(比如服务器或部署场景),您可以打印当前的工作目录:
import os
# 打印当前的工作目录
print(os.getcwd())
这就完成了构建基本电影推荐系统的逐步指南。您现在拥有一个功能齐全的系统,它可以根据内容和类型的相似性推荐电影,并具有将模型序列化以备将来使用或部署的基础设施。
在下一章中,您将看到完整的 Python 代码,所有内容都整合在一起。
图片来源:LunarTech.ai
# 导入 pandas 库进行数据处理和分析 import pandas as pd # 使用 pip 安装 pandas 库(Python 包安装器) %pip install pandas # 再次导入 pandas 库(此行是多余的,可以省略) import pandas as pd # 从 CSV 文件加载数据集到 pandas DataFrame movies = pd.read_csv('dataset.csv') # 显示 DataFrame 的前 10 行 movies.head(10) # 生成 DataFrame 的描述性统计信息 movies.describe() # 打印 DataFrame 的简洁摘要(关于列、数据类型、非空值等的信息) movies.info() # 计算 DataFrame 中每列的空值(缺失值)总和 movies.isnull().sum() # 获取 DataFrame 中的列名 movies.columns # 从 DataFrame 中选择并保留指定列('id'、'title'、'overview'、'genre') movies = movies[['id', 'title', 'overview', 'genre']] # 通过连接 'overview' 和 'genre' 列添加一个新列 'tags' movies['tags'] = movies['overview'] + movies['genre'] # 通过从 'movies' 中删除 'overview' 和 'genre' 列创建一个新的 DataFrame 'new_data' new_data = movies.drop(columns=['overview', 'genre']) # 从 NLTK 库中导入所需模块进行文本处理 import nltk import re from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize # 下载 NLTK 资源以进行标记化、词形还原和停用词 nltk.download('punkt') nltk.download('wordnet') nltk.download('stopwords') # 定义用于清理文本数据的函数 def clean_text(text): # 如果文本不是字符串,则返回空字符串 if not isinstance(text, str): return "" # 将文本转换为小写 text = text.lower() # 删除标点符号但保留单词和数字 text = re.sub(r'[^\\w\\s\\d]', '', text) # 对文本进行标记化为单词 words = word_tokenize(text) # 定义英文停用词 stop_words = set(stopwords.words('english')) # 从标记化的单词中删除停用词 words = [word for word in words if word not in stop_words] # 初始化 WordNet 词形还原器 lemmatizer = WordNetLemmatizer() # 对每个单词进行词形还原 words = [lemmatizer.lemmatize(word) for word in words] # 将单词重新组合成单个字符串 text = ' '.join(words) return text # 将 clean_text 函数应用于 'tags' 列,并将结果存储在 'tags_clean' 中 new_data['tags_clean'] = new_data['tags'].apply(clean_text) # 从 scikit-learn 中导入 CountVectorizer 进行文本向量化 from sklearn.feature_extraction.text import CountVectorizer # 使用 pip 安装 scikit-learn 库 pip install scikit-learn # 再次应用 clean_text 函数到 'tags' 列(这一行似乎是多余的) new_data['tags_clean'] = new_data['tags'].apply(clean_text) # 从 scikit-learn 中导入 train_test_split 用于将数据分割为训练集和测试集 from sklearn.model_selection import train_test_split # 再次导入 CountVectorizer(多余的导入) from sklearn.feature_extraction.text import CountVectorizer # 使用最大特征数为 10,000 和英语停用词初始化 CountVectorizer 对象 cv = CountVectorizer(max_features=10000, stop_words='english') # 将 CountVectorizer 拟合到 'tags_clean' 列,并将文本数据转换为数字向量表示 vector = cv.fit_transform(new_data['tags_clean'].values.astype('U')).toarray() # 检查生成的向量的形状 vector.shape # 从 scikit-learn 中导入 cosine_similarity 以计算向量之间的相似度 from sklearn.metrics.pairwise import cosine_similarity # 计算向量之间的余弦相似度 similarity = cosine_similarity(vector) # 打印 'new_data' DataFrame 的简洁摘要 new_data.info() # 计算第三部电影与所有其他电影的相似度分数,对其进行排序,并存储结果 distance = sorted(list(enumerate(similarity[2])), reverse=True, key=lambda vector: vector[1]) # 打印与第三部电影最相似的前五部电影的标题 for i in distance[0:5]: print(new_data.iloc[i[0]].title) # 定义一个函数,为给定的电影标题推荐前 5 部相似电影 def recommend(movies): # 在 DataFrame 中找到给定电影的索引 index = new_data[new_data['title'] == movies].index[0] # 计算相似度分数,对其进行排序,并打印出前 5 部相似电影的标题 distance = sorted(list(enumerate(similarity[index])), reverse=True, key=lambda vector: vector[1]) for i in distance[0:5]: print(new_data.iloc[i[0]].title) # 使用 "Iron Man" 作为参数调用 recommend 函数 recommend("Iron Man") # 导入 pickle 模块以对 Python 对象进行序列化 import pickle # 序列化 'new_data' DataFrame 并将其保存到文件中 pickle.dump(new_data, open('movies_list.pkl', 'wb')) pickle.dump(new_data, open('similarity.pkl', 'wb')) # 将 'movies_list.pkl' 文件反序列化为 Python 对象 pickle.load(open('movies_list.pkl', 'rb')) # 导入 os 模块以与操作系统交互 import os # 打印当前工作目录 print(os.getcwd())
图片来源:LunarTech.ai
在电影推荐中实施机器学习面临着独特的挑战,比如处理稀疏数据,当用户或电影的信息不足时就会出现这种情况。
这种情况的常见例子是“冷启动”问题,即新用户或电影没有或几乎没有交互数据。没有足够的用户评分或电影详情,生成准确的推荐就变得困难。
让我们探讨如何克服这些障碍,并构建一个适应性强的推荐系统。
将您的反馈直接融入到开发和完善电影推荐系统中,可以显著提升其有效性和您的满意度。
通过整合机制来收集您的反馈和偏好,可以更精确地满足您的需求,从而提供更准确和受欢迎的电影推荐。
以下是利用您的反馈对提高电影推荐系统准确性至关重要的原因:
将您的反馈整合到电影推荐系统中,不仅优化了提供的建议的准确性和相关性,而且为系统创造了一个动态的学习环境。它确保了推荐随着您不断变化的偏好而发展,从而为您提供更引人入胜和满意的体验。
这种策略将您,被动的观众,转变为了策划过程中的积极参与者,极大地提高了系统的整体效果。
专家见解: 最好的系统积极解决稀疏数据问题。不断重新评估数据源,寻找收集一些初始用户偏好的创造性方法,永远不要认为工作已经完成。
图片来源:LunarTech.ai
虽然搭建全面的电影推荐系统的方法是稳健而创新的,但是必须承认由于数据集限制和对 TMDB(The Movie Database)数据的依赖而存在固有限制。
以下是这些限制及其对推荐系统的潜在影响的更清晰解释:
认识到主要依赖于 TMDB 数据和当前数据集范围的局限性,强调了不断努力丰富和更新数据集和算法的重要性。
通过承认这些挑战,并通过战略性的数据来源、先进的分析和算法演进来积极应对它们,推荐系统可以不断改进,为用户提供更准确、个性化和及时的电影建议。
随着本教程的结束,我对您的时间表示感谢。将多年的专业和学术知识提炼成本手册的过程是一项充实的工作。
感谢您加入我在这项追求中,我期待着见证您在技术领域的成长。
(本文视频讲解:java567.com)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。