Часть II серии НЛП и текстовой аналитики — с использованием LDA

Добро пожаловать во вторую часть нашей серии статей об НЛП и текстовой аналитике! Если у вас еще не было возможности, пожалуйста, прочитайте первую часть этой серии здесь. Подводя итог нашему прогрессу, мы начали с корпуса политических работ, таких как Государь Макиавелли, Записки федералистов Гамильтона/Мэдисона/Джея и Коммунистический манифест Маркса/Энгельса. Из этих работ мы получили текстовые таблицы и использовали метрику косинусного подобия для определения кластеризации соответствующих работ, как показано ниже.

В следующей части мы постараемся развить наш более ранний результат и попытаемся найти наиболее актуальные темы для этих кластеров. Три кластера, которые мы определили, будут обозначаться как «Старый_Запад» для старой западной политической философии (обозначены красным), «США» для политической философии США (обозначены зеленым цветом) и «Коммунист» для коммунистической политической философии (обозначены оранжевым цветом). ). Мы также создадим нашу таблицу Token, созданную в части 1 этой серии, образец которой показан ниже.

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

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

# Create Topic Model OHCO
OHCO_TM = ['clusters', 'authors', 'book_id', 'chap_num', 'para_num']

Теперь, когда у нас есть готовая таблица, мы можем начать применять наш алгоритм тематического моделирования.

tfv = CountVectorizer(max_features=4000, stop_words='english')
tf = tfv.fit_transform(PARAS.para_str)
TERMS = tfv.get_feature_names()
def model(PARAS = PARAS, tf = tf, TERMS = TERMS):
    lda = LDA(n_components=25, max_iter=10, learning_offset=50)
    THETA = pd.DataFrame(lda.fit_transform(tf), index=PARAS.index)
    THETA.columns.name = 'topic_id'
    
    #PHI
    PHI = pd.DataFrame(lda.components_, columns=TERMS)
    PHI.index.name = 'topic_id'
    PHI.columns.name  = 'term_str'
    
    return THETA, PHI

В этом блоке кода мы начинаем с использования функции CountVectorizer из модуля sklearn, которая проходит через нашу недавно созданную таблицу «PARAS», создавая разреженную матрицу для подсчета 4000 первых терминов. Количество терминов можно настроить в параметре max_feature, переданном функции CountVectorizer. В конечном итоге мы будем использовать модель скрытого распределения Дирихле (LDA) для создания наших тем. Модель LDA обычно используется в тематическом моделировании, и в нашем контексте она работает, идентифицируя темы в корпусе документов на основе используемых терминов, а затем присваивая этим документам наиболее подходящие темы.

Приведенная выше функция LDA находится в библиотеке sklearn. Первый параметр, который мы передаем, «n_components», устанавливает количество тем, которые мы выбираем для создания, в данном случае 25. Второй термин «max_iter» относится к количеству итераций по обучающим данным, а «learning_offset» служит для предотвращения ошибок, вызванных за счет раннего обучения на обучающих данных.

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

# Create topics
TOPICS = PHI.stack().to_frame().rename(columns={0:'weight'})\
    .groupby('topic_id')\
    .apply(lambda x: 
           x.weight.sort_values(ascending=False)\
               .head(10)\
               .reset_index()\
               .drop('topic_id',1)\
               .term_str)
# Add label column to TOPICS table
TOPICS['label'] = TOPICS.apply(lambda x: str(x.name) + ' ' + ' '.join(x), 1)

# Set topics by Doc weight
TOPICS['doc_weight_sum'] = THETA.sum()
# Topics by book cluster given top 25 topics
topic_cols = [t for t in range(25)]
CLUSTERS = THETA.groupby('clusters')[topic_cols].mean().T                                            
CLUSTERS.index.name = 'topic_id'
CLUSTERS.T
CLUSTERS['topterms'] = TOPICS[[i for i in range(10)]].apply(lambda x: ' '.join(x), 1)

Теперь мы можем отсортировать каждый из наших трех кластеров, чтобы определить, какие темы наиболее популярны, и слова, составляющие эти темы. Как видно ниже, каждый из кластеров в наибольшей степени отождествляется с различным набором тем и связанных с ними терминов. Как указывалось ранее, большинство тем попадают под зонтик политических мыслей, что неудивительно, учитывая нашу область, но внутри них мы можем увидеть некоторые различия в выборе слов внутри тем. Например, в теме 17 кластера коммунистов мы видим, что эта тема, как правило, касается рабочих и/или условий труда, что опять же имеет смысл, учитывая то, что мы знаем об этих работах, в то время как темы, наиболее распространенные в кластере США, похоже, отражают слова фундаментальные. к нашей республиканской системе.

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

Полный код этого проекта можно найти на моей странице GitHub по адресу:https://github.com/nbehe/NLP_texts/blob/main/Beheshti_project_code.ipynb

*Этот проект является небольшой частью более крупного проекта, выполненного для моего курса текстовой аналитики. Код этого проекта представляет собой смесь моей работы, предоставленной инструкторами и предоставленной в материалах курса.*