이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
컨벌루션 신경망을 사용하여 텍스트 데이터 분류하기
이 예제에서는 컨벌루션 신경망을 사용하여 텍스트 데이터를 분류하는 방법을 보여줍니다.
컨벌루션을 사용하여 텍스트 데이터를 분류하려면 입력의 시간 차원에 대해 컨벌루션하는 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
함수는 데이터를 입력으로 받아 다음 단계를 수행합니다.
텍스트를 토큰화합니다.
텍스트를 소문자로 변환합니다.
function documents = preprocessText(textData) documents = tokenizedDocument(textData); documents = lower(documents); end
참고 항목
fastTextWordEmbedding
| wordcloud
| wordEmbedding
| layerGraph
(Deep Learning Toolbox) | convolution2dLayer
(Deep Learning Toolbox) | batchNormalizationLayer
(Deep Learning Toolbox) | trainingOptions
(Deep Learning Toolbox) | trainNetwork
(Deep Learning Toolbox) | doc2sequence
| tokenizedDocument
관련 항목
- 딥러닝을 사용하여 텍스트 데이터 분류하기
- Classify Out-of-Memory Text Data Using Deep Learning
- 분류를 위한 간단한 텍스트 모델 만들기
- 토픽 모델을 사용하여 텍스트 데이터 분석하기
- 다단어 구문을 사용하여 텍스트 데이터 분석하기
- 감성 분류기 훈련시키기
- 딥러닝을 사용한 시퀀스 분류 (Deep Learning Toolbox)
- MATLAB의 딥러닝 (Deep Learning Toolbox)