ldaModel

Модель латентного распределения Дирихле (LDA)

Описание

Модель латентного распределения Дирихле (LDA) является тематической моделью, которая обнаруживает базовые темы в наборе документов и выводит вероятности слов в темах. Если модель подгонялась с помощью модели bag-of-n-gams, то программа рассматривает n-gams как отдельные слова.

Создание

Создайте модель LDA с помощью fitlda функция.

Свойства

расширить все

Количество тем в модели LDA, заданное как положительное целое число.

Концентрация темы, заданная как положительная скалярная величина. Функция устанавливает концентрацию по темам равной TopicConcentration/NumTopics. Для получения дополнительной информации смотрите Латентное распределение Дирихле.

Концентрация слова, заданная как неотрицательный скаляр. Программное обеспечение устанавливает концентрацию каждого слова равной WordConcentration/numWords, где numWords - размер словаря входных документов. Для получения дополнительной информации смотрите Латентное распределение Дирихле.

Тематические вероятности входа документов, заданные как вектор. Вероятности темы corpus модели LDA являются вероятностями наблюдения каждой темы во всем наборе данных, используемом для соответствия модели LDA. CorpusTopicProbabilities вектор 1-by- K, где K - количество тем. k-я запись CorpusTopicProbabilities соответствует вероятности наблюдения за k темы.

Вероятности темы по входному документу, заданные как матрица. Вероятности темы документа модели LDA являются вероятностями наблюдения каждой темы в каждом документе, используемом для соответствия модели LDA. DocumentTopicProbabilities - D матрица K, где D - количество документов, используемых для соответствия модели LDA, и K - количество тем. (d,k)-я запись DocumentTopicProbabilities соответствует вероятности наблюдения за темой, k в d документа.

Если какие-либо темы имеют нулевую вероятность (CorpusTopicProbabilities содержит нули), затем соответствующие столбцы DocumentTopicProbabilities и TopicWordProbabilities являются нулями.

Порядок строк в DocumentTopicProbabilities соответствует порядку документов в обучающих данных.

Вероятности слова по теме, заданные как матрица. Вероятности тематического слова модели LDA являются вероятностями наблюдения каждого слова в каждой теме модели LDA. TopicWordProbabilities является V -by- K матрицей, где V - количество слов в Vocabulary и K количество тем. (v,k)-я запись TopicWordProbabilities соответствует вероятности наблюдения словесных v в тематических k.

Если какие-либо темы имеют нулевую вероятность (CorpusTopicProbabilities содержит нули), затем соответствующие столбцы DocumentTopicProbabilities и TopicWordProbabilities являются нулями.

Порядок строк в TopicWordProbabilities соответствует порядку слов в Vocabulary.

Порядок темы, заданный как один из следующих:

  • 'initial-fit-probability' - Сортировка темы по вероятностям темы corpus начальной подгонки модели. Эти вероятности являются CorpusTopicProbabilities свойство начальной ldaModel объект, возвращенный fitlda. resume функция не переупорядочивает темы полученной ldaModel объекты.

  • 'unordered' - Не заказывайте темы.

Информация, записанная при подборе модели LDA, задается как struct со следующими полями:

  • TerminationCode - Состояние оптимизации при выходе

    • 0 - Достигнут предел итерации.

    • 1 - Допуск логарифмической логарифмической правдоподобности.

  • TerminationStatus - Объяснение возвращенного кода окончания

  • NumIterations - Количество выполненных итераций

  • NegativeLogLikelihood - Отрицательная логарифмическая правдоподобность передачи данных в fitlda

  • Perplexity - Недоумение для данных, переданных fitlda

  • Solver - Имя используемого решателя

  • History - Struct, содержащая историю оптимизации

  • StochasticInfo - Информация о хранении struct для стохастических решателей

Типы данных: struct

Список слов в модели, заданный как строковый вектор.

Типы данных: string

Функции объекта

logpЛогарифмические вероятности и качество подгонки модели LDA
predictПрогнозирование основных тем LDA документов
resumeВозобновите подгонку модели LDA
topkwordsСамые важные слова в модели мешка слов или теме LDA
transformПреобразуйте документы в низкомерное пространство
wordcloudСоздайте график облака слов из текста, модели мешка слов, модели мешка n-граммов или модели LDA

Примеры

свернуть все

