enesmanan's picture
hadi artıkkkk
a258a12 verified
raw
history blame
6.06 kB
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()