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.
- ninmeni-0.1.0a1/LICENSE +21 -0
- ninmeni-0.1.0a1/MANIFEST.in +5 -0
- ninmeni-0.1.0a1/PKG-INFO +235 -0
- ninmeni-0.1.0a1/README.md +202 -0
- ninmeni-0.1.0a1/ninmeni/__init__.py +48 -0
- ninmeni-0.1.0a1/ninmeni/__main__.py +7 -0
- ninmeni-0.1.0a1/ninmeni/base/__init__.py +5 -0
- ninmeni-0.1.0a1/ninmeni/base/head.py +69 -0
- ninmeni-0.1.0a1/ninmeni/base/state.py +302 -0
- ninmeni-0.1.0a1/ninmeni/cli.py +1416 -0
- ninmeni-0.1.0a1/ninmeni/config.py +266 -0
- ninmeni-0.1.0a1/ninmeni/core/__init__.py +15 -0
- ninmeni-0.1.0a1/ninmeni/core/bsu.py +163 -0
- ninmeni-0.1.0a1/ninmeni/core/correctness.py +285 -0
- ninmeni-0.1.0a1/ninmeni/core/expression.py +247 -0
- ninmeni-0.1.0a1/ninmeni/core/gos.py +583 -0
- ninmeni-0.1.0a1/ninmeni/core/meb.py +440 -0
- ninmeni-0.1.0a1/ninmeni/core/model.py +602 -0
- ninmeni-0.1.0a1/ninmeni/data/__init__.py +28 -0
- ninmeni-0.1.0a1/ninmeni/data/augmentor.py +563 -0
- ninmeni-0.1.0a1/ninmeni/data/corpus_builder.py +422 -0
- ninmeni-0.1.0a1/ninmeni/data/dataset.py +406 -0
- ninmeni-0.1.0a1/ninmeni/data/linguistic_sample.py +291 -0
- ninmeni-0.1.0a1/ninmeni/data/morph_cache.py +363 -0
- ninmeni-0.1.0a1/ninmeni/data/pipeline.py +569 -0
- ninmeni-0.1.0a1/ninmeni/data/tokenizer.py +219 -0
- ninmeni-0.1.0a1/ninmeni/data/validator.py +616 -0
- ninmeni-0.1.0a1/ninmeni/eval/__init__.py +5 -0
- ninmeni-0.1.0a1/ninmeni/eval/metrics.py +429 -0
- ninmeni-0.1.0a1/ninmeni/framework.py +367 -0
- ninmeni-0.1.0a1/ninmeni/heads/__init__.py +23 -0
- ninmeni-0.1.0a1/ninmeni/heads/correctness.py +392 -0
- ninmeni-0.1.0a1/ninmeni/linguistic/__init__.py +21 -0
- ninmeni-0.1.0a1/ninmeni/linguistic/lps.py +843 -0
- ninmeni-0.1.0a1/ninmeni/linguistic/lsk.py +641 -0
- ninmeni-0.1.0a1/ninmeni/linguistic/vocab_policy.py +756 -0
- ninmeni-0.1.0a1/ninmeni/primitives/__init__.py +1 -0
- ninmeni-0.1.0a1/ninmeni/primitives/cmc/__init__.py +6 -0
- ninmeni-0.1.0a1/ninmeni/primitives/cmc/category.py +428 -0
- ninmeni-0.1.0a1/ninmeni/primitives/cmc/composer.py +152 -0
- ninmeni-0.1.0a1/ninmeni/primitives/cmc/morphism.py +179 -0
- ninmeni-0.1.0a1/ninmeni/primitives/cpe/__init__.py +6 -0
- ninmeni-0.1.0a1/ninmeni/primitives/cpe/constraint.py +474 -0
- ninmeni-0.1.0a1/ninmeni/primitives/cpe/convergence.py +69 -0
- ninmeni-0.1.0a1/ninmeni/primitives/cpe/engine.py +648 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/__init__.py +22 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/encoder.py +262 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/frame.py +488 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/inference.py +305 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/kb.py +488 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/layer.py +270 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/matcher.py +170 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/proposition.py +205 -0
- ninmeni-0.1.0a1/ninmeni/primitives/krl/resolver.py +194 -0
- ninmeni-0.1.0a1/ninmeni/primitives/lps/__init__.py +6 -0
- ninmeni-0.1.0a1/ninmeni/primitives/lps/afiks.py +456 -0
- ninmeni-0.1.0a1/ninmeni/primitives/lps/morfem.py +120 -0
- ninmeni-0.1.0a1/ninmeni/primitives/lps/parser.py +610 -0
- ninmeni-0.1.0a1/ninmeni/primitives/sfm/__init__.py +6 -0
- ninmeni-0.1.0a1/ninmeni/primitives/sfm/geodesic.py +220 -0
- ninmeni-0.1.0a1/ninmeni/primitives/sfm/lexicon.py +443 -0
- ninmeni-0.1.0a1/ninmeni/primitives/sfm/manifold.py +337 -0
- ninmeni-0.1.0a1/ninmeni/primitives/tda/__init__.py +6 -0
- ninmeni-0.1.0a1/ninmeni/primitives/tda/analyzer.py +232 -0
- ninmeni-0.1.0a1/ninmeni/primitives/tda/homology.py +189 -0
- ninmeni-0.1.0a1/ninmeni/primitives/tda/simplex.py +191 -0
- ninmeni-0.1.0a1/ninmeni/training/__init__.py +11 -0
- ninmeni-0.1.0a1/ninmeni/training/balanced_trainer.py +658 -0
- ninmeni-0.1.0a1/ninmeni/training/correctness_trainer.py +288 -0
- ninmeni-0.1.0a1/ninmeni/training/expression_trainer.py +406 -0
- ninmeni-0.1.0a1/ninmeni/training/loss.py +112 -0
- ninmeni-0.1.0a1/ninmeni/training/objective.py +175 -0
- ninmeni-0.1.0a1/ninmeni/training/pd.py +290 -0
- ninmeni-0.1.0a1/ninmeni/utils/__init__.py +17 -0
- ninmeni-0.1.0a1/ninmeni/utils/indo_metrics.py +694 -0
- ninmeni-0.1.0a1/ninmeni/utils/metrics.py +189 -0
- ninmeni-0.1.0a1/ninmeni/utils/trainer.py +317 -0
- ninmeni-0.1.0a1/ninmeni.egg-info/PKG-INFO +235 -0
- ninmeni-0.1.0a1/ninmeni.egg-info/SOURCES.txt +98 -0
- ninmeni-0.1.0a1/ninmeni.egg-info/dependency_links.txt +1 -0
- ninmeni-0.1.0a1/ninmeni.egg-info/entry_points.txt +2 -0
- ninmeni-0.1.0a1/ninmeni.egg-info/requires.txt +7 -0
- ninmeni-0.1.0a1/ninmeni.egg-info/top_level.txt +1 -0
- ninmeni-0.1.0a1/pyproject.toml +49 -0
- ninmeni-0.1.0a1/requirements.txt +4 -0
- ninmeni-0.1.0a1/setup.cfg +4 -0
- ninmeni-0.1.0a1/setup.py +37 -0
- ninmeni-0.1.0a1/tests/test_bsu.py +100 -0
- ninmeni-0.1.0a1/tests/test_data_pipeline.py +599 -0
- ninmeni-0.1.0a1/tests/test_dataset_validator.py +561 -0
- ninmeni-0.1.0a1/tests/test_express_integration.py +202 -0
- ninmeni-0.1.0a1/tests/test_expression.py +181 -0
- ninmeni-0.1.0a1/tests/test_framework_consistency.py +690 -0
- ninmeni-0.1.0a1/tests/test_full_model.py +232 -0
- ninmeni-0.1.0a1/tests/test_indo_metrics.py +481 -0
- ninmeni-0.1.0a1/tests/test_linguistic_engine.py +432 -0
- ninmeni-0.1.0a1/tests/test_lps.py +323 -0
- ninmeni-0.1.0a1/tests/test_meb.py +158 -0
- ninmeni-0.1.0a1/tests/test_native_framework_audit.py +1003 -0
- ninmeni-0.1.0a1/tests/test_vocab_policy.py +558 -0
ninmeni-0.1.0a1/LICENSE
ADDED
|
@@ -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.
|
ninmeni-0.1.0a1/PKG-INFO
ADDED
|
@@ -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,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
|
+
)
|