Узнайте больше о члене семьи BERT для тематического моделирования

Введение

Тематическое моделирование – это тип задачи обработки естественного языка (NLP), в которой используются неконтролируемые методы обучения для извлечения основных тем некоторых текстовых данных, с которыми мы имеем дело. Слово «Без присмотра» здесь означает, что нет обучающих данных со связанными метками тем. Вместо этого алгоритмы пытаются обнаружить основные закономерности, в данном случае темы, непосредственно из самих данных.

Существуют различные виды алгоритмов, которые широко используются для тематического моделирования. В трех предыдущих статьях я представил вам три алгоритма тематического моделирования: LDA, GSDMM и NMF.







В этой статье я подробно объясню, что такое BERTopic и как вы можете использовать его для своего проекта тематического моделирования! Давайте погрузимся прямо в него!

Что такое BERTopic

Прежде чем мы выясним, что такое BERTopic и что он делает, нам нужно знать, что такое BERT, потому что BERTopic является производным от BERT. BERT — это аббревиатура от двунаправленных представлений кодировщика от Transformers, которая была разработана в 2018 году как модель машинного обучения на основе трансформаторов. Он был предварительно обучен на огромных объемах корпусных данных и поэтому очень хорошо работает в различных задачах НЛП. Вы можете ознакомиться с оригинальной статьей для BERT здесь. BERTopic был разработан как член семейства BERT специально для моделирования темы.

BERTopic работает с помощью следующих нескольких шагов.

[Шаг 1] Документы представлены в виде вложений с использованием преобразователей предложений. Подробнее о преобразователях предложений можно узнать здесь. Модель по умолчанию, используемая для этого шага, — BERT (отсюда и название BERTopic).

[Шаг 2] Шаг 2 — это процесс уменьшения размерности. Алгоритм UMAP (аппроксимация и проекция равномерного коллектора) используется по умолчанию. Конечно, вместо этого могут использоваться другие параметры, включая анализ главных компонентов (PCA), в зависимости от вашей цели и данных.

[Шаг 3] Шаг 3 — это процесс кластеризации. Этот шаг является частью, которая фактически вычисляет сходство между различными документами, чтобы определить, относятся ли они к одной и той же теме или нет. Алгоритм Hierarchical Density-Based Spatial Clustering (HDBSCAN) используется по умолчанию. Это алгоритм кластеризации на основе плотности и, следовательно, часто работает лучше, чем алгоритмы, такие как кластеризация K-средних для моделирования вершин.

[Шаг 4] После этого алгоритм c-TF-IDF извлекает наиболее релевантные слова для каждой темы. c-TF-IDF похож на TF-IDF, как следует из названия, но отличается тем, что измеряет частоту терминов в каждом кластере, а не в каждом документе. Математическая формулировка для c-TF-IDF выглядит следующим образом.

[Шаг 5] Последним необязательным шагом является оптимизация терминов с использованием максимальной предельной релевантности (MMR). Использование этого алгоритма полезно, поскольку улучшает согласованность терминов по одной и той же теме и представлению темы.

Ниже приведена красивая инфо-графика для описания вышеупомянутых шагов.

Выполнение

Мы будем использовать данные 20 NewsGroup, которые доступны всем через пакет sklearn. Он использует Лицензию Apache версии 2.0. Просто напомню, что я использовал этот набор данных для своих предыдущих трех статей, посвященных тематическому моделированию, для обеспечения согласованности между различными руководствами.

Сначала мы устанавливаем пакет BERTopic.

!pip install bertopic

Затем мы импортируем соответствующие пакеты, которые нам нужны.

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.datasets import fetch_20newsgroups
from scipy import linalg
import gensim
from tqdm import tqdm
import re
import matplotlib.pyplot as plt
from bertopic import BERTopic

%matplotlib inline
np.set_printoptions(suppress=True)

Обычно процесс очистки и предварительной обработки текста необходим для обеспечения максимальной производительности, но в этом руководстве мы пропустим эту часть, чтобы больше сосредоточиться на реализации самого BERTopic. На самом деле, относительно приличное качество выходных данных тематического моделирования без очистки текста может свидетельствовать о мощности и полезности BERTopic. Обратитесь к моей предыдущей статье, в которой говорилось о NMF для тематического моделирования, если вы хотите узнать больше об этапе очистки текста.

Из пакета skelarn мы считываем данные 20 NewsGroup. Затем мы просто создаем экземпляр объекта BERTopic, указав английский язык. Вы можете указать желаемое количество тем с помощью параметра nr_topics. «Авто» означает, что вы хотите, чтобы модель автоматически определяла подходящее количество тем для моделирования.

