Text summarisation
관련 딥러닝 모델로는
RNN 최적화는 단순히 backpropagation이 아니라 backpropagation through time(bptt)이라고 불리는데,
kinda list comprehension에서 if가 많이 쓰인 예
tokens = ' '.join(word for word in sentence.split() if not word in stopwords.words('english') if len(word) > 1)
앞에서부터(읽는 순서로) 조건이 시작되는 듯 하다.
recurrent dropout이라는 파라미터가 있다.
Functional API로 모델을 만든다면
Model()
을 inputs
과 outputs
를 파라미터로 넣어준다.intial_state=[state_h, state_c]
같이 인코더의 hidden state와 cell state를 넣어준다.보니까 Sequential API에서는 Embedding 레이어를 첫번째로 넣을 수 있었는데, Functional API에서는 Input 레이어를 쓰고, 그 출력값을 Embedding 레이어에 넣으면서 구조를 짜는 것 같다.(Embedding은 결국 두번째 레이어)
데이터 불러오기
데이터 전처리
데이터 전처리(2)
데이터 전처리(3)
단어 사전 만들기
tensorflow.keras.preprocessing.text.Tokenizer()
사용Tokenizer객체.fit_on_texts(corpus)
정수 인코딩
여기서 또 단어 사전상 빈도 수가 적은 거는 걸러내기
Tokenizer.word_index
, Tokenizer.word_counts
활용근데 이렇게 num_words를 설정해서 자꾸 단어들을 날리면, 단어 사전에 없는 단어를 가진 원본 텍스트는 정수 인코딩 후에 empty로 되어 있을 수 있다.
그래서 empty가 됐을 것들을 찾아내서 걸러준다
모델 설계하기
keras의 Functional API를 사용했다.
이 때 인코더, 디코더 각각 RNN이 들어간다.
훈련할 때는 인코더 + 디코더 모델 1개로 가능한데,
예측할 때는 구조가 달라서 인코더 모델 1개 + 디코더 모델 1개, 총 2개로 설계해야 한단다.
이유는...
seq2seq는 훈련할 때와 실제 동작할 때(인퍼런스 단계)의 방식이 다르므로 그에 맞게 모델 설계를 별개로 진행해야 한다는 것, 알고 계시나요?
훈련 단계에서는 디코더의 입력부에 정답이 되는 문장 전체를 한꺼번에 넣고 디코더의 출력과 한 번에 비교할 수 있으므로, 인코더와 디코더를 엮은 통짜 모델 하나만 준비했습니다.
그러나 정답 문장이 없는 인퍼런스 단계에서는 만들어야 할 문장의 길이만큼 디코더가 반복 구조로 동작해야 하기 때문에 부득이하게 인퍼런스를 위한 모델 설계를 별도로 해주어야 합니다. 이때는 인코더 모델과 디코더 모델을 분리해서 설계합니다.
그리고 attention mechanism이 사용된 디코더를 만들어서 사용할 수도 있다.
추출적 요약을 쓰는 summa
패키지 사용
text (str) : 요약할 테스트.
ratio (float, optional) – 요약문에서 원본에서 선택되는 문장 비율. 0~1 사이값
words (int or None, optional) – 출력에 포함할 단어 수.
만약, ratio와 함께 두 파라미터가 모두 제공되는 경우 ratio는 무시한다.
split (bool, optional) – True면 문장 list / False는 조인(join)된 문자열을 반환
끝으로 추상적요약 vs 추출적 요약의 비교
추상적 요약은 표현력이 좋아지지만, 구현하는 난이도가 높다.
반대로 추출적 요약은 비교적 난이도가 낮고 기존 문장에서 문장을 꺼내오는 것이므로 잘못된 요약이 나올 가능성이 낮다.