SEMANTICKEYPHRASETABLE: примеры (SQL)

Работа с SEMANTICKEYPHRASETABLE для анализа текста в SQL Server
Раздел: Функции для работы с диаграммами сходства, Семантический поиск
SEMANTICKEYPHRASETABLE(table, column [, source_key]): table

Описание функции SEMANTICKEYPHRASETABLE

Функция SEMANTICKEYPHRASETABLE входит в состав компонента полнотекстового и семантического поиска Microsoft SQL Server. Ее основная задача заключается в извлечении ключевых фраз из текста, хранящегося в указанном столбце таблицы. Эти фразы представляют собой наиболее релевантные и значимые словосочетания в тексте, что полезно для автоматического реферирования, анализа тональности, категоризации и улучшения поиска.

Функция используется в запросах SELECT в предложении FROM как возвращающая табличное значение (table-valued function). Ее применение актуально в системах анализа документов, новостных лент, отзывов пользователей или любой другой текстовой информации, где требуется выявить основные темы.

Аргументы функции

  • table: Имя таблицы или представления, содержащей столбец с индексированным текстом. Указывается в формате database_name.schema_name.table_name.
  • column: Имя индексированного столбца, из которого извлекаются ключевые фразы. В столбце должен быть настроен семантический индекс.
  • key_column: Имя уникального ключевого столбца таблицы (обычно первичный ключ).
  • source_key: (Необязательный) Конкретное значение ключевого столбца (key_column). Если указано, функция возвращает ключевые фразы только для строки с этим значением. Если аргумент опущен, возвращаются фразы для всех строк в таблице или представлении.

Возвращаемые значения

Функция возвращает таблицу с тремя столбцами:

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

Примеры использования SEMANTICKEYPHRASETABLE

Пример с указанием конкретного документа (source_key).

SELECT TOP 5 keyphrase, score, document_key
FROM SEMANTICKEYPHRASETABLE
    (
        dbo.Articles,
        ArticleText,
        ArticleID,
        105 -- ID конкретной статьи
    ) AS SP
ORDER BY score DESC;
keyphrase               score                  document_key
----------------------- ---------------------- ------------
анализ данных          0.618347227573395      105
машинное обучение      0.52203232049942       105
большие данные         0.455123722553253      105
SQL Server             0.389455050230026      105
облачные вычисления    0.30123457312584       105

Пример получения ключевых фраз для всех документов в таблице.

SELECT TOP 10 SKP.keyphrase, SKP.score, SKP.document_key, A.Title
FROM SEMANTICKEYPHRASETABLE
    (
        dbo.Articles,
        ArticleText
    ) AS SKP
INNER JOIN dbo.Articles AS A ON SKP.document_key = A.ArticleID
ORDER BY SKP.score DESC;
keyphrase        score       document_key Title
---------------- ----------- ------------ --------------------------
кибербезопасность 0.7501234  204          Угрозы нового десятилетия
искусственный интеллект 0.69845 105      Будущее ИИ
отладка кода      0.512389   156          Советы разработчикам
...               ...         ...         ...

Похожие функции MS SQL

  • FREETEXTTABLE: Осуществляет полнотекстовый поиск по смыслу, а не по точному совпадению слов. Возвращает релевантные строки и оценку релевантности. Используется, когда нужно найти документы по неструктурированному запросу, но не требуется извлекать ключевые фразы из самих документов.
  • CONTAINSTABLE: Выполняет точный или взвешенный полнотекстовый поиск с использованием сложных условий (NEAR, AND, OR). Возвращает совпадающие строки. Предпочтительна для точного поиска терминов, фраз, синонимов или слов в определенной близости друг от друга.
  • SEMANTICSIMILARITYTABLE: Функция семантического поиска, которая находит документы, семантически похожие на указанный документ. Возвращает идентификаторы похожих документов и оценку сходства. Используется для рекомендаций "похожие документы".

Выбор функции зависит от задачи: SEMANTICKEYPHRASETABLE извлекает ключевые фразы из текста, SEMANTICSIMILARITYTABLE ищет похожие документы, а FREETEXTTABLE и CONTAINSTABLE предназначены для поиска документов по запросу.

Аналоги в других СУБД и языках

Прямых встроенных аналогов SEMANTICKEYPHRASETABLE в других СУБД обычно нет, так как это специализированная функция семантического анализа. Однако существуют альтернативные подходы и расширения.

PostgreSQL (с расширением ts_stat или сторонними библиотеками): Извлечение часто встречающихся словосочетаний.

SELECT word, ndoc, nentry FROM ts_stat('SELECT to_tsvector(''simple'', body_text) FROM articles') ORDER BY nentry DESC LIMIT 5;
word        | ndoc | nentry
------------+------+--------
данных      | 45   | 120
программирования | 32   | 98
...         | ...  | ...

Python (библиотеки NLP, например, spaCy, rake-nltk, yake): Гибкое извлечение ключевых слов вне СУБД.

import yake
text = "Статья о машинном обучении и анализе данных..."
kw_extractor = yake.KeywordExtractor()
keywords = kw_extractor.extract_keywords(text)
for kw, score in keywords[:3]:
    print(f"{kw}: {score}")
