Определение тематики текста на R

Латентное размещение Дирихле

R имеет интересные возможности для обработки и анализа неструктурированных данных, таких как простой текст. Используя библиотеки RTextTools и topicmodels R, процесс, называемый Latent Dirichlet Allocation (Латентное размещение Дирихле), может быть выполнен так чтобы код был достаточно чистым и читаемым. На других языках учебный код может быть более сложным.

За реализацию данного алгоритма в PHP на freelancer.com дают от 700 до 1500$

Тематическое моделирование на примере алгоритма Латентного размещения Дирихле

Latent Dirichlet Allocation (LDA) представляет собой порождающую модель, позволяющую объяснять результаты наблюдений с помощью неявных групп, благодаря чему возможно выявление причин сходства некоторых частей данных (Wikipedia). В этой статье это будет просто способ автоматического обнаружения тем, содержащихся в предложениях. Подробно о том, как он работает здесь.

Существуют и другие алгоритмы такие как LSA, PLSA про которые можно прочитать здесь 

Другими словами, это алгоритм построения значимых подмножеств; способ получить кластерный анализ или кластеризацию. Группировки набора объектов таким образом, чтобы объекты в одной и той же группе (называемые кластером) были более схожи (в том или ином смысле) друг с другом, чем с другими в группе (кластеров).

Латентное размещение Дирихле — наиболее распространенный алгоритм в тематическом моделировании (text mining) для обнаружения тем в документах.

Реализация text mining на R

Давайте посмотрим на примере языка R и LDA, как можно получить тематики статей новостей из открытого источника Posted-Today.Org

# Установка пакетов

install.packages(c("RTextTools", "topicmodels"))
install.packages(c("RCurl"))

#Подключение

library(RTextTools)
library(topicmodels)
require(RCurl)

#Скачиваем данные с сайта нововстей в формате "URL","Title","Text","SubjectExplode","HashTags"

csvPostedTodayOrg = getURL("http://posted-today.org/dumpCSV.php")
dataPostedTodayOrg = read.csv(textConnection(csvPostedTodayOrg), header = T)
data = data.frame(Title = dataPostedTodayOrg$Title, Subject = dataPostedTodayOrg$Text, Topic.Code=dataPostedTodayOrg$SubjectExplode)

# Строим матрицу тегов

matrix = create_matrix(
cbind(as.vector(data$Title), as.vector(data$Subject)),
language = "english", removeNumbers = T, stemWords = T, weighting = tm::weightTf)

LDA создаст столько подмножеств, сколько мы скажем. Данные Today.Org уже сгруппированы по не раскрытому довольно неясному, но эффективному алгоритму (кстати, закодирован в простой PHP).
Таким образом, в dataPostedTodayOrg$SubjectExplode мы находим тему, назначенную для каждой новости. Впечатляет значимость. И эти данные разделяются на несколько кластеров, обычно между 20 и 30. Это число k:

k = length(unique(data$Topic.Code))

Теперь магия!

lda = LDA(matrix, k)

Выполнение может занять какое-то время, от минуты и более.
Читаем теги и темы:

terms = terms(lda)
topics = topics(lda)

Приводим всё в читаемый формат:

r = cbind(as.vector(data$Title), as.vector(data$Subject), as.vector(data$Topic.Code), as.vector(terms[topics]))

View(r)
Латентное размещение Дирихле
Латентное размещение Дирихле

Результаты

Первая мысль — LDA работает!
Созданные темы кажутся разумными. Учтите, что это Unsupervised Machine Learning, то есть Латентное размещение Дирихле не имеет никакого представления о том, что это за корпус. Он просто создает наилучшие подмножества для размещения каждого документа, чтобы минимизировать их различия, измеренные метрикой, определенной в матрице Document-Term.

Вторая — в результатах видно что в Posted-Today.Org уже проставлены тематики текста, которые выглядят лучше чем LDA. Однако мы не знаем кем или чем они были проставлены.
Итак, LDA — бесплатный и мощный алгоритм, который позволяет решать задачи тематического моделирования.

По материалам «Latent Dirichlet Allocation with R language» Juan Ignacio Pérez Sacristán

Spread the love

Оставьте первый комментарий

Оставить комментарий