Мы исследуем два разных подхода к автоматическому обнаружению тем без учителя: тематическое моделирование с помощью скрытого анализа направления (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 решил, что в данных было только шесть тем ( республика, силы, решимость, набу, джедай, люк).
Имена тем производились путем нахождения вектора слов, ближайшего к центру кластера.