Определение тематики текста на R
Data Science для бизнеса
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 — бесплатный и мощный алгоритм, который позволяет решать задачи тематического моделирования.