машинное обучение: 0.023
анализ данных: 0.045
нейронные сети: 0.098

Oracle Text: Использует компонент CTX_DOC для анализа. Функция CTX_DOC.THEMES извлекает основные темы, что концептуально ближе.

DECLARE
  themes CTX_DOC.THEME_TAB;
BEGIN
  CTX_DOC.THEMES('news_index', '123', themes);
  FOR i IN 1..themes.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE(themes(i).theme || ' ' || themes(i).weight);
  END LOOP;
END;

Ключевое отличие MS SQL функции — ее глубокая интеграция в ядро СУБД и работа в рамках транзакций, в то время как внешние библиотеки предоставляют больше алгоритмов настройки.

Типичные ошибки

  • Отсутствие семантического индекса: Функция требует предварительного создания семантического индекса на целевом столбце.
-- Ошибка: Для столбца ArticleText не существует семантического индекса.
SELECT * FROM SEMANTICKEYPHRASETABLE(dbo.Articles, ArticleText);
Msg 4129, Level 16, State 1, Line 1
Для полнотекстового или семантического поиска в полнотекстовом индексе "FT_Articles" для столбца "ArticleText" не включен статистический семантический поиск.
  • Указание несуществующего столбца или таблицы: Приводит к ошибке разрешения объектов.
SELECT * FROM SEMANTICKEYPHRASETABLE(dbo.NonexistentTable, WrongColumn);
Msg 208, Level 16, State 1, Line 1
Недопустимое имя объекта 'dbo.NonexistentTable'.
  • Использование функции без соединения, когда ожидаются данные из связанной таблицы: Может привести к неполным результатам, если не выполнен JOIN по document_key.
-- Возвращает только ключевые фразы и ID, без названий статей.
SELECT keyphrase, score FROM SEMANTICKEYPHRASETABLE(dbo.Articles, ArticleText);

Изменения в последних версиях

Начиная с SQL Server 2017 и в SQL Server 2019, функция SEMANTICKEYPHRASETABLE не претерпела значительных синтаксических изменений. Однако, в этих версиях были общие улучшения компонента полнотекстового и семантического поиска, касающиеся производительности и стабильности.

Важное изменение связано с поддержкой: статистический семантический поиск, частью которого является эта функция, удален из SQL Server 2022 и более поздних версий, а также из Управляемого экземпляра SQL Azure. Это означает, что в будущих версиях данная функция доступна не будет. Для схожих задач рекомендуется использовать интеграцию с внешними службами машинного обучения или NLP-библиотеками.

Расширенные примеры

Пример 1: Группировка ключевых фраз по документам с агрегацией.

Пример sql
-- Получение трех наиболее значимых фраз для каждого документа
WITH RankedKeyPhrases AS (
    SELECT
        document_key,
        keyphrase,
        score,
        ROW_NUMBER() OVER (PARTITION BY document_key ORDER BY score DESC) AS rn
    FROM SEMANTICKEYPHRASETABLE(dbo.Articles, ArticleText)
)
SELECT
    RKP.document_key,
    A.Title,
    RKP.keyphrase,
    RKP.score
FROM RankedKeyPhrases AS RKP
INNER JOIN dbo.Articles AS A ON RKP.document_key = A.ArticleID
WHERE RKP.rn <= 3
ORDER BY RKP.document_key, RKP.score DESC;
document_key Title                 keyphrase          score
------------ --------------------- ------------------ ----------
101          Введение в Python     программирование  0.789
101          Введение в Python     синтаксис         0.654
101          Введение в Python     основы            0.521
102          Обзор новых технологий инновации        0.812
...          ...                   ...               ...

Пример 2: Фильтрация ключевых фраз по минимальному порогу оценки.

Пример sql
-- Выбор только высокоуровневых фраз
SELECT
    SKP.keyphrase,
    SKP.score,
    SKP.document_key,
    A.PublicationDate
FROM SEMANTICKEYPHRASETABLE(dbo.Articles, ArticleText) AS SKP
INNER JOIN dbo.Articles AS A ON SKP.document_key = A.ArticleID
WHERE SKP.score > 0.5 -- Порог значимости
    AND A.PublicationDate > '2023-01-01'
ORDER BY SKP.score DESC;

Пример 3: Использование в сочетании с SEMANTICSIMILARITYTABLE для анализа тематики похожих документов.

Пример sql
-- Найти ключевые фразы для документов, похожих на статью с ID = 200
SELECT DISTINCT
    SKP.keyphrase,
    SUM(SKP.score) OVER (PARTITION BY SKP.keyphrase) AS total_score
FROM SEMANTICKEYPHRASETABLE(dbo.Articles, ArticleText) AS SKP
INNER JOIN SEMANTICSIMILARITYTABLE
    (dbo.Articles, ArticleText, 200) AS SST
    ON SKP.document_key = SST.matched_document_key
ORDER BY total_score DESC;
keyphrase        total_score
---------------- -----------
блокчейн         2.145678
криптовалюта     1.987654
...              ...

MS SQL SEMANTICKEYPHRASETABLE function comments

En
SEMANTICKEYPHRASETABLE Returns a table of key phrases associated with columns configured for statistical semantic indexing