ReviewDispute/CompletePackage
0
1from fastapi import FastAPI, HTTPException2from pydantic import BaseModel3from transformers import pipeline4import gspread5from oauth2client.service_account import ServiceAccountCredentials6import pandas as pd7from sklearn.ensemble import RandomForestClassifier8import requests9from bs4 import BeautifulSoup10import numpy as np11import os12os.environ['TRANSFORMERS_CACHE'] = '/tmp/huggingface_cache'13 14app = FastAPI()15 16# Load AI model for content analysis17review_analyzer = pipeline("text-classification", model="bert-base-uncased")18 19# Load training data20TRAINING_DATA_PATH = "/mnt/data/new_training_data.csv"21df = pd.read_csv(TRAINING_DATA_PATH)22 23# Drop rows where Review Text is NaN24df = df.dropna(subset=["Review Text"])25 26# Define input data model27class ReviewRequest(BaseModel):28 review_text: str29 business_name: str30 31# Policy violation categories (Referenced from Google Content Policies)32POLICIES_URL = "https://support.google.com/contributionpolicy/answer/7400114"33CATEGORY_LABELS = [34 "Off Topic", "Spam", "Conflict of Interest", "Profanity",35 "Bullying or Harassment", "Discrimination or Hate Speech", "Personal Information"36]37 38# Train ML model for classification39def train_model():40 if "Review Text" in df and "Report Reason" in df:41 X = df["Review Text"]42 y = df["Report Reason"]43 44 from sklearn.feature_extraction.text import TfidfVectorizer45 from sklearn.pipeline import make_pipeline46 from sklearn.ensemble import RandomForestClassifier47 48 vectorizer = TfidfVectorizer(stop_words='english', max_features=5000)49 model = make_pipeline(vectorizer, RandomForestClassifier())50 model.fit(X, y)51 return model52 return None53 54ml_model = train_model()55 56# Function to check for Google policy updates57def check_policy_updates():58 response = requests.get(POLICIES_URL)59 if response.status_code == 200:60 soup = BeautifulSoup(response.text, "html.parser")61 online_policies = [policy.text.strip() for policy in soup.find_all("h2")]62 63 if set(online_policies) != set(CATEGORY_LABELS):64 raise HTTPException(status_code=400, detail="Please update policies list in main document. Google has updated their policies.")65 else:66 raise HTTPException(status_code=500, detail="Failed to fetch Google policies. Please check the URL.")67 68# Function to categorize reviews69def categorize_review(review_text):70 if ml_model:71 return ml_model.predict([review_text])[0]72 return "Off Topic"73 74# Function to analyze review75@app.post("/analyze_review/")76def analyze_review(request: ReviewRequest):77 check_policy_updates()78 report_reason = categorize_review(request.review_text)79 80 # Retrieve Appeal Reason and Justification from training data if available81 appeal_reason_row = df[df["Report Reason"] == report_reason].iloc[0] if not df[df["Report Reason"] == report_reason].empty else None82 appeal_reason = appeal_reason_row["Appeal Reason"] if appeal_reason_row is not None else "Unknown"83 appeal_justification = appeal_reason_row["Justification"] if appeal_reason_row is not None else "No justification available."84 85 return {"report_reason": report_reason, "appeal_reason": appeal_reason, "appeal_justification": appeal_justification}86 87# Function to update spreadsheet88@app.post("/update_spreadsheet/")89def update_spreadsheet(request: ReviewRequest):90 check_policy_updates()91 sheet = client.open_by_key(SPREADSHEET_ID).sheet192 analysis = analyze_review(request)93 94 # Update specific columns for report and appeal reasons95 sheet.append_row([request.business_name, request.review_text, "", "", "", analysis["report_reason"], "", "", "", analysis["appeal_reason"], analysis["appeal_justification"]])96 97 return {"status": "success", "message": "Spreadsheet updated successfully"}98 