这个作业属于哪个课程 | 软件工程-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
- 数据预处理:通过爬取商品的描述信息,并使用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("完成分词处理")
- 特征表示:使用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
- 相似度计算:使用余弦相似度作为相似度计算的方法。通过计算不同商品之间的相似度,可以确定它们之间的相关性,并进行排序。
余弦相似度的具体实现过程以及示例:
# 相似度计算以及结果排序
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)
- 推荐结果呈现:使用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,并仔细比对了官方文档和示例代码。我们发现了一些潜在的问题,并进行了一些调整和优化。
- 首先,我们确保我们的代码符合微信开发者平台的要求,包括文件结构、命名规范和必需的配置项。我们检查了所有的依赖项和版本,确保它们与平台的要求相匹配。
- 其次,我们重点关注了DockerFile的配置。我们检查了镜像的选择和基础设置,并确保了正确的端口映射和环境变量配置。我们还检查了DockerFile中的命令和步骤,确保它们按照正确的顺序和方式进行。
- 最后,我们进行了多次尝试和测试,确保应用程序在本地环境和云托管环境中都能正常运行。我们仔细检查了日志和错误信息,定位并解决了可能出现的问题。
通过以上的努力和调整,我们最终成功地将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
视频:
学习视频链接