enesmanan's picture
Upload 5 files
22d9d31 verified
raw
history blame
5.92 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
# Logging ayarları
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def setup_chrome():
"""Chrome ve ChromeDriver kurulumu"""
try:
# Chrome kurulumu komutları
commands = [
'apt-get update',
'apt-get install -y wget unzip',
'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -',
'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list',
'apt-get update',
'apt-get install -y google-chrome-stable'
]
for cmd in commands:
logger.info(f"Executing: {cmd}")
result = os.system(cmd)
if result != 0:
logger.error(f"Command failed: {cmd}")
raise Exception(f"Command failed: {cmd}")
# ChromeDriver kurulumu
chrome_version = subprocess.check_output(['google-chrome', '--version']).decode().strip().split()[2].split('.')[0]
logger.info(f"Detected Chrome version: {chrome_version}")
driver_commands = [
f'wget -q "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{chrome_version}" -O chrome_version',
f'wget -q "https://chromedriver.storage.googleapis.com/$(cat chrome_version)/chromedriver_linux64.zip"',
'unzip chromedriver_linux64.zip',
'mv chromedriver /usr/local/bin/',
'chmod +x /usr/local/bin/chromedriver'
]
for cmd in driver_commands:
logger.info(f"Executing: {cmd}")
result = os.system(cmd)
if result != 0:
logger.error(f"Command failed: {cmd}")
raise Exception(f"Command failed: {cmd}")
logger.info("Chrome ve ChromeDriver başarıyla kuruldu!")
except Exception as e:
logger.error(f"Chrome kurulumunda hata: {str(e)}")
raise
class ReviewAnalysisApp:
def __init__(self):
try:
setup_chrome() # Uygulama başlatılırken Chrome'u kur
self.analyzer = ReviewAnalyzer()
except Exception as e:
print(f"Uygulama başlatılırken hata: {str(e)}")
def analyze_url(self, url):
try:
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
print("Yorumlar çekiliyor...")
df = scrape_reviews(url)
if df.empty:
return "Yorumlar çekilemedi. Lütfen URL'yi kontrol edin.", None, None, None
print("Sentiment analizi yapılıyor...")
analyzed_df = self.analyzer.analyze_reviews(df)
print("Özet oluşturuluyor...")
summary = self.analyzer.generate_summary(analyzed_df)
print("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)}"
print(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()