Анализируйте текстовые данные с помощью тематических моделей

В этом примере показано, как использовать модель темы Latent Dirichlet Allocation (LDA) для анализа текстовых данных.

Модель Latent Dirichlet Allocation (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."

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

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

  1. Токенизация текста с помощью tokenizedDocument.

  2. Лемматизируйте слова, используя normalizeWords.

  3. Удалите пунктуацию с помощью erasePunctuation.

  4. Удалите список стоповых слов (таких как «and», «of», и «the») с помощью removeStopWords.

  5. Удалите слова с 2 или меньшим количеством символов, используя removeShortWords.

  6. Удалите слова с 15 или более символами, используя removeLongWords.

Используйте функцию предварительной обработки preprocessText для подготовки текстовых данных.

documents = preprocessText(textData);
documents(1:5)
ans = 
  5×1 tokenizedDocument:

    6 tokens: items occasionally get stuck scanner spool
    7 tokens: loud rattle 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×351 double]
      Vocabulary: [1×351 string]
        NumWords: 351
    NumDocuments: 480

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

bag = removeInfrequentWords(bag,2);
bag = removeEmptyDocuments(bag)
bag = 
  bagOfWords with properties:

          Counts: [480×162 double]
      Vocabulary: [1×162 string]
        NumWords: 162
    NumDocuments: 480

Подгонка модели LDA

Подгонка модели LDA с 7 темами. Пример, показывающий, как выбрать количество тем, см. в разделе Выбор количества тем для модели LDA. Чтобы подавить подробный выход, установите 'Verbose' в 0.

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

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

Визуализация тем с помощью облаков Word

Можно использовать облака слов для просмотра слов с наивысшими вероятностями в каждой теме. Визуализация первых четырех тем с помощью облаков слов.

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

Просмотр смесей тем в документах

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

newDocument = tokenizedDocument("Coolant is pooling underneath sorter.");
topicMixture = transform(mdl,newDocument);

figure
bar(topicMixture)
xlabel("Topic Index")
ylabel("Probability")
title("Document Topic Probabilities")

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

figure
topicMixtures = transform(mdl,documents(1:5));
barh(topicMixtures(1:5,:),'stacked')
xlim([0 1])
title("Topic Mixtures")
xlabel("Topic Probability")
ylabel("Document")
legend("Topic " + string(1:numTopics),'Location','northeastoutside')

Функция предварительной обработки

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

  1. Токенизация текста с помощью tokenizedDocument.

  2. Лемматизируйте слова, используя normalizeWords.

  3. Удалите пунктуацию с помощью erasePunctuation.

  4. Удалите список стоповых слов (таких как «and», «of», и «the») с помощью 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

См. также

| | | | | | | | |

Похожие темы