공부/AIFFEL

Exploration 11 : 뉴스 요약봇 만들기

dong_dong_2 2021. 2. 19. 17:30

1. 텍스트 요약이란
    - 텍스트 요약 : 긴 길이의 문서(Document) 원문을 핵심 주제만으로 구성된 짧은 요약(Summary) 문장들로 변환하는 것을 말한다.
    - 중요한 것은 요약 전후에 정보 손실 발생이 최소화되어야 한다는 점이다. 이것은 정보를 압축하는 과정과 같다.
    - 이렇게 요약 문장을 만들어 내려면 크게 2가지 방법이 있다. 추출적 요약과 추상적 요약이다.
    - 추출적 요약(Extractive Summarization)
       1) 단어 그대로 원문에서 문장들을 추출해서 요약하는 방식이다.
       2) 하지만 꺼내온 문장이 원문에서 중요한 문장일 수 있어도 4개의 문장의 연결이 자연스럽지 않을 수 있다.
       3) 대표적인 것은 네이버 뉴스의 요약봇 기능이다.
    - 추상적 요약(Abstractive Simmarization)
       1) 원문으로부터 내용이 요약된 새로운 문장을 생성해내는 것이다.
       2) 새로운 문장이란 원문에 원래 없던 문장일 수도 있다는 것을 의미한다. 자연어 처리 분야 중 자연어 생성의 영역이라 볼 수 있다.
       3) 구글에서 seq2seq라는 아키텍처를 만들었다.
2. 인공 신경망으로 텍스트 요약 훈련시키기
    - seq2seq 모델을 통해서 추상적 요약 방식의 텍스트 요약기를 만들 것이다.
    - seq2seq 개요
       1) 원문을 첫번째 RNN인 인코더로 입력하면, 인코더는 이를 하나의 고정된 벡터로 변환한다.
       2) 이 벡터를 문맥 정보를 가지고 있는 벡터라고 하여 컨텍스트 벡터(context vector)라고 한다.
       3) 두번째 RNN인 디코더는 이 컨텍스트 벡터를 전달받아 한 단어씩 생성해내서 요약 문장을 완성한다.
    - LSTM과 컨텍스트 벡터
       1) 여기서 seq2seq를 구현할 때, 인코더/디코더로 바닐라 RNN이 아니라 LSTM을 사용할 것이다.
       2) LSTM이 바닐라 RNN과 다른 점은 다음 time step의 셀에 hidden state뿐만 아니라, cell state도 함께 전달한다는 점이다.
       3) 다시 말해서, 인코더가 디코더에 전달하는 컨텍스트 벡터 또한 hidden state h와 cell state c 두 개의 값 모두 존재해야 한다는 뜻이다.
    - 시작 토큰과 종료 토큰
       1) 디코더는 시작 토큰 SOS가 입력되면, 각 시점마다 단어를 생성하고 EOS를 예측하는 순간까지 멈추지 않는다.
       2) 다시 말해 훈련 데이터의 예측 대상 시퀀스의 앞, 뒤에는 시작 토큰과 종료 토큰을 넣어주는 전처리를 통해 멈추는 구간을 알려줘야 한다.
    - 어텐션 메커니즘(Attention Mechanism)
       1) 인코더의 모든 step의 hidden state의 정보가 컨텍스트 벡터에 전부 반영되도록 하는 것이다.
       2) 주의해야 할 것은, 컨텍스트 벡터를 구성하기 위한 인코더 hidden state의 가중치 값은 디코더의 현재 스텝이 어디냐에 따라 계속 달라진다는 점이다.
3. 데이터 준비하기
    - 노드에서는 kaggle에서 제공된 아마존 리뷰 데이터셋을 이용하고, 프로젝트에서는 노드에서 알려준 링크에 있는 뉴스 기사 데이터를 가지고 했다.
4. 데이터 정리하기
    - 중복 샘플과 NULL 값이 존재하는 샘플 제거 : nunique(), drop_duplicates(), isnull().sum(), dropna()
    - 텍스트 정규화와 불용어 제거 : 텍스트 정규화는 스택플로우에 있는 정규화 사전을 썻다. 불용어 제거는 NLTK에서 미리 정의한 것을 이용하였다.
5. 훈련데이터와 테스트데이터 나누기
    - 훈련데이터와 테스트데이터를 나누는 것은 함수를 이용해서 할 수 있지만, 코딩을 직접해서 해보았다.
    - 먼저 데이터의 분포를 출력도 해보고 시각화도 해서 본 다음 적절한 크기의 단어만 가지고 너무 튀는 데이터는 잘라냈다.
    - 그리고 랜덤하게 데이터 순서를 섞은 다음 8:2 비율로 훈련데이터와 테스트 데이터를 나누었다.
    - 그 후 데이터에 시작 토큰과 종료 토큰을 추가했다.
6. 정수 인코딩
    - 기계가 텍스트를 숫자로 처리할 수 있도록 훈련 데이터와 테스트 데이터의 단어들을 모두 정수로 바꾸어 줘야 한다.
    - 이를 위해 각 단어에 고유한 정수를 맵핑하는 작업이 필요하다. 이 과정을 단어 집합을 만든다고 표현한다.
    - 텍스트 시퀀스를 정수 시퀀스로 변환했다면, 서로 다른 길이의 샘플들을 병렬 처리하기 위해 같은 길이로 맞춰주는 패딩 작업을 해준다.
7 ~ 10. 모델을 설계하고, 훈련시키고, 인퍼런스 모델을 구현하고, 테스트를 했다.
    - 이 부분에 대한 것은 코드 중심이므로 프로젝트로 남긴다.
11. 추출적 요약 해보기
    - 패키지 Summa에서 추출적 요약을 위한 모듈인 summarize를 제공하고 있다.
    - summarize 사용하기 : 파라미터 알아보기
       1) text (str) : 요약할 텍스트.
       2) ratio (float, optional) : 출력에 포함할 단어 수.
       3) words (int or None, optional) : 출력에 포함할 단어 수 *만약 ratio와 함께 제공이 되면 ratio는 무시한다.
       4) split (bool, optional) : True이면 문장 list / False면 조인(join)된 문자열을 반환한다.
12. 프로젝트 : 뉴스기사 요약해보기
    - 데이터를 수집하고
    - 데이터 전처리하기 (추상적 요약)
    - 어텐션 메커니즘 사용하기 (추상적 요약)
    - 실제 결과와 요약문 비교하기 (추상적 요약)
    - Summa을 이용해서 추출적 요약해보기