File size: 3,837 Bytes
452611f
 
f61d1a4
452611f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f61d1a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
452611f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0fd270a
f61d1a4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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:
            self.processor = TweetDatasetProcessor()
            text = self.processor.extract_text_from_pdf(file.name)
            df = self.processor.process_pdf_content(text)
            
            mentions = df['mentions'].explode().dropna().unique().tolist()
            hashtags = df['hashtags'].explode().dropna().unique().tolist()

            personality_analysis = self.processor.analyze_personality()
            
            return f"Processed {len(df)} tweets\n\nMentions: {mentions}\n\nHashtags: {hashtags}\n\nPersonality Analysis:\n{personality_analysis}"
        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 "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)))

            # If user provided context, add it to the mix
            if context:
                selected_contexts.append(context)

            # Generate the tweet with diverse contexts
            tweet = self.processor.generate_tweet(context=" | ".join(selected_contexts))
            return 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)
                
                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")
                
                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()