자연어 처리를 위한 뽀로로 플랫폼 및 기계독해 활용

1.개요

  • 안녕하세요 빅데이터&AI컨설팅팀 김강산입니다. 저희 팀은 이번 2023년도 데이터 분석 사업 중 자연어 처리를 통해 주요 토픽을 도출하는 사업을 수행하였습니다.
  • 저희의 원천 데이터는 최대 2,000자 길이의 본문 내용으로 약 300만 건으로 구성되어 있었습니다. 이러한 데이터에는 인사말, 미사여구, 욕설 등 주요 정보 이외에 내용들도 많이 포함되어 있어 전처리 과정이 필요하였습니다. 또한 사업 기간, 보안, 하드웨어 성능 등 다양한 요소를 고려한 효과적인 정보 도출방법이 필요 하였습니다.
  • 이 과정에서 Pororo(Platform Of neuRal mOdels for natuRal language prOcessing) 플랫폼의 기계독해(MRC, Machine Reading Comprehension) 기술을 활용하였고 300만 건의 원천 데이터에서 주요한 토픽을 우선 도출하고 분석을 수행하여 효과적으로 분석 사업을 수행할 수 있었습니다.
  • 위 경험을 통해 알게 된 Pororo 플랫폼과 플랫폼 내 여러 기술들에 대해 공유하고자 글을 남기게 되었습니다.

2.Pororo(Platform of neural models for natural language processing) 소개

  • Pororo란 Kakaobrain에서 배포한 다양한 자연어 처리 태스크를 다룰 수 있는 오픈소스 통합 프레임워크입니다. Pororo는 ‘Platform Of neuRal mOdels for natuRal language prOcessing’의 약자이며, 이는 HuggingFace와 유사하게 기계학습 모델을 구축, 배포 및 교육하기 위한 목적을 가지고 있습니다.
  • 30가지 이상의 언어를 지원하는 것으로 알려져 있고 한국어 태스크에 특히 최적화되어 있으며, 또한 음성 인식과 같은 오디오 처리를 포함하여 33개의 기능을 지원합니다.

3.Pororo 활용

  • pororo 플랫폼에서는 Text Classification, Sequence Tagging, Seq2Seq 등 다양한 분야의 자연어 처리 알고리즘을 가능하게 해줍니다. 
  • 이 중 제가 실 데이터 분석에서 활용한 Sequence Tagging 분야의 기계독해 알고리즘과 추가적으로 Text Classification의 Zero-shot Topic Classification, Image Captioning의 광학 문자 인식(OCR, Optical Character Recognition) 알고리즘에 대해 알아보고 그 예제를 확인해 보겠습니다.

가. 기계독해(MRC, Machine Reading Comprehension) 소개

1) 정의

  • 기계독해란 자연어 처리와 기계 학습 기술을 활용하여 텍스트 문서를 읽고 이해하는 기술 분야입니다. 알고리즘의 목적은 컴퓨터가 텍스트에서 특정 정보를 추출하고 문맥을 이해하여 의미 있는 작업을 수행할 수 있게 하는 것으로 정의됩니다.

2) 학습 데이터 및 성능

  • Pororo의 기계독해 알고리즘의 학습 데이터 셋은 KoQuAD 1.0이며, 이는 1,560개의 Wikipedia article에 대해 10,645 건의 문단과 66,181 개의 질의응답 쌍으로 구성되어 있는 데이터입니다. 이러한 데이터 셋을 활용하여 학습한 결과로 예측 답과 실제 답이 정확하게 일치하는지를 비교하는 지표인 EM(Exact Match), 정밀도와 재현율의 조화평균인 F1-score 지표에서 사람보다 뛰어남을 확인할 수 있습니다.
  • 학습 데이터 셋: KorQuAD 1.0 
  • 사람 평가지표: EM(Exact Match)(80.17), F1(91.20)
  • Pororo 평가지표: EM(Exact Match)(84.33), F1(93.31)

