tahamajs's picture
download
raw
26.9 kB
#!/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.