챗봇구축(AI학습 54)

이유진·2024년 7월 8일

--35.답변 데이터베이스 구축.ipynb--

답변 데이터 베이스 구축

챗봇이 답변해주는 '질문정보' 와 '해당답변데이터'

테이블 스키마

테이블명 : chatbot_train_data

컬럼속성설명
idint primary key not null학습데이터 id
intentvarchar(45)의도명, 의도가 없는 경우 null
nervarchar(45)개체명, 개체명이 없는 경우 null
querytext null질문 텍스트
answertext not null답변 텍스트
answer_imagevarchar(2048)답변에 들어갈 이미지 URL, 이미지 URL을 사용하지 않을 경우 null

DatabaseConfig.py 작성

./config/DatabaseConfig.py

테이블 생성

import sqlite3
from config.DatabaseConfig import *

con = None
try:
con = sqlite3.connect(DB_FILE)
print('DB 연결 성공')

테이블 생성 sql

sql = '''
CREATE TABLE IF NOT EXISTS chatbot_train_data (
id INTEGER PRIMARY KEY,
intent TEXT,
ner TEXT,
query TEXT,
answer TEXT NOT NULL,
answer_image TEXT
)
'''
cur = con.cursor()
cur.execute(sql)
print('테이블 생성 성공')

except Exception as e:
print('예외발생', e)

finally:
if con:
con.close()
print('DB 연결 닫기 성공')
con = None

엑셀파일 을 DB에 연동

base_path = r'/content/drive/MyDrive/dataset/chatbot'

import pandas as pd
import os

df = pd.read_excel(os.path.join(base_path, 'train_data.xlsx'))
df

각 컬럼에 대한 설명

컬럼설명
의도(Intent)질문의 의도를 나타내는 텍스트, 의도가 없는 경우 비워둡니다
개체명인식(NER)질문에 필요한 개체명, 개체명이 없는 경우 비워둡니다
질문(Query)질문텍스트
답변(Answer)답변텍스트
답변이미지답변에 들어갈 이미지URL, 이미지 URL이 없는 경우 비워둡니다

import openpyxl

테이블 초기화

def all_clear_train_data(con) :
sql = '''
DELETE FROM chatbot_train_data
'''
cur = con.cursor()
cur.execute(sql)
con.commit()

DB에 엑셀 데이터를 저장

def insert_data(con, xls_row) :
intent, ner, query, answer, answer_img_url = xls_row

sql = '''
INSERT INTO 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 에 데이터가 없는 경우, DB에 null로 치환

sql = sql.replace("'None'", "null")

cur = con.cursor()
cur.execute(sql)
print(f'{query.value} 저장')
con.commit()

train_file = os.path.join(base_path, 'train_data.xlsx')

con = None
try:
con = sqlite3.connect(DB_FILE)
print("DB 연결 성공")

기존 테이블 초기화

all_clear_train_data(con)

엑셀파일 불러오기

wb = openpyxl.load_workbook(train_file)
sheet = wb['Sheet1'] # 특정 Sheet 불러오기
for row in sheet.iter_rows(min_row=2) : # 헤더(feature)는 불러오지 않음

# 데이터 저장
insert_data(con, row)

except Exception as e:
print('예외발생', e)

finally:
if con:
con.close()
print("DB 연결 닫기 성공")
con = None

profile
독해지자

0개의 댓글