3) 예제 코드

  • 질문과 문자형 데이터를 넣으면 그에 해당하는 답변을 반환하는 형식입니다.
  • “카카오브레인이 공개한 것은?”이라는 질문에 “포즈(pose-자세분석) API”라고 정확하게 답변하는 것을 확인할 수 있습니다.
from pororo import Pororo mrc = Pororo(task="mrc", lang="ko")

mrc("카카오브레인이 공개한 것은?",
    "카카오 인공지능(AI) 연구개발 자회사 카카오브레인이 AI 솔루션을 첫        
    상품화했다. 카카오는 카카오브레인 '포즈(pose·자세분석) API'를 유료  
    공개한다고 24일 밝혔다. 카카오브레인이 AI 기술을 유료 API를 공개하는
    것은 처음이다. 공개하자마자 외부 문의가 쇄도한다. 포즈는 AI 비전(VISION,
    영상·화면분석) 분야 중 하나다. 카카오브레인 포즈 API는 이미지나 영상을
    분석해 사람 자세를 추출하는 기능을 제공한다.")

<기계독해 예제 코드>

# output
포즈(pose·자세분석) API

<기계독해 예제 코드 실행 결과>

나. Zero-shot Topic Classification 소개

1) Zero-shot Topic Classification 정의

  • Zero-shot Topic classification이란 레이블이 지정된 소수의 클래스 집합 데이터와 클래스에 대한 추가 정보만을 사용하여, 한 번도 본 적 없는 많은 클래스까지 잘 예측하도록 학습하는 기법입니다.

2) 학습 데이터

  • 위 알고리즘의 학습 데이터는 KorNLI이며, KorNLI란 기존 영어로만 존재하던 자연어이해(NLU, Natural Language Understanding)관련 데이터 셋인 자연어추론(NLI, Naural Language Inference), 텍스트의 의미적 유사성(STS, Semantic Textual Similarity)를 카카오브레인 팀에서 한국어로 구성하여 만든 데이터 셋입니다.
  • 학습 데이터 셋: KorNLI (Ham et al. 2020)

3) 지원 언어

  • 한국어, 일본어, 중국어

4) 예제 코드

  • 문자형 데이터와 분류하고 싶은 카테고리를 리스트 형태로 입력하면 각 카테고리별 가중치를 반환합니다.
  • 첫 번째 수행 시 라리가, 메시, 바르사 등이 포함된 문장을 입력한 결과 스포츠 : 94.15로 가장 높은 가중치를 반환하는 것을 확인할 수 있습니다.
  • 두 번째 수행 시 당무감사, 정강정책 등이 포함된 문장을 입력한 결과 정치 : 88.24로 가장 높은 가중치를 반환하는 것을 확인할 수 있습니다.
from pororo import Pororo

zsl = Pororo(task="zero-topic", lang="ko")
zsl('''라리가 사무국, 메시 아닌 바르사 지지..."바이 아웃 유효" [공식발표]''', 
    ["스포츠", "사회", "정치", "경제", "생활/문화", "IT/과학"])

zsl('''장제원, 김종인 당무감사 추진에 "참 잔인들 하다"···정강정책 개정안은
    "졸작"''',
    ["스포츠", "사회", "정치", "경제", "생활/문화", "IT/과학"])

<Zero-shot Topic Classification 예제 코드>

# output
{'스포츠': 94.15, '사회': 37.11, '정치': 74.26, '경제': 39.18, '생활/문화': 71.15, 'IT/과학': 34.71}

{'스포츠': 2.18, '사회': 56.1, '정치': 88.24, '경제': 16.17, '생활/문화': 66.13, 'IT/과학': 11.2}

<Zero-shot Topic Classification 예제 코드 실행 결과>

다. 광학 문자 인식(OCR, Optical character recognition) 소개

1) 정의

  • 광학 문자 인식이란 텍스트 이미지를 기계가 읽을 수 있는 텍스트 포맷으로 변환하는 알고리즘입니다.

