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() |