Spaces:
Sleeping
Sleeping
Update GlobalMovies.py
Browse files- GlobalMovies.py +63 -63
GlobalMovies.py
CHANGED
|
@@ -1,63 +1,94 @@
|
|
| 1 |
-
#
|
| 2 |
-
#
|
| 3 |
-
# Author: Karley
|
| 4 |
-
# Description: This script collects foreign film data using the TMDB API,
|
| 5 |
-
# processes text using NLP (TF-IDF), and recommends similar movies using content-based filtering.
|
| 6 |
|
| 7 |
import requests
|
| 8 |
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 9 |
from sklearn.metrics.pairwise import cosine_similarity
|
| 10 |
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
| 12 |
|
| 13 |
# -----------------------------
|
| 14 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
# -----------------------------
|
| 16 |
def get_foreign_movies(original_language="fr", page=1):
|
| 17 |
"""
|
| 18 |
-
Retrieves a list of foreign language movies from TMDB
|
| 19 |
"""
|
| 20 |
url = f"https://api.themoviedb.org/3/discover/movie?api_key={API_KEY}&with_original_language={original_language}&sort_by=popularity.desc&page={page}"
|
| 21 |
response = requests.get(url)
|
| 22 |
-
return response.json()
|
| 23 |
|
| 24 |
-
def build_movie_dataset(
|
| 25 |
"""
|
| 26 |
-
Builds a dataset of
|
|
|
|
| 27 |
"""
|
| 28 |
-
titles = []
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
return titles, descriptions, languages
|
| 39 |
|
| 40 |
-
#
|
| 41 |
-
|
|
|
|
| 42 |
|
| 43 |
# -----------------------------
|
| 44 |
-
#
|
| 45 |
# -----------------------------
|
| 46 |
def create_tfidf_matrix(descriptions):
|
| 47 |
-
"""
|
| 48 |
-
Transforms movie descriptions into a TF-IDF matrix for similarity comparison.
|
| 49 |
-
"""
|
| 50 |
tfidf = TfidfVectorizer(stop_words="english")
|
| 51 |
return tfidf.fit_transform(descriptions)
|
| 52 |
|
| 53 |
tfidf_matrix = create_tfidf_matrix(movie_descriptions)
|
| 54 |
|
| 55 |
# -----------------------------
|
| 56 |
-
#
|
| 57 |
# -----------------------------
|
| 58 |
-
def recommend_foreign(movie_title, tfidf_matrix, movie_titles, movie_languages, lang="fr"):
|
| 59 |
"""
|
| 60 |
-
Returns
|
| 61 |
"""
|
| 62 |
if movie_title not in movie_titles:
|
| 63 |
return ["Movie not found in dataset."]
|
|
@@ -70,38 +101,7 @@ def recommend_foreign(movie_title, tfidf_matrix, movie_titles, movie_languages,
|
|
| 70 |
for i in indices:
|
| 71 |
if movie_languages[i] == lang and i != idx:
|
| 72 |
recommendations.append(movie_titles[i])
|
| 73 |
-
if len(recommendations) == 5:
|
| 74 |
-
break
|
| 75 |
-
return recommendations
|
| 76 |
-
# --- NLP: TF-IDF Vectorization ---
|
| 77 |
-
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 78 |
-
|
| 79 |
-
def create_tfidf_matrix(descriptions):
|
| 80 |
-
"""
|
| 81 |
-
Transforms text descriptions into TF-IDF vectors.
|
| 82 |
-
"""
|
| 83 |
-
tfidf = TfidfVectorizer(stop_words='english')
|
| 84 |
-
return tfidf.fit_transform(descriptions)
|
| 85 |
-
|
| 86 |
-
tfidf_matrix = create_tfidf_matrix(movie_descriptions)
|
| 87 |
-
# --- Content-Based Filtering using Cosine Similarity ---
|
| 88 |
-
from sklearn.metrics.pairwise import cosine_similarity
|
| 89 |
-
|
| 90 |
-
def recommend_movies(movie_title, tfidf_matrix, titles, languages, lang="fr", top_n=5):
|
| 91 |
-
"""
|
| 92 |
-
Recommends movies similar to the given title, filtered by language.
|
| 93 |
-
"""
|
| 94 |
-
if movie_title not in titles:
|
| 95 |
-
return ["Movie not found in dataset."]
|
| 96 |
-
|
| 97 |
-
idx = titles.index(movie_title)
|
| 98 |
-
cosine_sim = cosine_similarity(tfidf_matrix[idx], tfidf_matrix).flatten()
|
| 99 |
-
sim_indices = cosine_sim.argsort()[::-1]
|
| 100 |
-
|
| 101 |
-
recommendations = []
|
| 102 |
-
for i in sim_indices:
|
| 103 |
-
if i != idx and languages[i] == lang:
|
| 104 |
-
recommendations.append(titles[i])
|
| 105 |
if len(recommendations) == top_n:
|
| 106 |
break
|
| 107 |
return recommendations
|
|
|
|
|
|
| 1 |
+
# GlobalMovies.py
|
| 2 |
+
# Backend logic for WorldFlix β Global Movie Recommender
|
|
|
|
|
|
|
|
|
|
| 3 |
|
| 4 |
import requests
|
| 5 |
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 6 |
from sklearn.metrics.pairwise import cosine_similarity
|
| 7 |
|
| 8 |
+
# -----------------------------
|
| 9 |
+
# TMDB API Setup
|
| 10 |
+
# -----------------------------
|
| 11 |
+
API_KEY = "your_tmdb_api_key_here" # π Replace with your real key
|
| 12 |
|
| 13 |
# -----------------------------
|
| 14 |
+
# Region + Language Mapping
|
| 15 |
+
# -----------------------------
|
| 16 |
+
region_languages = {
|
| 17 |
+
"European Films": {
|
| 18 |
+
"fr": "French",
|
| 19 |
+
"it": "Italian",
|
| 20 |
+
"es": "Spanish",
|
| 21 |
+
"de": "German",
|
| 22 |
+
"pt": "Portuguese"
|
| 23 |
+
},
|
| 24 |
+
"Asian Films": {
|
| 25 |
+
"ja": "Japanese",
|
| 26 |
+
"ko": "Korean",
|
| 27 |
+
"hi": "Hindi",
|
| 28 |
+
"zh": "Chinese"
|
| 29 |
+
},
|
| 30 |
+
"Latin American Films": {
|
| 31 |
+
"es": "Spanish",
|
| 32 |
+
"pt": "Portuguese"
|
| 33 |
+
},
|
| 34 |
+
"Middle Eastern Films": {
|
| 35 |
+
"fa": "Persian",
|
| 36 |
+
"ar": "Arabic",
|
| 37 |
+
"tr": "Turkish"
|
| 38 |
+
},
|
| 39 |
+
"African Films": {
|
| 40 |
+
"sw": "Swahili",
|
| 41 |
+
"ar": "Arabic",
|
| 42 |
+
"fr": "French"
|
| 43 |
+
}
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
# -----------------------------
|
| 47 |
+
# TMDB Data Fetching
|
| 48 |
# -----------------------------
|
| 49 |
def get_foreign_movies(original_language="fr", page=1):
|
| 50 |
"""
|
| 51 |
+
Retrieves a list of foreign language movies from TMDB.
|
| 52 |
"""
|
| 53 |
url = f"https://api.themoviedb.org/3/discover/movie?api_key={API_KEY}&with_original_language={original_language}&sort_by=popularity.desc&page={page}"
|
| 54 |
response = requests.get(url)
|
| 55 |
+
return response.json().get("results", [])
|
| 56 |
|
| 57 |
+
def build_movie_dataset(languages=["fr", "es", "it"], pages=2):
|
| 58 |
"""
|
| 59 |
+
Builds a dataset of movies from a list of language codes.
|
| 60 |
+
Returns: titles, descriptions, language codes
|
| 61 |
"""
|
| 62 |
+
titles, descriptions, langs = [], [], []
|
| 63 |
+
for lang in languages:
|
| 64 |
+
for page in range(1, pages + 1):
|
| 65 |
+
movies = get_foreign_movies(original_language=lang, page=page)
|
| 66 |
+
for movie in movies:
|
| 67 |
+
if movie.get("overview") and movie.get("title"):
|
| 68 |
+
titles.append(movie["title"])
|
| 69 |
+
descriptions.append(movie["overview"])
|
| 70 |
+
langs.append(movie["original_language"])
|
| 71 |
+
return titles, descriptions, langs
|
|
|
|
| 72 |
|
| 73 |
+
# π Default: Pull movies for all region languages (adjust pages if needed)
|
| 74 |
+
all_region_langs = {lang for group in region_languages.values() for lang in group}
|
| 75 |
+
movie_titles, movie_descriptions, movie_languages = build_movie_dataset(list(all_region_langs), pages=2)
|
| 76 |
|
| 77 |
# -----------------------------
|
| 78 |
+
# NLP: TF-IDF Matrix
|
| 79 |
# -----------------------------
|
| 80 |
def create_tfidf_matrix(descriptions):
|
|
|
|
|
|
|
|
|
|
| 81 |
tfidf = TfidfVectorizer(stop_words="english")
|
| 82 |
return tfidf.fit_transform(descriptions)
|
| 83 |
|
| 84 |
tfidf_matrix = create_tfidf_matrix(movie_descriptions)
|
| 85 |
|
| 86 |
# -----------------------------
|
| 87 |
+
# Recommender Function
|
| 88 |
# -----------------------------
|
| 89 |
+
def recommend_foreign(movie_title, tfidf_matrix, movie_titles, movie_languages, lang="fr", top_n=5):
|
| 90 |
"""
|
| 91 |
+
Returns top_n similar movies in the same language as movie_title.
|
| 92 |
"""
|
| 93 |
if movie_title not in movie_titles:
|
| 94 |
return ["Movie not found in dataset."]
|
|
|
|
| 101 |
for i in indices:
|
| 102 |
if movie_languages[i] == lang and i != idx:
|
| 103 |
recommendations.append(movie_titles[i])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
if len(recommendations) == top_n:
|
| 105 |
break
|
| 106 |
return recommendations
|
| 107 |
+
|