ninmeni 0.1.0a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. ninmeni-0.1.0a1/LICENSE +21 -0
  2. ninmeni-0.1.0a1/MANIFEST.in +5 -0
  3. ninmeni-0.1.0a1/PKG-INFO +235 -0
  4. ninmeni-0.1.0a1/README.md +202 -0
  5. ninmeni-0.1.0a1/ninmeni/__init__.py +48 -0
  6. ninmeni-0.1.0a1/ninmeni/__main__.py +7 -0
  7. ninmeni-0.1.0a1/ninmeni/base/__init__.py +5 -0
  8. ninmeni-0.1.0a1/ninmeni/base/head.py +69 -0
  9. ninmeni-0.1.0a1/ninmeni/base/state.py +302 -0
  10. ninmeni-0.1.0a1/ninmeni/cli.py +1416 -0
  11. ninmeni-0.1.0a1/ninmeni/config.py +266 -0
  12. ninmeni-0.1.0a1/ninmeni/core/__init__.py +15 -0
  13. ninmeni-0.1.0a1/ninmeni/core/bsu.py +163 -0
  14. ninmeni-0.1.0a1/ninmeni/core/correctness.py +285 -0
  15. ninmeni-0.1.0a1/ninmeni/core/expression.py +247 -0
  16. ninmeni-0.1.0a1/ninmeni/core/gos.py +583 -0
  17. ninmeni-0.1.0a1/ninmeni/core/meb.py +440 -0
  18. ninmeni-0.1.0a1/ninmeni/core/model.py +602 -0
  19. ninmeni-0.1.0a1/ninmeni/data/__init__.py +28 -0
  20. ninmeni-0.1.0a1/ninmeni/data/augmentor.py +563 -0
  21. ninmeni-0.1.0a1/ninmeni/data/corpus_builder.py +422 -0
  22. ninmeni-0.1.0a1/ninmeni/data/dataset.py +406 -0
  23. ninmeni-0.1.0a1/ninmeni/data/linguistic_sample.py +291 -0
  24. ninmeni-0.1.0a1/ninmeni/data/morph_cache.py +363 -0
  25. ninmeni-0.1.0a1/ninmeni/data/pipeline.py +569 -0
  26. ninmeni-0.1.0a1/ninmeni/data/tokenizer.py +219 -0
  27. ninmeni-0.1.0a1/ninmeni/data/validator.py +616 -0
  28. ninmeni-0.1.0a1/ninmeni/eval/__init__.py +5 -0
  29. ninmeni-0.1.0a1/ninmeni/eval/metrics.py +429 -0
  30. ninmeni-0.1.0a1/ninmeni/framework.py +367 -0
  31. ninmeni-0.1.0a1/ninmeni/heads/__init__.py +23 -0
  32. ninmeni-0.1.0a1/ninmeni/heads/correctness.py +392 -0
  33. ninmeni-0.1.0a1/ninmeni/linguistic/__init__.py +21 -0
  34. ninmeni-0.1.0a1/ninmeni/linguistic/lps.py +843 -0
  35. ninmeni-0.1.0a1/ninmeni/linguistic/lsk.py +641 -0
  36. ninmeni-0.1.0a1/ninmeni/linguistic/vocab_policy.py +756 -0
  37. ninmeni-0.1.0a1/ninmeni/primitives/__init__.py +1 -0
  38. ninmeni-0.1.0a1/ninmeni/primitives/cmc/__init__.py +6 -0
  39. ninmeni-0.1.0a1/ninmeni/primitives/cmc/category.py +428 -0
  40. ninmeni-0.1.0a1/ninmeni/primitives/cmc/composer.py +152 -0
  41. ninmeni-0.1.0a1/ninmeni/primitives/cmc/morphism.py +179 -0
  42. ninmeni-0.1.0a1/ninmeni/primitives/cpe/__init__.py +6 -0
  43. ninmeni-0.1.0a1/ninmeni/primitives/cpe/constraint.py +474 -0
  44. ninmeni-0.1.0a1/ninmeni/primitives/cpe/convergence.py +69 -0
  45. ninmeni-0.1.0a1/ninmeni/primitives/cpe/engine.py +648 -0
  46. ninmeni-0.1.0a1/ninmeni/primitives/krl/__init__.py +22 -0
  47. ninmeni-0.1.0a1/ninmeni/primitives/krl/encoder.py +262 -0
  48. ninmeni-0.1.0a1/ninmeni/primitives/krl/frame.py +488 -0
  49. ninmeni-0.1.0a1/ninmeni/primitives/krl/inference.py +305 -0
  50. ninmeni-0.1.0a1/ninmeni/primitives/krl/kb.py +488 -0
  51. ninmeni-0.1.0a1/ninmeni/primitives/krl/layer.py +270 -0
  52. ninmeni-0.1.0a1/ninmeni/primitives/krl/matcher.py +170 -0
  53. ninmeni-0.1.0a1/ninmeni/primitives/krl/proposition.py +205 -0
  54. ninmeni-0.1.0a1/ninmeni/primitives/krl/resolver.py +194 -0
  55. ninmeni-0.1.0a1/ninmeni/primitives/lps/__init__.py +6 -0
  56. ninmeni-0.1.0a1/ninmeni/primitives/lps/afiks.py +456 -0
  57. ninmeni-0.1.0a1/ninmeni/primitives/lps/morfem.py +120 -0
  58. ninmeni-0.1.0a1/ninmeni/primitives/lps/parser.py +610 -0
  59. ninmeni-0.1.0a1/ninmeni/primitives/sfm/__init__.py +6 -0
  60. ninmeni-0.1.0a1/ninmeni/primitives/sfm/geodesic.py +220 -0
  61. ninmeni-0.1.0a1/ninmeni/primitives/sfm/lexicon.py +443 -0
  62. ninmeni-0.1.0a1/ninmeni/primitives/sfm/manifold.py +337 -0
  63. ninmeni-0.1.0a1/ninmeni/primitives/tda/__init__.py +6 -0
  64. ninmeni-0.1.0a1/ninmeni/primitives/tda/analyzer.py +232 -0
  65. ninmeni-0.1.0a1/ninmeni/primitives/tda/homology.py +189 -0
  66. ninmeni-0.1.0a1/ninmeni/primitives/tda/simplex.py +191 -0
  67. ninmeni-0.1.0a1/ninmeni/training/__init__.py +11 -0
  68. ninmeni-0.1.0a1/ninmeni/training/balanced_trainer.py +658 -0
  69. ninmeni-0.1.0a1/ninmeni/training/correctness_trainer.py +288 -0
  70. ninmeni-0.1.0a1/ninmeni/training/expression_trainer.py +406 -0
  71. ninmeni-0.1.0a1/ninmeni/training/loss.py +112 -0
  72. ninmeni-0.1.0a1/ninmeni/training/objective.py +175 -0
  73. ninmeni-0.1.0a1/ninmeni/training/pd.py +290 -0
  74. ninmeni-0.1.0a1/ninmeni/utils/__init__.py +17 -0
  75. ninmeni-0.1.0a1/ninmeni/utils/indo_metrics.py +694 -0
  76. ninmeni-0.1.0a1/ninmeni/utils/metrics.py +189 -0
  77. ninmeni-0.1.0a1/ninmeni/utils/trainer.py +317 -0
  78. ninmeni-0.1.0a1/ninmeni.egg-info/PKG-INFO +235 -0
  79. ninmeni-0.1.0a1/ninmeni.egg-info/SOURCES.txt +98 -0
  80. ninmeni-0.1.0a1/ninmeni.egg-info/dependency_links.txt +1 -0
  81. ninmeni-0.1.0a1/ninmeni.egg-info/entry_points.txt +2 -0
  82. ninmeni-0.1.0a1/ninmeni.egg-info/requires.txt +7 -0
  83. ninmeni-0.1.0a1/ninmeni.egg-info/top_level.txt +1 -0
  84. ninmeni-0.1.0a1/pyproject.toml +49 -0
  85. ninmeni-0.1.0a1/requirements.txt +4 -0
  86. ninmeni-0.1.0a1/setup.cfg +4 -0
  87. ninmeni-0.1.0a1/setup.py +37 -0
  88. ninmeni-0.1.0a1/tests/test_bsu.py +100 -0
  89. ninmeni-0.1.0a1/tests/test_data_pipeline.py +599 -0
  90. ninmeni-0.1.0a1/tests/test_dataset_validator.py +561 -0
  91. ninmeni-0.1.0a1/tests/test_express_integration.py +202 -0
  92. ninmeni-0.1.0a1/tests/test_expression.py +181 -0
  93. ninmeni-0.1.0a1/tests/test_framework_consistency.py +690 -0
  94. ninmeni-0.1.0a1/tests/test_full_model.py +232 -0
  95. ninmeni-0.1.0a1/tests/test_indo_metrics.py +481 -0
  96. ninmeni-0.1.0a1/tests/test_linguistic_engine.py +432 -0
  97. ninmeni-0.1.0a1/tests/test_lps.py +323 -0
  98. ninmeni-0.1.0a1/tests/test_meb.py +158 -0
  99. ninmeni-0.1.0a1/tests/test_native_framework_audit.py +1003 -0
  100. ninmeni-0.1.0a1/tests/test_vocab_policy.py +558 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Emylton Leunufna
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ include README.md
2
+ include LICENSE
3
+ include requirements.txt
4
+ recursive-include ninmeni *.py
5
+ recursive-exclude ninmeni __pycache__
@@ -0,0 +1,235 @@
1
+ Metadata-Version: 2.4
2
+ Name: ninmeni
3
+ Version: 0.1.0a1
4
+ Summary: NINMENI - Adaptive Knowledge & Semantic Architecture for Bahasa Representation & Autonomy
5
+ Author: Emylton Leunufna
6
+ Author-email: Emylton Leunufna <emylton@leunufna.dev>
7
+ License: MIT
8
+ Keywords: nlp,indonesian,bahasa,linguistics,semantic,morphology
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Intended Audience :: Science/Research
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Natural Language :: Indonesian
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
+ Classifier: Topic :: Text Processing :: Linguistic
21
+ Requires-Python: >=3.9
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: torch>=2.0.0
25
+ Requires-Dist: numpy>=1.24.0
26
+ Provides-Extra: dev
27
+ Requires-Dist: pytest>=7.0; extra == "dev"
28
+ Requires-Dist: pytest-cov; extra == "dev"
29
+ Requires-Dist: pyyaml>=6.0; extra == "dev"
30
+ Dynamic: author
31
+ Dynamic: license-file
32
+ Dynamic: requires-python
33
+
34
+ # NINMENI
35
+
36
+ > **Status:** Alpha Release (v0.1.0-alpha) — Framework siap untuk riset dan analisis. Generasi kalimat masih dalam training.
37
+
38
+ **Adaptive Knowledge & Semantic Architecture for Bahasa Representation & Autonomy**
39
+
40
+ > *"Kami tidak mengajarkan model bahasa Indonesia. Kami membuat model lahir sebagai bahasa Indonesia."*
41
+ >
42
+ > — Emylton Leunufna
43
+
44
+ ---
45
+
46
+ ## Apa itu NINMENI?
47
+
48
+ NINMENI adalah **framework linguistik deterministik** untuk bahasa Indonesia. Bukan model bahasa, bukan fine-tuned Transformer — ini adalah pipeline yang menganalisis, memvalidasi, dan **memahami** kalimat bahasa Indonesia dari prinsip linguistik pertama.
49
+
50
+ NINMENI menghasilkan `NinmeniState` — representasi linguistik lengkap yang bisa dikonsumsi oleh **head apapun** yang developer definisikan sendiri.
51
+
52
+ ---
53
+
54
+ ## Pipeline — Enam Primitif
55
+
56
+ ```
57
+ Kalimat (string)
58
+ ↓
59
+ [ LPS ] Linguistic Parse System → dekomposisi morfem deterministik (TBBBI)
60
+ ↓
61
+ [ SFM ] Semantic Field Manifold → representasi semantik Riemannian dari KBBI
62
+ ↓
63
+ [ CPE ] Constraint Propagation Engine → evaluasi constraint linguistik, hitung energi
64
+ ↓
65
+ [ CMC ] Categorical Meaning Composer → verifikasi komposisi makna via category theory
66
+ ↓
67
+ [ TDA ] Topological Dependency Analyzer→ deteksi anomali topologis multi-skala
68
+ ↓
69
+ [ KRL ] Knowledge Representation Layer → proposisi + frame semantik + resolusi referensi
70
+ ↓
71
+ [ NinmeniState ] → output lengkap: energi, pelanggaran, skor, KRL
72
+ ```
73
+
74
+ ---
75
+
76
+ ## Oposisi terhadap Transformer
77
+
78
+ | Aspek | Transformer | NINMENI |
79
+ |---|---|---|
80
+ | Unit dasar | Subword token (statistik) | Morfem + root + afiks (linguistik) |
81
+ | Representasi | Dense embedding Euclidean | Riemannian manifold (SFM) |
82
+ | Mekanisme inti | Self-attention O(n²) | Constraint propagation O(n·d) |
83
+ | Semantic grounding | Tidak ada (distribusional) | KBBI 71K kata, 10 domain |
84
+ | "Pemahaman" | Hidden state tidak interpretable | Proposisi eksplisit + frame semantik |
85
+ | Referensi | Attention weight tidak transparan | Aturan kompatibilitas + recency |
86
+ | Pelanggaran | Tidak bisa dijelaskan | Tercatat beserta lokasi dan penjelasan |
87
+
88
+ ---
89
+
90
+ ## Cara Pakai
91
+
92
+ ```python
93
+ from ninmeni import NinmeniFramework
94
+
95
+ fw = NinmeniFramework.dari_kbbi("kbbi_core_v2.json")
96
+
97
+ # Proses kalimat
98
+ state = fw.proses("Hakim menjatuhkan hukuman kepada terdakwa.")
99
+
100
+ # Skor linguistik
101
+ print(state.skor_linguistik) # 0.72
102
+
103
+ # Pelanggaran + lokasi
104
+ for span in state.violation_spans:
105
+ print(span)
106
+
107
+ # KRL — pemahaman semantik
108
+ krl = state.krl_result
109
+ print(krl.proposisi) # JATUH(agen=Hakim, pasien=hukuman, penerima=terdakwa)
110
+ print(krl.frame_nama) # "HUKUM_PIDANA"
111
+ print(krl.jelaskan()) # Penjelasan bahasa Indonesia lengkap
112
+ ```
113
+
114
+ ---
115
+
116
+ ## KRL — Knowledge Representation Layer
117
+
118
+ KRL adalah Primitif ke-6 yang menjembatani gap antara **validasi linguistik** dan **pemahaman makna**:
119
+
120
+ - **PropositionalEncoder** — kalimat → `AKSI(agen=X, pasien=Y, lokasi=Z)`
121
+ - **FrameBank** — 12 frame semantik inti Indonesia (JUAL_BELI, HUKUM_PIDANA, KESEHATAN, dst.)
122
+ - **FrameMatcher** — cocokkan proposisi ke frame terbaik (deterministik, bukan similarity embedding)
123
+ - **ReferenceResolver** — "Dia" → anteseden persona terakhir dalam wacana
124
+
125
+ ---
126
+
127
+ ## Struktur Proyek
128
+
129
+ ```
130
+ ninmeni/
131
+ primitives/
132
+ lps/ ← Linguistic Parse System
133
+ sfm/ ← Semantic Field Manifold
134
+ cpe/ ← Constraint Propagation Engine
135
+ cmc/ ← Categorical Meaning Composer
136
+ tda/ ← Topological Dependency Analyzer
137
+ krl/ ← Knowledge Representation Layer
138
+ base/
139
+ state.py ← NinmeniState (output pipeline)
140
+ head.py ← NinmeniHead (base class untuk custom head)
141
+ heads/
142
+ correctness.py ← CorrectnessEvaluatorHead + LearnedCorrectnessHead
143
+ config.py ← NinmeniConfig (domain-specific configuration)
144
+ framework.py ← NinmeniFramework (orkestrator utama)
145
+ ```
146
+
147
+ ---
148
+
149
+ ## Test Suite
150
+
151
+ ```bash
152
+ # Semua test suite harus PASS sebelum deploy
153
+ py -3.11 tools/framework_diagnostic.py # 6/6 PASS
154
+ py -3.11 tools/_test_integrasi.py # PASS
155
+ py -3.11 tools/test_jalur_b.py # 6/6 PASS
156
+ py -3.11 tools/test_krl.py # 5/5 PASS
157
+ ```
158
+
159
+ ---
160
+
161
+ ## Domain yang Didukung
162
+
163
+ ```python
164
+ from ninmeni import NinmeniFramework, NinmeniConfig
165
+
166
+ # Domain hukum
167
+ fw = NinmeniFramework.dari_kbbi("kbbi_core_v2.json",
168
+ config=NinmeniConfig.untuk_domain("hukum"))
169
+
170
+ # Domain: hukum | kesehatan | militer | pertanahan | pendidikan | bisnis
171
+ ```
172
+
173
+ ---
174
+
175
+ ## Instalasi
176
+
177
+ ### Dari PyPI (direkomendasikan):
178
+
179
+ ```bash
180
+ pip install ninmeni
181
+ ```
182
+
183
+ ### Dari source:
184
+
185
+ ```bash
186
+ git clone https://github.com/rafaelsistems/ninmeni.git
187
+ cd ninmeni
188
+ pip install -e .
189
+ ```
190
+
191
+ ### Requirements:
192
+
193
+ - Python 3.9+
194
+ - PyTorch 2.0+
195
+ - NumPy 1.24+
196
+
197
+ ---
198
+
199
+ ## Quick Start
200
+
201
+ ```python
202
+ from ninmeni.core.model import NinmeniModel, NinmeniConfig
203
+ from ninmeni.linguistic.lps import build_root_vocab
204
+
205
+ # Build vocab dari corpus
206
+ corpus = ["petani menanam padi di sawah", "ibu memasak nasi di dapur"]
207
+ vocab = build_root_vocab(corpus, min_freq=1)
208
+
209
+ # Buat model
210
+ config = NinmeniConfig()
211
+ model = NinmeniModel(config, vocab)
212
+
213
+ # Evaluasi kebenaran kalimat
214
+ scores = model.score(["petani menanam padi di sawah"])
215
+ print(f"Skor kebenaran: {scores['total']}")
216
+ ```
217
+
218
+ ---
219
+
220
+ ## Data
221
+
222
+ - **KBBI:** `kbbi_core_v2.json` — 71,211 kata, 10 domain semantik (tidak termasuk di package)
223
+ - **Python:** 3.9+, PyTorch 2.0+
224
+
225
+ ---
226
+
227
+ ## Penulis
228
+
229
+ Emylton Leunufna
230
+
231
+ ---
232
+
233
+ ## Lisensi
234
+
235
+ MIT
@@ -0,0 +1,202 @@
1
+ # NINMENI
2
+
3
+ > **Status:** Alpha Release (v0.1.0-alpha) — Framework siap untuk riset dan analisis. Generasi kalimat masih dalam training.
4
+
5
+ **Adaptive Knowledge & Semantic Architecture for Bahasa Representation & Autonomy**
6
+
7
+ > *"Kami tidak mengajarkan model bahasa Indonesia. Kami membuat model lahir sebagai bahasa Indonesia."*
8
+ >
9
+ > — Emylton Leunufna
10
+
11
+ ---
12
+
13
+ ## Apa itu NINMENI?
14
+
15
+ NINMENI adalah **framework linguistik deterministik** untuk bahasa Indonesia. Bukan model bahasa, bukan fine-tuned Transformer — ini adalah pipeline yang menganalisis, memvalidasi, dan **memahami** kalimat bahasa Indonesia dari prinsip linguistik pertama.
16
+
17
+ NINMENI menghasilkan `NinmeniState` — representasi linguistik lengkap yang bisa dikonsumsi oleh **head apapun** yang developer definisikan sendiri.
18
+
19
+ ---
20
+
21
+ ## Pipeline — Enam Primitif
22
+
23
+ ```
24
+ Kalimat (string)
25
+ ↓
26
+ [ LPS ] Linguistic Parse System → dekomposisi morfem deterministik (TBBBI)
27
+ ↓
28
+ [ SFM ] Semantic Field Manifold → representasi semantik Riemannian dari KBBI
29
+ ↓
30
+ [ CPE ] Constraint Propagation Engine → evaluasi constraint linguistik, hitung energi
31
+ ↓
32
+ [ CMC ] Categorical Meaning Composer → verifikasi komposisi makna via category theory
33
+ ↓
34
+ [ TDA ] Topological Dependency Analyzer→ deteksi anomali topologis multi-skala
35
+ ↓
36
+ [ KRL ] Knowledge Representation Layer → proposisi + frame semantik + resolusi referensi
37
+ ↓
38
+ [ NinmeniState ] → output lengkap: energi, pelanggaran, skor, KRL
39
+ ```
40
+
41
+ ---
42
+
43
+ ## Oposisi terhadap Transformer
44
+
45
+ | Aspek | Transformer | NINMENI |
46
+ |---|---|---|
47
+ | Unit dasar | Subword token (statistik) | Morfem + root + afiks (linguistik) |
48
+ | Representasi | Dense embedding Euclidean | Riemannian manifold (SFM) |
49
+ | Mekanisme inti | Self-attention O(n²) | Constraint propagation O(n·d) |
50
+ | Semantic grounding | Tidak ada (distribusional) | KBBI 71K kata, 10 domain |
51
+ | "Pemahaman" | Hidden state tidak interpretable | Proposisi eksplisit + frame semantik |
52
+ | Referensi | Attention weight tidak transparan | Aturan kompatibilitas + recency |
53
+ | Pelanggaran | Tidak bisa dijelaskan | Tercatat beserta lokasi dan penjelasan |
54
+
55
+ ---
56
+
57
+ ## Cara Pakai
58
+
59
+ ```python
60
+ from ninmeni import NinmeniFramework
61
+
62
+ fw = NinmeniFramework.dari_kbbi("kbbi_core_v2.json")
63
+
64
+ # Proses kalimat
65
+ state = fw.proses("Hakim menjatuhkan hukuman kepada terdakwa.")
66
+
67
+ # Skor linguistik
68
+ print(state.skor_linguistik) # 0.72
69
+
70
+ # Pelanggaran + lokasi
71
+ for span in state.violation_spans:
72
+ print(span)
73
+
74
+ # KRL — pemahaman semantik
75
+ krl = state.krl_result
76
+ print(krl.proposisi) # JATUH(agen=Hakim, pasien=hukuman, penerima=terdakwa)
77
+ print(krl.frame_nama) # "HUKUM_PIDANA"
78
+ print(krl.jelaskan()) # Penjelasan bahasa Indonesia lengkap
79
+ ```
80
+
81
+ ---
82
+
83
+ ## KRL — Knowledge Representation Layer
84
+
85
+ KRL adalah Primitif ke-6 yang menjembatani gap antara **validasi linguistik** dan **pemahaman makna**:
86
+
87
+ - **PropositionalEncoder** — kalimat → `AKSI(agen=X, pasien=Y, lokasi=Z)`
88
+ - **FrameBank** — 12 frame semantik inti Indonesia (JUAL_BELI, HUKUM_PIDANA, KESEHATAN, dst.)
89
+ - **FrameMatcher** — cocokkan proposisi ke frame terbaik (deterministik, bukan similarity embedding)
90
+ - **ReferenceResolver** — "Dia" → anteseden persona terakhir dalam wacana
91
+
92
+ ---
93
+
94
+ ## Struktur Proyek
95
+
96
+ ```
97
+ ninmeni/
98
+ primitives/
99
+ lps/ ← Linguistic Parse System
100
+ sfm/ ← Semantic Field Manifold
101
+ cpe/ ← Constraint Propagation Engine
102
+ cmc/ ← Categorical Meaning Composer
103
+ tda/ ← Topological Dependency Analyzer
104
+ krl/ ← Knowledge Representation Layer
105
+ base/
106
+ state.py ← NinmeniState (output pipeline)
107
+ head.py ← NinmeniHead (base class untuk custom head)
108
+ heads/
109
+ correctness.py ← CorrectnessEvaluatorHead + LearnedCorrectnessHead
110
+ config.py ← NinmeniConfig (domain-specific configuration)
111
+ framework.py ← NinmeniFramework (orkestrator utama)
112
+ ```
113
+
114
+ ---
115
+
116
+ ## Test Suite
117
+
118
+ ```bash
119
+ # Semua test suite harus PASS sebelum deploy
120
+ py -3.11 tools/framework_diagnostic.py # 6/6 PASS
121
+ py -3.11 tools/_test_integrasi.py # PASS
122
+ py -3.11 tools/test_jalur_b.py # 6/6 PASS
123
+ py -3.11 tools/test_krl.py # 5/5 PASS
124
+ ```
125
+
126
+ ---
127
+
128
+ ## Domain yang Didukung
129
+
130
+ ```python
131
+ from ninmeni import NinmeniFramework, NinmeniConfig
132
+
133
+ # Domain hukum
134
+ fw = NinmeniFramework.dari_kbbi("kbbi_core_v2.json",
135
+ config=NinmeniConfig.untuk_domain("hukum"))
136
+
137
+ # Domain: hukum | kesehatan | militer | pertanahan | pendidikan | bisnis
138
+ ```
139
+
140
+ ---
141
+
142
+ ## Instalasi
143
+
144
+ ### Dari PyPI (direkomendasikan):
145
+
146
+ ```bash
147
+ pip install ninmeni
148
+ ```
149
+
150
+ ### Dari source:
151
+
152
+ ```bash
153
+ git clone https://github.com/rafaelsistems/ninmeni.git
154
+ cd ninmeni
155
+ pip install -e .
156
+ ```
157
+
158
+ ### Requirements:
159
+
160
+ - Python 3.9+
161
+ - PyTorch 2.0+
162
+ - NumPy 1.24+
163
+
164
+ ---
165
+
166
+ ## Quick Start
167
+
168
+ ```python
169
+ from ninmeni.core.model import NinmeniModel, NinmeniConfig
170
+ from ninmeni.linguistic.lps import build_root_vocab
171
+
172
+ # Build vocab dari corpus
173
+ corpus = ["petani menanam padi di sawah", "ibu memasak nasi di dapur"]
174
+ vocab = build_root_vocab(corpus, min_freq=1)
175
+
176
+ # Buat model
177
+ config = NinmeniConfig()
178
+ model = NinmeniModel(config, vocab)
179
+
180
+ # Evaluasi kebenaran kalimat
181
+ scores = model.score(["petani menanam padi di sawah"])
182
+ print(f"Skor kebenaran: {scores['total']}")
183
+ ```
184
+
185
+ ---
186
+
187
+ ## Data
188
+
189
+ - **KBBI:** `kbbi_core_v2.json` — 71,211 kata, 10 domain semantik (tidak termasuk di package)
190
+ - **Python:** 3.9+, PyTorch 2.0+
191
+
192
+ ---
193
+
194
+ ## Penulis
195
+
196
+ Emylton Leunufna
197
+
198
+ ---
199
+
200
+ ## Lisensi
201
+
202
+ MIT
@@ -0,0 +1,48 @@
1
+ """
2
+ NINMENI — Framework linguistik native untuk bahasa Indonesia.
3
+ Adaptive Knowledge & Semantic Architecture for Representation & Autonomy
4
+
5
+ Author: Emylton Leunufna
6
+
7
+ API Utama (framework baru):
8
+ from ninmeni import NinmeniFramework
9
+ fw = NinmeniFramework.dari_kbbi("kbbi_core_v2.json")
10
+ state = fw.proses("Makanan tradisional khas Dompu sangat lezat.")
11
+
12
+ Lima Primitif:
13
+ ninmeni.primitives.lps — Linguistic Parse System
14
+ ninmeni.primitives.sfm — Semantic Field Manifold
15
+ ninmeni.primitives.cpe — Constraint Propagation Engine
16
+ ninmeni.primitives.cmc — Categorical Meaning Composer
17
+ ninmeni.primitives.tda — Topological Dependency Analyzer
18
+ """
19
+
20
+ from ninmeni.framework import NinmeniFramework
21
+ from ninmeni.config import NinmeniConfig
22
+ from ninmeni.base.state import NinmeniState, MorfemState, PelanggaranConstraint
23
+ from ninmeni.base.head import NinmeniHead
24
+
25
+ from ninmeni.primitives.lps import LPSParser, Morfem, KelasKata, PeranGramatikal
26
+ from ninmeni.primitives.sfm import SemanticManifold, LexiconLoader
27
+ from ninmeni.primitives.cpe import CPEngine
28
+ from ninmeni.primitives.cmc import CMComposer
29
+ from ninmeni.primitives.tda import TDAnalyzer
30
+ from ninmeni.primitives.krl import KRLayer, KRLResult, Proposisi, Frame, FrameBank
31
+
32
+ __version__ = "1.0.0"
33
+ __author__ = "Emylton Leunufna"
34
+
35
+ __all__ = [
36
+ # Framework API
37
+ "NinmeniFramework", "NinmeniConfig",
38
+ # Base
39
+ "NinmeniState", "MorfemState", "PelanggaranConstraint", "NinmeniHead",
40
+ # Primitif
41
+ "LPSParser", "Morfem", "KelasKata", "PeranGramatikal",
42
+ "SemanticManifold", "LexiconLoader",
43
+ "CPEngine",
44
+ "CMComposer",
45
+ "TDAnalyzer",
46
+ # KRL — Knowledge Representation Layer
47
+ "KRLayer", "KRLResult", "Proposisi", "Frame", "FrameBank",
48
+ ]
@@ -0,0 +1,7 @@
1
+ """
2
+ Entrypoint untuk `py -m ninmeni`.
3
+ """
4
+ import sys
5
+ from ninmeni.cli import main
6
+
7
+ sys.exit(main())
@@ -0,0 +1,5 @@
1
+ """NINMENI Framework — Base Classes."""
2
+ from ninmeni.base.state import NinmeniState, MorfemState, PelanggaranConstraint
3
+ from ninmeni.base.head import NinmeniHead
4
+
5
+ __all__ = ["NinmeniState", "MorfemState", "PelanggaranConstraint", "NinmeniHead"]
@@ -0,0 +1,69 @@
1
+ """
2
+ NinmeniHead — base class untuk semua head yang dibangun di atas NINMENI Framework.
3
+
4
+ Developer mendefinisikan head mereka sendiri untuk task spesifik.
5
+ Framework hanya menyediakan NinmeniState sebagai input — head menentukan output.
6
+ """
7
+
8
+ from __future__ import annotations
9
+ from abc import ABC, abstractmethod
10
+ from typing import Any, Dict
11
+ import torch.nn as nn
12
+
13
+ from ninmeni.base.state import NinmeniState
14
+
15
+
16
+ class NinmeniHead(ABC, nn.Module):
17
+ """
18
+ Base class untuk semua head yang dibangun di atas NINMENI Framework.
19
+
20
+ Framework menjamin:
21
+ - Input selalu berupa NinmeniState yang kaya informasi linguistik
22
+ - Setiap field NinmeniState punya makna eksplisit
23
+
24
+ Developer tentukan sendiri:
25
+ - Objective training
26
+ - Format output
27
+ - Task spesifik (evaluasi, klasifikasi, retrieval, dll.)
28
+
29
+ LARANGAN di dalam head:
30
+ - Tidak boleh menggunakan nn.MultiheadAttention
31
+ - Tidak boleh menggunakan TransformerEncoder/Decoder
32
+ - Tidak boleh melakukan next-token prediction
33
+ """
34
+
35
+ @abstractmethod
36
+ def forward(self, state: NinmeniState) -> Dict[str, Any]:
37
+ """
38
+ Proses NinmeniState dan kembalikan output sesuai task.
39
+
40
+ Args:
41
+ state: NinmeniState lengkap dari pipeline NINMENI
42
+
43
+ Returns:
44
+ dict output — format ditentukan oleh developer
45
+ """
46
+ ...
47
+
48
+ def cek_prinsip(self) -> None:
49
+ """
50
+ Cek apakah implementasi head melanggar prinsip NINMENI.
51
+ Dipanggil saat inisialisasi.
52
+ """
53
+ for name, module in self.named_modules():
54
+ if isinstance(module, nn.MultiheadAttention):
55
+ raise RuntimeError(
56
+ f"⚠️ PELANGGARAN PRINSIP NINMENI\n"
57
+ f" Modul '{name}' menggunakan nn.MultiheadAttention.\n"
58
+ f" Ini melanggar prinsip: mekanisme utama harus constraint propagation,\n"
59
+ f" bukan self-attention O(n²).\n"
60
+ f" Ganti dengan CPE (Constraint Propagation Engine)."
61
+ )
62
+ cls_name = type(module).__name__
63
+ if "Transformer" in cls_name:
64
+ raise RuntimeError(
65
+ f"⚠️ PELANGGARAN PRINSIP NINMENI\n"
66
+ f" Modul '{name}' adalah komponen Transformer ({cls_name}).\n"
67
+ f" NINMENI harus 100% berlawanan paradigma dengan Transformer/Mamba.\n"
68
+ f" Lihat docs/NINMENI_FRAMEWORK_SPEC.md untuk alternatif."
69
+ )