챗봇 머신 러닝 - chaesbos meosin leoning

3 minute read

챗봇 머신 러닝 - chaesbos meosin leoning

이 책을 선정한 이유

최근 딥러닝 공부를 하다 마냥 이론 공부만 하는 것 보다는 실제 서비스를 어느 정도 구현해보아야겠다는 생각이 들었다. 딥러닝 분야 중 가장 관심 있는 분야인 자연어 처리를 공부하기 위해 인터넷으로 챗봇 프로젝트를 찾아보았으나, 직접 따라해 보는 강의가 따로 존재하지 않았다. 그래서 이것저것 찾아보던 도중 처음 배우는 딥러닝 챗봇 이라는 책을 발견하였다. 이 책을 고르게 된 이유를 요약해보자면 다음 2가지로 나타낼 수 있다.

  1. 최신간 (2020년 11월 발매) 이라 프로젝트 구현에 어려움이 없을 것이라 생각했다.
  2. 기술만 설명하는 게 아니라 처음부터 끝까지 직접 구현하는 내용으로 구성되어 있다.

그리고 공부한 흔적을 남기기 위해 지난 5일간 프로젝트를 구현하는 과정과 이 과정 중에 겪은 문제, 문제 해결 과정 등을 업로드할 예정이다.

들어가기에 앞서

이 책에는 Python의 기초적인 내용이 어느 정도 담겨 있지만, 기존에 프로그래밍을 접해보지 않았다면 따로 공부가 필요하다. 또한 딥러닝과 데이터베이스에 대한 기초적인 지식이 있지 않으면 진행하기 힘들다.

개인적으로 Python의 경우에는 깐깐하게 배우는 파이썬3, 딥러닝의 경우에는 모두를 위한 딥러닝 시즌2, 데이터베이스는 학부 과정을 통해 공부했다. 본 책에서는 데이터베이스를 MySQL을 이용하지만, Oracle SQL 등을 공부했더라도 문제는 없다.

챗봇 학습툴 만들기

본 책은 MySQL을 사용하므로 프로젝트를 시작하기 전에 MySQL을 설치해야 한다. 설치 방법은 이 곳 에 잘 설명되어 있다.

프로젝트 구조

프로젝트를 만들기 전에, 프로젝트 구조에 맞는 디렉터리를 생성해야 한다. 챗봇 프로젝트의 디렉터리를 다음과 같이 생성한다.

  • chatbot
    • train_tools: 챗봇 학습툴 관련 파일
    • models: 챗봇 엔지에서 사용하는 딥러닝 모델 관련 파일
      • intent: 의도 분류 모델 관련 파일
      • ner: 개체 인식 모델 관련 파일
    • utils: 챗봇 개발에 필요한 유틸리티 라이브러리
    • config: 챗봇 개발에 필요한 설정
    • test: 챗봇 개발에 필요한 테스트 코드

학습용 데이터베이스 설계 및 데이터 테이블 생성

챗봇 엔진의 답변을 처리하는 과정에 필요한 데이터베이스 구조를 설계한다. 우선 데이터베이스 접속 정보를 저장하는 파일을 생성한다. /config 디렉터리에 DatabaseConfig.py 파일을 생성하여 다음과 같이 코드를 작성한다.

DB_HOST = "127.0.0.1"
DB_USER = "homestead"
DB_PASSWORD = "secret"
DB_NAME = "homestead"


def DatabaseConfig():
    global DB_HOST, DB_USER, DB_PASSWORD, DB_NAME

이 때 나는 예제와 같은 사용자명과 패스워드를 사용하기 위해 따로 사용자를 만들고 데이터베이스를 생성했다. 사용자를 추가하는 방법은 이 곳, 그리고 데이터베이스를 생성하는 방법은 이 곳 을 참고하면 된다.

다음은 챗봇 데이터 학습용 테이블을 만든다. /train_tools/qna 디렉터리에 create_train_data_table.py 파일을 생성하여 다음과 같이 코드를 작성한다. 이 코드를 작성하기 전에 PyMySQL 모듈을 설치해야 한다.

import pymysql
from config.DatabaseConfig import *  # DB 접속 정보 불러오기

