File size: 6,063 Bytes
99d7b92
 
 
 
 
 
 
 
22d9d31
a258a12
 
 
22d9d31
 
 
 
99d7b92
 
4b29a3a
 
a258a12
 
 
 
 
 
22d9d31
a258a12
 
 
4b29a3a
a258a12
 
4b29a3a
a258a12
 
 
 
 
 
4b29a3a
a258a12
22d9d31
99d7b92
 
 
4b29a3a
66f5d71
4b29a3a
66f5d71
 
4b29a3a
5a8b19d
66f5d71
4b29a3a
66f5d71
5a8b19d
99d7b92
 
4b29a3a
5a8b19d
 
 
 
 
4b29a3a
 
 
5a8b19d
4b29a3a
 
 
 
 
5a8b19d
4b29a3a
 
5a8b19d
 
 
 
4b29a3a
 
5a8b19d
4b29a3a
 
 
 
 
 
 
 
5a8b19d
4b29a3a
99d7b92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import gradio as gr
import pandas as pd
from scrape.trendyol_scraper import scrape_reviews
from scripts.review_summarizer import ReviewAnalyzer
import plotly.express as px
import plotly.graph_objects as go
import os
import subprocess
import logging
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

# Logging ayarları
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def setup_chrome():
    """Chrome ve ChromeDriver kurulumu"""
    try:
        # Chromium kullanarak Chrome yerine (Hugging Face'de önceden yüklü)
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        chrome_options.binary_location = '/usr/bin/chromium'  # Chromium path
        
        # ChromeDriver'ı webdriver-manager ile yönet
        from webdriver_manager.chrome import ChromeDriverManager
        from webdriver_manager.core.utils import ChromeType
        
        driver_path = ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install()
        logger.info(f"ChromeDriver path: {driver_path}")
        
        # Test et
        service = Service(driver_path)
        with webdriver.Chrome(service=service, options=chrome_options) as driver:
            driver.get("https://www.google.com")
            logger.info("Chrome test başarılı!")
            
    except Exception as e:
        logger.error(f"Chrome kurulumunda hata: {str(e)}", exc_info=True)
        raise

class ReviewAnalysisApp:
    def __init__(self):
        try:
            logger.info("Chrome kurulumu başlatılıyor...")
            setup_chrome()  # Uygulama başlatılırken Chrome'u kur
            
            logger.info("ReviewAnalyzer başlatılıyor...")
            self.analyzer = ReviewAnalyzer()
            logger.info("ReviewAnalyzer başarıyla başlatıldı")
            
        except Exception as e:
            logger.error(f"ReviewAnalyzer başlatılırken hata: {str(e)}", exc_info=True)  # Tam hata stack'ini göster
            self.analyzer = None
        
    def analyze_url(self, url):
        try:
            # Analyzer'ın başarıyla başlatılıp başlatılmadığını kontrol et
            if self.analyzer is None:
                logger.error("Analyzer başlatılamadı")
                return "Sistem başlatılamadı. Lütfen daha sonra tekrar deneyin.", None, None, None

            if not url or not url.startswith("https://www.trendyol.com/"):
                return "Lütfen geçerli bir Trendyol ürün yorumları URL'si girin.", None, None, None
            
            logger.info("Yorumlar çekiliyor...")
            df = scrape_reviews(url)
            
            if df.empty:
                return "Yorumlar çekilemedi. Lütfen URL'yi kontrol edin.", None, None, None
            
            logger.info("Sentiment analizi yapılıyor...")
            analyzed_df = self.analyzer.analyze_reviews(df)
            
            if analyzed_df.empty:
                return "Sentiment analizi yapılamadı.", None, None, None
            
            logger.info("Özet oluşturuluyor...")
            summary = self.analyzer.generate_summary(analyzed_df)
            
            logger.info("Grafikler oluşturuluyor...")
            fig1 = self.create_sentiment_distribution(analyzed_df)
            fig2 = self.create_rating_distribution(analyzed_df)
            fig3 = self.create_sentiment_by_rating(analyzed_df)
            
            return summary, fig1, fig2, fig3
            
        except Exception as e:
            error_msg = f"Analiz sırasında hata oluştu: {str(e)}"
            logger.error(error_msg)
            return error_msg, None, None, None
    
    def create_sentiment_distribution(self, df):
        fig = px.pie(df, 
                    names='sentiment_label', 
                    title='Duygu Analizi Dağılımı')
        return fig
    
    def create_rating_distribution(self, df):
        fig = px.bar(df['Yıldız Sayısı'].value_counts().sort_index(), 
                    title='Yıldız Dağılımı')
        fig.update_layout(xaxis_title='Yıldız Sayısı', 
                         yaxis_title='Yorum Sayısı')
        return fig
    
    def create_sentiment_by_rating(self, df):
        avg_sentiment = df.groupby('Yıldız Sayısı')['sentiment_score'].mean()
        fig = px.line(avg_sentiment, 
                     title='Yıldız Sayısına Göre Ortalama Sentiment Skoru')
        fig.update_layout(xaxis_title='Yıldız Sayısı', 
                         yaxis_title='Ortalama Sentiment Skoru')
        return fig

def create_interface():
    app = ReviewAnalysisApp()
    
    with gr.Blocks(theme=gr.themes.Soft()) as interface:
        gr.Markdown("# Trendyol Yorum Analizi")
        
        with gr.Row():
            url_input = gr.Textbox(
                label="Trendyol Ürün Yorumları URL'si",
                placeholder="https://www.trendyol.com/..."
            )
        
        analyze_btn = gr.Button("Analiz Et")
        
        with gr.Row():
            with gr.Column(scale=1):
                summary_output = gr.Textbox(
                    label="Özet",
                    lines=10
                )
            
            with gr.Column(scale=2):
                with gr.Tab("Duygu Analizi"):
                    sentiment_dist = gr.Plot()
                with gr.Tab("Yıldız Dağılımı"):
                    rating_dist = gr.Plot()
                with gr.Tab("Sentiment-Yıldız İlişkisi"):
                    sentiment_rating = gr.Plot()
        
        analyze_btn.click(
            fn=app.analyze_url,
            inputs=[url_input],
            outputs=[summary_output, sentiment_dist, rating_dist, sentiment_rating]
        )
    
    return interface

if __name__ == "__main__":
    interface = create_interface()
    interface.launch()