Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

컨벌루션 신경망을 사용하여 텍스트 데이터 분류하기

이 예제에서는 컨벌루션 신경망을 사용하여 텍스트 데이터를 분류하는 방법을 보여줍니다.

컨벌루션을 사용하여 텍스트 데이터를 분류하려면 입력의 시간 차원에 대해 컨벌루션하는 1-D 컨벌루션 계층을 사용합니다.

이 예제에서는 다양한 너비의 1-D 컨벌루션 필터로 신경망을 훈련시킵니다. 각 필터의 너비는 필터가 볼 수 있는 단어 수(n-gram 길이)에 대응됩니다. 신경망에는 컨벌루션 계층의 여러 분기가 있으므로 다양한 n-gram 길이를 사용할 수 있습니다.

데이터 불러오기

factoryReports.csv의 데이터에서 테이블 형식 텍스트 데이터저장소를 만들고 처음 몇 개의 보고서를 표시합니다.

data = readtable("factoryReports.csv");
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

데이터를 훈련 파티션과 검증 파티션으로 분할합니다. 데이터의 80%는 훈련에 사용하고 나머지 데이터는 검증에 사용합니다.

cvp = cvpartition(data.Category,Holdout=0.2);
dataTrain = data(training(cvp),:);
dataValidation = data(test(cvp),:);

텍스트 데이터 전처리하기

테이블의 "Description" 열에서 텍스트 데이터를 추출하고 preprocessText 함수(예제의 텍스트 함수 전처리하기 섹션에 있음)를 사용하여 전처리합니다.

documentsTrain = preprocessText(dataTrain.Description);

"Category" 열에서 레이블을 추출하여 categorical형으로 변환합니다.

TTrain = categorical(dataTrain.Category);

클래스 이름과 관측값 개수를 표시합니다.

classNames = unique(TTrain)
classNames = 4×1 categorical
     Electronic Failure 
     Leak 
     Mechanical Failure 
     Software Failure 

numObservations = numel(TTrain)
numObservations = 384

동일한 단계를 사용하여 검증 데이터를 추출하고 전처리합니다.

documentsValidation = preprocessText(dataValidation.Description);
TValidation = categorical(dataValidation.Category);

문서를 시퀀스로 변환하기

문서를 신경망에 입력하기 위해 단어 인코딩을 사용하여 문서를 숫자형 인덱스로 구성된 시퀀스로 변환합니다.

문서에서 단어 인코딩을 만듭니다.

enc = wordEncoding(documentsTrain);

단어 인코딩의 단어집 크기를 표시합니다. 단어집 크기는 단어 인코딩의 고유 단어 개수입니다.

numWords = enc.NumWords
numWords = 436

doc2sequence 함수를 사용하여 문서를 정수 시퀀스로 변환합니다.

XTrain = doc2sequence(enc,documentsTrain);

훈련 데이터에서 만들어진 단어 인코딩을 사용하여 검증 문서를 시퀀스로 변환합니다.

XValidation = doc2sequence(enc,documentsValidation);

신경망 아키텍처 정의하기

분류 작업을 위한 신경망 아키텍처를 정의합니다.

다음 단계는 신경망 아키텍처를 설명합니다.

  • 입력 크기를 1로 지정합니다. 이는 정수 시퀀스 입력의 채널 차원에 대응됩니다.

  • 차원 100의 단어 임베딩을 사용하여 입력을 임베딩합니다.

  • n-gram 길이 2, 3, 4, 5에 대해 컨벌루션 계층, 배치 정규화 계층, ReLU 계층, 드롭아웃 계층, 최대 풀링 계층을 포함하는 계층 블록을 만듭니다.

  • 각 블록에 대해 크기가 1×N인 컨벌루션 필터 200개와 전역 최댓값 풀링 계층을 지정합니다.

  • 입력 계층을 각 블록에 연결하고 결합 계층을 사용하여 블록의 출력을 결합합니다.

  • 출력을 분류하기 위해 출력 크기가 K인 완전 연결 계층, 소프트맥스 계층, 분류 계층을 포함합니다. 여기서 K는 클래스 개수입니다.

신경망 하이퍼파라미터를 지정합니다.

embeddingDimension = 100;
ngramLengths = [2 3 4 5];
numFilters = 200;

