2021. 3. 4. 19:39ㆍ자연어 처리/Transformer
IBM에서 전화를 통한 비대면 영업 시 잠재 고객을 파악하기 위해 BANT라는 지표를 만들었다.
BANT란 Budget, Authority, Needs, Timeline으로 제품에 대한 예산, 담당자, 니즈, 예상 시기를 나타낸다.
현재까지는 사람이 직접 콜을 듣고 평가했다면, 해당 글에서는 Transformer라는 Deep Learning 기법을 통해 사람이 직접 콜을 듣고 엑셀을 통해 전사한 파일을 가지고 학습하여 BANT를 자동 분류하였다. (전사 파일 전처리 과정은 생략)
이러한 학습 결과는 영업 콜에서 STT(SOUND TO TEXT)를 통해 나온 문장을 분석하는데 활용된다.
모델링을 제외한 데이터 설명 및 부가 설명은 'LSTM을 이용한 텍스트 분석'과 동일하니 참고하길 바란다.
우선 필요한 라이브러리를 import 한다. 불용어 처리를 위해서는 mecab을 사용하였다.
해당 프로젝트에서는 분류에 더 용이하기 위해 BANT를 하위 카테고리 키워드들로 세분화 하였었다. 이 부분은 코딩을 통해 BANT로 다시 바꿔 주었다. 코드에서는 B는 0, A는 1, N은 2, T는 3, 해당사항 없음은 4로 처리하였다.
Budget - 예산
Authority - 담당자
Needs - 개인관심, 관심, 고려, 구매, 문의, 요청, 재연락
Timeline - 시기
학습하는데 사용될 전처리한 데이터셋 형태는 다음과 같다
학습 및 테스트를 하기 위해 데이터 분류 (층화 추출 사용)
불필요한 불용어는 제거. corpos_df_train은 sample_set으로, corpos_df_test는 result로 변수명 바꿔서 진행
불용어 제거 후 추출한 빈도수는 향후 하이퍼 파라미터 조정하는데 쓰임
불용어 제거 후 결과 예시
불용어 제거 후 학습 및 테스트 데이터 인코딩
추출된 글자들을 컴퓨터가 이해할 수 있게 인코딩 해줘야 한다.
max_words는 데이터셋에서 가장 빈도 높은 몇개의 단어만 사용할지 선택하는 것
학습 및 테스트 데이터 셋에 대해 라벨로 사용되는 BANT 값도 인코딩을 해줘야 한다.
라벨 값의 빈도 또한 당연히 분류한 학습 및 테스트 데이터 셋의 개수와 같아야 한다.
모듈을 사용할 수 도 있지만 짧기에 직접 만들었다.
인코딩이 끝났다면 모델 적용을 해야한다. 해당 글에서는 Transformer을 사용하였다.
모델을 돌리기 전에 우선 pad_sequences를 해줘야 하는데, 이는 지정해준 max_len에서 인코딩된 글자가 있으면 해당되는 숫자를 넣어주고 없으면 0값으로 바꿔 array형태로 나열한다.
불용어 제거 후 추출한 빈도 수 중 가장 긴 문장이 231 이므로 max_len은 230으로 지정했다.
Transformer에 대한 이론은 다른 자료를 참고하기 바란다. 해당 글에서는 코드 정의만 한다.
전체적인 프로세스 그림은 참고 하시길 바란다.
논문은 'attention is all you need' 를 참고하면 된다.
우선 MultiHeadAttention 클래스를 정의한다.
MultiHeadAttention 클래스에는 scaled_dot_product_attention과 계산 과정에필요한 q,k,v 등을 정의하였다.
TransformerBlock 클래스는 MultiHeadAttention 결과를 받고 Maskedmultiheadattention을 정의한다
TokenAndPositionEmbedding 클래스는 Positional Embedding 과정을 정의한다
위 클래스들을 조합 후 실행시켜주는 부분이다.
변수를 재 정의 후 모델을 돌렸다.
옵티마이저는 adam으로 하였고, loss는 categorical_crossentopy를 사용하였다.
결과는 정확도, f1 스코어, 재현율, 정밀도를 살펴 보았다.
나쁘지 않은 결과가 나왔다.
정확도 및 loss에 대한 그래프는 생략하였다.
이상 Transformer를 이용한 비정형 데이터 분류 작업에 대해 알아보았다.