Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import random | |
| from tweet_analyzer import TweetDatasetProcessor | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| class TwitterCloneApp: | |
| def __init__(self): | |
| self.processor = None | |
| def process_upload(self, file): | |
| """Process uploaded PDF file and analyze personality.""" | |
| try: | |
| if not file: | |
| return "Error: No file uploaded. Please upload a PDF dataset." | |
| self.processor = TweetDatasetProcessor() | |
| text = self.processor.extract_text_from_pdf(file.name) | |
| df = self.processor.process_pdf_content(text) | |
| # Extract mentions and hashtags | |
| mentions = df['mentions'].explode().dropna().unique().tolist() | |
| hashtags = df['hashtags'].explode().dropna().unique().tolist() | |
| # Perform personality analysis | |
| personality_analysis = self.processor.analyze_personality() | |
| # Format output | |
| result = f""" | |
| ### Analysis Complete | |
| - **Processed Tweets**: {len(df)} | |
| - **Mentions**: {", ".join(mentions) if mentions else "None"} | |
| - **Hashtags**: {", ".join(hashtags) if hashtags else "None"} | |
| ### Personality Analysis | |
| {personality_analysis} | |
| """ | |
| return result | |
| except Exception as e: | |
| return f"Error processing file: {str(e)}" | |
| def generate_tweet(self, context): | |
| """Generate a new tweet based on the analyzed personality.""" | |
| if not self.processor: | |
| return "Error: Please upload and analyze a dataset first." | |
| try: | |
| # Predefined contexts | |
| additional_contexts = [ | |
| "Comment on a recent technological advancement.", | |
| "Share a motivational thought.", | |
| "Discuss a current trending topic.", | |
| "Reflect on a past experience.", | |
| "Provide advice to followers." | |
| ] | |
| # Extract historical topics | |
| historical_topics = self.processor.analyze_topics(n_topics=5) | |
| # Combine predefined contexts with historical topics | |
| combined_contexts = additional_contexts + historical_topics | |
| selected_contexts = random.sample(combined_contexts, min(3, len(combined_contexts))) | |
| # Prioritize user context if provided | |
| if context: | |
| selected_contexts.insert(0, context) | |
| # Generate the tweet | |
| tweet = self.processor.generate_tweet(context=" | ".join(selected_contexts)) | |
| return f"### Generated Tweet\n{tweet}" | |
| except Exception as e: | |
| return f"Error generating tweet: {str(e)}" | |
| def create_interface(self): | |
| """Create the Gradio interface.""" | |
| with gr.Blocks(title="Twitter Personality Cloner") as interface: | |
| gr.Markdown("# Twitter Personality Cloner") | |
| gr.Markdown("Upload a PDF file containing tweets to analyze the author's personality and generate new tweets in their style.") | |
| with gr.Tab("Analyze Personality"): | |
| file_input = gr.File(label="Upload PDF Dataset", file_types=[".pdf"]) | |
| analyze_button = gr.Button("Analyze Dataset") | |
| analysis_output = gr.Textbox(label="Analysis Results", lines=10, interactive=False) | |
| analyze_button.click( | |
| fn=self.process_upload, | |
| inputs=file_input, | |
| outputs=analysis_output | |
| ) | |
| with gr.Tab("Generate Tweets"): | |
| context_input = gr.Textbox(label="Context (optional)", placeholder="Enter topic or context for the tweet") | |
| generate_button = gr.Button("Generate Tweet") | |
| tweet_output = gr.Textbox(label="Generated Tweet", lines=3, interactive=False) | |
| generate_button.click( | |
| fn=self.generate_tweet, | |
| inputs=context_input, | |
| outputs=tweet_output | |
| ) | |
| return interface | |
| def main(): | |
| app = TwitterCloneApp() | |
| interface = app.create_interface() | |
| interface.launch(share=True) | |
| if __name__ == "__main__": | |
| main() | |