Olá!
Estou montando um algoritmo de recomendação para um ecommerce, utilizando a abordagem de filtragem baseada em conteúdo. Após pesquisas, cheguei a um algoritmo utilizando a lib scikit-learn com o TfidfVectorizer. Porém, como não sou muito familiarizado com a parte ML e tudo mais, gostaria da ajuda para revisar o algoritmo e fornecer algumas dicas de melhoria ou orientação sobre como posso otimizá-lo. Segue o código:
def calcular_similaridade(produtos):
textos = [" ".join([produto.descricao, produto.tipo.nome]) for produto in produtos]
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(textos)
similarity_matrix = cosine_similarity(tfidf_matrix)
return similarity_matrix
def recomendacoes(db, products_viewed, produtos, user):
produtos_visualizados = db.session.query(products_viewed)\
.join(produtos)\
.filter(
produtos.active, products_viewed.usuario_id == user.id,
products_viewed.tempo_visualizacao > 3000, products_viewed.active,
produtos.id == products_viewed.produto_id
).all()
if not produtos_visualizados:
return "Nenhum produto visualizado pelo usuário."
todos_produtos = db.session.query(produtos).filter_by(active=True).all()
id_para_indice = {produto.id: id_produto for id_produto, produto in enumerate(todos_produtos)}
similarity_matrix = calcular_similaridade(todos_produtos)
produtos_recomendados = set()
for produto_visualizado in produtos_visualizados:
index_produto_visualizado = id_para_indice.get(produto_visualizado.produto_id)
if index_produto_visualizado is not None:
similaridades = similarity_matrix[index_produto_visualizado]
indices_produtos_similares = similaridades.argsort()[-5:][::-1]
for idx in indices_produtos_similares:
produtos_recomendados.add(todos_produtos[idx])
return [{'nome': produto.nome} for produto in produtos_recomendados]
Obrigado!