Визуализируйте корреляции между темами LDA и метками документа

В этом примере показано, как подбирать модель темы Скрытого выделения Дирихле (LDA) и визуализировать корреляции между темами LDA и метками документа.

Модель Latent Dirichlet Allocation (LDA) является моделью темы, которая обнаруживает базовые темы в наборе документов и выводит вероятности слова в темах. Подбирать модель LDA не требует маркированных данных. Однако можно визуализировать корреляции между подходящими темами LDA, и метки документа с помощью параллели координирует график.

Этот пример подбирает модель LDA к набору данных Отчетов Фабрики, который является набором отчетов фабрики, детализирующих различные события отказа, и идентифицирует корреляции между темами LDA и категорией отчета.

Загрузите и извлеките текстовые данные

Загрузите данные в качестве примера. Файл factoryReports.csv содержит отчеты фабрики, включая текстовое описание и категориальные метки для каждого события.

data = readtable("factoryReports.csv",TextType="string");
head(data)
ans=8×5 table
                                 Description                                       Category          Urgency          Resolution         Cost 
    _____________________________________________________________________    ____________________    ________    ____________________    _____

    "Items are occasionally getting stuck in the scanner spools."            "Mechanical Failure"    "Medium"    "Readjust Machine"         45
    "Loud rattling and banging sounds are coming from assembler pistons."    "Mechanical Failure"    "Medium"    "Readjust Machine"         35
    "There are cuts to the power when starting the plant."                   "Electronic Failure"    "High"      "Full Replacement"      16200
    "Fried capacitors in the assembler."                                     "Electronic Failure"    "High"      "Replace Components"      352
    "Mixer tripped the fuses."                                               "Electronic Failure"    "Low"       "Add to Watch List"        55
    "Burst pipe in the constructing agent is spraying coolant."              "Leak"                  "High"      "Replace Components"      371
    "A fuse is blown in the mixer."                                          "Electronic Failure"    "Low"       "Replace Components"      441
    "Things continue to tumble off of the belt."                             "Mechanical Failure"    "Low"       "Readjust Machine"         38

Извлеките текстовые данные из поля Description.

textData = data.Description;
textData(1:10)
ans = 10×1 string
    "Items are occasionally getting stuck in the scanner spools."
    "Loud rattling and banging sounds are coming from assembler pistons."
    "There are cuts to the power when starting the plant."
    "Fried capacitors in the assembler."
    "Mixer tripped the fuses."
    "Burst pipe in the constructing agent is spraying coolant."
    "A fuse is blown in the mixer."
    "Things continue to tumble off of the belt."
    "Falling items from the conveyor belt."
    "The scanner reel is split, it will soon begin to curve."

Извлеките метки из поля Category.

labels = data.Category;

Подготовьте текстовые данные к анализу

Создайте функцию, которая маркирует и предварительно обрабатывает текстовые данные, таким образом, они могут использоваться для анализа. Функциональный preprocessText, перечисленный в разделе Preprocessing Function примера, выполняет следующие шаги в порядке:

  1. Маркируйте текст с помощью tokenizedDocument.

  2. Lemmatize слова с помощью normalizeWords.

  3. Сотрите пунктуацию с помощью erasePunctuation.

  4. Удалите список слов остановки (такой как "и", и) использование removeStopWords.

  5. Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords.

  6. Удалите слова с 15 или больше символами с помощью removeLongWords.

Подготовьте текстовые данные к анализу с помощью preprocessText функция.

documents = preprocessText(textData);
documents(1:5)
ans = 5×1 tokenizedDocument array with properties:
    6 tokens: item occasionally get stuck scanner spool
    7 tokens: loud rattling bang sound come assembler piston
    4 tokens: cut power start plant
    3 tokens: fry capacitor assembler
    3 tokens: mixer trip fuse

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

bag = bagOfWords(documents)
bag = bagOfWords with properties:
          Counts: [480×338 double]
      Vocabulary: [1×338 string]
        NumWords: 338
    NumDocuments: 480

Удалите слова из модели сумки слов, которые имеют, не появляются больше чем два раза всего. Удалите любые документы, содержащие слова из модели сумки слов.

