本练习项目是基于顾客消费历史,在电商网站上为其建立自动推荐特定数量商品的系统。代码和使用的数据集为:https://pan.baidu.com/s/17IZL65qK-yDutI1Xrp8wAg 提取码: 5l9g

启动Jupyter Notebook,快速导入所需库并载入数据集。

import pandas as pdimport numpy as npimport randomfrom tqdm import tqdmfrom gensim.models import Word2Vec import matplotlib.pyplot as plt%matplotlib inline
import warnings;warnings.filterwarnings('ignore')
df = pd.read_excel('Online Retail.xlsx')df.head()

以下是对于该数据集某些领域的描述:

1. InvoiceNo: 发票号码,每次交易对应的唯一数字

2. StockCode: 产品/物品编码,每一唯一商品对应的唯一数字

3. Description:产品描述

4. Quantity:每次交易每种产品的数量

5. InvoiceDate: 每次交易生成的日期和时间

6. CustomerID:顾客ID,每位顾客对应的唯一数字。

df.shape

输出: (541909, 8)

该数据集包含541909次交易。这是一个搭建模型的极佳数字。

处理缺失数据

# check for missing valuesdf.isnull().sum()

已有充足数据,接下来去除所有含缺失值的行。

# remove missing valuesdf.dropna(inplace=True)

数据准备

将产品编码转换为线性数据:

df['StockCode']= df['StockCode'].astype(str)

查看数据集中唯一顾客的数量:

customers = df["CustomerID"].unique().tolist()len(customers)

输出:4372

数据集中有4372个顾客。对于每一个顾客,提取其购买历史。换句话说,有4372个购买顺序。

从数据集中保留一小部分用以验证是很好的做法。因此,将使用90%的顾客数据创建word2vec嵌入。将数据分割。

# shuffle customer ID'srandom.shuffle(customers)
# extract 90% of customer ID'scustomers_train = [customers[i] for i in range(round(0.9*len(customers)))]
# split data into train and validation settrain_df = df[df['CustomerID'].isin(customers_train)]validation_df = df[~df['CustomerID'].isin(customers_train)]

将对于数据集中的顾客创建购买顺序,兼顾训练和验证的目的。

# list to capture purchase history of the customerspurchases_train = []
# populate the list with the product codesfor i in tqdm(customers_train):    temp = train_df[train_df["CustomerID"] == i]["StockCode"].tolist()    purchases_train.append(temp)
# list to capture purchase history of the customerspurchases_val = []
# populate the list with the product codesfor i in tqdm(validation_df['CustomerID'].unique()):    temp = validation_df[validation_df["CustomerID"] == i]["StockCode"].tolist()    purchases_val.append(temp)

为产品创建word2vec词嵌入

# train word2vec modelmodel = Word2Vec(window = 10, sg = 1, hs = 0,                 negative = 10, # for negative sampling                 alpha=0.03, min_alpha=0.0007,                 seed = 14)
model.build_vocab(purchases_train, progress_per=200)
model.train(purchases_train, total_examples = model.corpus_count,             epochs=10, report_delay=1)

因为不再需要训练模型,呼叫 init_sims( )。这会使得模型记忆能力更强。

model.init_sims(replace=True)

查看模型总结:

print(model)

输出:word2vec(词汇=3151,规格=100,透明度=0.03)

本模型有3151个唯一单词,其规格向量各自为100。接下来,提取词汇表中所有单词的向量,将其存储以便取用。

# extract all vectorsX = model[model.wv.vocab]
X.shape

输出:(3151,100)

视觉化word2vec词嵌入

视觉化呈现已创建的嵌入总是很有帮助。此处有100个维度的嵌入。我们连4维都不能视觉化呈现,更别提100维了。那究竟该怎么办呢?

将通过UMAP算法把产品嵌入维度从100减少至2。这在维度减少中的应用十分常见。

import umap
cluster_embedding = umap.UMAP(n_neighbors=30, min_dist=0.0,                              n_components=2, random_state=42).fit_transform(X)
plt.figure(figsize=(10,9))plt.scatter(cluster_embedding[:, 0], cluster_embedding[:, 1], s=3, cmap='Spectral')

上图中每个点都代表一个产品。图上几处聚集的数据点代表相似产品。

开始推荐产品

恭喜!数据集中每一个产品的word2vec嵌入都已完成。现在,需要为特定产品或产品向量推荐相似产品。

首先创建产品ID以及产品描述库,以便于将产品描述和ID相互匹配。

