Ozgur Unlu
compliance rules into separate files. Small Gradio UI changes
0418a32
raw
history blame
5.45 kB
import gradio as gr
import easyocr
import torch
from transformers import pipeline, DistilBertTokenizer, DistilBertForSequenceClassification
import numpy as np
from PIL import Image
import json
from compliance_rules import ComplianceRules
# Initialize OCR reader
reader = easyocr.Reader(['en'])
# Initialize compliance rules
compliance_rules = ComplianceRules()
def extract_text_from_image(image):
"""Extract text from image using EasyOCR"""
result = reader.readtext(np.array(image))
return " ".join([text[1] for text in result])
def check_compliance(text):
"""Check text for compliance across all regions"""
rules = compliance_rules.get_all_rules()
report = {
"compliant": True,
"violations": [],
"warnings": [],
"channel_risks": {
"email": {"score": 0, "details": []},
"social": {"score": 0, "details": []},
"print": {"score": 0, "details": []}
}
}
for region, region_rules in rules.items():
# Check prohibited terms
for term_info in region_rules["prohibited_terms"]:
term = term_info["term"].lower()
if term in text.lower() or any(var.lower() in text.lower() for var in term_info["variations"]):
report["compliant"] = False
violation = f"{region}: Prohibited term '{term}' found"
report["violations"].append({
"region": region,
"type": "prohibited_term",
"term": term,
"severity": term_info["severity"]
})
# Update channel risks
for channel in report["channel_risks"]:
risk_score = compliance_rules.calculate_risk_score([violation], [], region)
report["channel_risks"][channel]["score"] += risk_score
report["channel_risks"][channel]["details"].append(
f"Prohibited term '{term}' increases {channel} risk"
)
# Check required disclaimers
for disclaimer in region_rules["required_disclaimers"]:
disclaimer_found = any(
disc_text.lower() in text.lower()
for disc_text in disclaimer["text"]
)
if not disclaimer_found:
warning = f"{region}: Missing {disclaimer['type']} disclaimer"
report["warnings"].append({
"region": region,
"type": "missing_disclaimer",
"disclaimer_type": disclaimer["type"],
"severity": disclaimer["severity"]
})
# Update channel risks
for channel in report["channel_risks"]:
risk_score = compliance_rules.calculate_risk_score([], [warning], region)
report["channel_risks"][channel]["score"] += risk_score
report["channel_risks"][channel]["details"].append(
f"Missing {disclaimer['type']} disclaimer affects {channel} risk"
)
return report
def analyze_ad_copy(image):
"""Main function to analyze ad copy"""
# Extract text from image
text = extract_text_from_image(image)
# Check compliance
compliance_report = check_compliance(text)
# Generate readable report
report_text = "Compliance Analysis Report\n\n"
report_text += f"Overall Status: {'βœ… Compliant' if compliance_report['compliant'] else '❌ Non-Compliant'}\n\n"
if compliance_report["violations"]:
report_text += "Violations Found:\n"
for violation in compliance_report["violations"]:
report_text += f"β€’ {violation['region']}: {violation['type']} - '{violation['term']}' (Severity: {violation['severity']})\n"
report_text += "\n"
if compliance_report["warnings"]:
report_text += "Warnings:\n"
for warning in compliance_report["warnings"]:
report_text += f"β€’ {warning['region']}: {warning['disclaimer_type']} (Severity: {warning['severity']})\n"
report_text += "\n"
report_text += "Channel Risk Assessment:\n"
for channel, risk_info in compliance_report["channel_risks"].items():
score = risk_info["score"]
risk_level = "Low" if score < 3 else "Medium" if score < 6 else "High"
report_text += f"β€’ {channel.capitalize()}: {risk_level} Risk (Score: {score})\n"
if risk_info["details"]:
for detail in risk_info["details"]:
report_text += f" - {detail}\n"
return report_text
# Create Gradio interface
iface = gr.Interface(
fn=analyze_ad_copy,
inputs=[
gr.Image(
type="pil",
label="Upload Marketing Material",
height=300, # Fixed height
width=400, # Fixed width
image_mode="RGB",
scale=1, # Prevents auto-scaling
source="upload",
tool="select"
)
],
outputs=gr.Textbox(label="Compliance Report", lines=10),
title="Marketing Campaign Compliance Checker",
description="Upload marketing material to check compliance with US (SEC), UK (FCA), and EU financial regulations.",
examples=[],
theme=gr.themes.Base(),
allow_flagging="never"
)
# Launch the app
iface.launch()