Чтобы воспроизвести результаты в этом примере, установите rng на 'default'.

rng('default')

Загрузите данные примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txtразделите текст на документы в символах новой строки, а затем пометьте его токеном.

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

Создайте модель мешка слов с помощью bagOfWords.

bag = bagOfWords(documents)
bag = 
  bagOfWords with properties:

          Counts: [154x3092 double]
      Vocabulary: [1x3092 string]
        NumWords: 3092
    NumDocuments: 154

Подгонка модели LDA с четырьмя темами.

numTopics = 4;
mdl = fitlda(bag,numTopics)
Initial topic assignments sampled in 0.077325 seconds.
=====================================================================================
| Iteration  |  Time per  |  Relative  |  Training  |     Topic     |     Topic     |
|            | iteration  | change in  | perplexity | concentration | concentration |
|            | (seconds)  |   log(L)   |            |               |   iterations  |
=====================================================================================
|          0 |       0.36 |            |  1.215e+03 |         1.000 |             0 |
|          1 |       0.01 | 1.0482e-02 |  1.128e+03 |         1.000 |             0 |
|          2 |       0.01 | 1.7190e-03 |  1.115e+03 |         1.000 |             0 |
|          3 |       0.01 | 4.3796e-04 |  1.118e+03 |         1.000 |             0 |
|          4 |       0.01 | 9.4193e-04 |  1.111e+03 |         1.000 |             0 |
|          5 |       0.01 | 3.7079e-04 |  1.108e+03 |         1.000 |             0 |
|          6 |       0.01 | 9.5777e-05 |  1.107e+03 |         1.000 |             0 |
=====================================================================================
mdl = 
  ldaModel with properties:

                     NumTopics: 4
             WordConcentration: 1
            TopicConcentration: 1
      CorpusTopicProbabilities: [0.2500 0.2500 0.2500 0.2500]
    DocumentTopicProbabilities: [154x4 double]
        TopicWordProbabilities: [3092x4 double]
                    Vocabulary: [1x3092 string]
                    TopicOrder: 'initial-fit-probability'
                       FitInfo: [1x1 struct]

Визуализируйте темы с помощью облаков слов.

figure
for topicIdx = 1:4
    subplot(2,2,topicIdx)
    wordcloud(mdl,topicIdx);
    title("Topic: " + topicIdx)
end

Figure contains objects of type wordcloud. The chart of type wordcloud has title Topic: 1. The chart of type wordcloud has title Topic: 2. The chart of type wordcloud has title Topic: 3. The chart of type wordcloud has title Topic: 4.

Составьте таблицу слов с самой высокой вероятностью темы LDA.

Чтобы воспроизвести результаты, установите rng на 'default'.

rng('default')

Загрузите данные примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txtразделите текст на документы в символах новой строки, а затем пометьте его токеном.

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

Создайте модель мешка слов с помощью bagOfWords.

bag = bagOfWords(documents);

Подгонка модели LDA с 20 темами. Чтобы подавить подробный выход, установите 'Verbose' в 0.

numTopics = 20;
mdl = fitlda(bag,numTopics,'Verbose',0);

Найдите 20 лучших слов первой темы.

k = 20;
topicIdx = 1;
tbl = topkwords(mdl,k,topicIdx)
tbl=20×2 table
      Word        Score  
    ________    _________

    "eyes"        0.11155
    "beauty"      0.05777
    "hath"       0.055778
    "still"      0.049801
    "true"       0.043825
    "mine"       0.033865
    "find"       0.031873
    "black"      0.025897
    "look"       0.023905
    "tis"        0.023905
    "kind"       0.021913
    "seen"       0.021913
    "found"      0.017929
    "sin"        0.015937
    "three"      0.013945
    "golden"    0.0099608
      ⋮

Найдите 20 лучших слов первой темы и используйте обратное среднее масштабирование в счетах.

tbl = topkwords(mdl,k,topicIdx,'Scaling','inversemean')
tbl=20×2 table
      Word       Score  
    ________    ________

    "eyes"        1.2718
    "beauty"     0.59022
    "hath"        0.5692
    "still"      0.50269
    "true"       0.43719
    "mine"       0.32764
    "find"       0.32544
    "black"      0.25931
    "tis"        0.23755
    "look"       0.22519
    "kind"       0.21594
    "seen"       0.21594
    "found"      0.17326
    "sin"        0.15223
    "three"      0.13143
    "golden"    0.090698
      ⋮

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