bag = removeInfrequentWords(bag,2);
bag = removeEmptyDocuments(bag)
bag = bagOfWords with properties:
          Counts: [480×158 double]
      Vocabulary: [1×158 string]
        NumWords: 158
    NumDocuments: 480

Подбирайте модель LDA

Подбирайте модель LDA с 7 темами. Для примера, показывающего, как выбрать количество тем, смотрите, Выбирают Number of Topics for LDA Model. Чтобы подавить многословный выход, установите Verbose опция к 0. Для воспроизводимости установите rng к "default".

rng("default")
numTopics = 7;
mdl = fitlda(bag,numTopics,Verbose=0);

Если у вас есть большой набор данных, то стохастический аппроксимированный вариационный решатель Бейеса обычно лучше подходит, когда он может подбирать хорошую модель в меньшем количестве передач данных. Решатель по умолчанию для fitlda (свернутый Гиббс, производящий), может быть более точным за счет занимания больше времени, чтобы запуститься. Чтобы использовать стохастического аппроксимированного вариационного Бейеса, установите Solver опция к "savb". Для примера, показывающего, как сравнить решатели LDA, смотрите, Сравнивают Решатели LDA.

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

figure
t = tiledlayout("flow");
title(t,"LDA Topics")

for i = 1:numTopics
    nexttile
    wordcloud(mdl,i);
    title("Topic " + i)
end

Визуализируйте корреляции между метками документа и темами

Визуализируйте корреляции между темами LDA и метками документа путем графического вывода средних вероятностей темы против каждой метки документа.

Извлеките смеси тематики документа из DocumentTopicProbabilities свойство модели LDA.

topicMixtures = mdl.DocumentTopicProbabilities;

Для документов с каждой меткой вычислите средние вероятности темы.

[groups,groupNames] = findgroups(labels);
numGroups = numel(groupNames);

for i = 1:numGroups
    idx = groups == i;
    meanTopicProbabilities(i,:) = mean(topicMixtures(idx,:));
end

Для каждой темы найдите лучшие три слова.

numTopics = mdl.NumTopics;
for i = 1:numTopics
    top = topkwords(mdl,3,i);
    topWords(i) = join(top.Word,", ");
end

Постройте средние вероятности темы на категорию с помощью графика координат параллели. Для удобочитаемости создайте фигуру и увеличьте ширину фигуры с помощью Position свойство.

f = figure;
f.Position(3) = 2*f.Position(3);

Постройте средние вероятности темы на категорию с помощью parallelplot функция. Не нормируйте входные данные и задавайте категории как группы. Установите координатные метки в виде галочки на лучшие три слова каждой темы.

p = parallelplot(meanTopicProbabilities, ...
    GroupData=groupNames, ...
    DataNormalization="none");

p.CoordinateTickLabels = topWords;

xlabel("LDA Topic")
ylabel("Mean Topic Probability")
title("LDA Topic and Document Label Correlations")

Параллельный график подсвечивает корреляции между темами LDA и метками документа. Высокий peaks указывает на сильную корреляцию между соответствующей темой и меткой документа.

Предварительная обработка функции

Функциональный preprocessText, выполняет следующие шаги в порядке:

  1. Маркируйте текст с помощью tokenizedDocument.

  2. Lemmatize слова с помощью normalizeWords.

  3. Сотрите пунктуацию с помощью erasePunctuation.

  4. Удалите список слов остановки (такой как "и", и) использование removeStopWords.

  5. Удалите слова с 2 или меньшим количеством символов с помощью removeShortWords.

  6. Удалите слова с 15 или больше символами с помощью removeLongWords.

function documents = preprocessText(textData)

% Tokenize the text.
documents = tokenizedDocument(textData);

% Lemmatize the words.
documents = addPartOfSpeechDetails(documents);
documents = normalizeWords(documents,'Style','lemma');

% Erase punctuation.
documents = erasePunctuation(documents);

% Remove a list of stop words.
documents = removeStopWords(documents);

% Remove words with 2 or fewer characters, and words with 15 or greater
% characters.
documents = removeShortWords(documents,2);
documents = removeLongWords(documents,15);

end

Смотрите также

| | |

Похожие темы