exponenta event banner

Классификация текстовых данных с использованием сверточной нейронной сети

В этом примере показано, как классифицировать текстовые данные с помощью сверточной нейронной сети.

Чтобы классифицировать текстовые данные с помощью сверток, необходимо преобразовать текстовые данные в изображения. Для этого поместите или усечите наблюдения, чтобы они имели постоянную длину S, и преобразуйте документы в последовательности векторов слов длиной C, используя вложение слов. Затем можно представить документ в виде 1-by-S-by-C изображения (изображение с высотой 1, шириной S и C каналов).

Чтобы преобразовать текстовые данные из CSV-файла в изображения, создайте tabularTextDatastore объект. Преобразование данных, считанных из tabularTextDatastore объект к изображениям для глубокого обучения путем вызова transform с пользовательской функцией преобразования. transformTextData функция, перечисленная в конце примера, берет данные, считанные из хранилища данных, и предварительно подготовленное вложение слов и преобразует каждое наблюдение в массив векторов слов.

В этом примере обучается сеть с 1-D сверточными фильтрами различной ширины. Ширина каждого фильтра соответствует количеству слов, которые может видеть фильтр (длина n-грамма). Сеть имеет несколько ветвей сверточных слоев, поэтому она может использовать разные n-граммовые длины.

Загрузка предварительно обученного встраивания слов

Загрузите предварительно подготовленное вложение слова fastText. Для выполнения этой функции требуется модель Text Analytics Toolbox™ для пакета поддержки внедрения Token Word на английском языке на 16 миллиардов. Если этот пакет поддержки не установлен, функция предоставляет ссылку для загрузки.

emb = fastTextWordEmbedding;

Загрузить данные

Создание хранилища табличных текстовых данных из данных в factoryReports.csv. Считывание данных из "Description" и "Category" только столбцы.

filenameTrain = "factoryReports.csv";
textName = "Description";
labelName = "Category";
ttdsTrain = tabularTextDatastore(filenameTrain,'SelectedVariableNames',[textName labelName]);

Предварительный просмотр хранилища данных.

ttdsTrain.ReadSize = 8;
preview(ttdsTrain)
ans=8×2 table
                                  Description                                         Category       
    _______________________________________________________________________    ______________________

    {'Items are occasionally getting stuck in the scanner spools.'        }    {'Mechanical Failure'}
    {'Loud rattling and banging sounds are coming from assembler pistons.'}    {'Mechanical Failure'}
    {'There are cuts to the power when starting the plant.'               }    {'Electronic Failure'}
    {'Fried capacitors in the assembler.'                                 }    {'Electronic Failure'}
    {'Mixer tripped the fuses.'                                           }    {'Electronic Failure'}
    {'Burst pipe in the constructing agent is spraying coolant.'          }    {'Leak'              }
    {'A fuse is blown in the mixer.'                                      }    {'Electronic Failure'}
    {'Things continue to tumble off of the belt.'                         }    {'Mechanical Failure'}

Создайте пользовательскую функцию преобразования, которая преобразует данные, считанные из хранилища данных, в таблицу, содержащую предикторы и ответы. transformTextData функция, перечисленная в конце примера, берет данные, считанные из tabularTextDatastore и возвращает таблицу предикторов и ответов. Предикторы 1-by-sequenceLength-by-C-массивы векторов слов, задаваемые вложением слов emb, где C - размер встраивания. Ответы являются категориальными метками над классами в classNames.

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

labels = readLabels(ttdsTrain,labelName);
classNames = unique(labels);
numObservations = numel(labels);

Преобразование хранилища данных с помощью transformTextData и укажите длину последовательности, равную 14.

sequenceLength = 14;
tdsTrain = transform(ttdsTrain, @(data) transformTextData(data,sequenceLength,emb,classNames))
tdsTrain = 
  TransformedDatastore with properties:

       UnderlyingDatastore: [1×1 matlab.io.datastore.TabularTextDatastore]
    SupportedOutputFormats: ["txt"    "csv"    "xlsx"    "xls"    "parquet"    "parq"    "png"    "jpg"    "jpeg"    "tif"    "tiff"    "wav"    "flac"    "ogg"    "mp4"    "m4a"]
                Transforms: {@(data)transformTextData(data,sequenceLength,emb,classNames)}
               IncludeInfo: 0

Предварительный просмотр преобразованного хранилища данных. Предикторами являются 1-by-S-by-C массива, где S - длина последовательности, а C - количество признаков (размерность внедрения). Ответы являются категориальными метками.

preview(tdsTrain)
ans=8×2 table
       Predictors            Responses     
    _________________    __________________

    {1×14×300 single}    Mechanical Failure
    {1×14×300 single}    Mechanical Failure
    {1×14×300 single}    Electronic Failure
    {1×14×300 single}    Electronic Failure
    {1×14×300 single}    Electronic Failure
    {1×14×300 single}    Leak              
    {1×14×300 single}    Electronic Failure
    {1×14×300 single}    Mechanical Failure

Определение сетевой архитектуры

Определите архитектуру сети для задачи классификации.

Ниже описана архитектура сети.

  • Укажите входной размер 1-by-S-by-C, где S - длина последовательности, а C - количество элементов (размер встраивания).

  • Для n-граммовых длин 2, 3, 4 и 5 создайте блоки слоев, содержащих сверточный слой, слой нормализации пакета, слой ReLU, слой отсева и слой максимального объединения.

  • Для каждого блока укажите 200 сверточных фильтров размера 1-by-N и областей объединения размера 1-by-S, где N - длина n-грамма.

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

  • Для классификации выходов включают в себя полностью соединенный уровень с выходным размером K, уровень softmax и уровень классификации, где K - количество классов.

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

