使用dssm实现简易 搜索推荐 功能

毕设想要实现一个简易的电影搜索推荐功能,由于对AI算法没有过多深入研究,结合ChatGPT实现了一个简易的模型

模型相关实现

import pymysql
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense, Embedding, Flatten, concatenate
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import tensorflow as tf
# Connect to MySQL database
db = pymysql.connect(host="localhost",user="root",password="root",port=3306,database="film_recsys"
)# Execute SQL query to extract movie data
query = "SELECT id, name, introduction, keywords FROM film"
cursor = db.cursor()
cursor.execute(query)# Create DataFrame from query results
data = cursor.fetchall()
df = pd.DataFrame(data, columns=['id', 'name', 'introduction', 'keywords'])# Data preprocessing: Combine text information into one field
# df['combined_text'] = df['introduction'] + ' ' + df['keywords'].apply(lambda x: ' '.join(x.split(',')))
df['combined_text'] = df['keywords'].apply(lambda x: ' '.join(x.split(',')))# Feature engineering: Use Tokenizer to convert movie name and keywords to sequences
tokenizer = Tokenizer()
tokenizer.fit_on_texts(df['combined_text'])
sequences = tokenizer.texts_to_sequences(df['combined_text'])# (之前的导入和数据库连接等部分保持不变)# 构建 DSSM 模型
max_sequence_length = max(len(seq) for seq in sequences)
vocab_size = len(tokenizer.word_index) + 1input_layer_query = Input(shape=(max_sequence_length,))
input_layer_candidate = Input(shape=(max_sequence_length,))embedding_layer_query = Embedding(input_dim=vocab_size, output_dim=50)(input_layer_query)
embedding_layer_candidate = Embedding(input_dim=vocab_size, output_dim=50)(input_layer_candidate)flatten_layer_query = Flatten()(embedding_layer_query)
flatten_layer_candidate = Flatten()(embedding_layer_candidate)concatenated_layer = concatenate([flatten_layer_query, flatten_layer_candidate])
dense_layer = Dense(128, activation='relu')(concatenated_layer)
output_layer = Dense(1, activation='sigmoid')(dense_layer)model = Model(inputs=[input_layer_query, input_layer_candidate], outputs=output_layer)
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])# 使用 pad_sequences 填充序列
padded_sequences = pad_sequences(sequences, maxlen=max_sequence_length, padding='post', truncating='post')# 将数据分为查询和候选集
query_data = padded_sequences
candidate_data = padded_sequences# 生成用于训练的正样本和负样本
num_samples = len(df)
positive_pairs = []
negative_pairs = []for i in range(num_samples):query_sample = query_data[i]# 正样本对(查询,相同电影)positive_pairs.append((query_sample, query_sample))# 负样本对(查询,不同电影)for _ in range(4):random_index = np.random.randint(0, num_samples)while random_index == i:random_index = np.random.randint(0, num_samples)negative_pairs.append((query_sample, candidate_data[random_index]))positive_pairs = np.array(positive_pairs)
negative_pairs = np.array(negative_pairs)# 合并正样本和负样本用于训练
X_train_query = np.concatenate([positive_pairs[:, 0], negative_pairs[:, 0]])
X_train_candidate = np.concatenate([positive_pairs[:, 1], negative_pairs[:, 1]])
y_train = np.concatenate([np.ones(len(positive_pairs)), np.zeros(len(negative_pairs))])# 打乱训练数据
indices = np.arange(len(X_train_query))
np.random.shuffle(indices)
X_train_query = X_train_query[indices]
X_train_candidate = X_train_candidate[indices]
y_train = y_train[indices]# 训练模型
model.fit([X_train_query, X_train_candidate], y_train, epochs=10, batch_size=50)# 提取电影嵌入
embedding_model = Model(inputs=input_layer_query, outputs=flatten_layer_query)
movie_embeddings = embedding_model.predict(np.array(query_data))# 计算余弦相似度
cosine_sim = cosine_similarity(movie_embeddings)# 电影名称到索引的映射
indices = pd.Series(df.index, index=df['name']).drop_duplicates()def get_recommendations(movie_name, cosine_sim=cosine_sim):# 获取电影的索引idx = indices[movie_name]# 获取电影之间的相似度分数sim_scores = list(enumerate(cosine_sim[idx]))# 根据相似度分数降序排序sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)# 获取前N个相似电影的索引top_n_indices = [i[0] for i in sim_scores[1:6]]  # 推荐5部电影# 返回推荐电影的名称return df['name'].iloc[top_n_indices]# 示例:给定一个电影名称,获取推荐电影
# while 1:
#     movie_name = input("请输入一个电影名:")
#     recommendations = get_recommendations(movie_name)
#     print(f"推荐给用户观看的电影有:\n{recommendations}")
# 关闭数据库连接
db.close()

