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