Spaces:
Build error
Build error
| import gradio as gr | |
| from docx import Document | |
| from datetime import datetime | |
| import re | |
| import tempfile | |
| import pytesseract | |
| from PIL import Image | |
| from groq import Groq | |
| import io | |
| import os | |
| # Initialize APIs | |
| client = Groq(api_key=os.environ.get("GROQ_API_KEY")) | |
| pytesseract.pytesseract.tesseract_cmd = r'/usr/bin/tesseract' # Update path as needed | |
| # Helper Functions | |
| def extract_text_from_image(image_path): | |
| try: | |
| img = Image.open(image_path) | |
| text = pytesseract.image_to_string(img) | |
| return text.strip() if text else "No text found in image" | |
| except Exception as e: | |
| return f"OCR Error: {str(e)}" | |
| def groq_processing(prompt): | |
| try: | |
| completion = client.chat.completions.create( | |
| model="mixtral-8x7b-32768", | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": prompt | |
| } | |
| ] | |
| ) | |
| return completion.choices[0].message.content | |
| except Exception as e: | |
| return f"AI Processing Error: {str(e)}" | |
| def analyze_sentiment(text): | |
| prompt = f"""Analyze the sentiment of this text with detailed emotions: | |
| {text} | |
| Format response as: | |
| Primary Emotion: [emotion] | |
| Secondary Emotions: [comma-separated list] | |
| Confidence Level: [percentage]""" | |
| return groq_processing(prompt) | |
| def categorize_content(text): | |
| prompt = f"""Categorize this text into specific themes from the following options: | |
| Technology, Business, Lifestyle, Education, Politics, Health, Entertainment, Sports, Art, Science | |
| Text: {text} | |
| Respond with top 3 relevant categories in order of relevance.""" | |
| return groq_processing(prompt) | |
| # Document Processing Functions | |
| def create_word_document(posts): | |
| doc = Document() | |
| doc.add_heading('Social Media Data Extraction Report', 0) | |
| for idx, post in enumerate(posts): | |
| doc.add_heading(f'Post {idx+1}', level=1) | |
| data = [ | |
| ("Date of Post", post.get('date', 'N/A')), | |
| ("Media Type", post.get('media_type', 'N/A')), | |
| ("Number of Pictures", post.get('num_pictures', 'N/A')), | |
| ("Likes", post.get('likes', 'N/A')), | |
| ("Comments", post.get('comments', 'N/A')), | |
| ("Caption", post.get('caption', 'N/A')), | |
| ("OCR Text", post.get('ocr_text', 'N/A')), | |
| ("Language", post.get('language', 'N/A')), | |
| ("Sentiment Analysis", post.get('sentiment', 'N/A')), | |
| ("Content Categories", post.get('categories', 'N/A')), | |
| ("Hashtags", ', '.join(post.get('hashtags', [])) if post.get('hashtags') else 'N/A'), | |
| ("Concept Keywords", ', '.join(post.get('concepts', [])) if post.get('concepts') else 'N/A') | |
| ] | |
| for label, value in data: | |
| doc.add_paragraph(f"{label}: {value}") | |
| doc.add_page_break() | |
| temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".docx") | |
| doc.save(temp_file.name) | |
| return temp_file.name | |
| # Processing Functions | |
| def process_social_media(profile_link, hashtags, concepts, platform, date_range, num_posts): | |
| # Mock data - Replace with actual social media API calls | |
| mock_image = Image.new('RGB', (800, 600), color='white') | |
| mock_image_path = tempfile.mktemp(suffix='.jpg') | |
| mock_image.save(mock_image_path) | |
| posts = [{ | |
| 'date': datetime.now().strftime("%Y-%m-%d"), | |
| 'media_type': 'Image', | |
| 'num_pictures': 1, | |
| 'likes': 150, | |
| 'comments': 20, | |
| 'caption': 'Example caption with #technology', | |
| 'ocr_text': extract_text_from_image(mock_image_path), | |
| 'hashtags': ['#technology'], | |
| 'concepts': [c.strip() for c in concepts.split(',')], | |
| 'sentiment': analyze_sentiment('Example caption with #technology'), | |
| 'categories': categorize_content('Example caption with #technology') | |
| }] | |
| os.remove(mock_image_path) | |
| return create_word_document(posts[:num_posts]) | |
| def process_word_file(file, concepts): | |
| doc = Document(file.name) | |
| posts = [] | |
| for para in doc.paragraphs: | |
| if para.text.startswith('Post'): | |
| posts.append({'caption': ''}) | |
| elif posts: | |
| posts[-1]['caption'] += para.text + '\n' | |
| processed_posts = [] | |
| for post in posts: | |
| caption = post.get('caption', '') | |
| processed_post = { | |
| 'date': datetime.now().strftime("%Y-%m-%d"), | |
| 'media_type': 'Text', | |
| 'caption': caption, | |
| 'sentiment': analyze_sentiment(caption), | |
| 'categories': categorize_content(caption), | |
| 'concepts': [c.strip() for c in concepts.split(',')], | |
| 'hashtags': re.findall(r'#\w+', caption) | |
| } | |
| processed_posts.append(processed_post) | |
| return create_word_document(processed_posts) | |
| # Gradio Interface | |
| with gr.Blocks(title="Social Media Analyzer") as app: | |
| gr.Markdown("# Social Media Data Extraction Tool") | |
| with gr.Tabs(): | |
| with gr.TabItem("Social Media Extraction"): | |
| gr.Markdown("## Analyze Social Media Profiles") | |
| with gr.Row(): | |
| with gr.Column(): | |
| profile_link = gr.Textbox(label="Profile URL") | |
| hashtags = gr.Textbox(label="Hashtags (comma separated)") | |
| concepts = gr.Textbox(label="Concept Keywords (comma separated)") | |
| platform = gr.Radio(["Instagram", "Twitter", "Facebook"], label="Platform") | |
| date_range = gr.Textbox(label="Date Range (YYYY-MM-DD to YYYY-MM-DD)") | |
| num_posts = gr.Slider(1, 100, value=10, label="Number of Posts") | |
| sm_submit = gr.Button("Analyze Profile", variant="primary") | |
| with gr.Column(): | |
| sm_output = gr.File(label="Download Analysis Report") | |
| with gr.TabItem("Document Processing"): | |
| gr.Markdown("## Analyze Word Documents") | |
| with gr.Row(): | |
| with gr.Column(): | |
| word_file = gr.File(label="Upload Word Document") | |
| wp_concepts = gr.Textbox(label="Concept Keywords (comma separated)") | |
| wp_submit = gr.Button("Analyze Document", variant="primary") | |
| with gr.Column(): | |
| wp_output = gr.File(label="Download Analysis Report") | |
| sm_submit.click( | |
| fn=process_social_media, | |
| inputs=[profile_link, hashtags, concepts, platform, date_range, num_posts], | |
| outputs=sm_output | |
| ) | |
| wp_submit.click( | |
| fn=process_word_file, | |
| inputs=[word_file, wp_concepts], | |
| outputs=wp_output | |
| ) | |
| if __name__ == "__main__": | |
| app.launch() |