티스토리 뷰

텍스트 분류는 어떠한 문장이 주어졌을 때, 그 문장이 속할 클래스의 확률을 구하는 것이다.

가격도 싸고 상품 품질은 괜찮은데 배송이 늦어서 화가 나네요.
항목 분류
품질 긍정
배송 부정
가격 긍정
종합 부정

위의 예제와 같이 문장이 input으로 들어오면, 전처리한 임베딩을 통해서 학습된 모델의 분류 방식에 따라서 분류하는 식이다.

RNN & CNN ensemble

RNN

RNN Architecture for classifier (출처 : 김기현의 딥러닝을 활용한 자연어처리 입문 강의자료)

먼저 one-hot vector를 입력으로 받아서 embedding layer에 넣어주고, Bi-directional RNN을 통해 출력을 얻는다. 마지막 time-step값을 softmax layer에 통과시켜 각 클래스별로의 확률값을 얻는다(BPTT). 자연어 생성과는 다르게 auto-regressive가 아니기 때문에, 입력을 한 번에 받고, 모든 time-step을 직렬이 아닌 병렬로 처리가 가능하다. 생각보다 구조가 매우 간단하다.

 

RNN의 구조와 코드는 생략한다. (저자의 코드 참고 : 링크)

 

CNN

CNN을 통해서 비슷한 의미를 가진 문구의 임베딩 벡터의 패턴을 인식할 수 있다. 이미지 분류에서 필터의 역할이 픽셀들의 어떤 패턴을 찾는 역할이었다면, 문장에서는 문장의 특성(예를 들면, '퀄리티가 좋아요')을 필터로서 가지게 된다.

CNN Architecture for classifier (출처 : 김기현의 딥러닝을 활용한 자연어처리 입문 강의자료)

위와 같이 단어들을 묶어서 필터에 통과시켜서 하나의 의미를 가진 벡터(context vector)로 만든다. max pooling layer에서는 각기 다른 길이를 가진 문장들을 일정한 크기의 임베딩 벡터로 변환시켜주고, 그 벡터를 softmax하여 y hat을 구한다. 대신 문장 패턴의 길이는 하이퍼파라미터로 설정해 주어야 한다.

 

trainer.py 

전체적으로 text classification의 프로세스를 도식화하면 아래와 같다.

text classification 프로세스 도식화

학습을 시키는 trainer는 ignite 패키지를 사용한다. Ignite는 학습 엔진의 프로세스의 시점들의 콜백 함수를 등록할 수 있게 한다. 엔진을 train, valid로 나누어 선언한다. train engine은 feed-forward, loss계산, back-propagation, optimization 등의 일련의 과정을 static 함수로 담고 있다. valid engine은 ff, loss 계산 후 현재 상태를 출력하는 함수가 들어있다. trainer 모듈 내의 check_best 함수는 loss를 계산해서 가장 좋은 모델의 weights를 가지고 있고, save_model 함수를 통해서 저장한다.

train.py

train 모듈에서는 기본적으로 모델 학습 실험을 위한 모든 파라미터를 define_argparser() 함수 내에서 정의한다. 또한 RNN, CNN 중 어떤 모델을 선택할 것인지에 대한 논리 함수가 들어있다.

 

데이터를 불러와 텍스트와 레이블을 분리하여 학습에서 사용할 수 있도록 처리하는 data_loader.py를 임포트하여 사용하고, trainer 모듈을 RNN, CNN에서 각각 불러와서 학습할 수 있도록 선언한다.

 

classify.py

위 도식화된 구조를 모두 거치게 되면, train.py와 별도로 실제로 분류해주는 모듈인 classify.py가 분류를 처리한다.

classifier는 위에서 만들어 놓은 RNN과 CNN의 앙상블을 활용한다. 각각의 best model을 리스트로 옮겨놓고, 두 모델의 y hat의 mean값을 예측값으로 활용한다.

학습

학습 중
학습 결과. 수 시간은 걸렸다.

위의 모듈들을 통해 colab 환경에서 학습을 진행하였다.

학습이 완료된 모델을 가지고 10개 정도만 예측해보니 아래와 같이 나온다.

head 10개 만 예측한 결과

실제 쿠팡 페이지에 있는 리뷰를 가지고 테스트해보자.

블루투스 마이크에 대한 실제 리뷰

!echo "에코는 좋긴 한데 불량인지 아닌지 좀 많이 끊겨요.. 그래도 코로나 때문에 노래방 잘 못 가는 저로서는 나름 만족하고 있어요ㅎㅎ̊̈ 이거 쓰니까 마이크 두개 있는 거 살걸 후회도 좀 되네요...ㅎ̊̈ 가족들 단위로 쓰실 거면 돈 조금 더 보태서 마이크 두개 짜리 추천드려요~" | mecab -O wakati | python ./classify.py --model_fn ./models/review.pth --gpu_id 0

실제 리뷰 예측 결과

부정적인 문장이 있긴 하지만 그래도 나름 만족하면서 다른 고객에게도 추천하는 댓글이니 positive로 예측했다. 이렇게 해서 자연어처리를 위해 필요한 전처리와 임베딩, 간단한 텍스트 분류까지 진행해보았다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함