머신러닝 & 딥러닝/자연어처리

[NLP] 도서 자료 텍스트 요약(Text Summarization) - TextRank (use gensim)

by seokii 2022. 6. 30.
728x90
반응형

NLP Tutorial

https://github.com/Seokii/Korean_NLP_Tutorial

 

GitHub - Seokii/Korean_NLP_Tutorial: 한국어 자연어처리 튜토리얼

한국어 자연어처리 튜토리얼. Contribute to Seokii/Korean_NLP_Tutorial development by creating an account on GitHub.

github.com

자연어처리를 공부하며 여러 한국어 NLP Task에 대한 예시 코드를 작성하고자 만들었습니다.

예시 코드를 통해 저와 같은 자연어처리 입문자들에게 도움이 되었으면 합니다 :)

해당 깃허브 주소를 통해 작성한 주피터 노트북 파일을 다운받거나 확인할 수 있습니다.

 

Dataset

https://aihub.or.kr/aidata/30713

 

도서자료 요약

도서를 기반으로 한 원문의 핵심 내용, 의미 전달을 적절히 포함하는 요약문을 자동으로 생성하는 AI기술 개발을 위한 도서 요약 텍스트 데이터

aihub.or.kr

AI Hub의 도서자료요약의 데이터를 사용해 실습을 진행했습니다.

 

Jupyter Notebook

라이브러리 불러오기

In [1] : 

import pandas as pd
import numpy as np

from gensim.summarization.summarizer import summarize

gensim에서 구현된 TextRank 알고리즘 기반의 summarizer를 사용하겠습니다.

 

데이터 불러오기

In [2] : 

df = pd.read_csv('../../dataset/BookSummarization/test_df/Book_test.csv')

In [3] : 

df = df.iloc[0:150]

In [4] : 

df.reset_index(inplace=True)

AI Hub에서 json형태의 데이터를 제공하고 있지만, csv파일로 따로 정리했습니다.

csv파일은 위의 깃허브에서 다운받을 수 있습니다.

pandas를 통해 csv파일을 불러오고 간단하게 150개의 행만 사용하도록 하겠습니다.

 

추출적 요약

Text Summarization에는 두 가지 방식이 존재합니다.

하나는 통계 기반의 추출적 요약(extract summarization) 방식이며,

다른 방법은 신경망을 이용한 추상적 요약(abstract summarization) 방식이 있습니다.

해당 글에서는 이미 구현된 TextRank 알고리즘에 기반한 gensim 모델을 사용해  추출적 요약 방식을 구현합니다.

 

In [5] : 

df['extract'] = df.passage.apply(lambda x : summarize(x, ratio=0.4))

불러온 요약 모델을 사용해 데이터 프레임에 새로운 열인 'extract'열을 만들고 lambda함수를 사용해 같은 행의 passage열에 대한 내용을 요약하여 작성합니다.

- ratio 매개 변수를 통해 요약될 내용의 비율을 조정할 수 있습니다.

- word_count 매개 변수를 사용하면 결과 값의 단어 수를 조정할 수 있습니다. 이 옵션을 사용하면 ratio 옵션은 무시됩니다.

- split 옵션을 사용해 True로 설정하면 요약 문장이 리스트로 출력됩니다.

 

In [6] : 

df.head()

passage열의 내용을 요약한 extract열을 생성한 결과입니다.

 

In [7] : 

for i in range(0, 3):
    random_number = np.random.randint(0,150, size=1)
    print("=" * 120)
    print(f'{random_number[0]}' + " 번째 문장 \n")
    print('원문 내용: \n\n' + df['passage'][random_number[0]] + '\n\n')
    print('추출 요약 내용: \n\n' + df['extract'][random_number[0]] + '\n\n')
    print('라벨링된 요약 내용: \n\n' + df['summary'][random_number[0]] + '\n\n')

데이터 프레임 내의 원문, 라벨링 된 요약 값, 추출한 요약 내용의 값을 랜덤으로 세 번 추출한 결과입니다.

여러 번 결과를 출력하다보면 생각보다 나쁘지 않은 성능을 보이는 것을 확인할 수 있습니다.

 

 

728x90
반응형

댓글