- Implemented loader in `modules/loader.py` to download HTML pages using curl and urllib. - Created processor in `modules/processor.py` for processing the text of the Russian Criminal Code (УК РФ). - Added README files for both loader and processor explaining their functionality and usage. - Generated output files including original text, prepared text, and subject index in CSV and JSON formats.
7.2 KiB
Как работает processor
Processor находится в modules/processor.py. Он получает уже очищенный исходный текст УК РФ и готовит его к анализу.
В коде используются простые инструменты: регулярные выражения, списки стоп-слов, pymorphy3 для лемматизации, Counter для подсчета частот, csv и json для записи результата.
Что делает processor
Основные задачи:
- Найти слова в тексте.
- Привести каждое слово к нормальной форме.
- Удалить лишние слова: стоп-слова, служебные слова структуры закона, числительные, единицы измерения после чисел, имена собственные и названия объектов.
- Собрать подготовленный текст.
- Построить предметный указатель на 100 самых частых слов.
Поиск слов
Слова ищутся регулярным выражением:
WORD_RE = re.compile(r"[А-Яа-яЁё]+(?:-[А-Яа-яЁё]+)?")
Оно находит русские слова, в том числе слова с дефисом:
уголовно-правовой
социально-опасный
Цифры и пунктуация этим выражением не выбираются.
Лемматизация
Лемматизация выполняется через pymorphy3.
Функция:
parse_word(word)
возвращает:
lemma, tag
Например:
преступлений -> преступление
лишением -> лишение
осужденного -> осудить
tag нужен для фильтрации числительных и имен собственных. Чтобы одно и то же слово не разбирать много раз, используется lru_cache.
Стоп-слова
Стоп-слова лежат в множестве:
STOP_WORDS
Туда входят обычные служебные слова:
и, в, на, что, этот, который
и структурные слова закона:
статья, часть, глава, раздел, пункт, кодекс
Они часто встречаются, но не являются полезными терминами предметного указателя.
Удаление числительных
Числительные удаляются двумя способами.
Первый способ: по списку слов:
NUMERAL_WORDS
Например:
один, два, три, пятьсот, тысяча, миллион
Второй способ: по морфологическим тегам pymorphy3:
NUMR
Anum
Так удаляются формы вроде:
трех
пяти
первой
второго
Удаление единиц после чисел
Есть слова, которые сами по себе могут быть полезными, но после числа обычно являются частью числительного выражения.
Например:
до трех лет
500 рублей
на срок шесть месяцев
Для этого используется список:
NUMBER_UNITS
Туда входят:
год, месяц, день, час, рубль, процент, метр
Если такое слово стоит после числительного или после цифры, оно удаляется.
Удаление имен собственных
Имена собственные удаляются тремя способами.
Первый способ: по морфологическим тегам:
Name, Surn, Patr, Geox, Orgn
Так удаляются имена, фамилии, отчества, географические названия и организации, если их распознал pymorphy3.
Второй способ: по списку отдельных слов:
PROPER_WORDS
Например:
москва, россия, рф, ельцин, интернет
Третий способ: по устойчивым словосочетаниям:
PROPER_PHRASES
Например:
российская федерация
государственная дума
федеральный закон
уголовный кодекс
центральный банк
Сначала слова в строке лемматизируются, затем функция find_phrase_positions() ищет такие фразы среди лемм и помечает их позиции как лишние.
Фильтрация одной строки
Основная функция для одной строки:
good_words_from_line(line)
Она делает следующее:
- Разбивает строку на слова.
- Для каждого слова находит лемму и морфологические теги.
- Находит позиции слов, которые входят в имена собственные из нескольких слов.
- Проверяет каждое слово функцией
is_bad_word(). - Возвращает только подходящие слова.
Подготовленный текст
Функция:
prepare_text(text)
проходит по строкам исходного текста, оставляет только хорошие леммы и склеивает их обратно в строки.
Результат записывается в:
output/uk_rf_prepared.txt
Предметный указатель
Функция:
build_subject_index(text, top_n=100)
строит индекс так:
- Проходит по всем подготовленным словам.
- Считает частоты через
Counter. - Запоминает первое появление каждого слова: номер строки, номер символа и исходную форму слова.
- Возвращает 100 самых частотных слов.
Одна запись индекса выглядит так:
{
"word": "срок",
"count": 3342,
"line": 34,
"char": 151,
"source_word": "срок",
}
Запись результатов
Для сохранения индекса есть две функции:
write_subject_index_csv(entries, path)
write_subject_index_json(entries, path)
Они создают:
output/uk_rf_subject_index.csv
output/uk_rf_subject_index.json
CSV удобен для просмотра в таблице, JSON удобен для дальнейшей обработки программой.