Мы исследуем два разных подхода к автоматическому обнаружению тем без учителя: тематическое моделирование с помощью скрытого анализа направления (LDA ) и текстовая кластеризация.

Допустим, мы хотим знать основные темы, затрагивающие вступительные титры к каждому эпизоду «Звездных войн».

Есть ли способ у машины прочитать и обобщить нам основные темы и концепции?

Предположим, они затрагивают несколько тем.

n_topics = 7

LDA

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

import gensim
docs = [[token.lower() for token in gensim.utils.tokenize(gensim.parsing.preprocessing.remove_stopwords(doc))] for doc in starwars_episodes.values()]
vocab = gensim.corpora.Dictionary(docs)
bow_corpus = [vocab.doc2bow(doc) for doc in docs]
lda_model = gensim.models.LdaMulticore(bow_corpus, num_topics = n_topics, id2word = vocab, passes = 10, workers = 2)

К сожалению, он не может назвать обнаруженные темы, но может указать, какие наиболее вероятные слова относятся к каждой теме:

Кластеризация

В качестве альтернативы мы можем встроить каждое слово как вектор и кластеризовать векторы, используя алгоритм K-средних или алгоритм кластеризации на основе плотности (например, DBScan).

def k_cluster(vectors, k):
  clusterer = KMeans(n_clusters = k)
  clusterer.fit(vectors)
  return clusterer.labels_
def d_cluster(vectors):
  clusterer = DBSCAN(eps=20, min_samples=3)
  clusterer.fit(vectors)
  return clusterer.labels_

Преимущество использования алгоритма, основанного на плотности, заключается в том, что вам не нужно указывать количество тем, которые вы ищете, как при использовании K-средних или LDA.

Кластеризация K-средних значений, найденная на основе данных, включает семь тем (исчезновение, разрешение, naboo, галактическое, создание, маршруты, поддержка), тогда как DBScan решил, что в данных было только шесть тем ( республика, силы, решимость, набу, джедай, люк).

Имена тем производились путем нахождения вектора слов, ближайшего к центру кластера.