# train_model.py import pandas as pd import re import joblib from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report # --- 1) LOAD CSVs WITH PROPER ENCODING --- fake = pd.read_csv(r"C:\Users\Srikar M\OneDrive\Documents\python\TruthRadar\Fake.csv\Fake.csv", encoding="utf-8-sig") real = pd.read_csv(r"C:\Users\Srikar M\OneDrive\Documents\python\TruthRadar\True.csv\True.csv", encoding="utf-8-sig") # DEBUG: confirm columns print("šŸ”„ Fake columns:", fake.columns.tolist()) print("šŸ”„ Real columns:", real.columns.tolist()) # --- 2) BUILD 'content' AND 'label' ON EACH DF INDIVIDUALLY --- # Take title + first 300 chars of text fake["content"] = fake["title"] + " " + fake["text"].str[:300] real["content"] = real["title"] + " " + real["text"].str[:300] fake["label"] = "FAKE" real["label"] = "REAL" # --- 3) CONCATENATE AND SHUFFLE --- df = pd.concat([fake, real], ignore_index=True) # Now df has columns: ['title','text','subject','date','content','label'] df = df[["content", "label"]].sample(frac=1, random_state=42).reset_index(drop=True) # --- 4) PREPROCESS TEXT (same as in Flask) --- def clean_text(text): text = re.sub(r"http\S+", "", text) text = re.sub(r"[^a-zA-Z\s]", "", text) return text.lower() df["content"] = df["content"].apply(clean_text) # --- 5) SPLIT INTO TRAIN/TEST --- X = df["content"] y = df["label"] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # --- 6) VECTORIZE --- vectorizer = TfidfVectorizer(stop_words="english", max_df=0.7, ngram_range=(1,2)) X_train_tfidf = vectorizer.fit_transform(X_train) X_test_tfidf = vectorizer.transform(X_test) # --- 7) TRAIN MODEL --- model = LogisticRegression(max_iter=1000) model.fit(X_train_tfidf, y_train) # --- 8) EVALUATE --- y_pred = model.predict(X_test_tfidf) print("\n🧠 Model Accuracy:", accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred)) # --- 9) SAVE ARTIFACTS --- joblib.dump(model, "app/model.pkl") joblib.dump(vectorizer, "app/vectorizer.pkl") print("\nāœ… Model and vectorizer saved to app/")