Refactor loader and processor documentation; enhance index module with README

This commit is contained in:
Dmitry
2026-04-28 21:04:24 +03:00
parent 29e1ee26fb
commit 045fc41660
7 changed files with 104 additions and 55 deletions
+85
View File
@@ -0,0 +1,85 @@
## Как работает index
Index находится в `modules/index.py`. Его задача: взять исходный текст УК РФ и построить предметный указатель — топ-N наиболее частотных лемм с позицией первого вхождения.
Модуль использует `good_words_from_line` из `modules/processor.py` и ничего не знает о загрузке или обходе страниц.
## Что делает index
1. Обходит текст построчно и извлекает «хорошие» слова через `processor.py`.
2. Считает частоту каждой леммы.
3. Запоминает, где лемма встретилась впервые.
4. Возвращает топ-N по частоте.
5. Сохраняет результат в CSV и JSON.
## Генератор prepared_terms
```python
prepared_terms(text)
```
Обходит текст построчно и для каждого слова, прошедшего фильтрацию, выдаёт кортеж:
```python
(лемма, номер_строки, позиция_символа, исходное_слово)
```
Нумерация строк начинается с `1`, позиция символа — 1-based, как в `processor.py`.
## Построение предметного указателя
```python
build_subject_index(text, top_n=100)
```
Алгоритм:
1. Проходит по всем словам через `prepared_terms`.
2. Считает частоты через `Counter`.
3. Запоминает первое вхождение каждой леммы через `setdefault` — первый вызов выигрывает, последующие игнорируются.
4. Берёт `top_n` самых частотных лемм.
Одна запись результата:
```python
{
"word": "срок",
"count": 3342,
"line": 34,
"char": 151,
"source_word": "срок",
}
```
## Запись результатов
Для сохранения индекса есть две функции.
```python
write_subject_index_csv(entries, path)
```
Сохраняет CSV с разделителем `;`:
```text
word;count;line;char;source_word
срок;3342;34;151;срок
```
```python
write_subject_index_json(entries, path)
```
Сохраняет JSON с отступами и без ASCII-экранирования кириллицы (`ensure_ascii=False`).
## Где используется index
В `main.py`:
```python
subject_index = build_subject_index(original_text, top_n=100)
write_subject_index_csv(subject_index, output_dir / "uk_rf_subject_index.csv")
write_subject_index_json(subject_index, output_dir / "uk_rf_subject_index.json")
```
Входные данные — исходный текст статей до лемматизации (`original_text`), а не подготовленный. Лемматизация происходит внутри через `processor.py`.