figure
wordcloud(tbl.Word,tbl.Score);

Figure contains an object of type wordcloud.

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

Чтобы воспроизвести результаты, установите rng на 'default'.

rng('default')

Загрузите данные примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txtразделите текст на документы в символах новой строки, а затем пометьте его токеном.

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

Создайте модель мешка слов с помощью bagOfWords.

bag = bagOfWords(documents);

Подгонка модели LDA с 20 темами. Чтобы подавить подробный выход, установите 'Verbose' в 0.

numTopics = 20;
mdl = fitlda(bag,numTopics,'Verbose',0)
mdl = 
  ldaModel with properties:

                     NumTopics: 20
             WordConcentration: 1
            TopicConcentration: 5
      CorpusTopicProbabilities: [1x20 double]
    DocumentTopicProbabilities: [154x20 double]
        TopicWordProbabilities: [3092x20 double]
                    Vocabulary: [1x3092 string]
                    TopicOrder: 'initial-fit-probability'
                       FitInfo: [1x1 struct]

Просмотрите тематические вероятности первого документа в обучающих данных.

topicMixtures = mdl.DocumentTopicProbabilities;
figure
bar(topicMixtures(1,:))
title("Document 1 Topic Probabilities")
xlabel("Topic Index")
ylabel("Probability")

Figure contains an axes. The axes with title Document 1 Topic Probabilities contains an object of type bar.

Чтобы воспроизвести результаты в этом примере, установите rng на 'default'.

rng('default')

Загрузите данные примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txtразделите текст на документы в символах новой строки, а затем пометьте его токеном.

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

Создайте модель мешка слов с помощью bagOfWords.

bag = bagOfWords(documents)
bag = 
  bagOfWords with properties:

          Counts: [154x3092 double]
      Vocabulary: [1x3092 string]
        NumWords: 3092
    NumDocuments: 154

Подгонка модели LDA с 20 темами.

numTopics = 20;
mdl = fitlda(bag,numTopics)
Initial topic assignments sampled in 0.029643 seconds.
=====================================================================================
| Iteration  |  Time per  |  Relative  |  Training  |     Topic     |     Topic     |
|            | iteration  | change in  | perplexity | concentration | concentration |
|            | (seconds)  |   log(L)   |            |               |   iterations  |
=====================================================================================
|          0 |       0.39 |            |  1.159e+03 |         5.000 |             0 |
|          1 |       0.13 | 5.4884e-02 |  8.028e+02 |         5.000 |             0 |
|          2 |       0.11 | 4.7400e-03 |  7.778e+02 |         5.000 |             0 |
|          3 |       0.11 | 3.4597e-03 |  7.602e+02 |         5.000 |             0 |
|          4 |       0.14 | 3.4662e-03 |  7.430e+02 |         5.000 |             0 |
|          5 |       0.11 | 2.9259e-03 |  7.288e+02 |         5.000 |             0 |
|          6 |       0.14 | 6.4180e-05 |  7.291e+02 |         5.000 |             0 |
=====================================================================================
mdl = 
  ldaModel with properties:

                     NumTopics: 20
             WordConcentration: 1
            TopicConcentration: 5
      CorpusTopicProbabilities: [1x20 double]
    DocumentTopicProbabilities: [154x20 double]
        TopicWordProbabilities: [3092x20 double]
                    Vocabulary: [1x3092 string]
                    TopicOrder: 'initial-fit-probability'
                       FitInfo: [1x1 struct]

Спрогнозируйте верхние темы для массива новых документов.

newDocuments = tokenizedDocument([
    "what's in a name? a rose by any other name would smell as sweet."
    "if music be the food of love, play on."]);
topicIdx = predict(mdl,newDocuments)
topicIdx = 2×1

    19
     8

Визуализируйте предсказанные темы с помощью облаков слов.

figure
subplot(1,2,1)
wordcloud(mdl,topicIdx(1));
title("Topic " + topicIdx(1))
subplot(1,2,2)
wordcloud(mdl,topicIdx(2));
title("Topic " + topicIdx(2))

Figure contains objects of type wordcloud. The chart of type wordcloud has title Topic 19. The chart of type wordcloud has title Topic 8.

Подробнее о

расширить все

Введенный в R2017b