|
Рубрика:
Карьера/Образование /
Машинное обучение на практике
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
ВИЗИТКА
Михаил Орлов, data scientist направления R&D AI компании Bell Inegrator
LSA: геометрическое представление смысла Как из матрицы слов получить пространство тем
В прошлой статье был разобран подход TF—IDF: почему слово «помогите» — это шум, а слово «смс-код» — уже содержательная составляющая, и как вообще из текста получить вектор весов.
Теперь возникает следующий вопрос: раз уже затронуты векторы, что, если смысл текста — это оси в пространстве?
Поясним подробнее: представим, что есть координатные оси X и Y, которые образуют плоскость. Документ — это точка, которая лежит где-то на этой плоскости. Пусть оси — это не просто геометрические координаты, а векторы из ключевых слов текста, например «авторизация», «оплата», «доставка», «ошибка 403» и т. д. Причем эти оси никто заранее не задавал, они получились самостоятельно из статистики текста. Таких осей может быть больше, чем 2 — и это даже хорошо. Все описанное выше является основой для понимания латентно-семантического анализа.
Как перейти от текста к геометрии?
Допустим, есть коллекция документов. Формируется словарь (включающий все слова / токены, аналогично алгоритму «мешок слов») и строится матрица: [1]
- по строкам — слова (terms);
- по столбцам — документы (docs);
- в клетках — веса (обычно для их получения используется метод TF—IDF, но можно использовать и что-то другое).
Получается матрица A размера «термы ´ документы». Если есть, например, 50 000 диалогов технической поддержки и 100 000 слов в словаре (слов не сильно больше, потому что в таких диалогах они достаточно однообразные), матрица получается огромной и почти полностью состоит из нулей — такая матрица называется разреженной. Однако в ней уже содержится вся нужная информация: какие слова совместно с другими встречаются в одном тексте, с какой частотой, что в каких текстах важно, что является редкостью, а что — шумом.
В таком представлении каждый документ — это столбец матрицы, то есть вектор в пространстве с размерностью, равной числу слов. В приведенном примере размерность вектора равна 100 000. Такие масштабы могут испугать человека, но не математику.
В чем же суть LSA? Подход исходит из того, что нет смысла оперировать 100 000 измерениями. Предлагается найти 200–500 осмысленных направлений и работать уже с ними.
Где здесь магия SVD и магия ли это?
SVD (Singular Value Decomposition) звучит как заклинание, которое произносит любой, кто хочет показаться умным на собеседовании. Но, по сути, это довольно простой алгоритм.
Матрица A раскладывается следующим образом:
A = UΣVΤ.
U — ортогональная матрица, связывающая слова и латентные компоненты; Σ — диагональная матрица с неотрицательными значениями, показывающая, насколько сильна каждая ось; V — ортогональная матрица, связывающая компоненты и документы.
Основная идея заключается в том, что нет необходимости использовать всю информацию из исходной матрицы. Берутся только первые k самых сильных компонент (например, k = 200): A ≈ UkΣkVkΤ.
Таким образом происходит сжатие информации: извлекается суть без мелких подробностей и лишнего шума.
Как LSA видит скрытые смыслы
Представим, что есть 10 000 обращений в техническую поддержку. Среди них встречаются различные формулировки:
- «не могу войти»;
- «не проходит авторизация»;
- «логин не работает»;
- «смс-код не приходит»;
- «код подтверждения не пришел».
Если использовать только базовые методы, совпадений окажется немного: кто-то пишет «вход», кто-то — «авторизация».
Эти слова живут в похожих окружениях. Они встречаются в тех же документах, где есть слова «смс», «код», «аккаунт», «подтверждение», «ошибка».
LSA улавливает статистику совместных появлений и как бы говорит: «Похоже, есть скрытая ось, которую можно назвать „вход / авторизация“». Даже если в тексте не было слова «авторизация», документ может получить высокий вес по соответствующей оси, потому что в нем присутствовали «вход», «смс-код», «аккаунт».
Таким образом, LSA делает первую настоящую «семантику» без нейросетей — за счет линейной алгебры и SVD.
Рассмотрим небольшой пример для наглядности.
Допустим, есть 6 документов:
1) «Не приходит смс-код при входе». 2) «Ошибка авторизации, не могу войти в аккаунт». 3) «Логин неверный, доступ запрещен». 4) «Списали деньги дважды, возврат». 5) «Не проходит оплата картой». 6) «Где чек и история платежей?»
Если посмотреть на слова, то в обращениях 1–3 речь идет о попытке входа, а в обращениях 4–6 — об оплате, при этом формулировки различаются.
После применения LSA часто наблюдается следующая картина:
- документы (1–3) становятся близкими в латентном пространстве;
- документы (4–6) также оказываются близкими друг к другу;
- расстояние между этими группами увеличивается.
Так, вместо 100 000 координат появляется условно 200, где 1-я координата — «вход», 2-я — «оплата», 3-я — «доставка» и так далее (названия условны, поскольку модель таких понятий, естественно, не знает).
Где используется подход
(1) Кластеризация обращений
При наличии десятков тысяч обращений или диалогов LSA — быстрый и надежный способ:
- сжать данные;
- построить кластеры;
- получить «тематики» без ручной разметки;
- а затем либо разметить кластеры, либо обучать на них классификатор.
На практике LSA часто используют как первый шаг для того, чтобы посмотреть, какие крупные группы вообще существуют.
(2) Поиск дублей (дедупликация)
Частая проблема — одно и то же обращение создается десятки раз с небольшими изменениями формулировок. TF—IDF уже умеет решать эту задачу, но LSA нередко работает существенно лучше, особенно когда смысл одинаков, а слова разные, например:
- «не приходит код»
- «смс не пришла»
- «код подтверждения не поступает»
После применения LSA поиск дублей выполняется по косинусному сходству (cosine similarity) в латентном пространстве.
(3) Семантический поиск «на минималках»
Сегодня модно говорить «эмбеддинги», «BERT», «трансформеры». Однако при наличии корпоративных данных, требований к скорости, необходимости объяснимости и ограничениях по ресурсам связка TF—IDF + LSA остается вполне рабочим базовым «семантическим» поиском. В ряде случаев это даже лучший вариант при таких ограничениях.
(4) Рекомендации и поиск похожих документов
LSA обеспечивает более устойчивую похожесть по сравнению с чистым bag-of-words в ситуациях, когда варьируются исходные формулировки.
Как работает связка TF—IDF + LSA
Попробуем визуализировать результаты работы связки TF—IDF + LSA в двумерном пространстве:
- Берем документы и применяем к ним подход TF—IDF.
- Применяем алгоритм LSA (SVD) с уменьшением количества измерений до 200.
- Отрисовываем итоговую структуру на плоскости 2D.
На данном примере видно, как из облака точек мы получаем понятную картинку благодаря LSA.
В каких случаях подход LSA может подвести
LSA — достаточно мощный инструмент, но не идеальный, вот почему:
- Линейность. Алгоритм использует линейное приближение; сложные нелинейные зависимости он не ловит
- Омонимы. Одно слово — разные смыслы: «корзина» (баскетбольная) и «корзина» (потребительская) могут смешиваться, если корпус слов маленький или контексты пересекаются.
- Выбор k. Слишком маленькое k ведет к потере смысла, слишком большое — к сохранению шума. Поэтому обычно параметр подбирается эмпирически под конкретные метрики поиска или кластеризации.
Таким образом, TF—IDF позволяет оценить вес слов: что является содержательным, а что — фоном. А LSA берет TF—IDF-матрицу и находит скрытые оси (латентные факторы), а также переносит документы в более структурированное пространство, в котором проще искать похожие тексты, кластеры и дубли. И все это — без нейросетей, на базе линейной алгебры и SVD.
Ключевые слова: LSA, латентно-семантический анализ, обработка текста, NLP, TF-IDF, SVD, сингулярное разложение, векторы, матрицы, машинное обучение
Подпишитесь на журнал
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|