跳到主要内容

基于嵌入式模型的产品推荐系统

引言

推荐引擎是一种利用先进算法和数据分析技术,通过深度挖掘用户历史行为、兴趣和偏好等信息,以精准的方式为用户提供个性化产品推荐,从而在提升用户体验的同时,显著提高产品销售和服务的精准度。

在推荐系统的领域中,涌现了多种方法用于实现个性化推荐,其中包括基于内容的个性化推荐算法、基于协同过滤的推荐算法以及聚类算法等。基于内容的推荐算法依赖于对产品特征的深入理解,通过对用户的历史偏好进行匹配,从而推荐与其过去行为相似的内容。协同过滤算法则基于用户行为之间的相似性,通过推断用户可能对其他用户喜欢的产品感兴趣。聚类算法通过将用户或产品进行分组,实现对相似性的发现和推荐。

本文将阐述一种基于文本嵌入模型(Text Embedding Model),用于实现基于内容相似度的产品推荐系统。文本嵌入的核心目标在于通过学习商品描述信息中词汇之间的语义关系,将商品描述信息数据表示为具有语义信息的向量形式。这种技术使得在向量空间中,具有相似语义的商品描述信息能够呈现出相似的表示,从而显著提升个性化推荐的准确性和效果。

代码实现

  1. 读取数据集并准备编码所需的产品信息
    首先,通过Pandas库进行数据集的加载,并且将需要用于编码的产品信息进行整合,形成一个结构化的JSON字符串。该JSON字符串包含产品的关键信息,例如产品名称、品牌名称、产品分类以及产品售价等重要属性。这一步骤的目的是为后续的数据编码和处理提供一个规范化的输入。
df = pd.read_csv('./products.csv')
df['json'] = df[['产品名称', '品牌名称', '产品分类', '产品售价']].apply(lambda x: x.to_json(force_ascii=False), axis=1)
产品号产品名称品牌名称产品分类产品售价json
1荣耀X30 骁龙6nm疾速5G芯 66W超级快充 120Hz全视屏 全网通版 8GB+128GB 钛空银荣耀数码产品 | 手机1,689{"产品名称":"荣耀X30 骁龙6nm疾速5G芯 66W超级快充 120Hz全视屏 全网通版 8GB+128GB 钛空银","品牌名称":"荣耀","产品分类":"数码产品 | 手机","产品售价":"1,689"}
2Apple iPhone 13 (A2634) 128GB 星光色 支持移动联通电信5G 双卡双待 【快充套装】Apple数码产品 | 手机6,148{"产品名称":"Apple iPhone 13 (A2634) 128GB 星光色 支持移动联通电信5G 双卡双待 【快充套装】","品牌名称":"Apple","产品分类":"数码产品 | 手机","产品售价":"6,148"}
3Redmi Note 11 Pro 5G 三星AMOLED高刷屏 1亿像素 67W快充 VC液冷散热 6GB+128GB 迷雾森林 小米 红米小米数码产品 | 手机1,599{"产品名称":"Redmi Note 11 Pro 5G 三星AMOLED高刷屏 1亿像素 67W快充 VC液冷散热 6GB+128GB 迷雾森林 小米 红米","品牌名称":"小米","产品分类":"数码产品 | 手机","产品售价":"1,599"}
····································
  1. 产品信息编码
    在此阶段,借助OpenAI的Embedding接口,我们对之前准备好的结构化JSON字符串进行编码操作。通过该接口,我们能够将产品信息的各个属性转换为高维度的嵌入向量表示,以更抽象和语义化的形式捕捉产品特征。这一编码过程有助于将产品信息映射到连续的向量空间中,从而为后续的产品推荐任务提供更具表征力的输入数据。
