본문 바로가기
machine learning

TextToCNN으로 분류하기

by 유주원 2019. 1. 28.

Text를 마치 하나의 image로 인식해서 CNN 모델에 태우는 기법의 분류가 높은 성능을 보인다고 해서 나도 한번 테스트를 해봤다.

우선 이론 및 모델은 김윤 교수님의 논문인 Convolutional Neural Networks for Sentence Classification을 차용했다.




모델에 대해 간략히 설명하자면, 어떤 하나의 문장이 들어오면 해당 문장을 단어로 나누고 (위의 그림의 경우에서는 wait, for, the, video, and가 됨) 각 단어에 대해 embedding vector를 적용 시킨다. 가령 단어의 개수가 5개고 embedding vector가 128차원이라면 매트릭스는 5 x 128의 행렬이 된다.


이렇게 구성된 행렬에 convolution을 적용시킨다. 논문에서는 convolution convolution filter size를 3,4,5로 구성하였고, convolution channel output을 100으로 구성하였다. 즉 단어의 인접 단어를 3개, 4개, 5개까지 각각 보겠다는 의미를 나타낸다. 

예를 들어 5x128 행렬의 input이 들어가고 size 3의 convolution filter가 적용 되었다면, filter는 3x128의 크기를 나타내게 되고 결과 행렬은 100 x 3이 된다. (결과 단어가 5에서 3으로 준 이유는 마스킹 때문인데, 엣지로 인해 맨 처음 단어에 대한 마스킹과 마지막 단어에 대한 마스킹 절차를 하나씩 빼야 하기 때문에 2가 줄어들게 된다.)


convolution 이후에 relu를 태우고, max pooling을 진행한다. 이 단계에서는 가장 큰 값 하나만을 취한다.


max pooling을 진행한 후에는 각 단계에서의(kenel 3,4,5) max pooling 결과를 합친다. (sum이 아니라 concatenation) 


그 후 drop out을 진행한 후, fully connection을 진행해서 최종적으로 2개의 값 (True, False)을 갖도록 한다.


분류 값 1일 경우에는 fully connection 1의 값이 높도록 weight를 학습하고, 2일 경우에는 fully connection 2의 값이 높도록 학습을 진행하면 된다.




데이터 전처리의 경우에는 각 문장에서 띄어쓰기 기준으로 vocabulary를 생성한 후 형태소 분석을 진행했다. (nltk)

형태소 분석 결과가 접속사(and), 관사(a,the), 소유형용사(his, her), 지시형용사(this, that), 부정형용사(some), 수량형용사(many), 관계형용사(what), 전치사(in, on), 리스트마커(1)), 조동사(could), 관계부사(which) 등의 단어들은 skip했다.


ex) nltk에서는 아래의 tag들이 포함된다.


skip_pos = ['CC', 'DT', 'EX', 'IN', 'LS', 'MD', 'WDT', 'WP', 'WP$', 'WRB']


https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html



또한 stopword 사전도 따로 관리해서 stopword에 포함되는 단어일 경우 skip 했다.

마지막으로 stemming을 적용한 후 빈도수가 5개 이상 반복된 단어 일 경우 vocabulary에 등록하도록 설정했다. 


hyper parameter의 경우는 아래와 같다.


learning rate : 0.001

epoch : 256

batch_size : 64

vocab dimension : 128

kernel num : 100

kernel size = 3,4,5


회사 업무라서 정확히 어떤 분류를 했는지 설명할 수는 없지만 (그냥 class 1과 class2로 분류했다고만 생각하자.) 아래와 같은 precision과 recall 결과가 나타났다.


 

 precision

recall 

 class 1

 0.73

0.82 

 class 2 

 0.91 

0.87 


상당히 잘 분류가 되었고, 이 후로도 계속 테스트를 진행해 볼 생각이다.