Игорь Градов
Игорь Градов
6 мин
ai

Нейросеть для сжатия текста в конспект: омонимы урезают словарь модели до хроматического числа

Разберёмся, как устроен механизм сжатия словаря языковой модели через объединение слов-омонимов и как это работает на практике с корпусом русской Википедии.

Почему это важно

Омонимы в естественном языке подсказывают способ уменьшить словарь нейросети без потери смысла: если контексты двух слов никогда не пересекаются, их можно обозначить одним токеном (минимальной единицей текста для модели), а предел такого сжатия определяется хроматическим числом графа различимости.

Идея выглядит контринтуитивно: здравый смысл говорит, что у каждого понятия должно быть своё имя. Но русский язык давно доказал обратное. «На грядках растёт много лука» и «Сильно натянута тетива лука» используют одно слово, а значение мы восстанавливаем по контексту без усилий. Автор исследования предлагает не просто наблюдать за этим явлением, а использовать его как инструмент: брать слова с непересекающимися контекстами и объединять их в один символ, сокращая словарь модели.

Именно на корпусе русской Википедии автор проверяет, насколько реальный язык поддаётся такому сжатию и как далеко можно зайти.

Как работает механизм сжатия?

Ключевой принцип прост. Слово-омоним хранит несколько значений, и каждому значению соответствует своё множество контекстов. Условие одно: контексты разных значений не должны пересекаться. Если это выполняется, значение всегда восстановимо, а два «чужих» слова можно безопасно слить в один токен.

Чтобы понять предел сжатия, строится граф различимости слов:

  • Вершины графа (точки, между которыми проводят связи) соответствуют словам.
  • Ребро (связь между двумя вершинами) означает, что контексты двух слов пересекаются и объединить их в один символ нельзя: мы не сможем однозначно отличить одно значение от другого.
  • Задача сводится к раскраске графа: нужно покрасить все вершины минимальным числом цветов так, чтобы соседние вершины (соединённые ребром) были разного цвета.

Минимальное число таких цветов называется хроматическим числом графа. Оно и показывает, до скольких символов теоретически можно сжать весь словарь.

Для читателя без математического фона: представьте карту, где каждую страну нужно покрасить так, чтобы соседние страны различались по цвету. Минимальное число красок и есть хроматическое число. Только вместо стран у нас слова, а вместо общей границы пересечение контекстов.

Что понадобится

  • Python 3.8 или новее
  • Библиотеки: datasets (Hugging Face), tqdm, collections, re
  • Доступ к интернету для загрузки корпуса русской Википедии (датасет wikimedia/wikipedia, срез 20231101.ru)
  • Минимум 4 ГБ оперативной памяти для обработки 10 000 статей
  • Около 30 минут на загрузку корпуса и предобработку

Пошаговая инструкция

1. Загрузите корпус русской Википедии.

Используем потоковый режим, чтобы не скачивать весь датасет целиком. Из корпуса берём первые 10 000 статей и сохраняем в текстовый файл:

from datasets import load_dataset
from tqdm import tqdm

filename = "./base/russian_wikipedia.txt"

ds = load_dataset(
    "wikimedia/wikipedia",
    "20231101.ru",
    split="train",
    streaming=True
)

with open(filename, "w", encoding="utf-8") as f:
    for i, item in enumerate(tqdm(ds)):
        if i >= 10000:
            break
        f.write(item["text"] + "\n")

2. Прочитайте и объедините все текстовые файлы из папки.

Если у вас несколько файлов в директории ./base/, скрипт склеит их в одну строку:

from os import walk

base_path = './base/'
data_text = ''

for dirpath, dirnames, filenames in walk(base_path):
    for file_name in filenames:
        if file_name[-4:] != '.txt':
            continue
        try:
            current_text = open(
                dirpath + '/' + file_name, 'r', encoding='utf-8'
            ).read()
            data_text += current_text
        except Exception as e:
            print(f'Error reading {file_name}: {e}')

3. Выполните предобработку текста.

Приведение к нижнему регистру, удаление всего, кроме русских букв и пробелов, замена «ё» на «е», очистка лишних пробелов и переносов:

import re

def prepare_text(text):
    n_text = text.lower()
    n_text = re.sub(r'[^а-яё\s]+', ' ', n_text)
    n_text = re.sub(r'ё', 'е', n_text)
    n_text = re.sub(r'\n+', ' ', n_text)
    n_text = re.sub(r'\s+', ' ', n_text)
    return n_text

data_text = prepare_text(data_text)

4. Постройте словарь и отсеките редкие слова.

Слова, встретившиеся менее 5 раз, выбрасываем: их контексты слишком бедны для анализа:

from collections import Counter

words = data_text.split()
freq = Counter(words)
min_frequency = 5
vocab = {w for w, c in freq.items() if c >= min_frequency}

print(f"Исходное число уникальных слов: {len(freq)}")
print(f"Размер словаря после фильтрации: {len(vocab)}")

5. Постройте граф различимости и найдите хроматическое число.

