자연어처리_챗봇_23-08-11
- 시퀀스 투 시퀀스 모델 (sequence to sequence model)
(1) 시퀀스 투 시퀀스 모델
- 시퀀스 형태의 입력값을 시퀀스 형태의 출력으로 만들 수 있게 하는 모델이다.
- 하나의 텍스트 문장이 입력으로 들어오면 하나의 텍스트 문장을 출력하는 구조이다.
시퀀스 투 시퀀스 (sequence to sequence)
- 이 모델은 순환신경망(RNN) 모델을 기반으로 하며, 인코더 부분과 디코더 부분으로 나뉜다.
- 인코더 부분에서 입력값을 받아 입력값의 정보를 담은 벡터를 만들어낸다
- 디코더 부분에서 이 벡터를 활용해 재귀적으로 출력값을 만들어낸다
- 이 모델이 많이 활용되는 분야
- 기계 번역
- 텍스트요약
- 이미지 설명 image captioning -> 이미지를 입력으로 주고 chatgpt가 이미지에 있는 형상(석양, 태양 등)에 대해 시를 출력하게 된다 , 이미지 형태를 분석해서 단어 추출 -> 단어에 대한 텍스트를 추출하게 된다.
- 대화모델
스텝마다 계산된 어텐션을 입력으로 넣는다
=> 어텐션도 함께 학습을 진행하게 되며 학습을 통해 디코더의 각 시퀀스 스텝마다 어텐션의 가중치는 다르게 적용된다.
- 머신러닝 작업 순서
- 데이터셋 준비하기
- 모델 구성하기
- 모델 학습과정 설정하기
- 모델 학습시키기
- 모델 학습과정 살펴보기
- 모델 평가하기
- 모델 사용하기
- 데이터 소개
(1) 한글 챗봇을 만들기 위한 데이터
Chatbot data 샘플
Q. 12시 땡 ! A. 하루가 또 가네요.
Q2. 1지망 학교 떨어졌어 A2. 위로해 드립니다
Q3. 3박 4일 놀러가고 싶다 A3. 여행은 언제나 좋죠
예제
Q를 데이터셋으로 사용 (Q를 훈련셋으로 사용함)
A를 정답셋으로 사용함
Label을 쓰지 않음
중점적으로 봐야하는 것은 문장의 길이다
문장 길이 값을 통일시켜야 한다 ( 문장길이 최소값 . 최댓값이 무엇이 되는지 문장길이 평균값을 구해서 통일시켜야 한다)
똑같은 단어로 통일시켜줄 것이다 (왠만한 데이터가 포함되도록 문장길이 맞춰줄 예정)
단어 길이 중요 !!
(질문1) 문장의 길이 통일시키면 문장길이가 길면 중요한 단어가 짤릴수도 있지 않나요 ,,?
—> 최댓값으로 문장길이를 맞춰주면 중요한 단어가 짤릴 일이 없다 !
데이터 길이를 40자로 하려고 하면 50자 되는 데이터는 버려도 된다 (이상치 제거 가능)
이를 해결하기 위해 데이터 시각화 , 통계값을 사용하게 된다 (데이터 구성이 어떻게 되어있는지 확인 가능하다)
-> 단어 개수 분포도를 통해 짐작할 수 있다
보통 어절단위로 쓰던지, 음절단위로 쓰던지 둘 중에 하나를 많이 쓰게 된다.
공백문자를 잘라서 진행
4.3 데이터 어휘 빈도 분석
- 의미상 중요한 명사, 형용사, 동사만 따로 모은 후 빈도수 분석을 한다.
(1) 데이터에서 사용되는 단어에 대해 분석
- 어떤 단어가 사용되는지
- 자주 사용되는 단어는 어떤 것들이 있는지
예제3. 데이터 어휘 빈도 분석
- Word cloud 모듈 설치
- Pip install word cloud
모듈의 함수 동작이 궁금할 때는 다음과 같이 찾는다
help(plt.imshow)
- Interpolation
- Interpolation이 Noun이면 보간이 수행되지 않습니다.
- 비어있는 것을 채우는 것 .!!
- 글자와 배경과의 간격을 설정하게됨
4.4 전처리 과정을 모듈화
- 데이터를 불러오고 가공하는 다양한 기능으로 구성
(1) tqdm 모듈
=> 파이썬에서 반복 루프를 돌다보면 진행이 얼마나 되었는지 Progress Bar를 통해 알 수 있다.
이처럼 반복문에서 진행률을 Progress Bar로 표현해주고 남은 시간 정보까지 알려주는 것이
바로 tqdm이다.
=> tqdm 테스트
(2) 특수 토큰
=> PAD : 어떤 의미도 없는 패딩 토큰
=> SOS
(3) 인코더 부분 전처리 함수
- 인코더에 적용될 입력값을
- 전처리 과정
=>> …
(4) 디코더 부분 전처리 함수
- 디코더의 입력으로 ..
(6) 테스트 파일
- ChatBotData.csv_short
예제4. 데이터를 불러오고 가공하는 다양한 기능 구성하기 및 테스트
- 판다스를 통해서 데이터를 불러온 후 , question, answer 로 분리하는 함수
- 한글 텍스트를 토크나이징 하기 위해 형태로 분리
- 단어 사전을 만들기 위해서, 데이터를 전처리한 후 단어 리스트를 만들기 함수
- 단어 사전을 만들기 함수
- 인코더에 적용될 입력값을 만드는 전처리 함수
- 디코더의 입력으로 사용될 입력값을 만드는 전처리 함수
- 디코더의 결과로 학습을 위해 필요한 라벨인 타깃값을 만드는 전처리 함수
File Name : workspace/step12/exam4.py
File Name : workspace/step12/preprocess.py
File Name : workspace/step12/data_in/ChatBotData_short.csv
Okt 가장 큰 단점은 형태소분석이 잘 안된다는 점이 있음
가장 성능이 좋은 형태소분석기를 사용해야함
-> 원문 : 가난한자의
(Okt 형태소분석기) -> 가난한 자의 : 자의를 단어로 인식하였음
-> 원문 : 가스비
(Okt 형태소분석기) -> 가스 비
형태소 분석기는 한국어 처리 성능을 좌우하게 된다..!!
마침표나 물음표는 필요없으므로 없애는 전처리가 필요합니다.
“!” , “?” -> “” 텅빈 문자열로 바뀜 -> 데이터로서 가치가 없음
문자열의 데이터가 있는지 없는지 검사해서 텅빈 문자열을 제거하고 리스트를 리턴
단어들로만 리스트를 만듭니다.
?, , , ! 를 모두 제거하고 형태소로 하나하나씩 토큰화 하였음
중복된 단어가 많으면 겹치는 문제가 발생됨
set()을 통해 중복된 단어를 제거해야한다. (단어사전을 만들어야하기 때문에 중복단어를 제거해야한다)
단어사전을 만들기 위해서는 특수문자를 끼워넣을 것이다 .. (그 이유는 ..? )