products = train_df[["StockCode", "Description"]]
# remove duplicatesproducts.drop_duplicates(inplace=True, subset='StockCode', keep="last")
# create product-ID and product-description dictionaryproducts_dict = products.groupby('StockCode')['Description'].apply(list).to_dict()
# test the dictionaryproducts_dict['84029E']

输出:[‘RED WOOLLY HOTTIE WHITE HEART.’]

以下对该函数进行了定义。将产品向量作为输入,相似性最大的6个产品为输出:

def similar_products(v, n = 6):        # extract most similar products for the input vector    ms = model.similar_by_vector(v, topn= n+1)[1:]        # extract name and similarity score of the similar products    new_ms = []    for j in ms:        pair = (products_dict[j[0]][0], j[1])        new_ms.append(pair)            return new_ms

尝试运行函数,传输产品‘90019A’的向量(‘SILVER M.O.P ORBIT BRACELET’):

similar_products(model['90019A'])

输出:

[(‘SILVER M.O.P ORBIT DROP EARRINGS’, 0.766798734664917),

(‘PINK HEART OF GLASS BRACELET’, 0.7607438564300537),

(‘AMBER DROP EARRINGS W LONG BEADS’, 0.7573930025100708),

(‘GOLD/M.O.P PENDANT ORBIT NECKLACE’, 0.7413625121116638),

(‘ANT COPPER RED BOUDICCA BRACELET’, 0.7289256453514099),

(‘WHITE VINT ART DECO CRYSTAL NECKLAC’, 0.7265784740447998)]

很好!结果关联度很高,且与输入产品匹配度高。然而,输出只是基于单一产品向量。如果要基于多次购物历史推荐产品呢?

一个简单的解决办法是:提取顾客所购买全部产品向量平均值并根据其找到相似产品。将使用如下包含众多产品ID的函数,其输出了一个100维向量,这是输入产品向量之一:

def aggregate_vectors(products):    product_vec = []    for i in products:        try:            product_vec.append(model[i])        except KeyError:            continue            return np.mean(product_vec, axis=0)

注意之前已创建购买顺序的单独列表以便验证。现在将其利用起来。

len(purchases_val[0])

输出:314

第一个已购产品的列表长度为314。将用于验证的产品顺序表输入函数aggregate_vectors。

aggregate_vectors(purchases_val[0]).shape

输出:(100,)

函数输出100个维度。这意味着函数运转正常。现在用此结果得出最相似的产品:

similar_products(aggregate_vectors(purchases_val[0]))

输出:

[(‘PARTY BUNTING’, 0.661663293838501),

(‘ALARM CLOCK BAKELIKE RED ‘, 0.640213131904602),

(‘ALARM CLOCK BAKELIKE IVORY’, 0.6287959814071655),

(‘ROSES REGENCY TEACUP AND SAUCER ‘, 0.6286610960960388),

(‘SPOTTY BUNTING’, 0.6270893216133118),

(‘GREEN REGENCY TEACUP AND SAUCER’, 0.6261675357818604)]

结果显示,系统可根据顾客全部消费历史推荐6个产品。而且,若想根据最后几次购买记录得到推荐,也可以使用相同的函数。

以下仅以近十次购买记录作为输入:

similar_products(aggregate_vectors(purchases_val[0][-10:]))

输出:

[(‘PARISIENNE KEY CABINET ‘, 0.6296610832214355),

(‘FRENCH ENAMEL CANDLEHOLDER’, 0.6204789876937866),

(‘VINTAGE ZINC WATERING CAN’, 0.5855435729026794),

(‘CREAM HANGING HEART T-LIGHT HOLDER’, 0.5839680433273315),

(‘ENAMEL FLOWER JUG CREAM’, 0.5806118845939636)]

可代入不同编码和验证组中的顺序生成不同推荐。

