일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 티스토리챌린지
- 중학1-1
- 상속
- 중학수학
- 컴퓨터비전
- 디버깅
- CSS
- 데이터베이스
- 정보처리기사필기
- JDBC
- rnn
- 컴퓨터구조
- c언어
- html/css
- 순환신경망
- 머신러닝
- 파이썬
- 혼공머신
- JSP
- 자바스크립트심화
- 정보처리기사실기
- 자바스크립트
- 연습문제
- SQL
- 딥러닝
- 데이터분석
- 자바 실습
- JSP/Servlet
- 오블완
- 자바
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
순환 신경망(RNN) 9 - 자연어 처리 7 : 자연어 생성 본문
마음을 다시 추스르고 RNN 공부를 다시 시작해 보는 중이다.
자연어 생성
순환신경망을 사용해 새로운 문장을 생성하는 방법을 알아본다.
라이브러리 및 데이터 불러오기
감성 분석(분류)에서 활용했던 네이버 영화 리뷰 데이터 셋을 활용한다.
데이터 내용을 확인한다.
데이터 전처리
이번에는 텍스트 전처리를 하기 위해 한글 형태소 분석기 중 Okt(구, twitter)를 활용한다.
문장 생성에서의 전처리는 앞서 다룬 텍스트 분류의 전처리와 다른 점이 있다. 자연스러운 문장을 위해 분용어를 제거하지 않는다. 불용어를 제거하게 되면 이상한 문장이 만들어질 수 있다.
다음과 같이 형태소 분석기를 적용하는 전처리 함수를 정의한다.
모델 성능을 위해서는 많은 데이터를 학습시켜야 하지만, 학습 시간을 고려해 1000개의 문장 데이터만 활용해 만들어 보기로 한다.
형태소 분석기를 통해 분리된 데이터를 확인할 수 있다.
앞서 텍스트 분류를 위해 문장의 길이를 동일하게 맞추는 작업을 했다. 반면, 문장 생성을 위해서는 한 개의 문장을 여러 개의 n-그램 형태로 만든다. 예를 들어 “텐서플로는”, “너무”, “멋진”, “도구이다”가 있을 때 이를 활용해 3개의 문장을 구성하여 입력 시퀀스를 생성할 수 있다.
- “텐서플로는”, “너무”
- “텐서플로는”, “너무”, “멋진”
- “텐서플로는”, “너무”, “멋진”, “도구이다”
실제 데이터는 [그림 5-33]과 같이 숫자로 인코딩 된 입력 시퀀스가 된다.
케라스 토크나이저를 사용하여 문장을 토큰화해 단어 사전을 만들고, 각 문장을 숫자 벡터로 변환한다. 생성된 n-그램 형태의 입력 시퀀스를 출력해 확인한다.
만들어진 단어 사전에 키워드를 넣었을 때 다음과 같은 결과를 볼 수 있다. 여기서 '감동'이라는 단어는 숫자 인덱스 46으로 인코딩 된다.
딥러닝 모델에 학습을 하기 위해서는 문장의 길이를 동일하게 맞춰야 한다. padding 값은 pre로 설정해 최대 길이보다 짧을 경우 앞에 0을 채우는 것으로 적용한다. 앞에 0을 채우는 이유는 예측해야 할 label 값을 시퀀스의 마지막에 위치하도록 하기 위해서이다.
[그림 5-34]에 도시한 패드 입력 시퀀스에서는 최대 길이를 5개로 맞춘 것을 보여주고 있다. 다음 예제에서는 가장 단어가 많은 문장을 찾아 최대 길이(59개)로 맞춘다.
텍스트 데이터를 입력과 레이블(Label)로 분리한다. [그림 5-35]와 같이 매 문장의 마지막 값은 레이블로 설정한다.
예를 들어 “엄동이는 너무 멋져”라는 문장이 있다면 입력 시퀀스로 “엄동이는 너무”, 레이블 시퀀스는 “멋져”가 된다.
레이블 시퀀스는 입력 인코딩(카테고리) 변환한다.
to_categorical 함수를 활용해 레이블 값을 원핫 인코딩할 수 있다.
모델
문장 생성 모델은 훈련 시간을 고려해 임베딩 레이어, 양방향 LSTM, Dense 레이어로 간단히 구성한다. softmax 활성화 함수를 활용한다. 이때, input_length 값이 max_len-1인 것은 레이블 시퀀스로 한 단어를 빼서 입력 시퀀스 길이가 줄어들기 때문이다.
문장 생성(추론)
훈련된 모델을 바탕으로 문장을 생성하는 함수를 정의한다. 입력 매개변수로 시작 단어(sons), 생성할 단어 수(count)가 필요하다.
다른 방법으로는 클래스 레이블을 직접 예측하는 함수가 있다. 두 가지 방법의 결과는 동일하다.
학습된 모델을 활용해 문장을 생성한다. 앞에서 정의한 text_generation 문장 생성 함수를 사용하고, 매개변수로는 [시작 단어 또는 문장]과 [생성 단어 개수]를 넣는다.
첫 번째 코드는 시작 문장으로 "연애 하면서"를 입력하고, 생성할 단어의 개수를 12로 지정하여 문장을 생성하는 예제다. 생성된 문장은 비교적 납득할 만한 수준으로 보인다.
전반적으로 모델이 생성하는 문장 중 일부는 자연스럽지 않은 결과가 나타나지만, 학습한 텍스트 데이터의 품질과 간단한 구조로 만든 딥러닝 모델이라는 점을 감안하면 나쁘지 않은 편이다.
학습을 마치고
이렇게 해서 자연어 생성에 관한 학습을 마쳤다. 이번 단원은 비교적 수월하게 학습했다. 쪼갠 단어를 가지고 문장을 생성하는 방법에 대해서 배울 수 있었다.
'인공지능 > 딥러닝' 카테고리의 다른 글
순환 신경망(RNN) 11 - 자연어 처리 9 : Seq2Seq 모델로 챗봇 구현 2 <데이터 전처리> (1) | 2024.12.19 |
---|---|
순환 신경망(RNN) 10 - 자연어 처리 8 : Seq2Seq 모델로 챗봇 구현 1 <챗봇 데이터 소개 및 탐색적 데이터 분석> (0) | 2024.12.19 |
순환 신경망(RNN) 8 - 자연어 처리 6 : 한국어 감성 분석 5 <KoBERT 토그나이저> (0) | 2024.12.19 |
순환 신경망(RNN) 7 - 자연어 처리 5 : 한국어 감성 분석 4 <평가와 저장된 모델 불러오기> (0) | 2024.12.19 |
순환 신경망(RNN) 6 - 자연어 처리 4 : 한국어 감성 분석 3 <데이터 전처리와 모델> (0) | 2024.12.19 |