Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import requests | |
| from bs4 import BeautifulSoup | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| import seaborn as sns | |
| from sklearn.feature_extraction.text import TfidfVectorizer | |
| import numpy as np | |
| # --- VERİ ÇEKME FONKSİYONU --- | |
| def scrape_ted_ideas(category, pages=1): | |
| # Eğer kategori 'all' ise tüm ana kategorileri tara | |
| categories_to_scrape = [category] | |
| if category == "all": | |
| categories_to_scrape = ["tech", "business", "science", "arts-design", "we-humans"] | |
| all_data = [] | |
| headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"} | |
| for cat in categories_to_scrape: | |
| for page in range(1, pages + 1): | |
| url = f"https://ideas.ted.com/category/{cat}/page/{page}/" | |
| try: | |
| response = requests.get(url, headers=headers, timeout=10) | |
| if response.status_code != 200: | |
| continue | |
| soup = BeautifulSoup(response.content, "html.parser") | |
| articles = soup.find_all("div", class_="post") | |
| for art in articles: | |
| title_tag = art.find("h1") | |
| excerpt_tag = art.find("div", class_="entry-excerpt") | |
| if title_tag: | |
| title = title_tag.text.strip() | |
| excerpt = excerpt_tag.text.strip() if excerpt_tag else "" | |
| all_data.append({ | |
| "title": title, | |
| "excerpt": excerpt, | |
| "category": cat | |
| }) | |
| except Exception as e: | |
| continue | |
| return pd.DataFrame(all_data) | |
| # --- STREAMLIT ARAYÜZÜ (YAN MENÜSÜZ) --- | |
| st.set_page_config(page_title="TED Ideas NLP Analyzer", layout="wide") | |
| st.title("💡 TED Ideas NLP Content Analyzer") | |
| st.markdown("TED Ideas platformundaki makaleleri kategorilerine göre çeker ve en önemli kavramları analiz eder.") | |
| # Ana ekranda kontroller (Yan menü yerine sütunlar kullanıyoruz) | |
| col_ctrl1, col_ctrl2, col_ctrl3 = st.columns([2, 1, 1]) | |
| with col_ctrl1: | |
| category_list = ["all", "tech", "business", "science", "arts-design", "we-humans"] | |
| selected_category = st.selectbox("Kategori Seçin", category_list, index=0, help="'all' seçeneği tüm kategorileri tarar.") | |
| with col_ctrl2: | |
| page_count = st.number_input("Sayfa Sayısı (Her kategori için)", min_value=1, max_value=5, value=1) | |
| with col_ctrl3: | |
| n_gram_choice = st.radio("Analiz Tipi", ["Tekli Kelimeler", "Kelime Grupları (2'li)"]) | |
| analyze_button = st.button("Analizi Başlat", use_container_width=True) | |
| if analyze_button: | |
| with st.spinner('Veriler toplanıyor ve NLP analizi yapılıyor... Lütfen bekleyin.'): | |
| # 1. Veri Kazıma | |
| df = scrape_ted_ideas(selected_category, page_count) | |
| if not df.empty: | |
| # Metin birleştirme ve temizlik | |
| df['combined_text'] = df['title'] + " " + df['excerpt'] | |
| # Boş satırları temizle | |
| df = df[df['combined_text'].str.strip() != ""] | |
| n_range = (1, 1) if n_gram_choice == "Tekli Kelimeler" else (2, 2) | |
| try: | |
| # 2. TF-IDF Analizi (Daha esnek parametrelerle) | |
| vectorizer = TfidfVectorizer( | |
| stop_words='english', | |
| ngram_range=n_range, | |
| min_df=1, | |
| token_pattern=r"(?u)\b\w\w+\b" # En az 2 harfli kelimeler | |
| ) | |
| tfidf_matrix = vectorizer.fit_transform(df['combined_text']) | |
| # Kelime ağırlıklarını hesapla | |
| importance = np.asarray(tfidf_matrix.mean(axis=0)).ravel() | |
| word_freq = pd.DataFrame({'word': vectorizer.get_feature_names_out(), 'importance': importance}) | |
| top_words = word_freq.sort_values(by='importance', ascending=False).head(15) | |
| # 3. Sonuçları Göster | |
| st.divider() | |
| res_col1, res_col2 = st.columns([1, 1]) | |
| with res_col1: | |
| st.subheader(f"📊 Veri Özeti ({len(df)} Makale)") | |
| st.dataframe(df[['category', 'title', 'excerpt']].head(20), use_container_width=True) | |
| with res_col2: | |
| st.subheader("🎯 En Önemli Kavramlar (TF-IDF)") | |
| if not top_words.empty: | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| sns.barplot(data=top_words, x='importance', y='word', palette='magma', ax=ax) | |
| plt.title(f"Kategori: {selected_category.upper()}") | |
| plt.xlabel("Önem Skoru") | |
| plt.ylabel("Kavramlar") | |
| st.pyplot(fig) | |
| else: | |
| st.warning("Görselleştirilecek veri bulunamadı.") | |
| except ValueError: | |
| st.error("Hata: Çekilen metin içeriği analiz için yetersiz (çok kısa veya sadece duraklama kelimeleri içeriyor).") | |
| st.info("Çözüm: Sayfa sayısını artırarak daha fazla veri çekmeyi deneyin.") | |
| else: | |
| st.error("⚠️ Veri çekilemedi. Siteye erişim engellenmiş olabilir veya kategori boş dönüyor.") |