ethimar / app.py
Ozgur Unlu
first version
448716e
raw
history blame
6.2 kB
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
from newspaper import Article
import nltk
from datetime import datetime, timedelta
import requests
from bs4 import BeautifulSoup
import re
# Download required NLTK data
try:
nltk.data.find('tokenizers/punkt')
except LookupError:
nltk.download('punkt')
# Initialize models and tokenizers
def load_models():
# Text generation model
generator_model = "facebook/opt-350m"
generator_tokenizer = AutoTokenizer.from_pretrained(generator_model)
generator = AutoModelForCausalLM.from_pretrained(generator_model)
# Sentiment analysis
sentiment_analyzer = pipeline(
"sentiment-analysis",
model="finiteautomata/bertweet-base-sentiment-analysis"
)
# Bias detection
bias_detector = pipeline(
"text-classification",
model="unitary/unbiased-bertscore"
)
return generator_tokenizer, generator, sentiment_analyzer, bias_detector
# Function to fetch recent news
def fetch_recent_news(query, num_articles=3):
base_url = "https://news.google.com/rss/search"
params = {
'q': query,
'hl': 'en-US',
'gl': 'US',
'ceid': 'US:en'
}
try:
response = requests.get(base_url, params=params)
soup = BeautifulSoup(response.content, 'xml')
items = soup.find_all('item')[:num_articles]
news_data = []
for item in items:
try:
article = Article(item.link.text)
article.download()
article.parse()
article.nlp()
news_data.append({
'title': article.title,
'summary': article.summary
})
except:
continue
return news_data
except Exception as e:
return [{'title': 'Error fetching news', 'summary': str(e)}]
# Generate content with ethical oversight
def generate_content(
product_name,
product_description,
target_audience,
key_features,
unique_benefits,
platform,
tone,
generator_tokenizer,
generator,
sentiment_analyzer,
bias_detector
):
# Format prompt based on platform
char_limit = 280 if platform == "Twitter" else 500
# Get recent news for context
news_data = fetch_recent_news(f"{product_name} {target_audience}")
news_context = "\n".join([f"Recent news: {item['title']}" for item in news_data])
# Create prompt
prompt = f"""
Product: {product_name}
Description: {product_description}
Target Audience: {target_audience}
Key Features: {key_features}
Unique Benefits: {unique_benefits}
Tone: {tone}
Platform: {platform}
Character Limit: {char_limit}
{news_context}
Create a {platform} post that highlights the product's benefits while maintaining a {tone} tone:
"""
# Generate initial content
inputs = generator_tokenizer(prompt, return_tensors="pt", max_length=512, truncation=True)
outputs = generator.generate(
inputs["input_ids"],
max_length=char_limit,
num_return_sequences=3,
temperature=0.7,
top_p=0.9,
do_sample=True,
)
generated_texts = [generator_tokenizer.decode(output, skip_special_tokens=True) for output in outputs]
# Filter and analyze content
filtered_content = []
for text in generated_texts:
# Clean up text
text = text.replace(prompt, "").strip()
# Check sentiment
sentiment = sentiment_analyzer(text)[0]
# Check bias
bias = bias_detector(text)[0]
# Filter based on ethical considerations
if (
sentiment['label'] != 'negative' and
float(bias['score']) < 0.7 and # Adjust threshold as needed
len(text) <= char_limit
):
filtered_content.append({
'text': text,
'sentiment': sentiment['label'],
'bias_score': f"{float(bias['score']):.2f}"
})
return filtered_content
# Gradio interface
def create_interface():
generator_tokenizer, generator, sentiment_analyzer, bias_detector = load_models()
def process_input(
product_name,
product_description,
target_audience,
key_features,
unique_benefits,
platform,
tone
):
results = generate_content(
product_name,
product_description,
target_audience,
key_features,
unique_benefits,
platform,
tone,
generator_tokenizer,
generator,
sentiment_analyzer,
bias_detector
)
output = ""
for i, content in enumerate(results, 1):
output += f"\nVersion {i}:\n"
output += f"Content: {content['text']}\n"
output += f"Sentiment: {content['sentiment']}\n"
output += f"Bias Score: {content['bias_score']}\n"
output += "-" * 50 + "\n"
return output
# Create the interface
iface = gr.Interface(
fn=process_input,
inputs=[
gr.Textbox(label="Product Name"),
gr.Textbox(label="Product Description", lines=3),
gr.Textbox(label="Target Audience"),
gr.Textbox(label="Key Features", lines=2),
gr.Textbox(label="Unique Benefits", lines=2),
gr.Radio(
choices=["Twitter", "Instagram"],
label="Platform",
value="Twitter"
),
gr.Textbox(label="Tone (e.g., professional, casual, friendly)"),
],
outputs=gr.Textbox(label="Generated Content", lines=10),
title="Ethimar - AI Marketing Content Generator",
description="Generate ethical marketing content with AI-powered insights",
theme="default"
)
return iface
# Launch the app
if __name__ == "__main__":
iface = create_interface()
iface.launch()