티스토리 뷰

Text Summarisation을 위한 방법에는 크게 두가지가 있다.

  1. Extractive Summarisation
  2. - 원문에서 가장 중요한 문장들을 선택하고 이를 재구성하여 요약하는 방법
  3. Abstractive Summrisation
  4. - 원문에서 중요한 정보들을 찾아내어 그 정보들을 가지고 새로운 문장들로 요약문을 생성하는 방법

 

이 글에서는 파이썬에서 구글의 Bert를 이용한 Bert Extractive Summarizer로 간단한 글의 extractive summarisation을 생성해 볼 예정이다.

 

 

먼저, pip에 Bert Extractive Summarizer을 설치하고, Summarizer의 작동을 위해 추가로 몇가지 패키지를 설치해 준다.

pip install bert-extractive-summarizer 
pip install spacy

다른 기능들을 위해 몇가지 패키지를 추가로 설치해야 하지만, 기본적인 Extractive Summarization만 실습해 볼 예정이므로 이 글에서는 다루지 않았다.

 

 

설치가 완료 되었으면 summerizer를 임포트 하고 요약 모델을 생성한다.

from summarizer import Summarizer model = Summarizer()

from summarizer import Summarizer 

model = Summarizer()

model = Summarizer()를 처음 실행했을 때에는 다운로딩 시간이 약 20분 정도 걸렸고, 그 이후로는 같은 코드를 실행하여도 다운로딩 과정이 생략되었다.

 

 

그렇다면 이제, bert-extractive-summarizer로 뉴스기사를 요약해 보자. 뉴스 기사는 BBC 온라인 기사인 'Covid: Seven ways to get through (and enjoy) Christmas on your own' (Harrison, 2020)의 내용을 사용하였다. 제목에서 알 수 있듯 근래의 코로나 상황에서 크리스마스를 보내는 7가지 방법에 대하여 소개한 기사이다. 각 방법이 헤딩과 내용으로 구성되어 있으나 헤딩을 포함하지 않은 모든 글들만 하나의 텍스트 단락으로 만들어 사용하였다. (해당 기사 링크: https://www.bbc.com/news/uk-55399649)

 

 

.txt파일에 뉴스기사를 저장하였기 때문에 에디터나 주피터노트북에 이 파일을 불러와 news라는 변수에 저장하였다.

with open("xmas_covid_bbc_news.txt", "r") as f: for sentence in f: news = sentence

with open("xmas_covid_bbc_news.txt", "r") as f:
    for sentence in f:
        news = sentence

 

 

전처리 과정에서 마침표 '.'를 제거할 경우 모델이 문장단위를 인식하지 못해 요약 결과를 출력하지 않으므로 제거하지 않았다. lemmatising을 한 이후에 텍스트를 요약한다면 디폴트 파라미터로는 전체적인 의미가 더 잘 전달되는 것 처럼 보인다. 하지만 lemmatising이 실제로 요약성능에 도움이 되었다고는 말하기는 힘든 것이, 실제로 출력한 문장의 수가 더 많기도 했고 출력되는 요약의 문장 수를 제한한다면 lemmatising하지 않은 요약문이 더 전체적인 의미를 내포하기 때문이다. lemmatising한 문장을 요약에 사용한다면 출력되는 요약문또한 lemmatising되어 비문인 문장들을 출력한다.

 

 

생성해 두었던 summary모델에 텍스트를 넣으면 별다른 파라미터 설정 없이도 요약문을 생성한다.

print(model(news))

ratio 파라미터로 원문 길이에 대한 요약문의 길이 비율을 설정 할 수 있다. 예를들어 ratio를 0.1로 설정한다면, 요약문은 원문의 길이의 0.1배 길이로 설정되어 출력된다.

print(model(news, ratio=0.2))

 

 

또한, num_sentences파라미터로 요약문의 문장 개수를 설정할 수 있다.

print(model(news, num_sentences=1))

print(model(news, num_sentences=3))

 

뉴스 기사가 누군가가 말한 인용문들 위주로 구성되어 있기도 하고 전체적인 주제가 하나인지라 각 헤딩별로 내용들이 확실하게 나누어 진다기 보다는 어느 문장을 다른 헤딩 아래 가져다 놓아도 많이 어색하지 않은터라 사실 별 기대 없이 모델을 돌려보았다. 하지만 인트로랑 거의 내용이 겹치는 첫번째 헤딩 아래 글을 제외하고 인트로에서 한 문장과 모든 헤딩에서 한 문장씩 생성된 요약문에 포함이 되어 모델의 성능이 상당히 좋음을 알 수 있었다.

 

 

 

참고 자료

  • bert-extractive-summarizer.pypi.org/project/bert-extractive-summarizer/
  • Miller, D. (2019). Leveraging BERT for Extractive Text Summarisation on Lectures. arXiv:1906.04165. arxiv.org/abs/1906.04165
  • Miller, D. (2019). Leveraging BERT for Extractive Text Summarisation on LectureDevlin, j., Chang, M., Lee, K. and Toutanova, K. (2019). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. arXiv:1810.04805.  arxiv.org/abs/1810.04805
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함