На этом шаге для каждой пары слов из словаря нужно проверить, пересекаются ли их контексты (множества слов-соседей в тексте). Если да, ставим ребро. Затем ищем хроматическое число. Точное вычисление хроматического числа вычислительно тяжёлая задача (NP-трудная), поэтому на больших графах используют приближённые алгоритмы «жадной» раскраски.

Конкретный пример: что получается на 10 000 статей

На корпусе из 10 000 статей русской Википедии после предобработки и отсечения слов с частотой ниже 5 результат выглядит так:

Final data length: ~12 000 000 символов
Alphabet length: 33 (русские буквы + пробел)
Исходное число уникальных слов: ~350 000
Размер словаря после фильтрации: ~75 000

Первые 100 символов очищенного текста выглядят как сплошной поток строчных русских слов без знаков препинания. Дальше на этом словаре строится граф: слова с похожими контекстами соединяются рёбрами, а хроматическое число показывает минимальный размер «сжатого» словаря, где каждый символ может нести несколько значений, как омоним.

Что делать с этим прямо сейчас?

Авторам Дзена. Нейросеть для сжатия текста в конспект опирается на тот же принцип: модель «знает», какие слова взаимозаменяемы в контексте. Понимание этого помогает писать тексты, которые модель обрабатывает предсказуемо. Если вы используете нейросеть для сжатия текста в конспект, следите за омонимами в своих промптах (запросах к модели): неоднозначное слово без контекста сбивает генерацию.

Маркетологам. Компактный словарь означает более быстрый и дешёвый инференс (процесс генерации ответа моделью). Если вы выбираете между моделями для рабочих задач, размер словаря (vocabulary size) напрямую влияет на скорость и стоимость каждого запроса.

Разработчикам и предпринимателям в РФ. Метод проверен на русскоязычном корпусе, код открыт и использует общедоступный датасет. Для адаптации к узкой нише (юридические тексты, медицина, техдокументация) достаточно заменить корпус на свой и подобрать порог частотности.

Частые ошибки
  • Порог частотности слишком низкий. При min_frequency = 1 или 2 в граф попадают слова, встретившиеся один раз. Их контексты бедны, рёбра ставятся некорректно, и хроматическое число завышается. Начинайте с порога 5, увеличивайте на больших корпусах.
  • Забыли заменить «ё» на «е». Без этого шага «елка» и «ёлка» попадают в словарь как разные слова, искажая граф.
  • Точное хроматическое число на полном словаре. Задача NP-трудная, на 75 000 вершин точный алгоритм не завершится за разумное время. Используйте жадную раскраску или приближённые методы библиотеки NetworkX.
  • Слишком маленький корпус. На 100 статьях контексты слов не успевают «разойтись», и граф получается плотным, что обесценивает результаты.
Мнение редакции dzen.guru

Сама идея красива: язык «разрешает» омонимию, потому что контекст бесплатно восстанавливает смысл, и эту бесплатность можно монетизировать через сжатие словаря. На практике выигрыш зависит от языка и корпуса. Русский язык с его богатой морфологией порождает огромный словарь, и потенциал сжатия здесь выше, чем, скажем, в аналитических языках с короткими словами. По моим наблюдениям, именно русскоязычные модели больше всего выигрывают от оптимизации словаря, потому что изначально хранят десятки тысяч словоформ, которые различаются только окончаниями. Честная оговорка: метод пока исследовательский. До промышленного дообучения (fine-tuning, обучения модели на ваших данных под конкретную задачу) с «омонимизированным» словарём дорога длинная, и результат на генерации текстов ещё никто публично не проверял. Но как инструмент анализа своего корпуса метод рабочий уже сегодня.

Попробуйте ИИ-инструменты dzen.guru

Хотите применять нейросети для работы с текстом на практике? Протестируйте наши инструменты для авторов Дзена.

Попробовать

Граф различимости превращает интуитивное «контекст всё объяснит» в точную метрику. Если вы работаете с русскоязычными корпусами, постройте такой граф на своих данных: он покажет, сколько «лишних» слов хранит ваш словарь и где именно сжатие безопасно.

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Большие языковые модели пропускают джейлбрейки: какие риски это создаёт и как защититься
ai

Большие языковые модели пропускают джейлбрейки: какие риски это создаёт и как защититься

Большие языковые модели (LLM, нейросети, которые генерируют текст и код по запросу) обучены отказывать на опасные вопросы, но злоумышленники научились обходить…

6 мин
Self hosted LLM vs облако: год в Selectel показал, когда своя модель выгоднее API
ai

Self hosted LLM vs облако: год в Selectel показал, когда своя модель выгоднее API

Контекст — это не про IQ модели, а про безопасность данных: если код нельзя отправить наружу, выбор делается не между «лучшей» и «худшей» моделью, а между…

5 мин
ai

OpenAI впервые остановила новую модель: та научилась взламывать системы без человека

OpenAI второго июня приостановила внутреннюю разработку новой модели Astra, которая по результатам собственных проверок компании может обладать критическими…

4 мин