sentimentLens / backend /train.py
aaditya200's picture
SentimentLens fresh
df20aff
Raw
History Blame Contribute Delete
1.49 kB
import re, html, time, os, joblib
from datasets import load_dataset
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, accuracy_score
print("Loading dataset...")
ds = load_dataset("fancyzhx/amazon_polarity")
train_ds = ds["train"].shuffle(seed=42).select(range(50_000))
test_ds = ds["test"].shuffle(seed=42).select(range(5_000))
def clean(text):
text = html.unescape(text)
text = re.sub(r"<[^>]+>", " ", text)
text = re.sub(r"\s+", " ", text).strip()
return text.lower()
X_train = [clean(r) for r in train_ds["content"]]
y_train = train_ds["label"]
X_test = [clean(r) for r in test_ds["content"]]
y_test = test_ds["label"]
print("Training...")
t0 = time.time()
pipeline = Pipeline([
("tfidf", TfidfVectorizer(
ngram_range=(1, 2),
max_features=100_000,
sublinear_tf=True,
min_df=2,
)),
("clf", LogisticRegression(
C=5.0,
max_iter=1000,
solver="saga",
n_jobs=-1,
)),
])
pipeline.fit(X_train, y_train)
print(f"Done in {time.time()-t0:.1f}s")
preds = pipeline.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, preds):.4f}")
print(classification_report(y_test, preds, target_names=["NEGATIVE", "POSITIVE"]))
out = os.path.join(os.path.dirname(__file__), "tfidf_model.joblib")
joblib.dump(pipeline, out)
print(f"Saved → {out}")