[처음 배우는 딥러닝 챗봇] Python을 이용한 딥러닝 챗봇 제작기 (4)

의도 분류 모델 학습 제작 (1)
책에 제시된 예제 이외에, 직접 말뭉치 데이터를 만들어 의도 분류 모델을 만들어 보기로 하였다. 영화 예매 및 추천 기능을 가진 챗봇을 제작하려고 하였고, 구상한 의도 분류는 다음과 같다.
- 인사(0): 텍스트가 인사인 경우
- 추천(1): 텍스트가 추천 관련 내용인 경우
- 예매(2): 텍스트가 예매 관련 내용인 경우
- 긍정적 평가(3): 텍스트가 긍정적인 평가 관련 내용인 경우
- 부정적 평가(4): 텍스트가 부정적인 평가 관련 내용인 경우
- 기타(5): 어떤 의도에도 포함되지 않는 경우 (욕설 포함)
이 때 말뭉치 데이터를 만들기 위해 기존에 예제에 있던 사용자 단어 사전 파일(user_dic.tsv) 과 학습 데이터셋(total_train_data.csv) 을 엑셀을 이용하여 수정하는 과정을 거쳤다. 데이터가 많아 상당히 오랜 시간이 걸렸다. 학습 데이터셋은 기존 데이터셋과 네이버 영화 리뷰 데이터 를 짜집기하였다.
의도 분류 모델 학습 제작 (2)
정확도가 낮고, 손실도가 높았다. 생각해본 원인은 다음과 같다.
- 긍정적 평가와 부정적 평가의 기준이 애매하다.
- 의도 분류 개수가 너무 많다.
이를 해결하기 위해 의도 분류를 다시 정의하였다.
- 인사(0): 텍스트가 인사인 경우
- 추천(1): 텍스트가 추천 관련 내용인 경우
- 예매(2): 텍스트가 예매 관련 내용인 경우
- 평가(3): 텍스트가 긍정적인 평가 관련 내용인 경우
- 기타(4): 어떤 의도에도 포함되지 않는 경우 (욕설 포함)
의도 분류 모델 학습 제작 (3)
전보다는 괜찮았지만, 여전히 정확도는 낮고 손실도는 높았다. 이러한 문제에 대해 생각해본 원인은 평가 데이터가 정제되지 않았기 때문이라고 생각했다. 기타를 제외한 다른 데이터들은 사용자가 자주 사용하는 단어들을 적절히 조합하여 만들어져 있지만, 평가 데이터는 네이버 영화 리뷰 데이터를 그대로 가져왔기에 정확도가 낮고 손실도가 높다고 판단했다. 평가 학습 데이터셋을 추천과 예매 데이터셋을 활용하여 처음부터 만들었다.
의도 분류 모델 학습 제작 (4)
어느정도 데이터가 정제가 되었음에도 정확도 약 90%, 손실도 30% 정도로 낮은 결과를 보여주고, 실제 의도 분류 예제를 만들어 실행했을 때 의도가 계속 하나만 나오는 결과가 나왔다. 답이 나오지 않아 결국 저자 분께 연락을 취해 문제를 해결하였다.
결론부터 말하면 인코딩 문제였다. 처음에 직접 말뭉치 데이터를 만드는 과정에서 문제가 발생했다. 말뭉치 데이터를 엑셀을 통해 만들었는데, 엑셀은 csv 파일을 UTF-8이 아닌 CP949로 인코딩을 한다. 이 때 나는 이 문제를 해결하기 위해 이 글 을 참조했었다. 그러나 이는 원래 의도된 인코딩 방식이 아니기 때문에 기존의 단어 사전과의 word2index 번호가 달라 정확도와 손실도에 문제가 생겼던 것이다.
따라서 말뭉치 데이터를 엑셀을 통해 만들었다면, 다시 메모장으로 파일을 연 뒤 다른 이름으로 저장할 때 인코딩 방식을 UTF-8로 바꿔 저장하면 해결된다.

문제 해결 후 최종적인 결과는 다음과 같다. 문제가 해결됐지만 정확도가 다소 아쉬운 점, 그리고 프로젝트 추후에 있는 또 다른 학습 데이터셋을 만들 자신이 없어 일단 여기까지만 하고 나머지는 책의 원래 예제를 따라가기로 했다. 이 모델을 학습하느라 제작했던 사용자 단어 파일과 말뭉치 데이터는 여기서 확인 할 수 있다.
출처
조경래 님이 집필하신 처음 배우는 딥러닝 챗봇 교재를 참고하여 글을 작성하였다.
예제 또한 저자 분의 Github 에서 발췌하였다.
Leave a comment