본문 바로가기
Study (Data Science)/NLP

Ex12_ NLP / 뉴스 요약봇

by 콜라찡 2023. 1. 25.

1. 데이터 전처리

  1. null값 제거 : .nunique()로 null 확인 후, .dropna로 제거
  2. 중복 제거 : drop_duplicates()로 제거
  3. 텍스트 정규화와 stopwords 제거
    1. 정규화사전, 불용어사전(NLTK) 를 불러오거나 만들어주거나 한 후에
    2. preprocess_sentence라고 함수를 만드는데
      1. text 컬럼은 정규화와 불용어 모두 처리하고, clean_text=[ ]에 담고
      2. headlines 컬럼은 자연스러운 문맥을 위해 정규화만 하고, clean_healines =[ ] 에 담아둠.

2. train, test 나누기

  1. 최대길이 정하기
    1. 길이분포를 구하여 그래프로도 한번 보고
    2. 적당한 text_max_len, headlines_max_len을 임의로 잡는데,
    3. 잡을 때 평균보다는 약간 높게 하여 80-85%정도 포함되게 잡도록
    4. 전체의 몇 %나 되는지 계산도 해보고
    5. 각각의 max_len이 안되면 데이터에서 제외되도록 apply.lambda 로 정리
  2. train, test 나누기
    1. headlines를 eos, sos 추가하여 decoder_input, decoder_target 나누고
    2. decoder_input, decoder_target + encoder_input까지 Numpy로 형식 바꾸고
    3. 8:2로 train, test 나누기위해
      1. encoder_input과 같은 크기와 형태의 0으로만 이루어진 정수 시퀀스를 하나 만들고,
      2. 이 시퀀스를 shuffle 하고,
      3. 그 idx에 data를 maping 하여 randomly ordered한 상태에서
      4. 8:2로 슬라이싱하여 최종 6개의 데이터셋으로 준비
  3. 정수인코딩 
    1. 토큰화 > 단어사전 > 정수인코딩 ((encoder / decoder) 따로해주기)
      1. train 으로만 희귀단어 조사하여 단어장 크기값 정하기
        1. tokenizer 선언
        2. fit_on_texts로 숫자매핑 (encoder_input_traiin)/(decoder_input_train)
        3. threshold 임의값 정해서 희귀단어가 얼마나 되는지 조사하고
        4. 희귀단어 제외하면 단어가 얼마정도 남는지 보고, 이를 기준으로 단어장크기를 정해야함.
      2. train, test 모두, 총 6개의 데이터셋 모두 시퀀스화하기
        1. tokenizer 선언
        2. 바로 texts_to_sequences(6개 데이터셋) 모두 실행하여 시퀀스화함.
  4. 최종 데이터셋 6개 정리하기
    1. 희귀단어 제외 후에 생긴 null값 제거하기
    2. 패딩하기 (post)

3. 모델설계

  1. Encoder 
    1. embedding_dim, hidden_size 주고
    2. encoder_input(text_max_len, )로 주고
    3. Embedding(단어장크기, emd_dim)로 임베딩 레이어
    4. LSTM 1,2,3 쌓고, state는 받아서 2-5로 넣음
  2. Decoder
    1. decoder_input(None. )로 주고
    2. Embedding(단어장크기, emd_dim)로 임베딩 주고
    3. Embedding 하나더! decoder_input 넣어주고
    4. LSTM 1 쌓고
    5. decoder_outputs, _, _로 encoder state 넣고
    6. 출력층은 softmax로 
  3. Attention 메커니즘 : 인코더와 디코더의 모든 time step의 hidden state를 어텐션 층에 전달하고 결과를 리턴
    1. AddictiveAttintion으로 어텐션 함수 선언 
    2. 모든 time_step의 hidden state 받는 attn_out 만들고
    3. concat으로 en, de의 hidden state들을 다 연결하고
    4. 2-6 softmax 출력층에 넣어줌

4. 모델훈련

  1. compile : optimizer - rmsprop / loss - sparse categorical crossentropy / earlystop 주고
  2. fit
    1. x : encoder_input_train, decoder_input_train / y : decoder_target train
    2. val x : encoder_input_test, decoder_input_test / y : decoder_target test

5. 인퍼런스(추론) 모델 구현 (다음 단어를 예측하여 뱉어내는 모델)

  1. 정수 -> 문자로 바꿀 수 있도록 함수 미리 준비하고
  2. 답이 없기 때문에 eos 나올때까지 디코더를 time step마다 반복적으로 돌려야 하므로, 따로 설계함
    1. 다시 돌리면서 state는 다 저장하는 인코더 설계하고
    2. 어텐션 사용해 출력하는 디코더 설계하고
  3. 인퍼런스 단계에서 eos나올 때 까지 단어 시퀀스를 완성하는 함수를 만들어 줌. 

6. 모델 테스트 (추상적 요약)

  1. 원문의 정수 시퀀스 -> 텍스트 시퀀스로 변환하는 함수와 (text)
  2. 요약문의 정수 시퀀스 -> 텍스트 시퀀스로 변환하는 함수 만들고, (headlines)
  3. for문으로 돌려 비교해봄

7. 추출적 요약 실행해서 비교

  1. 추출적 요약은 추상적처럼 새로운 단어를 생성해내는게 아니라 그냥 추출만 해냄
  2. summ.summarizer 모듈의 summarize 함수 사용함

 

 

 

 

728x90

댓글