|
|
|
|
|
|
|
|
from llama_index.core import Settings, SimpleDirectoryReader, VectorStoreIndex, Document
|
|
|
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
|
|
|
from llama_index.llms.huggingface import HuggingFaceLLM
|
|
|
import torch
|
|
|
import os
|
|
|
import pandas as pd
|
|
|
import gradio as gr
|
|
|
|
|
|
Settings.embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L6-v2")
|
|
|
|
|
|
|
|
|
Settings.embed_model = HuggingFaceEmbedding(
|
|
|
model_name="sentence-transformers/all-MiniLM-L6-v2")
|
|
|
Settings.llm = HuggingFaceLLM(
|
|
|
model_name="TinyLlama/TinyLlama-1.1B-Chat-v1.0",
|
|
|
tokenizer_name="TinyLlama/TinyLlama-1.1B-Chat-v1.0",
|
|
|
context_window=2048,
|
|
|
max_new_tokens=256,
|
|
|
device_map="auto",
|
|
|
model_kwargs={"torch_dtype": torch.float16, "load_in_4bit": True}
|
|
|
)
|
|
|
|
|
|
csv_file_path = "movie_recommendations_with_names.csv"
|
|
|
df = None
|
|
|
|
|
|
try:
|
|
|
df = pd.read_csv(csv_file_path)
|
|
|
except FileNotFoundError:
|
|
|
print(f"Error: CSV file not found at {csv_file_path}")
|
|
|
print(f"Current working directory: {os.getcwd()}")
|
|
|
|
|
|
except Exception as e:
|
|
|
print(f"An unexpected error occurred while reading the CSV: {e}")
|
|
|
|
|
|
if df is not None:
|
|
|
movies_data = [
|
|
|
Document(text=f"MovieID: {row['movie_id']}, Title: {row['title']}, Genre: {row['genre']}, Rating: {row['rating']}",
|
|
|
metadata={"movie_id": row['movie_id'], "title": row['title'], "genre": row['genre'], "rating": row['rating']})
|
|
|
for index, row in df.iterrows()
|
|
|
]
|
|
|
index = VectorStoreIndex.from_documents(movies_data)
|
|
|
query_engine = index.as_query_engine()
|
|
|
|
|
|
def recommend_movie(genre):
|
|
|
if not genre.strip():
|
|
|
return "! Please enter a movie genre."
|
|
|
|
|
|
response = query_engine.query(
|
|
|
f"List titles and genre of movies with genre {genre}."
|
|
|
f"provide at least 3 recommendations if avalabile."
|
|
|
)
|
|
|
|
|
|
response_lines= str(response).split("\n")
|
|
|
filtered = [
|
|
|
line for line in response_lines
|
|
|
if line.strip()
|
|
|
and "Note : The query is not specific" not in line
|
|
|
]
|
|
|
|
|
|
recommendations = []
|
|
|
for rec in filtered:
|
|
|
if "Title:" in rec:
|
|
|
try:
|
|
|
title = rec.split("Title:")[1].split(",")[0].strip()
|
|
|
recommendations.append(f"{title}")
|
|
|
except:
|
|
|
recommendations.append(f"{rec.strip()}")
|
|
|
|
|
|
recommendations = recommendations[:5]
|
|
|
|
|
|
if not recommendations:
|
|
|
return " Sorry , I couldn't find movies for that genre."
|
|
|
return "\n".join(recommendations)
|
|
|
|
|
|
|
|
|
interface = gr.Interface(
|
|
|
fn=recommend_movie,
|
|
|
inputs=gr.Textbox(
|
|
|
label="What type of movie are you in the mood for?",
|
|
|
placeholder="e.g. Action, Comedy, Drama, Sci-Fi"
|
|
|
),
|
|
|
outputs=gr.Textbox(label="🍿 Movie Recommendations"),
|
|
|
title="🎥 MovieRecBot",
|
|
|
description="Movie recommendation system powered by LlamaIndex + TinyLlama (Hugging Face)",
|
|
|
examples=[["Action"], ["Comedy"], ["Romance"], ["Sci-Fi"]],
|
|
|
)
|
|
|
interface.launch(share=True)
|
|
|
|
|
|
|