#创建OpenAI embedding实例
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key,openai_api_base=openai_api_base)
#调用OpenAI Embedding针对产品信息进行向量转换
df['embedding'] = df['json'].apply(lambda x: embeddings.embed_query(x))
产品号产品名称品牌名称产品分类产品售价jsonembedding
1荣耀X30 骁龙6nm疾速5G芯 66W超级快充 120Hz全视屏 全网通版 8GB+128GB 钛空银荣耀数码产品 | 手机1,689{"产品名称":"荣耀X30 骁龙......"}[0.009280471061585346, 0.024168031108869864......
2Apple iPhone 13 (A2634) 128GB 星光色 支持移动联通电信5G 双卡双待 【快充套装】Apple数码产品 | 手机6,148{"产品名称":"Apple iPhone 13 ......"}[0.0038425770180735, 0.027590181051604254......
3Redmi Note 11 Pro 5G 三星AMOLED高刷屏 1亿像素 67W快充 VC液冷散热 6GB+128GB 迷雾森林 小米 红米小米数码产品 | 手机1,599{"产品名称":"Redmi Note 11 Pro......"}[-0.005607687382302153, 0.004346726446576017......
··········································
  1. 计算产品产品相似度
    接下来,我们需进行产品间相似度的计算,以在后续分析中确定相似度最高的产品对。我们采用余弦相似度算法构建了一个相似度计算函数。该函数通过计算经过OpenAI Embedding编码的产品信息向量之间的余弦夹角,来度量它们之间的相似性关系。下面是余弦相似度的计算公式:
cos(θ)=i=1n(xi×yi)i=1n(xi)2×i=1n(yi)2cos(\theta) = {\sum_{i=1}^{n}{(x_i \times y_i)} \over {\sum_{i=1}^{n}{(x_i)^2} \times \sum_{i=1}^{n}{(y_i)^2}}}

以下是对所有产品进行循环遍历,并计算其相似度值的代码实现:

# 余弦相似度计算函数
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 初始化相似度矩阵(100x100)
num_of_prds = df.shape[0]
similarity_matrix = np.zeros((num_of_prds, num_of_prds))

# 基于Embedding计算产品相似度
for i in range(num_of_prds):
for j in range(num_of_prds):
if i == j:
similarity_matrix[i,j] = 1
elif i < j:
#similarity_matrix[i,j] = 0
similarity_matrix[i,j] = cosine_similarity(df.iloc[i]['embedding'], df.iloc[j]['embedding'])
else:
similarity_matrix[i,j] = similarity_matrix[j,i]

各产品之间的相似度储存于矩阵中,以下为矩阵示例的打印输出:

print(similarity_matrix)
[[1. 0.9180068 0.92218852 ... 0.87765235 0.92380992 0.92328818]
[0.9180068 1. 0.9170553 ... 0.87578485 0.88063288 0.8776379 ]
[0.92218852 0.9170553 1. ... 0.87438843 0.89021782 0.88638116]
...
[0.87765235 0.87578485 0.87438843 ... 1. 0.90881466 0.90956605]
[0.92380992 0.88063288 0.89021782 ... 0.90881466 1. 0.99734479]
[0.92328818 0.8776379 0.88638116 ... 0.90956605 0.99734479 1. ]]
  1. 产品推荐
    以下为产品推荐函数,其输入为产品名称,输出为与输入产品相似度最高的前10个产品:
# 产品推荐函数
def product_recommendations(product_name, similarity_matrix):
# 获取产品索引
prd_idx = df[df['产品名称'] == product_name].index[0]
# 获取产品相似度评分,并按评分降序排列
score_series = pd.Series(similarity_matrix[prd_idx]).sort_values(ascending = False)
# 获取排名前10产品
top_idx = list(score_series.iloc[0:11].index)

result = df.iloc[top_idx][['产品号', '产品名称', '品牌名称', '产品分类', '产品售价']].copy()
for i in top_idx:
result.loc[i, '评分'] = similarity_matrix[prd_idx][i]

return result

以下是寻找与产品"小米12 骁龙8 Gen1 黄金手感 6.28英寸视感屏 120Hz高刷 5000万疾速影像 67W快充 8GB+256GB 黑色 5G"相似度最高的产品,其中排在第一位的是产品本身其相似度为1。

#小米12 骁龙8 Gen1 黄金手感 6.28英寸视感屏 120Hz高刷 5000万疾速影像 67W快充 8GB+256GB 黑色 5G
result = product_recommendations(df.iloc[6]['产品名称'], similarity_matrix)
result
产品号产品名称品牌名称产品分类产品售价评分
7小米12 骁龙8 Gen1 黄金手感 6.28英寸视感屏 120Hz高刷 5000万疾速影像 67W快充 8GB+256GB 黑色 5G小米数码产品 | 手机3,9991
20小米12X 骁龙870 黄金手感 6.28英寸视感屏 120Hz高刷 5000万超清主摄 67W快充 8GB+256GB 黑色 5G小米数码产品 | 手机2,9990.993717
22小米11 Ultra 至尊 5G 骁龙888 2K AMOLED四曲面柔性屏 陶瓷工艺 12GB+256GB 黑色 游戏小米数码产品 | 手机4,4990.951929
9Redmi K50 天玑8100 2K柔性直屏 OIS光学防抖 67W快充 5500mAh大电量 银迹 12GB+256GB 5G智能 小米红米小米数码产品 | 手机2,7990.948154
11Redmi K40S 骁龙870 三星E4 AMOLED 120Hz直屏 OIS光学防抖 67W快充 亮黑 12GB+256GB 5G智能 小米红米小米数码产品 | 手机2,3990.946332
1荣耀X30 骁龙6nm疾速5G芯 66W超级快充 120Hz全视屏 全网通版 8GB+128GB 钛空银荣耀数码产品 | 手机1,6890.939645
3Redmi Note 11 Pro 5G 三星AMOLED高刷屏 1亿像素 67W快充 VC液冷散热 6GB+128GB 迷雾森林 小米 红米小米数码产品 | 手机1,5990.938138
72小米 Redmi 游戏电视 X 2022款 65英寸 120Hz高刷 HDMI2.1 3+32GB大存储 智能电视L65R8-X X65小米家用电器电视机3,099
15摩托罗拉moto edge S30 骁龙888+ 1亿像素 144Hz高刷电竞屏 5000mAh大电池 5G旗舰 12GB+256GB 魅影黑摩托罗拉数码产品 | 手机2,5990.932578
25摩托罗拉moto edge S30冠军版 骁龙888+ 1亿像素 144Hz电竞屏 5000mAh大电池 5G 12GB+512GB 魅影黑摩托罗拉数码产品 | 手机2,5990.931101
92小米 Redmi BookPro14 2022款 2.5K120hz高清屏 高性能轻薄本 电脑(12代酷睿8核i5-12450H 16G 512G)小米电脑办公 | 笔记本4,9990.928883