
В контексте обработки естественного языка (NLP), тематическое моделирование это неконтролируемая обучающая задача, целью которой является поиск абстрактных тем в коллекции документов.
Моделирование темы отвечает на вопрос: «Учитывая текстовый корпус многих документов, можем ли мы найти абстрактные темы, о которых идет речь в тексте?»
В данном руководстве вы:
- Узнайте о двух мощных методах факторизации матрицы. Декомпозиция сингулярного значения (SVD) и Факторизация неотъемлемой матрицы (NMF)
- Используйте их для поиска тем в коллекции документов
К концу этого учебника вы сможете создавать свои модели тем, чтобы находить темы в любом фрагменте текста.????????
Давайте начнем.
Содержание
- Что такое тематическое моделирование?
- Уравнение оценки TF-IDF
- Моделирование темы с использованием расписания сингулярного значения (SVD)
- Что такое SVD или k-SVD?
- Моделирование темы с использованием факторизации неотъемлемой матрицы (NMF)
- 7 шагов к использованию SVD для тематического моделирования
- Как визуализировать темы как облака слов
- Как использовать NMF для тематического моделирования
- SVD против NMF – Обзор отличий
Что такое тематическое моделирование?
Начнём с того, что разберемся, что такое тематическое моделирование.
Предположим, вам предоставлен большой текстовый корпус, содержащий несколько документов. Вы бы хотели знать ключевые темы содержащиеся в данном сборнике документов, не читая каждый документ.
Моделирование тем помогает разделить информацию в большом текстовом корпусе на определенное количество тем. Темы — это группы слов, которые есть подобные по контексту и являются ориентировочными по информации в сборнике документов.
Общая структура матрицы документа-термина для текстового корпуса, содержащая M
документы и N
терминов, показано ниже:

Давайте разберем матричное представление:
- D1, D2, …, DM – документы M.
- T1, T2, …, TN – N членов
Чтобы заполнить матрицу терминов-документов, воспользуемся широко используемым показателем – показателем TF-IDF.
Уравнение оценки TF-IDF
Оценка TF-IDF определяется следующим уравнением:

где,
TF_ij
это количество раз срокаTj
встречается в документеDi
.dfj
количество документов, содержащих терминTj
Термин, часто встречающийся в определенном документе и редко во всем корпусе, имеет высокую оценку IDF.
Я надеюсь, что теперь вы получили беглое понимание DTM и оценки TF-IDF. Давайте теперь рассмотрим методы матричной факторизации.
Моделирование темы с использованием расписания сингулярного значения (SVD)
Использование декомпозиции сингулярного значения (SVD) для тематического моделирования объясняется на рисунке ниже:

Декомпозиция сингулярного значения на матрице документ-термин D дает следующие три матрицы:
- Левая сингулярная векторная матрица U. Эту матрицу получают путем разложения на собственные значения матрицы Грамма D.D_Tтакже называется матрицей подобия документов. I, j-я запись матрицы подобия документа означает, насколько похож документ
i
это документироватьj
. - Матрица сингулярных значений СКоторые (значения) означают относительную важность тем.
- Правая сингулярная векторная матрица V_T, который также называют термином «тематическая матрица». Темы в тексте расположены вдоль строк этой матрицы.
Если вы хотите обновить концепцию собственного разложения, вот отличное руководство от Гранта Сандерсона из 3Blue1Brown. Он наглядно объясняет свои векторы и собственные значения.
Это вполне нормально, если вам сложно понять работу SVD. ???? На данный момент вы можете думать о SVD как о черном ящике, который работает с вашей матрицей терминов документа (DTM) и дает 3 матрицы, НАСи V_T. И темы располагаются вдоль строк матрицы V_T.

