|
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.basicConfig(level=logging.INFO) |
|
logger = logging.getLogger(__name__) |
|
|
|
def setup_chrome(): |
|
"""Chrome ve ChromeDriver kurulumu""" |
|
try: |
|
|
|
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' |
|
|
|
|
|
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}") |
|
|
|
|
|
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() |
|
|
|
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) |
|
self.analyzer = None |
|
|
|
def analyze_url(self, url): |
|
try: |
|
|
|
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() |