个人技术总结博客-基于内容的商品推荐

这个作业属于哪个课程软件工程-23年春季学期
这个作业要求在哪里软件工程实践总结&个人技术总结
这个作业的目标课程回顾与总结、个人技术总结
其他参考文献CSDN GitHub 菜鸟教程

技术概述

基于内容的推荐算法是一种根据物品的特征和用户的偏好进行推荐的算法。在需要为用户提供个性化推荐的场景下使用,如电子商务平台、新闻推荐等。我选择学习该技术是因为在二手商城项目中,我们需要为用户推荐与其兴趣相关的商品。该技术的难点在于如何提取和表示物品的特征,并根据用户的偏好进行匹配和推荐。

技术详述

基本思路

在这里插入图片描述

具体实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

##具体的导包
import os
import numpy as np
import pandas as pd
import jieba
import jieba.posseg as pseg
from scipy.spatial import distance
import re
  1. 数据预处理:通过爬取商品的描述信息,并使用jieba分词工具进行分词处理,用于寻找商品的特征。同时,使用哈工大实验室的hit_stopwords文件对数据进行噪音过滤,并进行存储空间节省。
# 分词以及停用词
    def separate_words(self):
        stopwords_file_path = os.path.join('static', self.stopwords_file)  # 构建停用词文件的完整路径
        print("停用词文件路径:", stopwords_file_path)

        stopwords = [line.strip() for line in open(stopwords_file_path, 'r', encoding="utf-8").readlines()]
        pattern = re.compile(r'[a-zA-Z0-9]+')
        new_words = set()
        for word in self.all_words:
            if word not in stopwords and not pattern.match(word) and len(word) > 1:
                new_words.add(word)
        self.all_words = new_words
        print("完成分词处理")
  1. 特征表示:使用Word2Vec和腾讯开源的embedding文件进行特征表示。通过将提取的特征转换为可计算的向量表示,以便后续的相似度计算和推荐。
    embedding示例:
    在这里插入图片描述
#加载词向量
    def load_word_embeddings(self):
        embedding_file_path = os.path.join('static', self.embedding_file)  # 构建词向量文件的完整路径
        print("词向量文件路径:", embedding_file_path)

        is_first_line = True
        with open(embedding_file_path, 'r', encoding='utf-8') as fin:
            for line in fin:
                if is_first_line:
                    is_first_line = False
                    continue
                fields = line[:-1].split()
                if len(fields) != 201:
                    continue
                word = fields[0]
                self.word_embedding[word] = np.array([float(x) for x in fields[1:]])
# 计算商品的向量
    def compute_doc_vectors(self):
        embedding_dim = len(self.word_embedding[next(iter(self.word_embedding))])
        self.doc_vectors = np.zeros((len(self.df), embedding_dim))

        for idx, row in self.df.iterrows():
            words = row["new_words"].split()
            embeddings = np.zeros((len(words), embedding_dim))

            for i, word in enumerate(words):
                try:
                    embeddings[i] = self.word_embedding[word]
                except KeyError:
                    pass

            if len(embeddings) > 0:
                doc_vector = np.mean(embeddings, axis=0)
                self.doc_vectors[idx] = doc_vector
  1. 相似度计算:使用余弦相似度作为相似度计算的方法。通过计算不同商品之间的相似度,可以确定它们之间的相关性,并进行排序。

余弦相似度的具体实现过程以及示例:
在这里插入图片描述

# 相似度计算以及结果排序
    def find_similar_documents(self, query_id):
        # 查询文档的doc_vector
        query_vector = self.doc_vectors[self.df["cid"] == query_id][0]

        # 计算余弦相似度
        sim_values = 1 - distance.cdist(np.expand_dims(query_vector, axis=0), self.doc_vectors, metric="cosine")[0]

        # 添加sim_value列
        self.df["sim_value"] = sim_values

        # 按相似度降序排序,排除查询文档本身,并查询前10条
        result = self.df[self.df["cid"] != query_id].sort_values(by="sim_value", ascending=False)[
            ["cid", "introduce", "price", "photo", "username", "profile"]].head(10)
        print(result)
  1. 推荐结果呈现:使用Flask框架将计算得到的推荐结果以JSON数据的形式返回给前端,再进行渲染展示。

Flask框架部分代码:

@app.route('/recommend/<int:query_id>', methods=['GET'])
def search_similar_documents(query_id):
    # 查找相似文档
    similar_documents = processor.find_similar_documents(query_id=query_id)

    # 转换为字典列表
    similar_documents_list = similar_documents.to_dict(orient='records')

    # 返回JSON格式的结果
    return jsonify(similar_documents_list)


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)
else:
    application = app

Docker文档:

FROM python:3.10

LABEL Author=Stars

WORKDIR /home/project

COPY . .

RUN python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple && pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt

ENTRYPOINT ["python","app.py"]

展示:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

技术使用中遇到的问题和解决过程

问题1:

如何处理大规模的embedding文件?

由于腾讯开源的embedding文件大小超过20G,我与队友共同进行处理。我们筛选了与商品关键词相关的embedding,并去除了无用的词汇,从而减小了文件大小并提高了匹配速度。

问题2:

如何解决冷启动问题?

为了解决冷启动问题,我分析了用户注册信息中的性别和出生年月,推测用户的年龄段。同时,结合用户使用小程序的日期,给特殊节日的相关物品赋予额外的权重。这样可以在冷启动阶段为用户提供更个性化和有针对性的推荐。

问题3:

在将Flask部署到微信开发者平台的云托管时,我们遇到了一些问题。我们重新审视了我们的代码格式和关键的DockerFile,并仔细比对了官方文档和示例代码。我们发现了一些潜在的问题,并进行了一些调整和优化。

  1. 首先,我们确保我们的代码符合微信开发者平台的要求,包括文件结构、命名规范和必需的配置项。我们检查了所有的依赖项和版本,确保它们与平台的要求相匹配。
  2. 其次,我们重点关注了DockerFile的配置。我们检查了镜像的选择和基础设置,并确保了正确的端口映射和环境变量配置。我们还检查了DockerFile中的命令和步骤,确保它们按照正确的顺序和方式进行。
  3. 最后,我们进行了多次尝试和测试,确保应用程序在本地环境和云托管环境中都能正常运行。我们仔细检查了日志和错误信息,定位并解决了可能出现的问题。

通过以上的努力和调整,我们最终成功地将Flask应用程序部署到微信开发者平台的云托管上。

DockerFile

FROM python:3.10

LABEL Author=Stars

WORKDIR /home/project

COPY . .

RUN python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple && pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt

ENTRYPOINT ["python","app.py"]

总结

通过学习和应用基于内容的推荐算法,我在项目中取得了实际的成果。掌握了数据预处理、特征表示、相似度计算和推荐结果呈现等技术,并解决了在使用过程中遇到的问题。通过这一经历,我不仅提升了技术能力,还加深了对推荐算法原理和应用的理解。在团队合作中,我积极参与开发并有效沟通,提高了团队合作能力。这次经历对我的职业发展和个人成长都具有重要的意义。

参考文献、参考博客

文件:
jieba分词工具
哈工大实验室hit_stopwords
embedding

视频:
学习视频链接

博客:
jieba库常用函数及解析实例
推荐算法-(02) 基于内容的推荐算法(Content-Based)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VengaZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值