| import tensorflow as tf |
| import numpy as np |
| from tensorflow.keras.models import load_model |
| from tensorflow.keras.preprocessing.text import tokenizer_from_json |
| from tensorflow.keras.preprocessing.sequence import pad_sequences |
| import json |
| import pickle |
| from fastapi import FastAPI, HTTPException |
| from pydantic import BaseModel |
|
|
| app = FastAPI(title="News Source Classifier") |
|
|
| try: |
| model = load_model('news_classifier.h5') |
| |
| with open('tokenizer.json') as f: |
| tokenizer_data = json.load(f) |
| tokenizer = tokenizer_from_json(tokenizer_data) |
| |
| with open('vectorizer.pkl', 'rb') as f: |
| vectorizer = pickle.load(f) |
| except Exception as e: |
| print(f"Error loading model: {str(e)}") |
| raise |
|
|
| class PredictionRequest(BaseModel): |
| text: str |
|
|
| class PredictionResponse(BaseModel): |
| source: str |
| confidence: float |
|
|
| @app.post("/predict", response_model=PredictionResponse) |
| async def predict(request: PredictionRequest): |
| try: |
| sequence = tokenizer.texts_to_sequences([request.text]) |
| padded = pad_sequences(sequence, maxlen=100) |
|
|
| prediction = model.predict(padded) |
| confidence = float(np.max(prediction)) |
| |
| predicted_class = int(np.argmax(prediction)) |
| source = 'foxnews' if predicted_class == 0 else 'nbc' |
| |
| return PredictionResponse( |
| source=source, |
| confidence=confidence |
| ) |
| except Exception as e: |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|
| @app.get("/") |
| async def root(): |
| return { |
| "message": "News Source Classifier API", |
| "usage": "Make a POST request to /predict with a JSON payload containing 'text' field" |
| } |