Upload 4 files
Browse files- app.py +17 -6
- scripts/review_summarizer.py +26 -11
app.py
CHANGED
@@ -62,27 +62,38 @@ class ReviewAnalysisApp:
|
|
62 |
try:
|
63 |
setup_chrome() # Uygulama başlatılırken Chrome'u kur
|
64 |
self.analyzer = ReviewAnalyzer()
|
|
|
65 |
except Exception as e:
|
66 |
-
|
|
|
|
|
67 |
|
68 |
def analyze_url(self, url):
|
69 |
try:
|
|
|
|
|
|
|
|
|
|
|
70 |
if not url or not url.startswith("https://www.trendyol.com/"):
|
71 |
return "Lütfen geçerli bir Trendyol ürün yorumları URL'si girin.", None, None, None
|
72 |
|
73 |
-
|
74 |
df = scrape_reviews(url)
|
75 |
|
76 |
if df.empty:
|
77 |
return "Yorumlar çekilemedi. Lütfen URL'yi kontrol edin.", None, None, None
|
78 |
|
79 |
-
|
80 |
analyzed_df = self.analyzer.analyze_reviews(df)
|
81 |
|
82 |
-
|
|
|
|
|
|
|
83 |
summary = self.analyzer.generate_summary(analyzed_df)
|
84 |
|
85 |
-
|
86 |
fig1 = self.create_sentiment_distribution(analyzed_df)
|
87 |
fig2 = self.create_rating_distribution(analyzed_df)
|
88 |
fig3 = self.create_sentiment_by_rating(analyzed_df)
|
@@ -91,7 +102,7 @@ class ReviewAnalysisApp:
|
|
91 |
|
92 |
except Exception as e:
|
93 |
error_msg = f"Analiz sırasında hata oluştu: {str(e)}"
|
94 |
-
|
95 |
return error_msg, None, None, None
|
96 |
|
97 |
def create_sentiment_distribution(self, df):
|
|
|
62 |
try:
|
63 |
setup_chrome() # Uygulama başlatılırken Chrome'u kur
|
64 |
self.analyzer = ReviewAnalyzer()
|
65 |
+
logger.info("ReviewAnalyzer başarıyla başlatıldı")
|
66 |
except Exception as e:
|
67 |
+
logger.error(f"ReviewAnalyzer başlatılırken hata: {str(e)}")
|
68 |
+
# Hata durumunda da analyzer'ı oluştur
|
69 |
+
self.analyzer = None
|
70 |
|
71 |
def analyze_url(self, url):
|
72 |
try:
|
73 |
+
# Analyzer'ın başarıyla başlatılıp başlatılmadığını kontrol et
|
74 |
+
if self.analyzer is None:
|
75 |
+
logger.error("Analyzer başlatılamadı")
|
76 |
+
return "Sistem başlatılamadı. Lütfen daha sonra tekrar deneyin.", None, None, None
|
77 |
+
|
78 |
if not url or not url.startswith("https://www.trendyol.com/"):
|
79 |
return "Lütfen geçerli bir Trendyol ürün yorumları URL'si girin.", None, None, None
|
80 |
|
81 |
+
logger.info("Yorumlar çekiliyor...")
|
82 |
df = scrape_reviews(url)
|
83 |
|
84 |
if df.empty:
|
85 |
return "Yorumlar çekilemedi. Lütfen URL'yi kontrol edin.", None, None, None
|
86 |
|
87 |
+
logger.info("Sentiment analizi yapılıyor...")
|
88 |
analyzed_df = self.analyzer.analyze_reviews(df)
|
89 |
|
90 |
+
if analyzed_df.empty:
|
91 |
+
return "Sentiment analizi yapılamadı.", None, None, None
|
92 |
+
|
93 |
+
logger.info("Özet oluşturuluyor...")
|
94 |
summary = self.analyzer.generate_summary(analyzed_df)
|
95 |
|
96 |
+
logger.info("Grafikler oluşturuluyor...")
|
97 |
fig1 = self.create_sentiment_distribution(analyzed_df)
|
98 |
fig2 = self.create_rating_distribution(analyzed_df)
|
99 |
fig3 = self.create_sentiment_by_rating(analyzed_df)
|
|
|
102 |
|
103 |
except Exception as e:
|
104 |
error_msg = f"Analiz sırasında hata oluştu: {str(e)}"
|
105 |
+
logger.error(error_msg)
|
106 |
return error_msg, None, None, None
|
107 |
|
108 |
def create_sentiment_distribution(self, df):
|
scripts/review_summarizer.py
CHANGED
@@ -14,6 +14,7 @@ import nltk
|
|
14 |
import re
|
15 |
import google.generativeai as genai
|
16 |
from dotenv import load_dotenv
|
|
|
17 |
|
18 |
warnings.filterwarnings('ignore')
|
19 |
|
@@ -24,19 +25,33 @@ try:
|
|
24 |
except:
|
25 |
print("NLTK dosyaları indirilemedi, devam ediliyor...")
|
26 |
|
|
|
|
|
27 |
class ReviewAnalyzer:
|
28 |
def __init__(self):
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
# Lojistik ve satıcı ile ilgili kelimeleri tanımla
|
42 |
self.logistics_seller_words = {
|
|
|
14 |
import re
|
15 |
import google.generativeai as genai
|
16 |
from dotenv import load_dotenv
|
17 |
+
import logging
|
18 |
|
19 |
warnings.filterwarnings('ignore')
|
20 |
|
|
|
25 |
except:
|
26 |
print("NLTK dosyaları indirilemedi, devam ediliyor...")
|
27 |
|
28 |
+
logger = logging.getLogger(__name__)
|
29 |
+
|
30 |
class ReviewAnalyzer:
|
31 |
def __init__(self):
|
32 |
+
try:
|
33 |
+
# Load environment variables
|
34 |
+
load_dotenv()
|
35 |
+
|
36 |
+
# Configure Gemini API
|
37 |
+
api_key = os.getenv('GOOGLE_API_KEY')
|
38 |
+
if not api_key:
|
39 |
+
raise ValueError("GOOGLE_API_KEY bulunamadı")
|
40 |
+
|
41 |
+
genai.configure(api_key=api_key)
|
42 |
+
self.model = genai.GenerativeModel('gemini-pro')
|
43 |
+
|
44 |
+
# Sentiment model kurulumu
|
45 |
+
self.setup_sentiment_model()
|
46 |
+
|
47 |
+
# Stop words yükleme
|
48 |
+
self.turkish_stopwords = self.get_turkish_stopwords()
|
49 |
+
|
50 |
+
logger.info("ReviewAnalyzer başarıyla başlatıldı")
|
51 |
+
|
52 |
+
except Exception as e:
|
53 |
+
logger.error(f"ReviewAnalyzer başlatılırken hata: {str(e)}")
|
54 |
+
raise
|
55 |
|
56 |
# Lojistik ve satıcı ile ilgili kelimeleri tanımla
|
57 |
self.logistics_seller_words = {
|