docs = fetch_20newsgroups(subset='all',  
                        remove=('headers', 'footers', 'quotes'))['data']

# Instantiate the model
model = BERTopic(language="english", nr_topics = 'auto')

# Fit and Transform
topics, probs = model.fit_transform(docs)

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

Язык

Вы можете указать язык или позволить модели вывести язык с помощью языкового параметра.

# Specify the lanugage to be English expliclitly
model = BERTopic(language="english")

# Let the model infer
model = BERTopic(language="multilingual")

Вложения

Вы также можете настроить часть внедрения BERTopic с помощью параметра embedding_model. По умолчанию используется базовая модель BERT, но вы можете свободно использовать другие модели встраивания. Список опций можно найти в этой документации.

BERTopic(embedding_model="xlm-r-bert-base-nli-stsb-mean-tokens")

Представление темы

Вместо использования векторного представления TF-IDF по умолчанию вы можете настроить его самостоятельно или использовать представление Countervectorizer.

# Update topic representation by increasing n-gram range and 
# removing english stopwords

model.update_topics(docs, topics, n_gram_range=(1, 3), stop_words="english")

# Use Custom CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(ngram_range=(1, 3), stop_words="english")
model.update_topics(docs, topics, vectorizer=cv)

Уменьшение размерности

Вы можете настроить гиперпараметры алгоритма UMAP, прежде чем вводить его в модель BERTopic. Кроме того, вместо стандартного алгоритма UMAP для уменьшения размерности можно использовать другие алгоритмы, такие как PCA.

from umap import UMAP
umap_model = UMAP(n_neighbors=10, 
                  n_components=7, 
                  min_dist=0.0, 
                  metric='cosine', 
                  random_state=42)

model = BERTopic(umap_model=umap_model, language="english")

Обратитесь к этой замечательной статье, которая фактически использует PCA вместо UMPA для BERTopic.

Количество тем

Вы можете вручную указать количество тем или установить для аргумента nr_topics значение «auto», чтобы модель автоматически определяла подходящее количество тем. Однако вы можете столкнуться с ситуацией, когда вы уже обучили модель темы, но обнаружили, что количество тем слишком велико. В этом случае вы можете уменьшить количество тем после обучения с помощью функции reduce_topics.

# Specify number of topics manually
model = BERTopic(nr_topics=20)

# Automatic Topic Reduction
model = BERTopic(nr_topics="auto")

# Reduce the number of topics after training the model
new_topics, new_probs =\
model.reduce_topics(docs, topics, probs, nr_topics=5)

Получить общую информацию о темах

Вы используете функцию get_topic_info для получения общей информации о темах.

freq = model.get_topic_info() 
freq

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

Ключевые слова и баллы c-TF-IDF для указанной темы

Вы также можете получить доступ к ключевым словам и их показателям c-TF-IDF для указанной темы, используя функцию get_topic. Например, мы получаем доступ к ключевым словам и их оценкам для темы 3 в следующем коде.

# We access index 4 for topic 3 because we skip index 0 which is topic -1
model.get_topic(freq.iloc[4]["Topic"])

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

Найти темы, похожие на указанный термин

# Return top3 topics that are semantically most similar 
# to an input query term

# 3 most similar topics to specified word
similar_topics, similarity = \
model.find_topics("religion", top_n = 3) 


print("Most Similar Topic Info: \n{}".format(model.get_topic(similar_topics[0])))
print("Similarity Score: {}".format(similarity[0]))

print("\n Most Similar Topic Info: \n{}".format(model.get_topic(similar_topics[1])))
print("Similarity Score: {}".format(similarity[1]))

print("\n Most Similar Topic Info: \n{}".format(model.get_topic(similar_topics[2])))
print("Similarity Score: {}".format(similarity[2]))

Результат:

Most Similar Topic Info: 
[('prophecies', 0.035076938400189765), ('prophecy', 0.028848478747937348), ('that', 0.02108670502531178), ('god', 0.02051417591444672), ('lord', 0.020264581769842555), ('of', 0.016688896522909655), ('the', 0.016135781453880685), ('to', 0.015035130690705624), ('scripture', 0.014930014538798414), ('we', 0.014849027662146918)]
Similarity Score: 0.5521519602007433

 Most Similar Topic Info: 
[('bank', 0.09616363061888215), ('islamic', 0.08725362721875433), ('bcci', 0.07506873356081414), ('banks', 0.04599130160033494), ('islam', 0.03498368962676642), ('interest', 0.03153905791196487), ('an', 0.02707799288051472), ('risk', 0.026608617086657786), ('investor', 0.023625991363580155), ('loans', 0.023098071864865885)]
Similarity Score: 0.5518991782725108

 Most Similar Topic Info: 