2) 학습데이터

  • 위 알고리즘의 학습 데이터는 MS-COCO 2017 데이터로 대표적인 이미지 모델 학습에 사용되는 데이터입니다. 데이터는 80개의 카테고리, 30만 장의 이미지와 150만 개의 객체로 구성되어 있습니다.
  • 학습데이터셋 : MS-COCO 2017 (Tsung-Yi Lin et al. 2014)

3) 지원 언어

  • 한국어, 영어

4) 예제코드

  • 기본적으로 이미지 파일의 경로를 입력받아 이미지 내 텍스트를 반환하며, detail 파라미터를 통해 텍스트 위치 반환 여부를 결정할 수 있습니다. 함수가 반환하는 위치는 Bounding Box의 4개 꼭짓점의 좌표 형태로 출력됩니다.

<광학 문자 인식에 활용한 이미지>

from pororo import Pororo
ocr = Pororo(task="ocr", lang="ko")
ocr('./sample1.jpg', detail=True) 

<광학 문자 인식 예제 코드>

# output {'description': ['사나이는 사나이답게 마무리 짓는다.'],
          'bounding_poly': [{'description': '사나이는 사나이답게 마무리 
          짓는다.', 'vertices': [{'x': 37, 'y': 47}, {'x': 113, 'y':
          47}, {'x': 113, 'y': 115}, {'x': 37, 'y': 115}]}]}

<광학 문자 인식 예제 코드 실행 결과>

라. Pororo Module 생성 및 활용

1) 개요

  • 위와 같은 세 가지 알고리즘에 대해 Pandas 라이브러리와 연계하여 Dataframe에서의 동작을 고려한 Pororo Module 코드를 작성하였습니다. 프로젝트를 수행하며, 추가적인 함수 생성 없이 다량의 데이터에 한 번에 알고리즘을 적용할 수 있도록 코드를 작성하였습니다.

2) 예제코드

  • Pororo module을 불러와 기계독해, Zero-shot Topic Classification, 광학문자인식을 수행하는 함수 객체를 생성합니다.
  • 기계독해 함수는 데이터, 컬럼명, 질문 리스트, 저장 여부 등의 매개변수를 가지고 있으며 특정 데이터의 컬럼에 기계독해를 저장하고 그 결과를 csv 파일 형태로 저장할 수 있습니다.
# 모듈 불러오기
import pandas as pd
import pororo_module

# pororo 내 기계독해, 제로샷 분류, 광학 문자 인식 기능을 가지는 모듈
mrc = pororo_module.pororo_mrc
zsl = pororo_module.pororo_zsl
ocr = pororo_module.pororo_ocr

# 데이터 불러오기
df = pd.read_csv('./data/news_data.csv')
ocr_df = pd.read_excel('./data/ocr_data.xlsx')

# 질문 리스트 생성 및 MRC함수 실행
qst_list = ['기자의 이름은 무엇인가요?', '언론사 이름은 무엇인가요?',
            '어떤 종목인가요?']
mrc(df, col_name='news', qst_list, save=True)

# 카테고리 리스트 생성 및 ZSL함수 실행
category_list = ['축구', '야구', '농구', '골프', 'e스포츠']
zsl(df, col_name='news', categories=category_list, save=True)

# OCR함수 실행
ocr(df=ocr_df, img_path_col='img_path', save=True)

<Pororo module 예제 코드>

4. 결론

  • 지금까지 Pororo 플랫폼의 소개와 플랫폼 내 기계독해, 제로샷 토픽분류, 광학문자인식 기술 설명 및 예제를 공유하였습니다.
  • 이를 통해 저희 팀이 수행한 자연어처리를 통한 주요 토픽도출과 같은 자연어처리 분야 분석과정에 도움을 줄 수 있으면 좋겠습니다.
  • 추가적으로 Pororo 플랫폼에는 위 기능 외에도 감정분석, 빈칸채우기, 번역 등 다양한 기능 33개나 있습니다. 이런 Pororo 플랫폼의 설치 과정 및 추가적인 기술 예제 코드와 결과가 궁금하신 분들을 아래 링크 참조 부탁드립니다. 긴 글 읽어 주셔서 감사합니다.

[참고사이트]

Pororo 공식 Github