周三. 2月 1st, 2023

用Python构建Amazon产品推荐系统

作者UU    👁 浏览人数:10 人

12月 28日 2022年

原标题:用Python构建Amazon产品推荐系统

今日份知识你摄入了么?

图片来自Unsplash,作者Marques Thomas

引言

该项目的目标是部分重建Amazon电子类产品的推荐系统。

现在是十一月,黑色星期五到了!你是什么类型的购物者?你是把当天想购买的所有产品都保存起来,还是宁愿打开网站,查看带有巨大折扣的现场优惠呢?

尽管网店在过去十年中取得了令人难以置信的成功,显示出巨大的潜力和增长势头,但实体店和网店的基本区别之一却是消费者的冲动购买。

如果你主动向客户展示了一系列产品,他们更有可能购买他们原本没有计划购买的产品。冲动购买的现象受到网店配置的极大限制。同样的情况在实体店却不会发生。最大的实体零售连锁店让顾客走一条精确的路径,以确保他们在离开商店之前参观商店的每一条货架间的过道。

在Amazon 上 购买使我对机制非常感兴趣,我想重新创建 (实际上是部分重新)他们推荐系统的结果。

根据博客“ Recostream”,亚马逊产品推荐系统有三种依赖关系,其中一种是产品对产品的推荐。当用户实际上没有历史搜索记录时,该算法将产品聚类在一起,并根据项目的元数据将其推荐给同一用户。

数据

项目的第一步是收集数据。幸运的是,圣地亚哥加州大学的研究人员有一个可以让学生和组织外的个人使用数据进行研究和项目的存储库。可以通过以下链接 http://jmcauley.ucsd.edu/data/amazon/links.html)访问数据以及与推荐系统相关的许多有趣的数据集[2][3]。产品元数据上次更新于2014年;很多产品今天可能都没有了。

asin—与每个产品关联的唯一ID imUrl—与每个产品关联的图像URL链接 deion—产品说明 categories —每个产品所属类别的python列表 title—产品的名称 price—产品的价格 salesRank—特定类别中每个产品的排名 related —与每个产品相关的客户查看和购买的产品 brand—产品的品牌。

你将注意到该文件是“松散”的JSON格式,其中每一行都是一个JSON,它包含了前面提到的所有列以作为其中一个字段。我们将在代码部署部分了解如何处理此问题。

EDA

让我们从快速探索性数据分析开始。在清理了其中一列中至少包含NaN值的所有记录后,我为电子类产品创建了可视化。

带异常值的价格箱形图——图像由作者提供

第一个图表是显示每个产品的最高、最低、第25百分位、第75百分位和平均价格的箱形图。例如,我们知道一个产品的最高价值是1000美元,而最低价值大约是1美元。160美元标记上方的线是由点组成的,每个点都标识一个异常值。在整个数据集中,异常值表示只发生一次的记录。因此,我们只知道一种定价在1000美元左右的产品。

平均价格似乎在25美元左右。需要注意的是,matplotlib以选项showfliers=False自动排除异常值,为了使框图看起来更清晰,我们可以将参数设置为false。

价格箱形图——图像由作者提供

结果是一个不带异常值的更清晰的箱形图。该图表还表明,绝大多数电子产品的价格在1美元至160美元之间。

产品数量排名前十的品牌——作者图片

该图表显示了在Amazon上销售的电子类产品中排名前十的品牌。其中包括惠普、索尼、戴尔和三星。

十大零售商价格箱形图

最后,我们可以看到前十名卖家的价格分布形式。索尼和三星提供的产品种类繁多,从几美元到500美元和600美元不等,因此,它们的平均价格高于大多数顶级竞争对手。有趣的是,SIB和SIB-CORP提供了更多的产品,但平均价格更实惠。

该图表还告诉我们,索尼提供的产品大约占数据集中价格最高产品的60%。

余弦相似性

一种通过产品的特性将产品聚集在一起的方案就是余弦相似性。我们需要彻底理解这个概念,才能构建我们的推荐系统。

余弦相似性度量两个数字序列的“接近”程度。它如何适用于我们的案例?令人惊讶的是,句子可以转换成数字,或者更好地转换成向量。

余弦相似度可以取-1和1之间的值,其中1表示两个向量在形式上相同,而-1表示它们尽可能不同。

数学上,余弦相似性是两个多维向量的点积除以其大小的乘积[4]。我知道这里有很多难以理解的词,让我们用一个实际的例子来解释一下吧。

由Embed Fun提供