使用flask对外提供接口供Java程序调用

from flask import Flask, request, jsonify
from flask_cors import CORSimport dssmapp = Flask(__name__)
CORS(app)# 封装返回结果的函数
def success_response(data):return jsonify({"code": "200", "data": data, "total": len(data.get("recommendations"))})def error_response(message):return jsonify({"code": "201", "message": message})# 定义接口
@app.route('/recommend', methods=['POST'])
def recommend():data = request.get_json()# 获取电影名称movie_name = data.get('movieName', None)if movie_name:try:# 调用模型获取推荐电影recommendations = ddsm.get_recommendations(movie_name)return success_response({"recommendations": recommendations.tolist()})except Exception as e:return error_response(str(e))else:return error_response("Invalid input")if __name__ == '__main__':app.run(port=5000)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装luajit及使用python运行lua脚本

使用Python运行lua脚本前,需要先安装LuaJIT,LuaJIT的官网是下载 (luajit.org) 目前已不再使用.exe文件的下载方式,需要使用Git从公共仓库下载源码,git命令为: $ git clone https://luajit.org/git/luajit.git 下载后…

Mybatis速成(二)

文章目录 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.3 条件查询1.6.4 参数名说明 2.…

PLC-Recorder的延伸分析功能说明

目录 一、缘起 二、如何从PLC-Recorder获取数据 1、在线获取 2、全自主打开数据文件 3、延伸分析 三、设置方法 四、效果展示 一、缘起 在各个行业,在不同的场景中,朋友们拿到数据后,想做的事情五花八门,有做宏观分析的、…

浅谈Websocket

由于 http 存在⼀个明显的弊端(消息只能有客户端推送到服务器端,⽽服务器端不能主动推送到客户端),导致如果服务器如果有连续的变化,这时只能使⽤轮询,⽽轮询效率过低,并不适合。于是 WebSocket 被发明出来 WebSocket 是⼀种在 Web 应⽤程序中实现双向通信的协议。与传…

排序前言冒泡排序

目录 排序应用 常见的排序算法 BubbleSort冒泡排序 整体思路 图解分析 ​ 代码实现 每趟 写法1 写法2 代码NO1 代码NO2优化 时间复杂度 排序概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递…

人类智能运转所需的知识通常是非线性弥散、聚合的

人类智能所需的知识通常不是按照线性的、逐步增长的方式获取的,而是通过多个不同领域的知识在脑中进行非线性的交互和整合。人类智能的形成是一个复杂的过程,涉及到多个不同的认知能力和知识领域。人们从各种不同的来源获取知识,包括通过学习…

rtt设备io框架面向对象学习-软件模拟rtc设备

目录 1.软件rtc设备实现类2.软件rtc设备类的子类3.初始化/构造流程3.1 设备驱动框架层3.3 设备io管理层 4.总结5.使用 硬件rtc和软件rtc设备是互斥的。因为它们的名字都叫"rtc",在对象容器中不允许重名。 软件rtc设备比较特殊,不依赖于任何硬件…

Anaconda修改虚拟环境的路径