Примечание: СВД еще называют Скрытое семантическое индексирование (LSI).
Что такое SVD или k-SVD?
Предположим, у вас есть текстовый корпус из 150 документов. Вы бы предпочли бы быстро просмотреть 150 различных тем, описывающих корпус, или с удовольствием прочитали 10 тем, которые могут передать содержание корпуса?
Что ж, часто полезно исправить небольшое количество тем, лучше передают содержание текста. И это то, что мотивирует к-СИД.
Поскольку умножение матриц требует много вычислений, лучше выбрать k наибольших единичных значений, а также соответствующие темы. Работа k-SVD проиллюстрирована ниже:

Моделирование темы с использованием факторизации неотъемлемой матрицы (NMF)
Факторизация неотъемлемой матрицы (NMF) работает, как показано ниже:

Факторизация неотъемлемой матрицы действует на матрицу сроков документа и дает следующее:
- Матрица В который называется документо-тематическая матрица. Эта матрица указывает распределение тем меж документами в корпусе.
- Матрица Х который также называют термино-тематическая матрица. Эта матрица учитывает значение терминов в темах.
NMF легче интерпретировать как все элементы матриц В и Х теперь неотъемлемы. Следовательно, высший балл соответствует большей релевантности.
Но как получить матрицы W и H?
NMF – это a неточный техника матричной факторизации. Это означает, что вы не можете умножить W и H, чтобы вернуть исходную матрицу документа V.
Матрицы W и H инициализируются случайным образом. Алгоритм выполняется итеративно, пока мы не найдем W и H, минимизирующие функцию затрат.
Функция затрат является нормой Фробениуса матрицы V – WHкак показано ниже:

Норма Фробениуса матрицы A из m строк и n столбцов задана следующим уравнением:

7 шагов к использованию SVD для тематического моделирования
1️⃣ Чтобы использовать SVD для получения тем, давайте сначала получим текстовый корпус. В следующей ячейке кода содержится фрагмент текста о компьютерном программировании.
text=["Computer programming is the process of designing and building an executable computer program to accomplish a specific computing result or to perform a specific task.",
"Programming involves tasks such as: analysis, generating algorithms, profiling algorithms' accuracy and resource consumption, and the implementation of algorithms in a chosen programming language (commonly referred to as coding).",
"The source program is written in one or more languages that are intelligible to programmers, rather than machine code, which is directly executed by the central processing unit.",
"The purpose of programming is to find a sequence of instructions that will automate the performance of a task (which can be as complex as an operating system) on a computer, often for solving a given problem.",
"Proficient programming thus often requires expertise in several different subjects, including knowledge of the application domain, specialized algorithms, and formal logic.",
"Tasks accompanying and related to programming include: testing, debugging, source code maintenance, implementation of build systems, and management of derived artifacts, such as the machine code of computer programs.",
"These might be considered part of the programming process, but often the term software development is used for this larger process with the term programming, implementation, or coding reserved for the actual writing of code.",
"Software engineering combines engineering techniques with software development practices.",
"Reverse engineering is a related process used by designers, analysts and programmers to understand and re-create/re-implement"]
Текст, для которого необходимо найти темы, готов.
2️⃣ Следующим шагом является импорт TfidfVectorizer
класс из модуля извлечения функций scikit-learn для текстовых данных:
from sklearn.feature_extraction.text import TfidfVectorizer
Вы будете использовать TfidfVectorizer
класса, чтобы получить DTM, заполненный отметками TF-IDF для текстового корпуса.
3️⃣ Для использования Усеченный SVD (k-SVD) обсуждалось раньше, вам нужно импортировать TruncatedSVD
класс от scikit-learn decomposition
модуль:
from sklearn.decomposition import TruncatedSVD
▶ Теперь, когда вы импортировали все необходимые модули, пора начать поиск тем в тексте.
4️⃣ На этом шаге вы создадите экземпляр a Tfidfvectorizer
объект. Назовем это векторизатором.
vectorizer = TfidfVectorizer(stop_words="english",smooth_idf=True)
# under the hood - lowercasing,removing special chars,removing stop words
input_matrix = vectorizer.fit_transform(text).todense()
Пока вы:
☑ собрал текст,
☑ импортировал необходимые модули и
☑ получен входной DTM.
Теперь вы продолжите использовать SVD для получения тем.
5️⃣ Теперь вы будете использовать TruncatedSVD
класс, который вы импортировали на шаге 3️⃣.
svd_modeling= TruncatedSVD(n_components=4, algorithm='randomized', n_iter=100, random_state=122)
svd_modeling.fit(input_matrix)
components=svd_modeling.components_
vocab = vectorizer.get_feature_names()
6️⃣ Давайте напишем функцию, которая получает темы для нас.
topic_word_list = []
def get_topics(components):
for i, comp in enumerate(components):
terms_comp = zip(vocab,comp)
sorted_terms = sorted(terms_comp, key= lambda x:x[1], reverse=True)[:7]
topic=" "
for t in sorted_terms:
topic= topic + ' ' + t[0]
topic_word_list.append(topic)
print(topic_word_list)
return topic_word_list
get_topics(components)
7️⃣ И пора пересмотреть темы и проверить, имеют ли они смысл. Когда вы звоните get_topics()
с компонентами, полученными из SVD в качестве аргумента, вы получите список тем и первые слова в каждой из этих тем.
Topic 1:
code programming process software term computer engineering
Topic 2:
engineering software development combines practices techniques used
Topic 3:
code machine source central directly executed intelligible
Topic 4:
computer specific task automate complex given instructions
И у вас есть свои темы всего в 7 шагах. Хорошо ли выглядят темы?
Как визуализировать темы как облака слов
В предыдущем разделе вы напечатали темы и нашли содержание тем, используя самые популярные слова в каждой теме.
Другим популярным методом визуализации для тем является слово облако. В облаке слов термины в определенной теме отображаются в терминах их относительная значимость. Самое важное слово имеет наибольший размер шрифта и т.д.
!pip install wordcloud
from wordcloud import WordCloud
import matplotlib.pyplot as plt
for i in range(4):
wc = WordCloud(width=1000, height=600, margin=3, prefer_horizontal=0.7,scale=1,background_color="black", relative_scaling=0).generate(topic_word_list[i])
plt.imshow(wc)
plt.title(f"Topic{i+1}")
plt.axis("off")
plt.show()
Облака слов для тем с 1 по 4 показаны на сетке изображений ниже:

