Несколько лет назад было очень сложно извлечь Subjects / Topics / Concepts из тысяч неаннотированных документов с произвольным текстом. Лучшим и простым способом было заставить человека сидеть, просматривать каждую статью, понимать и комментировать темы. На самом деле это требовало много времени и было предрасположено к субъективному восприятию людей.

Хотя в прошлом было сделано много попыток с помощью простых алгоритмов, таких как pLSA, рассматривать это как проблему неконтролируемого обучения и извлекать темы, но эта область была полностью революционизирована LDA, который сотворил чудо, добавив Дирихле до распределения темы-слова и документа-темы. В течение многих лет LDA был любимым алгоритмом для задач тематического моделирования. Однако цель этих моделей - найти темы, которые можно использовать для воссоздания исходных документов с минимальной ошибкой.

Несколько областей, в которых оба этих алгоритма отстают:

  1. Предположение, что известно количество тем, которые в идеале не известны, и становится гиперпараметрами модели для большей согласованности и сложности.
  2. Необходимо удалить стоп-слова, иначе распределение тем-слов будет сильно загрязнено стоп-словами.
  3. Работает над BOW (bag of word) представлением документов, игнорируя семантику. Такие этапы предварительной обработки, как лемметизация и стемминг, могут помочь, но не помогут понять, что side и edge означают одно и то же.

Итак, как работает Top2Vec ?? Давайте расшифруем его слой за слоем и попробуем построить его скелет на высоком уровне.

Под капотом Top2Vec использует Doc2vec для первой генерации семантического пространства (семантическое пространство - это пространственное пространство, в котором расстояние между векторами является индикатором семантического сходства).

Если вы следите за исследованиями НЛП, то, должно быть, читали об алгоритме doc2vec, который на высоком уровне является модификацией word2vec, сделанной для создания встраивания документа / предложения / абзаца. В отличие от word2vec, doc2vec также включает вектор абзаца (можно рассматривать его как другой вектор слова, который изучается) вместе с векторами слов на этапе обучения. Как и word2vec, do2vec также обучается двумя способами:

  1. Вектор абзаца с распределенной памятью (DM): данный вектор абзаца и вектор контекста предсказывают целевое слово
  2. Распределенный пакет слов (DBOW): для данного вектора абзаца предсказать контекстные слова

В связи с лучшей производительностью и простотой модели Top2Vec использует DBOW версию Doc2Vec.

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

Чтобы найти такие плотные области векторов документов для определения тематических векторов, первое, что приходит в голову, - это использовать некоторый алгоритм кластеризации базовой плотности (HDBSCAN кажется идеальным). Но проблема прямого использования этих алгоритмов заключается в том, что мы имеем дело не с двумерным пространством, а с его многомерным разреженным пространством и проклятием размерности. Итак, чтобы преодолеть эту проблему, мы можем сначала выполнить уменьшение размерности, а затем использовать HDBSCAN для кластеризации. Для уменьшения размерности векторов документа используется унифицированная аппроксимация и проекция многообразия для уменьшения размерности (UMAP), поскольку она оказалась хорошей для сохранения локальной и глобальной структуры.

Таким образом, UMAP и HDBSCAN помогли нам определить плотные кластеры документов. Векторы тем можно просто вычислить как центроид этих кластеров.

Поскольку мы обучили документ и вектор слова совместно в едином семантическом пространстве. Поэтому, как только мы определим векторы темы, будет легко найти близлежащие векторы слов, которые лучше всего представляют эту тему, и таким образом мы получим распределение слов для каждой созданной темы. Таким образом, у нас есть темы, созданные для каждого документа, который у нас был в трупе.

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

Нужно ли нам удалять стоп-слова перед использованием Top2Vec?

Нет, поскольку такие стоп-слова будут появляться почти во всех документах, присутствующих в трупе, поэтому они будут равноудалены от всех тем и не будут отображаться как ближайшее слово к какой-либо теме.

Автор статьи также предоставил API с открытым исходным кодом (https://github.com/ddangelov/Top2Vec) для этой модели, и они действительно хорошо обернуты с меньшими затратами на кодирование. Я не буду вдаваться в подробности и оставлю это вам для экспериментов.

Использованная литература:

[1] https://arxiv.org/pdf/2008.09470.pdf

[2] https://arxiv.org/pdf/1405.4053.pdf