假设我们正在分析文档A和文档B。文档A有三个最常见的术语:“今天”、“好”和“阳光”,它们分别出现4次、2次和3次。文档B中这三个术语出现了3、2和2次。因此,我们可以这样写:

A=(2,2,3);B=(3,2,2)

两个向量的点积公式可以写成:

由Embed Fun提供

向量点积:2×3+2×2+3×2=16

另一方面,单向量值的计算如下:

由Embed Fun提供

应用以上公式可得:

||A|| = 4.12 ; ||B|| = 4.12

因此它们的余弦相似性为:

16 / 17 = 0.94 = 19.74°

这两个向量非常相似。

到目前为止,我们只计算了两个三维向量之间的值。实际上,一个词向量可以有无限个维度 (取决于它包含的单词数量),但这个过程背后的逻辑在数学上是相同的。在下一节中,我们将了解如何在实践中应用所有概念。

代码编写

让我们进入代码编写阶段——在数据集上构建推荐系统。

每个数据科学笔记本的第一个单元都应该导入数据库,我们项目需要的代码是:

#Importing libraries fordata management importgzip importjson importpandas as pd from tqdm importtqdm_notebook as tqdm

#Importing libraries forfeature engineering importnltk importre from nltk.corpus importstopwords from sklearn.feature_extraction.text importCountVectorizer from sklearn.metrics.pairwise importcosine_similarity

gzip:解压数据文件 json :解码 pandas:将JSON数据转换为更易于管理的数据帧格式 tqdm:创建进度条 nltk :处理文本字符串 re:提供正则表达式支持 sklearn :文本预处理

读取数据

如前所述,数据以松散的JSON格式上传。解决此问题的方法首先是使用命令 json.dumps将文件转换为JSON可读格式行。然后,我们可以将此文件设置为换行符,并将其转换为由JSON行组成的python列表。最后,我们可以将每一行添加到数据空列表中,同时使用命令 json.loads 将其以JSON的格式读取。

使用命令pd.DataFrame,数据列表被读取为数据帧,我们现在可以使用它来构建推荐器。

#Creating an empty listdata = []

#Decoding the gzip filedef parse(path):g = gzip.open(path, r) forl in g: yield json.dumps(eval(l))

#Defining f as the file that will contain json dataf = open( “output_strict.json”, w)

#Defining linebreak as \nandwriting one at the end of each line forl in parse( “meta_Electronics.json.gz”): f.write(l + \n)

#Appending each json element to the empty datalistwith open( output_strict.json, r) as f: forl in tqdm(f): data.append(json.loads(l))

#Reading dataas a pandas dataframe full = pd.DataFrame(data)

为了让你了解数据列表的每一行,我们运行了一个简单的命令print(data[0]),在索引0处控制台打印即可。

print(data[ 0])

