mirror of
https://github.com/ada-dmitry/CourseWork_IRFM.git
synced 2026-09-24 01:10:18 +00:00
86 lines
3.0 KiB
Markdown
86 lines
3.0 KiB
Markdown
## Как работает 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`.
|