먼저 입력 계층과 차원이 100인 단어 임베딩 계층을 포함하는 계층 그래프를 만듭니다. 단어 임베딩 계층을 컨벌루션 계층에 연결하는 데 도움이 되도록 단어 임베딩 계층 이름을 "emb"로 설정합니다. 컨벌루션 계층이 훈련 중에 시퀀스의 길이가 0이 되도록 컨벌루션하지 않도록 하려면 MinLength 옵션을 훈련 데이터에서 가장 짧은 시퀀스의 길이로 설정합니다.

minLength = min(doclength(documentsTrain));
layers = [ 
    sequenceInputLayer(1,MinLength=minLength)
    wordEmbeddingLayer(embeddingDimension,numWords,Name="emb")];
lgraph = layerGraph(layers);

각 n-gram 길이에 대해 1-D 컨벌루션 계층, 배치 정규화 계층, ReLU 계층, 드롭아웃 계층, 1-D 전역 최댓값 풀링 계층의 블록을 만듭니다. 각 블록을 단어 임베딩 계층에 연결합니다.

numBlocks = numel(ngramLengths);
for j = 1:numBlocks
    N = ngramLengths(j);
    
    block = [
        convolution1dLayer(N,numFilters,Name="conv"+N,Padding="same")
        batchNormalizationLayer(Name="bn"+N)
        reluLayer(Name="relu"+N)
        dropoutLayer(0.2,Name="drop"+N)
        globalMaxPooling1dLayer(Name="max"+N)];
    
    lgraph = addLayers(lgraph,block);
    lgraph = connectLayers(lgraph,"emb","conv"+N);
end

결합 계층, 완전 연결 계층, 소프트맥스 계층, 분류 계층을 추가합니다.

numClasses = numel(classNames);

layers = [
    concatenationLayer(1,numBlocks,Name="cat")
    fullyConnectedLayer(numClasses,Name="fc")
    softmaxLayer(Name="soft")
    classificationLayer(Name="classification")];

lgraph = addLayers(lgraph,layers);

전역 최댓값 풀링 계층을 결합 계층에 연결하고 신경망 아키텍처를 플롯으로 표시합니다.

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

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

신경망 훈련시키기

다음과 같이 훈련 옵션을 지정합니다.

  • 미니 배치 크기를 128로 지정하여 훈련시킵니다.

  • 검증 데이터를 사용하여 신경망을 검증합니다.

  • 검증 손실이 가장 낮은 신경망을 반환합니다.

  • 훈련 진행 상황 플롯을 표시하고 세부 정보는 표시하지 않습니다.

options = trainingOptions("adam", ...
    MiniBatchSize=128, ...
    ValidationData={XValidation,TValidation}, ...
    OutputNetwork="best-validation-loss", ...
    Plots="training-progress", ...
    Verbose=false);

trainNetwork 함수를 사용하여 신경망을 훈련시킵니다.

net = trainNetwork(XTrain,TTrain,lgraph,options);

신경망 테스트하기

훈련된 신경망을 사용하여 검증 데이터를 분류합니다.

YValidation = classify(net,XValidation);

혼동행렬 차트에서 분류 예측을 시각화합니다.

figure
confusionchart(TValidation,YValidation)

분류 정확도를 계산합니다. 정확도는 올바르게 예측된 레이블의 비율입니다.

accuracy = mean(TValidation == YValidation)
accuracy = 0.9375

새 데이터를 사용하여 예측하기

새 보고서 3개의 이벤트 유형을 분류합니다. 새 보고서를 포함하는 string형 배열을 만듭니다.

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

훈련 문서와 검증 문서에서 사용한 것과 동일한 전처리 단계를 사용하여 텍스트 데이터를 전처리합니다.

documentsNew = preprocessText(reportsNew);
XNew = doc2sequence(enc,documentsNew);

훈련된 신경망을 사용하여 새 시퀀스를 분류합니다.

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

텍스트 함수 전처리하기

preprocessTextData 함수는 데이터를 입력으로 받아 다음 단계를 수행합니다.

  1. 텍스트를 토큰화합니다.

  2. 텍스트를 소문자로 변환합니다.

function documents = preprocessText(textData)

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

end

참고 항목

| | | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | (Deep Learning Toolbox) | |

관련 항목