I. Теоретическая база
Семантическое ядро – это список ключевых слов и фраз, группированных по смыслу и наиболее точно описывающих тематику и содержание текста (или сайта/страницы). В отличие от простого частотного анализа, семантическое ядро ориентируется не только на частоту слов, но и на их смысловую значимость. Частотный подход учитывает, сколько раз встречается слово, но не различает, несет ли оно смысловую нагрузку. Семантический же анализ фокусируется на содержательных единицах – тех словах/фразах, которые отражают тему текста, даже если они не самые частотные. Например, в статье про здоровый образ жизни слово «здоровье» может встретиться реже служебных слов вроде «это» или «всё», но именно «здоровье» и связанные с ним словосочетания составляют смысловую основу текста. Частотный анализ дает лексическую плотность (какие слова доминируют численно), а семантический – семантическую плотность, учитывая леммы и значимые n-граммы.
Классические метрики частотности (TF, TF-IDF). Традиционный подход к извлечению ключевых слов – подсчет term frequency (TF) – количества вхождений слова. Более продвинутая версия – TF-IDF, которая понижает вес слов, часто встречающихся в других документах (не только в данном тексте). TF-IDF показывает важность слова для данного документа относительно общей частоты в корпусе документов. Эти методы просты и интерпретируемы, но имеют ограничения: они не различают синонимы и полагаются только на форму слова. Высокочастотные слова не всегда ключевые по смыслу (много «шумовых» слов типа «новый», «очень» могут иметь высокий TF, но низкую смысловую ценность). Кроме того, TF/TF-IDF не выявляет фразы – каждый термин оценивается отдельно, хотя ключевыми могут быть сочетания (например, «машинное обучение» важнее, чем слова «машинное» или «обучение» по отдельности). Тем не менее, TF-IDF остается полезным базовым показателем релевантности: если у слова высокий TF-IDF, оно относительно уникально для данного текста. Но для полноценного семантического ядра TF-IDF недостаточно, так как игнорирует контекст употребления слов.
Алгоритм RAKE (Rapid Automatic Keyword Extraction). RAKE – это простой алгоритм для автоматического извлечения ключевых фраз из одного документа на основе частоты и со-occurrence (совместной встречаемости) слов. RAKE разбивает текст на сегменты, отделяя слова-разделители (вроде стоп-слов и пунктуации), и рассматривает оставшиеся последовательности слов как кандидаты на ключевые фразы. Затем каждому слову-кандидату присваивается скорость: вычисляется степень его связности с другими словами в тех же фразах (метрика degree – сумма co-occurrence связей слова – делится на частоту слова). Суммарные баллы слов определяют вес фраз. Фразы, содержащие слова с высокими баллами, ранжируются выше. Таким образом, RAKE выделяет многословные ключи, отфильтровывая слова с малой смысловой нагрузкой (поскольку стоп-слова не входят в кандидаты и не влияют на скоринг). Например, для текста с отзывами о телефонах RAKE может извлечь фразы вроде «хорошая камера», «время работы батареи» – контентные слова «камера», «батареи» часто встречаются рядом с оценками («хорошая», «долго держит»), усиливая значимость этих сочетаний. Преимущество RAKE – независимость от внешних ресурсов (словари, тренировочные корпуса) и скорость, отсюда название Rapid. Недостатки – возможное включение лишних слов: алгоритм может вернуть отдельные слова, вырванные из контекста (например, в примере RAKE выделил одиночные слова «one», «help», «complex» с низкими баллами, которые сами по себе не информативны). RAKE игнорирует лингвистическую природу текста – не учитывает часть речи слов, семантические связи вне локального соседства и т.д.
Алгоритм TextRank. TextRank – графовый метод, вдохновленный PageRank. Он строит граф слов: вершины – слова (обычно приведенные к основе и отфильтрованные от стоп-слов), ребра между словами добавляются, если слова близко расположены в тексте (например, на расстоянии ≤ N слов). Затем алгоритм итеративно рассчитывает вес каждой вершины, передавая «важность» по связям, пока веса не сойдутся. В итоге слова с наибольшим рангом считаются ключевыми. Главное достоинство TextRank – учёт контекстной связности: слово получает больший вес, если связано с другими существенными словами. Таким образом, выделяются не просто частотные термины, а узловые понятия текста. TextRank фактически выявляет наиболее сильно связные и тематически значимые термины, выходя за рамки простой частоты. В отличие от RAKE, который оперирует локальными сочетаниями, TextRank учитывает глобальную связность: даже если важное слово встречается один раз, но окружено другими ключевыми словами, оно получит высокий ранг. Например, в научной статье TextRank может показать термин, упомянутый в одном абзаце, но связанный со множеством других терминов, как ключевой концепт. К недостаткам TextRank можно отнести чувствительность к длине текста и параметрам (окно co-occurrence, фильтрация по частям речи). Кроме того, TextRank, как и RAKE, работает сугубо на внутренней структуре текста, не используя внешние знания.
Алгоритм YAKE (Yet Another Keyword Extractor). YAKE – современный метод, тоже несупервизируемый, но использующий набор статистических характеристик текста для ранжирования ключевых фраз. В основе YAKE лежат такие признаки, как: позиция слова в тексте (ранние упоминания могут получать больший вес), распределение по предложениям, сочетание с реже встречающимися словами, присутствие заглавной буквы (что может указывать на имя собственного или начало предложения) и др. Каждая кандидат-фраза получает суммарный балл на основе этих метрик. YAKE не требует корпуса документов – признаки вычисляются по самому документу. Благодаря этому метод настраивается на контекст данного текста: например, часто повторяемое слово в одном абзаце, но редко встречающееся в остальных частях, может получить высокий вес (учитывается локальная дисперсия частоты). Преимущество YAKE – устойчивость к разным длинам текста и языкам, адаптивность к новым доменам (он не полагается на внешние словари). Недостаток – он все же основывается на статистике поверхностных признаков, из-за чего при сильно неоднородном или очень коротком тексте ключевые слова могут определяться неточно (контекстные неоднозначности полностью не снимаются). Тем не менее, YAKE часто показывает более релевантные ключи, чем простая частота, и может извлекать как одиночные слова, так и 2-3-словные фразы.
Векторная семантика и эмбеддинги (FastText, Word2Vec, BERT, SBERT). Дистрибутивная семантика рассматривает смысл слов через контексты их употребления. Из большого корпуса текстов можно обучить модели, представляющие каждое слово в виде вектора в многомерном пространстве (word embeddings). Классические модели – Word2Vec, GloVe, FastText – дают контекстно-независимые векторы: каждое слово имеет один вектор, усредняющий все его значения. Современные трансформер-модели (BERT и др.) генерируют контекстно-зависимые эмбеддинги: одно и то же слово получит разный вектор в разных окружениях, что позволяет различать значения (например, «лук» как оружие vs «лук» как овощ будут разными эмбеддингами при учете контекста). Применение векторной семантики к выделению ключевых слов происходит так: мы можем представить весь документ как вектор (например, усреднив эмбеддинги предложений или слов) и также представить каждое слово/фразу кандидата как вектор; затем оценить, насколько близок вектор кандидата к вектору документа (косинусное сходство). Идея в том, что ключевые слова будут семантически близки ко всему содержанию текста. Если вектор фразы имеет наибольший косинусный угол с вектором всего текста – эта фраза хорошо отражает тему документа. Такой подход реализован, например, в библиотеке KeyBERT, которая использует эмбеддинги BERT. KeyBERT вычисляет эмбеддинг всего документа (суммарный смысл), затем эмбеддинги для различных n-грамм текста, и выбирает те, чьи векторы максимально похожи на вектор документа. Благодаря этому метод может выявить важные фразы, даже если они упомянуты один раз – главное, что по смыслу они резюмируют содержание. Например, для абзаца о методах машинного обучения KeyBERT найдет ключевые слова «supervised learning», «machine learning», «learning algorithm» даже если слово «learning» встречается реже служебных слов, потому что эти фразы семантически центральны. Векторные модели также позволяют группировать синонимичные выражения: близкие по значению слова имеют близкие векторы. Таким образом, можно устранять дубли в семантическом ядре: если “автомобиль” и “машина” далеки по написанию, но их эмбеддинги близки, система поймет, что это одно понятие. В русскоязычных задачах популярны модели на основе FastText, которые учитывают части слов (что важно для богатой морфологии) – это сглаживает проблему словоформ и опечаток. Например, FastText распознает сходство «оптимизация» и «оптимизировать» по общим субстрокам. BERT и его вариации (например, RuBERT для русского) дают еще более глубокое понимание контекста, позволяя различать многозначные слова по окружению. Использование таких моделей значительно улучшает качество семантического анализа: как отмечают SEO-специалисты, крупные языковые модели и эмбеддинги стали в 2023-2024 гг. ключевым инструментом для работы с смыслом текста, а не только с ключевыми словами. По сути, векторизация обеспечивает переход от поверхностного анализа (какие слова часто употребляются) к глубокому – о чём текст, какие идеи в нем присутствуют.
Правила и шаблоны (rule-based подход). Дополнением к статистическим методам часто служат лингвистические правила. Например, можно заранее задать шаблоны для структур, которые считаются ключевыми единицами: «прилагательное + существительное» (как «полезные привычки»), «существительное + существительное» в виде именного сочетания («здоровье успех» – хотя и не совсем грамматически, но как два существительных, обозначающих связанные темы), «существительное + предлог + существительное» («чай для похудения»), и т.д. Такие шаблоны помогают извлекать связные фразы, а не разрозненные слова. Также правила применяются для фильтрации: например, можно отсеивать односложные слова, слова длиной < 3 символов, числительные, междометия и прочий «сор». Словари играют роль в распознавании особых категорий ключевых слов. Частный случай – список именованных сущностей (NER): названия брендов, персон, географий. В тексте обзора рынка слова типа «Apple», «Samsung» будут ключевыми, даже если упомянуты однажды – распознать их как бренд поможет либо готовая модель NER (например, spaCy или Natasha для русского выделяют именованные сущности), либо простые эвристики (например, в русском тексте слова на латинице длиной >2 символов почти всегда либо бренды, либо англоязычные термины). Ещё пример словарного подхода – тематические словари. Если мы заранее имеем перечень категорий и связанных терминов (скажем, категория «здоровье» включает слова врач, здоровье, болезнь, медицина, ЗОЖ и т.п.), то при анализе текста можно проверять вхождение этих терминов и сразу относить найденные ключи к категории. Это особенно актуально для построения семантического ядра сайта: часто оптимизаторы собирают базовый словарь тем, которые нужно покрыть, и проверяют, упомянуты ли они. Правила могут учитывать морфологию: например, в русском ключевые слова предпочтительно приводить к именительному падежу, единственному числу – так они выступают в форме нейтрального названия понятия. Лемматизация как раз решает эту задачу: «привычки, привычек, привычками» нормализуются к «привычка». При генерации списка ключевых слов инструмент может приводить слова к нормальной форме, чтобы объединить вариации. Однако иногда важна конкретная форма – например, запросы пользователей могут быть во множественном числе («купить ботинки» – слово ботинки во множественном, а лемма ботинок). Тут всё зависит от целей: для SEO обычно леммы достаточно, а для ASO/ASA – лучше хранить реальные популярные формулировки запросов. Правила полезны и для отсева мусорных кандидатов: можно иметь список стоп-слов не только общеязыковых, но и специфичных для домена. Например, при анализе отзывов слова типа «просто», «очень», «классно» могут часто встречаться, но не являются темой отзыва – их можно занести в стоп-лист. Таким образом, rule-based компоненты вносят лингвистическую осмысленность в алгоритм, дополняя статистику. Особенно в русском языке с богатым словоизменением без правил не обойтись: шаблоны позволяют правильно склеивать словоформы и извлекать цельные фразы.
Учет контекста и многозначности. Большой вызов при выделении семантического ядра – многозначные слова и зависимость значимости от контекста. Слово может быть частотным, но не ключевым в данном тексте. Например, слово «супер» может часто повторяться в рекламном посте (эмоциональная лексика), но само по себе не укажет ни на тематику продукта, ни на категорию – это фон, а не суть. Контекст помогает отличить такое шумовое слово от ключевого. Современные подходы стараются учитывать окружение: например, если слово «новое» постоянно употребляется перед другими существительными («новое приложение», «новое приложение», «новое» что-то), то отдельно «новое» смысла не имеет. Алгоритм может игнорировать прилагательные без существительных или понижать им вес, если они не образуют устойчивое сочетание. Другой аспект – дисамбигуация (WSD): слово «Python» в тексте про программирование и в тексте про животных – одно написание, но разные понятия. Здесь опять помогают векторы – контекстно-зависимые эмбеддинги различат эти случаи, и, скажем, KeyBERT для статьи про змей не предложит «язык Python» как ключевой термин. Ближайшее окружение слова часто решает, считать его ключевым или нет: наличие определений, упоминание в заголовке, повтор в нескольких частях текста. Например, если слово встречается только в одном абзаце и больше нигде, возможно, это частный эпизод, а не основная тема (если только этот абзац не ключевой вывод). Некоторые инструменты учитывают структурный контекст: отдельный вес словам из заголовков, подзаголовков, первых предложений (предполагая, что там концентрируется основная мысль). Проблему многозначности часто решают комбинацией методов: сначала лемматизируют (объединяя формы слова), а потом рассматривают статистику связей. Если лемма встречается во многих различных контекстах в тексте, возможно, она используется в общих выражениях (шум), либо имеет несколько значений – тогда алгоритм может не включать её в топ ключевых без дополнительной проверки. В дистрибутивной семантике для борьбы с этим применяют кластеризацию контекстов слова – но в рамках одного документа это сложно из-за малых данных. Практически, достаточно фильтровать слишком общие слова по заранее заданному списку (например, исключить из кандидатов слова «вещь», «дело», «время», если они не связаны с другими значимыми терминами). Итак, контекстный анализ – ключ к качественному семантическому ядру: слово важно не само по себе, а в связке с темой текста. Современные поисковые системы уже перешли от прямого подсчета ключевых слов к анализу смысла запросов и содержания (т.н. «контекстный поиск»). Поэтому инструменты семантического анализа текста тоже смещаются в сторону учета контекста: в 2024 году оптимизация контента подразумевает работу со смысловыми связями, и построение семантического ядра без понимания интентов пользователя теряет эффективность.
II. Классификация ключевых единиц
При построении семантического ядра полезно классифицировать найденные ключевые слова и фразы по их типу или роли. Это похоже на то, как SEO-специалисты делят запросы на группы. Рассмотрим основные типы ключевых единиц и как их распознать:
- Точные запросы (вербатим). Это полностью сформулированные ключевые фразы, зачастую многословные, которые явно соответствуют какому-то конкретному поисковому запросу пользователя или названию. Например, «подкаст доброе утро пробужденск» – это точное название подкаста (или передача конкретного названия контента). Точный запрос обычно сохраняется в семантическом ядре в исходной формулировке, так как любое изменение нарушит его смысл. Признаки: наличие кавычек или титульного написания в тексте, либо соответствие названию продукта, статьи, рубрики. Инструмент может выявлять их по капитализации (например, «Пора вставать» с заглавных букв) или по наличию в базе известных названий. Точные фразы – это те, которые не стоит разбивать или лемматизировать по отдельным словам, их ценность именно в фиксированном выражении.
- Неточные запросы (вариации, намерения). Сюда относятся ключевые фразы, которые передают суть запроса, но могут быть сформулированы по-разному. В SEO под неточными вхождениями понимают употребление ключевых слов не строго в заданной форме, а с изменением порядка, форм, добавлением слов. Пример: точный ключ для статьи – «купить смартфон недорого», неточное вхождение – «недорого купить новый смартфон». В нашем контексте – это фразы, близкие по смыслу к точным, либо содержащие ошибки/опечатки, либо усеченные. Например, «про утро» – очень общий, неполный запрос, который пользователь мог бы ввести, имея в виду что-то связанное с утром. Неточный запрос можно определить как нестрогую формулировку: возможно, пропущено главное слово или неясен объект. Алгоритмически можно распознавать такие единицы по тому, что они состоят из общих слов и предлогов без конкретики, либо по совпадению с вариацией другого, более точного ключа. В семантическом ядре имеет смысл пометить неточные запросы, чтобы потом либо уточнить их, либо отбросить (если они бессмысленны без контекста).
- Общие/жанровые темы. Это единичные слова или короткие фразы, обозначающие широкую тему, категорию. Например: «здоровье», «музыка», «технологии». Они дают общее представление о тематике, но сами по себе слишком широки. Такие слова часто высокочастотны и могут встречаться во множестве документов. Тем не менее, их наличие показывает, к какому жанру/сфере относится текст. В семантическом ядре общие темы обычно занимают верхние уровни иерархии (как суперкатегории). Их можно выявлять по очень высокой частотности в больших корпусах (то есть низкий IDF – общеупотребимые слова темы) при достаточно значимом употреблении в тексте. Например, слово «здоровье» само по себе очень общее, но если текст о ЗОЖ, его нужно включить как общую тему, дополненную более конкретными ключами. Отличить «просто частотное слово» от «общей темы» помогает знание онтологий или простая проверка: встречается ли слово как самостоятельный термин. Если «здоровье» фигурирует в тексте именно как тема (скажем, заголовок «Здоровье – это богатство»), то это явная тематическая категория.
- Брендовые запросы. Подразумеваются названия брендов, продуктов, организаций, персон, медиа – всего, что можно отнести к именованным сущностям. В примере: «дело восприятия» – может быть названием бренда (например, подкаст или проект с таким названием). Для брендовых ключей характерно, что они часто написаны с заглавной буквы или транслитом/латиницей в русском тексте. Их значимость не в частоте (бренд может упомянуться 1 раз, но быть крайне важным для содержания), а в том, что это уникальное имя. Автоматически такие ключи извлекаются либо через Named Entity Recognition (модели, обученные выделять имена собственные), либо через простые правила: слова, начинающиеся с большой буквы внутри текста; последовательности слов, каждое из которых с заглавной буквы (например, «Дело Восприятия» как имя). Также можно иметь справочник известных брендов. Брендовые запросы важно отделять, потому что их оптимизация и обработка часто особенная (например, для брендов иногда делают отдельные страницы, или учитывают конкурентность этих слов в SEO). В семантическом ядре брендовые ключи обычно помечаются флагом (brand) и могут образовывать свой кластер.
- Категория + подкатегория (иерархические связки). Это ключевые фразы, в которых одно слово обозначает широкую категорию, а другое – более узкую тему внутри нее. Например, условно «спорт футбол» (спорт – категория, футбол – подкатегория) или из приведенных: «здоровье успех». На первый взгляд, «здоровье успех» не совсем грамматически корректно, но предположим, речь о взаимосвязи здоровья и успеха – тогда здоровье можно считать общей темой, а успех – частным аспектом (успех в контексте здорового образа жизни). Другой пример: «маркетинг SMM» (общая область маркетинг, уточнение – SMM). Такие сочетания можно выявлять, если у нас есть ontological knowledge или хотя бы список категорий. Программно: проверить, относятся ли оба слова к заранее заданному списку категорий и субкатегорий. Если да – зафиксировать их связь. Если нет явного словаря, можно пытаться определить по контексту: например, если в тексте рядом часто встречаются два понятия разного уровня абстракции, возможно, они образуют иерархию. Классический SEO-подход – кластеризация ключевых слов по смыслу: близкие по теме запросы группируют, и чаще всего имя группы – это более общий термин. Категория+подкатегория – это по сути название группы (кластера) и одного из его элементов. В нашем случае, инструмент может строить древовидную структуру: верхний узел «здоровье», подузел «успех» в контексте здоровья. Выявление таких связок делает семантическое ядро структурированным, пригодным для организации контента (например, рубрикатора сайта).
- Категория + определение/характеристика. Это словосочетания, где к общей категории добавлено уточнение в виде прилагательного или описательного слова. Примеры: «полезные привычки» (категория привычки, характеристика полезные), «утренние привычки» (категория привычки, характеристика – относящиеся к утру). Такие ключи очень ценны, так как они более узкие, отражают конкретные интересы или аспекты темы. Как правило, это адъективные словосочетания (прилагательное + существительное) или существительное + существительное в роли определения («детокс программа» – где «детокс» выступает определением для «программа»). Выявляются эти фразы с помощью парсера частей речи: шаблон [ADJ + NOUN] или [NOUN + NOUN] в соответствующей форме. В русском нужно учесть согласование (adj+noun обычно стоят рядом, noun+noun могут быть в родительном падеже – «привычки утра» – но более естественно через прилагательное «утренние привычки»). Интересно, что «полезные привычки» и «утренние привычки» формально схожи (прилагательное+существительное), но несут разный тип характеристики: «полезные» – ценностная характеристика (хорошие vs плохие), «утренние» – временная/контекстуальная характеристика. В семантическом ядре можно различать эти подтипы, но обычно достаточно пометить их как расширенные ключи второго уровня. Они показывают конкретику темы и часто являются низкочастотными, но высокоцелевыми запросами в SEO (так называемые long-tail keywords). Наш инструмент должен стремиться извлекать такие фразы, даже если они встречаются разово, потому что за ними стоит понятный интент. Например, если текст – описание приложения для здоровых привычек, фраза «полезные привычки» может встретиться 1-2 раза, но по смыслу это ключевой термин, который следует включить в ядро.
Подводя итог классификации: выделяя ключевые единицы, полезно сразу распределять их по типам: вербатим-фразы, вариации, общие темы, бренды, иерархические связки, атрибутированные категории. Это позволит при использовании семантического ядра (например, для SEO-оптимизации) понимать, какую роль играет каждая фраза и как с ней работать. Такая классификация перекликается с практикой SEO: там тоже разделяют точные/неточные вхождения, высокочастотные общие запросы vs низкочастотные уточненные, навигационные (брендовые) vs информационные запросы и т.д..
III. Алгоритм построения семантического ядра
Теперь опишем поэтапно процесс формирования семантического ядра текста с учетом вышеописанных методов:
- Очистка текста и токенизация. На этом шаге исходный текст очищается от «шума»: удаляются HTML-теги, спецсимволы, нормализуются пробелы и т.п. Затем текст разбивается на токены (слова/слова из нескольких частей, числа). Для русского важно сохранить составные токены типа «всё-таки» как два слова или как одно? Обычно разбивают по пробелам и пунктуации, однако лучше использовать регулярное выражение для выделения слов (напр. \b\w+\b), чтобы учитывать слова с дефисом, цифры как отдельные токены при необходимости. Также уже на этом этапе можно убрать токены, состоящие только из цифр, или, скажем, оставить их если нужны (например, год 2023 может быть ключевым). В нашем инструменте минимальная длина токена задана 2 символа, чтобы отсечь одиночные буквы. Результат этапа – список слов (в исходной форме или нижнем регистре, часто для унификации переводят в lowercase).
- Лемматизация и нормализация. Каждый токен приводится к нормальной форме (лемме). Для русского это важно: «привычки», «привычек», «привычка» → лемма «привычка». Лемматизация сокращает разнообразие форм и объединяет контекст употребления слова. Библиотеки: pymorphy2, Mystem, Natasha, spaCy – позволяют получить лемму и часть речи. Дополнительно, нормализация включает приведение слов к единому регистру (если не сделано), приведение, например, всех цифр к специальному токену [NUM] (если цифры не важны по значению) или транслитерацию, если нужно. На этом же этапе удобно выкинуть стоп-слова – по списку (в нашем инструменте это список из ~50 самых частых служебных слов). Можно убирать их сразу, чтобы не мешали дальнейшему анализу. Но иногда стоп-слова нужны внутри фраз (напр. «Игра на выживание» – стоп-слово «на» входит в название). В практике ключевого анализа часто поступают так: при выделении одиночных ключей стоп-слова исключаются, а при сборе фраз – используют стоп-слова как разделители, но сама фраза составляется из значимых слов вокруг них. В итоге после этого шага мы получаем последовательность лемм значимых слов.
- Извлечение кандидатов ключевых единиц (n-грамм). Здесь мы составляем всевозможные кандидаты на ключевые слова/фразы. Обычно рассматривают униграммы (отдельные слова), биграммы, триграммы, иногда 4-граммы. Больше 4 редко имеет смысл, т.к. длинные фразы либо редки, либо уже целые предложения. Алгоритм: пройтись по списку лемм и собрать все последовательности длины 2,3,4. При этом применяются фильтры:
- Отбросить n-грамму, если она начинается или заканчивается стоп-словом (то есть фраза не должна иметь «лишних» слов с краев, напр. «и здоровый» или «здоровый и» не годятся, останется просто «здоровый»).
- Опционально: требовать, чтобы n-грамма встречалась более одного раза для уверенности (наш алгоритм именно так и делает для 2-4-грамм: учитывает только фразы с ≥2 повторениями). Это снижает ложноположительные единичные сочетания.
- Можно также ограничить, чтобы все слова в n-грамме были значимыми (не стоп-словами), что мы и делаем (пропуская фразы со стоп-словами на концах, а внутри фразы стоп-слово автоматически разделит фразу на части).
- Отбросить n-грамму, если она начинается или заканчивается стоп-словом (то есть фраза не должна иметь «лишних» слов с краев, напр. «и здоровый» или «здоровый и» не годятся, останется просто «здоровый»).
- Помимо подряд идущих слов, иногда рассматривают непрерывные словосочетания, но это усложняет дело. Проще потом уже объединять близкие по смыслу через эмбеддинги.
После сбора n-грамм подсчитывается частота каждой (сколько раз встретилась). Одновременно собираем список уникальных лемм-слов (униграмм) с их частотами. Однако лучше не просто лемм, а с учетом значимости: мы можем, например, взять только существительные и именованные сущности в качестве кандидатов одиночных ключей (в коде: выбираются леммы, если исходное слово – существительное или бренд на латинице). Это отсеет множество глаголов и прилагательных, которые вне контекста мало что значат. Например, глагол «есть» (кушать) сам по себе не ключевой, пока не привязан к теме. Часто ключевыми бывают именно существительные/имена – они обозначают объекты, понятия. Поэтому отдельно собираем словарь всех существительных (и брендов) с их формами и частотами.
В итоге кандидаты у нас двух видов:- многословные фразы (2-4 граммы) с частотой ≥2,
- одиночные леммы-существительные с частотой ≥2 (как потенциальные ключевые слова).
- многословные фразы (2-4 граммы) с частотой ≥2,
- Если текст небольшой и повторов мало, может оказаться, что кандидатов почти нет (все фразы уникальны). Тогда придётся ослабить пороги (например, брать и единичные вхождения) – в коде у нас предусмотрен fallback: если топ-N не набран, добавляются однословные леммы с freq ≥1.
- Оценка релевантности и ранжирование. На этом шаге каждому кандидату присваивается вес (score) – насколько он важен для текста. Методы оценки могут быть разные или комбинироваться:
- Частотный балл: просто частота появления или процент от общего словаря. В примитивном варианте топ ключей – это топ-N по частоте. Мы уже это применили как грубый фильтр (freq≥2). В небольших текстах чистая частота малоинформативна (слово могло часто повторяться случайно или стилистически).
- TF-IDF балл: если у нас есть внешний корпус или хотя бы IDF-словарь по большому количеству текстов, можно вычислить TF-IDF для каждого кандидата. То есть умножить частоту в этом тексте на IDF (обратную частоту по корпусу). Это поднимет вес специфических терминов. В нашем инструменте, например, рассчитывается semantic_density_score – суммарный вес всех ключевых лемм через IDF. Для ранжирования отдельных кандидатов тоже можно использовать IDF: например, слово «гаджет» может встретиться 2 раза – не суперчасто, но IDF у него высокий (не очень распространенное), значит, это важный термин в тексте.
- Позиционный вес: можно повышать вес кандидатов, встретившихся в заголовке, в первом предложении, в заголовках разделов. Например, если фраза появляется в Title текста, ей сразу дать +N к скору. Многие SEO-анализаторы так делают: ключи из title/h1 и подзаголовков помечаются как главные.
- Скоринг RAKE-подобный: для мультисловных фраз можно суммировать степени слов (как в RAKE) или использовать коэффициенты, снижающие вес слишком длинных или слишком коротких фраз. Наш алгоритм, например, сортирует кандидатов по убыванию частоты и длины, затем удаляет вложенные дубли (если фраза входит в состав другой более частой фразы), а потом обрезает по топ-N. Это тоже своего рода ранжирование: при равной частоте более длинная фраза ценнее (конкретнее), при прочих равных – берем ту, что встречалась чаще.
- Embedding proximity (семантическая близость): самый продвинутый способ – вычислить эмбеддинг для каждого кандидата (например, усреднить эмбеддинги его слов, или взять специальную модель для фраз) и сравнить с эмбеддингом всего текста. Как упоминалось, cosine similarity между вектором фразы и вектором текста даст меру «насколько фраза отражает содержание». Кандидаты можно отсортировать по этому сходству. Этот метод способен выявить ключи с единичной частотой, если они по смыслу центральны. Например, слово «нейросеть» может упоминаться один раз в тексте, но весь текст о технологиях ИИ – тогда вектор текста будет близок к вектору «нейросеть», и алгоритм выделит его. Реализация: использовать модель типа BERT (например, многозадачный трансформер Sentence-BERT для получения sentence embedding). В практических инструментах (тот же KeyBERT) после получения кандидатов по частоте делают rerank по косинусному сходству с документом.
- Graph rank (TextRank): можно построить граф кандидатов (если кандидаты – отдельные слова, то как в TextRank, если фразы – можно граф фраз через пересечение по словам) и запустить алгоритм PageRank для ранжирования. Но в современных реализациях это используется реже.
- Частотный балл: просто частота появления или процент от общего словаря. В примитивном варианте топ ключей – это топ-N по частоте. Мы уже это применили как грубый фильтр (freq≥2). В небольших текстах чистая частота малоинформативна (слово могло часто повторяться случайно или стилистически).
- В итоге, мы получаем список ключевых единиц, отсортированный по убыванию предполагаемой значимости. В нашем простом алгоритме сочетались частотный подход (≥2) и удаление вложенных фраз для чистоты. В улучшенном варианте на этом этапе разумно: (a) объединить близкие по смыслу кандидаты (кластеризация или схлопывание синонимов), (b) отранжировать по сочетанию метрик (например, составной скор = TF-IDF + коэффициент*семантическая близость). Если требуется строго определенное количество, берем топ-K.
- Классификация ключей по типам. После получения упорядоченного списка ключевых слов/фраз имеет смысл каждому присвоить метку типа (из Section II). Это в основном выполняется правилами:
- Если фраза состоит из ≥2 слов и полностью соответствует оригинальному фрагменту текста (особенно если встречается в кавычках или как название) – отмечаем как точный (verbatim) запрос.
- Если фраза содержит опечатки, разговорные формы или выглядит неполной – можно пометить как неточный/размытый запрос. Например, если в списке ключей оказалось одиночное слово «утро» или фраза «про утро», которая сама по себе не раскрывает тему, – это кандидат на неточный/общий.
- Проверка по словарю брендов/имен: если ключ совпадает с именем бренда/персоной (или начинается с заглавной буквы, что нетипично для начала предложения) – помечаем как брендовый ключ. Например, ключ «Apple музыка» – можно разделить: Apple как бренд, музыка как категория.
- Шаблоны POS: если шаблон [NOUN NOUN] с общим-частным (например, первое слово из списка общих тем, второе часто совместно упоминается с первым) – отмечаем как категория+подкатегория. Можно использовать иерархический словарь или даже простую эвристику: сравнить IDF двух слов – у одного очень низкий (широкое понятие), у другого повыше – скорее всего первое шире второго.
- Шаблон [ADJ NOUN] – это кандидаты на категория+характеристика. Их можно разделить по типу прилагательного (качественное, относительное, притяжательное) если очень нужно, но в общем достаточно знать, что это уточненная категория.
- Одиночные Noun с высоким IDF – это чаще всего конкретный тематический термин (можно считать тоже как базовая категория или подкатегория).
- Если фраза содержит имя собственного + нарицательное (например «Apple смартфон»), можно и то, и то пометить: бренд + подкатегория.
- Если фраза состоит из ≥2 слов и полностью соответствует оригинальному фрагменту текста (особенно если встречается в кавычках или как название) – отмечаем как точный (verbatim) запрос.
- Таким правилом набор пополняется. Результат этого шага – ключевые единицы с типами (можно в итоге представлять ядро как помеченный список или разбить по группам).
- Построение структуры и визуализация (опционально). Семантическое ядро можно представить просто списком (отсортированным), а можно структурировать. Например, сделать древовидную диаграмму: вершина – общая тема, ветви – под темы, листья – конкретные запросы. В SEO для сайта часто строят mind map или таблицу, где ключевые слова сгруппированы по кластеру и каждому кластеру соответствует целевая страница. Для одного текста можно, например, выделить 2-3 основные темы (по самым частотным общим словам), а под ними разложить более узкие фразы. Визуально это может быть граф связей (nodes = keywords, edges = совместная встречаемость или близость). Если инструмент предназначен для редактора, можно встроить подсветку ключевых слов в тексте, или облако тегов, где размер слова ~ важности. Также полезно представить метрики: напротив каждого ключа % от текста, TF-IDF или score. На уровне алгоритма на этом шаге происходит скорее форматирование вывода. Например, для отчета SEO можно вывести:
- Топ-10 ключевых фраз (семантических) с частотой и долей,
- Топ-20 частотных слов (без стоп-слов) – для справки,
- Семантический граф или карту.
- Топ-10 ключевых фраз (семантических) с частотой и долей,
- Если нужна кластеризация по смыслу – можно взять эмбеддинги ключей и выполнить кластеризацию (k-means или иерархическую) чтобы автоматически сгруппировать близкие термины. Это поможет построить иерархию, если нет готового словаря.
Шаги 1-4 выполняются для извлечения кандидатов и их оценки, шаг 5-6 – для представления результатов в удобной форме. Конкретная реализация может варьироваться: например, можно сначала получить множество кандидатов любым простым способом (TF-IDF + YAKE), а затем отправить их в языковую модель (LLM) с вопросом: «какие из этих слов наиболее характеризуют текст?». Но это уже гибридный AI-подход, требующий доступа к LLM. В традиционном pipeline, описанном выше, мы постепенно сужаем множество слов до семантического ядра.
IV. Примеры и тестовые кейсы
Рассмотрим, как наше семантическое ядро строится на разных типах текстов, и сравним с результатами существующих инструментов:
- Пример 1: Рекламный пост в соцсети (короткий, эмоциональный текст). Допустим, текст – промо-пост о приложении для утренних тренировок, 500 символов, с упором на эмоции: «Каждое утро – новый шаг к идеальному телу! Приложение FitLife – ваш личный тренер. Просыпайтесь вместе с нами…» и т.д.
- Advego/Text.ru: дадут плотность слов: вероятно, самыми частыми будут слова «утро», «новый», «приложение», «тренер». Они укажут % воды (воду составят слова «каждое», «с», «и», …) и возможно покажут ключевые фразы, но скорее всего из-за малого объема там мало повторений. Инструмент может посчитать «идеальному телу» как фразу (2 слова, повтор «телу» 1 раз – нет, не покажет по freq). В итоге частотный анализ выдаст: «утро (2 вхождения, 2%)», «приложение (1)», «тренер (1)», «тело (1)».
- Для коротких рекламных текстов частотные методы неэффективны – ключевые смыслы выражены через контекст и единичные фразы. Методы на основе эмбеддингов и шаблонов лучше: они вытащат ключевые сообщения («утро», «личный тренер», «FitLife»). Advego/Text.ru здесь почти бесполезны, кроме как показать, что «воды» не слишком много. KeyBERT или YAKE дадут осмысленные ключевые фразы даже для короткого текста.
- Advego/Text.ru: дадут плотность слов: вероятно, самыми частыми будут слова «утро», «новый», «приложение», «тренер». Они укажут % воды (воду составят слова «каждое», «с», «и», …) и возможно покажут ключевые фразы, но скорее всего из-за малого объема там мало повторений. Инструмент может посчитать «идеальному телу» как фразу (2 слова, повтор «телу» 1 раз – нет, не покажет по freq). В итоге частотный анализ выдаст: «утро (2 вхождения, 2%)», «приложение (1)», «тренер (1)», «тело (1)».
- Пример 2: Описание приложения в сторе (ASO, средний объем, конкретика). Текст в App Store: ~1000 знаков, перечисляются функции приложения «FitLife: просыпайся правильно – …». Обычно такие описания содержат ключевые слова осознанно (для поиска). Предположим, там есть фразы: «утренние упражнения», «будильник с тренировкой», «здоровые привычки», «статистика сна», «персональный план» и т.д.
- Advego/Text.ru: выделят часто повторяемые термины, допустим «тренировка» (встретилось 5 раз), «сон» (3 раза), «утренний» (3 раза), «будильник» (2 раза). Они покажут процент заспамленности (если слово повторено слишком часто, например «утро» 10 раз – укажут переспам). Эти инструменты могут помочь автору не перестараться с повторами, но не скажут, все ли важные ключи охвачены.
- Наш алгоритм: извлечет конкретные составные ключи: «утренние упражнения», «здоровые привычки», «статистика сна», «будильник с тренировкой» – все они, скорее всего, по разу, но очень релевантны. Благодаря n-граммам и тому, что мы не требуем множественных повторов для output (мы можем ослабить порог для таких текстов), мы их включим. По одиночным словам, конечно, тоже будут: «сон», «будильник», «тренировка», «утро». Но ценность – именно в фразах, так как в поиске App Store люди будут вводить подобные сочетания («утренние упражнения»).
- В описаниях (ASO) важно охватить релевантные сочетания, даже если они мало повторяются. Наш инструмент с опорой на семантику обеспечит это. В то же время, он проконтролирует и частоту: если слово «фитнес» вообще не упоминается, а для категории надо бы, то его не будет в ядре – сигнал, что стоит добавить. Здесь можно дополнить: сравнить с конкурирующими приложениями, но это уже другое.
- Advego/Text.ru: выделят часто повторяемые термины, допустим «тренировка» (встретилось 5 раз), «сон» (3 раза), «утренний» (3 раза), «будильник» (2 раза). Они покажут процент заспамленности (если слово повторено слишком часто, например «утро» 10 раз – укажут переспам). Эти инструменты могут помочь автору не перестараться с повторами, но не скажут, все ли важные ключи охвачены.
- Пример 3: Информационный текст (статья, блог-пост ~5000 знаков). Допустим, статья «10 полезных привычек для успешного утра». Объем большой, раскрываются разные привычки, упоминаются исследования, бренды (например, методика Помодоро, книга «Магия утра»).
- Advego/Text.ru: на таком тексте дадут статистику: 1000 слов, «вода 15%», тошнота (наверняка слово «утро» встречается много, посчитают тошноту). Выведут топ-слова: «привычки» (15 раз, 1.5%), «утро» (10 раз, 1%), «день» (8 раз), «зарядка» (5 раз) и т.п. Возможно, покажут повторяющиеся 2-словные фразы: если часто фигурирует «полезные привычки» (каждый совет заголовок содержит), то это словосочетание будет x10 раз – его точно увидим. Но у этих сервисов обычно нет интеллектуальной группировки – просто частотность.
- Advego/Text.ru: на таком тексте дадут статистику: 1000 слов, «вода 15%», тошнота (наверняка слово «утро» встречается много, посчитают тошноту). Выведут топ-слова: «привычки» (15 раз, 1.5%), «утро» (10 раз, 1%), «день» (8 раз), «зарядка» (5 раз) и т.п. Возможно, покажут повторяющиеся 2-словные фразы: если часто фигурирует «полезные привычки» (каждый совет заголовок содержит), то это словосочетание будет x10 раз – его точно увидим. Но у этих сервисов обычно нет интеллектуальной группировки – просто частотность.
Анализ ложноположительных результатов. Ложноположительные – это случаи, когда включено слово/фраза, не являющаяся реально ключевой. Чаще всего:
- Слова-пустышки с точки зрения смысла: мы о них говорили (типа «новый», «очень», «всё»). Они могут пролезть, если недостаточно фильтрации. Наш алгоритм с ними успешно борется (стоп-слова, только существительные и т.д.).
- Часть фразы, вырванная без контекста: например, RAKE вернул «эффективная» отдельно, потому что оно часто перед разными существительными – но «эффективная» само ничего не значит. Наш подход решает это тем, что не берет прилагательное без существительного (нужна пара).
- Слишком общий термин, не специфичный для данной темы: напр. слово «время» в статье про утренние привычки – ну время упоминается, но не ключевое понятие статьи. Может попасть по частоте. Мы снижаем вес общим словам через IDF и понижаем однословные без контекста.
- Термин из побочной темы: в статье был пример про спорт, упомянули «футбол» один раз – алгоритм с эмбеддингами скорее всего не выберет «футбол» (потому что не близок ко всему остальному тексту). Но чисто по частоте он равен другим единичным – тут преимущество семантического ранжирования явное.
- Неправильно распознанная сущность: например, модель NER решила, что «Красные ватные одеяла» – это бренд «Красные» 🙂. Такое может быть. Поэтому бренд-словари надо проверять, а NER – дополнять правилами (если оба слова с большой буквы – вероятно название целиком, а не первое слово бренд второе слово категория).
- В автоматической классификации могут быть и ошибки: скажем, фраза «дело восприятия» – алгоритм может не знать бренд и решит: два существительных – это категория+подкатегория. Хотя на самом деле это название подкаста (бренд). Тут поможет встроенный словарик брендов или просто факт, что оно с большой буквы писалось в тексте.
Частотные методы (Advego/Text.ru) дают базу и нужны для проверки плотности, но упускают смысловые нюансы. Графовые алгоритмы (RAKE/TextRank/YAKE) лучше охватывают фразеологию текста, но требуют настроек и тоже не «понимают» смысла. Векторные (KeyBERT) – понимают смысл, но могут нуждаться в контроле разнообразия результата. Лучший результат достигается комбинацией: использовать частотность и позиции как фильтр кандидатов, затем эмбеддинги для ранжирования и группировки.
V. Потенциальные применения
Сформированное семантическое ядро текста находит применение во многих областях:
- SEO (Search Engine Optimization) и контент-маркетинг. Семантическое ядро страницы позволяет оптимизатору проверить, покрыты ли в тексте все важные запросы по теме, нет ли «дырок». На основе ядра выбирают, под какие ключи продвигать страницу. Также ядро помогает в кластеризации запросов: решается, какие группы запросов отдать на одну страницу, а какие разделить. Инструмент автоматического выделения ядра ускоряет работу SEO-специалиста, выделяя из текста его основную тематику и терминологию. Кроме того, сравнив ядро страницы с ядром топ-страниц конкурентов, можно выявить, каких ключей не хватает (так называемый gap-анализ). Для новых сайтов семантическое ядро – вообще отправная точка всей структуры сайта, и автоматизация тут крайне полезна.
- ASO (App Store Optimization) и ASA. В описаниях приложений, релиз-нотах, ключевых словах для стора важно употребить релевантные термины, по которым пользователи ищут приложения. Инструмент поможет вытащить из описания явные ключевые слова, а также выявить дополнительные (можно интегрировать с Wordstat: по найденным ключам сразу получать частотность в поиске маркетов). Например, для игры выявим: жанр, особенности (шутер, онлайн, PvP), и убедимся, что они прописаны. В Apple Search Ads семантическое ядро приложения помогает подобрать ключевые слова для рекламных кампаний. То есть, разобрав описание и отзывы, можно собрать массив релевантных слов, на которые имеет смысл давать объявления.
- Автоматизированная редактура и оценка качества текста. Редакторы используют такие инструменты, как Главред (стилистика) и Прототип (лексика). Семантический анализ добавляет еще одно измерение – о чем этот текст и соответствует ли он заданному ТЗ. Например, можно сравнить семантическое ядро текста с темой, которую должен был раскрыть автор. Если в ядре отсутствуют ключевые понятия, которые по идее должны быть, редактору это сигнал. Также можно проверять на соответствие интенту: если статья заявлена как ответ на вопрос, а ядро содержит много посторонних тем – значит, текст ушел в сторону. Автоматически можно подсветить слова, не относящиеся к теме, т.е. потенциально «воду». Это сложнее, но попытки ведутся. Проще – контролировать содержание: например, требование «в тексте про продукт Х должны быть упомянуты его функции А, Б, В» – инструмент проверит, есть ли А, Б, В в ядре. Если нет – возможно, автор забыл, и нужно дописать.
- Семантическая оптимизация рекламы. В контекстной рекламе (Google Ads, Яндекс Директ) и таргетированной рекламе подбор ключевых слов для объявления и для страницы влияет на качество трафика. Семантическое ядро лендинга помогает составить релевантное объявление (использовать те же формулировки, что на странице, чтобы повышать Quality Score). Наоборот, анализ семядра объявлений, которые срабатывают, позволяет оптимизировать текст лендинга под них. В RTB-рекламе (programmatic) бывает полезно делать семантический профиль страницы для сопоставления с профилем пользователя или товара – чтобы решать, подходит ли этот сайт для показа данного объявления (semantic targeting).
- Формирование тематики канала/сайта/подкаста. Анализируя семантические ядра множества текстов (статей сайта, выпусков подкаста), можно понять, какие темы чаще всего поднимаются, какие редкие. Например, для блога можно собрать все ключевые слова всех статей и построить общую карту тем. Это показывает сильные стороны (о чем мы много пишем) и пробелы (темы, которые логично ожидать, но у нас контента мало). Также, при планировании контент-стратегии, семантическое ядро помогает генерировать новые идеи: зная, какие связанные запросы есть у пользователей, но не покрыты текущим контентом, можно создавать материалы под них. Для подкастов – анализ выпуска может подсказать, какие ключевые слова поставить в описание, теги, чтобы было лучше SEO и чтобы слушатели сразу понимали, о чем выпуск.
- Сегментация аудитории и semantic matching в рекламе. Это более продвинутый кейс – когда по семантическому содержанию текста или запроса пытаются найти соответствие с другим текстом или профилем. Например, есть баннер с объявлением, к которому прикреплен список ключевых слов (семантическое ядро баннера – то, что он рекламирует). Когда возникает вопрос, на каких сайтах размещать баннер, система может анализировать семантическое ядро страниц и сравнивать с ядром баннера: если схоже – значит аудитория страницы увидит релевантный баннер (более нативная реклама). Другой случай – матчинг подкастов с рекламодателями: зная семантику подкаста (темы выпуска) и семантику бренда (ключевые слова из их маркетинговых материалов), можно подобрать подходящий выпуск для интеграции. В целом, когда нужно сопоставить два текста по смыслу, полезно сравнить их ключевые слова/фразы. Наш инструмент тут выступает как генератор смыслового профиля.
Наконец, отмечу, что пока мы ориентировались на русский язык. В будущем, расширение на другие языки потребует замены морфологического анализатора и стоп-слов, но основные принципы останутся. Семантическое ядро ценно в любой языке, где есть значимая лексика. Просто в языках типа английского меньше проблем с морфологией (нет падежей – легче токенизировать, но больше фразеологизма типа phrasal verbs), а в агглютинативных языках (финский, турецкий) – свои нюансы. Поэтому многоязычная реализация должна опираться на универсальные компоненты (например, multilingual BERT для эмбеддингов и polyglot or spacy models for morphology).
Глубокое исследование и комплексный подход к построению семантического ядра позволяют создать инструмент, значительно превосходящий простые счетчики слов. Совмещение лингвистических правил, статистики и современных моделей дает возможность автоматически понимать, о чем текст говорит, и выделять ключевые темы так, как это сделал бы эксперт-лингвист. Это экономит время в SEO и аналитике контента, повышает качество оптимизации и открывает новые способы работы с текстами (например, семантический поиск и сопоставление). В разных случаях лучше работают разные методы – поэтому наш инструмент комбинирует их, чтобы в каждом случае дать достойный результат.
Приложения (код)
Словарь категорий и синонимов (пример): можно задать в виде Python-словаря, где ключ – общая категория, значение – список терминов. Например:
CATEGORIES = {
“здоровье”: [“здоровье”, “медицина”, “здоровый образ жизни”, “ЗОЖ”],
“спорт”: [“спорт”, “фитнес”, “тренировка”, “exercise”],
“питание”: [“питание”, “еда”, “рацион”, “диета”]
}
- При анализе текста, каждое найденное ключевое слово можно проверять, не входит ли оно в какой-либо из списков. Это поможет автоматически пометить, что, скажем, «полезные привычки» относится к категории здоровье (потому что содержит слово «здоровый» или связано с образом жизни). Такой словарь составляется экспертно под задачи (например, для тематики психология – свой набор категорий). Для мультиязычности словарь может быть расширен: ключи – языки, или значения – тоже словари по языкам.
Список стоп-слов (фрагмент): для русского уже приведен в коде инструмента. Он включает предлоги, союзы, частицы и другие частые слова:
STOPWORDS_RU = {“и”, “в”, “не”, “что”, “на”, “с”, “со”, “как”, “а”,
“то”, “все”, “так”, “но”, “по”, “только”, “оно”, “это”, …}
- Для других языков нужны свои списки (например, NLTK предоставляет многие). При желании можно дополнять: например, для SEO часто добавляют в стоп-слова общие прилагательные типа «новый», «лучший», если они мешают.
- Шаблоны структур (регулярные выражения): Можно использовать regex для быстрого обнаружения некоторых ключевых конструкций:
- Шаблон для ADJ+NOUN (рус.): r”\b([А-ЯЁA-Z]?[а-яёa-z]+)\s+([А-ЯЁA-Z]?[а-яёa-z]+)\b” с проверкой через POS-теггер, конечно, надежнее. Но грубо – две последовательные словоформы.
- Шаблон для именованных сущностей (бренд именуется двумя словами, оба с заглавной): r”\b[А-ЯЁ][а-яё]+\s+[А-ЯЁ][а-яё]+\b”.
- Шаблон для англ. слова внутри рус. текста: r”[A-Za-z]{3,}” – латиница длиной ≥3.
- Если нужно найти конструкции типа «X для Y» (указание назначения) – regex: \b(\w+)\s+для\s+(\w+)\b. Например, «чай для похудения» – выделим фразу «для похудения» как признак целевой темы.
- Шаблон для ADJ+NOUN (рус.): r”\b([А-ЯЁA-Z]?[а-яёa-z]+)\s+([А-ЯЁA-Z]?[а-яёa-z]+)\b” с проверкой через POS-теггер, конечно, надежнее. Но грубо – две последовательные словоформы.
- В коде же лучше использовать синтаксический разбор: парсер позволяет найти зависимые слова (adjectival modifier + noun и т.д.).
Пример использования KeyBERT (код):
from keybert import KeyBERT
text = “Приложение FitLife – ваш личный тренер для бодрого утра и здоровых привычек.”
model = KeyBERT(‘sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2’)
keywords = model.extract_keywords(text, keyphrase_ngram_range=(1, 2), stop_words=None, top_n=5)
print(keywords)
# Возможный вывод:
# [(‘бодрого утра’, 0.697), (‘здоровых привычек’, 0.689), (‘личный тренер’, 0.615), (‘FitLife’, 0.602), (‘приложение’, 0.560)]
- Здесь мы получаем топ-5 ключевых фраз с их релевантностью. Видно, что двухсловные фразы из конца предложения стали лидерами (что логично). FitLife извлечен несмотря на то, что это имя и один токен – модель всё равно включила, распознав как важное слово в контексте.
Интегральный расчет SD-score (из кода):
def semantic_density_score(text):
tokens = tokenize(text)
words = len(tokens)
lemma_counts = Counter(morph.parse(t)[0].normal_form for t in tokens if morph.parse(t)[0].tag.POS == “NOUN”)
score = 0
for lemma, cnt in lemma_counts.items():
idf = IDF.get(lemma, 1.0)
score += idf * cnt
return score / words
- Это показывает, как по леммам-существительным и словарю IDF вычисляется некое обобщенное значение «семантической насыщенности» текста ключевыми словами. В практике SEO подобные метрики используют, чтобы сравнить текст с конкурентами: низкий SD-score может означать, что в тексте мало целевых терминов (он получился «водянистым»), а слишком высокий – возможно переспам. У нас IDF-словарь должен быть заранее подготовлен, например на базе новостей или корпусе сайтов по тематике.
В целом, приведенные кодовые фрагменты иллюстрируют, как можно реализовать части алгоритма. Полный инструмент сводит все вместе: парсинг текста, генерация ключей, расчет метрик, классификация. Его модульная структура позволит подменять компоненты (например, для другого языка – подключить иной лемматизатор и стоп-слова, для другой задачи – настроить правила классификации).Таким образом, глубокое семантическое ядро формируется на стыке лингвистики и современных методов машинного обучения, что дает качественный скачок по сравнению с наивным частотным анализом. Используя описанные теории, алгоритмы и инструменты, мы можем построить систему, которая автоматически, быстро и точно вычленяет из текста его «смысловой скелет» – те самые слова и фразы, вокруг которых вращается весь смысл. Это ценно для оптимизации и анализа контента в самых разных приложениях, перечисленных выше. Такое исследование и разработка закладывают фундамент для универсального аналитического инструмента, который в будущем сможет работать с текстами на любом языке и для любых целей семантического поиска и организации знаний.