Files
CourseWork_IRFM/instructions/PROCESSOR_README.md
T

6.4 KiB
Raw Blame History

Как работает processor

Processor находится в modules/processor.py. Он получает уже очищенный исходный текст УК РФ и готовит его к анализу.

В коде используются простые инструменты: регулярные выражения, списки стоп-слов, pymorphy3 для лемматизации, Counter для подсчета частот, csv и json для записи результата.

Что делает processor

Основные задачи:

  1. Найти слова в тексте.
  2. Привести каждое слово к нормальной форме.
  3. Удалить лишние слова: стоп-слова, служебные слова структуры закона, числительные, единицы измерения после чисел, имена собственные и названия объектов.
  4. Собрать подготовленный текст.
  5. Построить предметный указатель на 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)

Она делает следующее:

  1. Разбивает строку на слова.
  2. Для каждого слова находит лемму и морфологические теги.
  3. Находит позиции слов, которые входят в имена собственные из нескольких слов.
  4. Проверяет каждое слово функцией is_bad_word().
  5. Возвращает только подходящие слова.

Подготовленный текст

Функция:

prepare_text(text)

проходит по строкам исходного текста, оставляет только хорошие леммы и склеивает их обратно в строки.

Результат записывается в:

output/uk_rf_prepared.txt

Где используется processor

good_words_from_line экспортируется в modules/index.py, где используется для построения предметного указателя. Логика подсчёта частот и записи результатов находится в index.py, а не здесь.