[('moral', 0.04437134134615366), ('objective', 0.04058577723387244), ('morality', 0.03933015749038743), ('is', 0.023387671936210788), ('that', 0.021184421900981805), ('what', 0.017148832156794584), ('you', 0.017133130253694097), ('not', 0.01467957486207896), ('immoral', 0.014518771930711771), ('of', 0.014256652246875072)]
Similarity Score: 0.5515153930656871

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

BERTopic также имеет несколько приятных функций визуализации как часть пакета.

# Intertopic Distance Map
model.visualize_topics( )

Функция visualize_topics отображает карту межтематических расстояний, которую мы видели ранее в нашем Учебнике LDA. По сути, это визуализация, которая показывает пузыри разных тем и то, насколько они похожи друг на друга. Чем ближе два кружка друг к другу, тем более семантически похожи две темы. Тема 2, например, представляет собой более крупный красный кружок в правом нижнем углу, похожа на тему 10, которая представляет собой меньший кружок внутри темы 2. Тема 10 содержит ключевые слова, включая витамины и инфекции, а тема 2 содержит такие ключевые слова, как рак. и наркотики, и мы видим, что эти две темы тесно связаны друг с другом.

# Topic Word Scores in Bar Chart
model.visualize_barchart()

Visualize_barchart позволяет нам создавать гистограммы, которые показывают разные баллы для ключевых слов в каждой теме. Единственным недостатком является то, что он отображает только первые 8 тем,

# Similarity Matrix
model.visualize_heatmap( )

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

# Probability distribution of first document across different topics
model.visualize_distribution(probs[5]) 

Функция visualize_distribution возвращает горизонтальные гистограммы, которые показывают вероятность того, что определенный документ подпадает под каждую тему. В приведенном выше примере он возвращает вероятность того, что шестой документ попадет в каждую тему. Обратите внимание, что перед тренировкой необходимо указать для параметра calculate_probabilities в объекте BERTopic значение True, поскольку значение по умолчанию равно False, и если это так, функция visualize_distribution вернет ошибку.

# Hierarchical Topics
hierarchical_topics = model.hierarchical_topics(docs)
model.visualize_hierarchy(hierarchical_topics=hierarchical_topics)

Если вы хотите понять иерархические отношения между различными темами, вам поможет функция visualize_hierarchy.

topics_over_time =\
model.topics_over_time(docs, topics, timestamp, nr_bins=20)

model.visualize_topics_over_time(topics_over_time, top_n_topics=20)

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

Заключение

В этой статье я представил вам алгоритм BERTopic, который является производным от BERT и состоит из нескольких шагов, использующих различные алгоритмы от c-TF-IDF, UMAP до HDBSCAN и MRR. Чтобы полностью понять, как работает эта модель, вам необходимо понять другие задачи, связанные с машинным обучением и НЛП, такие как уменьшение размерности и встраивание текстовых данных. Тем не менее, он предоставляет нам мощный и простой способ моделирования темы даже без очистки или предварительной обработки текста. Это не означает, что чистка текста не нужна. Обратите внимание, что в большинстве случаев очистка и предварительная обработка текста будут иметь решающее значение для обеспечения качества моделируемых тем. Чтобы узнать больше о BERTopic, обратитесь к этой основной документации.

Если вы нашли этот пост полезным, рассмотрите возможность поддержать меня, подписавшись на среду по следующей ссылке :)

joshnjuny.medium.com

Вам будет доступно столько полезных и интересных статей и постов не только от меня, но и от других авторов!

об авторе

Ученый по данным. Аспирант 1-го курса информатики Калифорнийского университета в Ирвине. Основной исследовательский интерес заключается в применении методов SOTA ML/DL/NLP к здравоохранению и большим данным, связанным с медициной, для извлечения интересных идей, которые будут информировать пациентов, врачей и политиков.

Бывший специалист по исследованиям в экономической лаборатории Системы административной документации уголовного правосудия (CJARS) Мичиганского университета. Работал над созданием статистических отчетов, автоматической проверкой качества данных, созданием конвейеров данных, а также стандартизацией и гармонизацией данных. Бывший стажер по науке о данных в Spotify. Inc. (Нью-Йорк).

Он любит заниматься спортом, заниматься спортом, готовить вкусную азиатскую еду, смотреть дорамы, сочинять/исполнять музыку и, самое главное, поклоняться Иисусу Христу, нашему Господу. Загляните на его сайт!