db = None
try:
    db = pymysql.connect(
        host=DB_HOST,
        user=DB_USER,
        passwd=DB_PASSWORD,
        db=DB_NAME,
        charset='utf8'
    )

    # 테이블 생성 sql 정의
    sql = '''
        CREATE TABLE IF NOT EXISTS `chatbot_train_data` (
        `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
        `intent` VARCHAR(45) NULL,
        `ner` VARCHAR(1024) NULL,
        `query` TEXT NULL,
        `answer` TEXT NOT NULL,
        `answer_image` VARCHAR(2048) NULL,
        PRIMARY KEY (`id`))
    ENGINE = InnoDB DEFAULT CHARSET=utf8
    '''

    # 테이블 생성
    with db.cursor() as cursor:
        cursor.execute(sql)

except Exception as e:
    print(e)

finally:
    if db is not None:
        db.close()

이 때, SQL을 정의하는 과정에서 작은 따옴표(‘) 가 아니라 백틱(`) 을 사용해야 한다는 점을 주의해야 한다. 이와 관련된 내용은 이 글 을 참고하면 된다.

챗봇 학습 데이터 엑셀 파일 및 DB 연동

본 프로젝트에서는 학습 데이터를 엑셀을 이용하여 구현한다. 저자 분의 Github 에서 엑셀 파일(train_data.xlsx) 을 /train_tools/qna 디렉터리에 저장한다. 책의 예제를 그대로 나타내려면, train_data.xlsx 파일 대신 train_data 복사본.xlsx 파일을 저장하면 된다. 나는 나중에 헷갈리지 않기 위해 그냥 train_data.xlsx 파일을 저장했다.

엑셀 파일을 읽어와 데이터베이스와 동기화하기 위해 /train_tools/qna 디렉터리에 load_train_data.py 파일을 생성하여 다음과 같이 코드를 작성한다. 이 코드를 작성하기 전에 OpenPyXL 모듈을 설치해야 한다.

import pymysql
import openpyxl

from config.DatabaseConfig import *  # DB 접속 정보 불러오기


# 학습 데이터 초기화
def all_clear_train_data(db):
    # 기존 학습 데이터 삭제
    sql = '''
        delete from chatbot_train_data
    '''
    with db.cursor() as cursor:
        cursor.execute(sql)

    # auto increment 초기화
    sql = '''
        ALTER TABLE chatbot_train_data AUTO_INCREMENT=1
    '''
    with db.cursor() as cursor:
        cursor.execute(sql)


# db에 데이터 저장
def insert_data(db, xls_row):
    intent, ner, query, answer, answer_img_url = xls_row

    sql = '''
        INSERT chatbot_train_data(intent, ner, query, answer, answer_image)
        values(
            '%s', '%s', '%s', '%s', '%s'
        )
    ''' % (intent.value, ner.value, query.value, answer.value, answer_img_url.value)

    # 엑셀에서 불러온 cell에 데이터가 없는 경우 null로 치환
    sql = sql.replace("'None'", "null")

    with db.cursor() as cursor:
        cursor.execute(sql)
        print('{} 저장'.format(query.value))
        db.commit()


train_file = './train_data.xlsx'
db = None
try:
    db = pymysql.connect(
        host=DB_HOST,
        user=DB_USER,
        passwd=DB_PASSWORD,
        db=DB_NAME,
        charset='utf8'
    )

    # 기존 학습 데이터 초기화
    all_clear_train_data(db)

    # 학습 엑셀 파일 불러오기
    wb = openpyxl.load_workbook(train_file)
    sheet = wb['Sheet1']
    for row in sheet.iter_rows(min_row=2):  # 헤더는 불러오지 않음
        # 데이터 저장
        insert_data(db, row)

    wb.close()

except Exception as e:
    print(e)

finally:
    if db is not None:
        db.close()

load_train_data.py 파일을 실행하고 데이터베이스에 다음과 같이 내용이 저장되면 성공이다.

챗봇 머신 러닝 - chaesbos meosin leoning

출처

조경래 님이 집필하신 처음 배우는 딥러닝 챗봇 교재를 참고하여 글을 작성하였다.

예제 또한 저자 분의 Github 에서 발췌하였다.