新版本的anaconda会默认将虚拟环境配置在C盘下,默认的路径是C:\Users\username。同时anaconda3下envs目录是空的。 这里是建立虚拟环境是将路径修改到anaconda的方法。 第一步——修改.condarc文件 首先,C:\Users\username找到.condarc文件 添加或修…

洛谷P5714 肥胖问题 题解

#题外话(第25篇题解) #先看题目 题目链接https://www.luogu.com.cn/problem/P5714 特别的,对于Microsoft Edge浏览器,其自带有截长图引擎,路径为三个点→截图→选定后下拉即可,浏览器会自动为你下拉并选中…

Code Composer Studio (CCS) - Comment (注释)

Code Composer Studio [CCS] - Comment [注释] References Add Block Comment: 选中几行代码 -> 鼠标右键 -> Source -> Add Block Comment shortcut key: Ctrl Shift / Remove Block Comment: 选中几行代码->鼠标右键->Source->Remove Block Comment s…

Unity类银河恶魔城学习记录7-6 P72 Bouncy sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Colle…

相机图像质量研究(32)常见问题总结:图像处理对成像的影响--振铃效应

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

CSS概述 | CSS的引入方式 | 选择器

文章目录 1.CSS概述2.CSS的引入方式2.1.内部样式表2.2.行内样式表2.3.外部样式表 3.选择器 1.CSS概述 CSS,全称Cascading Style Sheets(层叠样式表),是一种用来设置HTML(或XML等)文档样式的语言。CSS的主要…

c# 二叉树

在 C# 中,二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。在 C# 中,可以使用类来实现二叉树的节点,并且通过引用连接节点来构建整棵树。 以下是一个简单的示例&a…

C++中的拷贝构造函数和深拷贝、浅拷贝,如何在C++中实现类和对象的序列化与反序列化?

C中的拷贝构造函数和深拷贝、浅拷贝 拷贝构造函数: 拷贝构造函数是一种特殊的构造函数,它接受一个对其同类的常量引用作为参数,并用于初始化新创建的对象。其主要作用是实现一个类的对象到另一个相同类型对象的拷贝。 拷贝构造函数的原型通常…

SG3225EAN规格书

SG3225EAN 晶体振荡器利用先进的锁相环技术和AT切割晶体单元,提供了宽频率范围和高性能LV-PECL输出,73.5 MHz至700 MHz的宽频率范围,能够保证高稳定性和宽频率调整的能力,适应于多样化的应用需求。2.5V和3.3V两种供电电压&#xf…

win10 环境下Python 3.8按装fastapi paddlepaddle 进行图片文字识别1

###按装 用conda 创建python 3.8的环境,可参看本人python下的其它文章。 在pycharm开发环境下按装相关的模块: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple fastapi pip install -i https://pypi.tuna.tsinghua.edu.cn/simple "uvi…

StarRocks表设计——分区分桶与副本数

目录 一、数据分布 1.1 概述 1.2 数据分布方式 1.2.1 Round-Robin 1.2.2 Range 1.2.3 List 1.2.4 Hash 1.3 StarRocks的数据分布方式 1.3.1 不分区 Hash分桶 1.3.2 Range分区Hash分桶 三、分区 3.1 分区概述 3.2 创建分区 3.2.1 手动创建分区 3.2.2 批量创建分区…

【教学类-19-10】20240214《ABAB式-规律黏贴18格-手工纸15*15CM-一页3种图案,AB一组样板,纵向、有边框》(中班)

背景需求 利用15*15CM手工纸制作AB色块手环(手工纸自带色彩),一页3个图案,2条为一组,画图案,黏贴成一个手环。 素材准备 代码展示 # # 作者:阿夏 # 时间:2024年2月14日 # 名称&…

云计算基础 -NUMA

UMA UMA中文翻译叫:一致性内存访问 多个CPU通过同一根前端总线(FSB)来访问内存(所有的内存访问都需要通过北桥芯片来完成),若多个CPU访问内存的不同内存单元还是相同内存单元,同一时刻&#x…