Как видите, размер шрифта слов указывает на их относительную значимость в теме. Эти облака слов также называют облаками тем.
Как использовать NMF для тематического моделирования
В этом разделе вы выполните те же действия, что и в SVD. Вам нужно сначала импортировать NMF
класс от scikit-learn decomposition
модуль.
from sklearn.decomposition import NMF
NMF_model = NMF(n_components=4, random_state=1)
W = NMF_model.fit_transform(input_matrix)
H = NMF_model.components_
И тогда вы можете позвонить get_topics()
функция на матрице Х получить темы.
Topic 1:
code machine source central directly executed intelligible
Topic 2:
engineering software process development used term combines
Topic 3:
algorithms programming application different domain expertise formal
Topic 4:
computer specific task programming automate complex given

Для данного фрагмента текста можно увидеть, что SVD и NMF дают схожие облака тем.
SVD против NMF – Обзор отличий
Теперь давайте объединим отличия между этими двумя методами матричной факторизации для тематического моделирования.
- SVD – это метод точной матричной факторизации – вы можете реконструировать входной DTM из результирующих матриц.
- Если вы решите использовать k-SVD, это будет самое лучшее приближение k-ранга к входному DTM.
- Хотя NMF является неточным приближением к входному DTM, известно, что он охватывает более разнообразные темы, чем SVD.
Подведению
Надеюсь, вам понравился этот урок. Как следующий шаг, вы можете раскрутить свой собственный блокнот Colab, используя ячейки кода из этого учебника. Вам нужно только вставить фрагмент текста, для которого вы хотите найти темы, и у вас будут готовы темы и облака слов!
Спасибо за чтение и счастливую кодировку!
Ссылки и дополнительная литература по тематическому моделированию
Изображение обложки: фото Бретта Джордана на Unsplash