{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Veri Seti Keşfi ve Analizi\n", "\n", "Bu notebook'ta doktorsitesi veri setini indirip analiz edeceğiz.\n", "\n", "## Veri Seti Hakkında\n", "- **Kaynak**: Huggingface - alibayram/doktorsitesi\n", "- **İçerik**: Türkçe tıbbi soru-cevap çiftleri\n", "- **Boyut**: 167,732 kayıt\n", "- **Format**: Parquet\n", "- **Lisans**: CC BY-NC 4.0 (ticari olmayan kullanım)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Gerekli kütüphaneleri yükle\n", "import pandas as pd\n", "from datasets import load_dataset\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "sns.set_style('whitegrid')\n", "plt.rcParams['figure.figsize'] = (12, 6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Veri Setini İndirme\n", "\n", "Huggingface datasets kütüphanesi ile veri setini yüklüyoruz." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Veri setini yükle\n", "dataset = load_dataset(\"alibayram/doktorsitesi\")\n", "\n", "# Train split'ini DataFrame'e çevir\n", "df = dataset['train'].to_pandas()\n", "\n", "print(f\"Toplam kayıt sayısı: {len(df)}\")\n", "print(f\"\\nSütunlar: {df.columns.tolist()}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# İlk birkaç kaydı incele\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Veri Analizi\n", "\n", "Veri setinin yapısını ve içeriğini daha detaylı inceleyelim." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Temel istatistikler\n", "print(\"Veri Seti Bilgileri:\")\n", "print(f\"Toplam soru-cevap çifti: {len(df)}\")\n", "print(f\"Eksik değerler:\\n{df.isnull().sum()}\")\n", "print(f\"\\nBenzersiz doktor sayısı: {df['doctor_title'].nunique()}\")\n", "print(f\"Benzersiz uzmanlık alanı sayısı: {df['doctor_speciality'].nunique()}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# En çok soru cevaplanan uzmanlık alanları\n", "top_specialities = df['doctor_speciality'].value_counts().head(15)\n", "\n", "plt.figure(figsize=(12, 6))\n", "top_specialities.plot(kind='barh')\n", "plt.title('En Çok Soru Cevaplanan 15 Uzmanlık Alanı')\n", "plt.xlabel('Soru Sayısı')\n", "plt.ylabel('Uzmanlık Alanı')\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(\"\\nEn popüler 10 uzmanlık alanı:\")\n", "print(top_specialities.head(10))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Soru ve cevap uzunluklarını analiz et\n", "df['question_length'] = df['question_content'].str.len()\n", "df['answer_length'] = df['question_answer'].str.len()\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n", "\n", "axes[0].hist(df['question_length'].dropna(), bins=50, edgecolor='black')\n", "axes[0].set_title('Soru Uzunlukları Dağılımı')\n", "axes[0].set_xlabel('Karakter Sayısı')\n", "axes[0].set_ylabel('Frekans')\n", "\n", "axes[1].hist(df['answer_length'].dropna(), bins=50, edgecolor='black', color='orange')\n", "axes[1].set_title('Cevap Uzunlukları Dağılımı')\n", "axes[1].set_xlabel('Karakter Sayısı')\n", "axes[1].set_ylabel('Frekans')\n", "\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(f\"Ortalama soru uzunluğu: {df['question_length'].mean():.0f} karakter\")\n", "print(f\"Ortalama cevap uzunluğu: {df['answer_length'].mean():.0f} karakter\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Örnek Soru-Cevap İncelemeleri\n", "\n", "Veri setinden rastgele örnekler görelim." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Rastgele 3 örnek göster\n", "samples = df.sample(3)\n", "\n", "for idx, row in samples.iterrows():\n", " print(\"=\"*80)\n", " print(f\"Doktor: {row['doctor_title']}\")\n", " print(f\"Uzmanlık: {row['doctor_speciality']}\")\n", " print(f\"\\nSoru: {row['question_content'][:300]}...\" if len(row['question_content']) > 300 else f\"\\nSoru: {row['question_content']}\")\n", " print(f\"\\nCevap: {row['question_answer'][:300]}...\" if len(row['question_answer']) > 300 else f\"\\nCevap: {row['question_answer']}\")\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Veri Ön İşleme\n", "\n", "RAG sistemi için veri setini hazırlıyoruz." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Eksik değerleri temizle\n", "df_clean = df.dropna(subset=['question_content', 'question_answer'])\n", "\n", "# Çok kısa soru/cevapları filtrele (en az 20 karakter)\n", "df_clean = df_clean[\n", " (df_clean['question_length'] >= 20) & \n", " (df_clean['answer_length'] >= 20)\n", "]\n", "\n", "print(f\"Temizleme sonrası kayıt sayısı: {len(df_clean)}\")\n", "print(f\"Kaldırılan kayıt sayısı: {len(df) - len(df_clean)}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# RAG için doküman formatı oluştur\n", "# Her soru-cevap çiftini birleştirip metadata ekle\n", "\n", "df_clean['document'] = (\n", " \"Soru: \" + df_clean['question_content'] + \n", " \"\\n\\nCevap: \" + df_clean['question_answer']\n", ")\n", "\n", "# Metadata dict oluştur\n", "df_clean['metadata'] = df_clean.apply(\n", " lambda row: {\n", " 'doctor_title': row['doctor_title'],\n", " 'speciality': row['doctor_speciality'],\n", " 'question': row['question_content'][:100] # İlk 100 karakter\n", " }, axis=1\n", ")\n", "\n", "print(\"Doküman formatı hazır!\")\n", "print(f\"\\nÖrnek doküman:\\n{df_clean['document'].iloc[0][:400]}...\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Veri setini kaydet\n", "df_clean.to_parquet('../data/processed_medical_qa.parquet', index=False)\n", "print(\"Veri seti kaydedildi: data/processed_medical_qa.parquet\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Özet\n", "\n", "Bu notebook'ta:\n", "1. Doktorsitesi veri setini Huggingface'den indirdik\n", "2. Veri setinin yapısını ve içeriğini analiz ettik\n", "3. Uzmanlık alanlarını ve soru-cevap uzunluklarını görselleştirdik\n", "4. Veri temizleme ve ön işleme yaptık\n", "5. RAG sistemi için doküman formatı oluşturduk\n", "\n", "Sonraki adımda, bu veriyi kullanarak embedding oluşturup vector database'e yükleyeceğiz." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.0" } }, "nbformat": 4, "nbformat_minor": 4 }