import streamlit as st import tensorflow as tf import numpy as np import nltk import os from nltk.tokenize import sent_tokenize from transformers import DistilBertTokenizerFast, TFDistilBertForSequenceClassification # 📁 Use safe cache directory inside Hugging Face or Docker os.environ["TRANSFORMERS_CACHE"] = "/tmp/huggingface" # 📥 Download NLTK tokenizer nltk_data_path = "/tmp/nltk_data" nltk.download("punkt_tab", download_dir=nltk_data_path) nltk.data.path.append(nltk_data_path) # 🔄 Load tokenizer and model from Hugging Face tokenizer = DistilBertTokenizerFast.from_pretrained( "distilbert-base-uncased", cache_dir="/tmp/huggingface" ) model = TFDistilBertForSequenceClassification.from_pretrained( "sundaram07/distilbert-sentence-classifier", cache_dir="/tmp/huggingface" ) # 🔮 Predict AI probability for a sentence def predict_sentence_ai_probability(sentence): inputs = tokenizer(sentence, return_tensors="tf", truncation=True, padding=True) outputs = model(inputs) logits = outputs.logits prob_ai = tf.sigmoid(logits)[0][0].numpy() return prob_ai # 📊 Analyze all sentences def predict_ai_generated_percentage(text, threshold=0.15): text = text.strip() sentences = sent_tokenize(text) ai_sentence_count = 0 results = [] for sentence in sentences: prob = predict_sentence_ai_probability(sentence) is_ai = prob <= threshold results.append((sentence, prob, is_ai)) if is_ai: ai_sentence_count += 1 total_sentences = len(sentences) ai_percentage = (ai_sentence_count / total_sentences) * 100 if total_sentences > 0 else 0.0 return ai_percentage, results # 🌐 Streamlit Web App st.set_page_config(page_title="AI Detector", layout="wide") st.title("🧠 AI Content Detector") st.markdown("This app detects the percentage of **AI-generated content** based on sentence-level analysis using DistilBERT.") # Initialize session state to avoid duplicates if "last_input" not in st.session_state: st.session_state.last_input = "" st.session_state.results = None st.session_state.percentage = None # 📋 User Input Area user_input = st.text_area("📋 Paste your text below to check for AI-generated sentences:", height=300) # 🔘 Analyze Button if st.button("🔍 Analyze"): if not user_input.strip(): st.warning("⚠️ Please enter some text to analyze.") else: # Store in session_state to avoid duplicates st.session_state.last_input = user_input ai_percentage, analysis_results = predict_ai_generated_percentage(user_input) st.session_state.results = analysis_results st.session_state.percentage = ai_percentage # Display only if results are present if st.session_state.results is not None: st.subheader("🔍 Sentence-level Analysis") for i, (sentence, prob, is_ai) in enumerate(st.session_state.results, start=1): label = "🟢 Human" if not is_ai else "🔴 AI" st.markdown(f"**{i}.** _{sentence}_\n\n → {label}") st.subheader("📊 Final Result") st.success(f"Estimated **AI-generated content**: **{st.session_state.percentage:.2f}%**")