Buckets:
| #!/usr/bin/env python3 | |
| # -*- coding: utf-8 -*- | |
| """ | |
| اسکریپت افزودن Markdown های جامع فارسی به نوتبوک CA10 | |
| """ | |
| import json | |
| import copy | |
| # خواندن نوتبوک اصلی | |
| with open("CA10.ipynb", "r", encoding="utf-8") as f: | |
| notebook = json.load(f) | |
| # Markdown های جامع فارسی برای اضافه کردن | |
| fa_markdowns = { | |
| # بعد از سلول اول (مقدمه) | |
| 1: """## 📚 بخش 1: مبانی نظری گرافهای دانش (Knowledge Graphs) | |
| ### 1.1 فلسفه و مفهومسازی گرافهای دانش | |
| گرافهای دانش یکی از پیشرفتهترین و قدرتمندترین روشهای نمایش دانش ساختاریافته در سیستمهای هوش مصنوعی مدرن هستند. برخلاف پایگاههای داده سنتی که اطلاعات را در جداول دوبعدی سفت و سخت ذخیره میکنند، گرافهای دانش بر اساس این اصل فلسفی بنا شدهاند که **دانش واقعی از طریق شبکه پیچیده روابط بین اجزای مختلف اطلاعات شکل میگیرد**. | |
| #### 🔬 تعریف ریاضی دقیق | |
| یک گراف دانش به صورت ریاضی یک **مولتیگراف جهتدار برچسبدار** است: | |
| ``` | |
| KG = (E, R, T) | |
| جایی که: | |
| • E: مجموعه موجودیتها (Entities) - گرههای گراف | |
| • R: مجموعه روابط (Relations) - برچسبهای یالها | |
| • T ⊆ E × R × E: مجموعه سهتاییها (Triples) - واقعیتهای دانش | |
| ``` | |
| **ویژگیهای کلیدی:** | |
| - **جهتدار (Directed)**: روابط جهت مشخص دارند | |
| - **برچسبدار (Labeled)**: هر یال نوع رابطه را مشخص میکند | |
| - **مولتیگراف (Multigraph)**: امکان وجود چندین یال بین دو گره | |
| #### 🌐 ریشه در وب معنایی (Semantic Web) | |
| گرافهای دانش از چشمانداز **تیم برنرز-لی** برای وب معنایی الهام گرفتهاند: | |
| **1. شناسایی مبتنی بر URI:** | |
| ``` | |
| http://example.org/entity/Albert_Einstein | |
| ``` | |
| هر موجودیت یک شناسه یکتای جهانی دارد. | |
| **2. چارچوب توصیف منابع (RDF):** | |
| ```xml | |
| <rdf:Description rdf:about="http://example.org/Albert_Einstein"> | |
| <foaf:name>Albert Einstein</foaf:name> | |
| <dbp:birthPlace rdf:resource="http://example.org/Germany"/> | |
| </rdf:Description> | |
| ``` | |
| **3. هستیشناسی (Ontology):** | |
| - تعریف رسمی کلاسها و روابط | |
| - قوانین و محدودیتهای دامنه | |
| - سلسلهمراتب مفاهیم | |
| **4. اصول دادههای پیوندی (Linked Data):** | |
| - استفاده از URI برای نامگذاری | |
| - استفاده از HTTP URIs | |
| - ارائه اطلاعات مفید | |
| - پیوند به URIs دیگر | |
| ### 1.2 اجزای بنیادین: تحلیل عمیق | |
| #### 🎯 1.2.1 موجودیتها (Entities): بلوکهای ساختمانی دانش | |
| موجودیتها نمایانگر **اشیاء، مفاهیم، و پدیدههای دنیای واقعی** هستند. | |
| **ساختار هویتی موجودیت:** | |
| ``` | |
| Entity e = { | |
| URI: شناسه یکتا | |
| type: نوع هستیشناختی (ontological type) | |
| attributes: {(property₁, value₁), ..., (propertyₙ, valueₙ)} | |
| context: متادیتای خاص دامنه | |
| confidence: سطح اطمینان (0-1) | |
| provenance: منبع اطلاعات | |
| temporal: بازه زمانی اعتبار | |
| } | |
| ``` | |
| **طبقهبندی انواع موجودیتها:** | |
| **الف) موجودیتهای عینی (Concrete Entities):** | |
| - اشخاص: `einstein`, `marie_curie` | |
| - مکانها: `germany`, `paris` | |
| - اشیاء فیزیکی: `book`, `laboratory` | |
| **ب) موجودیتهای انتزاعی (Abstract Entities):** | |
| - مفاهیم علمی: `quantum_mechanics`, `relativity` | |
| - نظریهها: `evolution_theory` | |
| - اصول: `conservation_of_energy` | |
| **ج) رویدادها (Events):** | |
| - اتفاقات تاریخی: `world_war_2` | |
| - کشفیات: `discovery_of_radioactivity` | |
| - جوایز: `nobel_prize_1921` | |
| **د) ویژگیها (Properties):** | |
| - صفات: `intelligent`, `innovative` | |
| - روابط زمانی: `before`, `during`, `after` | |
| #### 🔗 1.2.2 روابط (Relations): پیوندهای معنایی | |
| روابط **خطوط ارتباطی معنادار** بین موجودیتها را تعریف میکنند. | |
| **خواص ریاضی روابط:** | |
| **1. روابط تابعی (Functional Relations):** | |
| ``` | |
| ∀s ∈ E, ∃!o: (s,r,o) ∈ T | |
| ``` | |
| مثال: `birthDate(person, date)` - هر شخص فقط یک تاریخ تولد دارد | |
| **2. روابط معکوستابعی (Inverse Functional):** | |
| ``` | |
| ∀o ∈ E, ∃!s: (s,r,o) ∈ T | |
| ``` | |
| مثال: `hasSSN(person, ssn_number)` - هر شماره SSN منحصر به یک شخص است | |
| **3. روابط متقارن (Symmetric):** | |
| ``` | |
| ∀s,o: (s,r,o) ∈ T ⟺ (o,r,s) ∈ T | |
| ``` | |
| مثال: `colleague(person₁, person₂)` ⟺ `colleague(person₂, person₁)` | |
| **4. روابط نامتقارن (Asymmetric):** | |
| ``` | |
| ∀s,o: (s,r,o) ∈ T ⟹ (o,r,s) ∉ T | |
| ``` | |
| مثال: `childOf(person₁, person₂)` ⟹ NOT `childOf(person₂, person₁)` | |
| **5. روابط گذرا (Transitive):** | |
| ``` | |
| ∀s,m,o: (s,r,m) ∧ (m,r,o) ⟹ (s,r,o) | |
| ``` | |
| مثال: `ancestorOf` - اگر A جد B و B جد C باشد، پس A جد C است | |
| **6. روابط بازتابی (Reflexive):** | |
| ``` | |
| ∀s ∈ E: (s,r,s) ∈ T | |
| ``` | |
| مثال: `equalTo(x, x)` - هر چیزی با خودش برابر است | |
| **7. روابط سلسلهمراتبی (Hierarchical):** | |
| - `subClassOf`: کلاس A زیرکلاس B است | |
| - `instanceOf`: x نمونهای از کلاس C است | |
| - `partOf`: A جزئی از B است | |
| #### 📝 1.2.3 سهتاییها (Triples): اتمهای دانش | |
| سهتاییها **واحدهای اتمی اطلاعات** در گراف دانش هستند. | |
| **ساختار سهتایی:** | |
| ``` | |
| Triple t = (Subject, Predicate, Object) | |
| = (s, p, o) | |
| تفسیر: "موجودیت s دارای رابطه p با موجودیت o است" | |
| ``` | |
| **مثالهای عملی:** | |
| ``` | |
| (einstein, born_in, germany) | |
| → "انیشتین در آلمان متولد شد" | |
| (einstein, developed, relativity_theory) | |
| → "انیشتین نظریه نسبیت را توسعه داد" | |
| (einstein, won, nobel_prize_1921) | |
| → "انیشتین جایزه نوبل 1921 را برد" | |
| ``` | |
| **معناشناسی سهتاییها:** | |
| **الف) معناشناسی کلاسیک (Classical Semantics):** | |
| - مقادیر دوتایی: درست یا نادرست | |
| - منطق اول مرتبه (First-Order Logic) | |
| - قوانین استنتاج دقیق | |
| **ب) معناشناسی احتمالاتی (Probabilistic Semantics):** | |
| ``` | |
| P(triple) ∈ [0, 1] | |
| ``` | |
| هر سهتایی یک نمره اطمینان دارد | |
| **ج) معناشناسی زمانی (Temporal Semantics):** | |
| ``` | |
| triple@[t_start, t_end] | |
| ``` | |
| سهتایی در بازه زمانی مشخص معتبر است | |
| **د) معناشناسی وجهی (Modal Semantics):** | |
| - ضرورت: باید درست باشد | |
| - امکان: ممکن است درست باشد | |
| - واقعیت: در دنیای واقعی درست است | |
| ### 1.3 طبقهبندی جامع گرافهای دانش | |
| #### 📖 1.3.1 گرافهای دانش دانشنامهای (Encyclopedic KGs) | |
| **ویژگیها:** | |
| - **مقیاس عظیم**: 10⁸ تا 10⁹ موجودیت و رابطه | |
| - **پوشش گسترده**: دانش چندحوزهای | |
| - **ساخت خودکار**: استخراج از منابع آنلاین | |
| **نمونههای برجسته:** | |
| **1. Wikidata:** | |
| - بیش از 100 میلیون موجودیت | |
| - بیش از 1.5 میلیارد سهتایی | |
| - 400+ زبان مختلف | |
| - جامعه ویرایشگری بزرگ | |
| **2. DBpedia:** | |
| - استخراج ساختاریافته از ویکیپدیا | |
| - 6+ میلیون موجودیت | |
| - 125 زبان مختلف | |
| - 4.58 میلیارد واقعیت | |
| **3. YAGO:** | |
| - ترکیب ویکیپدیا و WordNet | |
| - دقت بالا (95%+) | |
| - روابط زمانی و مکانی | |
| **چالشهای کیفی:** | |
| - ⚠️ تناقضهای بینزبانی | |
| - ⚠️ ناقص بودن اطلاعات | |
| - ⚠️ بهروزرسانی مداوم | |
| - ⚠️ تضمین کیفیت در مقیاس بزرگ | |
| #### 🧠 1.3.2 گرافهای دانش عمومی (Commonsense KGs) | |
| **هدف**: ثبت دانش ضمنی که انسانها بدیهی میدانند. | |
| **نمونهها:** | |
| **1. ConceptNet:** | |
| ``` | |
| (کتاب, UsedFor, خواندن) | |
| (آتش, HasProperty, گرم) | |
| (پرنده, CapableOf, پرواز) | |
| ``` | |
| **2. ATOMIC:** | |
| - رویدادهای اجتماعی | |
| - انگیزهها و احساسات | |
| - پیامدهای اعمال | |
| **3. Google Knowledge Graph:** | |
| - 500 میلیارد واقعیت | |
| - 5 میلیارد موجودیت | |
| - پشتیبانی جستجوی گوگل | |
| **کاربردها:** | |
| - ✅ درک زبان طبیعی | |
| - ✅ استدلال عقلسلیم | |
| - ✅ پاسخ به سؤالات | |
| - ✅ سیستمهای مکالمهای | |
| #### 🔬 1.3.3 گرافهای دانش علمی (Scientific KGs) | |
| **ویژگیها:** | |
| - دقت بسیار بالا | |
| - اعتبارسنجی از متخصصان | |
| - بهروزرسانی با کشفیات جدید | |
| **نمونههای حوزهای:** | |
| **1. زیستشناسی:** | |
| - Gene Ontology: 44,000+ اصطلاح | |
| - Protein Data Bank: ساختار پروتئینها | |
| - KEGG: مسیرهای متابولیک | |
| **2. شیمی:** | |
| - ChEBI: 50,000+ ترکیب شیمیایی | |
| - PubChem: 100+ میلیون ترکیب | |
| - DrugBank: اطلاعات دارویی | |
| **3. فیزیک و ریاضیات:** | |
| - ArXiv KG: مقالات علمی | |
| - MathWorld: مفاهیم ریاضی | |
| #### 🏢 1.3.4 گرافهای دانش سازمانی (Enterprise KGs) | |
| **کاربردها:** | |
| - مدیریت دانش سازمانی | |
| - یکپارچهسازی دادهها | |
| - تصمیمگیری هوشمند | |
| - پیگیری فرآیندها | |
| **مثالها:** | |
| - LinkedIn Economic Graph | |
| - Microsoft Academic Graph | |
| - Amazon Product Knowledge Graph | |
| **مزایای تجاری:** | |
| - 📈 افزایش بهرهوری | |
| - 💰 کاهش هزینهها | |
| - 🎯 تصمیمگیری بهتر | |
| - 🔄 خودکارسازی فرآیندها | |
| ### 1.4 چالشهای بنیادین در استدلال | |
| #### 🌍 1.4.1 فرض دنیای باز (Open World Assumption) | |
| **تعریف**: نبود اطلاعات به معنای نادرستی آن نیست. | |
| ``` | |
| قضیه: born_in(newton, england) | |
| سؤال: born_in(newton, france)؟ | |
| پاسخ: نمیدانیم (نه لزوماً "نادرست") | |
| ``` | |
| **تأثیر بر استدلال:** | |
| - ✗ نمیتوان از نبود سهتایی نتیجه منفی گرفت | |
| - ✓ باید برای عدم قطعیت برنامهریزی کرد | |
| - ✓ استدلال احتمالاتی ضروری است | |
| **مقایسه با پایگاه داده:** | |
| ``` | |
| Database (CWA): NOT EXISTS(record) ⟹ FALSE | |
| KG (OWA): NOT EXISTS(triple) ⟹ UNKNOWN | |
| ``` | |
| #### 📉 1.4.2 مشکل ناقص بودن (Incompleteness Problem) | |
| **قضیه نظری**: | |
| ``` | |
| |KG_actual| / |KG_complete| → 0 | |
| ``` | |
| هیچ گراف دانشی نمیتواند کامل باشد! | |
| **دلایل:** | |
| 1. **انفجار ترکیبیاتی**: n موجودیت ⟹ n² رابطه احتمالی | |
| 2. **ماهیت پویا**: دانش جدید مدام ظهور میکند | |
| 3. **ذهنیت**: دیدگاههای متعدد معتبر | |
| **تخمین ناقص بودن:** | |
| - Freebase: ~70% ناقص | |
| - DBpedia: ~66% ناقص | |
| - NELL: مدام در حال رشد | |
| **راهکارها:** | |
| - 🔧 Knowledge Graph Completion | |
| - 🔧 Link Prediction | |
| - 🔧 Entity Alignment | |
| - 🔧 Relation Extraction | |
| #### ⚡ 1.4.3 پیچیدگی محاسباتی | |
| **پیچیدگی ذخیرهسازی:** | |
| ``` | |
| Space Complexity: O(|E| + |R| + |T|) | |
| ``` | |
| **پیچیدگی پرسوجو:** | |
| ``` | |
| SPARQL Query: NP-Complete تا EXPTIME-Complete | |
| ``` | |
| **پیچیدگی استدلال:** | |
| ``` | |
| Description Logic: EXPTIME تا Undecidable | |
| ``` | |
| **استراتژیهای بهینهسازی:** | |
| - 📊 Indexing: SPO, POS, OSP | |
| - 💾 Caching: نتایج پرکاربرد | |
| - ⚙️ Query Optimization: بازنویسی کوئری | |
| - 🔄 Distributed Processing: پردازش موازی | |
| #### 🔀 1.4.4 چالشهای استدلال چندمرحلهای | |
| **مشکل انفجار مسیر:** | |
| ``` | |
| تعداد مسیرهای ممکن با طول n: O(deg^n) | |
| ``` | |
| که deg میانگین درجه گره است. | |
| **چالشها:** | |
| - **انتخاب مسیر**: کدام مسیر معنادار است؟ | |
| - **ترکیبپذیری**: چگونه الگوهای مختلف را ترکیب کنیم؟ | |
| - **توضیحپذیری**: چگونه استدلال را قابل فهم کنیم؟ | |
| **تکنیکهای حل:** | |
| 1. **محدود کردن عمق**: max_hops = 3 or 4 | |
| 2. **امتیازدهی مسیرها**: اولویتبندی مسیرهای محتمل | |
| 3. **هرس کردن**: حذف مسیرهای نامربوط | |
| 4. **یادگیری نظارتشده**: آموزش مدل برای انتخاب مسیر | |
| #### ⚖️ 1.4.5 مدیریت عدم قطعیت و تناقض | |
| **منابع عدم قطعیت:** | |
| **1. تناقض زمانی:** | |
| ``` | |
| (person, works_at, company_A) @ 2020 | |
| (person, works_at, company_B) @ 2023 | |
| ``` | |
| **2. تضاد منابع:** | |
| ``` | |
| Source_1: (entity, property, value_A) | |
| Source_2: (entity, property, value_B) | |
| ``` | |
| **3. خطای اندازهگیری:** | |
| ``` | |
| (mountain, height, 8848m) ± 0.21m | |
| ``` | |
| **4. ابهام معنایی:** | |
| ``` | |
| "Apple" → شرکت یا میوه؟ | |
| ``` | |
| **راهبردهای حل:** | |
| **الف) منطق زمانی (Temporal Logic):** | |
| ``` | |
| triple@[t_start, t_end, confidence] | |
| ``` | |
| **ب) استدلال احتمالاتی:** | |
| ``` | |
| P(triple | evidence) = ? | |
| ``` | |
| **ج) مدلسازی اعتبار منبع:** | |
| ``` | |
| trust(source) ∈ [0, 1] | |
| confidence = trust × reliability | |
| ``` | |
| **د) روشهای اجماع:** | |
| ``` | |
| final_value = aggregate([value₁, value₂, ..., valueₙ], weights) | |
| ``` | |
| ### 1.5 پارادایمهای استدلال نظری | |
| #### 🎓 1.5.1 استدلال قیاسی (Deductive Reasoning) | |
| **تعریف**: استنتاج نتایج خاص از قوانین کلی | |
| **ساختار منطقی:** | |
| ``` | |
| Premise 1 (Major): ∀x: Physicist(x) → Scientist(x) | |
| Premise 2 (Minor): Physicist(Einstein) | |
| Conclusion: Scientist(Einstein) | |
| ``` | |
| **خواص:** | |
| - ✅ **درستیمحور**: اگر مقدمات درست باشند، نتیجه حتماً درست است | |
| - ✅ **قطعی**: بدون عدم قطعیت | |
| - ✗ **ناکامل**: فقط دانش موجود را بازسازی میکند | |
| **کاربردها در KG:** | |
| - استنتاج کلاسهای موجودیت | |
| - اعمال قوانین ontology | |
| - بررسی سازگاری | |
| #### 🔍 1.5.2 استدلال استقرایی (Inductive Reasoning) | |
| **تعریف**: تعمیم از مشاهدات خاص به قوانین کلی | |
| **فرآیند:** | |
| ``` | |
| Observation 1: Physicist₁ → Nobel Prize | |
| Observation 2: Physicist₂ → Nobel Prize | |
| ... | |
| Observation n: Physicistₙ → Nobel Prize | |
| Generalization: Physicist(x) → HighProbability(Nobel(x)) | |
| ``` | |
| **خواص:** | |
| - ✓ **کشف الگو**: یافتن قوانین جدید | |
| - ✗ **احتمالی**: نتیجه قطعی نیست | |
| - ✓ **یادگیری**: تولید دانش جدید | |
| **کاربردها در KG:** | |
| - Rule Mining | |
| - Pattern Discovery | |
| - Statistical Inference | |
| #### 💡 1.5.3 استدلال ابداعی (Abductive Reasoning) | |
| **تعریف**: استنتاج بهترین توضیح برای مشاهدات | |
| **ساختار:** | |
| ``` | |
| Observation: Revolutionary_Physics | |
| Fact: Einstein → Relativity | |
| Fact: Relativity → Revolutionary_Physics | |
| Abduction: Einstein → Revolutionary_Physics (بهترین توضیح) | |
| ``` | |
| **خواص:** | |
| - ✓ **تولید فرضیه**: ایجاد توضیحات جدید | |
| - ✓ **خلاقیت**: کشف روابط غیرواضح | |
| - ✗ **چندگانگی**: توضیحات متعدد ممکن | |
| **کاربردها در KG:** | |
| - Link Prediction | |
| - Missing Fact Inference | |
| - Hypothesis Generation | |
| --- | |
| این مبانی نظری، چارچوب محکمی برای درک و پیادهسازی سیستمهای استدلال پیشرفته بر روی گرافهای دانش فراهم میکند. در بخشهای بعدی، این مفاهیم را به کد عملی تبدیل خواهیم کرد. 🚀 | |
| """, | |
| # بعد از سلول کد ساختار داده | |
| 3: """## 📐 بخش 2: معماری و ساختار داده گرافهای دانش | |
| ### 2.1 طراحی ساختار داده: تحلیل عمیق | |
| #### 🏗️ طراحی کلاس Triple | |
| کلاس `Triple` هسته اصلی نمایش دانش در گراف است. | |
| **طراحی Data Class:** | |
| ```python | |
| @dataclass | |
| class Triple: | |
| subject: str # موجودیت سوژه | |
| predicate: str # رابطه | |
| object: str # موجودیت مفعول | |
| ``` | |
| **مزایای استفاده از @dataclass:** | |
| - ✅ تولید خودکار `__init__`, `__repr__`, `__eq__` | |
| - ✅ Type hints برای type checking | |
| - ✅ کد تمیز و خوانا | |
| - ✅ کاهش boilerplate code | |
| **پیادهسازی `__hash__`:** | |
| ```python | |
| def __hash__(self): | |
| return hash((self.subject, self.predicate, self.object)) | |
| ``` | |
| **چرا hash ضروری است؟** | |
| 1. استفاده در `set()` و `dict()` keys | |
| 2. جلوگیری از تکرار triples | |
| 3. جستجوی O(1) در ساختارهای داده | |
| **مثال عملی:** | |
| ```python | |
| t1 = Triple("einstein", "born_in", "germany") | |
| t2 = Triple("einstein", "born_in", "germany") | |
| t1 == t2 # True (برابری محتوایی) | |
| {t1, t2} # {Triple(...)} فقط یک عضو (به خاطر hash) | |
| ``` | |
| #### 🎯 طراحی کلاس Entity | |
| موجودیتها بلوکهای اساسی گراف هستند. | |
| **ساختار کامل:** | |
| ```python | |
| @dataclass | |
| class Entity: | |
| id: str # شناسه یکتا | |
| name: str # نام قابل خواندن | |
| type: str = "unknown" # نوع موجودیت | |
| attributes: Dict = None # ویژگیهای اضافی | |
| ``` | |
| **Attributes dictionary:** | |
| ```python | |
| entity = Entity( | |
| id="einstein", | |
| name="Albert Einstein", | |
| type="person", | |
| attributes={ | |
| "birth_year": 1879, | |
| "death_year": 1955, | |
| "nationality": "German", | |
| "field": "Theoretical Physics" | |
| } | |
| ) | |
| ``` | |
| **الگوی `__post_init__`:** | |
| ```python | |
| def __post_init__(self): | |
| if self.attributes is None: | |
| self.attributes = {} | |
| ``` | |
| **اهمیت:** | |
| - جلوگیری از shared mutable default | |
| - اطمینان از وجود dict برای هر instance | |
| - پیشگیری از باگهای رایج پایتون | |
| #### 🔗 طراحی کلاس Relation | |
| روابط نوع ارتباطات بین موجودیتها را تعریف میکنند. | |
| **ساختار کامل:** | |
| ```python | |
| @dataclass | |
| class Relation: | |
| id: str # شناسه رابطه | |
| name: str # نام قابل فهم | |
| domain: str = "entity" # نوع دامنه (سوژه) | |
| range: str = "entity" # نوع برد (مفعول) | |
| inverse: str = None # رابطه معکوس | |
| ``` | |
| **مثال با محدودیت domain/range:** | |
| ```python | |
| born_in = Relation( | |
| id="born_in", | |
| name="was born in", | |
| domain="person", # فقط اشخاص | |
| range="location", # فقط مکانها | |
| inverse="birth_place_of" | |
| ) | |
| ``` | |
| **کاربردها:** | |
| - اعتبارسنجی triples | |
| - استنتاج روابط معکوس | |
| - بهینهسازی جستجو | |
| ### 2.2 کلاس KnowledgeGraph: قلب سیستم | |
| #### 🧠 معماری داخلی | |
| **ساختارهای داده چندگانه:** | |
| ```python | |
| class KnowledgeGraph: | |
| self.entities = {} # O(1) lookup | |
| self.relations = {} # O(1) lookup | |
| self.triples = set() # O(1) membership | |
| self.adjacency = defaultdict(lambda: defaultdict(set)) | |
| self.reverse_adjacency = defaultdict(lambda: defaultdict(set)) | |
| ``` | |
| **چرا چندین ساختار داده؟** | |
| **1. `entities` dictionary:** | |
| ```python | |
| entity_id → Entity object | |
| ``` | |
| - دسترسی سریع به اطلاعات موجودیت | |
| - O(1) time complexity | |
| **2. `triples` set:** | |
| ```python | |
| {Triple(s1, p1, o1), Triple(s2, p2, o2), ...} | |
| ``` | |
| - جلوگیری از تکرار | |
| - عضویت O(1) | |
| **3. `adjacency` nested dict:** | |
| ```python | |
| { | |
| 'einstein': { | |
| 'born_in': {'germany'}, | |
| 'developed': {'relativity'}, | |
| 'won': {'nobel_prize'} | |
| } | |
| } | |
| ``` | |
| - جستجوی همسایگان: O(1) | |
| - پیمایش گراف کارآمد | |
| **4. `reverse_adjacency`:** | |
| ```python | |
| { | |
| 'germany': { | |
| 'born_in': {'einstein', 'planck', ...} | |
| } | |
| } | |
| ``` | |
| - پرسوجوهای معکوس | |
| - پیدا کردن سوژهها بر اساس مفعول | |
| #### ⚙️ عملیات اصلی | |
| **1. add_entity: افزودن موجودیت** | |
| ```python | |
| def add_entity(self, entity_id, name, entity_type="unknown", attributes=None): | |
| entity = Entity(entity_id, name, entity_type, attributes or {}) | |
| self.entities[entity_id] = entity | |
| self.stats['num_entities'] = len(self.entities) | |
| return entity | |
| ``` | |
| **ویژگیها:** | |
| - ایجاد خودکار Entity object | |
| - بهروزرسانی آمار | |
| - بازگشت entity برای chaining | |
| **2. add_triple: قلب گراف** | |
| ```python | |
| def add_triple(self, subject, predicate, object): | |
| triple = Triple(subject, predicate, object) | |
| if triple not in self.triples: | |
| self.triples.add(triple) | |
| # بهروزرسانی adjacency | |
| self.adjacency[subject][predicate].add(object) | |
| self.reverse_adjacency[object][predicate].add(subject) | |
| # Auto-create entities | |
| if subject not in self.entities: | |
| self.add_entity(subject, subject) | |
| if object not in self.entities: | |
| self.add_entity(object, object) | |
| ``` | |
| **ویژگیهای پیشرفته:** | |
| - ✅ جلوگیری از تکرار با set membership check | |
| - ✅ بهروزرسانی خودکار adjacency lists | |
| - ✅ ایجاد خودکار موجودیتهای گمشده | |
| - ✅ حفظ سازگاری ساختارهای داده | |
| **3. get_neighbors: پیمایش گراف** | |
| ```python | |
| def get_neighbors(self, entity_id, relation=None): | |
| if relation: | |
| return self.adjacency[entity_id].get(relation, set()) | |
| else: | |
| neighbors = set() | |
| for rel_neighbors in self.adjacency[entity_id].values(): | |
| neighbors.update(rel_neighbors) | |
| return neighbors | |
| ``` | |
| **کاربردها:** | |
| - پیمایش BFS/DFS | |
| - پیدا کردن مسیرها | |
| - محاسبه مرکزیت | |
| **4. query_triples: سیستم پرسوجو** | |
| ```python | |
| def query_triples(self, subject=None, predicate=None, object=None): | |
| result = [] | |
| for triple in self.triples: | |
| if (subject is None or triple.subject == subject) and \ | |
| (predicate is None or triple.predicate == predicate) and \ | |
| (object is None or triple.object == object): | |
| result.append(triple) | |
| return result | |
| ``` | |
| **الگوهای پرسوجو:** | |
| ```python | |
| # پیدا کردن همه کسانی که در آلمان متولد شدهاند | |
| query_triples(predicate="born_in", object="germany") | |
| # پیدا کردن همه کارهای انیشتین | |
| query_triples(subject="einstein") | |
| # پیدا کردن همه روابط "developed" | |
| query_triples(predicate="developed") | |
| ``` | |
| ### 2.3 ویژگیهای پیشرفته | |
| #### 🎨 تجسمسازی گراف | |
| **یکپارچهسازی با NetworkX:** | |
| ```python | |
| def visualize(self, max_entities=20, layout="spring"): | |
| G = nx.Graph() | |
| # اضافه کردن گرهها | |
| for entity_id in entities_to_show: | |
| entity = self.entities[entity_id] | |
| G.add_node(entity_id, label=entity.name, type=entity.type) | |
| # اضافه کردن یالها | |
| for triple in self.triples: | |
| if valid_triple: | |
| G.add_edge(triple.subject, triple.object) | |
| edge_labels[(s, o)].append(triple.predicate) | |
| ``` | |
| **الگوریتمهای layout:** | |
| - **Spring Layout**: شبیهسازی نیروی فیزیکی | |
| - **Circular Layout**: چیدمان دایرهای | |
| - **Hierarchical Layout**: سلسلهمراتبی | |
| - **Kamada-Kawai**: بهینهسازی فاصله | |
| #### 📊 آمارگیری و تحلیل | |
| **محاسبه آمار:** | |
| ```python | |
| def print_stats(self): | |
| # توزیع انواع موجودیت | |
| type_counts = defaultdict(int) | |
| for entity in self.entities.values(): | |
| type_counts[entity.type] += 1 | |
| # توزیع روابط | |
| relation_counts = defaultdict(int) | |
| for triple in self.triples: | |
| relation_counts[triple.predicate] += 1 | |
| ``` | |
| **معیارهای مهم:** | |
| - تعداد موجودیتها، روابط، سهتاییها | |
| - توزیع انواع | |
| - متوسط درجه گرهها | |
| - چگالی گراف | |
| #### 🔍 استخراج زیرگراف | |
| ```python | |
| def get_subgraph(self, entities, max_hops=1): | |
| subgraph = KnowledgeGraph(f"{self.name}_subgraph") | |
| # گسترش با BFS | |
| included_entities = set(entities) | |
| for hop in range(max_hops): | |
| new_entities = set() | |
| for entity in included_entities: | |
| neighbors = self.get_neighbors(entity) | |
| new_entities.update(neighbors) | |
| included_entities.update(new_entities) | |
| # کپی موجودیتها و triples | |
| # ... | |
| return subgraph | |
| ``` | |
| **کاربردها:** | |
| - تحلیل محلی | |
| - Focused reasoning | |
| - تجسمسازی مقیاسپذیر | |
| این معماری ساختاریافته، پایهای قدرتمند برای الگوریتمهای پیچیده استدلال فراهم میکند. 🏗️ | |
| """, | |
| } | |
| # افزودن markdown ها به جاهای مناسب | |
| new_cells = [] | |
| for i, cell in enumerate(notebook["cells"]): | |
| new_cells.append(cell) | |
| if i in fa_markdowns: | |
| # ایجاد سلول markdown جدید | |
| new_markdown_cell = { | |
| "cell_type": "markdown", | |
| "id": f"fa_markdown_{i}", | |
| "metadata": {}, | |
| "source": fa_markdowns[i].split("\n"), | |
| } | |
| new_cells.append(new_markdown_cell) | |
| notebook["cells"] = new_cells | |
| # ذخیره نوتبوک جدید | |
| with open("CA10_enhanced.ipynb", "w", encoding="utf-8") as f: | |
| json.dump(notebook, f, ensure_ascii=False, indent=2) | |
| print("✅ Markdown های فارسی با موفقیت اضافه شدند!") | |
| print(f"📁 فایل خروجی: CA10_enhanced.ipynb") | |
| print(f"📊 تعداد سلولهای جدید: {len(new_cells)}") | |
Xet Storage Details
- Size:
- 26.9 kB
- Xet hash:
- 6a8f0998df5aa6d607df34c2120b074fe9cb99e1af94028f72687d639bed1e29
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.