用Word2Vec建立你的私人购物助手相关推荐

  1. 案例+代码详解:用Word2Vec建立你的私人购物助手

    图片来源:unsplash.com/@pixtolero2 你注意过亚马逊的"为你推荐"功能吗?事实上,此功能是由机器学习驱动的,精准无比. 网飞.谷歌.亚马逊.Flipkart等 ...

  2. 有道购物助手脚本版,支持chrome,解决bug【Update 0.03】!

    购物比价的扩展和脚本找了很多,要不是对比结果不及时,数据滞后,要不是有后门,后台修改链接,经过推广网站赚钱. 虽然chrome的有道购物助手扩展代码是远程的,存在隐患,但目前试用来说,数据准确性比较高 ...

  3. 解决流氓软件布丁桌面、布丁压缩、值购助手、智能云输入法、蒲公英wifi、柚子壁纸、麦家购物助手反复安装

    这几个软件正常卸载后都存在残留,有一个没卸载干净,就会拖家带口卷土重来. 下载Autoruns软件,点选项,扫描选项,勾选上传到virustotal检查,提交未知文件.隐藏virustotal清除条目 ...

  4. ChromeFK插件推荐系列三:购物助手插件推荐

    本次分享几个购物助手chrome扩展插件chromefk.希望对你有所帮助. 1.慢慢买 - 历史价格查询 在浏览购物网站时,只需要在商品详情页单击鼠标右键,选择右键菜单中的"查看历史价格& ...

  5. 网易惠惠购物助手:大数据实时更新框架概述

    一.需求是什么? 互联网中的许多应用都有数据实时更新的需求,比如网页搜索如何展示几分钟之前的新闻结果,购物搜索中价格.库存信息的实时更新.在大数据量的情况下,数据如何做到稳定及时的更新?本文以有道购物 ...

  6. 惠惠购物助手竟是“流氓软件”?因流量劫持被阿里告上法庭

    想在淘宝买裤子,链接一点却跳到了不知名小站:想在天猫买大牌,却进入了山寨旗舰店--阿里巴巴旗下淘宝和天猫以"惠惠购物助手"(以下称为"惠惠助手")劫持流量进行不 ...

  7. 基于AIGC的京东购物助手的技术方案设想 | 京东云技术团队

    灵感来源 随着AIGC的爆火,ChatGPT,GPT-4的发布,我作为一个算法工作者,深感AI发展的迅猛.最近,OpenAI的插件和联网功能陆续向用户公开,我也在第一时间试用了这些最新的功能.在Ope ...

  8. java怎么作用于云盘,建立自己的私人云盘 - 使用ownCloud

    建立自己的私人云盘,有必要吗?当然.万一Veriron.360.金山网盘关张了呢?事实上Veriron.360已经关张了,目前只有百度云盘还活着,不过百度会偷偷地进去翻你的东西,甚至把它看不顺眼的文件 ...

  9. 惠惠购物助手android版3.8.2无法安装的原因及解决方法

    今天在android手机上安装惠惠购物助手最新版(3.8.2)的时候,提示安装失败.期初,还以为自己手机有问题,但是安装了几个软件都正常之后判断原因出在app上. 调试错误信息 打开android s ...

最新文章

  1. 非凡推崇_2015年值得推崇的25位编码者
  2. 在嘴巴里放入124 个传感器,谷歌眼镜创始人新项目:用舌头发信息
  3. mongodb 导出指定数据库文件大小_大数据技术之将mongodb 数据指定字段导出,然后指定字段导入mysql 实例 及相关问题解决...
  4. 大剑无锋之你了解HTTPS吗?那么它为什么安全?【面试推荐】
  5. Extjs 4.2 MVC+ThreeJs学习笔记(二)一个简单的ThreeJS场景
  6. map to javaBean
  7. Jmeter压力测试简单教程(包括服务器状态监控)
  8. Microsoft.SharePoint.dll分享
  9. 【IT生活】成长,没有想象的那么迫切 ——叶绍琛
  10. 对接企业微信3:网页授权登录
  11. 1对1直播源码开源系统,一对一视频聊天系统成品源码
  12. python 图像处理基本操作
  13. 小白秒变大神--windows窗口+装B神器大全 两部曲
  14. fortran——实数和复数(矢量)运算
  15. AndroidStudio中Files under the “build“ folder are generated and should not be edited的解决方法
  16. Frame 与JFrame 的区别
  17. 通过手机访问计算机FTP服务器
  18. 鸿蒙有什么大劫,封神大劫之后,七大准圣排名
  19. iOS 开发商品详情页中的banner中点击查看图片
  20. java的图片上传与前端展示实例(Servlet+Jsp)

热门文章

  1. A method for defensing against multi-source Sybil attacksin VANET
  2. 让vscode的c++补全if的花括号在同一行
  3. 【转载】CentOS7为firewalld添加开放端口及相关操作
  4. 电子器件系列十九:晶振
  5. mysql 中 ROW_FORMAT的选择
  6. 宜搭低代码与Faas构建数据看板
  7. 使用 Visual Studio 分析器找出应用程序瓶颈(转)
  8. 希尔伯特变换与IQ调制解调
  9. 时间序列预测 | Python实现Prophet、ARIMA、LSTM时间序列数据预测
  10. redis操作报错-Unexpected character (‘-‘ (code 45)): Expected space separating root-level values