import streamlit as st import json def main(): st.set_page_config(page_title="Duygu Analizi Modeli Dokümantasyonu", layout="wide") st.sidebar.title("Navigasyon") st.sidebar.markdown("[Model Genel Bakış](#1-model-genel-bakis)") st.sidebar.markdown("[Kodun Detaylı İncelemesi](#2-kodun-detayli-incelemesi)") st.sidebar.markdown("[Veri Seti Bilgisi](#3-veri-seti-bilgisi)") st.sidebar.markdown("[Sonuç](#4-sonuc)") st.title("Duygu Analizi Modeli Dokümantasyonu") st.header("1. Model Genel Bakış") st.write(""" Bu duygu analizi modeli, özellikle internet servis sağlayıcılarıyla ilgili yorum veya paylaşımları analiz etmek amacıyla tasarlanmıştır. Model üç ana bileşenden oluşmaktadır: 1. Varlık Çıkarımı 2. Metin Özetleme 3. Duygu Tahmini FastAPI uygulaması, kullanıcıların metin girdisi yaparak bu metinlerde yer alan farklı varlıklar için duygu analizi sonuçları alabileceği bir arayüz olarak hizmet vermektedir. """) st.header("2. Kodun Detaylı İncelemesi") st.subheader("2.1 İçe Aktarımlar ve Kurulum") st.code(""" import json import uvicorn from fastapi import FastAPI from pydantic import BaseModel, Field app = FastAPI() """) st.write(""" - Gerekli kütüphaneleri içe aktarıyoruz: JSON işleme için `json`, FastAPI sunucusunu çalıştırmak için `uvicorn`, ve FastAPI bileşenleri. - Bir FastAPI uygulama örneği oluşturuyoruz. """) st.subheader("2.2 Girdi Modeli") st.code(""" class Item(BaseModel): text: str = Field(..., example="Fiber 100mb SuperOnline kullanıcısıyım yaklaşık 2 haftadır @Twitch @Kick_Turkey gibi canlı yayın platformlarında 360p yayın izlerken donmalar yaşıyoruz. Başka hiç bir operatörler bu sorunu yaşamazken ben parasını verip alamadığım hizmeti neden ödeyeyim ? @Turkcell") """) st.write(""" - Girdi verilerini doğrulamak için Pydantic'in `BaseModel` sınıfını kullanarak bir `Item` sınıfı tanımlıyoruz. - `text` alanı, analiz için metin girdisini içeren bir string olacaktır. """) st.subheader("2.3 Tahmin Uç Noktası") st.code(""" @app.post("/predict/", response_model=dict) async def predict(item: Item): result = { "entity_list": [], "results": [] } """) st.write(""" - `Item` örneğini kabul eden asenkron bir POST uç noktası olan `/predict/` tanımlıyoruz. - Fonksiyon, analiz sonuçlarını saklamak için bir `result` sözlüğü başlatır. """) st.subheader("2.4 Varlık Çıkarımı ve İşleme") st.code(""" for entity in entities: new_entity = get_lasts_rooted(entity) result["entity_list"].append(new_entity) test_input = f"Sentence:{yorum} Keyword:{new_entity}" ilgili_kisim = generate_summary(test_input) """) st.write(""" - Tanımlanmış varlıklar arasında iterasyon yapıyoruz (kod kesitinde gösterilmemiştir). - Her varlık için: 1. `get_lasts_rooted()` ile işlem yapıyoruz (uygulama sağlanmamıştır). 2. İşlenen varlığı `entity_list`e ekliyoruz. 3. `generate_summary()` kullanarak bir özet oluşturuyoruz (uygulama sağlanmamıştır). """) # Insert image for entity extraction #st.image("durum_dagilimi.png", caption="Varlık Çıkarımındaki Durum Dağılımı") st.subheader("2.5 Kelime İşleme ve Duygu Analizi") st.code(""" ilgililer = [] for word in ilgili_kisim.split(): if word.isdigit(): ilgililer.append(word) continue suggesteds = sc.suggest_for_word(word) if suggesteds: if word in suggesteds: ilgililer.append(word) else: ilgililer.append(suggesteds[0]) ilgili_kisim = " ".join(ilgililer) ilgili_kisim = remove_stopwords(ilgili_kisim) sentiment = predict_sentiment(ilgili_kisim) sentiments = get_sentiments(ilgili_kisim) """) st.write(""" - Özet içerisindeki her kelimeyi işleriz: 1. Sayıları olduğu gibi tutarız. 2. `sc.suggest_for_word()` ile sayısal olmayan kelimeler için öneriler alırız. 3. Orijinal kelimeyi veya ilk öneriyi seçeriz. - İşlenmiş kelimeleri birleştirir, stopword'leri çıkarır ve duygu tahmini yaparız. - Ayrıca `get_sentiments()` fonksiyonu ile birden fazla duygu alırız. """) # Insert image for sentiment word clouds st.image("wordcloud_pozitif.png", caption="Pozitif Duygu WordCloud") st.image("wordcloud_nötr.png", caption="Nötr Duygu WordCloud") st.image("wordcloud_negatif.png", caption="Negatif Duygu WordCloud") st.subheader("2.6 Sonuçların Derlenmesi") st.code(""" if sentiment not in sentiments: result["results"].append({"entity": new_entity, "sentiment": sentiment}) for sentiment in sentiments: result["results"].append({"entity": new_entity, "sentiment": sentiment}) return result """) st.write(""" - Sonuçları derleriz, tahmin edilen duyguyu, duygu listesinde yoksa ekleriz. - `get_sentiments()` fonksiyonundan gelen tüm duyguları sonuçlara ekleriz. - Son olarak, tamamlanmış `result` sözlüğünü döndürürüz. """) st.subheader("2.7 Uygulamayı Çalıştırma") st.code(""" if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) """) st.write(""" - Eğer betik doğrudan çalıştırılırsa, Uvicorn kullanarak 0.0.0.0 adresinde ve 8000 portunda FastAPI sunucusunu başlatırız. """) st.header("3. Veri Seti Bilgisi") st.write(""" Modelimiz, eğitim ve operasyon için birkaç veri setine dayanmaktadır: 1. **Varlık Veri Seti**: İnternet servis sağlayıcıları, yayın platformları ve yaygın sorunlarla ilgili önceden tanımlanmış varlıkların bir koleksiyonu. Bu veri seti, varlık çıkarım sürecinde kullanılır. """) # Insert image for entity dataset st.image("keyword_length_distribution.png", caption="Anahtar Kelime Uzunluk Dağılımı") st.write(""" 2. **Metin Özetleme Veri Seti**: Tam metinler ve özetlerinin eşleştirildiği bir veri seti, `generate_summary()` fonksiyonunun eğitiminde kullanılır. Bu, her varlık için girdi metninin ilgili kısımlarını çıkarmaya yardımcı olur. """) # Insert image for text summarization dataset st.image("sentence_wordcloud.png", caption="Cümle WordCloud") st.write(""" 3. **Kelime Önerisi Veri Seti**: Kelimeler ve yaygın varyasyonları veya yazım hatalarından oluşan kapsamlı bir liste. Bu veri seti, kullanıcı girişindeki yazım hataları ve varyasyonları daha iyi ele almayı sağlayan `sc.suggest_for_word()` fonksiyonunu destekler. """) # Insert image for word suggestion dataset st.image("keyword_wordcloud.png", caption="Anahtar Kelime WordCloud") st.write(""" 4. **Stopword'ler Veri Seti**: Duygu analizi için önemli anlam taşımayan yaygın kelimeler listesi. Bu veri seti, `remove_stopwords()` fonksiyonunda kullanılır. """) st.write(""" 5. **Duygu Analizi Veri Seti**: Duygularla ilişkilendirilmiş etiketli metin örneklerinden oluşan büyük bir koleksiyon. Bu veri seti, yeni girdiler üzerinde doğru duygu tahmini yapmak için `predict_sentiment()` fonksiyonunu eğitmek amacıyla kullanılır. """) # Insert image for sentiment analysis dataset st.image("durum_dagilimi.png", caption="Duygu Analizi Veri Seti Örneği") st.write(""" Bu veri setlerinin her biri, modelin genel doğruluğunu artırmak ve daha iyi sonuçlar elde etmek için özenle seçilmiştir. """) st.header("4. Sonuç") st.write(""" Geliştirilen bu model, internet servis sağlayıcıları ve benzeri alanlarda müşteri geri bildirimlerinin analiz edilmesine yardımcı olacak güçlü bir araçtır. FastAPI üzerinden kullanımı kolay ve esnektir, genişletilebilir yapısı sayesinde farklı alanlarda da uyarlanabilir. Bu dokümantasyon boyunca, modelin genel yapısını, kodun detaylı incelemesini ve kullanılan veri setlerini ele aldık. Daha fazla geliştirme ve optimizasyon yapılabilir, ancak mevcut haliyle bile duygu analizi için etkili sonuçlar sunmaktadır. """) if __name__ == "__main__": main()