numFeatures = emb.Dimension;
inputSize = [1 sequenceLength numFeatures];
numFilters = 200;

ngramLengths = [2 3 4 5];
numBlocks = numel(ngramLengths);

numClasses = numel(classNames);

Создайте график слоев, содержащий входной слой. Задайте для опции нормализации значение 'none' и имя слоя для 'input'.

layer = imageInputLayer(inputSize,'Normalization','none','Name','input');
lgraph = layerGraph(layer);

Для каждого из n-граммовых уровней создайте блок свертки, пакетной нормализации, ReLU, отсева и максимального объединения. Подключите каждый блок к входному слою.

for j = 1:numBlocks
    N = ngramLengths(j);
    
    block = [
        convolution2dLayer([1 N],numFilters,'Name',"conv"+N,'Padding','same')
        batchNormalizationLayer('Name',"bn"+N)
        reluLayer('Name',"relu"+N)
        dropoutLayer(0.2,'Name',"drop"+N)
        maxPooling2dLayer([1 sequenceLength],'Name',"max"+N)];
    
    lgraph = addLayers(lgraph,block);
    lgraph = connectLayers(lgraph,'input',"conv"+N);
end

Просмотр сетевой архитектуры на графике.

figure
plot(lgraph)
title("Network Architecture")

Добавьте слой конкатенации глубины, полностью соединенный слой, слой softmax и классификационный слой.

layers = [
    depthConcatenationLayer(numBlocks,'Name','depth')
    fullyConnectedLayer(numClasses,'Name','fc')
    softmaxLayer('Name','soft')
    classificationLayer('Name','classification')];

lgraph = addLayers(lgraph,layers);

figure
plot(lgraph)
title("Network Architecture")

Подключите максимальные уровни объединения к слою конкатенации глубины и просмотрите окончательную сетевую архитектуру на графике.

for j = 1:numBlocks
    N = ngramLengths(j);
    lgraph = connectLayers(lgraph,"max"+N,"depth/in"+j);
end

figure
plot(lgraph)
title("Network Architecture")

Железнодорожная сеть

Укажите параметры обучения:

  • Поезд с размером мини-партии 128.

  • Не тасуйте данные, так как хранилище данных не может тасоваться.

  • Отображение графика хода обучения и подавление подробных выходных данных.

miniBatchSize = 128;
numIterationsPerEpoch = floor(numObservations/miniBatchSize);

options = trainingOptions('adam', ...
    'MiniBatchSize',miniBatchSize, ...
    'Shuffle','never', ...
    'Plots','training-progress', ...
    'Verbose',false);

Обучение сети с помощью trainNetwork функция.

net = trainNetwork(tdsTrain,lgraph,options);

Прогнозирование с использованием новых данных

Классифицируйте тип события для трех новых отчетов. Создайте строковый массив, содержащий новые отчеты.

reportsNew = [ 
    "Coolant is pooling underneath sorter."
    "Sorter blows fuses at start up."
    "There are some very loud rattling sounds coming from the assembler."];

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

XNew = preprocessText(reportsNew,sequenceLength,emb);

Классифицируйте новые последовательности с помощью обученной сети LSTM.

labelsNew = classify(net,XNew)
labelsNew = 3×1 categorical
     Leak 
     Electronic Failure 
     Mechanical Failure 

Функция чтения меток

readLabels создает копию tabularTextDatastore объект ttds и считывает метки из labelName столбец.

function labels = readLabels(ttds,labelName)

ttdsNew = copy(ttds);
ttdsNew.SelectedVariableNames = labelName;
tbl = readall(ttdsNew);
labels = tbl.(labelName);

end

Функция преобразования текстовых данных

transformTextData функция принимает данные, считанные из tabularTextDatastore и возвращает таблицу предикторов и ответов. Предикторы 1-by-sequenceLength-by-C-массивы векторов слов, задаваемые вложением слов emb, где C - размер встраивания. Ответы являются категориальными метками над классами в classNames.

function dataTransformed = transformTextData(data,sequenceLength,emb,classNames)

% Preprocess documents.
textData = data{:,1};

% Prepocess text
dataTransformed = preprocessText(textData,sequenceLength,emb);

% Read labels.
labels = data{:,2};
responses = categorical(labels,classNames);

% Convert data to table.
dataTransformed.Responses = responses;

end

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

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

  1. Выполните маркировку текста.

  2. Преобразование текста в нижний регистр.

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

  4. Изменение формы векторных последовательностей слов для ввода в сеть.

function tbl = preprocessText(textData,sequenceLength,emb)

documents = tokenizedDocument(textData);
documents = lower(documents);

% Convert documents to embeddingDimension-by-sequenceLength-by-1 images.
predictors = doc2sequence(emb,documents,'Length',sequenceLength);

% Reshape images to be of size 1-by-sequenceLength-embeddingDimension.
predictors = cellfun(@(X) permute(X,[3 2 1]),predictors,'UniformOutput',false);

tbl = table;
tbl.Predictors = predictors;

end

См. также

| | | | | | (инструментарий для анализа текста) | (Панель инструментов для анализа текста) | (Панель инструментов для анализа текста) | (Панель инструментов для анализа текста) | (Панель инструментов для анализа текста)

Связанные темы