output: {asin: 0132793040, imUrl: http://ecx.images-amazon.com/images/I/31JIPhp%2BGIL.jpg, deion: The Kelby Training DVD Mastering Blend Modes in Adobe Photoshop CS5 with Corey Barker is a useful tool for…and confidence you need., categories: [[ Electronics, Computers & Accessories, Cables & Accessories, Monitor Accessories]], title: Kelby Training DVD: Mastering Blend Modes in Adobe Photoshop CS5 By Corey Barker}

正如你所看到的一样,输出的是一个JSON文件,它有{}来打开和关闭字符串,每个列名后面都跟着相应的字符串。你可以注意到,第一个产品缺少price、 salesRank、related和brand这些列将自动填充NaN值。

一旦我们用dataframe阅读整个列表,电子产品将显示以下八个特征:

| asin| imUrl | deion | categories | |——–|———|—————|————–|| price | salesRank | related | brand ||———|————-|———–|———|

特征工程

特征工程负责清理数据和创建专栏,我们将在其中计算余弦相似性分数。由于RAM内存的限制,我不希望专栏特别长,正如评论或产品描述一样。相反,我决定用categories、 title、 和brand 创建一个“数据包”。但在此之前,我们需要消除这三列中任一包含NaN值的行。

所选栏目以我们推荐人所需文本的形式包含有价值的重要信息。描述列也可能是一个潜在的候选项,但字符串通常太长,并且没有在数据集中进行标准化。对于我们正在努力实现的目标来说,它并不代表足够可靠的信息。

#Dropping each row containing a NaN value within selected columnsdf = full.dropna(subset=[ categories, title, brand])

#Resetting index countdf = df.reset_index

#Creating datasoup made of selected columnsdf[ ensemble] = df[ title] + + df[ categories].astype(str) + + df[ brand]

#Printing record at index 0df[ ensemble].iloc[ 0]

output: “Barnes & Noble NOOK Power Kit in Carbon BNADPN31 [[Electronics, eBook Readers & Accessories, Power Adapters]] Barnes & Noble”

因为标题并不总是包含其名称,所以需要添加品牌名称。

现在我可以进入清理部分了。text_cleaning函数负责从集合列中删除每个 amp字符串。除此之外,字符串[^A-Za-z0–9]过滤掉所有的特殊字符。最后,函数的最后一行消除了字符串包含的每个停止语。

# Defining text cleaning functiondef text_cleaning(text): forbidden_words = set(stopwords.words( english)) text = re.sub(r amp , ,text)text = re.sub(r\s+ , , re.sub([^A-Za-z0 -9] , , text.strip.lower)).striptext = [word for word in text.split if word not in forbidden_words]return .join(text)

使用lambda函数,我们可以将 text_cleaning应用于称为ensemble 中,我们可以通过调用iloc并指示随机记录的索引来随机选择随机产品的数据包。

#Applying text cleaning function to each rowdf[ ensemble] = df[ ensemble].apply(lambda text: text_cleaning(text))

#Printing line at Index 10000df[ ensemble].iloc[ 10000]

output:vcool vga cooler electronics computers accessories computer components fans cooling case fans antec

第10001行的记录 (索引从0开始)是Antec的vcool VGA cooler。这是一个标题不包括品牌的例子。

余弦运算和推荐函数

余弦相似性的运算从建立一个包含集合列中出现的所有单词的矩阵开始。我们将使用的方法称为“计数矢量化”,或者更常见的“单词包”。

#Selecting first 35000rows df = df.head( 35000)

#creating count_vect objectcount_vect = CountVectorizer

#Create Matrixcount_matrix = count_vect.fit_transform(df[ ensemble])

# Compute the cosine similarity matrixcosine_sim = cosine_similarity(count_matrix, count_matrix)

顾名思义,命令cosine_similarity计算count_matrix中每一行的余弦相似度。count_matrix上的每一行都是一个向量,其中包含集合列中出现的每个单词的字数。

#Creating a Pandas Series from df s index indices = pd.Series(df.index, index=df[ title]).drop_duplicates

在运行实际的推荐系统之前,我们需要确保创建一个索引,并且该索引没有重复项。

只有通过这,我们才能定义content_recommender功能。它有4个参数:title 、cosine_sim、 df和 indices。在调用函数时,标题将是唯一要输入的元素。

content_recommender的工作方式如下:

查找与用户提供的标题相关联的产品索引 在余弦相似度矩阵中搜索产品的索引,并收集所有产品的所有得分 将所有得分从最相似的产品 (接近1) 排序到最不相似的 (接近0) 选择前30种最相似的产品 添加一个索引并以结果的形式返回pandas序列 # Function that takes in product title as input andgives recommendations def content_recommender(title, cosine_sim=cosine_sim, df=df,indices=indices): # Obtain the index of the product that matches the titleidx = indices[title] # Get the pairwsie similarity scores of all products with that product# And convert it into a listof tuples as described above sim_scores = list(enumerate(cosine_sim[idx])) # Sort the products based on the cosine similarity scoressim_scores = sorted(sim_scores, key=lambda x: x[ 1], reverse=True) # Get the scores of the 30most similar products. Ignore the first product. sim_scores = sim_scores[ 1: 30] # Get the product indicesproduct_indices = [i[ 0] fori in sim_scores] # Return the top 30most similar products returndf[ title].iloc[product_indices]

现在让我们在“Vcool VGA冷却器”上测试它。我们想要三十种类似并且客户会有兴趣购买的产品。通过运行命令content_recommender(product_title) ,该函数将返回一个包含三十条建议的列表。

#Define the product we want to recommend other items fromproduct_title = Vcool VGA Cooler

#Launching the content_recommender functionrecommendations = content_recommender(product_title)

#Associating titles to recommendationsasin_recommendations = df[df[ title].isin(recommendations)]

#Merging datasetsrecommendations = pd.merge(recommendations, asin_recommendations, on= title, how= left)

#Showing top 5recommended products recommendations[ title].head

在5种最相似的产品中,我们发现了其他Antec产品,如Tricool电脑机箱风扇、扩展槽冷却风扇等等。

1Antec Big Boy 200200mm Tricool Computer Case Fan 2Antec Cyclone Blower, Expansion Slot Cooling Fan 3StarTech.com 90x25mm High Air Flow Dual Ball Bearing Computer Case Fan with TX3 Cooling Fan FAN9X25TX3H(Black)4 Antec 120MM BLUE LED FAN Case Fan(Clear)5 Antec PRO 80MM 80mm Case Fan Pro with 3-Pin &; 4Pin Connector(Discontinued by Manufacturer)

原始数据集中的相关列中包含了消费者购买、一起购买和观看VGA cooler后购买的产品列表。

#Selecting the relatedcolumn of the product we computed recommendations forrelated = pd.DataFrame.from_dict(df[ related].iloc[ 10000], orient= index).transpose

#Printing first 10records of the dataset related.head( 10)

通过在该列中打印python字典的头部,控制台将返回以下数据集。

| | also_bought | bought_together | buy_after_viewing ||—:|:————–|:——————|:——————–|| 0| B000051299 | B000233ZMU | B000051299 | | 1| B000233ZMU | B000051299 | B00552Q7SC | | 2| B000I5KSNQ | | B000233ZMU | | 3| B00552Q7SC | | B004X90SE2 | | 4| B000HVHCKS | | | | 5| B0026ZPFCK | | | | 6| B009SJR3GS | | | | 7| B004X90SE2 | | | | 8| B001NPEBEC | | | | 9| B002DUKPN2 | | | | 10| B00066FH1U | | |

让我们测试一下我们的推荐怎么样。让我们看看建议中是否包含了also_bought 列表中的一些asin ID。

#Checking ifrecommended products are in the also_boughtcolumn for#final evaluation of the recommender

related[ also_bought].isin(recommendations[ asin])

我们正确地推荐了44种产品中的5种。

[True False True False False False False False False False True False False False False False False True False False False False False False False False True False False False False False False False False False False False False False False False False False]

结论

我希望你喜欢这个项目并对将来的任何使用是有用的。

如本文所述,通过将数据集的所有行包含在余弦相似度矩阵中,可以进一步改进最终结果。除此之外,我们还可以通过将元数据数据集与仓库中的其他数据集合并来添加每个产品的审查平均。我们可以在余弦相似度的计算中包含价格。另一种可能是完全基于每个产品的描述性图像来构建推荐系统。

进一步改进的主要方案已列出。从未来实施到实际生产的角度来看,其中大多数值得探索。

如果你对本文有任何见解,请在评论中写出来! (我很想读它们)感谢阅读!

[1] Amazon’s Product Recommendation System In 2021: How Does The Algorithm Of The eCommerce Giant Work? — Recostream. (2021). Retrieved November 1, 2022, from Recostream.com website:https://recostream.com/blog/amazon-recommendation-system

[2] He, R., & McAuley, J. (2016, April). Ups and downs: Modeling the visual evolution of fashion trends with one-class collaborative filtering. In Proceedings of the 25th international conference on world wide web (pp. 507–517).

[3] McAuley, J., Targett, C., Shi, Q., & Van Den Hengel, A. (2015, August). Image-based recommendations on styles and substitutes. In Proceedings of the 38th international ACM SIGIR conference on research and development in information retrieval (pp. 43–52).

[4] Rahutomo, F., Kitasuka, T., & Aritsugi, M. (2012, October). Semantic cosine similarity. In The 7th international student conference on advanced science and technology ICAST (Vol. 4, №1, p. 1).

[5] Rounak Banik. 2018. Hands-On Recommendation Systems with Python: Start building powerful and personalized, recommendation engines with Python. Packt Publishing.

原文作者:Giovanni Valdata

翻译作者:明慧

美工编辑:过儿

校对审稿:过儿

原文链接:https://towardsdatascience.com/building-a-recommender-system-for-amazon-products-with-python-8e0010ec772c

2022 IDEAS全球人工智能大会 扫码购票

2022年IDEAS全球人工智能大会火热抢票中!

招募志愿者啦!2022 IDEAS全球人工智能大会,与你不见不散!

Python的自回归分布滞后模型简介

3步走方略——用Python为数据科学项目收集数据

担任数据科学经理的前半年,我学到了什么?

点「在看」的人都变好看了哦 返回搜狐,查看更多

责任编辑:

作者 UU

此号发布内容皆为转载自其它媒体或企业宣传文章,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。如有侵权请联系删除!13723417500

声明本文由该作者发布,如有侵权请联系删除。内容不代表本平台立场!

发表回复

展会牛
服务平台
跨境人联网
优品出海
选品平台