yakit 0.1.0__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.
yakit-0.1.0/.gitignore ADDED
@@ -0,0 +1,68 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments
24
+ venv/
25
+ env/
26
+ ENV/
27
+ .venv/
28
+
29
+ # IDE
30
+ .vscode/
31
+ .idea/
32
+ *.swp
33
+ *.swo
34
+ *~
35
+
36
+ # Jupyter
37
+ .ipynb_checkpoints/
38
+ *.ipynb
39
+
40
+ # Testing
41
+ .pytest_cache/
42
+ .coverage
43
+ htmlcov/
44
+ .tox/
45
+
46
+ # Data
47
+ data/processed/
48
+ data/augmented/
49
+ *.pkl
50
+ *.h5
51
+ *.hdf5
52
+
53
+ # Models
54
+ *.bin
55
+ *.pt
56
+ *.pth
57
+ *.ckpt
58
+
59
+ # Logs
60
+ logs/
61
+ *.log
62
+
63
+ # OS
64
+ .DS_Store
65
+ Thumbs.db
66
+
67
+ # uv
68
+ .uv/
yakit-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Michil
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.
yakit-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,333 @@
1
+ Metadata-Version: 2.4
2
+ Name: yakit
3
+ Version: 0.1.0
4
+ Summary: Yakut language text normalizer using Word2Vec embeddings
5
+ Project-URL: Homepage, https://github.com/Michiluser/yakit
6
+ Project-URL: Documentation, https://github.com/Michiluser/yakit#readme
7
+ Project-URL: Repository, https://github.com/Michiluser/yakit
8
+ Project-URL: Issues, https://github.com/Michiluser/yakit/issues
9
+ Author: Michil
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Keywords: nlp,sakha,text-normalization,word2vec,yakut
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Natural Language :: Russian
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
24
+ Classifier: Topic :: Text Processing :: Linguistic
25
+ Requires-Python: >=3.10
26
+ Requires-Dist: beautifulsoup4>=4.12.0
27
+ Requires-Dist: gensim>=4.3.0
28
+ Requires-Dist: llama-index-llms-ollama>=0.1.0
29
+ Requires-Dist: llama-index>=0.10.0
30
+ Requires-Dist: numpy>=1.24.0
31
+ Requires-Dist: requests>=2.31.0
32
+ Requires-Dist: tqdm>=4.65.0
33
+ Provides-Extra: all
34
+ Requires-Dist: huggingface-hub>=0.16.0; extra == 'all'
35
+ Requires-Dist: pre-commit>=3.0.0; extra == 'all'
36
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'all'
37
+ Requires-Dist: pytest>=7.4.0; extra == 'all'
38
+ Requires-Dist: ruff>=0.1.0; extra == 'all'
39
+ Provides-Extra: dev
40
+ Requires-Dist: huggingface-hub>=0.16.0; extra == 'dev'
41
+ Requires-Dist: pre-commit>=3.0.0; extra == 'dev'
42
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
43
+ Requires-Dist: pytest>=7.4.0; extra == 'dev'
44
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
45
+ Provides-Extra: download
46
+ Requires-Dist: huggingface-hub>=0.16.0; extra == 'download'
47
+ Description-Content-Type: text/markdown
48
+
49
+ # Yakut Language Normalizer
50
+
51
+ Профессиональный нормализатор текста для якутского языка с использованием методов машинного обучения.
52
+
53
+ ## Описание
54
+
55
+ Проект предназначен для нормализации якутского текста. **Нормализация** — это преобразование текста БЕЗ якутских символов в текст С якутскими символами.
56
+
57
+ **Направление нормализации:**
58
+ - Вход: текст без якутских символов (например, "МАННАЙГЫ")
59
+ - Выход: текст с якутскими символами (например, "МАҤНАЙГЫ")
60
+
61
+ **Правила нормализации:**
62
+ - `h` → `һ` (всегда)
63
+ - `ь` -> `һ`(в некоторых позициях)
64
+ - `г` → `ҕ` (в некоторых позициях)
65
+ - `н` → `ҥ` (в некоторых позициях)
66
+ - `о` → `ө` (в некоторых позициях)
67
+ - `у` → `ү` (в некоторых позициях)
68
+
69
+ **Подготовка данных:** Для обучения модели мы берем нормализованные тексты (с якутскими символами) и создаем денормализованные варианты (без символов), формируя пары (денормализованный, нормализованный) для обучения.
70
+
71
+ ## Структура проекта
72
+
73
+ ```
74
+ yakut_normalizer/
75
+ ├── src/
76
+ │ ├── __init__.py
77
+ │ ├── data/ # Скрипты для обработки данных
78
+ │ ├── features/ # Извлечение признаков
79
+ │ ├── models/ # Модели машинного обучения
80
+ │ └── utils/ # Вспомогательные утилиты
81
+ ├── data/ # Исходные данные
82
+ ├── tests/ # Тесты
83
+ ├── pyproject.toml # Конфигурация проекта
84
+ └── README.md
85
+ ```
86
+
87
+ ## Быстрый старт
88
+
89
+ ### Требования
90
+ - Python 3.11+
91
+ - [uv](https://github.com/astral-sh/uv) (рекомендуется) или pip
92
+
93
+ ### Установка с uv
94
+
95
+ ```bash
96
+ # Если uv не установлен, установите его:
97
+ # Windows: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
98
+ # Linux/Mac: curl -LsSf https://astral.sh/uv/install.sh | sh
99
+
100
+ # Установка зависимостей
101
+ uv sync
102
+
103
+ # Активация виртуального окружения
104
+ uv run python
105
+
106
+ # Или запуск скриптов напрямую
107
+ uv run python -m src.data.prepare_data --help
108
+ ```
109
+
110
+ ### Установка с pip
111
+
112
+ ```bash
113
+ pip install -e .
114
+ pip install -e ".[dev]"
115
+ ```
116
+
117
+ ### Настройка pre-commit
118
+
119
+ ```bash
120
+ # Установка pre-commit hooks
121
+ pre-commit install
122
+
123
+ # Ручной запуск проверок
124
+ pre-commit run --all-files
125
+ ```
126
+
127
+ ## Использование
128
+
129
+ ### Нормализаторы
130
+
131
+ Проект предоставляет различные реализации нормализаторов через абстрактный интерфейс:
132
+
133
+ ```python
134
+ from src.models.naive import NaiveNormalizer
135
+
136
+ # Создание нормализатора
137
+ normalizer = NaiveNormalizer()
138
+
139
+ # Нормализация текста
140
+ text = "МАННАЙГЫ БАhА"
141
+ normalized = normalizer.normalize(text)
142
+ # Результат: "МАҤНАЙГЫ БАҺА"
143
+
144
+ # Нормализатор можно вызывать как функцию
145
+ normalized = normalizer(text)
146
+ ```
147
+
148
+ **Доступные нормализаторы:**
149
+ - `NaiveNormalizer` - наивная реализация, заменяет все вхождения символов без учета контекста
150
+ - `ContextAwareNormalizer` - контекстно-зависимый нормализатор, использующий n-граммы
151
+ - `Word2VecNormalizer` - нормализатор на основе word2vec embeddings (рекомендуется)
152
+
153
+ **Рекомендуемые параметры для Word2VecNormalizer:**
154
+ После оптимизации с помощью Optuna найдены оптимальные параметры (см. `best_params.txt`):
155
+ - Character Accuracy: **0.9715**
156
+ - Exact Match: **0.6177**
157
+ - Word Accuracy: **0.9209**
158
+
159
+ ### Интерактивная нормализация
160
+
161
+ Для быстрой нормализации текста можно использовать интерактивный скрипт:
162
+
163
+ ```bash
164
+ # Интерактивный режим
165
+ python scripts/normalize_interactive.py
166
+
167
+ # Нормализация текста из командной строки
168
+ python scripts/normalize_interactive.py --text "МАННАЙГЫ БАhА"
169
+
170
+ # Нормализация файла
171
+ python scripts/normalize_interactive.py --input input.txt --output output.txt
172
+ ```
173
+
174
+ Подробнее см. [scripts/README.md](scripts/README.md).
175
+
176
+ ### Подготовка данных
177
+
178
+ ```python
179
+ from src.data.augmentation import (
180
+ denormalize_text,
181
+ generate_denormalized_variants,
182
+ create_normalization_pairs,
183
+ )
184
+
185
+ # Денормализация текста (для подготовки данных)
186
+ normalized_text = "МАҤНАЙГЫ БАҺА"
187
+ denormalized = denormalize_text(normalized_text, replacement_prob=1.0, random_seed=42)
188
+ print(denormalized) # "МАННАЙГЫ БАhА" или "МАННАЙГЫ БАьА"
189
+
190
+ # Генерация нескольких денормализованных вариантов
191
+ variants = generate_denormalized_variants(normalized_text, num_variants=3)
192
+ for variant in variants:
193
+ print(variant)
194
+
195
+ # Создание пар для обучения: (денормализованный, нормализованный)
196
+ normalized_texts = ["МАҤНАЙГЫ БАҺА", "Күн киирдэ"]
197
+ pairs = create_normalization_pairs(normalized_texts, num_variants_per_text=2)
198
+ # Пары: [("МАННАЙГЫ БАhА", "МАҤНАЙГЫ БАҺА"), ...]
199
+ ```
200
+
201
+ ### Подготовка данных
202
+
203
+ Скрипт берет нормализованные тексты (с якутскими символами) и создает денормализованные варианты для обучения модели.
204
+
205
+ ```bash
206
+ # Создать пары (денормализованный, нормализованный) из исходного файла
207
+ uv run python -m src.data.prepare_data \
208
+ --input data/yakut_razdel.txt \
209
+ --output data/augmented/yakut_pairs.txt \
210
+ --num-variants 2 \
211
+ --replacement-prob 1.0 \
212
+ --random-seed 42
213
+
214
+ # Для тестирования на небольшом количестве строк
215
+ uv run python -m src.data.prepare_data \
216
+ --input data/yakut_razdel.txt \
217
+ --output data/augmented/yakut_pairs_test.txt \
218
+ --max-lines 100 \
219
+ --num-variants 1
220
+ ```
221
+
222
+ **Формат выходного файла:** `denormalized<tab>normalized`
223
+ - Первая колонка: текст без якутских символов (input для модели)
224
+ - Вторая колонка: текст с якутскими символами (target для модели)
225
+
226
+ ### Разделение на train и test
227
+
228
+ Данные разделяются на train и test с учетом доли специальных символов для сохранения похожего распределения:
229
+
230
+ ```bash
231
+ # Разделить данные на train и test
232
+ python -m src.data.split_data \
233
+ --input data/processed/yakut_pairs.txt \
234
+ --train-output data/processed/train_pairs.txt \
235
+ --test-output data/processed/test_pairs.txt \
236
+ --test-ratio 0.2
237
+
238
+ # Сравнить метрики на train и test
239
+ python scripts/compare_train_test.py src.models.naive.NaiveNormalizer
240
+ ```
241
+
242
+ Разделение использует стратификацию по доле специальных символов, чтобы обеспечить похожее распределение в train и test наборах.
243
+
244
+ ### Валидация и сравнение подходов
245
+
246
+ Валидатор позволяет сравнивать разные подходы к нормализации с помощью различных метрик:
247
+
248
+ ```python
249
+ from src.utils.validator import compare_normalizers, load_pairs
250
+
251
+ # Загрузка тестовых данных
252
+ test_pairs = load_pairs("data/processed/yakut_pairs.txt")
253
+
254
+ # Определение нормализаторов для сравнения
255
+ def my_normalizer(text: str) -> str:
256
+ # Ваша реализация нормализации
257
+ return normalized_text
258
+
259
+ normalizers = {
260
+ "Baseline": lambda x: x, # Identity
261
+ "My Approach": my_normalizer,
262
+ }
263
+
264
+ # Сравнение подходов
265
+ results = compare_normalizers(normalizers, test_pairs[:100])
266
+ ```
267
+
268
+ **Доступные метрики:**
269
+ - **Levenshtein Distance** - минимальное количество редактирований
270
+ - **Normalized Levenshtein** - нормализованное расстояние (0.0-1.0)
271
+ - **Character Accuracy** - точность на уровне символов
272
+ - **Word Accuracy** - точность на уровне слов
273
+ - **Character Error Rate (CER)** - частота ошибок на символах
274
+ - **Word Error Rate (WER)** - частота ошибок на словах
275
+ - **Exact Match** - процент полностью совпадающих текстов
276
+
277
+ **Командная строка:**
278
+ ```bash
279
+ # Оценка одного нормализатора
280
+ uv run python -m src.utils.validator \
281
+ --test-data data/processed/yakut_pairs.txt \
282
+ --max-samples 100 \
283
+ --verbose
284
+ ```
285
+
286
+ **Скрипт для валидации нормализаторов:**
287
+ ```bash
288
+ # Валидация нормализатора с параметрами
289
+ python scripts/validate_normalizer.py src.models.naive.NaiveNormalizer \
290
+ --max-samples 100 \
291
+ --compare-baseline
292
+
293
+ # С параметрами инициализации
294
+ python scripts/validate_normalizer.py src.models.naive.NaiveNormalizer \
295
+ --params '{"param1": "value1"}' \
296
+ --max-samples 50
297
+ ```
298
+
299
+ ## Разработка
300
+
301
+ ### Pre-commit hooks
302
+
303
+ ```bash
304
+ pre-commit install
305
+ pre-commit run --all-files
306
+ ```
307
+
308
+ ### Запуск тестов
309
+
310
+ ```bash
311
+ pytest
312
+ ```
313
+
314
+ ### Оптимизация гиперпараметров
315
+
316
+ Для поиска оптимальных параметров нормализатора можно использовать Optuna:
317
+
318
+ ```bash
319
+ # Базовая оптимизация (50 trials)
320
+ python scripts/optimize_hyperparameters.py
321
+
322
+ # С большим количеством trials
323
+ python scripts/optimize_hyperparameters.py --n-trials 100
324
+
325
+ # Сохранение study в файл для продолжения позже
326
+ python scripts/optimize_hyperparameters.py --storage sqlite:///study.db --n-trials 100
327
+ ```
328
+
329
+ Подробнее см. [scripts/README.md](scripts/README.md).
330
+
331
+ ## Лицензия
332
+
333
+ MIT